0179-Dica VBA: Adicionando fórmulas em células

Imagine que você deseja, via macro, inserir na célula G1, uma fórmula que some todas as células do intervalo A1:D7.

Você liga o gravador de macros, seleciona a célula G1, digita a fórmula =SOMA(A1:D7) e encerra o gravador de macros.

Se você acessar o código que acabou de gravar, vai se deparar com algo parecido com isso:

Sub SomarIntervalo()
'
' SomarIntervalo Macro
'

    Range("G1").Select
    ActiveCell.FormulaR1C1 = "=SUM(RC[-6]:R[6]C[-3])"
    Range("G2").Select
End Sub

Esse código pode ser simplificado para:

Sub SomarIntervalo()
Range("G1").FormulaR1C1 =  "=SUM(RC[-6]:R[6]C[-3])"
End Sub

Se quer entender melhor essa passagem, leia o artigo: 0164-Dica VBA: Objeto Range

Não sei quanto a vocês, mas eu particularmente não gosto desta notação para as fórmulas. Estamos acostumados com o padrão A1 e fazer a leitura de fórmulas no padrão L1C1, é bem chato….

Mas, vamos lá: a fórmula indica que está sendo realizada a soma do intervalo cuja célula inicial está na mesma linha que a célula G1 e está localizado seis colunas à esquerda (RC[-6] = Célula A1), e cujo final está 6 linhas abaixo da linha na qual está G1 e três colunas à esquerda (R[6]C[-3] = D7).

Como eu disse, não é uma notação muito agradável….

Mas o que podemos fazer para corrigir essa situação?

É bem simples: ao invés de usarmos a propriedade FormulaR1C1, utilizaremos a propriedade FormulaLocal.

Desta forma, podemos reescrever o nosso código da seguinte forma:

Sub SomarIntervalo()
Range("G1").FormulaLocal = "=SOMA(A1:D7)"
End Sub

A propriedade FormulaLocal permite que a fórmula seja inserida utilizando o idioma de instalação do Excel.

E se o meu Excel estiver instalado em Inglês? E se trabalho numa organização com operações internacionais e o meu arquivo pode vir a ser utilizado em outras linguagens?

Não há motivo para desespero: existe a propriedade Formula através da qual, inserimos a fórmula em inglês (linguagem original do Excel), e ela será corretamente interpretada independentemente da língua na qual o Excel esteja instalado:

Sub SomarIntervalo()
Range("G1").Formula = "=SUM(A1:D7)"
End Sub

Caso tenham dúvidas na conversão das funções do português para o inglês, visitem a nossa página Lista de funções do Excel (Português x Inglês)

Anúncios

In Excel We Trust

Marcado com: , , , ,
Publicado em Nível: Avançado
9 comentários em “0179-Dica VBA: Adicionando fórmulas em células
  1. tguxcn disse:

    Exactly what I was searching for, thanks for putting up.

  2. angsc12345 disse:

    Se a fórmula em questão contiver aspas, por exemplo = SE(A1=A5;”igual”;A2), ao usar o FormulaLocal para inserir essa fórmula em alguma célula isso resulta em erro por causa das aspas. Para corrigir isso, basta duplicar as aspas na fórmula no editor do VBA.
    Assim:
    = SE(A1=A5;””igual””;A2).

  3. Oi Adilson! Agradeço imensamente pela sua contribuição na difusão desse conhecimento essencial!
    Eu estava usando o método FormulaR1C1 para várias coisas, e minha macro ficava pesada, passando de planilha em planilha por causa do select que precisa usar. Agora minhas macros ficarão muito mais sofisticadas com esses métodos que eu não conhecia. De coração, muito obrigada!

  4. Allan Edver disse:

    Olá Adilson. Parabéns pelo artigo!
    Estou com um desafio complexo (pelo menos para mim) e acho que vc pode me ajudar!
    Tenho duas planilhas (arquivos distintos), A e B.
    Quero buscar na planilha B um número, copiar e colar em uma célula na planilha A no lugar correspondente. Para essa tarefa, manualmente, eu faço o seguinte: copio uma célula da planilha A, verifico se o valor está na planilha B, se estiver copia uma célula da planilha B, volto para a planilha A e colo na célula específica.
    Tem como gerar uma macro para fazer isso?
    Grato!
    Allan

  5. diogo gimenez disse:

    Adilson, muito bom o texto,
    mas como faço pra uma Range Variavel?

    eu queria q ele se localizasse a partir de uma celula e considerasse todas as abaixo.

    tem como fazer?

    • Olá, Diogo.
      Imagine que queira somar todas as células até a última preenchida da coluna D.
      Você poderia fazer, por exemplo:

      Sub SomarIntervalo()
      LastRow = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
      Range(“G1”).Formula = “=SUM(A1:D” & LastRow & “)”
      End Sub

      [ ]s

  6. Eric Maicon disse:

    Não sei por que, mas no meu não reconhece em inglês…

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: