Notifications
Clear all

Range dinâmico dentro do FormulaLocal

6 Posts
2 Usuários
0 Reactions
1,275 Visualizações
(@vonzuben)
Posts: 549
Prominent Member
Topic starter
 

Boa madrugada !
Bom dia !

Celula G11 e G12 está fazendo a sequencia corretamente, referente a formula com C11:C12 e A11: A12 ( conforme vou adicionando linha vai fazendo =SE(C13=0;0;ÍNDICE(Empresas*(1+ISS);CORRESP(A13;Nomes;0);1)) )

Só que quando coloco OFF através da coluna H11 ou H12 apaga a celula, pois até aqui tudo bem ( É assim que eu quero quando coloco OFF )
Agora, ao voltar para ON, gostaria que ficasse a formula com C11 e C12 e o A11e A12 dando sequencia ( Como estava ! )

O que ele faz é colocar a formulaLocal do VBA novamente da Plan1
=SE(C1=0;0;ÍNDICE(Empresas*(1+ISS);CORRESP(A1;Nomes;0);1))

Encaminhado anexo

Obrigado !

 
Postado : 16/11/2016 9:51 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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 !

 
Postado : 16/11/2016 11:38 pm
(@vonzuben)
Posts: 549
Prominent Member
Topic starter
 

As vezes quero explicar tão detalhado que acabo confundindo

Deu certo o segundo código !

Sim, tem que apagar com OFF ( apagando posso colocar manualmente o valor )

Coloquei o primeiro pq já conheço e sempre funcionou.

Qual a diferença para o segundo ?

Funciona em versão de office antigo ?

.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))"

Obrigado !

Sobre o range dinâmico que eu falo é isso Range("G" & Linha) e você acabou colocando dentro da FormulaLocal conforme pedi no título FormulaLocal = "=SE(C" & Linha & "=0;0;...........

Percebi que faltou no meu código encaixar isso, por isso o título

Eu cheguei colocar isso =SE(C" & Linha & "=0;0, mas dava erro, acho que o meu estava faltando mais um & contatenar
Acho não, estava faltando um & contatenar

Sobre ScreenUpdating
Você não conseguirá ver o que a macro está fazendo, mas ela será executada com mais rapidez ?

 
Postado : 17/11/2016 4:54 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Sim, tem que apagar com OFF ( apagando posso colocar manualmente o valor )

Mas sem apagar,você também consegue colocar o valor manualmente... não é ? ;-)

Qual a diferença para o segundo ?

O ForumulaR1C1 de colocar fórmula é melhor que o FormulaLocal, exatamente por algumas razões. Primemiro por causa do idioma. Fato que se você estiver usando um Excel em ingles, o formulalocal pede um IF()...
Segundo, pq Vc trabalha com referencia relativa.. RC3 significa mesma linha, coluna 3 (ou, C)... ou, RC[3] significa, mesma linha, 3 coluans pra direita... Dá uma pesquisada que vc vai ver...

Funciona em versão de office antigo ?

Sim, funciona em todas versões do Office que você for utilizar...

Sobre o range dinâmico que eu falo é isso Range("G" & Linha) e você acabou colocando dentro da FormulaLocal conforme pedi no título FormulaLocal = "=SE(C" & Linha & "=0;0;...........

Agora entendi...

Eu cheguei colocar isso =SE(C" & Linha & "=0;0, mas dava erro, acho que o meu estava faltando mais um & contatenar
Acho não, estava faltando um & contatenar

Exato!

O screenupdating só é necessário se a tela for mudar. ele acelera o desempenho qdo vc tem atualização de tela, o que não é o caso...

 
Postado : 17/11/2016 7:52 am
(@vonzuben)
Posts: 549
Prominent Member
Topic starter
 

Mas sem apagar,você também consegue colocar o valor manualmente... não é ? ;-)

rsss verdade

Vou trocar para ForumulaR1C1 !

Vou colocar na lista suspensa ON. OFF e LIMPAR
Inverter o OFF com o LIMPAR e colocando OFF consigo digitar

A tela mudar que você disse é mudando de plan1 para plan2 ou algo que fica mudando em tempo real ?

 
Postado : 17/11/2016 4:49 pm
(@vonzuben)
Posts: 549
Prominent Member
Topic starter
 

Fernando, para usar o range dinamico no FormulaR1C1 é só trocar RC3 e o RC1 ?
.FormulaR1C1 = "=IF(RC3=0,0,INDEX(Empresas*(1+ISS),MATCH(RC1,Nomes,0),1))"

Obrigado !

 
Postado : 17/11/2016 5:22 pm