Juro pra você que estou tentando entender mas seu jeito de perguntar é muito confuso.
Ok, dito isso, vamos lá.
Range Dinâmico dentro do FórmulaLocal...
Vc cria fórmulas pelo VBA, o que é tudo bem, as fórmulas mencionam nomes que não existem, acredito que esses nomes serão os ranges dinâmicos, é isso? Se eles não existem no modelo enviado, não consigo ver se a fórmula funciona !
Seguindo... quando o código do evento change é disparado, não importando a coluna alterada, vc escreve uma fórmula na célula da coluna G, caso a linha tenha ON na coluna H ou escreve vazio na coluna G, caso a linha tenha Off na coluna H. Até aí, beleza, mas, pq vc não escreve a fórmula que já contemple a comparação da coluna H? Você também deveria tirar o ScreenUpdating que não faz diferença neste código...
Ok, dito tudo isso, vamos a sua pergunta, vou tentar ...
Pelo que entendi vc quer a fórmula de G11 olhe pras células A11 e C11... assim como a fórmula que será colocada em G12, terá que olhar para A12 e C12...
Mas seu código original coloca referências fixas à célula A1 e C1... aí fica difícil....
Que tal trocar esta linha de código:
.FormulaLocal = "=SE(C1=0;0;ÍNDICE(Empresas*(1+ISS);CORRESP(A1;Nomes;0);1))"
Por essa:
.FormulaR1C1 = "=IF(RC3=0,0,INDEX(Empresas*(1+ISS),MATCH(RC1,Nomes,0),1))"
Ou, se for pra continuar usando o FormulaLocal, para arrumar tudo isso pode ser assim:
O novo código ficaria assim, com nova fórmula e nova lógica:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Linha As String
Application.EnableEvents = False
Linha = Target.Row
Range("G" & Linha).FormulaLocal = "=SE(H" & Linha & "=""ON"";SE(C" & Linha & "=0;0;ÍNDICE(Empresas*(1+ISS);CORRESP(A" & Linha & ";Nomes;0);1));"""")"
Application.EnableEvents = True
End Sub
MAS, se vc ainda assim quiser manter sua lógica, de apagar a fórmula ao invés de forçá-la a resultar vazio, pode usar (claro), mas fica assim:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Linha As String
Application.EnableEvents = False
Linha = Target.Row
If Range("H" & Linha).Value = "ON" Then
Range("G" & Linha).FormulaLocal = "=SE(C" & linha & "=0;0;ÍNDICE(Empresas*(1+ISS);CORRESP(A" & linha & ";Nomes;0);1))"
ElseIf Range("H" & Linha).Value = "OFF" Then
Range("G" & Linha).Value = ""
End If
Application.EnableEvents = True
End Sub
Agora, falando em range dinâmico, existem 2 tipos mais famosos e mais comuns. Com Desloc() e com Índice(). Repito, não vi nenhum escrito ali.
Talvez eu não tenha entendido o que range dinâmico significa pra você ou talvez você não enviou o arquivo completo ...
Enfim, espero ter ajudado !
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Postado : 16/11/2016 11:38 pm