Notifications
Clear all

Inserir fórmulas via VBA

6 Posts
1 Usuários
0 Reactions
4,190 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde,

Publiquei esta dica no fórum INFO, porém como ele não exite mais resolvi atualizá-la e republicar aqui.

*******************************************************************************************************************************

Em determinadas situações é necessário inserir muitas fórmulas numa planilha e a utilização do VBA pode facilitar a tarefa.
Em diversos fóruns noto que há dúvidas sobre como inserir fórmulas numa planilha por meio de VBA.
Algumas vezes há utilização de fórmulas em inglês onde poderiam estar em português.
Exemplo:

As fórmulas abaixo são equivalentes:

[B1].FormulaLocal = "=PROCV(A1;E1:F10;2;0)"
[B2].Formula = "=VLOOKUP(A1,E1:F10,2,0)"

A função PROCV (português) é equivalente a VLOOKUP (inglês).
Você pode escolher se quer utilizar a função em português (FormulaLocal) ou inglês (Formula).
Note o detalhe que a vírgula separa os parâmetros da fórmula em inglês, enquanto o ponto e vírgula é utilizado na versão em português.
Portanto podemos utilizar uma ou outra, o que não podemos é misturar a sintaxe de uma com a outra o que vai resultar em erro.
Nos exemplos acima temos intervalos fixos o que facilita a inclusão da fórmula de maneira direta.
E se quisermos usar variáveis?
Veja o exemplo abaixo:

[B3].FormulaLocal = "=PROCV(A1;E1:F" & j & ";2;0)"

Só não podemos esquecer de atribuir um valor a "j".
Como pode ser observado fizemos a concatenação de duas "strings" com uma variável.
E se quisermos inserir a seguinte fórmula?

=PROCV("NOME";E1:F10;2;0)

Teremos um problema com as aspas duplas. Como resolvê-lo?
Uma opção seria a seguinte:

[B4].FormulaLocal = "=PROCV(""NOME"";E1:F10;2;0)"

Onde há aspas duplas internamente, duplicamos e aí o problema está resolvido.
E se precisarmos preencher uma grande série de fórmulas onde um parâmetro vai variar?
Suponhamos a primeira fórmula:

[B1].FormulaLocal = "=PROCV(A1;E1:F10;2;0)"

Se formos colocar uma série de 10 fórmulas na mesma coluna mudando o primeiro parâmetro a segunda fórmula seria:

[B2].FormulaLocal = "=PROCV(A2;E1:F10;2;0)"

E assim por diante...
Poderíamos usar uma variável e um laço "For":

For i = 1 To 10
    Range("B" & i).FormulaLocal = "=PROCV(A" & i & ";E1:F10;2;0)"
Next

Há outra maneira, usando auto preenchimento:

[B1].FormulaLocal = "=PROCV(A1;E$1:F$10;2;0)"
[B1].AutoFill [B1:B10]

Mas a maneira que prefiro é a seguinte:

[B1:B10].FormulaLocal = "=PROCV(A1;E$1:F$10;2;0)"

Desta maneira você coloca de uma vez todas as fórmulas e a sua macro vai ficar bem mais rápida, caso a quantidade de fórmulas seja grande.
E as fórmulas matriciais? Como inserí-las?
Segundo a Microsoft (FormulaArray), é necessário inserir a fórmula utilizando o estilo de referência L1C1.
Portanto a fórmula "=SOMA(1/CONT.SE($A$1:$A$20;$A$1:$A$20))", bem conhecida e utilizada para contar os valores exclusivos de um intervalo deveria ser inserida assim:

[E1].FormulaArray = "=SUM(1/COUNTIF(R1C1:R20C1,R1C1:R20C1))"

Para miha surpresa, consegui inserir a fórmula no estilo de referência A1:

[E2].FormulaArray = "=SUM(1/COUNTIF($A$1:$A$20,$A$1:$A$20))"

O detalhe é que a fórmula tem de ser inserida em inglês, porém com uma pequena "gambiarra" dá para contornar a situação:

[E2].FormulaLocal = "=SOMA(1/CONT.SE(A1:A20;A1:A20))"
[E2].FormulaArray = [E2].Formula

Acredito que o texto possa ajudar muita gente que precisa, por um motivo ou outro, inserir fórmulas via VBA.

Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/10/2014 1:18 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bom tutorial !
Cobriu não só as propriedades Formula e FormulaLocal como a FormulaArray, bem como referenciamento a intervalos usando colchetes [], o que indica conhecimento avançado.

Só faltou incluir uma fórmula em várias células, de uma vez, sem usar o laço de repetição, que ficaria algo assim:

Range("B1:B10").formular1c1 = "=rc1"

E consequentemente, para cobrir todas as formas de colocar fórmulas, seria legal você explicar o uso da propriedade FormulaR1C1.

Que fique claro, achei fantástica sua iniciativa e a clareza na colocação das ideias e por isso, parabéns !

FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/10/2014 1:26 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Fernando,

Obrigado pelas palavras!
A intenção não era esgotar o assunto (nem sei se conseguiria).
Outros usuários, como você, podem contribuir com uma abordagem diferente ou acrescentar algo que faltou.
Quanto à propriedade FormulaR1C1, não expliquei por que acho que, na maioria das vezes, dá para evitá-la, mas se algum usuário tiver dúvida é só postar...
Quanto ao preenchimento de várias células com uma fórmula sem laço de repetição eu dei um exemplo no estilo A1.
Agradeço também ao gtsalikis pelo reconhecimento.

Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/10/2014 4:37 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

...A intenção não era esgotar o assunto (nem sei se conseguiria).
Outros usuários, como você, podem contribuir com uma abordagem diferente ou acrescentar algo que faltou.
Quanto à propriedade FormulaR1C1, não expliquei por que acho que, na maioria das vezes, dá para evitá-la, mas se algum usuário tiver dúvida é só postar...
Quanto ao preenchimento de várias células com uma fórmula sem laço de repetição eu dei um exemplo no estilo A1.
...

A intenção foi ótima! Qto mais pessoas estiverem contribuindo, melhor.
Agora, vou discordar de você num aspecto. Quando vc diz que na maioria das vezes dá pra evitar, eu penso que na maioria das vezes, é melhor nào evitar. Isso pq dps de tantos anos fazendo isso, descobri um problema enorme de desempenho quando escrevemos as fórmulas nas células uma a uma. Se você tem um código que preenche, digamos, 1000 células, uma a uma num laço usando estilo A1, e um outro código que preenche todas de uma só vez, com uma linha de código, sem o laço, usando o estilo R1C1, o simples fato de não precisar rodar mil linhas do laço já é um acelerador indiscutível de desempenho.

Mas vou concordar que cada caso é um caso, e assim, se vc tem poucas fórmulas, não vale a pena perder tempo convertendo a fórmula para o estilo R1C1, mas em casos de tabels gigantes, isso é um esforço que vale muito a pena.

É isso! Abs, FF

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/10/2014 5:24 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite,

A questão que eu coloquei é que podemos preencher várias células de uma vez sem usar o estilo R1C1. Exemplo:

[B1:B10000].FormulaLocal = "=PROCV(A1;E$1:F$100000;2;0)"

Uma situação onde o estilo R1C1 é indispensável é quando não sabemos antecipadamente quantas COLUNAS a fórmula vai referenciar, pois a coluna no estilo A1 é representada por 1 ou mais letras.
Digamos que a quantidade de colunas vai variar e usamos uma variável "n" para armazenar este valor. Teríamos algo como:

[B1:B10000].FormulaR1C1Local = "=PROCV(LC1;L1C[3]:L100000C" & n & ";2;0)"

Em outros casos, geralmente, conseguimos evitar o R1C1, mesmo tendo que preencher muitas células.

Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/10/2014 9:37 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Muito bom!

Valeu

;)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 09/10/2014 5:12 am