Notifications
Clear all

Inserir fórmulas em uma célula de forma fléxivel

6 Posts
2 Usuários
0 Reactions
1,186 Visualizações
(@miguexcel)
Posts: 167
Reputable Member
Topic starter
 

Boa noite,

Tenho uma dúvida relativamente a um código VBA. Pretendo, após um processo, repor as fórmulas numa determinada linha. Utilizei o seguinte código:

Sub ReporValores()
'
    Application.ScreenUpdating = False
    
    Sheets("Análises").Unprotect ("123")
    Range("V7").Select
    ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-7]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C20,FALSE))"
    Range("W7").Select
    ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-8]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C21,FALSE))"
    Range("X7").Select
    ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-9]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C23,FALSE))"

    Sheets("Análises").Protect ("123")
    
    Application.ScreenUpdating = True
    
    MsgBox "Os valores foram repostos."
    
    End Sub

O problema é que se eu introduzir uma coluna na base de dados, este código não é flexível, pelo que depois irá repor as fórmulas nas células erradas. Existe alguma forma de tornar este processo mais flexível e que eu possa acrescentar colunas ou retirar sem problemas?

Obrigado e bom ano a todos.

 
Postado : 02/01/2013 3:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Você precisa dar mais detalhes...
A formula será posta sempre na 7º linha?
Etc, Etc... :?

Sub ReporValores()
    Dim LastColumn As Integer
    If WorksheetFunction.CountA(Cells) > 0 Then
        LastColumn = Cells.Find(What:="*", After:=[A1], _
        SearchOrder:=xlByColumns, _
        SearchDirection:=xlPrevious).Column
    End If
    
    Application.ScreenUpdating = False
    
    Sheets("Análises").Unprotect ("123")
     Cells(7, LastColumn + 1).Select
    ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-7]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C20,FALSE))"
    ActiveCell.Offset(0, 1).Select
    ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-8]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C21,FALSE))"
    ActiveCell.Offset(0, 1).Select
    ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-9]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C23,FALSE))"

    Sheets("Análises").Protect ("123")
    
    Application.ScreenUpdating = True
    
    MsgBox "Os valores foram repostos."
    
    End Sub
 
Postado : 02/01/2013 4:13 pm
(@miguexcel)
Posts: 167
Reputable Member
Topic starter
 

Sim,

A fórmula será sempre na linha 7. O mesmo vai acontecer na linha 8, mas quanto a essa não tenho problema porque os valores serão iguais à linha 7.

O único problema é em relação às colunas da BD. se eu inserir uma coluna nova, como o código é estático, quando for repor os valor, vai colocar no sitio errado!

 
Postado : 02/01/2013 4:34 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Minha adaptação não deu certo?

Att

 
Postado : 02/01/2013 4:47 pm
(@miguexcel)
Posts: 167
Reputable Member
Topic starter
 

Não está dando. Problema que planilha da base de dados é outra.

Tenho duas planilhas, "análises" e "base de dados". A linha 7 está indo buscar informação à base de dados. Por exemplo, se acrescentar uma coluna ou retirar, o código teria de ficar diferente:

ActiveCell.FormulaR1C1 = "=IF(OR(RC15="""",RC[-7]=""A definir""),"""",VLOOKUP(RC15,Base_Dados,'Base de Dados'!R1C21,FALSE))" em vez de R1C20.

 
Postado : 02/01/2013 5:04 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

O que eu fiz foi baseado em sua postagem, como eu não sei exatamente como é sua planilha, você poderia tentar adaptar.

Outra coisa, eu não veja sua formula como você vê, eu não tenho seu arquivo, você tem perceber que sua formula será calculada de acordo com seu código.
Até que alguém que saiba de VBA de verdade (eu não sei nada), possa te responder, poste seu arquivo compactado, quando me sobrar um tempo vou ver o que posso fazer.
Att

 
Postado : 02/01/2013 5:10 pm