Notifications
Clear all

Macro para copiar e incrementar fórmula

9 Posts
3 Usuários
0 Reactions
1,672 Visualizações
(@marcolive)
Posts: 8
Active Member
Topic starter
 

Pessoal, estou com dificuldade para criar uma macro que copie a fórmula que está na célula T2 para a célula U3, incrementando os critérios em +1 e avance para a próxima linha e coluna até que não haja nenhum valor na linha correspondente na coluna S.

Segue abaixo a fórmula em cujos parâmetros preciso que a macro atue.

=SE($S3=$S$2;1;0)

Imagino que pareça um tanto estranho imaginar que a fórmula crie uma espécie de escada dentro da planilha mas, é isso mesmo. Já que não consegui descobrir uma forma de copiar a mesma fórmula em forma de matriz como havia originalmente tentado.

Agradeço desde já.

 
Postado : 21/12/2015 7:47 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Faltou detalhar um pouco mais sua dúvida, anexar uma pasta de trabalho com algumas células preenchidas ajudaria muito.
Mas se é que entendi direito, vc quer que as fórmulas ocupem T2, U3, V4, W5... e assim sucessivamente, até que existam dados na coluna S, desde S2 prá baixo. Além disso, a fórmula em:
T2 =SE($S3=$S2;1;0)
U3 =SE($S4=$S3;1;0)
V4 =SE($S5=$S4;1;0)
W5 =SE($S6=$S5;1;0)

ou seja, sempre comparando a célula em S imediatamente abaixo com a célula em S da linha em que está a fórmula. É isso?

Se for, uma forma de fazer seria usando uma macro como abaixo:

Sub MarcOlive()
  Dim rgS As Range, rgFormula As Range
  Dim lin As Long, strFormula As String
  Set rgS = ActiveSheet.Range("S2", Range("S2").End(xlDown))
  Set rgFormula = rgS(1)
  For lin = 1 To rgS.Rows.Count
    strFormula = "=SE($S" & rgS(1).Row + lin & "=$S" _
                   & rgS(1).Row + lin - 1 & ";1;0)"
    rgFormula.Offset(lin - 1, lin).FormulaLocal = strFormula
  Next lin
End Sub

Saudações e Boas Festas!

 
Postado : 21/12/2015 10:14 pm
(@marcolive)
Posts: 8
Active Member
Topic starter
 

Edson, funcionou como eu queria. Realmente eu deveria ter deixado uma amostra da planilha para facilitar.
Felizmente você captou exatamente a situação e conseguiu solucionar inclusive, deixando uma planilha de amostra que a exemplifica bem.

Ocorre que surgiu uma nova dúvida. Assim como preciso comparar a primeira linha da coluna S com as demais, preciso fazer o mesmo com as demais linhas em relação às outras.
Pra exemplificar, vou utilizar a mesma planilha que você usou:

Preciso fazer com macros porque a coluna S possui mais de 1300 registros ou seja, é inviável fazer a comparação na unha.
Mais uma vez agradeço pela solução já apresentada que se não resolve todo o problema, já me dá esperanças.

 
Postado : 22/12/2015 4:29 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Amigo uma planilha de modelo NAO SIGNIFICA UMA FOTO.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 22/12/2015 5:27 pm
(@marcolive)
Posts: 8
Active Member
Topic starter
 

Desculpe. Não entendi sua mensagem. O que quis dizer com "não significa uma foto"? Quis dizer que não devo postar a planilha em formato de imagem (jpg) ou algo assim? Se for isso peço desculpas e que me oriente qual seria a forma correta.

 
Postado : 22/12/2015 6:54 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Olá MarcOlive.

Não sei não, mas essa nova fórmula em T3 não tá fazendo muito sentido, penso eu. É assim mesmo? Todas as linhas tem a mesma fórmula? Olhe por exemplo a linha 2, a fórmula em T e em U é a mesma ("=SE($S4=$S3;1;0)") assim como na linha 9, da coluna T até AA todas as células têm a fórmula "=SE($S10=$S9;1;0)". Por isso todos os valores são iguais em cada linha. É isso mesmo?

Se não for por favor corrija para evitar retrabalho, ok? Se for isso mesmo comente para podermos prosseguir.

Melhor seria mesmo anexar uma pasta de trabalho com algumas células preenchidas da maneira certa que vc anseia, como o Marcelo Prudêncio citou.

Saudações,
Edson

 
Postado : 22/12/2015 8:43 pm
(@marcolive)
Posts: 8
Active Member
Topic starter
 

Realmente havia um erro na fórmula EdsonBR. Faltava a referência absoluta para que cada coluna calcule se a condição é verdadeira para a linha a que se refere na coluna S que afinal de contas, é o motivo de todo esse trabalho pois, do contrário a solução seria mais fácil. Não precisaria da escadinha!

Segue a fórmula corrigida e a planilha em anexo conforme solicitado. Grato pela paciência e perdoe o erro na fórmula. Acabei me empolgando quando vi a macro funcionando finalmente e simplesmente copiei as fórmulas sem lembrar da referência absoluta.

T2 =SE($S3=$S$2;1;0)
U3 =SE($S4=$S$3;1;0)
V4 =SE($S5=$S$4;1;0)
W5 =SE($S6=$S$5;1;0)

 
Postado : 22/12/2015 9:58 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Entendi.

Dei uma "emendada" no código. Acho que agora vai.

Sub MarcOlive()
  Dim rgS As Range, rgFormula As Range, rgFill As Range
  Dim lin As Long, strFormula As String
  Dim ultlin As Long
  Set rgS = ActiveSheet.Range("S2", Range("S2").End(xlDown))
  Set rgFormula = rgS(1)
  ultlin = rgS(rgS.Rows.Count).Row
  For lin = 1 To rgS.Rows.Count
    strFormula = "=SE($S" & rgS(1).Row + lin & "=$S$" _
                   & rgS(1).Row + lin - 1 & ";1;0)"
    Set rgFill = rgFormula.Offset(lin - 1, lin)
    rgFill.FormulaLocal = strFormula
    If Not lin = rgS.Rows.Count Then
       rgFill.AutoFill Destination:=Range(rgFill, Cells(ultlin, rgFill.Column))
    End If
  Next lin
End Sub

 
Postado : 23/12/2015 6:21 am
(@marcolive)
Posts: 8
Active Member
Topic starter
 

EdsonBR,

Simplesmente incrível! Sei que são números, lógica e um pouco de código de programação mas, pra mim poderia também ser chamado de MÁGICA!
Ver a macro funcionando e fazendo com perfeição algo que eu já estava quase me convencendo de que teria que fazer na unha... realmente não me vem outra palavra que não essa.

Agora só me resta agradecer e tentar entender o código pra ver se consigo entender como funciona pra quem sabe aprender um pouco sobre macros.

Muito Obrigado!

 
Postado : 23/12/2015 10:41 am