Visual Basic for Applications - VBA

 
 

Parte I - Fundamentos

Sumário:
  • Introdução
  • Declaração de variáveis
  • Tipos de dados
  • Constantes
  • Denominação de variáveis e constantes
  • Operador de atribuição
  • Operadores aritméticos
  • Operadores relacionais
  • Operadores lógicos
  • Precedência dos operadores
  • Exercícios
  • Funções de entrada e saída
  • Comentários
  • Codificação de procedimentos
  • Exercícios
  • Ponto de acesso
 

Introdução

A versão Visual Basic para Aplicativos é um ambiente completo de desenvolvimento, consistente com a versão de plataforma única do Visual Basic e compartilhada por todos os aplicativos do Microsoft Office. O Visual Basic interpreta um conjunto especial de comandos denominado biblioteca de objetos do Excel. O Visual Basic que vem com o Excel não é a única linguagem que poderá comunicar-se com a biblioteca de objetos. Qualquer linguagem que ofereça suporte à automação poderá controlar o Excel.
Alguns componentes essenciais da linguagem VBA para Excel são, a seguir, destacados e conceituados:

Objetos
Um objeto é um tipo especial de variável que contém dados e códigos e representa um elemento específico no Excel.  O Visual Basic suporta um conjunto de objetos que correspondem diretamente aos elementos do Microsoft Excel.
Por exemplo, o objeto Workbook representa uma pasta de trabalho, o objeto Worksheet representa uma planilha e o objeto Range representa um intervalo de células.
Uma pasta de trabalho, no Microsoft Excel, corresponde a um arquivo que  pode conter diversas planilhas e folhas de gráficos ou planilhas de gráficos.

Propriedades e métodos
Para realizar uma tarefa o Visual Basic retorna um objeto que representa o elemento apropriado do Excel e depois o manipula usando as propriedades e métodos daquele objeto.
As propriedades são características ou atributos de um objeto e os métodos são ações que os objetos podem executar.

Módulos
O código dentro de um módulo é organizado em procedimentos. Um módulo é um conjunto de procedimentos que realiza tarefas específicas.
Por exemplo, procedimentos que executam várias tarefas contábeis podem ser agrupados em um módulo.

Editor do Visual Basic (VBE)
O VBE é a interface de desenvolvimento do VBA e pode ser acessado a partir da planilha Excel, pressionando as teclas Alt+F11. O VBE abre a janela Código para escrever e editar códigos do Visual Basic e, por padrão, abre, também, a janela do Projeto (VBAProject), encaixada à janela Código, que contém os elementos do projeto como módulos, formulários e classes.

Procedimentos
Um procedimento é uma unidade de código localizada entre instruções Sub e End Sub ou entre instruções Function e End Function que realiza uma tarefa.
Um procedimento desempenha uma tarefa específica.  Um procedimento Function pode retornar valor, ao passo que um procedimento Sub não retorna valor.

Para uma visão geral da estrutura de um procedimento Sub, segue um exemplo com breves comentários que explicam cada linha:

 
 

Declaração de variáveis

Uma variável é uma área na memória, referenciada por um identificador, onde pode ser armazenado um valor e alterado a qualquer momento.
Um nome de identificador deve começar por uma letra, ser único dentro do mesmo nível de escopo, não pode conter um espaço entre caracteres do nome e nem pode ser igual a uma palavra reservada da linguagem ou que pertence a sintaxe da linguagem. Não é permitido o uso de caracteres especiais, exceto de alguns símbolos (_, $, %, #, @, &, !) quando utilizados como último caractere do nome. O símbolo sublinhado (_) também pode ser usado entre palavras do nome da variável.

Uma variável pode ser declarada, usando as seguintes palavras-chave para definir seu escopo ou local (procedimento ou módulo) onde ela poder ser acessada ou manipulada:
Dim ou Static (no procedimento)
Dim ou Private (no módulo)
Public (no módulo)
Dim – O valor da variável é retido apenas enquanto o procedimento no qual ela foi declarada estiver em execução.
Static – a variável preserva o valor entre as chamadas ao procedimento.
Private – o valor fica disponível a todos os procedimentos dentro do módulo onde a variável foi declarada.
Public – a variável pode ser acessada pelos procedimentos de vários módulos de uma pasta de trabalho.

A variável pode ser declarada de modo implícito pelo VBA no momento em que ela for referenciada numa instrução. No entanto, o programa poderá tornar-se mais eficiente se as variáveis forem declaradas de modo explícito pelo usuário. A declaração explícita de todas as variáveis reduz a incidência de erros de conflitos de nomenclatura e de digitação.
Para impedir que o VBA faça declarações implícitas, deve-se inserir a instrução Option explicit em um módulo antes de todos os procedimentos.

Palavras reservadas (Termos que são de uso da linguagem VBA)
as, byref, byval, case, close, const, date, declare, dim, each, else, empty, false, for, friend, function, get, input, if, is, len, let, lock, next, new, nothing, on, open, option, print, public, private, resume, seek, select, set, static, string, sub, then, to, true, type, variant, with, while, write.

 
 

Tipos de dados

O tipo de uma variável determina a quantidade de memória que ela ocupará, em bytes, e o modo de armazenamento.  O VBA opera com os seguintes tipos básicos:

Nome Tamanho Intervalo
  Integer   2 bytes   -32768 a 32767
  Long   4 bytes   -2.147.483.648 a 2.147.483.467
  Single   4 bytes   -3,4 x 1038 a 3,4 x 1038
  Double   8 bytes   1,7 x 10308 a 1,7 x 10308
  Currency   8 bytes   -9223372036854,5808 a 9223372036854,5807
  String   1 byte por caractere   0 a aproximadamente 65.500
  Boolean   2 bytes   Verdadeiro ou Falso
  Date   8 bytes   01/01/100 a 31/12/9999
  Object   4 bytes   Qualquer referência a objeto
  Variant   16 bytes + 1 byte para   cada caractere   Válido para qualquer tipo de dados.

Uma variável que conterá número inteiro pode ser declarada como Integer ou Long. Exemplos:
  Dim contador As Integer
  Private tamMemoria As Long
Uma variável que conterá números fracionários, pode ser declarada com o tipo de dado Single, Double ou Currency. Exemplos:
  Public lado1 As Single
  Private área As Double
  Dim custoProd As Currency
Uma variável que conterá um conjunto de caracteres alfanuméricos pode ser declarada com o tipo de dados String. Exemplos:
  Dim descrProd As String
  Dim nomeFunc As String
Uma variável que contém valor lógico (verdadeiro ou falso) pode ser declarada com o tipo de dados Boolean.  O valor padrão é False. Exemplo:
  Dim limExcedido As Boolean
Uma variável que contém valores de data e hora deve ser declarada com o tipo de dados Date. Exemplo:
  Dim data As Date
Uma variável que contém uma referência a um objeto do MS Excel pode ser declarada com tipo de dados Object.  Para atribuir um objeto a uma variável-objeto, deve-se usar a instrução Set. Exemplos:
  Dim plan1 As object
  Set plan1 = Worksheets(1)
Uma variável Variant permite o armazenamento de qualquer tipo de dado. Exemplo:
  Dim codMarca 'Variant por padrão
 
 

Constantes

Uma variável declarada por meio do qualificador const significa que seu conteúdo não poderá ser alterado em todo programa.  A constante deve ser inicializada, isto é, no momento de sua declaração deverá ser atribuído um valor a ela. Exemplos:
Const pi = 3.1416
Const pi2 = pi * 2
Pode ser especificado o escopo de uma constante, como segue:
Private Const Pi = 3.14159
Fica disponível a todos os procedimentos dentro de um dado módulo.  Deve ser declarada a nível de módulo.
Public Const max = 1024
Permanece disponível a todos os módulos.  Deve ser declarada a nível de módulo.
Const idade = 29
Disponível apenas dentro do procedimento onde foi declarada.
 
 

Denominação de variáveis e constantes

Recomenda-se para a declaração de variáveis a utilização de letras minúsculas. Caso o nome seja composto de mais de uma palavra, as demais devem ser iniciadas com letras maiúsculas ou colocar o símbolo sublinhado entre elas. Exemplos:
  total   contador
  ValorMedio   segunda_fase
  soma_valor_real   contaLinhaRel2
Dica: Utilize nomes significativos na denominação de variáveis. Dê um nome que represente o mais precisamente possível o propósito desta variável.  Evite nomes sem significado ou abreviaturas não usuais.
Exercícios
Quais dos seguintes nomes são válidos para a declaração de variáveis e constantes em VBA?
  a) a123   b) 31dezembro   c) nome_aluno
  d) valor+1   e) 2aFase   f) valor-bruto
  g) FINAL   h) j   i) juros_de_5%
  j) const   k) melhorPreco   l) funcionario_novo
  m) #9A   n) preço   o) current
  p) nome do aluno   q) _linha1   r) maiorNro.
os itens de nomes considerados válidos.
 
 

Operador de atribuição

O operador de atribuição é representado por = (sinal de igualdade). Atribui à variável a expressão à direita do sinal de igualdade.

Declaração Atribuição
 dim resto as integer  resto = 120 – 49
 dim salario as double  salario = 510.00
 dim cidade as string  cidade = 'Blumenau'

Após a execução dos comandos de atribuição, o local da mémória RAM de endereço denominado resto passa a armazenar o valor 71, o local de endereço de nome salario, 510.00 e o de nome cidade, Blumenau.
 
 

Operadores aritméticos

As variáveis e constantes numéricas podem ser utilizadas em cálculos matemáticos, utilizando funções matemáticas ou aplicando os operadores. A tabela, a seguir, apresenta as operações, os símbolos respectivos e as sintaxes dos operadores aritméticos:

Operação Operador Sintaxe
  Multiplicação *   r = n1 * n2
  Divisão /   r = n1 / n2
  Adição +   r = n1 + n2
  Subtração   r = n1 – n2
  Potenciação ^   r = b ^ e
  Divisão (retorna o resto) Mod   r = n1 Mod n2
  Divisão (retorna o quoc. inteiro) \   r = n1 \ n2

Funções matemáticas intrínsecas mais utilizadas:

Operação Exemplo Resultado
  Raiz quadrada sqr(9.0) 3
  Parte inteira int(7.8) 7
  Valor absoluto abs(-5) 5
  Número aleatório rnd(12) ?
  Seno sin(3.7) 0,53
  Co-seno cos(4.1) 0,57
  Tangente tan(6.8) 0,56
 
 

Operadores relacionais

Operadores relacionais fazem comparações, ou seja, verificam a relação de magnitude e igualdade entre dois valores. Indicam a comparação a ser realizada por uma expressão lógica.
São seis os operadores relacionais:
Operação Operador
  Igual a
=
  Maior que
>
  Menor que
<
  Diferente de
<>
  Maior ou igual a
>=
  Menor ou igual a
<=
 
 

Operadores lógicos

Utilizados em expressões lógicas compostas ou para inverter o estado lógico de uma condição. Retornam o valor verdadeiro ou falso.
Expressão usual
Operação
Operador
e
Conjunção
and
ou
Disjunção
or
não
Negação
not

Os operadores and e or são binários e o operador not é unário.
Estes operadores avaliam os operandos como lógicos (0 ou 1), sendo o valor lógico 0 considerado falso (false) e o valor lógico 1, verdadeiro (true). O VBA conta ainda com os operadores lógicos eqv (equivalência), imp (implicação) e xor (exclusão lógica) que aqui não serão estudados por serem de pouco uso.
As tabelas verdade, a seguir, expressam operações lógicas:
conjunção (and)
disjunção (or)
negação (not)
V e V = V
V ou V = V
não V = F
V e F = F
V ou F = V
não F = V
F e V = F
F ou V = V
 
F e F = F
F ou F = F
 
V = verdadeiro; F = falso.
 
 

Precedência dos operadores

A precedência é o critério que especifica a ordem de avaliação dos operadores de uma expressão qualquer. O VBA prioriza as operações de acordo com a ordem das categorias listadas abaixo. Os operadores entre parênteses possuem a mesma prioridade e são executados na ordem em que são escritos na instrução da esquerda para direita:

Categorias e operadores:
  1. Aritméticos: ^ , (*, /), (+, -)
  2. Relacionais (avaliados da esquerda para a direita na ordem em que aparecem)
  3. Lógicos: not, and e or

(Parênteses podem ser utilizados para determinar uma forma específica de avaliação de uma expressão.)

 
 

Exercícios  (Para obter as respostas posicione o cursor sobre a letra da expressão)

a = (2 + 1) * 6
b = 20 / (-2) / 5
c = (5 + 1) / 2 * 3
d = 2 + 6 / 4 * 8
e = 18 – 11 mod 3
          
f = 5 < 8 and 2 > 4
g = 6 > 2 or 10 = 12
h = not 12 > 30
i = 5 < 8 and 2 > 4
j = 8 <> 18 or 12 > 4 * 5
          
x=0: y=1: z=2
k = x > y and y < x
l = x > z or z >= y
m = x < y and not y = y
n = false and z > y
o = y = x + 1 or y + 3 > 4
dim ano as integer: ano=2012 (Verifica se o ano 2012 é bissexto)
u = (ano Mod 4)= 0 And (ano Mod 100) > 0 Or (ano Mod 400) = 0
 
 

Funções de entrada e saída

Permitem obter dados do ambiente exterior para a memória do computador e fornecer dados do computador ao mundo exterior.

Função InputBox (caixa de entrada)
Apresenta uma caixa de diálogo para que o usuário possa introduzir o dado de entrada. Ela exibe um aviso em uma caixa de diálogo, aguarda até que o usuário insira um texto ou clique em um botão para retornar o conteúdo da caixa de diálogo.

Sintaxe:
 InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
 onde,
 prompt  argumento obrigatório e representa a mensagem que será exibida   na caixa de diálogo;
 title  opcional; texto a ser exibido na barra de título da caixa de diálogo;
 default  opcional; dado padrão de entrada a ser exibido na caixa de texto;
 xpos e ypos  opcionais; especificam as coordenadas para posicionamento da  caixa de diálogo na tela;
 helpfile e context  opcionais; identifica o arquivo de ajuda do usuário e o   número de  contexto atribuído ao tópico da ajuda.

Função MsgBox (caixa de saída)
Mostra uma caixa de diálogo contendo o botão OK e o valor do dado de saída.

Sintaxe:
 MsgBox(prompt[, buttons] [, title] [, helpfile, context])
 onde,
 prompt  argumento obrigatório; mensagem que será exibida na caixa de  diálogo;
 buttons  opcional; especifica o tipo de botão a ser exibido na caixa de  diálogo;
 title  opcional; texto a ser exibido na barra de título da caixa de diálogo;
 helpfile e context  opcionais; identifica o arquivo de ajuda do usuário e o número de  contexto atribuído ao tópico da ajuda.

As palavras destacadas em itálico são os argumentos nomeados da função. Os argumentos colocados entre colchetes são opcionais. Os argumentos das funções podem ser especificados pela posição e seguem a ordem apresentada na sintaxe separados por uma vírgula. Para omitir alguns argumentos posicionais, deve-se incluir o delimitador de vírgula correspondente. Para especificar um argumento pelo nome, utilizar o nome do argumento seguido por dois-pontos e um sinal de igualdade (:=) e o valor do argumento. Pode-se especificar os argumentos nomeados em qualquer ordem. Exemplo: Title:="caixa de nomes", Prompt:="Seu nome é " & nome

Exemplo das funções InputBox e MsgBox com argumentos posicionais:

A instrução Option Explicit força a declaração explícita de todas as variáveis do módulo e deve aparecer antes de qualquer procedimento. O nome do comando Sub é dado pelo programador e segue as convenções de nomenclatura de variáveis. A primeira instrução do procedimento, denominado exemplo01, declara a variável nome de tipo string através da instrução Dim. A esta variável é atribuído o nome que será digitado pelo usuário na caixa de diálogo que é aberta pela função InputBox. A seguir, a função MsgBox mostrará o conteúdo da variável nome na caixa de mensagem.

Na função InputBox, foram codificados o prompt "Qual é o seu nome" e o title, opcional, "Entrada de nomes". A função MsgBox exibe o argumento prompt "Seu nome é" e o title "Caixa de nomes", antecedido por uma vírgula, indicando a ausência do argumento buttons e a variável nome, escrita após o prompt, concatenada pelo símbolo ampersand ou e-comercial (&).

Resultado da execução do código acima:

   

Para separar em linhas o texto inserido no prompt pode-se fazê-lo através dos caracteres:
Chr(13) de retorno de carro ou
Chr(10) de alimentação de linha ou, ainda, combinados
Chr(13) & Chr(10).
Exemplo de como a função Msgbox do procedimento acima poderia ser codificada para exibir o resultado em duas linhas:
           MsgBox " Seu nome é " & chr(13) & nome, , "Caixa de nomes"
Resultado:              

 
 

Comentários

São utilizados com a finalidade de documentar o programa-fonte. Eles não são tratados pelo compilador. Um apóstrofo (') introduz comentários no código.

Exemplo:    ' Isto é um comentário.

 
 

Codificação de procedimentos

Ambiente de programação VBA
O Editor do Visual Basic Applications é integrado ao Excel e, assim, ao adquirir o Microsoft Excel está-se adquirindo também o VBA.

Para abrir o editor, a partir do Microsoft Excel clique em Exibir Macros e na caixa de diálogo Macros dê um nome para a Macro ou Procedimento e, em seguida, clique no botão Criar para abrir o editor já com um módulo na janela Código e com as instruções Sub e End Sub. O editor VBA também pode ser ativado a partir do Microsoft Excel pressionado-se as teclas Alt+F11.
Considerar que para executar uma macro ou procedimento é necessário que o curso de execução de macros no Excel esteja habilitado.

Digite a codificação mostrada abaixo, compile e execute o programa e, em seguida, examine atentamente seu conteúdo e resultado.

Enunciado do problema a codificar
Calcular e imprimir a média aritmética de três notas de provas de um aluno a serem fornecidas pelo usuário através do teclado.

Implementação em VBA

Para compilar e executar o programa, basta pressionar a tecla F5 ou clicar no botão verde com formato de cabeça de seta à direita (Executar Sub/UserForm) na Barra de ferramentas ou a partir do menu Executar. Para ocorrer uma execução direta de um procedimento ao pressionar F5 ou o botão da Barra de ferramentas, o cursor do mouse deve estar posicionado em qualquer lugar entre as instruções Sub e End Sub do procedimento a ser executado.

Segue-se um exemplo de codificação do mesmo problema no mesmo Módulo1 do projeto Pasta1, considerando como entrada das notas as células C1, C2 e C3 da planilha Excel Plan1 e como saídas as células A4 e C4 dessa mesma planilha. (A célula A4 conterá a expressão: Média aritmética e a C4, o valor da média).

Para codificar novo procedimento no mesmo módulo, clique no menu Inserir da janela de código e em Procedimento. Na caixa de diálogo "Adicionar procedimento", digite o nome do procedimento calcMedia2, selecione o tipo Sub e o escopo Público. (Procedimento Sub sem especificação de escopo explícito é considerado Público por padrão).

A proriedade Range pode ser substituída pela propriedade Cells apresentada no procedimento CalcMedia2 como comentário. O uso destas propriedades sem um qualificador de objeto representa as células da planilha ativa, ou seja, a planilha que se encontra aberta no Excel. Considerando como exemplo apenas a linha da variável nt1, equivale escrever: nt1 = ActiveSheet.Range("C1").Value ou nt1 = ActiveSheet.Cells(1, 3).Value. Para se referir a uma outra planilha que não a ativa deve ser usado o objeto Worksheets e entre parênteses o nome ou o índice da planilha requisitada. Exemplo: Worksheets("Plan3").Range("A1").Value = 3.14159.
A propriedade Cells especifica a célula da planilha utilizando indices de linha e coluna ou estilo de referência L1C1, ao passo que a propriedade Range usa letras para identificar as colunas e números para as linhas.

Antes de executar o procedimento CalcMedia2, certifique-se de ter preenchido as células C1, C2 e C3 da planilha com valores de notas e que essa planilha do Excel permaneça ativa. Seguem recortes de exemplos da planilha de dados mostrando as posições antes e depois da execução do procedimento CalcMedia2:
Antes    Depois
   

A seguir é apresentado outro modo de obter o mesmo resultado a partir da mesma fonte de dados, mostrada acima, e sem utilizar variáveis para auxiliar no processamento:

A média é apurada a partir das células da planilha, sem transferir seus valores para variáveis e o resultado da média é atribuído diretamente na célula da linha 4 coluna 3.

Os procedimentos podem ser salvos a partir da planilha do Excel como se procede para o salvamento de qualquer planilha de uso habitual, podendo fechar a janela do editor VBE a qualquer momento que nada é perdido enquanto a planilha correspondente estiver aberta. Se a janela do editor for fechada, para abri-la novamente basta teclar Alt+F11. Caso a codificação dos procedimentos não sejam exibidos, clique em Módulo1, no painel Projeto à esquerda, com o botão direito do mouse e, no menu de contexto, em Exibir código.

 
 

Exercícios

Os exercícios, a seguir, podem ser todos desenvolvidos no mesmo módulo e na mesma página de código do Microsoft Visual Basic e referirem-se quando necessário à mesma planilha do Excel:

  1. Dados os comprimentos dos catetos de um triângulo retângulo, fazer um procedimento para determinar e imprimir o comprimento da hipotenusa. Utilizar a função InputBox e a MsgBox para entrada e saída de dados.
    (Fórmula do triângulo retângulo: a2 = b2 + c2. Para extrair a raiz quadrada de um número ou expressão numérica pode ser utilizada a função Sqr).

  2. Em certa disciplina a nota semestral do aluno é calculada com base em seu desempenho verificado através de três provas.  A primeira prova tem peso 3, a segunda, peso 4 e a terceira, peso 5.  Elaborar um procedimento para calcular e apresentar a média do semestre, tendo como entrada as notas referentes as três provas nas células A3, A4 e A5 de Plan1 e como saída a média do semestre exibida nas células A6 e B6 da mesma planilha. Apresentar os dados de saída em negrito e na cor vermelha.

  3. Escrever um procedimento para efetuar o cálculo da quantidade de litros de combustível gastos em uma viagem e da distância percorrida, sabendo-se que o veículo faz 10 km/litro. O usuário informará a velocidade média na célula C3 e o tempo despendido na viagem nas células C4 (horas cheias) e C5 (minutos). Mostrar a quantidade de litros gastos e a distância percorrida na caixa de mensagem do Visual Basic (MsgBox).

  4. Sabendo-se que o KWh custa R$ 0,40, elaborar um procedimento para obter a partir de uma caixa de entrada a quantidade de quilowatts consumida por uma residência e calcular e escrever na planilha, na célula G4, o valor bruto a ser pago e, em G5, o valor líquido caso seja aproveitado um desconto de 15%. Na célula F4, escrever a expressão "Valor bruto" e na célula F5, "Valor líquido".

  5. Elaborar um programa para calcular a diferença de preços de um determinado produto, comparando os preços de compra anterior e atual.  Obter os preços anterior e atual das células B11 e B12 e imprimir a diferença algébrica e percentual dos preços nas células B13 e B14, respectivamente.

  6. Elaborar um programa para ler a idade de uma pessoa em numero de anos, meses e dias a partir da células B11, B12 e B13, respectivamente, calcular e imprimir essa idade em Meses, Dias, Horas e Minutos e apresentar o resultado através da função MsgBox.

Para apresentar a codificação dos exercícios acima considerou-se uma mesma planilha do Excel como base de dados. Ela contém exemplos de dados de entrada e resultados dos processos, quando for o caso, e pode ser vista ao se sobrepor o ponteiro do mouse na palavra Planilha que aparece na linha abaixo junto aos exercícios resolvidos, a qual, aliás, é a mesma apresentada na seção seguinte sem o objeto gráfico ou botão de acesso designado Idade.



Ponto de acesso

Um procedimento ou uma macro pode ser executada a partir de vários meios como através de uma tecla de atalho, de um botão na barra de ferramentas ou de um objeto gráfico, entre outros.
Pode-se executar um procedimento a partir do corpo da planilha Excel onde se encontram os dados de entrada ou onde será exibido o resultado.

Para criar um botão ou ponto de acesso, clique em inserir e depois em Formas, selecione uma Forma e desenhe-a arrastando o ponteiro do mouse no corpo da planilha. Em seguida, clique com o botão direito do mouse na Forma ou ponto de acesso criado e, no menu de contexto, em Atribuir Macro. Na caixa de diálogo "Atribuir macro", selecione o nome da macro ou procedimento e clique em OK.
A seguir, é apresentada a planilha dos exercícios com um exemplo de botão ou ponto de acesso referente ao procedimento exerc6_idade: