Você está na página 1de 334

Excel 2016 VBA - Módulo I

Excel 2016 VBA -


Módulo I

COD.: TE 1794/3
Excel 2016 VBA -
Módulo I
Créditos

Copyright © Monte Everest Participações e Empreendimentos Ltda.

Todos os direitos autorais reservados. Este manual não pode ser copiado, fotocopiado,
reproduzido, traduzido ou convertido em qualquer forma eletrônica, ou legível por
qualquer meio, em parte ou no todo, sem a aprovação prévia, por escrito, da Monte
Everest Participações e Empreendimentos Ltda., estando o contrafator sujeito a responder
por crime de Violação de Direito Autoral, conforme o art.184 do Código Penal Brasileiro,
além de responder por Perdas e Danos. Todos os logotipos e marcas utilizados neste
material pertencem às suas respectivas empresas.

“As marcas registradas e os nomes comerciais citados nesta obra, mesmo que não sejam assim identificados,
pertencem aos seus respectivos proprietários nos termos das leis, convenções e diretrizes nacionais e
internacionais.”

Excel 2016 VBA -


Módulo I
Coordenação Geral Revisão Ortográfica e Gramatical
Marcia M. Rosa Cristiana Hoffmann Pavan

Coordenação Editorial Diagramação


Henrique Thomaz Bruscagin Carla Cristina de Souza

Autoria
Leonardo de Oliveira Costa Edição nº 1 | 1794_3_WEB
junho/ 2016

Este material constitui uma nova obra e é uma derivação da seguinte obra original,
produzida por TechnoEdition Editora Ltda., em Out/2013: Excel VBA – Módulo I
Autoria: Beatriz Silva Ramos
Sumário

Informações sobre o treinamento........................................................................................ 10

Capítulo 1 - Ambiente de programação Excel ................................................................ 11


1.1.  Introdução a macros e VBA........................................................................ 12
1.2.  Visual Basic Editor (VBE)............................................................................. 13
1.2.1.  Janela do Editor do Visual Basic (VBE)........................................................ 14
1.3.  Criando sua primeira macro...................................................................... 21
1.3.1.  Criando uma segunda macro.................................................................... 27
1.4.  Executando uma macro............................................................................. 28
1.4.1.  Atribuindo uma tecla de atalho................................................................. 28
1.4.2.  Botão Executar........................................................................................... 30
1.4.3.  Botões de Controles de Formulário........................................................... 30
1.4.4.  Imagens, formas e figuras......................................................................... 32
1.4.5.  Barra de Ferramentas de Acesso Rápido.................................................... 34
1.4.6.  Executar uma macro no ambiente VBE...................................................... 35
1.4.7.  A partir de outra macro............................................................................. 36
1.4.8.  Auto_Open e Auto_Close........................................................................... 37
1.4.9.  Botões ActiveX........................................................................................... 38
1.4.10.  Inúmeros eventos...................................................................................... 41
1.4.11.  Métodos OnKey e OnTime do objeto Application...................................... 41
1.4.12.  Application.run.......................................................................................... 41
1.5.  Segurança de macros................................................................................ 41
1.6.  Depurando e editando o código................................................................ 44
1.6.1.  Depurando o código linha a linha de comando......................................... 45
1.6.2.  Ponto de interrupção (break point)............................................................ 47
1.6.3.  Interropendo uma macro durante a execução .......................................... 48
1.7.  Conceitos básicos de estruturas e sintaxe................................................. 48
1.7.1.  Entendendo objetos, coleções, hierarquias, propriedades e métodos....... 48
1.8.  Sistema de ajuda....................................................................................... 56
1.9.  Pesquisador de objeto............................................................................... 57
1.10.  Barra de ferramentas VBE.......................................................................... 58
1.11.  Janela Verificação imediata........................................................................ 60
Pontos principais......................................................................................................... 61
Teste seus conhecimentos ..................................................................................................... 63
Mãos à obra! .................................................................................................................................. 67

Capítulo 2 - Principais objetos, propriedades e métodos ........................................ 69


2.1.  Introdução................................................................................................. 70
2.2.  Objeto Range - Célula(s)............................................................................ 70
2.2.1.  Fazendo referência.................................................................................... 70
2.2.1.1. Fazendo referência pelo número de índice................................................ 72
2.2.1.2. Fazendo referência pelo nome da célula................................................... 72
2.2.1.3. Utilizando a propriedade ActiveCell........................................................... 73
2.2.1.4. Configurando o objeto Range como uma variável..................................... 75
2.2.2.  Principais propriedades ............................................................................ 75
2.2.2.1. Value......................................................................................................... 75
2.2.2.2. Font........................................................................................................... 76
2.2.2.3. Uso do With / End With.............................................................................. 77
Excel 2016 VBA - Módulo I

2.2.2.4. End............................................................................................................ 80
2.2.2.5. Offset........................................................................................................ 80
2.2.2.6. ColorIndex................................................................................................. 81
2.2.2.7. NumberFormat.......................................................................................... 83
2.2.2.8. CurrentRegion........................................................................................... 83
2.2.2.9. Address, Column, Row.............................................................................. 83
2.2.2.10. Borders...................................................................................................... 84
2.2.3.  Principais métodos.................................................................................... 84
2.2.3.1. Select......................................................................................................... 84
2.2.3.2. Clear.......................................................................................................... 84
2.2.3.3. ClearContents............................................................................................ 85
2.2.3.4. ClearFormats............................................................................................. 85
2.2.3.5. Delete........................................................................................................ 85
2.2.3.6. Insert......................................................................................................... 86
2.2.3.7. Speak......................................................................................................... 86
2.2.4.  Coleção Cells............................................................................................. 86
2.3.  Objeto Worksheet - Planilha(s)................................................................... 87
2.3.1.  Fazendo referência.................................................................................... 87
2.3.1.1. Fazendo referência à planilha pelo nome (da aba da planilha).................. 88
2.3.1.2. Fazendo referência à planilha pelo número de índice................................ 88
2.3.1.3. Usando o nome do VBA............................................................................. 89
2.3.1.4. ActiveSheet................................................................................................ 90
2.3.2.  Principais propriedades............................................................................. 90
2.3.2.1. Name......................................................................................................... 90
2.3.2.2. Visible........................................................................................................ 90
2.3.2.3. ScrollArea.................................................................................................. 92
2.3.3.  Principais métodos.................................................................................... 92
2.3.3.1. Select......................................................................................................... 92
2.3.3.2. Delete........................................................................................................ 92
2.3.3.3. Protect / Unprotect.................................................................................... 93
2.3.3.4. Copy.......................................................................................................... 94
2.3.3.5. Move.......................................................................................................... 95
2.3.4.  Coleção Sheets.......................................................................................... 95
2.4.  Objeto Workbook - Arquivo(s)................................................................... 97
2.4.1.  Fazendo referência.................................................................................... 97
2.4.1.1. Fazendo referência pelo nome do arquivo................................................. 97
2.4.1.2. Fazendo referência pelo número de índice................................................ 98
2.4.1.3. Fazendo referência por ActiveWorkbook e ThisWorkbook......................... 98
2.4.2.  Principais propriedades............................................................................. 98
2.4.2.1. Name, Path e FullName.............................................................................. 99
2.4.2.2. Save........................................................................................................... 99
2.4.3.  Principais métodos.................................................................................... 99
2.4.3.1. Close......................................................................................................... 99
2.4.3.2. Open.......................................................................................................... 100
2.4.3.3. Save........................................................................................................... 100
2.4.3.4. Protect....................................................................................................... 101
2.4.3.5. Unprotect.................................................................................................. 101
2.5.  Objeto Application – O próprio Excel......................................................... 101
2.5.1.  Principais propriedades............................................................................. 101

6
Sumário

2.5.1.1. Caption...................................................................................................... 102


2.5.1.2. ActiveWindow............................................................................................ 103
2.5.1.3. ScreenUpdating......................................................................................... 103
2.5.1.4. DisplayAlerts............................................................................................. 104
2.5.1.5. EnableCancelKey........................................................................................ 105
2.5.1.6. DataEntryMode.......................................................................................... 106
2.5.1.7. WindowState.............................................................................................. 106
2.5.1.8. StatusBar................................................................................................... 107
2.5.1.9. Cursor....................................................................................................... 107
2.5.1.10. Dialogs...................................................................................................... 108
2.5.1.11. Version...................................................................................................... 109
2.5.2.  Principais métodos.................................................................................... 109
2.5.2.1. Quit........................................................................................................... 109
2.5.2.2. Calculate.................................................................................................... 109
2.5.2.3. FindFile...................................................................................................... 109
2.5.2.4. GetOpenFileName...................................................................................... 110
2.5.2.5. GetSaveAsFileName................................................................................... 111
2.5.2.6. OnKey........................................................................................................ 113
2.5.2.7. OnTime...................................................................................................... 117
2.5.2.8. Wait........................................................................................................... 120
Pontos principais......................................................................................................... 121
Teste seus conhecimentos ..................................................................................................... 123
Mãos à obra! .................................................................................................................................. 127

Capítulo 3 - Operadores, variáveis, constantes e arrays ......................................... 131


3.1.  Operadores................................................................................................ 132
3.1.1.  Operadores aritméticos............................................................................. 132
3.1.2.  Operadores de comparação....................................................................... 133
3.1.3.  Operadores lógicos................................................................................... 133
3.1.4.  Operadores de concatenação.................................................................... 134
3.1.5.  Ordem das operações................................................................................ 135
3.2.  Variáveis.................................................................................................... 136
3.2.1.  Declarando variáveis.................................................................................. 138
3.2.1.1. Declarando no procedimento.................................................................... 141
3.2.1.2. Declarando no módulo.............................................................................. 144
3.2.1.3. Declarando no projeto............................................................................... 145
3.2.1.4. Option Explicit........................................................................................... 146
3.3.  Macros com passagem de parâmetros...................................................... 147
3.4.  Constantes................................................................................................ 147
3.5.  Arrays........................................................................................................ 148
3.5.1.  Arrays multidimensionais.......................................................................... 151
3.5.2.  Arrays dinâmicos....................................................................................... 153
Pontos principais......................................................................................................... 154
Teste seus conhecimentos ..................................................................................................... 155
Mãos à obra! .................................................................................................................................. 159

7
Excel 2016 VBA - Módulo I

Capítulo 4 - Estruturas de decisão e repetição .............................................................. 161


4.1.  Introdução................................................................................................. 162
4.2.  Estruturas de repetição.............................................................................. 162
4.2.1.  Do...Loop................................................................................................... 163
4.2.1.1. Do While...Loop......................................................................................... 164
4.2.1.2. Do Until...Loop.......................................................................................... 166
4.2.2.  While...Wend.............................................................................................. 168
4.2.3.  For...Next e For Each...Next....................................................................... 169
4.3.  GoTo.......................................................................................................... 174
4.4.  Estruturas de decisão................................................................................ 175
4.4.1.  If...Then..................................................................................................... 175
4.4.2.  If...Then...Else............................................................................................ 179
4.4.3.  If aninhado................................................................................................ 184
4.4.4.  Inserindo várias condições com And e Or.................................................. 186
4.4.5.  Select Case................................................................................................ 189
4.5.  Tratamento de erros.................................................................................. 191
4.5.1.  Tipos de erros........................................................................................... 191
4.5.2.  Tratamento em tempo de execução.......................................................... 192
4.5.2.1. On Error GoTo line..................................................................................... 193
4.5.2.2. On Error Resume Next............................................................................... 196
4.5.2.3. On Error GoTo 0........................................................................................ 196
4.5.3.  Erros interceptáveis................................................................................... 197
Pontos principais......................................................................................................... 205
Teste seus conhecimentos ..................................................................................................... 207
Mãos à obra! .................................................................................................................................. 211

Capítulo 5 - Funções VBA ........................................................................................................ 217


5.1.  Introdução................................................................................................. 218
5.2.  Funções matemáticas................................................................................ 218
5.3.  Funções financeiras................................................................................... 219
5.4.  Funções de data e hora............................................................................. 220
5.5.  Funções de texto....................................................................................... 226
5.6.  Funções de conversão............................................................................... 232
5.7.  Funções de verificação............................................................................... 233
5.8.  Acessando a biblioteca de funções de planilha do Excel........................... 234
5.9.  Criando funções personalizadas................................................................ 237
5.9.1.  Utilizando as funções criadas.................................................................... 238
5.10.  Criando suplementos XLAM....................................................................... 239
Pontos principais......................................................................................................... 242
Teste seus conhecimentos ..................................................................................................... 243
Mãos à obra! .................................................................................................................................. 247

8
Sumário

Capítulo 6 - Interagindo com o usuário ............................................................................ 251


6.1.  MsgBox...................................................................................................... 252
6.1.1.  Exibindo uma caixa de mensagem............................................................ 252
6.1.2.  Constantes utilizadas nas caixas de mensagem........................................ 254
6.1.3.  Identificando o botão clicado.................................................................... 257
6.2.  Função InputBox........................................................................................ 258
6.3.  Método InputBox....................................................................................... 260
6.4.  Caixas de diálogo do Excel........................................................................ 262
6.5.  Eventos mais utilizados e práticos do Excel............................................... 264
6.5.1.  Procedimento de evento............................................................................ 267
6.5.2.  Eventos do WorkBook................................................................................ 270
6.5.2.1. Open.......................................................................................................... 271
6.5.2.2. BeforeClose............................................................................................... 271
6.5.3.  Eventos de Worksheet............................................................................... 271
6.5.3.1. Worksheet_Activate................................................................................... 272
6.5.3.2. Worksheet_SelectionChange...................................................................... 272
6.5.3.3. Worksheet_Calculate................................................................................. 272
6.5.3.4. Worksheet_Change.................................................................................... 273
6.5.4.  Eventos com UserForms............................................................................ 273
Pontos principais......................................................................................................... 276
Teste seus conhecimentos ..................................................................................................... 277
Mãos à obra! .................................................................................................................................. 281

Capítulo 7 - Objeto UserForm ................................................................................................ 285


7.1.  Introdução................................................................................................. 286
7.2.  Criando formulários.................................................................................. 286
7.2.1.  Inserindo controles em um formulário...................................................... 287
7.2.1.1. Caixa de ferramentas................................................................................ 288
7.2.2.  Configurando as propriedades dos controles............................................ 290
7.2.3.  Configurando a aparência dos controles................................................... 298
7.3.  Controles da Caixa de ferramentas do UserForm...................................... 299
7.3.1.  Exibindo um formulário............................................................................. 323
Pontos principais......................................................................................................... 327
Teste seus conhecimentos ..................................................................................................... 329
Mãos à obra! .................................................................................................................................. 333

9
Informações sobre este treinamento

Para o melhor aproveitamento do curso Excel 2016 VBA – Módulo I,


é imprescindível ter participado dos cursos Excel 2016 – Módulo I
e Introdução à Lógica de Programação, ou possuir conhecimentos
equivalentes.

10
Ambiente de
1
programação Excel
99 Introdução a macros e VBA;
99 Visual Basic Editor (VBE);
99 Criando sua primeira macro;
99 Diversas maneiras de executar uma macro;
99 Segurança de macros;
99 Depurando e editando o código;
99 Conceitos básicos de estruturas e sintaxe;
99 Sistema de ajuda;
99 Pesquisador de objeto;
99 Barra de ferramentas VBE;
99 Janela de Verificação Imediata.
Excel 2016 VBA - Módulo I

1.1. Introdução a macros e VBA


Macro é uma sequência de comandos escritos na linguagem VBA (Visual Basic
for Application), armazenada em um módulo no VBE (Editor do Visual Basic),
que pode ser executada sempre que você precisar.

EDITOR VBE

MACRO(S)

MÓDULO(S)

No Excel, os arquivos podem ter alto teor de programação, gerando os mais


variados tipos de aplicações. O VBA é um subconjunto do VB, desenvolvido
para atuar junto com as aplicações do Office. É uma linguagem de programação
visual, que utiliza o paradigma de orientação a objetos e eventos. Com o VBA,
interagimos com os objetos Excel (Células, Planilhas, Arquivos etc.) através de
suas propriedades, métodos e eventos.

12
Ambiente de programação Excel
1
Tanto o Excel quanto o VBE podem ser instalados em diversos idiomas, mas
o código VBA é sempre no idioma inglês, com padrões americanos (números
decimais separados por ponto em vez de vírgula, por exemplo).
As macros têm a função de automatizar tarefas e podem ser criadas com o
gravador de macros ou com o editor do Visual Basic que é incorporado ao Excel.
Focaremos no Editor do Visual Basic.

1.2. Visual Basic Editor (VBE)


O Editor do Visual Basic, ou VBE, é onde escrevemos, editamos ou deletamos
macros. O Excel tem que estar aberto para utilizarmos o VBE.

Habilite a guia Desenvolvedor do Excel. Caso ela esteja oculta, é necessário


ativá-la: pela guia Arquivo / Opções / Personalizar Faixa de Opções, marcar
a guia Desenvolvedor:

13
Excel 2016 VBA - Módulo I

Outra maneira de acessar a opção Personalizar a Faixa de Opções é


clicando com o botão direito do mouse em um dos nomes das guias do
Excel:

Uma das formas de acessar o ambiente VBE é por meio da Guia Desenvolvedor
/ Visual Basic (primeiro botão do grupo Código):

O atalho ALT + F11 é muito utilizado para acessar o


ambiente VBE. Para voltar a visualizar a planilha Excel,
basta teclar ALT + F11 novamente.

1.2.1. Janela do Editor do Visual Basic (VBE)

Para inserir módulos no Editor do Visual Basic, vá no menu Inserir (do Editor
VB) e escolha Módulo:

14
Ambiente de programação Excel
1
Outra maneira de inserir um módulo é pelo segundo botão da Barra de
Ferramentas Padrão do VBE:

Para remover um módulo, clique com o botão direito do mouse sobre o nome
do módulo e, então, na opção Remover:

15
Excel 2016 VBA - Módulo I

Embora não seja o caso, podemos exportar módulos para reutilizá-los


posteriormente. Como não estamos trabalhando com importação e exportação
de módulos, aqui, clicamos em Não:

É comum chamarmos o módulo de Módulo Padrão para


diferenciá-lo do Módulo de Classe, (conteúdo que não
será abordado neste treinamento).

Veja a descrição de algumas partes da janela do editor VBA:

JANELA PROJECT
EXPLORER

JANELA DO
CÓDIGO VBA

JANELA
PROPRIEDADES

16
Ambiente de programação Excel
1
•• Janela Project Explorer

Na janela Project Explorer, temos uma lista com todas as pastas de trabalho,
incluindo suas respectivas planilhas, seus módulos padrão, módulos de classe
e UserForms contidos nos arquivos abertos.

A janela Project Explorer, ilustrada na imagem a seguir, apresenta três botões
e uma área principal, que exibe, em uma estrutura hierárquica, os projetos
carregados, incluindo todos os seus itens e referências:

Os três botões da janela Project Explorer são descritos a seguir:

Opção Descrição
Exibir
Abre a janela Code, utilizada para gravar e editar código
código
para o item selecionado.

Exibir
Abre a janela Objeto para o documento ou UserForm
objeto
selecionado.

Alternar
Exibe ou oculta as pastas. Quando as pastas ficam ocultas,
pastas
seus conteúdos ainda ficam visíveis.

17
Excel 2016 VBA - Módulo I

A tabela a seguir descreve os itens que a área principal pode exibir. Podemos
expandir ou contrair a exibição dos itens utilizando os botões de mais (+) e
menos (-):

Opção Descrição
Representa um projeto.

Representa um UserForm (arquivos .frm do projeto).

Representa um módulo (arquivos .bas do projeto).

Representa um módulo de classe (arquivos .cls do projeto).


Representa ActiveX Designers, ou seja, os criadores (arquivos
.dsr do projeto).
Representa as referências de outros projetos, definidas com o
comando Referências do menu Ferramentas.

Os documentos são representados por ícones


diferenciados, de acordo com seu tipo.

•• Janela Propriedades

Na janela Propriedades, temos a lista das propriedades do objeto selecionado


na janela Project Explorer.

Essas são as três janelas básicas do VBE. Podemos escolher fechá-las (Project
Explorer e Propriedades) ou exibi-las pelo menu Exibir do VBE.

18
Ambiente de programação Excel
1
O padrão é estar com estas janelas abertas. Caso sua janela do Project Explorer
ou a janela Propriedades não esteja aberta, podemos exibi-las pelo menu Exibir
do Editor do VBA:

No menu Ferramentas / Opções / Formato do Editor, podemos escolher a


fonte e tamanho para as letras do nosso código:

É muito comum para os desenvolvedores trabalhar com as janelas do Excel e do


VBE lado a lado, ou restaurar a janela do VBE dentro da planilha. Assim, quando
executarmos a macro, podemos ver, ao mesmo tempo, o que está acontecendo
na planilha Excel.

19
Excel 2016 VBA - Módulo I

Para visualizar a janela do VBE dentro da planilha, basta redimensioná-la:

Alguns desenvolvedores preferem ir na Barra de Tarefas do Windows e, com o


botão direito do mouse, escolher Mostrar janelas lado a lado:

20
Ambiente de programação Excel
1
1.3. Criando sua primeira macro
As macros são digitadas dentro de um módulo. Caso necessário, pode-se criar
mais módulos além do primeiro, os quais serão disponibilizados na pasta
Módulos. Os módulos subsequentes serão nomeados como Módulo2, Módulo3
e, assim, sucessivamente.

É possível alterar o nome de um módulo seguindo os procedimentos adiante:

1. Clique no menu Exibir do VBE e, em seguida, na opção Janela 'Propriedades';

2. Digite o nome do módulo dentro da propriedade Name:

Os módulos, além de armazenarem as macros, podem ser utilizados para


organizar o projeto. Podemos, por exemplo, criar um módulo em que estarão
disponíveis todas as macros referentes à formatação do projeto, e outro módulo
em que estarão somente os cálculos realizados:

21
Excel 2016 VBA - Módulo I

Para criarmos uma macro, devemos seguir os procedimentos adiante:

1. Crie um arquivo no Excel;

2. Abra o editor de Visual Basic pressionando ALT + F11;

3. Crie a pasta Módulos, seguindo um dos procedimentos adiante:

•• Clique no menu Inserir, opção Módulo;

•• Clique com o botão direito o mouse sobre a janela Project Explorer e


selecione, no menu de atalho que surgir, Inserir / Módulo.

Então, a pasta Módulos será criada e, dentro dela, teremos o Módulo1 ativo:

4. Dentro do módulo, crie uma macro com o nome Teste. Digite a palavra-chave
Sub, insira um espaço, digite Teste e pressione ENTER. Essa ação faz com que
surjam dois parênteses após o nome da macro. A instrução End Sub surgirá
abaixo, indicando o final do procedimento, como mostrado a seguir:

Sub Teste()

End Sub

Devemos inserir o procedimento entre as duas


instruções, portanto, o cursor deve estar posicionado
na linha imediatamente abaixo do nome da macro.

22
Ambiente de programação Excel
1
5. Opcionalmente, insira um comentário dentro do procedimento. Para tanto,
inicie a informação a ser comentada com um apóstrofo ('). Preferencialmente, o
comentário deve ser escrito em uma linha anterior ao código a ser comentado,
conforme o exemplo da macro Comentario1(), mostrada a seguir. No entanto,
também é possível inserir o comentário na mesma linha de um código, o qual
está exemplificado a seguir, na macro Comentario2():

Sub Comentario1()
'Teste de seleção de célula
Range("a2").select
End Sub

Sub Comentario2()
Range("a2").select 'Teste de seleção de célula
End Sub

6. Pressione a tecla TAB para criar um recuo. Isso faz com que o início e o final
do procedimento fiquem destacados e o procedimento recuado. É recomendável
criar as macros recuando as linhas que devem ser lidas como integrantes
de um mesmo bloco de instruções. Perceberemos a importância do recuo,
principalmente, na utilização de estruturas de decisões e laços – que veremos
nos próximos capítulos;

7. Digite a seguinte linha:

Range (

Depois de digitar o parêntese, poderemos visualizar uma lista de parâmetros e


argumentos do objeto, o que, de certa forma, facilita a digitação e diminui as
chances de digitarmos argumentos errados. Apenas o argumento que estiver
sendo editado no momento aparecerá em negrito, enquanto os nomes dos
demais argumentos aparecerão em itálico. Argumentos opcionais aparecem
entre colchetes []. O tipo de objeto é mostrado ao final dos nomes dos
argumentos, que, neste caso, é As Range.

23
Excel 2016 VBA - Módulo I

Quando os argumentos retornam um valor específico na sintaxe de alguns


métodos e funções, eles devem estar entre parênteses (). Porém, se o retorno
tiver que ser ignorado, deve-se excluir os parênteses. Mais adiante, esse assunto
será abordado com detalhes.
Argumentos do
comando Range

8. Digite o endereço da célula A2 entre aspas, feche o parêntese e digite um


ponto, como mostrado a seguir:

Range("A2").

Depois de digitar o ponto, poderemos visualizar uma lista exibindo, em ordem


alfabética, os métodos e propriedades do objeto. Devemos lembrar que sempre
que digitarmos um ponto depois do nome de um objeto essa lista será exibida. Os
métodos são identificados por uma figura verde à esquerda, e as propriedades,
pelo símbolo de uma mão.

9. Digite select em letras minúsculas e pressione ENTER para criar uma linha de
espaço entre a linha atual e o final da macro.

Em vez de digitar o comando, pode-se clicar na propriedade ou método


exibido na lista. Outra opção é digitar a letra inicial do comando para que,
automaticamente, seja direcionada para a opção mais próxima contida na lista.
Em seguida, basta pressionar a tecla de espaço. O comando será preenchido no
código:

Métodos e propriedades
do objeto Range

24
Ambiente de programação Excel
1
É recomendável digitar as palavras-chave em letras minúsculas,
pois, quando pressionamos a tecla ENTER e o cursor muda de
linha, a primeira letra da palavra-chave obrigatoriamente fica
maiúscula. Essa é uma forma de sabermos que digitamos a
palavra corretamente.

A macro deve estar da seguinte forma:

Sub Teste()
'Utilizando o objeto Range
Range("a2").Select
End Sub

Agora, podemos testar a macro (que tem como objetivo selecionar a célula A2)
posicionando o cursor em qualquer lugar do código entre as instruções Sub e
End Sub e pressionando a tecla F5. Então, a macro será executada e poderemos
confirmar isso ativando o Excel e constatando que a célula A2 está selecionada:

A tecla F5, sempre que pressionada, faz com que a


macro na qual o cursor está posicionado seja executada.

25
Excel 2016 VBA - Módulo I

A macro já está criada, porém, ainda podemos acrescentar mais comandos a


ela, por exemplo, para determinar o conteúdo ou valor da célula. Nesse caso,
devemos realizar os seguintes passos:

1. Posicione o cursor após a palavra Select e pressione ENTER. Uma nova linha
será criada;

2. Determine o conteúdo ou valor da célula selecionada, como a palavra


"Produto", digitando a seguinte linha:

ActiveCell.Value = "Produto"

Em que:

•• ActiveCell: Indica que a propriedade ou o método será aplicado na célula


ativa (A2);

•• Value: É a propriedade que retorna ou define o valor da célula.

A macro contextualizada em nosso exemplo está pronta para ser executada:

Sub Teste()
'Utilizando o objeto Range
Range("a2").Select
ActiveCell.Value = "Produto"
End Sub

26
Ambiente de programação Excel
1
1.3.1. Criando uma segunda macro

Crie um arquivo novo em branco na sua pasta com o nome 01 Diversas Maneiras
de Executar uma Macro.xlsm:

1. Utilize Novo Arquivo ou CTRL + O para criar um arquivo em branco;

2. Salve como 01 Diversas Maneiras de Executar uma Macro.xlsm e, na caixa


Tipo, escolha Pasta de Trabalho Habilitada para Macro do Excel:

3. Na célula A1, digite CLIENTES;

4. Acesse o Editor do Visual Basic (atalho ALT + F11) e, depois, insira um Módulo
Padrão;

5. Digite o seguinte código:

Essa macro insere o nome do cliente informado pelo usuário na célula da coluna
1 e última linha não vazia da planilha mais 1.

27
Excel 2016 VBA - Módulo I

1.4. Executando uma macro


Uma vez criada a macro, existem inúmeras maneiras de executá-la. Veja, a
seguir, algumas delas.

1.4.1. Atribuindo uma tecla de atalho

Para atribuir uma tecla de atalho à execução de uma macro, na guia


Desenvolvedor do Excel, no grupo Código, botão Macros, selecione a Macro
e clique em Opções. Ou ainda, utilize o atalho ALT + F8 e clique em Opções.
Veja a demonstração a seguir:

28
Ambiente de programação Excel
1
A partir de agora, quando este arquivo estiver aberto e você utilizar CTRL + tecla
de atalho, será executada a macro. Note que, se a tecla de atalho escolhida for
maiúscula junto ao CTRL, você deverá pressionar também o SHIFT. Vamos
testar com CTRL + K:

Outro detalhe que pode ser importante é que esse atalho sobrepõe atalhos
existentes do Windows ou do próprio Excel. Por exemplo, se atribuirmos o
atalho CTRL + C, quando este arquivo estiver aberto, em vez de copiar, que é
o comportamento padrão, o Excel executará a Macro.

29
Excel 2016 VBA - Módulo I

1.4.2. Botão Executar

O botão Executar é acessado pela guia Desenvolvedor / grupo Código /


Macros (ou ALT + F8) que abre a caixa exibida a seguir. Então, selecione a
macro e clique em Executar:

1.4.3. Botões de Controles de Formulário

1. Para inserir botões de Controles de Formulário, na guia Desenvolvedor,


grupo Controles, escolha Inserir:

30
Ambiente de programação Excel
1
Botão é o primeiro controle de formulário da primeira linha.

2. Clique no Botão e clique na planilha (em qualquer célula):

3. Selecione a macro que você quer atribuir a esse botão e clique em OK:

4. Altere o tamanho e o texto do botão e clique nele para testar:

31
Excel 2016 VBA - Módulo I

1.4.4. Imagens, formas e figuras

Na planilha, podemos inserir imagens, formas ou figuras, inclusive, ícones ou


figuras da Internet e, depois, atribuir uma macro. Veja, a seguir, mais detalhes:

1. Se optar por inserir uma forma, na terceira guia do Excel, Inserir, no segundo
grupo, que é Ilustrações, clique no terceiro botão, Formas, para escolher uma
forma. Nesse exemplo, foi escolhida a forma básica Bisel;

32
Ambiente de programação Excel
1
2. A vantagem, aqui, é que a possibilidade de formatação é maior. Faça a
formatação necessária e clique com o botão direito do mouse na opção Atribuir
Macro:

3. Atribua a macro e teste:

33
Excel 2016 VBA - Módulo I

1.4.5. Barra de Ferramentas de Acesso Rápido

É possível personalizar a Barra de Ferramentas Acesso Rápido do seu arquivo


com botões. Basta clicar com o botão direito do mouse em um dos botões da
Barra de Ferramentas de Acesso Rápido, escolher a opção Personalizar Barras
de Ferramentas de Acesso Rápido, selecionar Macros em Escolher comandos
em. Veja as imagens demonstrativas:

Em Personalizar a Barra de Ferramentas de Acesso Rápido, a caixa de


diálogo exibida na imagem anterior é aberta. No canto superior direito, há a
configuração que exibe em quais arquivos aparecerá esse botão. A opção padrão
é que o botão na Barra de Ferramentas de Acesso Rápido aparecerá em todos
os arquivos. Isso não é bom porque se este arquivo estiver fechado, mas outro
arquivo estiver aberto, o botão continuará disponível. E se o usuário clicar no
botão, o Excel vai tentar executar a macro, abrindo o arquivo que a contém. Mas
há a possibilidade de configurar para que esse botão apareça apenas quando o
arquivo que contém a macro estiver aberto.

34
Ambiente de programação Excel
1
Na parte superior da janela exibida na imagem anterior, na opção Escolher
comandos em, escolha Macros. Embaixo, escolha a macro desejada, clique
em Adicionar e, na parte inferior direita da janela, clique em Modificar para
escolher o ícone. Pronto! Veja o resultado e teste:

1.4.6. Executar uma macro no ambiente VBE

Quando estamos desenvolvendo macros, é muito comum as testarmos dentro


do próprio VBE. Para isso, basta deixar o cursor "piscando" dentro de qualquer
parte da macro e pressionar a tecla F5.

35
Excel 2016 VBA - Módulo I

Note que, para facilitar a visualização, a linha do código desta macro foi quebrada.
Para quebrar uma linha no código, no Editor do Visual Basic (VBE), com o cursor
dentro da macro, basta pressionar a tecla F5:

Isso é muito interessante para os desenvolvedores, pois permite ver o resultado


de seu código, sua programação e sua macro a partir próprio Editor do Visual
Basic.

1.4.7. A partir de outra macro


Podemos executar uma macro a partir de outra macro. Essa é uma prática muito
comum nos aplicativos. Para isso, no código, basta usar a palavra-chave Call e
o nome da macro a ser executada. Veja o exemplo adiante em que, pela macro
Vendas, executamos a macro novoCliente:

36
Ambiente de programação Excel
1
A boa prática é usar a palavra-chave Call, porém, na maioria das situações
no VBA, ela é facultativa, ou seja, se deixar somente o nome da macro a ser
executada, funcionará também. Faça o teste.

1.4.8. Auto_Open e Auto_Close

A macro com o nome Auto_Open é executada automaticamente quando o


arquivo é aberto; da mesma forma, Auto_Close é executada quando o arquivo
é fechado.

Veja o seguinte exemplo em um novo módulo, o qual testaremos abrindo e


fechando o arquivo:

37
Excel 2016 VBA - Módulo I

Vamos inserir um novo módulo, criar e testar as macros Auto_Open e Auto_


Close, abrindo e fechando o arquivo:

Acrescentamos uma variável e uma constante do escopo Private no topo do


módulo, e as duas macros com chamada automática ao abrir e ao fechar o
arquivo. Note que são exemplos ainda bem simples, porque o foco ainda não
é a macro, mas como rodá-la. Quando o arquivo for aberto, será perguntado
o nome do usuário e, ao fechar o arquivo, será exibido um MsgBox com os
dizeres: Até Breve mais o nome do usuário.

1.4.9. Botões ActiveX

Os controles ActiveX são objetos mais recentes que os controles de formulários


e super programáveis, que têm uma gama bem maior de possibilidades de
programação através da quantidade de propriedades e eventos que possuem.
Aqui, usaremos o evento Click de um Command_Button.

1. Pela guia Desenvolvedor, no grupo Controles, vá em Controles ActiveX e


escolha o primeiro controle: Botão de Comando;

2. Clique com o botão direito do mouse no Botão de Comando e escolha


Propriedades;

38
Ambiente de programação Excel
1
3. Altere a propriedade Name para cmdNovoCliente e a propriedade Caption
para NOVO CLIENTE. Name é a propriedade mais importante, pois é o nome
que será utilizado no código. Caption é o nome que o usuário visualiza;

Outras propriedades muito utilizadas são BackColor (preenchimento de fundo),


ForeColor (cor da letra), Font (características da fonte escolhida), Picture (insere
uma figura no botão) e PicturePosition (configura a posição da figura no botão).

4. Deixe o BackColor branco, no ForeColor, escolha, na paleta, o Azul Escuro.


Neste exemplo, a fonte usada é Calibri, Negrito, 12, mas fique à vontade na
escolha;

5. Escolha uma imagem na Web e, na propriedade Picture, importe essa imagem


para o botão;

6. Por último, configure a propriedade PicturePosition para a opção: 4 –


fmPicturePositionRightCenter, localizando-a no centro direito do botão:


39
Excel 2016 VBA - Módulo I

Agora, vamos programar o evento Click deste botão.

7. Aplique dois cliques com o botão esquerdo do mouse e note que, nos eventos,
o nome das macros já são definidos, portanto, a preocupação é só programar
o que acontecerá quando este evento ocorrer (o clique do usuário neste botão):

8. Chame a macro novoCliente. Para testar o controle ActiveX, na guia


Desenvolvedor, segundo botão do grupo Controles, desabilite o Modo de
Design (para programarmos, devemos estar no Modo de Design):

9. Saia do Modo de Design e acione o evento (no caso Click) no botão ActiveX:

40
Ambiente de programação Excel
1
1.4.10. Inúmeros eventos

Mais adiante, veremos que, além do Click, temos outras dezenas de eventos.
Qualquer ação de mouse ou de teclado feita pelo usuário disparará dezenas de
eventos em que se tenha programado alguma macro, que o Excel executará.
MouseMove, por exemplo, é um evento disparado quando o usuário move o
mouse.

1.4.11. Métodos OnKey e OnTime do objeto Application

Podemos configurar uma tecla ou uma combinação de teclas ou, ainda, um


horário para a execução de uma macro.

1.4.12. Application.run

O método Run do objeto Application é muito utilizado quando queremos


executar uma macro armazenada em outro arquivo. Por exemplo, Application.
Run "nomeDoArquivo.xlsm! nomeDaMacro". 

1.5. Segurança de macros
Desde o Excel 2007, os arquivos com macros devem ser salvos com a extensão
.xlsm. O padrão do Excel é .xlsx, mas com esta extensão as macros não são
salvas. Quando for salvar um arquivo novo, ou que passará a ter macros, na
guia Arquivo, em Salvar Como, na caixa Tipo, escolha a segunda opção: Pasta
de Trabalho Habilitada para Macro do Excel. Com isso, seu arquivo já passa
a ser .xlsm.

41
Excel 2016 VBA - Módulo I

Ao abrir qualquer arquivo com macros, caso este documento não esteja
configurado como confiável, o Excel exibe, por padrão, um aviso de segurança.
Ele informa que as macros foram desabilitadas e oferece a possibilidade de
habilitá-las, pelo botão Habilitar Conteúdo. Se este arquivo for de sua confiança,
clique no botão.

Quando não habilitamos o conteúdo (macros) e tentamos executar qualquer


macro do arquivo, ela não será executada pelo Excel e aparecerá o seguinte
aviso:

A solução é fechar o arquivo e, ao abri-lo novamente, habilitar as macros.


Mas só devemos habilitá-las quando o arquivo for de sua confiança, porque é
extremamente fácil para um programador desenvolver um vírus de macro.

Caso você queira tornar seu arquivo confiável, evitando aparecer o aviso para
habilitar macros, ao abrir o arquivo, na guia Desenvolvedor, grupo Código,
clique na opção Segurança de Macro:

42
Ambiente de programação Excel
1
Com isso, é exibida uma caixa de diálogo da Central de Confiabilidade, com
várias possibilidades de configuração:

Uma das configurações é a seguinte:


•• Habilitar todas as macros (não recomendado; códigos possivelmente
perigosos podem ser executados): Essa opção habilita as macros
automaticamente ao abrir o arquivo. Essa configuração torna seu computador
vulnerável a códigos potencialmente maliciosos e não é recomendada pela
Microsoft.

Note que há várias opções de configurações de segurança. As opções mais


usadas são as configurações de Macro e Locais Confiáveis:

43
Excel 2016 VBA - Módulo I

Uma vez que você habilita o arquivo como confiável, o Excel o abrirá, mesmo
com macros, sem exibir o aviso de segurança.

Note que você pode fazer com que que essa configuração seja válida também
para as subpastas, tornando-as confiáveis ao marcar a opção: As subpastas
deste local também são confiáveis.

1.6. Depurando e editando o código


Todas as macros são procedimentos. Existem três tipos de procedimentos:
Subrotinas (Sub), Funções (Function) e Propriedades (Property). Iremos focar,
por enquanto, nas Sub que seguem essa sintaxe básica:

Sub Nome_da_Macro
Instruções ou comandos ou comentários..
End Sub

Ou seja, começam com Sub e terminam com End Sub. O nome da macro não
pode ter espaços, nem começar com números ou ser uma palavra reservada do
VBA. Também não pode ser o mesmo nome de um módulo.

44
Ambiente de programação Excel
1
1.6.1. Depurando o código linha a linha de comando

Uma grande habilidade que deve ser desenvolvida é executar sua macro linha a
linha, depurar o código. A grande vantagem de executar o código linha a linha
(teclando F8) é que você vê o efeito de cada linha de código, ou seja, o resultado
que cada linha de código está gerando. Para testar, clique em qualquer parte do
código da macro e tecle F8. Surge uma seta amarela e a linha fica realçada em
amarelo. A primeira instrução é o início da macro e, na verdade, não executa
instrução alguma.

Tecle F8 e acompanhe o passo a passo da macro.

Note que, enquanto a macro está sendo executada passo a passo, o VBE exibe
[interromper]:

45
Excel 2016 VBA - Módulo I

Outra dica importante ao acabar de analisar o código linha a linha, ou terminar


de depurá-lo, é evitar permanecer no modo Interromper, ou executar até a última
linha da macro (End Sub). Com F8 continua linha a linha e com F5 executa toda
a macro de uma vez.

Ao clicar em Redefinir, o Excel sai do modo Interromper, terminando a depuração:

Outra boa dica de depuração é a possibilidade de arrastarmos a seta amarela


para a linha de comando que queremos executar. Quando, por exemplo,
temos um código bastante grande e queremos determinar uma linha de código
específica a ser executada sem a necessidade de executar as linhas anteriores,
podemos arrastar a seta amarela até a linha de código desejada. Para testar,
inicie o modo de depuração com F8.

Clique e permaneça com o botão esquerdo do mouse em cima da seta amarela


e arraste-o para a linha de código que você quer executar.

46
Ambiente de programação Excel
1
1.6.2. Ponto de interrupção (break point)

Outra maneira bastante usada para intervir na execução de uma macro é o


recurso chamado breakpoint ou ponto de interrupção. Estando com o cursor
piscando na linha em que queremos interromper ou pausar o código, podemos
colocar um ponto de interrupção das seguintes maneiras: teclando F9, ativando
o ponto de interrupção no menu Depurar ou, ainda, apenas clicando no canto
da coluna ao lado do código:

Clique no canto da coluna ao lado do código tanto para ativar quanto para
desativar um ponto de interrupção.

Isso é útil quando queremos que a macro seja executada do início até antes da
linha do ponto de interrupção. Coloque um ponto de interrupção e execute a
macro:

Note que quando chega na linha do ponto de interrupção, a macro para,


permitindo entrar no modo de depuração.

47
Excel 2016 VBA - Módulo I

1.6.3. Interropendo uma macro durante a execução

Se quisermos interromper uma macro longa durante sua execução,


pressionamos CTRL + Break ou ESC.

Sub contador()
Dim c as integer
For c = 1 to 1000
Cells(c,1).select
Cells(c,1) = c
Next c
End sub

1.7. Conceitos básicos de estruturas e sintaxe


No VBA, existem 3 tipos de procedimentos: subrotinas (Sub/End Sub), funções
personalizadas (Function/End Function) e propriedades dos objetos que
podemos criar nos módulos de classe (Property/End Property).

1.7.1. Entendendo objetos, coleções, hierarquias,


propriedades e métodos

No Excel, um objeto é algo que pode ser programado ou controlado. O Excel


tem centenas de objetos. Tudo que você pode especificar as características (cor,
nomes, valores, largura) e/ou com que pode realizar alguma ação (salvar, abrir,
fechar) são objetos; por exemplo: planilha(s), célula(s), um gráfico(s), linha(s),
coluna(s), comentário(s), pasta(s) de trabalho, etc.

Cada objeto do Excel tem um conjunto único de propriedades e métodos. Um


dos segredos da programação em VBA é manipular os objetos do Excel, através
de suas propriedades e métodos. O Excel possui dezenas, centenas, de objetos
e cada objeto possui dezenas de propriedades e métodos. Quanto maior sua
habilidade em manipular objetos, melhores resultados terá em suas macros.

O VBA apresenta diversos objetos, propriedades e métodos diferentes, de


modo que seria impossível memorizar todos eles. Na sintaxe de uma função ou
método, os argumentos vêm separados por vírgulas e são definidos de acordo
com seu nome ou posição.

48
Ambiente de programação Excel
1
Os 4 principais objetos (e que formam a hierarquia básica de objetos Excel) são:

•• Range: Célula(s); é o objeto mais utilizado. Range("A1");

•• Sheet: Planilha(s); Sheets("Plan1");

•• Workbook: Pasta(s) de trabalho ou arquivo(s); Workbooks("Vendas.xlsm").

•• Application: O Próprio Excel.

Quando representados de forma hierárquica, temos: Application.Workbook.


Sheet.Range.

Dentro do Excel (objeto Application), podemos ter vários arquivos abertos;


cada arquivo (Workbook) pode conter uma ou várias planilhas, e cada planilha
(Sheet) pode conter várias células (Range).

Gráfico, tabela dinâmica, linha, coluna, comentário são outros exemplos de


objetos.

A sintaxe básica do VBA é a seguinte:

OBJETO.PROPRIEDADE
(objeto ponto propriedade)

Ou

OBJETO.MÉTODO.
(objeto ponto método)

Do lado esquerdo do ponto, temos um objeto (exemplo 1), uma coleção


(exemplo 2) ou uma hierarquia de objetos (exemplo 3). Do lado direito do
ponto, temos a propriedade ou o método deste objeto.

•• Exemplo 1

Range("A1").Value = "Clientes"

49
Excel 2016 VBA - Módulo I

Neste exemplo, estamos interagindo com o objeto Range (Célula) A1 e


determinando sua propriedade Value (conteúdo da célula) como "Clientes".

Em programação, colocamos os textos


entre aspas duplas.

•• Exemplo 2

Cells.Clear

Neste exemplo, interagimos com a coleção Cells. Uma coleção é um objeto


(também possui propriedades e métodos) que representa todos os objetos do
mesmo tipo ou, tecnicamente falando, todos os objetos instanciados pela mesma
classe. Nesse caso, Cells representa todas as células da planilha. E utilizamos
o método Clear, que limpa o objeto, para limpar todas as células da planilha. É
muito comum, no início das macros que geram relatórios, o uso de Cells.Clear.

•• Exemplo 3

Range("A1").Font.Bold = True

Aqui, estamos usando uma hierarquia de objetos. Range("A1").Font retorna


um objeto Font, que representa a fonte do objeto especificado e determinamos
a propriedade Bold (Negrito) deste objeto.

O modelo de objetos do Excel possui centenas de objetos e milhares de


hierarquias. Uma das poucas vantagens do gravador de macros se apresenta
em casos específicos, como em uma empresa em que os administradores
queiram que dados de uma base SAP sejam gerados no Excel em Gráficos de
Dispersão. Neste caso, como em tantos outros, fica difícil saber com qual objeto,
coleção ou hierarquia devemos interagir para obter os resultados esperados
pelas macros. Ao fazer manualmente as tarefas e utilizar o gravador de macros,
podemos verificar quais objetos, coleções, hierarquias, propriedades e métodos
são utilizados. Daí o foco passa a ser adaptar o código gerado para nossa
necessidade específica por meio da depuração do código (com F8), bem como
da exclusão dos códigos extensos, e muitas vezes desnecessários, que foram
gerados, além do acréscimo de loopings e estruturas de decisões.

50
Ambiente de programação Excel
1
O VBA, como tantas outras linguagens de programação, tem a sintaxe de ponto.
Do lado direito fica a propriedade ou o método do objeto e, do lado esquerdo, fica
uma hierarquia de objetos: Sheets("Plan1").Range("A1").interior.colorindex =
3, apenas o objeto: Sheets("Plan1").name = "Estoque" ou, ainda, uma coleção:
Cells.clear. Lembrando que a coleção também é um objeto, com propriedades
e métodos próprios.

Os objetos, em geral, possuem propriedades e métodos.

•• Propriedades

Propriedades são descrições, características do objeto:

•• O valor de uma célula pode ser determinado ou obtido pela propriedade


Value do objeto Range;

•• A largura de uma coluna pode ser determinada ou obtida pela


propriedade ColumnWidth do objeto Column;

•• O nome de uma planilha pode ser determinado ou obtido pela


propriedade Name do objeto Sheets;

•• O caminho de um arquivo pode ser obtido pela propriedade Path do


objeto Workbook;

•• Podemos alterar o título Microsoft Excel da Barra de Títulos do Excel


para o nome que especificarmos, utilizando a propriedade Caption do
objeto Application.

Veja outros exemplos:

O valor de uma célula é a propriedade Value do objeto Range:

Range("A1").value = 10

O nome de uma planilha é a propriedade Name do objeto Sheet:

ActiveSheet.name = "VENDAS"

51
Excel 2016 VBA - Módulo I

O nome de um arquivo é a propriedade Name do objeto Workbook:

Msgbox ActiveWorkbook.name

A versão do Excel é a propriedade Version do objeto Application:

Msgbox Application.version

•• Métodos

Métodos são ações realizadas no objeto ou pelo objeto:

•• Limpamos uma célula com o método Clear do objeto Range;

•• Excluímos uma planilha com o método Delete do objeto Sheets;

•• Salvamos um arquivo com o método Save do objeto Workbook;

•• Saímos do Excel utilizando o método Quit do objeto Application;

•• Atualizamos uma tabela dinâmica pelo método Refresh do objeto


PivotTables;

•• Exibimos um UserForm pelo método Show do objeto UserForm.

Veja outros exemplos:

Para limpar uma célula, use o método Clear do objeto Range:

ActiveCell.Clear

Para excluir uma planilha, use o método Delete do objeto Sheet:

ActiveSheet.Delete

Para salvar um arquivo, use o método Save do objeto Workbook:

ActiveWorkbook.Save

52
Ambiente de programação Excel
1
Para sair do Excel, use o método Quit do objeto Application:

Application.Quit.

O Editor do Visual Basic tem uma série de facilidades para a criação do código
VBA. Uma delas é a lista com todas as propriedades e métodos do objeto, que
é exibida, na maioria dos casos, ao digitar o nome de um objeto (ou um nome
que referência). Em vez de "decorar" o nome de métodos/propriedades, basta
selecioná-los em uma lista.

•• Referência à célula A1, objeto Range

Os métodos (ações) do objeto Range são identificados pelo ícone verde e as


propriedades (características) pelo ícone com a "mãozinha".

•• Referenciando a célula ativa, objeto Range

53
Excel 2016 VBA - Módulo I

•• Referenciando o primeiro arquivo aberto, objeto Workbook

•• Referenciando o arquivo atual, objeto Workbook

A lista exibida é atualizada à medida que você digita o nome da propriedade ou


do método do objeto que quer programar. Quando o método ou a propriedade
estiver em negrito (selecionado/escolhido), basta pressionarmos a tecla TAB
ou espaço que o VBE escreverá o nome completo da respectiva propriedade ou
método, sem erros e mais rápido.

54
Ambiente de programação Excel
1
ActiveWorkbook.Save salva o arquivo atual. ActiveWorkbook faz referência
ao arquivo ativo (objeto) e Save é a ação de salvar (método).

Quando selecionamos um método, caso ele possua argumentos, eles serão


exibidos após um espaço:

Aqui, foi utilizado o método Copy da célula A1. Note que, após o espaço, é
mostrado o argumento deste método, ou seja, já podemos indicar para onde
copiar a célula A1. Por exemplo:

Plan1.Range("A1").Copy Plan2.Range("A1")

Essa linha de código copia o conteúdo da célula A1 da Plan1 atual para a célula
A1 da Plan2.

Quando digitamos um comando incorretamente, o VBE, por padrão, emite uma


mensagem e coloca em destaque este comando:

O código correto é:

Range("A1").Value = 10

Note que, na forma correta, usamos a sintaxe do ponto, entre o objeto e sua
propriedade. A sintaxe básica do VBA é: OBJETO.PROPRIEDADE ou OBJETO.
MÉTODO, ou seja, objeto + ponto + propriedade ou método. Em que a propriedade
é a definição de uma característica ou descrição do objeto e o método representa
uma ação realizada neste objeto ou por ele.

55
Excel 2016 VBA - Módulo I

Antes do ponto que segue a propriedade ou o método do objeto referenciado,


podemos ter uma coleção (que também é um objeto) ou uma hierarquia de
objetos:

Range("A1").Clear
Em que o objeto é Range("A1") e o método é Clear.

Cells.Clear
Em que a coleção é Cells e o método é Clear.

Sheets("Plan2").Range("A1").Clear
Em que a hierarquia é Sheets("Plan2").Range("a1") e o método é Clear.

1.8. Sistema de ajuda
Outra dica importante é a boa prática de acessar a ajuda da própria Microsoft.
Deixe o cursor piscando numa instrução VBA e pressione F1, para acessar pela
Web a ajuda da própria Microsoft.

Se a ajuda do Excel estiver instalada e você tiver acesso à Internet, terá a melhor
"apostila" de VBA Excel, com dicas e exemplos da própria Microsoft:

56
Ambiente de programação Excel
1
1.9. Pesquisador de objeto
O Pesquisador de objeto é uma ferramenta disponível no VBE que permite
localizar objetos por meio da navegação na estrutura hierárquica de objetos
da aplicação. Para acessar essa ferramenta, cuja aparência é ilustrada a seguir,
basta clicar na opção Pesquisador de objeto do menu Exibir ou pressionar a
tecla F2:

A primeira caixa, localizada na parte superior esquerda, quando clicada, exibe


uma lista com todas as bibliotecas de objetos disponíveis. Para visualizarmos
os objetos do Excel, devemos selecionar a opção Excel. Na segunda caixa,
abaixo da primeira, podemos inserir palavras-chave para buscar objetos. Para
obter mais informações sobre qualquer item pesquisado, podemos selecioná-lo
e pressionar F1.

57
Excel 2016 VBA - Módulo I

1.10. Barra de ferramentas VBE


No Editor do Visual Basic, temos a barra de ferramentas padrão, localizada
abaixo da barra de menus. Ela exibe os principais comandos do programa,
descritos na tabela a seguir:

Comando Descrição

Retorna para a janela do Excel.


(Exibir Microsoft Excel)
Insere um UserForm, um módulo, um
(Inserir UserForm) módulo de classe ou um procedimento.

Salva a pasta de trabalho.


(Salvar ...)

Recorta o texto ou o objeto selecionado,


movendo-o para a área de transferência.
(Recortar)

Copia o texto ou o objeto selecionado na


área de transferência.
(Copiar)

Cola o conteúdo da área de transferência.


(Colar)

Abre a caixa de diálogo Localizar.


(Localizar)

Desfaz o último comando executado.


(Desfazer)

Refaz o último comando desfeito.


(Refazer)

58
Ambiente de programação Excel
1
Comando Descrição
Executa o procedimento no qual o cursor
(Executar Sub/UserForm) está localizado ou o UserForm.

Pausa a execução do procedimento.


(Interromper)

Interrompe a execução da macro.


(Redefinir)

Ativa o modo de criação, no qual nenhum


(Modo de criação) evento é disparado.

Exibe a janela Project Explorer.


(Project Explorer)

Exibe a janela Propriedades.


(Janela 'Propriedades')

Exibe o Pesquisador de objeto.


(Pesquisador de Objeto)
Ativa ou desativa a exibição da caixa de
ferramentas. Este botão só é disponibilizado
(Caixa de Ferramentas) quando um UserForm é selecionado.

Abre a ajuda do VBA.


(Ajuda do Microsoft VBA)

59
Excel 2016 VBA - Módulo I

1.11. Janela Verificação imediata


Podemos utilizar a janela Verificação imediata para verificar resultados de
variáveis durante a execução de uma macro. Além disso, é possível testar
funções dentro desta janela.

No exemplo a seguir, com a utilização do comando debug.print, será enviada,


para a janela Verificação imediata, uma informação (data e horário do sistema):

Sub Exemplo()
Debug.Print Date
Debug.Print Time
End Sub

Após executarmos a macro (tecla de função F5), teremos o seguinte resultado:

Estando com o cursor posicionado dentro da janela Verificação imediata, é


possível executar o resultado de uma função. Para isso, basta utilizar o ponto
de interrogação (?) seguido da função desejada e pressionar a tecla ENTER. A
resposta ao comando aparecerá na linha inferior, conforme o exemplo seguinte:

60
Ambiente de programação Excel
1
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• O VBA é uma linguagem de programação visual orientada a objetos cujos


recursos são semelhantes aos recursos da linguagem Visual Basic;

•• As macros têm a função de otimizar rotinas, ou seja, conjuntos de tarefas


que são realizadas frequentemente;

•• O Editor do Visual Basic, ou VBE, é uma aplicação em que podemos escrever


e editar macros em VBA;

•• A janela Project Explorer exibe os projetos em uma estrutura hierárquica,


incluindo todos os seus itens e referências;

•• A hierarquia básica de objetos do Excel é Application.Workbook.Worksheet.


Range;

•• O objeto Application é o próprio aplicativo Excel;

•• O objeto Workbook é a pasta de trabalho, o arquivo Excel. A coleção de um


objeto Workbook é Workbooks, que representa o conjunto de pastas de
trabalho abertas no objeto Application;

•• O objeto Worksheet é a planilha. Em uma pasta de trabalho, pode ter uma


ou várias planilhas, ou seja, dentro de um objeto Workbook podem ter
vários Worksheets. A coleção de um objeto Worksheet é Worksheets, que
representa o conjunto de planilhas existentes em um Workbook;

•• Range refere-se a uma célula ou intervalos de células. A propriedade Cells


retorna um objeto Range. A coleção de um objeto Range é Cells, que
representa todas as células de uma planilha;

61
Excel 2016 VBA - Módulo I

•• Além desses quatro objetos básicos, temos centenas de outros objetos e


coleções, como row, rows, column, columns, comment, comments. A
coleção também é um objeto e tem métodos e propriedades. Note que
uma característica da maioria das coleções é o nome no plural;

•• Todos os objetos possuem propriedades e métodos e estão organizados


em uma hierarquia. Enquanto uma propriedade é uma característica de um
objeto, como posicionamento, cor ou tamanho, um método é qualquer ação
executada com um objeto;

•• O VBA apresenta diversos objetos, propriedades e métodos diferentes, de


modo que seria impossível memorizar todos eles. Na sintaxe de uma função
ou método, os argumentos vêm separados por vírgulas e são definidos de
acordo com seu nome ou posição;

•• Uma coleção é um objeto que reúne objetos da mesma categoria;

•• Podemos acessar o sistema de ajuda do VBA posicionando o ponto de


inserção na palavra do código sobre a qual desejamos informações e, em
seguida, pressionando a tecla F1;

•• O Pesquisador de objeto é uma ferramenta disponível no VBE que permite


localizar objetos por meio da navegação na estrutura hierárquica de objetos
da aplicação.

62
Ambiente de
1
programação Excel
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. Onde é possível escrever e editar macros?

☐☐ a) Na própria planilha.

☐☐ b) Na guia Desenvolvedor.

☐☐ c) No Visual Basic Editor (VBE).

☐☐ d) Na janela Project Explorer.

☐☐ e) Na janela Propriedades ou utilizando ALT + F4.

2. Para que serve a propriedade de um objeto?

☐☐ a) Para definir a característica de um objeto.

☐☐ b) Para executar a macro no modo Interromper.

☐☐ c) Para definir a ação de um objeto.

☐☐ d) Objetos não possuem propriedades.

☐☐ e) Para cancelar a execução de uma macro.

64
Ambiente de programação Excel
1
3. Qual das alternativas a seguir está correta?

☐☐ a) Métodos são utilizados para indicar as ações dos


objetos.

☐☐ b) Podemos indicar pontos de interrupção com a


utilização da tecla de função F1.

☐☐ c) Todos os objetos possuem propriedades e métodos e


estão organizados em uma hierarquia.

☐☐ d) O atalho CTRL + F11 ativa a janela do VBE.

☐☐ e) Alternativas A e B estão corretas.

4. Qual das alternativas a seguir refere-se ao local em que


são exibidos os projetos carregados, em uma estrutura
hierárquica, incluindo todos os seus itens e referências?

☐☐ a) Janela Propriedades

☐☐ b) Guia Desenvolvedor

☐☐ c) Janela Verificação imediata

☐☐ d) Barra de ferramentas

☐☐ e) Janela Project Explorer

65
Excel 2016 VBA - Módulo I

5. Qual das alternativas a seguir está incorreta?

☐☐ a) O atalho CTRL + R exibe a janela Project Explorer.

☐☐ b) Na guia Desenvolvedor, encontramos opções para


gravação de macros e acesso ao VBE.

☐☐ c) As macros têm a função de otimizar rotinas e tarefas que


são realizadas frequentemente.

☐☐ d) A linguagem VBA não é considerada uma linguagem de


programação.

☐☐ e) Ao pressionar a tecla F1, temos acesso à ajuda do VBA.

66
Ambiente de
1
programação Excel
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Conhecendo o Visual Basic Editor e seus componentes

1. Acesse o editor VBE;

2. Caso estejam abertas, feche as seguintes janelas:

•• Project Explorer;

•• Verificação imediata;

•• Propriedades.

3. Deixe as janelas Propriedades e Project Explorer visíveis.

68
Principais objetos,
2
propriedades e
métodos
99 Objeto Range - Célula(s);
99 Objeto Worksheet - Planilha(s);
99 Objeto Workbook - Arquivo(s);
99 Objeto Application - O próprio Excel.
Excel 2016 VBA - Módulo I

2.1. Introdução
No Excel, temos milhares de objetos. Um dos poderes do VBA é manipular
esses objetos através de suas propriedades (características) e métodos (ações).
Porém, é de fundamental importância saber fazer referência, ou seja, indicar ao
VBA com qual objeto você quer interagir.

Aqui, vamos ver os principais objetos do VBA, bem como suas principais
propriedades e métodos e as formas de referenciar estes objetos.

2.2. Objeto Range - Célula(s)


A seguir, veremos as diferentes maneiras de fazer referência ao objeto Range,
quais são suas principais propriedades e seus principais métodos, além da
coleção Cells.

2.2.1. Fazendo referência

Inúmeras aplicações em VBA Excel acessam e/ou modificam valores de células


de uma planilha. As maneiras mais comuns para acessar uma célula são através
do objeto Range e de diversas propriedades que retornam um objeto Range,
como Cells, ActiveCell, CurrentRegion, Offset e End.

Vamos fazer uma referência:

1. Feche todos arquivos;

2. Crie um arquivo novo;

3. Habilite para macro;

4. Salve como Objeto Range:

70
Principais objetos, propriedades e métodos
2
5. Insira um módulo;

6. Nomeie a propriedade Name deste módulo como Fazendo_Referência:

7. Nesse módulo, digite Sub F_01 e tecle ENTER:

Observe que os parênteses e o End Sub o VBE coloca automaticamente.

8. Insira o código:

9. Deixe o cursor posicionado dentro da macro e a execute com F5 ou F8.

Note que os dois pontos (:), assim como nas


fórmulas do Excel, quer dizer "até".

71
Excel 2016 VBA - Módulo I

2.2.1.1. Fazendo referência pelo número de índice

Também podemos fazer referências utilizando o número de índice. Para fazer


referência ao objeto Range pelo número de índice, usamos a propriedade Cells
do objeto Application, que retorna um objeto Range. A forma padrão de usar
Cells é informando o número da linha e o número da coluna da célula com a
qual queremos interagir, separados por vírgula e entre parênteses.

Como veremos adiante, a propriedade NumberFormat = "$ #,##0.00" especifica


o formato da moeda padrão local (conforme configuração do Windows).

2.2.1.2. Fazendo referência pelo nome da célula

Também podemos referenciar um objeto Range pelo nome da célula, abreviado


e entre colchetes.

A propriedade Value é a propriedade padrão do objeto Range. Quando não a


especificamos, o VBA subentende. Veja os exemplos a seguir:

•• Range("A1").Value = "Clientes" é o mesmo que Range("A1") = "Clientes";

•• Cells(1,1).Value = "Clientes" é o mesmo que Cells(1,1) = "Clientes";

72
Principais objetos, propriedades e métodos
2
•• [A1].Value = "Clientes" é o mesmo que [A1] = "Clientes";

•• Range("a1").end(xldown).offset(1,0).Value = "José" é o mesmo que


Range("a1").end(xldown).offset(1,0) = "José".

Logo, na prática, é muito comum não utilizar a propriedade Value, pois, em


pouquíssimos casos, ela é realmente necessária.

2.2.1.3. Utilizando a propriedade ActiveCell

Também podemos utilizar a propriedade ActiveCell que retorna um objeto


Range que é a célula ativa. A propriedade Offset desloca um número de linhas
e colunas a partir da célula ativa.  

Neste exemplo, começamos selecionando a última célula da coluna A.

Range("A1").End(xlDown).Row equivale a você estar com a célula A1 selecionada


e utilizar CTRL + seta para baixo.

Toda vez que quisermos encontrar a última célula preenchida (antes de uma
célula em branco) em uma tabela, podemos selecionar a primeira célula e utilizar
CTRL + seta pra baixo, que a célula ativa passará a ser a última preenchida. Esta
é a propriedade End do objeto Range.

•• End(xldown) equivale a CTRL + seta para baixo e faz referência à última


célula antes da primeira em branco, no sentido de cima para baixo;

•• End(xlup) equivale a CTRL + seta para cima e faz referência à última célula
antes da primeira em branco, no sentido de baixo para cima;

73
Excel 2016 VBA - Módulo I

•• End(xltoRight) equivale a CTRL + seta para direita e faz referência à última


célula antes da primeira em branco, no sentido da esquerda para direita;

•• End(xltoLeft) equivale a CTRL + seta para esquerda e faz referência à última


célula antes da primeira em branco, no sentido da direita para esquerda.

Por enquanto, usaremos End(xlDown) por ser mais simples, porém, em breve,
usaremos End(xlUp) que é mais profissional.

Usamos a função do VBA InputBox para deixar o exemplo mais dinâmico. Ela
permite ao usuário entrar com um dado.

Também podemos pedir para guardar, na variável linha, o número da última


linha + 1, ou seja, o número da primeira linha em branco; inserir, na célula
linha, coluna 1, o Cliente e, na célula linha, coluna 2, o valor dele. Os dois
códigos têm o mesmo resultado:

Veja outros exemplos de referências ao objeto Range:

•• Range("C5:D9,G9:H16") faz referência à uma área múltipla: da célula C5 a


D9 e da G9 a H16;

•• Range("A:A") faz referência a toda coluna A;

•• Range("1:1") faz referência a toda linha 1;

•• Range("A:C") faz a referência da coluna A a coluna C inteira;

74
Principais objetos, propriedades e métodos
2
•• Range("1:5") faz a referência da linha 1 a linha 5 inteira;

•• Range("1:1,3:3,8:8") faz referência às linhas 1, 3 e 8 completas;

•• Range("A:A, C:C, F:F") faz referência às colunas A, C e F.

2.2.1.4. Configurando o objeto Range como uma variável

Outra maneira de fazer referência a um objeto Range é configurando-o como


uma variável. Para esse exemplo, insira uma planilha nova ou comece o código
com Sheets.Add:

2.2.2. Principais propriedades

Vamos ver, agora, as principais propriedades do objeto Range, lembrando que


elas são características ou descrições do objeto.

2.2.2.1. Value

A propriedade mais utilizada do objeto Range é Value, que representa o


conteúdo/valor da célula.

75
Excel 2016 VBA - Módulo I

Crie uma planilha nova, em branco, com o nome Objeto Range 02.xlsm e
digite os seguintes dados na linha 1 e 2. No VBE, insira um módulo com o nome
Principais_Propriedades e o seguinte código:

Caso o programador não coloque a propriedade ou um método em um objeto


Range, o Excel considera como propriedade Value, que é a propriedade padrão
e a mais utilizada deste objeto.

Normalmente, os programadores não colocam a propriedade Value, escrevem


apenas o nome do objeto e o Excel entende que é esta propriedade.

2.2.2.2. Font

Veja as propriedades da hierarquia do objeto Font:

76
Principais objetos, propriedades e métodos
2
No VBA, toda vez que repetirmos uma hierarquia de objetos no código em
nossas macros, podemos abreviá-la com uso do bloco With / End With:

2.2.2.3. Uso do With / End With

Para cada propriedade que definimos no Excel, é necessário referenciar o


objeto ao qual ela será aplicada, mesmo quando o objeto for igual para diversas
propriedades. O exemplo a seguir deixa clara a necessidade que existe de
referenciar o objeto para cada uma das propriedades. Para a mesma célula,
vamos definir um valor, aplicar uma cor à fonte, determinar que o valor desta
célula é apresentado em duas casas decimais, aplicar à fonte o estilo negrito e
aplicar ao fundo uma outra cor:

Sub Formatar()
Range("A1").Value = 24.3
Range("A1").Font.ColorIndex = 4
Range("A1").NumberFormat = "0.00"
Range("A1").Font.Bold = True
Range("A1").Interior.ColorIndex = 6
End Sub

77
Excel 2016 VBA - Módulo I

Para evitar a repetição do mesmo objeto em casos como o que acabamos de


verificar, ou seja, casos em que diversas propriedades são aplicadas a um mesmo
objeto, podemos usar a estrutura With e End With. O objeto referenciado quando
empregamos essa instrução deve ser colocado logo após a própria instrução. A
sintaxe da estrutura End e End With é a seguinte:

With Objeto
Instruções
End With

Quando formos digitar as instruções, devemos sempre lembrar que o nome do


objeto não deve ser citado e que deve haver um ponto antes de cada uma das
propriedades. Todas as instruções que digitarmos entre With e End With serão
realizadas no dado objeto.

A seguir, temos o código que aplica algumas propriedades a uma célula por
meio da instrução With:

Sub Formatar()
With Range("A1")
.Value = 24.3
.Font.ColorIndex = 4
.NumberFormat = "0.00"
.Font.Bold = True
.Interior.ColorIndex = 6
End With
End Sub

Devemos sempre nos lembrar de que é necessário


digitar um ponto antes de cada propriedade. Apesar
de a propriedade Value ser uma propriedade padrão,
não precisando digitá-la na maioria das vezes, deve-se
digitá-la dentro da instrução With quando for desejado
atribuir um valor em uma célula.

78
Principais objetos, propriedades e métodos
2
A instrução With pode também ser usada em conjunto com outras instruções
With se inserirmos uma dentro da outra, fazendo um processo de aninhamento:

Sub AlterarPlan()
With Sheets("Planilha3")
With Range("A5")
.Value = 7
.Font.Bold = True
.Font.ColorIndex = numero_da_cor
End With
.Name = "Cadastro"
.Move Before:=Sheets("Plan1")
.Visible = True
End With
End Sub

Também podemos inserir outro With para a fonte aninhando dois With ao
primeiro.

Devemos sempre levar em consideração a


importância de recuar as linhas, deixando a
primeira e a última linha de cada bloco na mesma
posição a partir do lado esquerdo.

Para especificarmos a propriedade ou o método desta hierarquia que está


abreviada, temos que começar a instrução com ponto (.). Ele indica a continuidade
da hierarquia abreviada, na qual não precisamos repetir certas estruturas.

79
Excel 2016 VBA - Módulo I

2.2.2.4. End

Outra propriedade é End, muito utilizada para identificar a última linha ou


mesmo selecionar a última linha de uma tabela. Como já vimos, é equivalente a
utilizar CTRL + seta pra baixo:

Note que quando usamos o End(xldown), caso haja "buracos", linhas em


branco no meio da planilha, não será possível ir até a última linha, pois isso será
interrompido no primeiro espaço em branco. Em breve, utilizares End(xlup).

2.2.2.5. Offset

A propriedade Offset desloca um número de linhas e um número de colunas a


partir de uma célula:

80
Principais objetos, propriedades e métodos
2
Note que existem várias maneiras de escrever a mesma macro. Aqui, a P_08 e
a P_09 têm o mesmo efeito, mas foram escritas de formas bem diferentes.

2.2.2.6. ColorIndex

Outra propriedade também muito utilizada é a propriedade Interior.


Colorindex, que representa as cores de preenchimento, disponíveis no balde
de preenchimento, que vai até a ColorIndex número 56.

Para ver as cores de ColorIndex 1 a 56, utilizaremos a estrutura de repetição


For / Next para deixar a nossa macro mais dinâmica:

81
Excel 2016 VBA - Módulo I

Como ainda não abordamos as variáveis, neste caso, a variável Ncor não está
declarada com Dim. Como o VBA a declarou como Variant, no topo do módulo
não pode estar escrito Option Explicit. Se tiver, apague.

Neste exemplo, criamos um laço com estrutura de repetição For / Next em que
a variável Ncor começa em 1 e repete até chegar a 56.

Ainda não vimos as variáveis nem os loops, porém,


uma vez ou outra, os utilizaremos para deixar o
código mais dinâmico.

Utilizamos também o Sheets.Add para adicionar uma nova planilha.

Outro comando que utilizaremos muito em nossas macros é o Columns.AutoFit.


Columns é a coleção de colunas, ou seja, todas as colunas da planilha (Sheet).
Auto Fit é um método do autoajuste da largura.

Isso é interessante inserir no final das macros. Assim, o usuário não precisa
utilizar os dois clicks para fazer o autoajuste da largura das colunas a fim de
visualizá-las melhor, afinal, a macro já faz isso.

Para os programadores acostumados a usar o padrão de cor RGB, no lugar da


propriedade ColorIndex, basta usar a propriedade .Color = RGB(255,0,0), por
exemplo:

82
Principais objetos, propriedades e métodos
2
2.2.2.7. NumberFormat

Outra propriedade útil é a NumberFormat, que permite formatar a(s) célula(s)


de acordo com um formato numérico. Utilizaremos muito o formato de moeda:

Activecell.NumberFormat= "$ #,##0.00"

Aqui, temos a célula ativa com o formato de moeda.

2.2.2.8. CurrentRegion

A propriedade CurrentRegion faz referência à toda a tabela:

Range("A1").CurrentRegion.Font.Bold = True

Aqui, teremos toda a tabela, que começa na célula A1, em negrito.

Logo, toda vez que quisermos fazer referência à tabela inteira, e não houver
nenhuma linha ou coluna em branco, podemos usar CurrentRegion e, então,
usamos a propriedade ou o método específico.

É uma boa prática nomearmos a tabela com a propriedade Name:

Range("A1").CurrentRegion.Name = "Clientes"

Outras propriedades do objeto Range que são menos utilizadas, mas também
importantes, são apresentadas adiante.

2.2.2.9. Address, Column, Row

As propriedades Address, Column e Row retornam o endereço da célula, o


número da coluna e o número da linha, respectivamente.

83
Excel 2016 VBA - Módulo I

2.2.2.10. Borders

A propriedade Borders define as bordas das células. Aqui, teremos toda a


tabela com bordas padrão, pretas:

Range("a1").CurrentRegion.Borders.ColorIndex = xlAutomatic

Já aqui, as bordas estarão na cor 8:

Range("a1").CurrentRegion.Borders.ColorIndex = 8

Podemos acessar um rico material de exemplos práticos ao


deixarmos o cursor posicionado em qualquer uma dessas
propriedades e pressionarmos a tecla F1, acessando a Ajuda
da própria Microsoft na Internet.

2.2.3. Principais métodos

Vamos, agora, abordar alguns dos métodos mais utilizados do objeto Range,
lembrando que métodos são ações realizadas no objeto ou por ele.

2.2.3.1. Select

O primeiro método mais utilizado é o Select, que seleciona uma célula:

Range("A10").Select

2.2.3.2. Clear

Este método equivale ao comando Limpar / Limpar tudo, ou seja, ele serve
para limpar tudo o que há nas células. O exemplo a seguir limpa todos os
elementos das células presentes no intervalo B2:B20:

Range("B2:B20").Clear

84
Principais objetos, propriedades e métodos
2
2.2.3.3. ClearContents

Este método limpa apenas o conteúdo da célula, mantendo as demais


propriedades. É equivalente a selecionar a célula e pressionar DELETE. O exemplo
a seguir limpa o conteúdo das células presentes no intervalo B2:B20:

Range("B2:B20").ClearContents

2.2.3.4. ClearFormats

Este método limpa apenas a formatação da célula, mantendo o seu conteúdo. O


exemplo a seguir limpa apenas a formatação das células contidas no intervalo
C2:C4:

Range("c2:c4").ClearFormats

2.2.3.5. Delete

Este método é usado para excluir células da planilha. Na sua sintaxe, mostrada a
seguir, o argumento Shift não é obrigatório e serve para definir o local para onde
serão deslocadas as células; se para a esquerda, devemos usar xlShiftToLeft,
se para cima, xlShiftUp:

Delete(Shift)

O exemplo a seguir exclui as células contidas no intervalo, deslocando as demais


células para a esquerda:

Range("c2:c4").Delete xlToLeft

85
Excel 2016 VBA - Módulo I

2.2.3.6. Insert

Este método insere células na planilha. Na sua sintaxe, mostrada a seguir, o


argumento Shift não é obrigatório e serve para indicar o local para onde serão
deslocadas as células; se para a direita, devemos usar xlShiftToRight, se para
baixo, XlShiftDown:

Insert(Shift)

O exemplo a seguir insere as células contidas no intervalo, deslocando as demais


células para baixo:

Range("c2:c6").Insert xldown

2.2.3.7. Speak

O método Speak fala, em inglês, o conteúdo da célula.

Até este ponto, já pudemos conhecer algumas propriedades e métodos de


alguns objetos. Novos objetos, métodos e propriedades serão abordados ao
longo da apostila.

2.2.4. Coleção Cells

Coleção é um objeto que tem propriedades e métodos e que representa todos


os objetos de um mesmo tipo ou, tecnicamente falando, instanciados na mesma
Classe.

A coleção do objeto Range é Cells. Cells, portanto, é uma coleção que representa
todas as células de uma planilha (Sheet).

É muito comum o início das macros que geram relatórios ser este:

Cells.Clear

Esta linha de código limpa todas as células da planilha.

86
Principais objetos, propriedades e métodos
2
2.3. Objeto Worksheet - Planilha(s)
Os Worksheets representam as planilhas de um arquivo. Chamamos de coleção
de Worksheets o conjunto de planilhas de uma pasta de trabalho. Cada uma
das planilhas é um objeto da coleção. Em alguns casos, os objetos são também
chamados de Sheets.

1. Crie um Arquivo Novo, em branco, com o nome 02 Objeto Sheet, e habilite


para macro;

2. Insira um módulo e digite, na propriedade Name deste módulo, Fazendo_


Referência;

3. Comece inserindo 10 planilhas no arquivo:

Sub F_01
Dim c as Byte
For c = 1 to 10
Sheets.Add
Next c
End Sub

2.3.1. Fazendo referência

Existem 4 maneiras mais utilizadas para fazer referência à uma planilha:

•• Pelo nome (da aba da planilha);

•• Pela posição;

•• Pelo nome do VBA;

•• ActiveSheet.

87
Excel 2016 VBA - Módulo I

2.3.1.1. Fazendo referência à planilha pelo nome (da aba


da planilha)
Sub F_02
Sheets("Plan7").Select
End Sub

Note que é preciso existir uma planilha com esse nome, caso contrário, será
retornado um erro: Subscrito fora do intervalo, indicando que o Excel não
encontrou o objeto:

Este é um dos erros mais frequentes do VBA.

Caso este erro tenha sido gerado, confira sempre o objeto referenciado. Neste
exemplo, o objeto é sheets("Plan7"). Logo, tem que existir uma planilha no seu
arquivo com o nome Plan7, caso contrário, o erro é exibido.

Para consertar, crie uma planilha com este nome ou corrija o código, inserindo
o nome de uma planilha existente.

2.3.1.2. Fazendo referência à planilha pelo número de


índice

Quase todos os objetos do VBA podem ser referenciadoa pelo nome, usando
aspas, ou pelo número de índice.

Quando fazemos referência pelo número (da planilha), será considerada a


posição da esquerda para a direita.

88
Principais objetos, propriedades e métodos
2
Aqui, neste exemplo, será selecionada a segunda planilha da esquerda para a
direita.

Sub F_03
Sheets(2).Select
End Sub

Se só existir uma planilha neste arquivo, será retornado o erro Subscrito fora
do Intervalo, indicando que o Excel não encontrou esse objeto.

2.3.1.3. Usando o nome do VBA

Nomeie uma planilha como Estoque e outra como Balanço Contábil. Observe
que, na janela do Projeto – VBAProject, existem 2 nomes para a mesma planilha:

O nome que está do lado direito, entre parênteses, é o nome visualizado pelo
usuário na aba da planilha e referenciado por Sheets("Nome_da_Planilha"),
como já visto.

Porém, podemos fazer a referência pelo nome que está no lado esquerdo, que
é o nome interno do VBA. Neste caso, não usamos Sheets com aspas duplas,
mas apenas o nome que está do lado esquerdo, seguido de ponto (.):

Plan11.Range("A1") = "Estoque"

Neste exemplo (adapte seu código para o nome que está do lado esquerdo e
direito), a Plan11 é referenciada pelo nome do VBA (que é o do lado esquerdo)
e o texto Estoque é inserido na célula A1.

89
Excel 2016 VBA - Módulo I

2.3.1.4. ActiveSheet

ActiveSheet faz referência à planilha ativa. É muito comum quando inserimos


uma planilha nova no arquivo (ela fica selecionada) e a nomeamos:

Sheets.Add
ActiveSheet.name = "VENDAS CONSOLIDADAS"

2.3.2. Principais propriedades

Veja, a seguir, as principais propriedades da planilha.

2.3.2.1. Name

A propriedade Name é o nome da aba da planilha:

Sub P_01()
ActiveSheet.Name = "COMPRAS"
End Sub

2.3.2.2. Visible

A propriedade Visible determina se a planilha está visível ou não.

Tanto o Visible False quanto o xlVeryHidden ocultam a planilha, a diferença é


que as planilhas ocultadas com xlVeryHidden só poderão ser reexibidas pelo
VBA, enquanto que as ocultas com False podem ser reexibidas manualmente,
quando o usuário clicar com o botão direito do mouse no nome da planilha e
na opção Reexibir.

Neste exemplo, vamos ocultar a planilha com False e, em seguida, exibi-la


manualmente.

Sub P_02()
Sheets("Mês 1").Visible=False
End Sub

90
Principais objetos, propriedades e métodos
2
Ao reexibir, a seguinte janela será aberta:

•• Agora, reexiba e oculte com XlVeryHidden:

Sub P_03()
Sheets("Mês 1").Visible=xlVeryHidden
End Sub

Tente reexibir manualmente:

Note que a opção Reexibir não ficou disponível. Isso ocorreu porque uma vez
que foi ocultado com XlVeryHidden, só poderá ser reexibido pelo código VBA:

Sub P_04()
Sheets("Mês 1").Visible=True
End Sub

91
Excel 2016 VBA - Módulo I

2.3.2.3. ScrollArea

ScrollArea é outra propriedade interessante pois delimita o acesso a cliques do


usuário nas células da planilha.

ActiveSheet.ScrollArea = "A1:C3"

Por meio desta propriedade podemos estipular os limites de rolagem pela


planilha, pois sua função é retornar ou definir a área de rolagem.

2.3.3. Principais métodos

Agora, veremos os principais métodos da planilha.

2.3.3.1. Select

O método mais utilizado é o Select, que seleciona a planilha:

Sheets(1).Select

2.3.3.2. Delete

O métoto Delete exclui a planilha. Porém, quando tentamos excluir a planilha


manualmente, o Excel antes pergunta se o usuário deseja continuar, oferecendo
a possibilidade de o usuário cancelar a exclusão:

92
Principais objetos, propriedades e métodos
2
No VBA, o Excel mantém o mesmo comportamento, exibindo esta pergunta.
Então, quando tivermos uma macro que exclui a planilha, podemos alterar a
propriedade do objeto Application que configura este comportamento para
False:

Ao terminar a macro, a propriedade DisplayAlerts do objeto Application volta


automaticamente a ser True.

2.3.3.3. Protect / Unprotect

Protect protege a planilha e Unprotect a desprotege:

93
Excel 2016 VBA - Módulo I

Na macro M_04, a planilha está sendo protegida com a senha "123" e, na


M_05, a planilha está sendo desprotegida. Note que a senha deve ser informada
também ao desproteger.

Na M_06, exibimos uma situação muito comum, em que a planilha estará


sempre protegida, mas permitirá, através desta macro, a inserção de dados na
última linha + 1 das colunas 1 e 2 da planilha.

Para proteger o código para visualização, basta ir no menu Ferramentas do


VBA e em Opções / Propriedades:

2.3.3.4. Copy

Este método copia uma planilha para outra posição no arquivo. A sintaxe deste
método é:

Copy(After,Before)

O exemplo adiante faz uma cópia da plan2 para uma posição após a plan3:

Sheets(“plan2”).Copy , Sheets(“plan3”)

94
Principais objetos, propriedades e métodos
2
2.3.3.5. Move

Este método move a planilha para outra posição no arquivo. Sua sintaxe é a
seguinte:

Move(Before,After)

O exemplo adiante move a planilha Plan1 para a última posição na pasta de


trabalho:

Sheets(“Plan1”).Move , Sheets(Sheets.Count)

2.3.4. Coleção Sheets

A coleção Sheets é o objeto que representa todas as planilhas.

Por meio deste método, podemos adicionar, à pasta de trabalho, folhas de


planilha, macros do Excel 4.0 ou gráficos. Sua sintaxe é exibida adiante e, em
seguida, está a descrição de cada um de seus elementos:

Add(Before,After,Count,Type)

Em que:

•• Before: Planilha antes da qual será inserida a nova;

•• After: Planilha após a qual será inserida a nova;

•• Count: Quantidade de planilhas que serão inseridas;

•• Type: Tipo da planilha que será inserida. Podemos usar o tipo xlWorkSheet,
que corresponde à planilha padrão, ou xlExcel4MacroSheet, que
corresponde à folha de macro do Excel 4.0.

95
Excel 2016 VBA - Módulo I

Veja o exemplo para inserir uma planilha após a última planilha da pasta de
trabalho:

Sheets.Add , Sheets(Sheets.Count)

É muito comum utilizar esta coleção para adicionar uma planilha, ou seja, um
elemento à coleção, e para contar quantas planilhas têm em um arquivo:

Sheets.Add
MsgBox "Neste Arquivo temos: " & Sheets.Count & " Planilhas!!!"

Note que, quando adicionamos planilha no arquivo, a planilha é adicionada no


lado esquerdo da planilha que está selecionada. Para que a adição seja feita
depois da última planilha, podemos utilizar o argumento after (depois da última
planilha). Lembrando que o número (a posição) da última planilha é sempre
sheets.count.

Assim, podemos melhorar o código anterior:

Sheets.Add after:=sheets(sheets.count)
MsgBox "Neste Arquivo temos: " & Sheets.Count & " Planilhas!!!"

Agora, considere o seguinte exemplo:

Msgbox "O arquivo possui " & sheets.count & " planilha(s)"

96
Principais objetos, propriedades e métodos
2
2.4. Objeto Workbook - Arquivo(s)
Workbooks são os objetos correspondentes às pastas de trabalho, ou seja, aos
arquivos.

2.4.1. Fazendo referência

Crie um arquivo em branco, habilite para macro e salve com o nome 03 Objeto
Workbook.

Vamos fazer uma macro que adicionará um arquivo em branco. Para isso, digite
o seguinte código:

Sub M_01
Workbooks.Add
End Sub

2.4.1.1. Fazendo referência pelo nome do arquivo

Para fazer referência pelo nome, coloque o nome da coleção (Workbooks) e,


entre parênteses, especifique o elemento da coleção que você deseja referenciar.
Como faremos pelo nome, use aspas duplas:

Sub M_02
Workbooks("03 Objeto Workbook").Activate
End Sub

97
Excel 2016 VBA - Módulo I

2.4.1.2. Fazendo referência pelo número de índice

Quando fazemos referência ao arquivo pelo número, o Excel considera a ordem


de abertura:

Sub M_03()
Workbooks(2).Activate
End Sub

2.4.1.3. Fazendo referência por ActiveWorkbook e


ThisWorkbook

ActiveWorkbook faz referência ao arquivo ativo. Se tenho vários arquivos abertos


e a seguinte linha de código, será exibido o nome do arquivo selecionado:

MsgBox ActiveWorkbook.Name

Já ThisWorkbook faz referência ao arquivo em que está escrita a macro.


Independente do arquivo selecionado, será exibido para o código adiante, o
nome do arquivo que contém a macro:

MsgBox ThisWorkbook.Name.

2.4.2. Principais propriedades

A seguir, serão listadas algumas propriedades do objeto Workbook.

98
Principais objetos, propriedades e métodos
2
2.4.2.1. Name, Path e FullName

Escreva e execute esta macro e, então, confira o conteúdo das células A1, A2 e
A3:

2.4.2.2. Save

Para os arquivos que estão salvos, esta propriedade retorna o valor True; para
os arquivos que não foram salvos, retorna o valor False.

2.4.3. Principais métodos

Alguns dos métodos para o objeto Workbook são os seguintes:

2.4.3.1. Close

Este método fecha o arquivo. Adiante, temos a representação de sua sintaxe e,


em seguida, a descrição de cada um de seus elementos:

Close(SaveChanges,FileName,RouteWorkbooks)

99
Excel 2016 VBA - Módulo I

Em que:

•• SaveChanges: Determina se o arquivo deve ou não ser salvo, portanto,


pode ser definida como True ou False;

•• FileName: É o nome do arquivo;

•• RouteWorkbooks: Determina se o arquivo deve ser encaminhado ou não a


um destinatário de circulação.

ActiveWorkbook.Close SaveChanges:=True

2.4.3.2. Open

Devemos usar este método para abrir um arquivo. A seguir, temos a representação
de sua sintaxe:

Workbooks.Open FileName:="Caminho do arquivo"

O exemplo a seguir traz a linha de código que abre um arquivo:

Workbooks.Open Filename:="C:\documentos\RelMensal.xlsx"

2.4.3.3. Save

Este método salva o arquivo. A seguir, temos a representação de sua sintaxe:

Workbooks(<nome do arquivo>).Save

O exemplo a seguir traz a linha de código que salva um arquivo:

Workbooks("RelMensal.xlsx").Save

100
Principais objetos, propriedades e métodos
2
2.4.3.4. Protect

Este método é utilizado para proteger a pasta de trabalho e é equivalente a


ativar, na guia Revisão, o botão Proteger Pasta de Trabalho. A sintaxe para
esse método é a seguinte:

Protect(Password,Structure,Windows)

Veja um exemplo de utilização:

Workbooks("teste1.xlsx").Protect "123Senha", True, True

Nesse exemplo, será protegida a estrutura da pasta e da janela da pasta teste1.


xlsx com a senha 123Senha.

2.4.3.5. Unprotect

Este método tira a proteção da pasta de trabalho. Sua sintaxe é a seguinte:

Unprotect(Password)

Veja o exemplo de utilização:

Workbooks("teste1.xlsx").Unprotect "123Senha"

2.5. Objeto Application – O próprio Excel

2.5.1. Principais propriedades
Algumas das propriedades do objeto Application são as seguintes:

101
Excel 2016 VBA - Módulo I

2.5.1.1. Caption

Esta propriedade retorna ou define o texto da barra de títulos do Excel.

Podemos definir a barra de títulos com um texto de nossa escolha, por exemplo,
Orçamentos. Então, devemos usar o seguinte código:

Application.Caption = "Orçamentos"

Podemos fazer a barra de títulos exibir o texto original novamente, definindo


para essa propriedade o valor Empty. Nesse caso, usaríamos o seguinte código:

Application.Caption = Empty

Podemos capturar o texto da barra de títulos do Excel usando o seguinte código:

Application.Caption

Segue exemplo que exibe o conteúdo da barra de títulos em uma caixa de


mensagem:

Sub titulo()
MsgBox Application.Caption
End Sub

Veja o resultado:

102
Principais objetos, propriedades e métodos
2
Outra maneira é a seguinte:

Em que Application.Caption = "" é o mesmo que Application.Caption = Empty.

2.5.1.2. ActiveWindow

Esta propriedade retorna ou define o nome da janela ativa.

O exemplo a seguir altera o nome da janela ativa para Mês de Fevereiro:

Application.ActiveWindow.Caption = "Mês de Fevereiro"

Como não é necessário digitar o termo Application, o código pode ser utilizado
da seguinte forma:

ActiveWindow.Caption = "Mês de Fevereiro"

2.5.1.3. ScreenUpdating

É uma propriedade do aplicativo Excel que permite determinar a atualização da


tela, como True (opção padrão) ou False, no momento em que uma macro está
sendo executada. Se usarmos False, a execução da macro se torna mais rápida,
pois não é exibido o movimento de execução.

103
Excel 2016 VBA - Módulo I

O exemplo a seguir define esta propriedade como False:

Application.ScreenUpdating = False

Execute este código com e sem a linha do ScreenUpdating e veja a diferença:

Aqui, t3 é a duração de tempo que a macro levou para ser executada até o fim.
Note que com o ScreenUptading e sem o tempo é diferente.

2.5.1.4. DisplayAlerts

Com esta propriedade, podemos permitir ou não a exibição de mensagens de


alerta durante a execução de uma macro. Portanto, devemos defini-la como
True ou False.

Por padrão, essa propriedade é definida como True. Se, por exemplo, não
quisermos que apareça o alerta perguntando se desejamos salvar alterações
quando uma pasta de trabalho é fechada por uma macro, devemos definir essa
propriedade como False, como mostra a linha a seguir:

Application.DisplayAlerts = False

104
Principais objetos, propriedades e métodos
2
Execute este código com e sem a linha do DisplayAlerts e veja a diferença:

2.5.1.5. EnableCancelKey

Esta propriedade autoriza ou não a interrupção da execução de uma macro por


meio das teclas do teclado ESC ou CTRL + BREAK.

Podemos definir essa propriedade com um dos tipos a seguir:

•• xlInterrupt: Definido como padrão, permite o cancelamento da macro pelo


teclado;

•• xlDisabled: Não permite o cancelamento;

•• xlErrorHandler: A interrupção é enviada para um procedimento em


execução, como um erro, podendo ser tratada com a utilização de comandos
de tratamento de erros.

Devemos digitar a linha a seguir quando não queremos permitir a interrupção


da macro:

Application.EnableCancelKey = xlDisabled

105
Excel 2016 VBA - Módulo I

2.5.1.6. DataEntryMode

Esta propriedade possibilita definir o modo de entrada de dados. Para isso,


devem-se considerar as seguintes informações:

•• xlOff: Permite que qualquer célula seja selecionada;

•• xlOn: Permite a seleção de uma célula depois de pressionada a tecla ESC;

•• xlStrict: Impede a seleção de uma célula mesmo quando pressionada a


tecla ESC.

Se digitarmos a linha a seguir, nenhuma célula de nenhuma planilha poderá ser


selecionada:

Application.DataEntryMode = xlStrict

2.5.1.7. WindowState

Esta propriedade permite determinar se a janela do Excel será maximizada (com


o valor xlMaximized), normal (com o valor xlNormal), ou minimizada (com o
valor xlMinimized).

O exemplo a seguir deixa a janela maximizada:

Application.WindowState = xlMaximized

106
Principais objetos, propriedades e métodos
2
2.5.1.8. StatusBar

Através da propriedade StatusBar do objeto Application, podemos configurar


as mensagens da barra de status do Excel:

Quando executamos a macro P_06, o resultado é o seguinte:

Para retornarmos ao comportamento padrão da barra de status, execute a


macro P_07.

2.5.1.9. Cursor

Podemos, também, especificar qual cursor o Excel utilizará. Para o padrão,


escolha xlDefault:

Veja que, na macro P_08, o cursor exibido é o do modo Espera.

107
Excel 2016 VBA - Módulo I

2.5.1.10. Dialogs

Através da propriedade Dialogs do objeto Application, podemos retornar


qualquer caixa de diálogo do Excel. Veja o exemplo:

Na macro P_10, será mostrada a caixa de diálogo do Zoom:

Na macro P_11, será exibida a caixa de diálogo de Visualização de Impressão:

108
Principais objetos, propriedades e métodos
2
2.5.1.11. Version

A propriedade Version retorna a versão do Excel:

2.5.2. Principais métodos

A seguir, vamos descrever alguns métodos para o objeto Application.

2.5.2.1. Quit

Este método fecha o Excel. Observe o exemplo, em que salvamos antes o arquivo
para que não interrompa a macro perguntando se deseja salvar:

2.5.2.2. Calculate

Quando usamos este método, todas as planilhas de todas as pastas de trabalho


abertas são calculadas. Sua sintaxe é a seguinte:

Application.Calculate

2.5.2.3. FindFile

O método FindFile abre a caixa de diálogo Abrir (Arquivo), permitindo ao


usuário escolher, clicar e abrir um arquivo Excel.

Application.FindFile

109
Excel 2016 VBA - Módulo I

2.5.2.4. GetOpenFileName

Apesar de a função InputBox ser muito útil para inserção e envio de informações
do usuário para o computador, nos casos em que o procedimento usado solicita
o nome de um arquivo, ela não será a função mais apropriada. Isto porque é
difícil para os usuários lembrarem e digitarem caminhos e diretórios de arquivos;
além disso, erros de digitação podem ocorrer, dificultando o processo para
encontrar um arquivo.

O método GetOpenFilename é usado exatamente para simplificar o acesso a


arquivos, garantindo que o nome e o caminho do arquivo estejam corretos. Esse
método abre a mesma caixa de diálogo Abrir que é exibida quando selecionamos
o comando Abrir, contido na guia Arquivo do Excel. Apesar de ser a mesma
caixa de diálogo, a que visualizamos por meio do método GetOpenFilename
não abre arquivos, mas apenas retorna como uma sequência de caracteres
o nome do arquivo que o usuário selecionar. Depois, podemos escrever um
código para usar o nome do arquivo como nos for conveniente.

Para selecionar mais de um nome de arquivo por meio do método


GetOpenFilename, é necessário definir como True o argumento MultiSelect
para que o método retorne uma série de nomes de arquivos. O código usado
precisa fazer um loop nos nomes de arquivos, ou seja, processar cada um deles
para poder identificar todos eles.

Sub Seleciona_Arquivo()
Dim Caminho As String
Caminho = Application.GetOpenFilename
MsgBox Caminho
End Sub

110
Principais objetos, propriedades e métodos
2
A variável Caminho irá armazenar o local correspondente ao arquivo
selecionado.

O conteúdo da variável (caminho do arquivo) será exibido na caixa de mensagem.

2.5.2.5. GetSaveAsFileName

Método semelhante ao que acabamos de descrever é o GetSaveAsFilename.


Este método, porém, abre uma caixa de diálogo igual à caixa Salvar Como do
Excel e obtém o nome e caminho do arquivo, mas sem que seja feita qualquer
ação com essas informações. A sintaxe desse método e seus argumentos são
os seguintes:

object.GetSaveAsFilename([initialFilename], [fileFilter],[filterI
ndex],[title],[buttonText])

111
Excel 2016 VBA - Módulo I

Em que:

•• InitialFilename: Este argumento determina qual será o nome padrão


mostrado na caixa antes que o usuário escolha outro arquivo;

•• FileFilter: Com este argumento, podemos determinar quais tipos de arquivos


ficarão disponíveis na caixa de diálogo para o usuário escolher;

•• Title: Este argumento determina o texto a ser exibido na barra de títulos


da caixa de diálogo.

Este exemplo exibe o caminho e nome do arquivo em uma caixa de mensagem:

MsgBox Application.GetSaveAsFilename

Pode ser que em alguns casos a informação que desejamos não seja o nome de
um arquivo, mas sim o de uma pasta. Então, devemos usar o objeto FileDialog,
como mostra o procedimento a seguir, para que uma caixa de diálogo onde
possamos selecionar um nome de diretório apareça.

Sub Identifica_Endereço()
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & "\"
.Title = "Escolha um local para salvar seus arquivos"
.Show
If .SelectedItems.Count = 0 Then
MsgBox "Operação Cancelada"
Else
MsgBox .SelectedItems(1)
End If
End With
End Sub

No objeto FileDialog, podemos especificar um valor para a propriedade


InitialFilename para determinar o diretório inicial. Então, o código definirá
como diretório inicial o caminho de arquivo padrão do Excel.

112
Principais objetos, propriedades e métodos
2
2.5.2.6. OnKey

Por meio do método OnKey, podemos fazer com que a execução de um


procedimento seja desencadeada quando pressionarmos uma combinação
específica de teclas, uma vez que o Excel acompanha cada tecla que digitamos.
É justamente essa combinação que o OnKey, cuja sintaxe é descrita a seguir,
define:

expressão.OnKey(Tecla_ou_conjunto_de_teclas, Procedimento)

A seguir, temos a descrição de cada um dos argumentos presentes na sintaxe


de OnKey:

•• expressão: Aqui, devemos inserir uma expressão que retorna um objeto


Application;

•• Tecla_ou_conjunto_de_teclas: Este argumento é uma string. É onde


devemos inserir as teclas que desejamos combinar, as quais podem ser as
teclas ALT, CTRL ou SHIFT (que também podem ser combinadas entre elas
próprias), mais outra tecla. As teclas podem ser representadas por mais de
um caractere; então, para a tecla A devemos digitar "a" e para a tecla ENTER,
devemos digitar "{ENTER}";

•• Procedimento: Este argumento é uma variant e é a parte em que devemos


especificar o nome do procedimento a ser utilizado. Seu uso não é
obrigatório, ou seja, se utilizarmos um texto vazio (""), a combinação de
teclas especificada em Tecla_ou_conjunto_de_teclas não gerará resultado
algum. Esse modo de OnKey tem a capacidade de modificar as ações
resultantes do pressionamento de teclas predefinidas pelo Excel, mas é
possível retornar às ações originais omitindo o Procedimento. Então, se
omitido, Tecla_ou_conjunto_de_teclas reverte seu resultado normal e as
combinações determinadas com OnKey são excluídas.

113
Excel 2016 VBA - Módulo I

Algumas teclas, quando pressionadas, não exibem um caractere correspondente


a ela, como a tecla ENTER ou TAB. Para essas teclas, existem códigos que as
representam, os quais serão mostrados na tabela seguinte:

Tecla Código
BACKSPACE {BACKSPACE} ou {BS}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
CLEAR {CLEAR}
DELETE ou DEL {DELETE} ou {DEL}
END {END}
ENTER ~ (til)
ENTER (teclado
{ENTER}
numérico)
ESC {ESCAPE} ou {ESC}
F1 a F15 {F1} a {F15}
HELP {HELP}
HOME {HOME}
INSERT {INSERT}
NUMLOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
RETURN {RETURN}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
Seta para a direita {RIGHT}
Seta para a esquerda {LEFT}
Seta para cima {UP}
Seta para baixo {DOWN}

114
Principais objetos, propriedades e métodos
2
Além de serem utilizadas sozinhas, as teclas também podem ser aplicadas em
adição a CTRL, ALT e SHIFT, sendo que estas três podem ser combinadas também
entre elas. Para combinar uma tecla com SHIFT, o código desta tecla deve ser
precedido por um sinal de mais (+). Para combinar com CTRL, devemos preceder
o código com acento circunflexo (^). Já para combinar com ALT, preceder com
o sinal de porcentagem (%).

Os procedimentos também podem ser atribuídos a


caracteres especiais, como +, ^, % e outros. Nesse caso, o
caractere especial deve estar entre chaves { }.

A seguir, temos, como exemplo, um código que executa a macro Editar quando
a tecla F7 é pressionada:

Application.OnKey "{F7}", "Editar"

No próximo exemplo, a mesma macro Editar é executada quando pressionamos


as teclas CTRL + F7:

Application.OnKey "^{F7}", "Editar"

Já o código seguinte executa a macro Editar quando são pressionadas as teclas


CTRL + ALT + F7:

Application.OnKey "^%{F7}", "Editar"

O atalho somente começará a funcionar depois de executada


a linha de código (tecla de função F5).

O código a seguir faz com que a tecla F7 tenha seu resultado restaurado, ou
seja, volte a ter sua função original, pois o nome da macro, ou procedimento,
é emitida no código:

Application.OnKey "{F7}"

115
Excel 2016 VBA - Módulo I

Também é possível desativar a função de uma tecla ou atalho inserindo duas


aspas ("") no lugar do procedimento, como mostra o exemplo seguinte, o qual
desativa a função da tecla F7:

Application.OnKey "{F7}", ""

O método OnKey, uma vez especificado, fica ativo enquanto o Excel estiver
aberto, mesmo que a pasta de trabalho para o qual ele foi desenvolvido seja
fechada. Então, cada vez que um atalho criado para essa pasta de trabalho for
pressionado, ela abrirá novamente, a não ser que o código seja incluído no
código de evento Workbook_BeforeClose.

Por meio de macros, podemos definir um atalho para exibição de um formulário


de cadastro, atalho este que deverá executar a macro Abrir_Cursos, responsável
por exibir o formulário.

A macro responsável por abrir o formulário é a seguinte:

Sub Abrir_Cursos()
frmCursos.Show
End Sub

Já a macro que irá definir o atalho é descrita a seguir:

Sub atalhos()
Application.OnKey "{f2}", "Abrir_Cursos"
End Sub

Também é possível definir o atalho criado para funcionamento apenas enquanto


o arquivo estiver aberto. Sendo assim, devemos inserir o comando dentro
do evento Workbook_BeforeClose do arquivo em questão, como mostrado
adiante:

Private Sub Workbook_BeforeClose(Cancel As Boolean)


Application.OnKey "{F2}", ""
End Sub

116
Principais objetos, propriedades e métodos
2
2.5.2.7. OnTime

O método OnTime permite agendar a data e a hora para a execução de uma


macro. Utilizar o método OnTime não impede o usuário de retornar à interação
normal com o Excel e nem de utilizar outras macros, mesmo que esse método
ainda não tenha sido executado.

A seguir, temos a sintaxe do OnTime e, depois, a descrição de cada um de seus


argumentos:

expressão.OnTime(Início, Procedimento, Término, NovoProcedimento)

Em que:

•• expressão: Aqui, devemos inserir uma expressão que retorna um objeto


Application;

•• Início: Este argumento é uma variant de uso obrigatório. É onde definimos


o início da execução do procedimento;

•• Procedimento: Este argumento é uma string de uso obrigatório. É o nome


do procedimento a ser executado;

•• Término: Este argumento é uma variant opcional. Ele determina até quando
o procedimento poderá ser executado. Vamos supor que, quando a hora
do Início for atingida, o Excel esteja executando outro procedimento e o
Término tenha sido definido como Início+45. Sendo assim, 45 segundos
serão aguardados até que o procedimento anterior termine sua execução.
Se o Excel ainda não estiver pronto após 45 segundos, o procedimento não
será executado;

•• NovoProcedimento: Este argumento é uma variant opcional. Por meio dele,


podemos definir um novo procedimento OnTime. Se o resultado for False,
o procedimento anterior é excluído; se for True, que é o valor padrão,
podemos programar um novo procedimento.

117
Excel 2016 VBA - Módulo I

A função TimeValue é a representação do tempo do VBA. Quando utilizamos


TimeValue(horário), o método OnTime é executado num horário específico.
Porém, se utilizarmos Now+TimeValue(tempo decorrido), o método é
executado depois de um determinado espaço de tempo, contando a partir
do momento atual. A função TimeValue converte a cadeia de caracteres que
definimos como tempo em um valor que o Excel consegue interpretar e acessar.

A seguir, temos um exemplo de código que executa o procedimento Bombar


em 27 segundos a partir do momento atual:

Application.OnTime Now + TimeValue("00:00:27"), "Bombar"

No próximo exemplo, o procedimento Bombar será executado às 15:00:

Application.OnTime TimeValue("15:00:00"), "Bombar"

Além de programar um horário, podemos programar o dia em que deve ser


executado o procedimento utilizando o DateValue. O exemplo a seguir mostra
um código que executa o procedimento Bombar às 20:00h do dia 12 de fevereiro
de 2016:

Application.OnTime DateValue("02/12/2016 8:00 pm"),


"Bombar"

Para utilizar o DateValue, é necessário manter o computador


funcionando. Além disso, a pasta de trabalho que contém o
procedimento deve permanecer aberta.

O evento OnTime também funciona em conjunto com o procedimento


UpdateClock. Esse procedimento insere a hora em uma célula e programa
outro evento para algum tempo depois, que é a sua própria execução outra vez.
Dessa forma, a célula escolhida tem a hora atualizada periodicamente, a menos
que o evento seja cancelado com o procedimento StopClock.

118
Principais objetos, propriedades e métodos
2
A seguir, temos, como exemplo, um código que insere, na célula B4, a hora
atualizada a cada 21 segundos. Nesse código, NextTick é uma variável que
armazena a hora para o próximo evento:

Dim NextTick As Date

Sub ExibeHorario()
'atualiza a célula B4 com o tempo atual
Range("B4") = Time
'Prepara o próximo evento para que ocorra daqui a
02 segundos
NextTick = Now + TimeValue("00:00:02")
Application.OnTime NextTick, "ExibeHorario"
End Sub

Como já foi dito, o método OnTime fica ativo mesmo que a pasta de trabalho
para a qual ele foi desenvolvido seja fechada, o que quer dizer que, a cada
21 segundos (tomando como base o exemplo dado), a pasta de trabalho será
aberta novamente, se o procedimento StopClock não tiver sido executado.
Podemos evitar que isso ocorra utilizando o evento Workbook_BeforeClose
com a seguinte instrução:

Sub PararRelogio()
On Error Resume Next
‘Cessa o relógio (OnTime é interrompido)
Application.OnTime NextTick, "ExibeHorario", , False
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call PararRelogio
End Sub

119
Excel 2016 VBA - Módulo I

2.5.2.8. Wait

É comum termos situações em que é necessário fazer com que a macro pause/
espere alguns segundos. Muitos programadores usam, para isso, um For/Next,
mas o método Wait tem a função de aplicar essa pausa. Veja o exemplo adiante:

Note que houve uma pausa de 5 segundos entre os comandos do Range("C!")


e Range("C2").

120
Principais objetos, propriedades e métodos
2
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Para cada propriedade que definimos no Excel, é necessário referenciar o


objeto ao qual ela será aplicada, mesmo quando o objeto for igual para
diversas propriedades. Para evitar a repetição do mesmo objeto nos casos
em que diversas propriedades são aplicadas a um mesmo objeto, podemos
usar a estrutura With e End With;

•• O método GetOpenFilename é usado para simplificar o acesso a arquivos,


garantindo que o nome e o caminho do arquivo estejam corretos;

•• O método GetSaveAsFilename abre uma caixa de diálogo igual à caixa


Salvar Como do Excel e obtém o nome e caminho do arquivo, mas sem que
seja feita qualquer ação com essas informações;

•• As cerca de setecentas caixas de diálogo do Excel são muito úteis para


agilizar o trabalho com programação, pois por meio delas os próprios
usuários podem escolher diversas opções, como formatar fonte, preencher
sequências, imprimir etc;

•• Por meio do método OnKey, podemos fazer com que a execução de um


procedimento seja desencadeada quando pressionarmos uma combinação
específica de teclas, uma vez que o Excel acompanha cada tecla que
digitamos. É justamente essa combinação que o OnKey define;

•• O método OnTime permite agendar a data e a hora para a execução de uma


macro. Utilizar o método OnTime não nos proíbe de retornar à interação
normal com o Excel e nem de utilizar outras macros, mesmo que esse
método ainda não tenha sido executado.

121
Principais objetos,
2
propriedades e
métodos
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. Qual é a sintaxe utilizada para alterar o texto contido


na barra de título do Excel?

☐☐ a) Range(“a1”).Select

☐☐ b) Application.Caption = “Texto Qualquer”

☐☐ c) Selection.Title = “Texto Qualquer”

☐☐ d) Sheets(“Texto Qualquer”).Select

☐☐ e) As alternativas B e C estão corretas.

2. Qual das alternativas a seguir refere-se à pasta de


trabalho (arquivos)?

☐☐ a) Worksheets

☐☐ b) Workbooks

☐☐ c) Range

☐☐ d) Selection

☐☐ e) Application

124
Principais objetos, propriedades e métodos
2
3. Qual comando deve ser utilizado para inserir um texto
na célula A4, sabendo-se que o cursor está posicionado
sobre ela?

☐☐ a) Range(“a3”).Select

☐☐ b) Activecell.Value = “Texto”

☐☐ c) Range(“a4”).Select = “texto”

☐☐ d) Activecell = “Texto”

☐☐ e) As alternativas B e D estão corretas.

4. Que comando executa uma macro automaticamente


após 30min do horário atual?

☐☐ a) Application.Ontime now + TimeValue(“00:30:00”),


”MacroTeste”

☐☐ b) Application.Onkey 27

☐☐ c) Activewindow.OnTime agora + 30

☐☐ d) Workbooks now()+ 00:30

☐☐ e) Nenhuma das alternativas anteriores está correta

125
Excel 2016 VBA - Módulo I

5. Qual é o método utilizado para fechar o Excel?

☐☐ a) Select

☐☐ b) Range

☐☐ c) Finish

☐☐ d) Calculate

☐☐ e) Quit

126
2
Principais objetos,
propriedades e
métodos
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Criando uma macro pelo código em VBA para realizar a formatação da


planilha

1. Crie a seguinte planilha:

2. Com a utilização do VBA, crie uma macro chamada Formatar, que deverá
realizar uma formatação na planilha, conforme o exemplo a seguir:

• Fonte: Book Antiqua, sublinhado,


cor vermelha;

• Mesclar e centralizar células.

• Negrito;

• Sombreamento verde;

• Centralizar texto nas células.

• Conteúdo da planilha em itálico;

• Todas as bordas na tabela


inteira.

128
Principais objetos, propriedades e métodos
2
3. Crie uma macro com o nome Limpar_Formatos, que deverá remover toda a
formatação gerada pela macro anterior, inclusive, a de mesclagem de células.
Após remover a formatação, deverá ser exibida uma caixa com a seguinte
mensagem: Operação Concluída;

Para remover somente a formatação das células, utilize


o método ClearFormats.

4. Insira dois botões de controle (mostrados nas imagens anteriores), atribuindo


uma macro para cada um.

Laboratório 2

A – Utilizando o método OnTime

1. Desenvolva macros que deverão exibir uma caixa de texto para o usuário
quando o arquivo já estiver aberto há 30 minutos, questionando se ele deseja
salvar o arquivo. Se o usuário clicar no botão SIM, o arquivo deverá ser salvo.
Caso contrário, a mensagem Operação Cancelada deverá ser exibida:

•• Macro Salvar_Arq: Deverá exibir a função Msgbox() e salvar o arquivo,


caso a resposta seja positiva;

•• Macro Auto_Open: Deverá chamar a macro Salvar_Arq após o arquivo


estar aberto por 30 minutos.

129
3
Operadores,
variáveis,
constantes e
arrays
99 Operadores;
99 Variáveis;
99 Macros com passagem de parâmetros;
99 Constantes;
99 Arrays.
Excel 2016 VBA - Módulo I

3.1. Operadores
O tipo de cálculo feito com os elementos de uma fórmula é definido pelo operador
utilizado. O VBA possui quatro categorias de operadores, que conheceremos
nos próximos tópicos. São eles:

•• Operadores aritméticos;

•• Operadores de comparação;

•• Operadores lógicos;

•• Operadores de concatenação.

3.1.1. Operadores aritméticos

Os operadores aritméticos, descritos e exemplificados na próxima tabela, são


empregados na realização de cálculos matemáticos:

Operador Descrição Exemplos


+ Soma dois valores. 7+7 resulta em 14.
- Subtrai dois valores. 7-2 resulta em 5.
* Multiplica dois valores. 3*3 resulta em 9.
/ Divide dois valores. 8/2 resulta em 4.
Retorna a parte inteira do resultado
\ 17\2 resulta em 8.
de uma divisão.
Retorna o resto de uma divisão. 17 Mod 2 resulta em 1.
Mod Valores não inteiros utilizados na 19 Mod 4 resulta em 3.
divisão são arredondados. 19 Mod 4.2 resulta em 3.
^ Calcula a exponenciação. 3^3 resulta em 27.

132
Operadores, variáveis, constantes e arrays
3
3.1.2. Operadores de comparação

Os operadores de comparação, descritos e exemplificados na tabela a seguir, são


utilizados para comparar valores de duas expressões, retornando um resultado
True (para comparações verdadeiras), False (para comparações falsas) ou Null
(caso uma das expressões utilizadas na comparação contenha dados inválidos):

Operador Descrição Exemplos


= Igual a. 20=15+15 resulta em False.
<> Diferente de. 25<>20+20 resulta em True.
> Maior que. 50>70-25 é igual a True.
< Menor que. 20<10+10 resulta em False.
>= Maior ou igual a. 50>=10*7 é igual a False.
<= Menor ou igual a. 30<=15+15 resulta em True.
Objeto Is Var resulta em True,
Compara duas variáveis
Is supondo que Objeto seja igual a
de referência a objetos.
X e que X seja igual a Var.
Compara duas sequências "FnnnF" Like "F*F" resulta em
Like
de caracteres. True.

3.1.3. Operadores lógicos

Os operadores lógicos são utilizados em operações lógicas e, assim como os


operadores de comparação, retornam um resultado True, False ou Null. A
próxima tabela descreve esses operadores:

Operador Descrição Exemplos


Acrescenta condições a um teste
12>5 And 8<7 resulta em
lógico. Retorna True caso todas as
False.
And condições sejam verdadeiras, False
12>5 And 8>7 resulta em
caso uma delas seja falsa e Null caso
True.
uma delas seja nula.

133
Excel 2016 VBA - Módulo I

Operador Descrição Exemplos


Acrescenta condições em um teste
lógico, assim como o operador And.
Porém, retorna True caso uma ou 12>5 Or 8<7 resulta em
Or
mais condições sejam verdadeiras, True.
False caso todas sejam falsas e Null
caso uma delas seja nula.
Inverte a lógica de uma expressão, Not 12>5 resulta em
Not
criando uma negação lógica. False.
Verifica uma equivalência lógica,
12>5 Eqv 8>5 resulta em
retornando True caso as duas
True.
Eqv expressões sejam verdadeiras ou
12<5 Eqv 8<5 resulta em
falsas e False ou Null caso uma delas
True.
seja nula.
Faz uma exclusão lógica, retornando
True caso uma expressão seja 9>7 Xor 7<5 resulta em
verdadeira e a outra, falsa. Caso as True.
Xor
duas expressões sejam verdadeiras 9>7 Xor 7>5 resulta em
ou falsas, retorna False, e caso uma False.
delas seja nula, retorna Null.

3.1.4. Operadores de concatenação

O operador de concatenação do VBA é o & (e comercial). A concatenação é utilizada


para criar um único texto a partir da associação de duas ou mais sequências
de caracteres de texto. Para exemplificar, podemos imaginar a concatenação
de dois valores de texto: um fixo, como Bem-vindo, (inclusive com a vírgula), e
outro variável, como um nome que é preenchido em um campo. Supondo que
o nome preenchido seja Marcos, a concatenação "Bem-vindo, "&"Marcos"&"!"
resulta no texto Bem-vindo, Marcos!.

Podemos dizer que o operador de concatenação também tem a função de


unir valores distintos, como o conteúdo de um texto com a data definida pelo
sistema operacional da máquina, ou ainda exibir em uma única resposta, uma
string com o resultado de uma variável.

134
Operadores, variáveis, constantes e arrays
3
No exemplo a seguir, será exibida, na barra de status do Excel, a palavra data,
seguida da data do sistema:

Sub Exibe_Data()
Application.StatusBar = "Data: " & Date
End Sub

Para exibir uma Caixa de Mensagem com diversas linhas, utilizamos a instrução
vbCrLf para realizar a quebra de linhas. Desta forma, utilizaremos o símbolo
concatenador para unir o texto com o comando de quebra de linha.

Sub mensagem()
MsgBox "Data: " & Date & vbCrLf & "Bem Vindo ao Sistema!"
End Sub

Ao executar a macro, teremos o resultado a seguir:

3.1.5. Ordem das operações

A ordem em que as operações ocorrem no VBA é a mesma do Excel:


primeiramente, são calculadas todas as exponenciações, em seguida, são feitas
as multiplicações e divisões e, por último, as adições e subtrações. Qualquer
operação envolvida por parênteses, porém, é resolvida antes de qualquer outra.
Assim, a expressão 5+3*2 resulta em 11, enquanto a expressão (5+3)*2 traz
como resultado o número 16.

Os parênteses adicionais ou desnecessários (5+(3*2), por


exemplo) não afetam os cálculos e podem ser utilizados como
um recurso para facilitar o entendimento do código.

135
Excel 2016 VBA - Módulo I

3.2. Variáveis
As variáveis são amplamente utilizadas em muitas linguagens de programação,
inclusive no Visual Basic. Uma variável é um espaço nomeado da memória,
utilizado para armazenar um valor temporariamente.

O nome de uma variável deve ser iniciado por um caractere


alfabético e conter, no máximo, 255 caracteres.

Para atribuir informação em uma variável, devemos digitar o nome da variável


seguido pelo sinal = (igual) mais o conteúdo desejado. Caso a informação a ser
atribuída seja alfanumérica, devemos colocá-la entre aspas. Em se tratando de
informação numérica, devemos apenas digitar o número desejado. Observe o
exemplo adiante:

nome="Ana Paula"
idade=18

Podemos usar o comando Msgbox para exibir o conteúdo da variável para o


usuário. Neste caso, devemos apenas incluir o nome da variável (sem aspas)
para que seu conteúdo seja exibido, conforme apresentado a seguir:

Texto = "Impacta Tecnologia"


Msgbox Texto

136
Operadores, variáveis, constantes e arrays
3
Também podemos exibir mais de uma variável dentro da caixa de mensagem,
juntamente com um texto qualquer.

Considere o seguinte conteúdo a ser exibido na caixa de mensagem:

Nome: Ana Paula


Idade: 18 anos

Neste caso, devemos escrever o seguinte código:

Nome = "Ana Paula"


Idade = 18
Msgbox "Nome: " & Nome & vbCrLf & "Idade: " & Idade & " anos"

E o resultado será este:

Neste último caso, foi utilizado o operador de concatenação & e o comando


vbCrLf para efetuar a quebra de linha dentro da caixa de mensagem.

É possível definir variáveis a partir de valores armazenados em outras variáveis:

Sub calcula_total()
qtde = InputBox("Digite a quantidade")
preco = 10.25
Total = qtde * preco
MsgBox "Valor a pagar = " & Total
End Sub

137
Excel 2016 VBA - Módulo I

A variável total irá retornar o resultado do produto dos valores contidos nas
variáveis qtde e preco, obtendo, assim, o conteúdo numérico resultante da
quantidade que for digitada multiplicada pelo valor 10.25 que está na variável
preco. Veja, no exemplo a seguir, o resultante de ter digitado 2 para quantidade:

3.2.1. Declarando variáveis

As variáveis precisam ser declaradas antes de serem utilizadas, ou seja, precisam


ter seu tipo definido. A definição do tipo de uma variável otimiza a utilização
do espaço da memória, pois cada um dos tipos ocupa quantidades de espaço
diferentes, de acordo com os dados que vão armazenar. Isso faz com que a
memória seja ocupada de acordo com as necessidades reais de armazenamento
de informações.

Os tipos definem como os dados são armazenados na memória: como data,


como número inteiro ou como número decimal, por exemplo. O VBA possui
recursos para manipular essas informações automaticamente, mas com
algumas desvantagens, como lentidão na execução e um uso ineficiente de
memória (todas as variáveis não declaradas assumem o tipo Variant, que pode
armazenar qualquer tipo de dado, mas faz com que o VBA reserve mais memória
que o necessário e faça verificações que consomem muito tempo). Por esse
motivo, o ideal é que as variáveis sejam sempre declaradas, principalmente, nas
aplicações mais complexas.

138
Operadores, variáveis, constantes e arrays
3
A próxima tabela descreve os tipos de variáveis, lista seus valores permitidos e
o tamanho que ocupam na memória:

Tipo Valores Tamanho


Byte De 0 a 255. 1 byte
Boolean True ou False. 2 bytes
Integer De -32.768 a 32.767. 2 bytes
Long De -2.147.483.648 a 2.147.483.647. 4 bytes
Single (vírgula
Para valores negativos, de -3,402823E38 a
flutuante
-1,401298E-45; para valores positivos, de 4 bytes
de precisão
1,401298E-45 a 3,402823E38.
simples)
Object Qualquer referência a um objeto. 4 bytes
Date De 01/01/0100 a 31/12/9999. 8 bytes
Para valores negativos, de
Double (vírgula -1,79769313486231E308 a
flutuante de -4,94065645841247E-324; para valores 8 bytes
dupla precisão) positivos, de 4,94065645841247E-324 a
1,79769313486232E308.
Currency
De -922.337.203.685.477,5808 a
(número inteiro 8 bytes
922.337.203.685.477,5807.
em escala)
10 bytes
String
De 0 a 2.000.000.000 de caracteres somados ao
(comprimento
(aproximadamente). comprimento
variável)
da sequência.
+/-
79.228.162.514.264.337.593.543.950.335
(sem vírgula decimal) e +/-
Decimal 7,9228162514264337593543950335 12 bytes
(com 28 casas decimais à direita). O
menor número diferente de zero é +/-
0,0000000000000000000000000001.
Variant Qualquer número até o intervalo de um
16 bytes
(numérica) Double.

139
Excel 2016 VBA - Módulo I

Tipo Valores Tamanho


22 bytes
De 0 a 2.000.000.000 de caracteres somados ao
Variant (texto)
(aproximadamente). comprimento
da sequência.
String Definido pelo
(comprimento De 1 a 65.400 caracteres (aproximadamente). comprimento
fixo) da sequência.
Definido pelo
Definido pelo
usuário (usando Depende da definição.
tipo de dado.
Type)

No exemplo a seguir, a variável media receberá o resultado do cálculo da média


aritmética entre 4 notas inseridas nas variáveis nota1, nota2, nota3 e nota4.
Observe que as variáveis foram declaradas como single, que permite aceitar
valor decimal de precisão simples.

Sub calcula_media()
Dim nota1 As Single, nota2 As Single, -
nota3 As Single, nota4 As Single, -
media As Single
nota1 = 10
nota2 = 5.5
nota3 = 3
nota4 = 8.5
media = (nota1 + nota2 + nota3 + nota4) / 4
Range("a2") = media
End Sub

O resultado inserido na célula A2 será 6,75.

As variáveis podem ser declaradas nos níveis de procedimento, de módulo ou


de projeto. Conheceremos, a seguir, a declaração em cada um desses níveis.

140
Operadores, variáveis, constantes e arrays
3
3.2.1.1. Declarando no procedimento

Declarar uma variável no nível de procedimento significa declará-la dentro do


procedimento em que ela será utilizada. Assim, nenhum outro procedimento,
mesmo que seja do mesmo módulo, será capaz de utilizar essa variável.

Para declarar uma variável no nível de procedimento, devemos inserir a instrução


Dim, o nome da variável, a palavra-chave As e um tipo, como no exemplo a
seguir. Caso digitemos apenas a instrução Dim e o nome da variável, seu tipo
será definido como Variant.

Dim <nome_variavel> As <tipo>

Considere o seguinte exemplo:

Dim variavel_1 As Decimal


Dim valor As Decimal

Após declarar a variável, é necessário definir seu valor. Se definirmos um valor


incompatível com o tipo declarado, será exibido um erro de execução da macro.

Para variáveis do tipo Object, devemos atribuir a referência do objeto, utilizando


a instrução Set seguida do nome do objeto, de um sinal de igual (=) e da referência
do objeto, como exibe a sintaxe a seguir:

O exemplo a seguir irá exibir em uma caixa de mensagem o valor contido na


célula A4, pertencente na planilha denominada Plan1.

Sub exibe_msg()
Dim celula as Object
Set celula = worksheets("plan1").range("a4")
Msgbox "O Conteúdo da célula A4 é: " & celula
End Sub

141
Excel 2016 VBA - Módulo I

Considere o exemplo a seguir, em que a célula ativa (selecionada) estará


recebendo o valor contido na célula B5, pertencente à planilha Dados:

Sub insere_conteudo()
Dim conteudo As Object
Set conteudo = Worksheets("Dados").Range("b5")
ActiveCell.Value = conteudo.Value
End Sub

Podemos definir outras propriedades de um objeto na célula ativa, como o


procedimento a seguir, que formata o estilo da fonte e a cor do preenchimento:

142
Operadores, variáveis, constantes e arrays
3
Podemos fazer com que o objeto deixe de ser associado ao nome que definimos,
utilizando a instrução Set seguida do nome do objeto, de um sinal de igual (=)
e do valor definido como Nothing, como o próximo exemplo, que dissocia a
variável nome_da_planilha e o objeto ao qual fazia referência:

Set nome_da_planilha = Nothing

As variáveis em geral têm seus valores restaurados após o término do


procedimento. É possível, porém, declarar uma variável como estática, através
da palavra-chave Static, como mostra a sintaxe a seguir. As variáveis desse tipo
só têm seus valores restaurados quando a pasta de trabalho é fechada.

Static <nome_variavel> as <tipo>

Considere o seguinte exemplo:

Sub Incremento()
Static num As Integer
MsgBox num
num = num + 1
End Sub

No exemplo anterior, podemos observar que cada vez que a macro for
executada, o valor 1 será somado ao conteúdo da variável. Neste caso,
diferentemente dos demais tipos de variáveis, a variável do Static mantém o
conteúdo mesmo após a execução da macro em questão.

Assim como as outras variáveis declaradas no nível de


procedimento, as variáveis estáticas não podem ser
utilizadas por outros procedimentos, mesmo que façam
parte do mesmo módulo.

143
Excel 2016 VBA - Módulo I

3.2.1.2. Declarando no módulo

As variáveis declaradas no nível do módulo podem ser utilizadas por qualquer


procedimento que faça parte do módulo.

Para declarar uma variável no módulo, devemos utilizar a instrução Private


e a seção Declarações, localizada na parte superior do módulo. Uma linha
horizontal é exibida automaticamente abaixo da declaração.

Verificamos, então, que o valor da variável Curso, o qual foi atribuído na macro
Nome_Curso, será utilizado na macro Dados.

Para efeitos de compatibilidade com versões anteriores,


a instrução Dim também pode ser utilizada para declarar
variáveis no nível do módulo.

144
Operadores, variáveis, constantes e arrays
3
3.2.1.3. Declarando no projeto

As variáveis declaradas no nível do projeto podem ser utilizadas por quaisquer


módulos que façam parte do projeto.

Para declarar uma variável no projeto, devemos utilizar a instrução Public e a


seção Declarações, localizada na parte superior do módulo.

Podemos criar a variável curso em um dos módulos do projeto, utilizando a


seguinte instrução:

Public curso As String

Considere, ainda, a seguinte macro:

Sub atribui_valor()
curso = "Excel VBA"
End sub

Após esta macro ser executada, o valor da variável será "VBA".

Como a variável curso foi definida como Public, poderemos utilizá-la em


qualquer outro módulo do projeto, como no exemplo a seguir:

Sub utiliza_variavel()
Dim nomealu as string
Nomealu = inputbox("Digite o nome do aluno")
ange("b2") = nomealu
Range("b3") = curso
End sub

145
Excel 2016 VBA - Módulo I

3.2.1.4. Option Explicit

É possível que um erro de digitação faça com que o VBA crie uma nova variável
durante o procedimento, em vez de redefinir seu valor anterior. Isso faz com
que essa variável, por não estar declarada, assuma o tipo Variant, ocupando
um espaço desnecessário da memória, e que a variável anterior não tenha seu
valor redefinido.

Para evitar esse tipo de problema, podemos aplicar uma obrigatoriedade de


declaração de variáveis, por meio da instrução Option Explicit no início do
módulo, antes da declaração de procedimentos. Ao fazer isso, o código não
será capaz de executar uma variável não declarada, o que evita a ocorrência de
erros.

A instrução Option Explicit só se aplica ao módulo em que foi inserida. Portanto,


normalmente, é necessário inserir a instrução em cada um dos módulos em
que se deseja tornar a declaração de variáveis obrigatória. É possível, porém,
configurar a caixa de diálogo Opções, exibida a seguir, para fazer com que todos
os módulos possuam a instrução Option Explicit na seção Declarações. Para
isso, basta clicarmos em Opções, disposta no menu Ferramentas, e ativarmos
a opção Requerer declaração de variável:

146
Operadores, variáveis, constantes e arrays
3
3.3. Macros com passagem de parâmetros
Podemos passar parâmetros entre macros. Veja o seguinte exemplo:

Public Preco_Venda

Sub Precificacao()
custo = InputBox("informe o Custo do Produto?")
margem = 2
Call Calculo_Preco_Venda(custo, margem)
MsgBox Preco_Venda
End Sub

Sub Calculo_Preco_Venda(custo, margem)


Preco_Venda = custo * margem
End Sub

Aqui, temos duas macros. Note que a macro Precificacao, através do comando
Call, chama a macro Calculo_Preco_Venda enviando dois parâmetros: custo e
margem. A macro Calculo_Preco_Venda recebe esses dois parâmetros, executa
o cálculo do Preco_Venda (variável pública) e volta para a macro Preco_Venda.
É muito comum uma macro chamar a outra, para isso, usamos Call e, assim, ao
chamar outra macro, podemos enviar parâmetros.

3.4. Constantes
Assim como em várias linguagens de programação, temos constantes no VBA
também. Assim como as variáveis, as constantes são um espaço reservado na
memória RAM do computador com a finalidade de armazenar, guardar valor(es).
Porém, como o próprio nome indica, uma constante não pode ser alterada ao
longo do código.

147
Excel 2016 VBA - Módulo I

Usamos Const como instrução para declarar uma constante e definir o seu


valor. As regras são as mesmas para a criação de nomes de variáveis.

É muito comum termos constantes públicas utilizadas em diversas macros do


projeto.

3.5. Arrays
Os arrays, suportados pela maioria das linguagens de programação, são variáveis
indexadas, sendo assim, armazenam elementos que são referenciados por um
índice. O índice de uma variável array define quantos dados serão armazenados,
bem como a posição de cada elemento em sequência. Todos os elementos
contidos dentro de arrays devem ser do mesmo tipo de dado.

Para referenciar uma dessas variáveis no array, basta utilizar o nome desta
seguido de um número de índice. Para exemplificar, podemos imaginar um
array chamado dias_da_semana que possua sete variáveis armazenadas do
tipo String, uma para cada dia da semana, e referenciar cada elemento como
dias_da_semana(1), dias_da_semana(2), dias_da_semana(3) e assim por
diante.

148
Operadores, variáveis, constantes e arrays
3
Veja exemplos de arrays:

Array tamanho 4
(unidimensional)
Array tamanho 2x3
(bidimensional)

Os arrays, assim como as variáveis, precisam ser declarados antes de serem


utilizados. Podemos declará-los inserindo uma instrução Dim ou Public, mais o
nome do array e os números do primeiro e último índices, seguidos da palavra-
chave As e de um tipo de dado. O exemplo a seguir cria um array chamado
arrayexemplo de 50 números inteiros:

Dim arrayexemplo(1 to 50) As Integer

A quantidade de elementos de um array é definida de acordo com os números


que inserimos dentro dos parênteses. Devemos inserir o número do primeiro
índice, a palavra-chave to e o número do último índice. É possível especificar
apenas o último índice, caso em que o VBA assume 0 como o valor inicial. Os
dois exemplos a seguir criam arrays de 51 elementos:

Dim arrayexemplo(0 to 50) As Integer

Dim arrayexemplo(50) As Integer

Ao executarmos os códigos adiante, observamos que a macro exemplo1 exibe,


na caixa de mensagem, a informação "Quinta-Feira", contida no índice número
5. Nesse caso, foi indicado o valor inicial do índice como 1.

149
Excel 2016 VBA - Módulo I

O exemplo2, por sua vez, exibirá a informação "Sexta-Feira", visto que o índice
iniciou-se com o valor zero:

Sub exemplo1()
Dim dia_semana(1 To 7) As String
dia_semana(1) = "Domingo"
dia_semana(2) = "Segunda-Feira"
dia_semana(3) = "Terça-Feira"
dia_semana(4) = "Quarta-Feira"
dia_semana(5) = "Quinta-Feira"
dia_semana(6) = "Sexta-Feira"
dia_semana(7) = "Sábado"
MsgBox dia_semana(5)
End Sub

Sub exemplo2()
Dim dia_semana(6) As String
dia_semana(0) = "Domingo"
dia_semana(1) = "Segunda-Feira"
dia_semana(2) = "Terça-Feira"
dia_semana(3) = "Quarta-Feira"
dia_semana(4) = "Quinta-Feira"
dia_semana(5) = "Sexta-Feira"
dia_semana(6) = "Sábado"
MsgBox dia_semana(5)
End Sub

Podemos inserir a instrução Option Base 1 na seção Declarações de um módulo


para que o VBA assuma 1 como o valor inicial. Com essa instrução, os dois
exemplos a seguir criariam arrays de 50 elementos:

Dim arrayexemplo(1 to 50) As Integer


Dim arrayexemplo(50) As Integer

150
Operadores, variáveis, constantes e arrays
3
Com a execução do exemplo adiante, será exibido o mês de Fevereiro na caixa
de mensagem:

3.5.1. Arrays multidimensionais

Além dos arrays unidimensionais, como os criados nos exemplos anteriores,


podemos criar arrays multidimensionais. Apesar de os arrays multidimensionais
mais utilizados serem os que contêm duas ou três dimensões (que podem ser
imaginadas como matriz e cubos, respectivamente), é possível criar arrays de
até 60 dimensões no VBA.

Os elementos de arrays multidimensionais são referenciados a partir da


especificação de dois números, como ilustra o exemplo a seguir, que designa
um valor para um elemento de um array multidimensional:

Sub predio()
Dim andar(2, 2) As String
andar(0, 0) = "Maria"
andar(0, 1) = "Matheus"
andar(0, 2) = "Marina"
andar(1, 0) = "Jorge"
andar(1, 1) = "José"
andar(1, 2) = "João"
andar(2, 0) = "Pedro"
andar(2, 1) = "Paulo"
andar(2, 2) = "Patrícia"
MsgBox "Moradores do primeiro Andar:" & vbCrLf & _
andar(1, 0) & "-" & andar(1, 1) & "-" & andar(1, 2)
End Sub

151
Excel 2016 VBA - Módulo I

Foram inseridos dois elementos na matriz andar, cada qual contendo três
índices (0, 1 e 2). Podemos supor, então, que o primeiro elemento corresponda
aos andares e o segundo, aos apartamentos, ou por linhas e colunas se formos
pensar apenas na matriz em si. Assim, teríamos como primeiro elemento: índice
0 (térreo), índice 1 (primeiro andar) e índice 2 (segundo andar).

É possível especificar a quantidade de índices de uma macro multidimensional,


conforme apresentado adiante:

Sub regiao()
Dim area(1 To 2, 1 To 2) As Integer
area(1, 1) = 11
area(1, 2) = 12
area(2, 1) = 21
area(2, 2) = 22
Range("a1").Value = area(1, 1)
Range("a2").Value = area(1, 2)
Range("b1").Value = area(2, 1)
Range("b2").Value = area(2, 2)
End Sub

Podemos utilizar a instrução Option Base 1, assumindo


o valor 1 como sendo o valor inicial de um array, em vez
de zero.

152
Operadores, variáveis, constantes e arrays
3
3.5.2. Arrays dinâmicos

Os arrays dinâmicos se diferenciam dos demais por não possuírem um número


predeterminado de elementos. A declaração de um array dinâmico é feita como
no exemplo a seguir, em que não são inseridos índices nos parênteses:

Dim arrayexemplo() As Tipo

Antes de utilizarmos um array dinâmico, devemos utilizar a instrução ReDim,


que define a quantidade de elementos do array, quantia esta normalmente
determinada durante a execução do código. Essa instrução pode ser utilizada
quantas vezes forem necessárias para redimensionar o array, como no exemplo
a seguir, que considera que a variável resultado possui um valor calculado
anteriormente pelo código:

ReDim arrayexemplo(resultado)

Por padrão, a instrução ReDim exclui os valores armazenados anteriormente


nos elementos do array. Para evitar esse comportamento, podemos utilizar a
palavra-chave Preserve, como no próximo exemplo:

ReDim Preserve arrayexemplo(resultado)

Supondo que o array arrayexemplo possua atualmente sete elementos e que


a variável resultado possua um valor atual igual a 10, a instrução ReDim
redimensionará o array, que passará a ter dez elementos e manterá os sete
anteriores. Caso a variável resultado seja igual a 5, o array terá sua a quantidade
de elementos diminuída, mantendo apenas os cinco primeiros elementos dos
sete que tinha anteriormente.

153
Excel 2016 VBA - Módulo I

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• O VBA possui quatro categorias de operadores: aritméticos, de comparação,


lógicos e de concatenação;

•• A ordem em que as operações ocorrem no VBA é a mesma utilizada pelo


Excel: primeiramente, são calculadas todas as exponenciações, em seguida,
são feitas as multiplicações e divisões e, por último, as adições e subtrações.
Qualquer operação envolvida por parênteses, porém, é resolvida antes de
qualquer outra;

•• Uma variável é um espaço nomeado da memória utilizado para armazenar


um valor temporariamente;

•• Os arrays, suportados pela maioria das linguagens de programação,


são variáveis indexadas, sendo assim, armazenam elementos que são
referenciados por um índice;

•• Por padrão, a contagem das posições de uma variável array começa em


zero, mas podemos iniciá-la com a posição 1;

•• O comando Option Base 1 na seção Declarações de um módulo faz com


que o VBA assuma 1 como o valor inicial;

•• Os arrays possuem dimensões;

•• Arrays podem ser dinâmicos, isto é, podem ter seu tamanho redefinido
utilizando a instrução ReDim, que define a quantidade de elementos do
array, quantia esta normalmente determinada durante a execução do código.

154
3
Operadores,
variáveis,
constantes e
arrays
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. Qual das alternativas a seguir corresponde ao operador


de concatenação do VBA?

☐☐ a) &

☐☐ b) *

☐☐ c) /

☐☐ d) _

☐☐ e) Nenhuma das alternativas anteriores está correta.

2. Qual das alternativas a seguir está correta com relação


a variáveis?

☐☐ a) É um espaço reservado na memória, utilizado para


armazenar uma informação temporariamente.

☐☐ b) É obrigatória a sua criação caso a instrução Option


Explicit tenha sido indicada no módulo.

☐☐ c) São utilizadas para executar macros passo a passo.

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) Nenhuma das alternativas anteriores está correta.

156
Operadores, variáveis, constantes e arrays
3
3. Qual das alternativas a seguir está correta?

☐☐ a) A variável array serve apenas para inserção de texto.

☐☐ b) Não é possível inserir valor do tipo string em uma


variável array.

☐☐ c) A variável array permite que sejam armazenados


diversos itens em uma variável definida como um nome
único.

☐☐ d) O limite máximo de argumentos em uma variável


matricial é de 20 itens.

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Qual a sintaxe para exibir, em uma caixa de mensagem, o


conteúdo de uma variável array, o qual está na posição 8?

☐☐ a) Dim nome(8) as integer

☐☐ b) Dim nome(8) as string

☐☐ c) Msgbox nome(8)

☐☐ d) Msgbox Redim Nome(8)

☐☐ e) Range(a2) = dim nome(8)

157
Excel 2016 VBA - Módulo I

5. Para atribuirmos um valor em uma variável, podemos


utilizar qual comando?

☐☐ a) Dim nome as Double, byte

☐☐ b) Option Base 2

☐☐ c) Msgbox nome(4)

☐☐ d) Nome(4) = “Ana”

☐☐ e) Não é possível atribuir valor em uma variável matriz.

158
3
Operadores,
variáveis,
constantes e
arrays
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Trabalhando com operadores matemáticos no VBA

1. Desenvolva as macros a seguir utilizando o VBA, com base na seguinte


planilha:

•• Macro Calcular

Esta macro deverá realizar as seguintes ações:

•• Aceitar dois números em uma caixa de entrada, os quais serão inseridos


nas células B5 e B7, respectivamente;

•• Calcular a soma, subtração, multiplicação e divisão entre os dois


números, exibindo o resultado nas células E5, E7, E9 e E11.

•• Macro Limpar

•• Esta macro deverá realizar a seguinte ação:

•• Remover somente os valores contidos nas células (B5, B7, E5, E7, E9 e
E11).

Utilize o método ClearContents.

160
Estruturas de
4
decisão e repetição
99 Estruturas de repetição;
99 GoTo;
99 Estruturas de decisão;
99 Tratamento de erros.
Excel 2016 VBA - Módulo I

4.1. Introdução
O fluxo da maioria dos procedimentos do VBA é a execução do código linha
a linha, a partir do início. Pode surgir, porém, a necessidade da execução de
apenas alguns procedimentos, ou da execução um procedimento várias vezes
de acordo com condições preestabelecidas, casos em que utilizamos estruturas
de decisão e de repetição.

Neste capítulo, abordaremos justamente as diferentes instruções que permitem


formar estruturas de decisão e repetição. Por exemplo, a instrução GoTo,
que muda o fluxo do programa, Loop, que repete uma ação por um número
determinado de vezes, de acordo com uma condição, e instruções utilizadas
para retornar um valor de acordo com o resultado de um teste lógico, como as
instruções Select Case e If.

4.2. Estruturas de repetição
A instrução Loop é utilizada para repetir a execução de blocos de código VBA por
um número de vezes determinado previamente ou pelo valor de uma variável.
Existem três tipos de estruturas que podem ser criadas com a instrução Loop:

•• Do...Loop;

•• Do While...Loop;

•• Do Until...Loop.

162
Estruturas de decisão e repetição
4
4.2.1. Do...Loop

A estrutura Do...Loop pode utilizar a palavra-chave While para determinar


que um conjunto de instruções será executado enquanto uma condição for
verdadeira, ou a palavra-chave Until para determinar que um conjunto de
instruções será executado enquanto uma condição for falsa. A sintaxe dessa
estrutura é a seguinte:

Do {While | Until} Condição


Instruções
Exit Do
Instruções
Loop

Essa estrutura é dividida em duas partes:

•• Condição (opcional): Uma expressão numérica ou de sequência que seja


igual a True ou False (condições Null são tratadas como False);

•• Instruções: Uma instrução ou um conjunto de instruções que serão


executadas repetidamente enquanto Condição for igual a True, ou até que
isso aconteça.

Podemos utilizar a instrução Exit Do para fazer com que o fluxo da estrutura
Do...Loop seja interrompido, caso em que a execução continua a partir da
linha abaixo da instrução Loop. Nos casos de estruturas Do...Loop aninhadas,
uma instrução Exit Do transfere a execução para a estrutura que está no nível
imediatamente superior ao atual.

163
Excel 2016 VBA - Módulo I

4.2.1.1. Do While...Loop

A estrutura Do While...Loop permite fazer com que um conjunto de instruções


seja executado enquanto uma condição for verdadeira. Essa estrutura tem duas
sintaxes possíveis.

•• Condição testada no início do loop

Com essa sintaxe, exibida a seguir, as instruções são executadas apenas se


a condição for verdadeira (caso a condição seja falsa, a execução é iniciada a
partir da linha abaixo da instrução Loop):

Do While Condição
Instruções
Loop

Exemplo de um contador de 0 a 10:

Sub do_while()
Dim n As Byte
Do While n <= 10
MsgBox n
n = n + 1
Loop
End Sub

Considere a seguinte planilha, em que deve ser calculado o total de cursos


vendidos de Excel VBA:

164
Estruturas de decisão e repetição
4
O código a seguir descreve o procedimento que terá início na célula B2 e
executará as instruções dentro do laço Do While enquanto a célula ativa
estiver preenchida, ou seja, diferente de vazio. Em cada célula selecionada,
será verificado se o conteúdo é igual a Excel VBA e, em caso afirmativo, será
acrescido, na variável TOT, o valor correspondente, o qual está na célula da
coluna ao lado da célula ativa (coluna C). Depois de verificada a consistência e
independente da célula ativa ter o conteúdo Excel VBA ou não, será posicionado
na célula posterior (próxima linha) e repetirá o processo novamente.

O laço será encerrado somente quando a célula ativa (pertencente a coluna B)


for vazia. Observe o exemplo:

Sub Vendas_While()
Dim tot As Integer
Range("b2").Select
'faça enquanto célula ativa diferente de vazio
Do While ActiveCell <> ""
If ActiveCell = "Excel VBA" Then
tot = tot + ActiveCell.Offset(0, 1)
End If
ActiveCell.Offset(1, 0).Select
Loop
MsgBox "Total Vendido (Excel VBA) = " & tot
End Sub

Ao executarmos a macro, teremos o resultado a seguir:

165
Excel 2016 VBA - Módulo I

•• Condição testada após as instruções

A sintaxe a seguir executa todas as instruções e testa a condição. Enquanto a


condição for verdadeira, o loop será executado repetidamente:

Do
Instruções
Loop While Condição

No exemplo adiante, serão executados os comandos dentro da estrutura Do,


pelo menos uma vez. Isto porque primeiramente são executadas as instruções
antes de efetuar a comparação.

Sub do_while2()
Dim n As Byte
n = 20
Do
MsgBox n
n = n + 1
Loop While n <= 10
End Sub

A mensagem contendo o valor da variável n é exibida, sendo que o valor 1 será


acrescido na variável que ficará com o valor 21. Se a variável for menor ou igual
a 10, o procedimento não será satisfatório, encerrando, então, o laço.

4.2.1.2. Do Until...Loop

A estrutura Do Until...Loop executa instruções enquanto uma condição for falsa.


Da mesma forma que Do While...Loop, essa estrutura possui duas sintaxes
possíveis:

•• Condição testada no início do loop

Do Until Condição
Instruções
Loop

166
Estruturas de decisão e repetição
4
Assim como no exemplo anterior, que utiliza a estrutura Do...While, no exemplo
adiante será exibido um contador de 0 a 10. Neste caso, observamos a condição
Faça até o valor da variável > 10, ou seja, somente quando a condição for
satisfatória, o procedimento sairá do laço Do...Until.

Sub do_until()
Dim n As Byte
Do Until n > 10
MsgBox n
n = n + 1
Loop
End Sub

Utilizando o laço Do..Until, observe o exemplo para calcular o total de cursos


Excel VBA. Este exemplo foi demonstrado anteriormente com a utilização do
laço Do..While. Perceba que a condição do laço Do..Until é inversa à condição
utilizada no laço Do..while, porém, ambos os códigos terão o mesmo objetivo
e apresentarão o mesmo resultado.

Sub Vendas_Until()
Dim tot As Integer
Range("b2").Select
'faça até celula ativa for nula (vazia)
Do Until ActiveCell = ""
If ActiveCell = "Excel VBA" Then
tot = tot + ActiveCell.Offset(0, 1)
End If
ActiveCell.Offset(1, 0).Select
Loop
MsgBox "Total Vendido (Excel VBA) = " & tot
End Sub

167
Excel 2016 VBA - Módulo I

•• Condição testada após as instruções

Do
Instruções
Until Loop Condição

Para este caso, considere o seguinte exemplo:

Sub do_until2()
Dim n As Byte
n = 8
Do
MsgBox n
n = n + 1
Loop Until n > 10
End Sub

Observe que o loop continua fazendo o cálculo, até que o número seja maior
que 10.

4.2.2. While...Wend

A estrutura While...Wend funciona da mesma forma que a estrutura Do While...


Loop, com a exceção de que o teste da condição deve ser feito obrigatoriamente
no início, como na sintaxe a seguir:

While Condição
Instruções
Wend

Considere o seguinte exemplo:

Sub while_wend()
Dim n As Byte
While n <= 10
MsgBox n
n = n + 1
Wend
End Sub

168
Estruturas de decisão e repetição
4
A condição é verificada repetidamente e, sempre que for igual a True, as
instruções localizadas antes da instrução Wend serão executadas. Se a condição
for igual a False, a execução continuará a partir da linha abaixo da instrução
Wend.

Essa sintaxe é dividida em duas partes:

•• Condição (obrigatória): Uma expressão numérica ou de sequência que seja


igual a True ou False (condições Null são tratadas como False);

•• Instruções (opcional): Uma instrução ou um conjunto de instruções que


serão executadas repetidamente enquanto Condição for igual a True.

É possível aninhar loops While...Wend; cada instrução


Wend corresponde à instrução While mais recente.

4.2.3. For...Next e For Each...Next

O loop For...Next é utilizado para definir a quantidade de vezes que um conjunto


de instruções será repetido. Esse loop precisa de um contador (uma variável
numérica) com um valor inicial, um valor final e um passo, como na sintaxe a
seguir:

For Contador = Valor inicial To Valor final Step Valor passo


Instruções
Next

169
Excel 2016 VBA - Módulo I

Cada vez que o bloco de código entre as instruções For e Next é executado, o
contador, que é iniciado com o valor definido como inicial, é incrementado pelo
valor definido como passo. O loop é executado quantas vezes forem necessárias
para que o contador atinja seu valor final. Para exemplificar, se o valor inicial é
10, o valor final é 20 e o incremento é 2, as instruções do bloco entre o contador
e a instrução Next serão executadas 6 vezes:

Sub for_next()
Dim n As Byte
For n = 10 To 20 Step 2
MsgBox n
Next
End Sub

O valor inicial pode ser qualquer número, negativo


ou positivo, inclusive 0, e o passo assume o valor
1 caso não seja especificado um valor diferente.

Para contar o total vendido do curso Excel VBA, considere o exemplo a seguir,
com a utilização do laço For...Next:

Sub Vendas_For()
Dim tot, lin As Integer
Range("b2").Select
'executar da linha 2 até 10
For lin = 2 To 10
Cells(lin, 2).Select
If ActiveCell = "Excel VBA" Then
tot = tot + ActiveCell.Offset(0, 1)
End If
Next
MsgBox "Total Vendido (Excel VBA) = " & tot
End Sub

170
Estruturas de decisão e repetição
4

Foi utilizada a variável lin dentro do comando Cells para


efetuar o deslocamento das linhas a cada passagem
pelo laço For..Next.

O loop For Each...Next funciona da mesma forma que o loop For...Next, porém,
o número de vezes que as instruções serão executadas é determinado pelo
número de elementos de uma matriz ou coleção (como uma coleção de pastas
de trabalho, células ou planilhas). A sintaxe desse loop é a seguinte:

For Each Elemento In Grupo


Instruções
Exit For
Instruções
Next

Em que:

•• Elemento (obrigatória): Variável que fará a iteração dos elementos de uma


matriz, caso em que deve ser obrigatoriamente do tipo Variant; ou coleção,
caso em que pode ser uma variável de objeto genérica ou específica ou do
tipo Variant;

•• Grupo (obrigatória): O nome de uma matriz de objetos que não seja uma
matriz de tipos definidos pelo usuário; ou o nome de uma coleção;

•• Instruções (opcional): Uma instrução (ou um conjunto de instruções) para


ser executada em cada item de Grupo.

171
Excel 2016 VBA - Módulo I

A instrução Exit For pode ser utilizada para interromper um loop em qualquer
ponto (normalmente é utilizada após a verificação de alguma condição), fazendo
com que a execução continue a partir da linha abaixo de Next.

A instrução For...Each...Next não pode ser empregada com


uma matriz de tipos definidos pelo usuário. Isto porque, ao
utilizarmos matrizes, Elemento deve ser uma variável do
tipo Variant, a qual não pode conter um tipo definido pelo
usuário.

Quando o loop é inserido, todas as instruções do bloco são executadas para o


primeiro elemento de Grupo, em seguida, para o segundo elemento e, assim,
sucessivamente. Quando não houver mais elementos em Grupo, a execução
sai do loop e continua a partir da instrução abaixo da instrução Next. Vale
lembrar que o bloco For...Each só é inserido se Grupo contiver pelo menos um
elemento.

É possível aninhar loops For...Each...Next, mas cada elemento do loop deve ser
exclusivo.

Caso a instrução Next não especifique Elemento, a execução das instruções


continua, como se Elemento estivesse incluído.

Um erro é exibido quando uma instrução Next é


encontrada antes da instrução For correspondente.

172
Estruturas de decisão e repetição
4
No exemplo adiante, a variável denominada celula percorrerá a região (grupo)
de células, de B2 à B10, verificando se o conteúdo contido na célula é a palavra
Excel VBA. Caso a condição seja atendida, a cor interior da célula será formatada
para vermelho. Podemos usar a mesma planilha dos exemplos anteriores.

Sub for_each()
Dim celula As Object
For Each celula In Range("B2:B10")
If celula.Value = "Excel VBA" Then
celula.Interior.ColorIndex = 3
End If
Next
End Sub

Veja o resultado:

Observe o exemplo para alterar a visualização do zoom em todas as planilhas


do arquivo. O objeto a ser percorrido, neste caso, é o Worksheets (planilhas).

Sub altera_zoom()
Dim plan As Object
'variável plan irá percorrer todas as planilhas
For Each plan In Worksheets
plan.Select
ActiveWindow.Zoom = 150
Next
End Sub

173
Excel 2016 VBA - Módulo I

4.3. GoTo
A instrução GoTo faz com que uma instrução especificada por um rótulo de
linha seja executada, ignorando outras possíveis instruções no fluxo normal
dos procedimentos. Podemos especificar rótulos de linha para quaisquer linhas
do código, bastando inserir um nome alfanumérico iniciado por uma letra e
terminado em dois-pontos (:).

No exemplo de código adiante, quando uma condição for atendida, a instrução


GoTo será utilizada para executar a instrução identificada com o rótulo de linha
Errologin:

Sub GoToTeste()
Dim UserName as String
UserName = InputBox ("Digite seu Nome: ")
If UserName <> "Juliano Corinto" Then
GoTo Errologin
Endif
MsgBox ("Olá, Juliano!")
'...[seqüência do código]...
Exit Sub
Errologin:
MsgBox "Acesso negado. Apenas Juliano Corinto tem permissão
de acesso."
End Sub

A função InputBox permite que o usuário digite um nome, que será verificado
em seguida. Caso esse nome seja diferente de Juliano Corinto, a execução vai
para o ponto identificado pelo rótulo de linha Errologin:, que exibe a mensagem
do segundo comando MsgBox. Caso o nome digitado seja Juliano Corinto, a
mensagem do primeiro comando MsgBox será exibida, o código terá sequência
e será finalizado na instrução Exit Sub.

É importante notar que a leitura e interpretação de um código


que possua muitas instruções GoTo pode ser difícil. O VBA
oferece outras instruções mais adequadas e estruturadas para
alterar o fluxo de execução dos procedimentos. É recomendável
que a instrução GoTo seja utilizada apenas quando necessário
(no rastreamento de erros, por exemplo).

174
Estruturas de decisão e repetição
4
4.4. Estruturas de decisão
Podemos criar quatro tipos de estruturas de decisão com a instrução If:

•• If...Then;

•• If...Then...Else;

•• If aninhado;

•• If combinado com os operadores And e Or.

4.4.1. If...Then

A estrutura If...Then é utilizada quando é necessário executar um procedimento


caso uma condição seja verdadeira. Se a condição for falsa, nenhum procedimento
é executado. A seguir, vemos um exemplo da utilização da estrutura If...Then:

If Condição Then Instruções

Essa estrutura é dividida em duas partes:

•• Condição (obrigatória): Expressão que será avaliada como True ou False.


O valor será considerado como True caso a expressão seja verdadeira, ou
False caso a condição seja falsa ou nula;

•• Instruções: Uma instrução (ou várias, separadas por dois-pontos) que


será executada caso a condição retorne um valor True. As instruções
são obrigatórias na forma de uma linha que não possua a cláusula Else e
opcionais na forma de bloco.

175
Excel 2016 VBA - Módulo I

Por exemplo:

Sub If_Then()
Dim n As Integer
n = 5
If n < 10 Then MsgBox "menor que 10": InputBox ("Digite outro
Número")
End Sub

Podemos inserir várias instruções em uma única linha de


código, logo após a palavra-chave Then, separadas por
dois-pontos (:), como em If Condição Then Instrução1 :
Instrução2 : Instução3, caso em que a instrução End If não
é utilizada.

O bloco de uma estrutura If...Then sempre é iniciado com If e encerrado com


End If. Quando a condição inserida for verdadeira, todas as instruções entre
essas duas cláusulas serão executadas. Caso a condição seja falsa, o código
passa a ser executado a partir da linha abaixo da cláusula End If, e todas as
instruções anteriores são ignoradas. A sintaxe utilizada é a seguinte:

If Condição Then
Instruções caso a condição seja verdadeira
End If

O próximo exemplo possui uma condição que verifica se a variável Prc é maior
que 15, caso em que seu valor será inserido na célula A5:

Sub EstPreco()
Dim Prc As Integer
Prc = InputBox("Digite o valor do produto: ")
If Prc > 15 Then
Range("A5").Value = Prc
End If
Msgbox "Até Breve!"
End Sub

176
Estruturas de decisão e repetição
4
Esse código, quando executado, exibirá uma InputBox, como na próxima
imagem. Ao inserirmos qualquer valor maior que 15 e pressionarmos OK,
faremos com que a condição seja verdadeira, e como resultado a célula A5 será
preenchida com o valor digitado. Caso seja inserido um valor menor que 15, a
célula permanecerá em branco, ou seja, nenhuma ação será executada.

Como o comando Msgbox está após a instrução End If, independente de a


condição ser verdadeira ou não, será exibida a mensagem "Até Breve!".

É possível estruturar a função If em uma única linha de código. Sendo


assim, não utilizamos a cláusula End If.

If Prc > 15 Then Range("A5").Value = Prc

Podemos inserir vários procedimentos para serem executados caso a condição


seja verdadeira. Para isso, devemos acrescentar uma condição por linha,
finalizando o bloco com a instrução End If.

177
Excel 2016 VBA - Módulo I

O próximo exemplo contém instruções para inserir o valor da variável Prc na


célula A5 e aplicar o estilo itálico a essa célula. Depois deverá somar o valor 50
na variável Prc e inserir este resultado na célula A6, alterar o tamanho da fonte
dessa célula para 20 e exibir uma mensagem informando que a operação foi
executada. Ao todo, são cinco instruções, uma em cada linha de código entre
as instruções If e End If.

Sub EstPreco()
Dim Prc As Integer
Prc = InputBox ("Digite o valor do produto: ")
If Prc > 15 Then
Range("A5").Value = Prc
Range("A5").Font.Italic = True
Range("A6") = Prc + 50
Range("A6").Font.Size = 20
MsgBox "Parabéns! Operação realizada com êxito."
End If
End Sub

A próxima imagem exibe o resultado desse código caso o valor inserido pelo
usuário seja 25. A célula A5 é preenchida com o número 25, a célula A6 com 75,
que é o resultado de 25+50, e exibe a mensagem informando que a operação
foi realizada:

178
Estruturas de decisão e repetição
4
4.4.2. If...Then...Else

A estrutura If...Then...Else permite inserir não apenas instruções para serem


executadas caso as condições sejam verdadeiras, mas também instruções para
serem executadas caso as condições sejam falsas. O bloco dessa estrutura
também é iniciado com If e encerrado com End If, mas possui uma cláusula
Else após as instruções para a condição verdadeira. Todas as instruções que
forem inseridas entre as cláusulas Else e End If serão executadas apenas se a
condição for falsa.

A estrutura desse bloco é a seguinte:

If Condição Then
Instruções para a condição verdadeira
Else
Instruções para a condição falsa
End If

A estrutura If...Then...Else é dividida em três partes:

•• Condição (obrigatória): Expressão que será avaliada como True ou False.


O valor será considerado como True caso a expressão seja verdadeira, ou
False caso a condição seja falsa ou nula;

•• Instruções para a condição verdadeira: Uma instrução (ou várias, separadas


por dois-pontos) que será executada caso a condição retorne um valor True;

•• Instruções para a condição falsa: Uma instrução (ou várias, separadas por
dois-pontos) que será executada caso a condição retorne um valor False.

Para exemplificar a aplicação dessa estrutura, utilizaremos a função MsgBox


para criar uma caixa de texto com os botões OK e Cancelar. De acordo com o
botão escolhido pelo usuário, uma ação diferente será executada: o botão OK
deve excluir todas as células e os dados de uma planilha, e o botão Cancelar
deve finalizar o procedimento sem executar essa ação, exibindo apenas uma
mensagem para o usuário.

179
Excel 2016 VBA - Módulo I

O procedimento original para excluir todas as células de uma planilha seria o


seguinte:

Sub Apagar()
Cells.Delete
End Sub

O código exibido a seguir cria a variável Decisao, que assume um valor de


acordo com a resposta do usuário na função MsgBox. Esse valor é utilizado na
estrutura If...Then...Else:

Sub Apagar()
Dim Decisao As String
Decisao = MsgBox ("Esta operação apagará todas as células e
dados da planilha. Deseja prosseguir?", vbOKCancel +
vbCritical, "Alerta")
If Decisao = vbOK Then
Cells.Delete
MsgBox "Células e dados apagados."
Else
MsgBox "A operação foi anulada."
End If
End Sub

A função MsgBox possui vbOKCancel + vbCritical como


segundo argumento para determinar, respectivamente, a
exibição dos botões OK e Cancelar e a exibição do ícone de
mensagem crítica.

Quando esse procedimento for executado, a mensagem será exibida, como


ilustra a próxima imagem:

180
Estruturas de decisão e repetição
4
Caso o usuário clique no botão OK, a variável Decisao armazenará o resultado
vbOK (ou 1), o que fará com que a condição Decisao = vbOK seja verdadeira,
caso em que todas as células e dados da planilha serão excluídos e que a
mensagem Células e dados apagados será exibida.

Se o usuário clicar no botão Cancelar, a condição será falsa, o que fará apenas
com que a mensagem A operação foi anulada seja exibida.

Podemos utilizar a função Msgbox sempre que


quisermos obter o valor do botão pressionado pelo
usuário. Neste caso, utilizamos uma variável que
receberá esta informação.

181
Excel 2016 VBA - Módulo I

•• ElseIf

Podemos utilizar a cláusula ElseIf para inserirmos várias condições para serem
testadas. Neste caso, o código verifica cada condição e executa as instruções
da primeira condição cujo resultado seja True. Caso nenhuma das condições
seja verdadeira, ele executa a instrução (ou conjunto de instruções) abaixo da
cláusula Else. Um bloco com ElseIf utiliza a seguinte estrutura:

If Condição1 Then
Instruções para o caso de Condição1=True
ElseIf Condição2 Then
Instruções para o caso de If=False e ElseIf=True
Else
Instruções para o caso de todas as condições anteriores
=False
End If

Em que:

•• Condição1 (obrigatória): Expressão que será avaliada como True ou False.


O valor será considerado como True caso a expressão seja verdadeira, ou
False caso a condição seja falsa ou nula;

•• Instruções para o caso de Condição1=True: Uma instrução (ou várias,


separadas por dois-pontos) que será executada caso a Condição1 retorne
um valor True. As instruções são obrigatórias na forma de uma linha que
não possua a cláusula Else e opcionais na forma de bloco;

•• Condição2 (opcional): Igual a Condição1;

•• Instruções para If=False e ElseIf=True (opcional): Uma instrução (ou


várias, separadas por dois-pontos) que será executada caso a Condição1
retorne um valor False e a Condição2 retorne um valor True;

•• Instruções para o caso de todas as condições anteriores serem False


(opcional): Uma instrução (ou várias, separadas por dois-pontos) que será
executada caso nenhuma das condições anteriores retorne um valor True.

182
Estruturas de decisão e repetição
4
Considere o seguinte exemplo:

Sub If_Elseif()
Dim pagto As String
pagto = Ucase(InputBox("Indique a forma de pagamento"))
If pagto = "D" Then
MsgBox "Dinheiro"
ElseIf pagto = "C" Then
MsgBox "Cheque"
ElseIf pagto = "CC" Then
MsgBox "Cartão de Crédito"
Else
MsgBox "Pagamento não definido. Cancelar venda!"
End If
End Sub

Será exibida a mensagem de acordo com a sigla inserida na caixa de texto


(InputBox). Caso o usuário digite algo diferente das siglas (D, C ou CC), será
executado o comando após a instrução Else.

É possível inserir quantas cláusulas ElseIf forem


necessárias, mas apenas entre as instruções If e Else.

Neste exemplo, temos apenas como condição válida os valores: D, C ou CC (em


maiúsculo). Porém, caso fosse inserido, na Caixa de Entrada, um destes itens
em letra minúscula, seriam executadas as ações dentro do Else, visto que todas
as condições se referenciam às siglas digitadas em letras maiúsculas e o VBA
diferencia letras maiúsculas de letras minúsculas.

183
Excel 2016 VBA - Módulo I

Para resolver este problema, foi utilizada a função UCase(), que converte os
caracteres em maiúsculo. Observe a linha de código:

pagto = Ucase(InputBox("Indique a forma de pagamento"))

Caso o usuário digite, na Caixa de Entrada, o valor cc (em letras minúsculas), a


função irá converter este valor para letras maiúsculas resultando em CC. Neste
caso, a variável pagto terá o valor em maiúsculo.

Lembrando que o programa não irá alterar os caracteres digitados dentro da


Caixa de Entrada, e sim efetuar o comparativo a seguir:

•• O valor digitado na Caixa de Entrada convertido em letras maiúsculas é


igual a CC?

•• O valor cc convertido em letras maiúsculas é igual a CC?

4.4.3. If aninhado

É possível aninhar blocos If, ou seja, inserir um bloco If dentro de outro, como
exibe a estrutura a seguir. É importante notar que todos os blocos If devem ser
fechados com a instrução End If:

If Condição1 Then
Instruções para o caso de Condição1= verdadeiro
If Condição2 Then
Instruções para o caso de Condição2=verdadeiro
End If
End If

184
Estruturas de decisão e repetição
4
Observe o exemplo a seguir, que exibirá ao usuário a mensagem "Dar desconto
de 10%" caso o pagamento seja à vista (se pressionado o botão "SIM" na função
MsgBox) e o tipo de pagamento seja em dinheiro (se digitada a palavra "Dinheiro"
na caixa de texto InputBox):

Sub If_Aninhado()
Dim tipo As String
Dim pagto As String
tipo = MsgBox("Pagamento à Vista?", vbYesNo)
pagto = InputBox("Indique a forma de pagamento")
If tipo = vbYes Then
If ucase(pagto) = "DINHEIRO" Then
MsgBox "Dar desconto de 10%"
End If
End If
End Sub

Caso a resposta obtida na função MsgBox seja "SIM", será executada a segunda
instrução If.

Devemos utilizar o recurso de indentação de comandos


(deslocamento à direita com a tecla TAB) a fim de
mostrar claramente os comandos que estão dentro
de uma instrução If.

185
Excel 2016 VBA - Módulo I

4.4.4. Inserindo várias condições com And e Or

Por meio dos operadores And e Or, podemos executar uma ou mais instruções
a partir do teste de várias condições.

O operador And constrói uma conjunção lógica, ou seja, para que o resultado
seja True, todas as condições devem ser verdadeiras (caso qualquer uma delas
seja falsa, o resultado é False). Para utilizar o operador And, este deve ser
inserido entre as condições que serão testadas, como exibe a estrutura a seguir:

If Condição1 And Condição2 And Condição3...Then


Instruções caso todas as condições sejam verdadeiras
Else
Instruções caso uma ou mais condições seja falsa
End If

Considere o exemplo adiante:

Sub Operador_And()
Dim num As Byte
num = 10
If num > 5 And num < 15 Then
MsgBox "Valor dentro do intervalo!"
End If
End Sub

O conteúdo da variável Num é 10, sendo as condições:

•• Num > 5 = verdadeiro, pois 10 é maior que 5;

•• Num < 15 = verdadeiro, pois 10 é menor que 15.

Como as duas condições são satisfatórias (verdadeiras), será executado o


comando dentro da instrução If.

186
Estruturas de decisão e repetição
4
O operador Or constrói uma disjunção lógica, ou seja, para que o resultado seja
True, basta que uma das condições seja verdadeira (caso todas elas sejam falsas,
o resultado é False). O operador Or deve ser inserido entre as condições que
serão testadas, da mesma forma que o operador And, como exibe a estrutura
a seguir:

If Condição1 Or Condição2 Or Condição3...Then


Instruções caso uma ou mais das condições seja True
Else
Instruções caso todas as condições sejam False
End If

Observe o exemplo:

Sub Operador_Or()
Dim valor As Byte
Dim pagto As String
valor = 50
pagto = "ato"
If valor > 200 Or pagto = "ato" Then
MsgBox "Fornecer desconto de 15%"
End If
End Sub

Neste caso, a mensagem será exibida se o prazo para pagamento for "Ato" (à
vista) ou o valor da compra for superior a 200, ou seja, com a utilização do
operador Or, a instrução é considerada verdadeira se uma ou outra condição
estiver satisfatória.

Em outro exemplo, devemos inserir na célula B6 o status do aluno, de acordo


com a média e o percentual de faltas, considerando que o curso possui o total
de 80 aulas. Observe as condições:

•• Status "reprovado" se a média final for inferior a 5 OU o total de faltas for


maior do que 25% do total de aulas;

•• Status "aprovado" se a média final for superior ou igual a 7 E o total de


faltas for menor ou igual a 25% do total de aulas;

•• Status "recuperação" se a média final for entre 5 e 6,9 e o total de faltas


por menor ou igual a 25%.

187
Excel 2016 VBA - Módulo I

Sub resultado()
Dim media as single, perc_falta As Double
media = Range("b3")
perc_falta = Range("b4") / 80
'reprovado: nota ruim OU muita falta
If media < 5 Or perc_falta > 0.25 Then
With Range("b6")
.Value = "Reprovado"
.Interior.ColorIndex = 3
.Font.ColorIndex = 2
End With
Else
'aprovado: boa nota E pouca falta
Range("b6").Interior.ColorIndex = 50
If media >= 7 And perc_falta <= 0.25 Then
Range("b6") = "Aprovado"
'recuperação: se não satisfez nenhuma das condições
acima
Else
Range("b6") = "Recuperação"
End If
End If
End Sub

Na figura a seguir, o status exibido foi "Reprovado", pois o total de faltas foi
superior a 25% do total de 80 aulas:

188
Estruturas de decisão e repetição
4
4.4.5. Select Case

A instrução Select Case permite criar um fluxo de tomada de decisão em que


uma única expressão pode ser comparada com várias outras expressões. São
executadas as instruções correspondentes ao Case que coincidir com o valor
da expressão. A instrução Select Case utiliza a estrutura a seguir:

Select Case expressão


Case expressão1
Instruções 1
Case expressão 2
Instruções 2
Case Else
Instruções Else
End Select

O exemplo seguinte declara a variável Modelo, cria uma InputBox para que o
usuário defina seu valor e a compara com quatro valores utilizando a instrução
Select Case:

Sub Fabricante()
Dim Modelo As String
Modelo = InputBox("Digite o nome do modelo de carro: ")
Select Case Ucase(Modelo)
Case "COROLLA"
MsgBox "A fabricante deste carro é a Toyota."
Case "CIVIC"
MsgBox "A fabricante deste carro é a Honda."
Case "FUSION"
MsgBox "A fabricante deste carro é a Ford."
Case Else
MsgBox "Não é possível identificar a fabricante."
End Select
End Sub

189
Excel 2016 VBA - Módulo I

Esse exemplo compara a expressão Modelo (um nome de carro inserido na


InputBox pelo usuário) e os Cases (condições). Quando a instrução encontrar
um Case que coincida com a expressão Modelo, exibirá uma MsgBox com o
nome do fabricante do veículo.

Se nenhum Case coincidir com a expressão, serão executados os comandos


contidos dentro da instrução Case Else. Neste exemplo, é exibida uma MsgBox
informando que não foi possível identificar o fabricante. Observe a imagem a
seguir, que ilustra a MsgBox exibida caso o usuário digite Corolla na InputBox:

Podemos comparar a expressão com faixas de valor,


utilizando a palavra-chave To entre os valores inicial e
final, por exemplo, 60 To 65 para indicar um intervalo
entre 60 e 65 (incluindo os extremos).

Observe o exemplo adiante, que determina a exibição da MsgBox de acordo


com a faixa de valor inserida pelo usuário:

Sub Estoque()
Dim qtde_estoque As Integer
estoque = InputBox("Qual a quantidade")
Select Case estoque
Case 0 To 10
MsgBox "Insuficiente"
Case 11 To 30
MsgBox "Atenção"
Case Is > 30
MsgBox "Ok"
End Select
End Sub

190
Estruturas de decisão e repetição
4
4.5. Tratamento de erros
Se desejarmos trabalhar com VBA, uma das coisas mais importantes que
devemos ter em mente é a probabilidade de ocorrerem erros. Dentre os erros
possíveis, existem dois tipos muitos comuns, que são os erros de programação
e os de tempo de execução.

Por mais que, no momento de desenvolver um aplicativo, tenhamos removido


as falhas do código e criado uma lógica sem defeitos, visando prevenir um
mau funcionamento, ainda assim o código pode travar devido a um problema
operacional. Em muitos casos, é exibido nada além de uma mensagem que
nem sempre traz ajuda para o usuário solucionar o erro.

Como último recurso, podemos usar um código que impede que as mensagens
de erro do Excel sejam exibidas, com o intuito de prever e lidar com os erros
antes que uma delas surja. Será fácil lidar com erros de programas bem escritos
usando as ferramentas de identificação de erros que o próprio VBA disponibiliza.

4.5.1. Tipos de erros

Dado o primeiro passo, que é saber das chances existentes de ocorrerem erros
e da necessidade de corrigi-los para que se obtenha o resultado esperado, o
segundo passo é conhecer os tipos de erros mais frequentes.

Alguns tipos de erros são mais fáceis de serem corrigidos do que outros. Erros
de sintaxe, por exemplo, podem ser facilmente impedidos com o recurso de
verificação de sintaxe, o qual exibe uma mensagem informando o erro quando
o cursor é posicionado em outra linha. Os erros de tempo de execução, que
ocorrem quando uma operação não pode ser executada, como excluir uma
célula de uma planilha protegida, também são impedidos sem dificuldades.

191
Excel 2016 VBA - Módulo I

Porém, de solução mais complexa do que erros de sintaxe e de tempo de


execução, são os de lógica. Isso porque é difícil identificar a causa de um
resultado inesperado quando todos os comandos são bem executados. Um
erro desse tipo ocorre, por exemplo, quando digitamos o sinal >= (maior ou
igual a) onde deveria estar o sinal > (maior que) para inserir uma condição em
uma estrutura condicional. Por mais simples que possa parecer, algumas vezes,
perdemos muito tempo até encontrar um erro assim e, em alguns casos, pode
ser que se faça necessário refazer todo um projeto.

Algumas práticas de grande valia, como inserir


comentários no código e fazer recuo nas linhas,
garantem mais agilidade no momento da manutenção
do código.

4.5.2. Tratamento em tempo de execução

Um erro pode ser tratado até mesmo enquanto o código é executado, desde que
sua presença tenha sido percebida e, portanto, tenha sido feita uma configuração
no código que permite seu tratamento.

A instrução On Error é aplicada exatamente nesses casos, pois ela posiciona


no procedimento e põe em funcionamento uma rotina de tratamento de erro.

Da mesma forma que ativa, a instrução On Error


também pode ser usada para desativar uma rotina de
tratamento de erro.

As sintaxes da instrução On Error são três. A seguir, citamos cada uma delas,
assim como a respectiva descrição.

192
Estruturas de decisão e repetição
4
4.5.2.1. On Error GoTo line

Nesta sintaxe, o argumento line é obrigatório e determina a linha onde deve ser
iniciada a rotina de tratamento. Podemos definir esse argumento como qualquer
rótulo ou número de linha. Seu funcionamento se dá quando ocorre um erro
em tempo de execução e o controle desvia para line, iniciando o tratamento do
erro. Para que não ocorra erro em tempo de compilação, devemos atentar para
o fato de que é necessário especificar a line no mesmo procedimento onde se
encontra a instrução On Error.

No exemplo a seguir, foi criada a variável idade para receber um valor numérico.
Será solicitada a inserção de um valor dentro de uma caixa de entrada que irá
atribuir o valor digitado dentro da variável. Sabemos que uma variável do tipo
Byte não pode armazenar valores do tipo texto (string) e que esse tipo de
variável aceita somente valores numéricos no intervalo de 0 a 255.

Sub exemplo_erro()
Dim idade As Byte
idade = InputBox("Entre com a idade")
MsgBox "A idade é " & idade
End Sub

Se na caixa de texto for digitado um valor numérico, ele será exibido em uma
caixa de mensagem. Caso seja digitado um texto, ocorrerá um erro de execução
na macro, visto que a variável é do tipo numérica.

193
Excel 2016 VBA - Módulo I

Ao pressionar o botão OK, surgirá o seguinte erro:

Poderemos, então, utilizar o tratamento de erros. Nesta situação, caso ocorra


qualquer tipo de erro, serão executados os comandos contidos dentro do rótulo
Tratamento.

Para On Error GoTo Tratamento, em caso de erros, o processo seguirá para


a instrução Tratamento, que, por sua vez, contém o comando para a exibição
de uma mensagem.

Sub exemplo_erro()
On Error GoTo Tratamento
Dim idade As Byte
Idade = InputBox("Entre com a idade")
MsgBox "A idade é " & idade
Exit Sub
Tratamento:
MsgBox "Valor Inválido"
End Sub

194
Estruturas de decisão e repetição
4
Caso não ocorram erros durante a execução, serão executados todos os
comandos, inclusive o conteúdo de Tratamento, visto que as linhas de
programação estão sendo executadas em cascata. Dessa forma, para que não
seja exibida a mensagem Valor Inválido mesmo quando for digitado um valor
numérico, é necessária a inserção da instrução Exit Sub na linha anterior à
rotina Tratamento.

Informação digitada.

Comando contido dentro


da rotina Tratamento.

É possível inserir quantas linhas de comandos forem


necessárias dentro da rotina de tratamento de erros.

195
Excel 2016 VBA - Módulo I

4.5.2.2. On Error Resume Next


Esta sintaxe faz com que o controle passe para a instrução seguinte em caso
de erro de tempo de execução, e, assim, a execução continua. Para acessar
objetos, este será o tipo de tratamento mais apropriado.

O exemplo a seguir consiste em inserir, nas linhas de uma coluna, o nome das
barras de ferramentas contidas no Excel. Em caso de erros durante a execução,
o objeto em questão será ignorado e o próximo objeto será executado (barra
de ferramentas):

Sub Nome_Barras()
On Error Resume Next
Dim barra As Object
Range("a1") = "Nomes"
Range("a2").Select
For Each barra In CommandBars
ActiveCell = barra.Name
ActiveCell.Offset(1, 0).Select
Next
End Sub

4.5.2.3. On Error GoTo 0


Se utilizarmos esta sintaxe, todo manipulador de erro que estiver ativo no
procedimento atual será desativado.

Sub exemplo_erro1()
On Error GoTo 0
Dim idade As Byte
idade = InputBox("Entre com a idade")
MsgBox "A idade é " & idade
Exit Sub
Tratamento:
MsgBox "Valor Inválido"
End Sub

É também por meio da utilização da instrução On Error que


impedimos que as mensagens de erro sejam exibidas no
momento da execução de uma macro.

196
Estruturas de decisão e repetição
4
Rotinas de tratamento de erros são seções identificadas por um rótulo ou número
de linha, e não um procedimento Sub ou Function. Elas identificam a razão do
erro por meio do valor na propriedade Number do objeto Err. Então, salvam e
testam os valores relevantes, o que deve ser feito antes da ocorrência de outro
erro ou da execução de um procedimento que cause um erro. Os valores de
propriedade no objeto Err demonstram apenas o último erro que ocorreu. Em
Err.Description está presente a mensagem de erro relacionada a Err.Number.

Para cada erro que surge enquanto um procedimento é executado, existe


um código correspondente. A propriedade Number da instrução Err permite
identificar e tratar erros, assim como a instrução On Error.

Suponhamos que seja necessária a inserção da quantidade de um produto


dentro de uma caixa de texto e tenha sido criada uma variável do tipo Byte.
Nesse caso, a informação não poderá ser do tipo string, nem possuir um valor
acima de 255.

Sub quantidade()
On Error GoTo Tratar
Dim qtde As Byte
qtde = InputBox("Digite a quantidade")
If qtde < 10 Then
MsgBox "Estoque Insuficiente"
End If
Exit Sub
Tratar:
If Err.Number = 6 Then
MsgBox "Valor Excedido. Máximo = 255"
ElseIf Err.Number = 13 Then
MsgBox "Digite um valor numérico"
End If
End Sub

4.5.3. Erros interceptáveis

Em algumas situações, podemos nos deparar com erros interceptáveis. Eles


ocorrem durante a execução de um aplicativo ou durante o desenvolvimento ou
tempo de compilação. Para testar e responder a erros interceptáveis, devemos
usar a instrução On Error ou o objeto Err.

197
Excel 2016 VBA - Módulo I

A seguir, temos uma tabela com os números de erros interceptáveis. Como


podemos notar, essa lista pula alguns números. Dentre os números pulados, os
de 1 até 1000 serão usados futuramente pelo Visual Basic.

Código do
Mensagem
erro
3 Retornar sem GoSub.
5 Chamada de procedimento inválida.
6 Estouro.
7 Sem memória.
9 Subscrito fora do intervalo.
10 Esta matriz está fixa ou temporariamente bloqueada.
11 Divisão por zero.
13 Tipos incompatíveis.
14 Sem espaço para sequência de caracteres.
16 Expressão muito complexa.
17 Não é possível executar a operação solicitada.
18 Ocorreu uma interrupção do usuário.
20 Continuar sem erro.
28 Continuar sem erro.
35 Sub, Function ou Property não definido.
Clientes de aplicativo da DLL ou de recurso de código em
47
excesso.
48 Erro ao carregar recurso de código ou DLL.
49 Convenção de chamada de recurso de código ou DLL incorreta.
51 Erro interno.
52 Nome ou número de arquivo incorreto.
53 Arquivo não encontrado.
54 Modo de arquivo incorreto.
55 Arquivo já aberto.
57 Erro de E/S do dispositivo.
58 O arquivo já existe.
59 Comprimento de registro incorreto.
61 Disco cheio.

198
Estruturas de decisão e repetição
4
Código do
Mensagem
erro
62 Entrada após fim de arquivo.
63 Número de registro incorreto.
67 Arquivos em excesso.
68 Dispositivo não disponível.
70 Permissão negada.
71 Disco não está pronto.
74 Não é possível renomear com unidade diferente.
75 Erro de acesso ao Caminho/Arquivo.
76 Caminho não encontrado.
91 Variável Object ou variável de bloco With não definida.
92 For Loop não inicializado.
93 Sequência de caracteres padrão inválida.
94 Uso de Null inválido.
Não é possível chamar o procedimento Friend ou um objeto
97
que não seja uma ocorrência da classe de definição.
Uma chamada de propriedade ou método não pode incluir
98 uma referência a um objeto particular, tanto como um
argumento ou como um valor de retorno.
298 O recurso ou DLL do sistema não pôde ser carregado.
Não é possível usar nomes de dispositivo de caracteres em
320
nomes de arquivo especificados.
321 Formato de arquivo inválido.
322 Não é possível criar o arquivo temporário necessário.
325 Formato inválido no arquivo de recursos.
327 Valor de dados nomeado não encontrado.
328 Parâmetro não permitido; não é possível gravar matrizes.
335 Não foi possível acessar o Registro do sistema.
336 Componente não registrado corretamente.
337 Componente não encontrado.
338 O componente não foi executado corretamente.
360 Objeto já carregado.
361 Não é possível carregar ou descarregar este objeto.

199
Excel 2016 VBA - Módulo I

Código do
Mensagem
erro
363 Controle especificado não encontrado.
364 O objeto foi descarregado.
365 Não é possível descarregar dentro deste contexto.
O arquivo especificado está desatualizado. Este programa
368
requer uma versão mais recente.
O objeto especificado não pode ser usado como um formulário
371
de proprietário para Show.
380 Valor de propriedade inválido.
381 Índice de matriz de propriedades inválido.
382 Property Set não pode ser executado em tempo de execução.
Property Set não pode ser usado com uma propriedade
383
somente leitura.
385 É necessário o índice de matriz de propriedades.
387 Property Set não permitido.
393 Property Get não pode ser executado em tempo de execução.
Property Get não pode ser executado na propriedade
394
somente gravação.
O formulário já está sendo exibido; não é possível exibir de
400
forma modal.
402 O código deve fechar primeiro o formulário modal superior.
419 Permissão para usar o objeto negada.
422 Propriedade não encontrada.
423 Propriedade ou método não encontrado.
424 Objeto obrigatório.
425 Uso inválido de objeto.
O componente não pode criar objeto ou referência de retorno
429
para este objeto.
430 A classe não suporta Automação.
Nome do arquivo ou nome da classe não encontrado durante
432
a operação de Automação.
438 O objeto não suporta esta propriedade ou método.
440 Erro de automação.

200
Estruturas de decisão e repetição
4
Código do
Mensagem
erro
A conexão com a biblioteca de tipos ou biblioteca de objetos
442
para o processo remoto foi perdida.
443 O objeto de automação não possui um valor padrão.
445 O objeto não suporta esta ação.
446 O objeto não suporta argumentos nomeados.
447 O objeto não aceita a definição de localidade atual.
448 Argumento nomeado não encontrado.
Argumento não opcional ou atribuição de propriedade
449
inválida.
Número incorreto de argumentos ou atribuição de propriedade
450
inválida.
451 O objeto não é uma coleção.
452 Ordinal inválido.
453 Código de especificado não encontrado.
454 Recurso de código não encontrado.
455 Erro de bloqueio do recurso de código.
457 Esta chave já está associada a um elemento desta coleção.
458 A variável usa um tipo não suportado no Visual Basic.
459 Este componente não suporta o conjunto de eventos.
460 Formato inválido da Área de transferência.
461 Método ou membro de dados não encontrado.
A máquina do servidor remoto não existe ou não está
462
disponível.
463 Classe não registrada na máquina local.
480 Não é possível criar uma imagem AutoRedraw.
481 Figura inválida.
482 Erro na impressora.
A propriedade especificada não é suportada pelo driver da
483
impressora.
Problemas ao obter informações da impressora a partir do
484 sistema. Certifique-se de que a impressora esteja configurada
corretamente.

201
Excel 2016 VBA - Módulo I

Código do
Mensagem
erro
485 Tipo de figura inválido.
Não é possível imprimir a imagem do formulário neste tipo
486
de impressora.
520 Não é possível esvaziar a Área de transferência.
521 Não é possível abrir a Área de transferência.
735 Não é possível salvar arquivo no diretório TEMP.
744 Texto de pesquisa não encontrado.
746 Substituições muito longas.
31001 Sem memória.
31004 Nenhum objeto.
31018 A classe não está definida.
31027 Não é possível ativar o objeto.
31032 Não é possível criar objeto incorporado.
31036 Erro ao salvar no arquivo.
31037 Erro ao carregar do arquivo.

Criemos uma planilha de acordo com o exemplo a seguir, nomeando o intervalo


das células como Estado:

202
Estruturas de decisão e repetição
4
Criaremos, então, uma macro onde o usuário deverá digitar uma sigla dentro
de uma caixa de entrada para que seja procurado o estado correspondente.
Chamaremos a função ProcV dentro do código em VBA.

Utilizaremos o comando a seguir para executar uma função da planilha, estando


dentro do código em VBA. Devemos observar que o nome da função deverá ser
especificado em inglês:

Application.WorksheetFunction. <função em inglês>(argumentos da


função)

Digitemos a seguinte macro:

A função VLookup (ProcV) utilizada a partir do VBA possui a mesma


funcionalidade demonstrada quando é executada na planilha, ou seja, traz
os dados correspondentes a uma informação encontrada. Caso não exista na
tabela o item procurado, surgirá uma mensagem de alerta de erro.

Na verdade, o fato de a sigla não existir na tabela não significa um erro de macro,
mas sim um problema na localização da informação. Nesse caso, é necessário
colocar o tratamento de erros no procedimento, fazendo com que seja exibida
uma mensagem ao usuário caso não seja localizada determinada sigla.

203
Excel 2016 VBA - Módulo I

Se, na macro Procura, não tivéssemos utilizado o tratamento de erros e, durante


a execução da macro, fosse inserida uma sigla inexistente, seria exibida a
seguinte mensagem:

204
Estruturas de decisão e repetição
4
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• As estruturas de decisão e repetição são utilizadas nos casos em que é


necessário alterar o fluxo normal de execução das instruções, executando
apenas alguns procedimentos ou executando um mesmo procedimento
várias vezes de acordo com condições pré-estabelecidas;

•• A instrução GoTo faz com que uma instrução especificada por um rótulo
de linha seja executada, ignorando outras possíveis instruções no fluxo
normal dos procedimentos;

•• O operador And constrói uma conjunção lógica, ou seja, para que o


resultado seja True, todas as condições devem ser verdadeiras. O operador
Or constrói uma disjunção lógica, ou seja, para que o resultado seja True,
basta que uma das condições seja verdadeira;

•• A instrução Select Case permite criar um fluxo de tomada de decisão em que


uma única expressão pode ser comparada com várias outras expressões.
São executadas as instruções correspondentes ao Case que coincidir com
o valor da expressão;

•• A instrução Loop das estruturas Do...Loop, Do While...Loop e Do Until...


Loop é utilizada para repetir a execução de blocos de código VBA por um
número de vezes determinado previamente ou pelo valor de uma variável;

•• A estrutura While...Wend funciona da mesma forma que a estrutura Do


While...Loop, com a exceção de que o teste da condição deve ser feito
obrigatoriamente no início;

205
Excel 2016 VBA - Módulo I

•• O loop For...Next é utilizado para definir a quantidade de vezes que um


conjunto de instruções será repetido. Esse loop precisa de um contador –
uma variável numérica – com um valor inicial, um valor final e um passo;

•• Se desejarmos trabalhar com VBA, uma das coisas mais importantes que
temos que ter em mente é a probabilidade de ocorrerem erros. Dentre os
erros possíveis, existem dois tipos muitos comuns, que são os erros de
programação e os de tempo de execução;

•• Alguns tipos de erro são mais fáceis de serem corrigidos do que outros.
Erros de sintaxe, por exemplo, podem ser facilmente impedidos. Os erros
de tempo de execução também são impedidos sem dificuldades. Porém, de
solução mais complexa do que erros de sintaxe e de tempo de execução
são os erros de lógica;

•• Um erro pode ser tratado até mesmo enquanto o código é executado, desde
que sua presença tenha sido percebida e, portanto, tenha sido feita uma
configuração no código que permite seu tratamento.

206
Estruturas de
4
decisão e repetição
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. Qual das alternativas a seguir contém uma instrução


condicional?

☐☐ a) If

☐☐ b) Select Case

☐☐ c) Do While

☐☐ d) As alternativas A e B estão corretas.

☐☐ e) As alternativas B e C estão corretas.

2. Em que tipo de estrutura o comando LOOP é utilizado?

☐☐ a) Do while

☐☐ b) If

☐☐ c) Do Until

☐☐ d) As alternativas A e C estão corretas.

☐☐ e) As alternativas A e B estão corretas.

208
Estruturas de decisão e repetição
4
3. Qual dos procedimentos a seguir permite ignorar um
erro em tempo de execução, passando para a instrução
posterior?

☐☐ a) Utilizar Exit sub.

☐☐ b) Pressionar a tecla de função F2.

☐☐ c) Utilizar On Error Resume Next.

☐☐ d) Utilizar Exit For.

☐☐ e) Utilizar a janela Verificação Imediata.

4. O que faz o comando On Error GoTo Teste?

☐☐ a) Exibe a mensagem de teste durante um erro.

☐☐ b) Ativa o depurador de funções em caso de erros.

☐☐ c) Em caso de erro durante a execução, executa a


rotina denominada Teste.

☐☐ d) Encerra a execução da macro.

☐☐ e) Nenhuma das alternativas anteriores está correta.

209
Excel 2016 VBA - Módulo I

5. Qual é a quantidade máxima de linhas que podemos


inserir em uma rotina de tratamento de erros?

☐☐ a) 2

☐☐ b) 10

☐☐ c) 5

☐☐ d) 18

☐☐ e) Nenhuma das alternativas anteriores está correta.

210
Estruturas de
4
decisão e repetição
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Desenvolvendo códigos com a utilização de laços (Do While, Do Until ou


For), através dos conceitos de macro relativa, com a utilização do comando
Offset

1. Desenvolva uma macro chamada Tabuada, que deverá exibir, a partir da


célula D5, o valor da tabuada do número digitado na célula C2, conforme o
exemplo a seguir:

A macro deverá selecionar e alterar a cor das células que estiverem nas linhas
pares. Ela poderá ser feita com um destes três laços:

•• For...Next;

•• Do While... Loop;

•• Do Until... Loop.

2. O cálculo deverá ser feito através de um botão que executará a macro Tabuada.

No exemplo anterior, criamos três botões, cada um correspondente


ao cálculo da tabuada com laços de repetição diferentes. Mas você
pode apenas criar um botão chamado Tabuada que calcule com o
código que você criou.

212
Estruturas de decisão e repetição
4
Laboratório 2

A – Utilizando a estrutura Do Until e a propriedade ColorIndex

1. Desenvolva uma macro chamada CORES:

•• Nas células da coluna A, deverão ser exibidos os valores numéricos que


representam as cores, utilizados pela propriedade ColorIndex;

•• Atribua, respectivamente, as cores de cada valor numérico nas células da


coluna B;

•• Utilize o laço Do Until...Loop.

Observe o exemplo na planilha a seguir:

A propriedade ColorIndex aceita valores entre 0 e 56.

213
Excel 2016 VBA - Módulo I

Laboratório 3

A – Utilizando tratamento de erros em tempo de execução

1. Desenvolva uma macro chamada Calcular, que deverá exibir, nas células C8
a C11, o resultado do cálculo entre os valores digitados nas células C5 e C6:

•• Armazene os conteúdos das células C4 e C5 em variáveis do tipo BYTE;

•• A macro só deverá exibir os resultados se as condições a seguir forem


satisfatórias:

•• Os conteúdos das células C5 e C6 deverão ser numéricos. Exibir a


mensagem "Favor digitar valor numérico";

•• O conteúdo da célula C6 não poderá ser 0 (zero);

•• Os conteúdos das células C5 e C6 não poderão ser superiores ao valor


255.

•• Caso essas condições não sejam satisfatórias, utilize tratamentos de erro


exibindo uma mensagem de alerta ao usuário e limpar todos os valores:

Mensagem caso a condição não seja


Condição
satisfatória
Se o conteúdo de C5 e/ou C6 for
"Favor digitar valor numérico."
texto.
"Não é possível dividir um valor por
Se o conteúdo de C6 for 0 (zero).
zero."
Se o conteúdo de C5 e/ou C6 for "Os valores das células C5 e C6 não
superior a 255. poderão ser superiores a 255."
Um erro diferente dos três
"Erro interno:" & Err.Number
anteriores.

214
Estruturas de decisão e repetição
4

Observe a planilha de exemplo:

2. Crie um botão que execute a macro Calcular.

215
Funções VBA
5
99 Introdução;
99 Funções matemáticas;
99 Funções financeiras;
99 Funções de Data e Hora;
99 Funções de texto;
99 Funções de conversão;
99 Funções de verificação;
99 Acessando a biblioteca de funções de planilha do
Excel;
99 Criando funções personalizadas;
99 Criando suplementos XLAM.
Excel 2016 VBA - Módulo I

5.1. Introdução
Conheceremos, neste capítulo, diversas funções que podemos utilizar no
VBA (matemáticas, de data e hora, de tratamento de strings e de conversão
de dados), além dos procedimentos para utilizar funções da planilha e criar
funções personalizadas. Veremos, também, curiosidades sobre o Assistente de
Função e suplementos.

5.2. Funções matemáticas
As funções deste grupo realizam cálculos matemáticos. A próxima tabela exibe
a lista dessas funções, juntamente com os dados que elas retornam:

Função Retorno
Abs O valor absoluto de um número.
Atn O arco tangente de um número.
Cos O cosseno de um ângulo.
O resultado de e (base dos logaritmos naturais) elevado à
Exp
potência de um número.
A parte inteira de um número. Para exemplificar, Fix(70.7)
Fix retorna 70 e Fix(-70.7) retorna –70 (retorna o primeiro inteiro
negativo maior ou igual ao número).
A parte inteira de um número. Para exemplificar, Int(70.7)
Int retorna 70 e Int(-70.7) retorna –71 (retorna o primeiro inteiro
negativo que seja menor ou igual ao número).
O logaritmo natural de um número, ou seja, o logaritmo na
Log
base e (constante equivalente a aproximadamente 2,718282).
Rnd Um número aleatório entre 0 e 1.
1, -1 ou 0, de acordo com o sinal do número (positivo, negativo
Sgn ou 0, respectivamente). Para exemplificar, Sgn(70) retorna 1,
Sgn(-70) retorna -1 e Sgn(0) retorna 0.
Sin O seno de um ângulo.
A raiz quadrada de um número maior ou igual a zero. Para
Sqr exemplificar, Sqr(49) retorna 7, Sqr(81) retorna 9 e Sqr(0)
retorna 0.
Tan A tangente de um ângulo.

218
Funções VBA
5
Considere o seguinte exemplo:

Sub FuncoesMatematicas()
MsgBox "Valor absoluto: " & Abs(-1)
MsgBox "Arco tangente: " & Atn(15)
MsgBox "Cosseno: " & Cos(90)
MsgBox "Exponencial: " & Exp(2)
MsgBox "Inteiro1: " & Fix(-50)
MsgBox "Inteiro2: " & Int(-50.985)
MsgBox "Logaritmo = " & Log(5)
MsgBox "Aleatorio: " & Rnd(1)
MsgBox "Tipo Num: " & Sgn(-10)
MsgBox "Seno: " & Sin(90)
MsgBox "Raiz: " & Sqr(49)
End Sub

5.3. Funções financeiras
Neste exemplo, você verá um exemplo da função financeira VF, Valor Futuro.
Porém, assim como a VF, todas as funções financeiras do Excel têm uma função
correspondente em VBA.

Uma boa prática é acessar a Ajuda da Microsoft (pela Internet, com o F1 do


teclado) e ver outras possibilidades do comando ou instrução em questão, pois,
normalmente, sempre há outras opções de uso.

219
Excel 2016 VBA - Módulo I

5.4. Funções de data e hora


As funções de data e hora permitem manipular esse tipo de dado, realizando
operações como extrair o dia, o mês ou o ano de uma data e obter a data ou o
horário atual do computador.

As datas são tratadas como números inteiros pelo VBA. Dentro do intervalo
permitido de 01/01/100 a 31/12/9999, a data 30/12/1899 é representada
pelo número 1, e as datas anteriores (29/12/1899, 28/12/1899 e assim por
diante) são representadas por números inteiros negativos (-1, -2...). As datas
posteriores a 30/12/1899 são representadas por números inteiros positivos.

O fato de o VBA representar datas por números inteiros permite


também realizar operações de adição e subtração com esse
tipo de dado, obtendo o número de dias existentes em um
intervalo de datas, por exemplo.

Função Sintaxe Retorno


A data atual, de acordo com
o calendário do computador.
Date Date
Também pode ser utilizada para
definir a data do computador.
O dia de uma data, representado
Day Day(date) por um número inteiro entre 1 e
31.
O mês de uma data, representado
Month Month(date) por um número inteiro entre 1 e
12.
O ano de uma data, representado
Year Year(date)
por um número inteiro.
A data e o horário atuais, de acordo
Now Now
com o relógio do computador.
A data composta por ano, mês e
DateSerial DataSerial(year,month,day)
dia especificados.
A data representada por uma
DateValue DataValue(date)
string (texto).

220
Funções VBA
5
Função Sintaxe Retorno
O dia da semana de uma data,
Weekday
Weekday representado por um número de
(date,[firstdayofweek])
1 a 7.
O nome de um dia da semana
WeekdayName(weekday, (weekday é o número do dia da
WeekdayName
abbreviate, firstdayofweek) semana cujo nome se deseja
obter).
MonthName(month[,
MonthName O nome de um mês.
abbreviate])
A hora de um horário, representada
Hour Hour(time) por um número inteiro entre 0 e
23.
Os minutos de um horário,
Minute Minute(time) representados por um número
inteiro entre 0 e 59.
Os segundos de um horário,
Second Second(time) representados por um número
inteiro entre 0 e 59.
O horário atual, de acordo com o
relógio do computador. Também
Time Time
pode ser utilizada para definir o
horário do computador.
A quantidade de segundos
Timer Timer
contados a partir da meia-noite.
Um horário a partir de um valor de
TimeValue TimeValue(time)
texto.
TimeSerial(hour, minute, Um horário composto pela hora,
TimeSerial
second) minutos e segundos especificados.

Neste contexto, considere o seguinte exemplo:

Sub Exibedata()
Range("a1") = Date
Range("a2") = Day(Date)
Range("a3") = Month(Date)
Range("a4") = Year(Date)
End Sub

221
Excel 2016 VBA - Módulo I

Supondo que a data do sistema operacional seja 09/05/2016, ao executar o


código, serão exibidos os seguintes dados na planilha:

Observe o exemplo logo adiante, em que será exibida a idade de acordo com a
data de nascimento digitada em uma função Inputbox. Neste caso, utilizamos
o cálculo com datas:

Sub idade()
Dim nascimento As Date
Dim idade As Double
nascimento = InputBox("Digite sua data de nascimento")
idade = Int((Date - nascimento) / 365)
MsgBox "Você tem " & idade & " anos."
End Sub

Como já visto, uma data é sempre representada por um valor numérico, ou


seja, ao subtrairmos a data de nascimento da data atual, é retornado também
um valor numérico que, neste caso, poderia representar os dias vividos.

Imaginando que a data atual seja 06/04/2008 e a data de nascimento


17/07/2000, a subtração entre as duas datas será igual a 2820 (dias de
diferença entre a data atual e nascimento). Então, dividimos por 365 para
retornar a quantidade em anos, que resulta em 7,726027... Como precisamos
desprezar os decimais e utilizar apenas o valor inteiro do resultado, utilizamos
a função Int.

Ao dividir esse resultado por 365, dependendo da data


indicada, talvez seja exibido um valor em decimais. Nesta
situação, pode-se utilizar a função Int para retornar o valor
inteiro.

222
Funções VBA
5
Para as funções Weekday e WeekdayName, firstdayofweek representa o
primeiro dia da semana. Caso não seja especificado, o valor 1 corresponderá
ao domingo e o valor 7 ao sábado.

Sub Dia_Semana()
Dim Dia_Data As Date
Dia_Data = "10/05/2005"
MsgBox Weekday(Dia_Data)
MsgBox WeekdayName(Weekday(Dia_Data))
End Sub

No exemplo anterior, primeiramente, será exibido o valor 3 na caixa de


mensagem. Em uma segunda caixa, será exibida a palavra terça-feira.

O argumento abbreviate pode assumir o valor False (padrão), ou True,


resultando em strings não abreviadas ou abreviadas, respectivamente (como
Domingo ou Dom).

MsgBox WeekdayName(Weekday(Dia_Data), True)

Devemos utilizar os comandos DateSerial e TimeSerial caso queiramos indicar


uma data ou um horário partindo de valores indicados.

Este exemplo insere, na célula A1, o valor 18:10:32:

Range("A1") = TimeSerial(18,10,32)

Este exemplo, por sua vez, insere, na célula A2, o valor 10/05/2000:

Range("A2") = DateSerial(2000, 5, 10)

223
Excel 2016 VBA - Módulo I

Para preencher os itens em uma planilha, podemos utilizar o seguinte código:

Sub Preenchimento()
Range("a1") = "Data do Sistema: " & Date
Range("a2") = "Dia: " & Day(Date)
Range("a3") = "Mês: " & Month(Date)
Range("a4") = "Ano: " & Year(Date)
Range("b2") = WeekdayName(Weekday(Date))
Range("b3") = MonthName(Month(Date))
Range("d1") = "Horário do Sistema: " & Now
Range("d2") = "Hora: " & Hour(Now)
Range("d3") = "Minuto: " & Minute(Now)
Range("d4") = "Segundo: " & Second(Now)
Columns("a:d").AutoFit
End Sub

O código a seguir exibirá uma mensagem ao usuário dependendo do horário


do sistema operacional. A função Hour está retornando os dois dígitos que
representam a hora do horário do sistema operacional.

Sub Mensagem_Hora()
Select Case Hour(Now)
Case Is < 13
MsgBox "Bom Dia!"
Case Is < 18
MsgBox "Boa Tarde!"
Case Else
MsgBox "Boa Noite"
End Select
End Sub

224
Funções VBA
5
Podemos utilizar o seguinte código para inserir o horário na célula selecionada e
o minuto na célula ao lado, de acordo com o horário atual do sistema operacional:

Activecell = Hour(Now)
Activecell.offset(0,1) = Minute(Now)

Suponhamos que seja preciso calcular o tempo (diferença) entre o início de uma
ocorrência e o horário atual. Para isso, utilizamos o seguinte código:

Sub Dif_Horas()
Dim Inicial, Diferenca As Date
Inicial = "8:30"
Diferenca = CDate(Time) - CDate(Inicial)
MsgBox Diferenca
End Sub

O horário inicial foi definido como 08:30. Caso o horário do sistema operacional
no momento da execução seja 11:32, aparecerá a seguinte mensagem:

Foi utilizada a função CDate para que o VBA convertesse


a variável Inicial e o horário do sistema (TIME) como Data/
Hora antes de efetuar o cálculo da diferença.

225
Excel 2016 VBA - Módulo I

5.5. F unções de texto


Existe um conjunto de funções utilizadas para trabalhar com texto e executar
operações, como converter um texto para letras maiúsculas ou minúsculas e
extrair sequências de caracteres a partir de uma determinada posição do texto.
Algumas dessas funções são descritas a seguir:

Função Descrição Sintaxe


Converte todos os
LCase(string), em que string
Lcase caracteres de uma string
define a cadeia de texto.
para letras minúsculas.
Left(string, length), em que
Extrai uma quantidade string define a cadeia de texto
especificada de caracteres e length define a quantidade de
Left
de um texto, da esquerda caracteres extraídos (caso seja
para a direita. definido como zero, a cadeia de
texto terá comprimento zero ("")).
Len(expression), em que
Retorna a quantidade de
Len expression define a cadeia de
caracteres de uma string.
texto.
Remove espaços à esquerda Ltrim (string), em que string
Ltrim
de uma string. define a cadeia de texto.
Mid(string, start[, length]), em
Extrai uma quantidade
que string define a cadeia de
especificada de caracteres
texto, start define a posição do
Mid de um texto a partir de uma
primeiro caractere extraído e
determinada posição, da
length define a quantidade de
esquerda para a direita.
caracteres extraídos.
Right(string, length), em que
Extrai uma quantidade string define a cadeia de texto
especificada de caracteres e length define a quantidade de
Right
de um texto, da direita para caracteres extraídos (caso seja
a esquerda. definido como zero, a cadeia de
texto terá comprimento zero ("")).
Remove espaços à direita de Rtrim (string), em que string
Rtrim
uma string. define a cadeia de texto.

226
Funções VBA
5
Função Descrição Sintaxe
Insere espaços em uma Space(number), em que number
Space
string. define a quantidade de espaços.
StrConv(string, conversion,
LCID), em que string define a
cadeia de texto e conversion
define o formato para o qual a
string será convertida (1 para
caracteres maiúsculos, 2 para
caracteres minúsculos, 3 para
Retorna um texto convertido
StrConv a primeira letra de cada palavra
em outro formato.
em maiúscula e o restante em
minúsculas e 64 para converter
para Unicode, utilizando a página
de código padrão do sistema).
LCID define o local e o ID do
sistema (normalmente não é
especificado).
Retorna uma cadeia de String(number, character), em
caracteres, repetidos um que number define a quantidade
String
determinado número de de vezes e character define o
vezes. caractere que será repetido.
Retorna uma string StrReverse(String), em que
StrReverse
invertida. string define a cadeia de texto.
Remove espaços à esquerda Trim (string), em que string
Trim
e à direita de uma string. define a cadeia de texto.
Converte todos os
UCase(string), em que string
Ucase caracteres de uma string
define a cadeia de texto.
para letras maiúsculas.

227
Excel 2016 VBA - Módulo I

A partir de agora, apresentaremos exemplos utilizando algumas das funções


descritas:

•• UCase/LCase/StrConv

O procedimento adiante converte para formato maiúsculo todas as palavras


contidas na coluna A da planilha, enquanto não houver uma célula vazia:

Sub Maiusculo()
Range("a1").Select
Do Until ActiveCell = ""
ActiveCell = UCase(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Podemos utilizar a mesma estrutura de procedimento para deixar os caracteres


em formato minúsculo, alterando apenas a linha de comando que define que a
célula ativa receberá o conteúdo já existente em formato minúsculo:

ActiveCell = LCase(ActiveCell)

Para deixar apenas a primeira letra de cada palavra em formato maiúsculo e as


demais em minúsculo, utilizamos o comando:

Activecell = StrConv(Activecell,3)

•• Left/Right/Mid

A partir de uma variável denominada Curso, com o conteúdo Microsoft Excel


VBA, podemos extrair caracteres a partir da esquerda (função Left), da direita
(função Right) ou de qualquer parte do texto (função Mid).

Sub Extrair_Texto()
Dim Texto As String
Texto = "Microsoft Excel VBA"
MsgBox Left(Texto, 9) & vbCrLf & _
Mid(Texto, 11, 5) & vbCrLf & _
Right(Texto, 3)
End Sub

228
Funções VBA
5
1. Extrai 9 caracteres partindo da esquerda.
2. Extrai 5 caracteres a partir da posição 11.
3. Extrai 3 caracteres partindo da direita.

Observe a seguinte planilha:

Na coluna A consta o descritivo dos programas, sendo necessário inserir na


coluna B somente o nome do programa na linha correspondente, desprezando
a palavra Microsoft. Além disso, o nome de cada programa deverá estar em
formato maiúsculo:

229
Excel 2016 VBA - Módulo I

Por meio da função Mid, foi indicada a extração do texto a partir da posição
11 (neste caso, igual para todos) e determinada uma quantidade de até 2000
caracteres. Poderia ser indicada uma quantidade menor de caracteres, baseando-
se no exemplo da palavra Power Point, que é a maior. Para isso, definiríamos
como 11 a quantidade máxima.

•• Len

Veja o exemplo para retornar a quantidade de caracteres de uma string. Observe


que o espaço também é contado como um caractere:

Sub Quantidade_Caracteres()
Dim texto As String
texto = "Microsoft Excel"
MsgBox "Quantidade: " & Len(texto) & " caracteres."
End Sub

•• Trim/LTrim/RTrim

No exemplo a seguir, utilizamos as funções Trim, LTrim e RTrim a fim de


extrair, respectivamente, os espaços posicionados no início e fim de um texto,
somente os espaços à esquerda (início) ou somente os espaços à direita (final
de um texto).

Sub Tirar_Espacos()
Dim texto, t_Trim, t_LTrim, t_RTrim As String
texto = " Excel VBA "
Range("a1") = texto
Range("a2") = Trim(texto)
Range("a3") = LTrim(texto)
Range("a4") = RTrim(texto)
End Sub

230
Funções VBA
5
•• Space

A fim de inserir uma quantidade determinada de espaços, podemos usar o


seguinte código:

Sub Insere_Espaco()
Dim Produto, Espacos As String
Dim Valor As Double
Produto = "Impressora"
Valor = 1150
Espacos = Space(8)
MsgBox Produto & Espacos & Valor
End Sub

•• String

Podemos empregar a função String a fim de repetir um caractere várias vezes.


Neste caso, o primeiro argumento é o número de vezes que o caractere será
repetido e o segundo argumento é o próprio caractere, entre aspas:

Sub Repetir()
Dim texto As String
texto = "."
MsgBox "Impressora" & String(22, ".") & "R$ 1050,00"
End Sub

231
Excel 2016 VBA - Módulo I

•• StrReverse

A fim de obter o conteúdo inverso de uma variável, podemos utilizar a função


StrReverse:

Sub exemplo()
Dim Texto, Inverso as string
Texto = "Casa"
Inverso = StrReverse(Texto)
Msgbox Inverso
End Sub

5.6. Funções de conversão
Utilizamos as funções de conversão, listadas na próxima tabela, para converter
uma determinada expressão para um tipo de dado diferente do atual:

Função Valor de retorno


Boolean (True ou
CBool
False)
CByte Byte
CCur Currency
CDate Date
CDbl Double
CDec Decimal
CInt Integer
CLng Long
CStr String
CSng Single
Cvar Variant

232
Funções VBA
5
Para qualquer uma dessas funções, a sintaxe é Função(expression), em que
expression representa os dados que serão convertidos.

A função Cdate, que converte uma expressão em data, é muito utilizada para
converter dados inseridos em objetos InputBox e TextBox, que assumem por
padrão todos os dados como texto (string).

Devido ao tipo de dado resultante da conversão com as funções CInt e CLng,


as frações são arredondadas.

5.7. Funções de verificação
Estas funções verificam o tipo de dado e retornam um valor booleano: True ou
False.

As mais utilizadas são:

•• IsNumeric: Verifica se é um dado numérico;

•• IsEmpty: Verifica se é vazio;

•• IsDate: Verifica se é data;

•• IsNull: Verifica se é nulo;

•• IsArray: Verifica se é um array.

Sub V_01()
MsgBox IsNumeric(Range("b1")) And Not IsEmpty(Range("b1"))
End Sub

Sub V_02()
Do Until IsDate(d)
d = InputBox("Informe a Data Inicial")
Loop
End Sub

233
Excel 2016 VBA - Módulo I

5.8. Acessando a biblioteca de funções de


planilha do Excel
Pertencente ao objeto Application, a propriedade WorksheetFunction permite
executar uma função da planilha a partir do código VBA, com exceção das
funções já existentes em VBA.

Para que o Excel reconheça a função, é necessário escrevê-la em inglês. Observe


a seguinte sintaxe:

Application.WorksheetFunction.<Nome da função>(<Argumentos da
função>)

Podemos omitir Application ou WorksheetFunction. Assim, existem mais duas


sintaxes válidas e que produzem o mesmo efeito:

WorksheetFunction.Nome da função(Argumentos da função)

Application.Nome da função(Argumentos da função)

Considere o seguinte exemplo e planilha:

Sub Funcao_Planilha()
MsgBox WorksheetFunction.Sum(Range("a1:a4"))
End Sub

234
Funções VBA
5
Veja a informação a ser exibida na caixa de mensagem:

No exemplo a seguir, é utilizada a função Romano(), sendo retornado, na caixa


de mensagem, o valor correspondente, em algarismos romanos, de um número
digitado na caixa de entrada:

Sub Conversao_Romanos()
Dim valor As Long
valor = InputBox("Digite o número")
MsgBox Application.WorksheetFunction.Roman(valor)
End Sub

Na planilha a seguir, é necessário que seja inserido, nas células da coluna D, o


descritivo de acordo com o tipo da contratação (1, 2, 3 ou 4). Com a utilização
da função Procv(), a macro irá buscar a informação do tipo na coluna H e
retornar o descritivo contido na coluna I.

235
Excel 2016 VBA - Módulo I

A seguir, há um exemplo de utilização da função Procv():

Após a execução da macro, teremos o seguinte resultado na coluna D:

Ao utilizar uma função da planilha do Excel no código


VBA, é necessário inserir todos os parâmetros contidos na
sintaxe da função.

236
Funções VBA
5
5.9. Criando funções personalizadas
Além das funções do VBA e das funções de planilha do Excel, podemos criar
novas funções personalizadas para atender necessidades específicas. As funções
criadas podem ser utilizadas no VBA ou nas planilhas do Excel.

As funções podem ser criadas a partir da geração de uma macro iniciada com a
instrução Function, seguida pelo nome da função, seus argumentos e tipos de
dados, entre parênteses, como a sintaxe a seguir:

Function NomeFunção(Arg1 As tipo, Arg2 as tipo) As tipo

A seguinte função define o texto "Impacta Tecnologia" como conteúdo da


variável Nome_Emp e, em seguida, atribui à célula A5:

Function Nome_Emp()
Nome_Emp = "Impacta Tecnologia"
Range("A5").Value = Nome_Emp
End Function

Caso seja necessário executar a função a partir da planilha do Excel, basta


digitar o seguinte em qualquer célula:

=Nome_Emp()

A função a seguir requer dois parâmetros (valores) que deverão ser digitados.
Os valores estão representados por N1 e N2 do tipo Long, porém, o resultado
da função é do tipo Double, pois, caso N1=10 e N2=3, o resultado será um
valor decimal.

Function dgeral(n1 as Long, n2 As Long) As Double


dgeral = n1 / n2
End Function

237
Excel 2016 VBA - Módulo I

5.9.1. Utilizando as funções criadas

•• Executando funções a partir de um código em VBA

Podemos executar a função a partir de uma macro, em que o valor dos argumentos
poderá ser fixo ou estar contido em uma variável.

Observe o exemplo, com a utilização da função dgeral(), em que os argumentos


são passados a partir de Inputbox:

Function dgeral(n1, n2 As Long) As Double


dgeral = n1 / n2
End Function

Sub Exemplo_Funcao()
Dim valor1, valor2 As Long
valor1 = InputBox("Digite o primeiro número")
valor2 = InputBox("Digite o segundo número")
If valor2 = 0 Then
MsgBox "Valor Invalido", vbCritical
Exit Sub
End If
MsgBox dgeral(valor1, valor2)
End Sub

•• Executando funções a partir da planilha

Para utilizar a função em uma célula, basta pressionar o sinal de igual (=) seguido
do nome da função e dos argumentos que ela possuir. Os argumentos poderão
ser valores fixos ou valores buscados de células específicas, de acordo com os
exemplos:

•• Argumento fixo

=dgeral(10;2)

238
Funções VBA
5
•• Argumento buscando valor contido em células da planilha

=dgeral(A20;A21)

Também é possível utilizarmos a função criada, executando-a a partir do


Assistente de Função (fx). Como padrão, as funções criadas no VBA ficam na
categoria Definida pelo usuário.

A função deve ser finalizada com a instrução


End Function.

5.10.  Criando suplementos XLAM


•• Executando a função a partir de outra pasta de trabalho

Vamos imaginar que a função dgeral() foi criada em uma pasta de trabalho
denominada funcao.xlsm. Nesse caso, a função poderá ser utilizada em
qualquer planilha dessa pasta de trabalho, e será possível digitar em qualquer
célula o seguinte exemplo:

=dgeral(10;2)

No entanto, ao digitarmos a instrução acima em outra pasta de trabalho, o Excel


não a reconhecerá. Nesse caso, é preciso referenciar o arquivo que contém a
função.

É necessário manter o arquivo funcao.xlsm aberto e, em qualquer célula do


outro arquivo, digitar a instrução a seguir. Percebe-se, então, a necessidade de
referenciar o arquivo que contém o código da função:

=funcao.xlsm!dgeral(10;2)

•• Criando um suplemento

Para que as funções criadas possam ser utilizadas nos demais arquivos,
podemos criar um arquivo como suplemento do Excel (.xlam), o qual terá todas
as funções. Depois disso, basta vincular esse suplemento ao aplicativo Excel.

239
Excel 2016 VBA - Módulo I

Observe o procedimento a seguir:

1. Em um arquivo novo, insira dentro de um módulo de VBA todas as funções


com seus respectivos códigos;

2. Salve o arquivo como Suplemento do Excel (será criado um arquivo com a


extensão .xlam).

Ao salvarmos um arquivo como suplemento, na caixa


de diálogo Salvar como, será sugerido que o arquivo
seja salvo na pasta de Suplementos. No entanto, é
permitido salvar em outro local.

•• Anexando o suplemento ao Excel

1. Clique no em Arquivo / Opções;

2. Clique na opção Suplementos do Excel e, em seguida, no botão Ir:

240
Funções VBA
5
3. O nome do arquivo que criamos aparecerá na caixa de diálogo Suplementos.
Marque a opção correspondente ao arquivo de suplemento que você criou que,
neste exemplo, é Função, e clique em Ok:

Para desativar o suplemento, basta desmarcar o item


desejado, contido na janela Suplementos.

241
Excel 2016 VBA - Módulo I

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• O VBA oferece um grupo de funções que realizam operações matemáticas.


As funções Cos, Fix e Sqr, entre outras, fazem parte desse grupo;

•• As datas são tratadas como números inteiros pelo VBA, o que nos permite
também realizar operações de adição e subtração com esse tipo de dado,
obtendo o número de dias existentes em um intervalo de datas, por exemplo;

•• As funções de tratamento de string permitem trabalhar com texto e executar


operações como converter um texto para letras maiúsculas ou minúsculas;

•• Para qualquer função de conversão, a sintaxe é Função(expression), em


que expression representa os dados que serão convertidos;

•• As funções de planilha podem ser inseridas por meio do objeto


WorksheetFunction, que faz parte do objeto Application;

•• Podemos criar funções a partir da geração de uma macro iniciada com a


instrução Function, seguida pelo nome da função, seus argumentos e tipos
de dados, entre parênteses.

242
Funções VBA
5
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. A célula B4 contém o valor -5. Para obtermos o valor


positivo do número contido nessa célula, que função
devemos utilizar?

☐☐ a) sen

☐☐ b) exp

☐☐ c) cos

☐☐ d) abs

☐☐ e) sqr

2. Sabendo-se que o valor da célula G10 é “Pedro Toledo”,


qual o comando utilizado para exibir apenas o nome
“Pedro”?

☐☐ a) Msgbox Right(“Pedro”,5)

☐☐ b) Msgbox Left(Range(“g10”),5)

☐☐ c) Msgbox Mid(“Pedro Toledo”,5,5)

☐☐ d) Msgbox Right(Range(“g10”),6)

☐☐ e) Msgbox Len(Range(“g10”))

244
Funções VBA
5
3. Para exibir, na célula selecionada, o dia da semana da
data de hoje, que comando utilizamos?

☐☐ a) Debug.print now

☐☐ b) Activecell.date

☐☐ c) Activecell = dayweek(hoje())

☐☐ d) Activecell = weekdayname(weekday(date))

☐☐ e) Nenhuma das alternativas anteriores está correta.

4. Qual a finalidade da função len?

☐☐ a) Transformar o texto em letras maiúsculas.

☐☐ b) Deixar somente a primeira letra do texto maiúscula.

☐☐ c) Retornar a quantidade de caracteres de uma string.

☐☐ d) Remover espaços à esquerda de um texto.

☐☐ e) Nenhuma das alternativas anteriores está correta.

245
Excel 2016 VBA - Módulo I

5. Qual das alternativas a seguir contém apenas funções


de texto?

☐☐ a) LCase, String, Mid.

☐☐ b) CDate, Mid, Day.

☐☐ c) Month, NPer, Hour.

☐☐ d) StrReverse, Format, Now.

☐☐ e) Nenhuma das alternativas anteriores está correta.

246
Funções VBA
5
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Trabalhando com funções de texto e estrutura Do While

1. Com base nas informações da planilha a seguir, crie uma macro denominada
Produto para escrever nas células da coluna B somente o nome dos produtos,
desprezando o código. Para padronizar o texto, deixe a primeira letra de cada
produto maiúscula.

248
Funções VBA
5

Laboratório 2

A – Utilizando variável array

1. Desenvolva uma macro chamada ExibirProduto, que deverá exibir, em uma


Msgbox, o nome do produto que estará em promoção, dependendo do dia da
semana, sendo:

•• Segunda-feira: Caneta;

•• Terça-feira: Caderno;

•• Quarta-feira: Lápis;

•• Quinta-feira: Borracha;

•• Sexta-feira: Régua;

•• Sábado / Domingo: Nenhum produto (retornar nulo).

249
Interagindo com o
6
usuário
99 MsgBox;
99 Função InputBox;
99 Método InputBox;
99 Caixas de diálogo do Excel;
99 Eventos mais utilizados e práticos do Excel.
Excel 2016 VBA - Módulo I

6.1. MsgBox
A caixa de mensagem é utilizada para passar informações ou para executar um
comando que depende de uma resposta do usuário. Uma caixa de mensagem
pode apresentar um ou mais botões, como OK, Cancelar, Sim, Não, entre
outros.

Para inserir uma caixa de mensagem, devemos usar a função MsgBox. Sua
sintaxe, bem como a descrição dos seus argumentos, serão mostradas a seguir:

MsgBox(Prompt[,Buttons][,Title][,Helpfile][,Context]

Em que:

•• Prompt: Este argumento define o texto da mensagem que será exibida;

•• Buttons: Este argumento determina quais botões e ícones devem ser


exibidos na caixa de mensagem;

•• Title: Este argumento é o texto da barra de título da caixa. Se não definirmos


nenhum texto para esse argumento, o nome Microsoft Excel aparecerá na
barra de título;

•• Helpfile: Este argumento reconhece o arquivo de ajuda da caixa, desde que


este exista;

•• Context: Se definirmos Helpfile, este argumento também deverá ser


especificado. Ele representa o número do contexto da ajuda.

6.1.1. Exibindo uma caixa de mensagem


Podemos usar a função MsgBox sozinha (não inserindo os argumentos entre
parênteses) ou fixar a uma variável a ação que ocorre como resultado do clique
em seu botão.

252
Interagindo com o usuário
6
O exemplo seguinte cria uma mensagem que não retorna resultado:

Sub MsgBoxDemo()
MsgBox "Clique OK para confirmar"
End Sub

Considerando que a célula A2 tenha um conteúdo, o exemplo a seguir irá exibir


na caixa de mensagem a informação contida na célula:

Sub Exibe_Valor_Celula()
MsgBox Range("A2")
End Sub

Utilizamos o símbolo & para promover a união de conteúdos diferentes dentro


de um MsgBox. Observe o exemplo para exibir o conteúdo de uma célula e um
texto:

MsgBox "O conteúdo da célula é: " & Range("A2") & "!"

253
Excel 2016 VBA - Módulo I

A fim de efetuar uma quebra de linha dentro da caixa de mensagem, utilizamos


o comando vbCrlf. Observe exemplo:

MsgBox "O conteúdo da célula é: " & vbCrLf & Range("A2")

Agora, alteramos as propriedades de uma caixa de mensagem. Neste exemplo,


foi inserido um ícone que representa uma mensagem crítica:

MsgBox "Erro de execução", vbCritical, "Atenção"


Title

Ícone Prompt

6.1.2. Constantes utilizadas nas caixas de mensagem

O argumento dos botões apresenta uma certa flexibilidade no manuseio e essa


é uma característica que influencia diretamente na praticidade e facilidade no
momento de configurar uma caixa de mensagem. É possível escolher os botões
que serão exibidos, qual deles será o padrão (aquele que é acionado quando o
usuário aperta a tecla ENTER do teclado), ou se surgirá algum ícone. Também
podemos optar entre o uso de uma constante ou de um valor, embora a primeira
seja considerada mais fácil de trabalhar.

254
Interagindo com o usuário
6
A seguir, temos uma lista que exibe o nome, o valor (entre parênteses) e a
descrição de algumas constantes que podemos usar com a função MsgBox:

•• vbOkOnly (0): Exibe apenas o botão OK;

•• vbOkCancel (1): Exibe ambos os botões OK e Cancelar;

•• vbAbortRetryIgnore (2): Exibe os botões Abortar, Repetir e Ignorar;

•• vbYesNoCancel (3): Exibe os botões Sim, Não e Cancelar;

•• vbYesNo (4): Exibe os botões Sim e Não;

•• vbRetryCancel (5): Exibe os botões Repetir e Cancelar;

•• vbCritical (16): Exibe o ícone Mensagem crítica;

•• vbQuestion (32): Exibe o ícone Consulta de aviso;

•• vbExclamation (48): Exibe o ícone Mensagem de aviso;

•• vbInformation (64): Exibe o ícone Mensagem de informação;

•• vbDefaultButton1 (0): Faz com que o primeiro botão seja o padrão;

•• vbDefaultButton2 (256): Faz com que o segundo botão seja o padrão;

•• vbDefaultButton3 (512): Faz com que o terceiro botão seja o padrão;

•• vbDefaultButton4 (768): Faz com que o quarto botão seja o padrão.

255
Excel 2016 VBA - Módulo I

Para exibir os botões OK e Cancelar, deve-se indicar o valor 1, ou a constante


VbOkCancel:

MsgBox "Calculo Realizado com sucesso", vbOKCancel


MsgBox "Calculo Realizado com sucesso", 1

Os exemplos a seguir exibem os botões Sim e Não, mantendo o segundo botão


como padrão, além de exibir o ícone de mensagem crítica e o título Alerta:

MsgBox "Deseja excluir a célula?", vbYesNo + _


vbCritical + vbDefaultButton2, "Alerta"

MsgBox "Deseja excluir a célula?", 4 + 16 + 256, "Alerta"

Podemos usar como um argumento mais de uma


constante. Basta conectá-las com o sinal de adição (+).

256
Interagindo com o usuário
6
Além das constantes já citadas na lista anterior, também temos aquelas que são
usadas como valores de retorno para a função MsgBox. Na lista seguinte, são
citados o nome, o valor (entre parênteses) e a descrição destas funções:

•• vbOK (1): O usuário clicou em OK;

•• vbCancel (2): O usuário clicou em Cancelar;

•• vbAbort (3): O usuário clicou em Abortar;

•• vbRetry (4): O usuário clicou em Repetir;

•• vbIgnore (5): O usuário clicou em Ignorar;

•• vbYes (6): O usuário clicou em Sim;

•• vbNo (7): O usuário clicou em Não.

6.1.3. Identificando o botão clicado

Quando usamos caixas de mensagem com mais de um botão para o usuário


clicar, é necessário saber qual dos botões será escolhido e, de acordo com essa
escolha, determinar uma ação. A função MsgBox retorna um valor representando
o botão clicado pelo usuário e, então, podemos designar uma variável para esse
resultado.

257
Excel 2016 VBA - Módulo I

A macro a seguir mostra as duas formas de utilização do comando MsgBox:


o primeiro comando Msgbox identifica o botão clicado e o segundo apenas
exibe uma mensagem ao usuário. Na primeira caixa de mensagem, percebe-se
a utilização da função Msgbox() de modo que, caso seja pressionado o botão
Sim, a linha correspondente à célula selecionada será excluída e, caso seja
pressionado o botão Não, aparecerá a segunda caixa de mensagem apenas
informando que a operação foi cancelada.

Sub Exclui_Linha()
If MsgBox("Excluir linha?", vbYesNo) = vbYes Then
ActiveCell.Rows.Delete
Else
MsgBox "Operação Cancelada!"
End If
End Sub

6.2. Função InputBox
Use InputBox para exibir uma caixa de diálogo simples de forma que você possa
inserir informações a serem usadas em uma macro. A caixa de diálogo tem um
botão OK e um botão Cancelar. Se você escolher o botão OK, InputBox retornará
o valor inserido na caixa de diálogo, se você clicar no botão Cancelar,
InputBox retornará False.

A sintaxe da função InputBox e a descrição de cada um dos seus elementos são


as seguintes:

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile],
[context]

Em que:

•• Prompt: Este argumento é o texto da mensagem da caixa de diálogo;

•• Title: Este argumento é o texto da barra de título da caixa. Se não definirmos


nenhum texto para esse argumento, o nome Microsoft Excel aparecerá na
barra de títulos;

258
Interagindo com o usuário
6
•• Default: Quando a caixa tiver sido carregada, o texto definido em Default
será exibido. Também podemos omitir essa informação para que a caixa
de texto fique vazia;

•• Xpos: Este argumento define a posição da caixa a partir do lado esquerdo


da tela, ou seja, horizontalmente. Essa informação deve ser dada em twips.
Se omitirmos esse argumento, a posição horizontal da caixa fica definida
automaticamente no centro da tela;

•• Ypos: Este argumento define a posição da caixa a partir da parte de cima


da tela, ou seja, verticalmente. Essa informação deve ser dada em twips.
Se omitirmos esse argumento, a posição vertical da caixa fica definida
automaticamente no centro da tela;

•• Helpfile: Este argumento reconhece o arquivo de ajuda da caixa, desde que


este exista;

•• Context: Se definirmos Helpfile, este argumento também deverá ser


especificado. Ele representa o número do contexto da ajuda.

Considere o exemplo adiante:

Sub Insere_Dado()
Range("A1048576").End(xlUp).Offset(1, 0).Select
ActiveCell = InputBox("Digite seu Nome", "Cadastro")
End Sub

Title

Prompt

Default

259
Excel 2016 VBA - Módulo I

Observe, agora, o exemplo de um InputBox contendo um texto padrão


(Default):

Range("B2") = InputBox("Estado", "Cadastro de Clientes","SP")

6.3. Método InputBox
No objeto Application, temos o método InputBox, que se diferencia da função
InputBox por ter um argumento a mais, Type, o último parâmetro, que define o
tipo de dado a ser retornado. Vale observar que o tipo de dado padrão retornado
na função InputBox é String.

A tabela a seguir lista os valores que podem ser passados no argumento Tipo.
Pode ser um valor ou uma soma de valores. Por exemplo, para uma caixa de
entrada que possa aceitar texto e números, defina Type como 1 + 2.

Valor Descrição
0 Uma fórmula
1 Um número
2 String
4 True ou False
8 Um objeto Range
16 Um valor de erro
64 Uma matriz

260
Interagindo com o usuário
6
Se  Type for 8,  InputBox retornará um objeto Range. Você deve usar a
instrução Set para atribuir o resultado a um objeto Range, como mostrado no
exemplo a seguir.

Sub Metodo_InputBox()
Dim r As Range
Set r = Application.InputBox( _
"Clique na Célula do respectivo Cliente", , , , , , , 8)
MsgBox "O cliente selecionado foi o(a): " _
& r.Value & vbCrLf & "com o valor de: " & _
Format(r.Offset(0, 1), "currency")
End Sub

Nesta macro, na qual não foi necessário fazer tratamento de erros, enquanto o
usuário não digitar um número, a solicitação será exibida novamente.

Sub M_02()
Dim n as Integer
n = Application.InputBox(“Digite um NÚMERO”, , , , , , , 1)
MsgBox n
End Sub

261
Excel 2016 VBA - Módulo I

6.4. Caixas de diálogo do Excel


As caixas de diálogo do Excel são muito úteis para agilizar o trabalho com
programação, pois, por meio delas, os próprios usuários podem escolher
diversas opções, como formatar fonte, preencher sequências, imprimir, etc.

A exibição das caixas de diálogo internas do Excel pode ser ativada por meio
da seguinte sintaxe:

Application.Dialogs(Nome da caixa de diálogo).Show

A sintaxe citada a seguir, por exemplo, seleciona um intervalo de células e,


então, exibe uma caixa de diálogo contendo opções de formatação da fonte e
cor de fundo desse intervalo. As caixas de diálogo que aparecem são Fontes e
Formatar Células:

Sub ExibirDialogo()
Range("intervalo").Select
Application.Dialogs(xlDialogFormatFont).Show
Application.Dialogs(xlDialogPatterns).Show
End Sub

Veja a imagem das caixas de diálogo Fontes e Formatar Células, que serão
exibidas, respectivamente:

262
Interagindo com o usuário
6

Para termos acesso a uma lista contendo as constantes das caixas de diálogo,
basta seguir estes passos:

1. No VBA, pressione F2 para que seja exibido o Pesquisador de objetos;

2. Selecione Excel na lista Projeto/Biblioteca, presente no canto superior


esquerdo do Pesquisador de objetos;

3. Digite xlDialog na lista Texto de pesquisa, localizada abaixo da lista Projeto/


Biblioteca;

4. Clique no botão Pesquisar, identificado pelo desenho de um binóculo.

263
Excel 2016 VBA - Módulo I

Não são citadas, em nenhuma parte da Ajuda do sistema, as constantes das


caixas de diálogo que podemos usar, o que quer dizer que, provavelmente,
muitas tentativas e erros acontecerão até que possamos descobrir as constantes
que realmente satisfazem as nossas necessidades. Além disso, algumas caixas
de diálogo não têm uma constante que as represente, e há, ainda, as constantes
que simplesmente não funcionam.

Uma das causas para o Excel mostrar mensagens de erro é tentarmos inserir
caixas de diálogo num contexto em que elas não se encaixam. Se, por exemplo,
usarmos a constante xlDialogAlignment, a qual exibe uma caixa de diálogo
que configura o alinhamento em uma célula, quando a seleção abranger algum
outro elemento que não sejam células, o Excel mostrará uma mensagem de
erro.

6.5. Eventos mais utilizados e práticos do


Excel
Para que os controles do formulário executem ações, ou seja, tornem-se
funcionais, é necessário que sejam vinculados a eventos de objetos. Os eventos
ocorrem quando ações geram acontecimentos, e sua presença não está apenas
em formulários, mas em todos os objetos do software. Exemplos de eventos são
clicar em um botão, ativar uma janela ou selecionar uma célula. Os procedimentos
de eventos executam ações em resposta a um evento.

Dos tipos de eventos existentes, dois são utilizados com mais frequência: os
eventos de planilha (Worksheet), que ocorrem sempre que uma planilha é
ativada ou uma de suas células é alterada, e os eventos de pasta de trabalho
(Workbook), que ocorrem sempre que uma pasta de trabalho, suas planilhas,
tabelas dinâmicas ou suplementos são alterados. Ambos os tipos de eventos
são ativados automaticamente.

264
Interagindo com o usuário
6
A caixa Procedimento, do VBE, está dentro da janela código e ao lado da caixa
Objeto. Ela exibe uma lista dos eventos para a planilha ou pasta de trabalho
selecionada:
Caixa procedimento

Alguns desses eventos são:

•• Eventos de planilha (Worksheet)

Evento Descrição
Activate Ocorre quando a planilha é ativada.
Ocorre quando o usuário clica duas vezes em uma célula
BeforeDoubleClick
da planilha.
Ocorre quando o usuário clica com o botão direito do
BeforeRightClick
mouse em uma planilha.
Calculate Ocorre sempre que a planilha é recalculada.
Change Ocorre quando uma célula da planilha é alterada.
Deactivate Ocorre quando a planilha é desativada.
FollowHyperlink Ocorre sempre que um hyperlink é ativado.
SelectionChange Ocorre sempre que a seleção é alterada.

•• Eventos de pasta de trabalho (Workbook)

Evento Descrição
Activate Ocorre quando a pasta de trabalho é ativada.
AddinInstall Ocorre sempre que um suplemento é instalado.
AddinUninstall Ocorre quando um suplemento é desinstalado.
BeforeClose Ocorre quando a pasta de trabalho é fechada.
BeforePrint Ocorre quando a pasta de trabalho é impressa.
BeforeSave Ocorre sempre que a pasta de trabalho é salva.
Deactivate Ocorre quando a pasta de trabalho é desativada.

265
Excel 2016 VBA - Módulo I

Evento Descrição
Ocorre sempre que uma nova planilha é adicionada
NewSheet
à pasta de trabalho.
Open Ocorre quando a pasta de trabalho é aberta.
Ocorre quando uma planilha da pasta de trabalho é
SheetActivate
ativada.
Ocorre quando o usuário clica duas vezes em uma
SheetBeforeDoubleClick
pasta de trabalho.
Ocorre sempre que o usuário clica com o botão
SheetBeforeRightClick
direito do mouse sobre a pasta de trabalho.
Ocorre sempre que uma pasta de trabalho é
SheetCalculate
recalculada.
Ocorre sempre que uma célula da pasta de trabalho
SheetChange
é alterada.
Ocorre quando uma planilha da pasta de trabalho é
SheetDeactivate
desativada.
Ocorre quando o usuário clica em um hyperlink da
SheetFollowHyperlink
pasta de trabalho.
Ocorre quando a seleção é alterada na pasta de
SheetSelectionChange
trabalho.
Ocorre sempre que a janela da pasta de trabalho é
WindowActivate
ativada.
Ocorre quando a janela da pasta de trabalho é
WindowDeactivate
desativada.
Ocorre quando a janela da pasta de trabalho é
WindowResize
restaurada.

•• Outros eventos

Evento Descrição
Ocorre depois da alteração dos dados de um controle,
AfterUpdate
antes do evento Exit e depois do evento BeforeUpdate.
BeforeDragOver Ocorre durante o arraste de um objeto com mouse.
BeforeDropOrPaste Ocorre antes de colar dados em um formulário.
BeforeUpdate Ocorre antes da alteração do conteúdo de um controle.
Change Ocorre sempre que o conteúdo do controle é alterado.

266
Interagindo com o usuário
6
Evento Descrição
Click Ocorre quando um controle é clicado.
DblClick Ocorre sempre que o controle recebe um duplo-clique.
DropButtonClick Ocorre quando a lista do controle é exibida ou fechada.
Ocorre quando o controle recebe o foco que estava em
Enter
outro controle do formulário.
Ocorre quando o controle perde o foco porque este foi
Exit
dado a outro controle do formulário.
Ocorre sempre que um objeto é carregado, antes de
Initialize
sua exibição.
KeyDown Ocorre quando uma tecla é pressionada.
KeyUp Ocorre quando uma tecla é liberada.
Layout Ocorre quando o tamanho de um objeto é alterado.
MouseMove Ocorre sempre que o mouse é movido sobre o controle.
Resize Ocorre quando um formulário é redimensionado.
Ocorre quando a seta à esquerda ou inferior de um
SpinDown
controle é clicada.
Ocorre quando a seta à direita ou superior de um
SpinUp
controle é clicada.
Zoom Ocorre quando o zoom do objeto é alterado.

6.5.1. Procedimento de evento

Todos os controles de formulário possuem um conjunto predefinido de eventos


relacionados. Ao selecionarmos um controle na lista Objeto da janela Código,
a lista Procedimento exibe todos os eventos para o controle selecionado.
Cada procedimento de evento é precedido pelo nome do controle ao qual está
vinculado. Assim, Salvar_Click é o nome do evento Click para um controle
chamado Salvar. É muito importante sabermos que o código não é atualizado
automaticamente quando alteramos os nomes dos controles.

Os procedimentos de evento no VBA são sempre


procedimentos Sub, e não Function.

267
Excel 2016 VBA - Módulo I

Para criarmos um procedimento de evento de um formulário, devemos


determinar o evento que será utilizado, abrir o VBE e utilizar os seguintes
passos:

1. Clique duas vezes no objeto adequado na lista a seguir dos objetos do


Excel. Para criar procedimentos de eventos de planilha, por exemplo, devemos
selecionar uma das planilhas da pasta de trabalho. A janela Código será aberta;

2. Selecione o objeto e o evento para os quais o código será criado. O objeto


deve ser selecionado na lista Objeto, e o evento na lista Procedimento:

3. Clique sobre o evento desejado.

1. Selecione PLAN1;

2. Indique Worksheet;

3. Escreva, na janela Código, o procedimento destinado ao gerenciamento de


eventos que será executado sempre que o evento ocorrer.

268
Interagindo com o usuário
6
No exemplo a seguir, os procedimentos do evento foram inseridos na planilha
Plan1. O evento Deactivate será executado quando o usuário sair da planilha
Plan1. Desta forma, quando sair da planilha em questão, será executado o
comando para selecionar a mesma planilha:

Private Sub Worksheet_Deactivate()


'Evento ativado quando sair da Plan1
Sheets("Plan1").Select
End Sub

É importante destacar que, quando uma pasta de trabalho


é aberta com as macros desativadas, os códigos que
criamos (inclusive os procedimentos para eventos) não
serão executados.

Uma das melhores maneiras de interagir com o usuário é através dos eventos
VBA. A linguagem de macros (VBA) é uma linguagem de programação visual,
que utiliza o paradigma de orientação a objetos e é voltada para eventos.

Para desenvolver soluções que usam o Excel, você pode interagir com os objetos
dele pelas suas propriedades, seus métodos e eventos. Qualquer ação de mouse
ou de teclado feita pelo usuário dispara dezenas de eventos, nos quais pode
haver uma macro programada e, então, o Excel a executará. Como exemplo,
podemos citar o MouseMove.

Os eventos são ações realizadas pelo usuário, usando o teclado ou o mouse. Por
exemplo, ao abrir uma pasta de trabalho, são disparados diversos eventos do
objeto Application e do objeto Workbook. Caso exista alguma programação
VBA nos eventos, elas serão executadas.
Na programação VBA, é possível executar uma macro em resposta a um evento.

A princípio, veremos os eventos dos objetos Workbook e Worksheet. Porém,


quando estivermos trabalhando com UserForms e seus controles (button,
combobox, textbox etc.) veremos que cada um deles também possui suas
propriedades, seus métodos e eventos.

269
Excel 2016 VBA - Módulo I

6.5.2. Eventos do WorkBook

1. Para acessar os eventos do objeto Workbook, na janela de projeto, aplique


um duplo-clique em PastadeTrabalho:

2. Note que uma tela de código nova é acessada, com duas listas drop-down, à
esquerda e à direita. Na lista da esquerda, selecione Workbook:

3. Na lista drop-down da direita, escolha o evento a ser programado:

270
Interagindo com o usuário
6
6.5.2.1. Open

Este evento ocorre quando a pasta de trabalho é aberta.

Private Sub Workbook_Open()


Application.Windowstate = xlMaximized
End Sub

6.5.2.2. BeforeClose

Ocorre antes de uma pasta de trabalho ser fechada.

Private Sub Workbook_BeforeClose(Cancel as Boolean)


Cells(1,1) = now()
End

Note que os eventos Workbook não são colocados no código das planilhas
(Worksheets), mas sim no código da pasta de trabalho.

Pode acontecer de terem sido criadas as macros auto_open e workbook_open.


Ambas serão executadas, a não ser que a pasta de trabalho tenha sido chamada
via código VBA, caso em que só será executada a workbook_open.

O código ActiveWorkbook.RunAutoMacros xlAutoOpen acrescido do comando


que irá chamar a macro executa a auto_open.

6.5.3. Eventos de Worksheet

A seguir, veja os eventos mais comuns utilizados nas planilhas.

271
Excel 2016 VBA - Módulo I

6.5.3.1. Worksheet_Activate

Em uma planilha, considere que, na célula A5, tem um total referente a uma
meta (que pode ser de vendas). Mas, em vez de escrever o código em um
módulo padrão, selecione o evento e escreva na planilha.

Private Sub Worksheet_Activate()


If Range("A5").Value < 6500 Then
MsgBox "Meta de vendas não atingida!!!"
Else
MsgBox "Meta de vendas atingida!!! Parabéns!!!"
End if
End Sub

6.5.3.2. Worksheet_SelectionChange

Este evento ocorrerá quando o usuário mudar de célula.

Private Sub Worksheet_SelectionChange(ByVal a As Range)


MsgBox "Você acaba de ir para a célula " & a.Address
End Sub

6.5.3.3. Worksheet_Calculate

Este evento ocorrerá toda vez que algum cálculo na planilha for atualizado.

Private Sub Worksheet_Calculate()


If Range("A5").Value < 6500 Then
MsgBox "Meta de vendas não atingida!!!"
Else
MsgBox "Meta de vendas atingida!!! Parabéns!!!"
End If
End Sub

272
Interagindo com o usuário
6
6.5.3.4. Worksheet_Change
Este exemplo altera, para azul, a cor das células alteradas.

Private Sub Worksheet_Change (ByVal a as Range)


a.Font.ColorIndex = 5
End Sub

6.5.4. Eventos com UserForms

Com os UserForms podemos criar interfaces personalizadas, diferentes da


interface padrão do Excel.

Para a criação de um UserForm, seguimos os seguintes passos:

1. Insira um objeto UserForm na pasta de trabalho pelo editor do VBA;

2. Adicione controles com seus respectivos códigos em VBA.

273
Excel 2016 VBA - Módulo I

É importante notar que, assim como tantos outros objetos, o UserForm, bem
como cada um dos seus controles, tem suas respectivas propriedades, métodos
e eventos.

Podemos usar o método Show (exibir) do objeto UserForm no momento em


que a Pasta de Trabalho for aberta, usando o evento Open do Workbook. Veja
o exemplo:

Private Sub Workbook_Open()


UserForm1.Show
End sub

O evento Initialize dos Userforms é muito utilizado para definirmos como o


usuário verá o formulário na primeira vez de uso.

Se usarmos as propriedades Height e Width, junto com o evento Initialize,


podemos dimensionar o UserForm na tela do usuário, no momento que ele é
chamado. Veja o exemplo:

Private Sub UserForm_Initialize()


Me.Height = Int(0.98 * ActiveWindow.Height)
Me.Width = Int(0.98 * ActiveWindow.Width)
End Sub

274
Interagindo com o usuário
6
Depois de criado o objeto TextBox para que o usuário entre com uma informação,
podemos criar o seguinte código no seu evento AfterUpdate (após atualização):

Private Sub TextBox1_AfterUpdate()


If Not IsNumeric(TextBox1.Value) Then
MsgBox "Digite valor númerico!!!"
TextBox1.Value = ""
TextBox1.SetFocus
Exit Sub
End If
If (TextBox1.Value < 1000) Or (TextBox1.Value > 15000) Then
MsgBox "O valor deve estar entre 1000 e 15000!!!"
TextBox1.Value = ""
TextBox1.SetFocus
Exit Sub
End If
End Sub

Note que, após o preenchimento do TextBox1, o formulário só terá continuidade


se o valor preenchido for numérico e entre 1000 e 15000.

Uma coisa muito interessante que deve ser enfatizada é o fato de essas
propriedades poderem ser definidas tanto pela janela Propriedades quanto
em tempo de execução (no meio de uma macro, por exemplo).

275
Excel 2016 VBA - Módulo I

Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• A caixa de mensagem é utilizada para passar informações ou para executar


um comando que depende de uma resposta do usuário;

•• Para exibir uma mensagem, podemos utilizar o comando Msgbox. Com


a função Msgbox(), podemos definir uma caixa de mensagem com mais
de um botão e identificar qual dos botões foi clicado pelo usuário para,
posteriormente, indicar uma ação a ser executada, dependendo do item
escolhido;

•• Use InputBox para exibir uma caixa de diálogo simples de forma que você


possa inserir informações a serem usadas em uma macro;

•• O método InputBox do objeto Application se diferencia da função InputBox


por ter um argumento a mais: type, o último parâmetro, que define o tipo
de dado a ser retornado;

•• As caixas de diálogo do Excel são muito úteis para agilizar o trabalho com
programação, pois, por meio delas, os próprios usuários podem escolher
diversas opções, como formatar fonte, preencher sequências, imprimir etc.;

•• Enquanto utilizamos o Excel, a cada ação do usuário são disparados vários


eventos em que se tiver programado alguma macro, esta será executada
quando o evento for disparado.

276
Interagindo com
6
o usuário
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. Qual comando utilizamos para criar uma quebra de linha


dentro da caixa de mensagem?

☐☐ a) Vbcrlf

☐☐ b) Input

☐☐ c) Print

☐☐ d) InputBox

☐☐ e) Enter

2. Qual opção define melhor o objetivo de usarmos a função


InputBox em uma macro?

☐☐ a) Para que o usuário possa inserir informações a serem


usadas.

☐☐ b) Exibir um conteúdo.

☐☐ c) Tratar um erro.

☐☐ d) Declarar uma variável.

☐☐ e) Redimensionar um array.

278
Interagindo com o usuário
6
3. Qual a finalidade do argumento Default da função
InputBox?

☐☐ a) Personalizar um título na janela.

☐☐ b) Definir os botões no InputBox.

☐☐ c) Definir a cor do InputBox.

☐☐ d) Exibir o texto como padrão quando a caixa for


carregada.

☐☐ e) No topo da janela, inserir o botão de restaurar seu


tamanho.

4. Em que o método InputBox do objeto Application difere


da função InputBox?

☐☐ a) Pelo formato da caixa de diálogo exibida.

☐☐ b) Pelo argumento Type.

☐☐ c) Pela possibilidade de o usuário marcar várias opções


de respostas.

☐☐ d) Por criar um novo objeto Application.

☐☐ e) Nenhuma das alternativas anteriores está correta.

279
Excel 2016 VBA - Módulo I

5. Para qual das ações a seguir o Excel terá algum


evento disparado?

☐☐ a) Ao abrir um arquivo.

☐☐ b) Ao fechar um arquivo.

☐☐ c) Ao clicar em uma célula.

☐☐ d) Ao inserir uma planilha.

☐☐ e) Todas as alternativas anteriores estão corretas.

280
Interagindo com
6
o usuário
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Criando uma macro que salva o arquivo quando a planilha for editada

Neste laboratório, criaremos uma macro que salva o arquivo toda vez que o
usuário editar a planilha, inserindo ou deletando dados em qualquer célula.
Para isso, iremos programar o evento Change da Planilha1, seguindo os passos
adiante:

1. Clique com o botão direito do mouse na aba da planilha e escolha a opção


Exibir Código:

Com isso, o Editor do Visual Basic é acessado já no módulo Private desta


planilha:

282
Interagindo com o usuário
6
2. Escolha o objeto que você vai programar. Nesse caso, a planilha:

3. Note que o Editor “sugere” programar o evento SelectionChange. Independente


desta sugestão, para este laboratório, escolha o evento Change:

4. Apague o outro evento que não será programado;

5. No evento Change, utilize o código ThisWorkBook.Save:

6. Retorne à planilha e teste. Note que, a cada alteração (inclusão, edição


ou exclusão) de qualquer conteúdo em qualquer célula, este arquivo é
automaticamente salvo.

283
7
Objeto UserForm
99 Criando formulários;
99 Controles da Caixa de ferramentas do UserForm.
Excel 2016 VBA - Módulo I

7.1. Introdução
O Visual Basic utiliza o objeto UserForm como interface entre os usuários e
o computador. O objeto UserForm, também conhecido como formulário,
apresenta-se para o usuário como uma caixa de diálogo que pode incluir
controles diversos, como espaços para a inserção de texto, botões (como OK
ou Cancelar, entre outros), imagens e caixas de seleção. Todos os controles
podem ser associados a ações específicas.

7.2. Criando formulários
Tão importante quanto criar de fato o formulário é o processo de seu
planejamento. Os formulários são interfaces gráficas do usuário (ou GUI,
Graphical User Interface), por isso, suas instruções, aparência e organização de
seus elementos devem ser cuidadosamente planejadas para que eles possam
ser utilizados de forma simples e eficiente pelos usuários da aplicação.

Para criar um formulário, devemos, no Editor VBE, acessar o menu Inserir e,


então, clicar na opção UserForm. Vale ressaltar que um objeto UserForm,
ilustrado na imagem seguinte, contém um único formulário.

Ao inserir o primeiro UseForm também é aberta a Caixa de ferramentas, na qual


dispomos de controles que podem ser adicionados aos formulários. Falaremos
mais sobre ela adiante.
Caixa de ferramentas

Formulários

286
Objeto UserForm
7
Em seguida, devemos utilizar os próximos passos, que serão abordados
detalhadamente nos tópicos deste capítulo:

1. Adicione os controles necessários ao UserForm, como botões e caixas de


texto;

2. Modifique as propriedades dos controles e do UserForm, utilizando a janela


Properties;

3. Escreva procedimentos destinados ao gerenciamento de eventos para os


controles, como macros que serão executadas quando botões forem clicados;

4. Escreva, em um módulo VBA, um procedimento que exiba o formulário criado


para o usuário.

7.2.1. Inserindo controles em um formulário


Inicialmente, todos os formulários criados são vazios, ou seja, não apresentam
controles, como botões, caixas de texto ou caixas de opções. Todos os controles
devem ser inseridos por meio da Caixa de ferramentas, exibida a seguir:

Grande parte dos controles da Caixa de ferramentas


é semelhante aos controles da Barra de ferramentas
Formulários do Excel.

Para inserir um controle, devemos clicar sobre ele e arrastá-lo até o ponto
desejado do formulário. O tamanho do controle pode ser alterado por meio da
janela de Propriedades, arrastando-se as alças de edição (da mesma forma que
redimensionamos objetos de desenho do Windows) ou por código em tempo
de execução.

287
Excel 2016 VBA - Módulo I

7.2.1.1. Caixa de ferramentas

Conheceremos, a seguir, os controles que podem ser inseridos nos formulários


a partir da Caixa de ferramentas:

Controle Descrição

Label
O controle Label é utilizado para exibir um texto no
(rótulo)
formulário.

TextBox
O controle TextBox cria uma caixa de texto que permite a
(caixa de texto)
inserção de texto pelo usuário.

ComboBox Este controle é similar ao ListBox, com a diferença de que


(caixa de exibe apenas um item por vez, apresentando-se como
combinação) uma caixa drop-down, e permite a inserção de um valor
diferente dos que a lista apresenta.

ListBox
(caixa de O controle ListBox permite que o usuário selecione um ou
listagem) mais itens de uma lista.

CheckBox
Este controle é utilizado para obter escolhas binárias, como
(caixa de seleção)
verdadeiro ou falso e sim ou não.

O controle OptionButton apresenta ao usuário um


OptionButton grupo de dois ou mais itens, dentre os quais um pode
(botão de opção) ser selecionado. Os controles OptionButton podem ser
agrupados por meio da propriedade GroupName ou podem
ser colocados dentro de um mesmo controle Frame.

ToggleButton Este controle apresenta-se na forma de um botão que,


(botão de quando clicado, alterna entre os estados ativado (True),
ativação) cuja aparência é de um botão pressionado, e desativado
(False), cuja aparência é de um botão não pressionado.

288
Objeto UserForm
7
Controle Descrição
Frame O controle Frame é utilizado para organizar outros
(moldura) controles, reunindo grupos lógicos ou apenas organizando
visualmente os elementos do formulário.
O controle CommandButton apresenta-se para o usuário
como um botão que pode ser clicado. Este controle é
CommandButton utilizado com procedimentos que manipulam eventos, que
(botão de são executados quando o botão é clicado. Ao clicarmos
comando) neste controle, uma macro armazenada na janela Código
do UserForm é executada. O nome dessa macro deve ser
composto pelo nome do botão seguido de um underline e
da palavra Click, por exemplo, Abrir_Click.

TabStrip
O controle TabStrip exibe guias no formulário. Este
(faixa de
controle é semelhante ao controle MultiPage, porém, sua
tabulação)
utilização é mais complexa.

Este controle é utilizado para criar caixas de diálogo com


MultiPage guias. O padrão é que o controle apresente duas guias,
(multipágina) mas podemos inserir outras clicando com o botão direito
do mouse sobre uma guia existente e selecionando a opção
New Page do menu de contexto.
O controle ScrollBar é semelhante ao SpinButton, com
a diferença de que permite que o usuário arraste o
ScrollBar
botão do controle para aumentar ou diminuir os valores
(barra de
com incrementos maiores. Este controle, normalmente,
rolagem)
é utilizado quando existe a necessidade de o usuário
especificar um valor dentro de um intervalo de valores
possíveis.

SpinButton O controle SpinButton apresenta ao usuário duas setas,


(botão de rotação) uma apontando para cima e outra para baixo, as quais
aumentam ou diminuem um valor quando clicadas.

289
Excel 2016 VBA - Módulo I

Controle Descrição
O controle Image é utilizado para exibir imagens no
formulário, como fotos ou logotipos. As imagens dos
controles Image são armazenadas junto com a pasta
de trabalho. Por um lado, isso traz a vantagem de não
ser necessário enviar arquivos adicionais quando
Image
compartilhamos a pasta de trabalho com alguém; por outro
(imagem)
lado, o tamanho do arquivo da pasta de trabalho pode
aumentar muito. É recomendável, portanto, utilizarmos
imagens pequenas.
Para inserir um clip-art no formulário, devemos
primeiramente inseri-lo em uma planilha e, então, copiá-lo
e colá-lo no formulário.

Podemos utilizar o método AddItem para adicionar itens


ao controle, caso a lista de itens não esteja disponível em
uma planilha.

7.2.2. Configurando as propriedades dos controles

O objeto UserForm e cada um dos controles que podem ser inseridos em um


formulário possuem propriedades diversas que, de acordo com o valor definido,
fazem com que os controles apresentem uma aparência ou comportamento
específico. Essas propriedades podem ser visualizadas e editadas por meio
da janela de Propriedades do VBE, exibida na próxima imagem. É importante
salientar que essa janela exibe as propriedades do controle atualmente
selecionado no formulário.

290
Objeto UserForm
7

Serão exibidas as
propriedades do objeto
selecionado.

Caso a janela de Propriedades não esteja visível, basta


pressionar a tecla F4, ou acessar o menu Exibir e clicar na
opção Janela 'Propriedades'.

As principais propriedades dos controles de formulários estão descritas na


próxima tabela. É importante destacar que essas propriedades variam de controle
para controle, ou seja, não estão presentes, obrigatoriamente, em todos eles,
apesar de alguns controles possuírem propriedades comuns.

Propriedade Descrição
Define uma tecla que acessa o controle quando pressionada
Accelerator
em conjunto com a tecla ALT, por exemplo, ALT + L.
Quando definida como True, faz com que o controle seja
automaticamente redimensionado de acordo com a largura
AutoSize
do texto que é inserido. Quando definida como False, a
largura do controle é fixa.

291
Excel 2016 VBA - Módulo I

Propriedade Descrição
Quando definida como True, ativa a ocorrência da tabulação
automática para o próximo controle sempre que o número
AutoTab
máximo de caracteres permitido para o controle for inserido.
Quando definida como False, não ocorre tabulação.
Quando definida como True, as palavras são consideradas
unidades básicas se o usuário estender uma seleção (ao
colocar o ponto de inserção no meio de uma palavra e
AutoWordSelect
arrastar, toda a palavra será selecionada). Quando definida
como False, os caracteres são tomados como unidades
básicas.
BackColor Define a cor de preenchimento do controle.
O valor 1 define o plano de fundo como opaco, e o valor 0
BackStyle define o plano de fundo como transparente, caso em que a
propriedade BackColor será ignorada.
Define a cor da borda do controle. Para a visualização da
BorderColor borda, a propriedade BorderStyle deverá ser definida com
o valor 1.
O valor 1 define uma borda simples para o controle, e o
BorderStyle valor 0 faz com que o controle não possua bordas, caso em
que a propriedade BorderColor será ignorada.
Quando o controle possui várias colunas, indica a coluna
BoundColumn
que contém os dados que serão armazenados.
Quando definido como True, faz com que o controle assuma
Cancel a função do botão Cancelar. Quando definido como False,
o controle não assume essa função.
Define o rótulo do controle, ou seja, o texto que é exibido
Caption
para o usuário.
Esta é uma propriedade utilizada nos controles ComboBox
e ListBox. Quando definida como 0, o controle não exibe
ColumnCount
nenhuma coluna da lista. Quando definida como -1, todas
as colunas da lista são exibidas pelo controle.
Especifica a célula que armazena ou define o valor do controle.
A utilização da propriedade ControlSource em controles
ControlSource SpinButton deve ser evitada em planilhas que levam muito
tempo para serem calculadas, já que essa propriedade faz
com que toda a planilha seja recalculada a cada alteração.

292
Objeto UserForm
7
Propriedade Descrição
Define um texto exibido sempre que o mouse apontar para
ControlTipText
o controle, como um comentário.
Quando definida como True, o controle passa a assumir a
Default função de botão de comando padrão do formulário, podendo
ser acessado com a tecla ENTER.
Quando definida como True, o controle é habilitado, ou seja,
Enabled pode receber foco. Quando definida como False, o controle
é desabilitado.
Font Define o formato da fonte para o texto do controle.
ForeColor Define a cor do texto do controle.
Define um nome de grupo para o controle. Os controles
que possuem o mesmo valor para essa propriedade são
GroupName
associados, formando grupos. Caso essa propriedade não
seja definida, todos os controles farão parte de um só grupo.
Define a largura do controle, utilizando pontos (cada ponto
Height
é igual a 0,0353 cm).
Quando definida como True, faz com que o texto do controle
perca o foco, ou seja, deixe de ser selecionado quando o
HideSelection usuário faz a seleção de outro controle. Quando definida
como False, o texto mantém o foco mesmo após outro
controle ser selecionado.
Quando definida como True, faz com que o controle seja
automaticamente redimensionado de acordo com a altura
do texto, ou seja, a quantidade de linhas que são inseridas.
Quando definida como False, a altura do controle é fixa.
IntegralHeight É importante ressaltar que, ao definirmos a propriedade
IntegralHeight como True, o Visual Basic ajustará a altura
do controle para que a última entrada possa ser visualizada
por inteiro. Assim, é possível que a altura do controle exibido
ao usuário seja diferente da altura que definimos.
Define o valor que será incrementado ou decrementado a
LargeChange cada clique à esquerda ou à direita do botão de um controle
ScrollBar.
Define a posição do controle em relação à borda esquerda
Left
do controle que o contém.

293
Excel 2016 VBA - Módulo I

Propriedade Descrição
Define quantas linhas serão exibidas pelo controle. Caso
o controle possua uma quantidade de itens maior que o
ListRows
número definido nesta propriedade, será exibida uma barra
de rolagem.
ListStyle Define a aparência dos itens exibidos pelo controle.
Quando definida como True, o controle é bloqueado, não
Locked aceitando edições. Quando definida como False, o controle
pode ser editado normalmente.
Define como é feita a pesquisa enquanto o usuário digita
um valor no controle:

•• Quando definida como 0, serão exibidas ao usuário as


primeiras palavras da lista que sejam iniciadas com cada
letra digitada, uma de cada vez: em uma lista com os
Estados brasileiros, por exemplo, um usuário que deseje
digitar Pernambuco encontrará a seguinte situação: ao
digitar P, será exibido Pará; ao digitar o E, será exibido
MatchEntry
Espírito Santo; e ao digitar o R será exibido Rio de Janeiro;

•• Quando definida como 1, a pesquisa considera a sequência


de caracteres digitados pelo usuário: ao digitar A, será
exibido Acre; em seguida, se o usuário digitar L, será
exibido Alagoas, e se digitar M será exibido Amapá;

•• Quando definida como 2, não há pesquisa; o controle


exibirá apenas os caracteres digitados pelo usuário.
Quando definida como True, não aceita entradas que não
correspondam exatamente a algum item da lista. Quando
MatchRequired definida como False, permite que o usuário insira qualquer
sequência de caracteres, mesmo que não corresponda a
nenhum item da lista.
Define o valor máximo aceito pelo controle. É muito utilizado
Max
nos controles SpinButton e ScrollBar.
Define o número de caracteres que podem ser inseridos no
MaxLenght
controle.
Define o valor mínimo aceito pelo controle. É muito utilizado
Min
nos controles SpinButton e ScrollBar.

294
Objeto UserForm
7
Propriedade Descrição
Define um ícone personalizado para o ponteiro do mouse,
exibido quando este for posicionado sobre o controle. O
estilo do ponteiro pode ser indicado por meio da pasta
MouseIcon que contém os ponteiros de mouse, a qual está localizada
dentro da pasta Windows. Para utilizar esta propriedade, é
necessário que a propriedade MousePointer esteja definida
com o valor 99.
Define um ícone para o ponteiro do mouse, exibido quando
MousePointer este for posicionado sobre o controle. O valor desta
propriedade pode ser um número de 0 a 15 ou 99.
Quando definida como True, faz com que o controle exiba o
MultiLine texto em várias linhas. Quando definida como False, o texto
é exibido em uma única linha.
Quando definida como 1 ou 2, permite que o usuário
selecione mais de um item da lista exibida pelo controle.
MultiSelect Vale salientar que, com isso, não é possível especificar uma
propriedade ControlSource. Para definir os itens que serão
selecionados, é necessário escrever uma macro.
Define um nome utilizado para fazer referências ao controle
nos procedimentos. É recomendável adotar um padrão
para nomear os controles, para que sua identificação e a
Name
manutenção do código sejam mais simples. Podemos,
por exemplo, utilizar prefixos que identifiquem o tipo de
controle, como txtNomeCurso e imgFotoAluno.
Define o caractere que será exibido no lugar de cada
PasswordChar caractere digitado no controle. Esta propriedade é utilizada
em campos de senha, por exemplo.
Picture Define uma figura para ser exibida no controle.
Define a forma como uma imagem será exibida no formulário
PictureSizeMode quando os tamanhos do controle e da imagem não forem
correspondentes.
Define o intervalo de células onde estão armazenados os
RowSource
itens que são exibidos no controle.
De acordo com o valor, define a presença de barras de
rolagem no controle: nenhuma barra de rolagem (0), apenas
ScrollBars
a barra de rolagem horizontal (1), apenas a barra de rolagem
vertical (2) ou ambas (3).

295
Excel 2016 VBA - Módulo I

Propriedade Descrição
Define o valor do incremento do controle (utilizado nos
SmallChange
controles SpinButton e ScrollBar).
Define o local de origem dos dados exibidos pelo controle,
Source
como um intervalo de células.
Utiliza valores de 0 a 6 para definir como o controle será
SpecialEffect
apresentado.
Quando definida como 2, não aceita entradas que não
correspondam exatamente a algum item da lista. Quando
Style definida como 0, permite que o usuário insira qualquer
sequência de caracteres, mesmo que não corresponda a
nenhum item da lista.
Determina qual é a posição do controle na ordem de
tabulação. A tabulação (através da tecla TAB) muda o foco de
um controle para outro em ordem crescente, de acordo com
TabIndex o número que cada controle possui para esta propriedade.
Também é possível realizar o controle de tabulação utilizando
a opção Ordem de Tabulação contida no menu Exibir do
Editor VBE.
Quando definida como True, o controle permite que o usuário
insira tabulações no texto digitado. Quando definida como
TabKeyBehavior
False, pressionar a tecla TAB moverá o foco para o próximo
controle de acordo com a ordem de tabulação.
Quando definida como True, permite que o controle receba
TabStop foco com a tecla TAB. Quando definida como False, o
controle não recebe foco.
Text Define ou retorna o texto do controle.
Define o alinhamento à esquerda (1), centralizado (2) ou à
TextAlign
direita (3) para o texto do controle.
TextColumn Define a coluna do controle que será exibida ao usuário.
Define a posição do controle em relação à borda superior do
Top
controle que o contém.

296
Objeto UserForm
7
Propriedade Descrição
Esta propriedade varia de acordo com alguns controles:

•• Para os controles ComboBox e ListBox, a propriedade


Value define um texto para o item selecionado pelo
usuário;

•• Para o controle CheckBox, a propriedade Value pode


ser definida como True, apresentando uma marca de
checagem no controle, ou como False, apresentando o
controle sem essa marca;
Value
•• Para o botão OptionButton, a propriedade pode fazer
com que o botão aparente estar selecionado (True), ou
não (False);

•• Para o controle MultiPage, esta propriedade define qual


guia é exibida (0 exibe a primeira guia, 1 exibe a segunda,
2 exibe a terceira, e assim sucessivamente);

•• Para os controles ScrollBar e SpinButton, esta propriedade


define o valor atual do controle.
Quando definida como True, determina que o controle
Visible seja visível no formulário. Quando definida como False, o
controle é oculto.
Width Define a largura do controle, em pontos.
Quando definida como True, o texto do controle apresenta
WordWrap quebras automáticas de linha. Quando definida como False,
as quebras de linha são desativadas.

297
Excel 2016 VBA - Módulo I

7.2.3. Configurando a aparência dos controles

É importante criarmos formulários de fácil utilização, ou seja, que possuam


um número pequeno de controles, com tamanhos adequados e alinhados
perfeitamente (podemos considerar como parâmetro, por exemplo, a aparência
das caixas de diálogo do Excel).

Caso seja necessário um grande número de controles,


é recomendável organizá-los em controles MultiPage
(multipáginas), de forma que grupos pequenos sejam
exibidos em cada guia.

A Barra de ferramentas UserForm, exibida a seguir, possui ferramentas úteis


no trabalho de edição e organização dos controles. Para visualizá-la, devemos
clicar no menu Exibir, depois em Barras de ferramentas e, em seguida, em
UserForm.

Algumas dessas ferramentas são descritas na tabela a seguir:

Opção Descrição
Altera o zoom da exibição da caixa de diálogo.
Alinha dois ou mais controles entre si com as opções Esquerdas,
Centros, Direitas, Superiores, Meios, Inferiores, ou um
ou mais controles com a opção À grade. Os controles são
alinhados em relação à posição do controle que possui as alças
de edição brancas (antes de acessar esse botão, é necessário
que os objetos a serem alinhados estejam selecionados).
Centraliza um ou mais controles em relação ao formulário,
por meio das opções Horizontalmente e Verticalmente.
Define a mesma altura, a mesma largura ou o mesmo tamanho
(altura e largura) para os controles selecionados, por meio
das opções Altura, Largura e Ambos.

298
Objeto UserForm
7
A seleção simultânea de vários controles é muito utilizada para agilizar a edição
da aparência e até mesmo das propriedades dos controles. Com vários controles
selecionados, podemos arrastar as alças de edição de apenas um deles para
que todos sejam redimensionados proporcionalmente de forma automática, ou
alterar as propriedades de todos os controles de uma única vez. É importante
notarmos que a janela de Propriedades exibirá apenas as propriedades que
são comuns a todos os controles selecionados.

Para selecionar simultaneamente vários controles adjacentes, basta clicarmos


no primeiro controle e mantermos a tecla SHIFT pressionada enquanto clicamos
no último controle, ou clicarmos e arrastarmos o mouse sobre a área que contém
os controles que desejamos selecionar. Também é possível selecionarmos
simultaneamente vários controles não adjacentes mantendo a tecla CTRL
pressionada enquanto clicamos nos controles desejados.

Muitas vezes, é necessário inserir vários controles do mesmo tipo (por exemplo:
label, textbox). Em casos assim, podemos copiar o controle com a utilização
dos atalhos CTRL + C e CTRL + V, ou, ainda, clicando sobre o controle de
origem e, com a tecla CTRL pressionada, arrastando com o mouse até a posição
de destino.

7.3. Controles da Caixa de ferramentas do


UserForm
Para entendermos o funcionamento de todas as etapas de criação de um
formulário, criaremos um para efetuar o cadastramento de alunos. Os dados
serão cadastrados no próprio formulário e inseridos na planilha denominada
Alunos quando for pressionado o botão Cadastrar do formulário. Para a criação
de tal formulário, devemos seguir os passos adiante:

1. Crie uma pasta de trabalho contendo as planilhas Alunos e Apoio. Na


planilha Alunos, serão armazenadas as informações cadastradas. Utilizaremos
a planilha Apoio para guardar as informações a serem exibidas no formulário;

299
Excel 2016 VBA - Módulo I

2. Digite as informações conforme o exemplo e nomeie o intervalo de células


"A2:B6" como cursos:

3. Na planilha Alunos, faça como mostrado no exemplo seguinte:

•• 1ª Etapa: Criação do layout do formulário

1. Acesse o VBE e insira um novo formulário por meio da opção UserForm,


contida no menu Inserir;

2. Nomeie o formulário (que até o momento tem o nome de UserForm1) por


meio da janela Properties, alterando o conteúdo da propriedade Name para
frmAlunos;

300
Objeto UserForm
7
3. Altere o texto contido na Barra de título do formulário, alterando o conteúdo
da propriedade Caption para Cadastro de Alunos;

4. Para executar o formulário, clique uma vez sobre ele e pressionar a tecla de
função F5;
Conteúdo inserido na
propriedade Caption.

5. Para obter os controles que serão inseridos no frmAlunos, utilize a Caixa de


ferramentas, contida em Exibir;

6. Insira um rótulo, alterando a propriedade Name para IblAluno e a propriedade


Caption para Nome:

7. Insira outro rótulo abaixo do primeiro. Nesse caso, podemos usar o mesmo
procedimento para a criação do primeiro rótulo ou efetuar uma cópia dele. A
propriedade Name deve ser alterada para lblCurso, e a propriedade Caption
deve ser alterada para Curso;

301
Excel 2016 VBA - Módulo I

8. Alinhe os controles mantendo a tecla SHIFT pressionada e, então, clique em


todos os controles desejados a fim de selecioná-los. Em seguida, clique com o
botão direito do mouse e acesse a opção desejada dentro do submenu Alinhar,
como mostra o exemplo seguinte:

9. Insira o controle Caixa de Texto alterando a propriedade Name para txtAluno,


a propriedade MaxLength para 40 (que é o número máximo de caracteres a
serem inseridos no controle) e a propriedade Width para 195 (que é a largura
do controle):
Controle
Caixa de Texto.

302
Objeto UserForm
7
10. Insira, na frente da palavra Curso, o controle Caixa de Combinação, o
qual permitirá que o usuário escolha o curso desejado de acordo com uma lista
predefinida. Este controle buscará as informações referentes aos cursos que
estão digitadas na planilha Apoio, região nomeada como Cursos;

11. Altere a propriedade Name para cmbCurso, a propriedade RowSource para


Cursos (nome da região indicada na planilha Apoio), a propriedade ListRows
para 5 (número de itens a serem exibidos) e a propriedade Style para 2 (somente
poderá ser digitado um valor contido na lista). Veja, na imagem adiante, qual é
a aparência após executar:

ListRows: 5

Será possível observar que são exibidas apenas as informações contidas na


primeira coluna do intervalo Cursos, porém, o controle Caixa de Combinação
permite a visualização das demais colunas do intervalo, conforme o status da
propriedade ColumnCount deste controle, sendo:

•• 0, para não exibir coluna alguma;

•• -1, para exibir todas as colunas;

•• Outro número, para exibir um número específico de colunas.

A intenção é exibir apenas os nomes dos cursos, ou seja, a primeira coluna do


intervalo nomeado (ColumnCount = 1), pois, no momento em que selecionarmos
um curso na Caixa de Combinação, deverá ser exibido o valor correspondente
em um rótulo.

303
Excel 2016 VBA - Módulo I

12. Crie mais dois rótulos, alterando, no primeiro rótulo, a propriedade Name
para IblRotValor e a propriedade Caption para Valor:. No segundo rótulo,
altere a propriedade Name para IblValor, a propriedade Caption para 0,00 e a
propriedade TextAlign para 3fmTextAlignRight;

13. Caso necessário, selecione todos os controles desta linha e efetue o


alinhamento. Para tanto, clique com o botão direito do mouse sobre a seleção,
selecione Alinhar e, então, Inferiores:

14. Insira o controle Quadro alterando a propriedade Name para framTipo e a


propriedade Caption para Tipo de Pagamento;

15. No controle Quadro, insira dois controles Botão de Opção alterando as


seguintes propriedades:

•• Name: optPrazo;
•• Caption: A Prazo.

•• Name: optVista;
•• Caption: À Vista.

16. Insira dois controles Botão de Comando, alterando as seguintes


propriedades:

•• Name: cmdCadastrar;
•• Caption: Cadastrar;
•• Accelerator: C (define a tecla de atalho para o controle).

304
Objeto UserForm
7
•• Name: cmdFechar;
•• Caption: Fechar;
•• Accelerator: F (define a tecla de atalho para o controle).

Controles: Quadro /
Botão de Opção

Botões de Comando

No momento em que for indicado o tipo de pagamento por meio de um dos


botões de opção, será efetuada uma das condições:

•• À Vista: Será exibido um controle indicando o valor total a ser pago, com
15% de desconto sobre o valor do curso;

•• A Prazo: De acordo com a indicação do número de parcelas, deverá ser


exibido o valor de cada uma das parcelas, sendo possível a divisão em até
12 vezes iguais.

17. Crie os seguintes controles, os quais ficarão ocultos, sendo exibidos somente
no momento do clique no botão de opção A Prazo:

•• Propriedades dos rótulos

•• Name: lblRotQtde;
•• Caption: Parcelas;
•• Visible: False (oculta o controle).

•• Name: lblRotlParcela;
•• Caption: Valor / Parcela
•• Visible: False (oculta o controle).

305
Excel 2016 VBA - Módulo I

•• Name: lblValParcela;
•• Caption: 0,00
•• SpecialEffect: 2 (efeito para o controle);
•• TextAlign: 3 fmTextAlignRight (alinhamento de texto à direita);
•• Visible: False (oculta o controle).

•• Propriedades da Caixa de Texto

•• Name: txtQtde;
•• Text: 2;
•• Visible: False (oculta o controle).

•• Propriedades do Botão de Rotação

•• Name: spiQtde;
•• Min: 2 (valor mínimo);
•• Max: 12 (valor máximo);
•• SmallChange: 1 (valor incremental);
•• Visible: False (oculta o controle).

Organize-os da seguinte maneira:

Estes controles serão exibidos


somente quando indicado o tipo de
pagamento A Prazo.

306
Objeto UserForm
7
18. Crie os seguintes controles a serem exibidos no momento do clique no
botão de opção À Vista:

•• Propriedades dos Rótulos:

•• Name: lblRotVista;
•• Caption: Total a Pagar;
•• Visible: False (oculta o controle).

•• Name: lblVista;
•• Caption: 0,00;
•• TextAlign: 3 fmTextAlignRight (alinhamento de texto à direita).
•• SpecialEffect: 2 (efeito para o controle).

Estes controles serão exibidos


somente quando indicado o tipo de
pagamento À Vista.

•• 2ª Etapa: Tornando o formulário funcional – eventos dos controles

Após a criação do layout do formulário é necessário automatizar os controles.


Este recurso ocorre através dos eventos, ou seja, o evento é acionado quando
ocorre alguma ação em um controle, por exemplo, um clique em um botão, a
inserção de dados em uma caixa de texto etc. Você deve realizar os seguintes
passos:

307
Excel 2016 VBA - Módulo I

1. Dentro do evento, digite o código que será executado quando esse evento
ocorrer para o controle. A seguir, temos descritas duas formas para editar um
evento:

•• Clique duas vezes no controle para abrir o evento automaticamente;

•• Dentro do Editor VBE, indique o controle dentro da Caixa de seleção Objetos


do Formulário e selecione o evento em Procedimento.

Procedimentos

Objetos do Formulário

2. Dentro do evento, digite o código que será executado quando esse evento
ocorrer para o controle.

308
Objeto UserForm
7
Podemos citar como exemplo o controle Botão de Comando, o qual receberá um
código para fechar o formulário quando ocorrer o evento Clicar nesse controle.
Este é um evento padrão para esse controle, ou seja, se, no VBE, dermos um
duplo-clique sobre o botão, será criada a instrução para este evento, não sendo
necessário escolher evento algum na Lista de Procedimentos:

3. Clique duas vezes sobre o controle cmdFechar e digite o comando UnloadMe


para fechar o formulário atual, como mostrado a seguir:

Private Sub CmdFechar_Click()


Unload Me
End Sub

309
Excel 2016 VBA - Módulo I

4. Na área de edição de código, execute o formulário por meio de uma das


seguintes opções:

•• Pressione a tecla de função F5;

•• Na janela Project Explorer, dê um duplo-clique em frmAlunos e, em


seguida, pressione F5.

Então, será necessário automatizar os demais controles no formulário. Por


exemplo, ao selecionarmos um determinado curso no controle cmbCurso,
deverá ser exibido o seu valor no controle lblValor, ou seja, o evento Change
da caixa de combinação irá buscar na planilha Apoio o valor correspondente
ao item selecionado, o qual está na mesma linha do curso e em uma coluna à
direita.

A seguir, temos os dados da Planilha Apoio:

CURSO VALOR
Windows R$ 290,00
Word R$ 350,00
Excel R$ 450,00
Power Point R$ 380,00
Access R$ 440,00

Alguns itens devem ser observados com atenção. São eles:

•• Intervalo na planilha foi nomeado como Cursos;

•• Este mesmo intervalo está sendo utilizado pelo controle cmbCurso


(propriedade RowSource);

•• A caixa de combinação exibe somente as informações da primeira coluna;

•• Quando selecionado um item na caixa de combinação (primeira coluna),


deverá ser exibido o valor que está na mesma linha e na primeira coluna à
direita, a propriedade Column(1).

310
Objeto UserForm
7
5. Clique duas vezes no controle cmbCurso e digite o seguinte código:

Private Sub CmbCurso_Change()


lblValor = CmbCurso.Column(1)
End Sub

Durante a execução do formulário, ao escolhermos um determinado curso,


será exibido, no controle lblValor, o valor correspondente a ele. No entanto,
esse valor não será apresentado com a mesma formatação numérica que se
apresentava na planilha, sendo necessário realizar a formatação deste valor
também dentro do formulário.

Valor sem
formatação.

6. Defina a formatação do valor a ser exibido no controle Rótulo utilizando a


função Format, conforme o exemplo a seguir:

lblvalor = Format(cmbcurso.Column(1), "#,##0.00")

Ao clicarmos no botão de opção optVista, serão necessárias as seguintes ações:

•• Garantir que os controles de opção A Prazo estejam ocultos;

•• Deixar visíveis os controles da opção À Vista;

•• Exibir o valor do curso com 15% de desconto.

311
Excel 2016 VBA - Módulo I

Private Sub optVista_Click()


'ocultar controles da opção "A Prazo"
lblRotQtde.Visible = False
txtqtde.Visible = False
spiqtde.Visible = False
lblRotParcela.Visible = False
lblValParcela.Visible = False
'exibir controles da opção "À Vista"
lblRotVista.Visible = True
lblVista.Visible = True
'Calcular o valor com 15% de desconto
lblVista = Format(lblvalor - (lblvalor * 0.15), "#,##0.00")
End Sub

Para o procedimento do controle optPrazo, são necessárias as seguintes ações:

•• Garantir que os controles da opção À Vista estejam ocultos;

•• Deixar visíveis os controles da opção A Prazo;

•• Calcular o valor da parcela.

Private Sub optPrazo_Click()


'ocultar controles da opção "À Vista"
lblRotVista.Visible = False
lblVista.Visible = False
'Exibir controles da opção "A Prazo"
lblRotQtde.Visible = True
txtqtde.Visible = True
spiqtde.Visible = True
lblRotParcela.Visible = True
lblValParcela.Visible = True
'Calcular o valor de cada parcela
lblValParcela = Format(lblvalor / txtqtde, "#,##0.00")
End Sub

312
Objeto UserForm
7
7. Defina o código para o controle spiQtde para que seja exibido o seu valor
automaticamente na caixa de texto txtQtde e, também, para que seja atualizado
o valor das parcelas no controle lblParcela. Para tanto, clique duas vezes no
Botão de Rotação e digite o seguinte código:

Private Sub SpiQtde_Change()


txtQtde = SpiQtde
lblValParcela = format(lblValor / txtQtde,"#,##0.00")
End Sub

8. Depois de automatizados os botões de opção À vista e A Prazo, clique duas


vezes no controle cmbCurso e oculte todos os controles, conforme o exemplo
a seguir, pois eles deverão ser exibidos somente com a ativação de um dos
botões de opção:

Private Sub cmbcurso_Change()


'Exibir o valor do curso no Rótulo
lblvalor = Format(cmbcurso.Column(1), "#,##0.00")
'Ocultar os controles
lblRotQtde.Visible = False
txtqtde.Visible = False
spiqtde.Visible = False
lblRotParcela.Visible = False
lblValParcela.Visible = False
lblRotVista.Visible = False
lblVista.Visible = False
optVista = False
optPrazo = False
txtQtde = 2
End Sub

•• 3ª Etapa: Inserindo as informações na planilha

Utilizaremos o evento Click do botão de comando cmdCadastrar a fim de


inserir os dados cadastrados no formulário para a planilha Dados.

313
Excel 2016 VBA - Módulo I

Iniciaremos o código realizando as consistências nos controles, pois os dados


só serão cadastrados na planilha se todas as informações tiverem sido inseridas
no formulário. Caso exista alguma informação pendente no formulário, um
alerta deverá ser exibido ao usuário:

Private Sub cmdCadastrar_Click()


'Consistências
If txtAluno = "" Then
MsgBox "Digite o nome do aluno"
txtAluno.SetFocus
Exit Sub
ElseIf IsNumeric(txtAluno) Then
MsgBox "Informação Inválida"
txtAluno = ""
txtAluno.SetFocus
Exit Sub
End If
If cmbCurso = "" Then
MsgBox "Selecione o curso desejado"
cmbCurso.DropDown
Exit Sub
End If
If optVista = False And optPrazo = False Then
MsgBox "Indique o tipo de Pagamento"
End If
End Sub

O método SetFocus permite posicionar o cursor dentro do controle. Já o método


DropDown que foi utilizado no controle cmbCurso é responsável por expandir
a caixa de combinação, permitindo ao usuário a escolha de uma opção contida
na lista.

Após as consistências, podemos prosseguir o procedimento com os comandos


para inserir as informações na planilha, continuando dentro do evento
cmdCadastrar_Click.

314
Objeto UserForm
7
Na primeira coluna da planilha (Coluna A), iremos identificar os alunos por
um número de registro, que será incrementado automaticamente, iniciando a
primeira linha no valor 1.

O código a seguir irá posicionar o cursor na primeira célula vazia da coluna A.


Se a célula da linha anterior não for numérica, significa que o código posicionou
o ponteiro na célula A2 e a célula anterior é o título. Neste caso, o registro será
iniciado com a inserção do valor 1. Caso contrário, será obtido o valor da célula
anterior adicionando +1.

Sheets("Alunos").Select
Range("a65536").End(xlUp).Offset(1, 0).Select
if Not IsNumeric(ActiveCell.Offset(-1, 0)) Then
ActiveCell = 1
Else
ActiveCell = ActiveCell.Offset(-1, 0) + 1
End If

Agora, é necessário colocar nas demais colunas da planilha as informações


contidas nos controles do formulário:

ActiveCell.Offset(0, 1) = txtAluno
ActiveCell.Offset(0, 2) = cmbCurso
ActiveCell.Offset(0, 3) = lblvalor
If optVista = True Then
ActiveCell.Offset(0, 4) = "À Vista"
ActiveCell.Offset(0, 5) = "15%"
ActiveCell.Offset(0, 6) = 1
ActiveCell.Offset(0, 7) = lblVista
Else
ActiveCell.Offset(0, 4) = "A Prazo"
ActiveCell.Offset(0, 5) = "-"
ActiveCell.Offset(0, 6) = txtQtde
ActiveCell.Offset(0, 7) = lblValParcela
End If

315
Excel 2016 VBA - Módulo I

Ao efetuarmos o cadastro, observamos que os valores numéricos (Parcelas


/ Valor por Parcela) foram inseridos na planilha como texto, inclusive, estão
alinhados à esquerda da célula. Para que o valor seja inserido na célula como
valor numérico, é necessário utilizar a função Cdbl() que irá realizar a conversão.
Apesar de termos formatado essas informações dentro do procedimento dos
controles com a função Format() após a conversão para valor numérico, será
necessário também formatá-las na célula da planilha:

Valores inseridos como texto

No código anterior, foram acrescentadas a função Cdbl() e CInt() para a


conversão numérica e a propriedade NumberFormat para a formatação da
célula:

ActiveCell.Offset(0, 3) = CDbl(lblvalor)
If optVista = True Then
ActiveCell.Offset(0, 4) = "À Vista"
ActiveCell.Offset(0, 5) = "15%"
ActiveCell.Offset(0, 6) = 1
ActiveCell.Offset(0, 7) = CDbl(lblVista)
Else
ActiveCell.Offset(0, 4) = "A Prazo"
ActiveCell.Offset(0, 5) = "-"
ActiveCell.Offset(0, 6) = CInt (txtQtde)
ActiveCell.Offset(0, 7) = CDbl(lblValParcela)
End If
ActiveCell.Offset(0, 3).NumberFormat = "#,##0.00"
ActiveCell.Offset(0, 7).NumberFormat = "#,##0.00"

316
Objeto UserForm
7
Observe o exemplo após a alteração da macro e o recadastramento do registros
anteriores, a partir do início:

Após a inserção das informações, vemos que o conteúdo permanece nos


controles da janela de cadastro, no entanto, podemos limpar o conteúdo dos
controles do formulário e posicionar o cursor no controle txtAluno para o que
o usuário possa digitar um novo registro:

txtAluno = ""
lblvalor = "0,00"
cmbcurso = ""
optVista = False
optPrazo = False
lblRotQtde.Visible = False
txtQtde.Visible = False
spiQtde.Visible = False
lblRotParcela.Visible = False
lblValParcela.Visible = False
lblRotVista.Visible = False
lblVista.Visible = False
txtAluno.SetFocus

317
Excel 2016 VBA - Módulo I

Ao executar este procedimento, ocorrerá um erro de execução no evento Change


do controle cmbCurso, isto porque, ao executar o comando cmbCurso = "", a
informação vazio será procurada dentro da planilha Apoio.

A fim de resolver este problema, devemos aplicar um duplo-clique no controle


cmbCurso e inserir a seguinte consistência:

Private Sub cmbcurso_Change()


If cmbcurso = "" Then
Exit Sub
End If
.... continuação dos demais comandos
End Sub

Podemos centralizar as informações contidas nas células conforme o exemplo


a seguir:

ActiveCell.Offset(0, 4).HorizontalAlignment = xlCenter

Observe todo o conteúdo do procedimento inserido no controle cmdCadastrar:

Private Sub cmdCadastrar_Click()


'Consistências
If txtAluno = "" Then
MsgBox "Digite o nome do aluno"
txtAluno.SetFocus
Exit Sub
ElseIf IsNumeric(txtAluno) Then
MsgBox "Informação Inválida"
txtAluno = ""
txtAluno.SetFocus
Exit Sub

318
Objeto UserForm
7
End If
If cmbCurso = "" Then
MsgBox "Selecione o curso desejado"
cmbCurso.DropDown
Exit Sub
End If
If optVista = False And optPrazo = False Then
MsgBox "Indique o tipo de Pagamento"
End If
'inserindo dados na planilha
Sheets("Alunos").Select
Range("a65536").End(xlUp).Offset(1, 0).Select
If Not IsNumeric(ActiveCell.Offset(-1, 0)) Then
ActiveCell = 1
Else
ActiveCell = ActiveCell.Offset(-1, 0) + 1
End If

ActiveCell.Offset(0, 1) = txtAluno
ActiveCell.Offset(0, 2) = cmbCurso
ActiveCell.Offset(0, 3) = CDbl(lblValor)
If optVista = True Then
ActiveCell.Offset(0, 4) = "À Vista"
ActiveCell.Offset(0, 5) = "15%"
ActiveCell.Offset(0, 6) = 1
ActiveCell.Offset(0, 7) = CDbl(lblVista)
Else
ActiveCell.Offset(0, 4) = "A Prazo"
ActiveCell.Offset(0, 5) = "-"
ActiveCell.Offset(0, 6) = CInt(txtQtde)
ActiveCell.Offset(0, 7) = CDbl(lblValParcela)
End If
ActiveCell.Offset(0, 3).NumberFormat = "#,##0.00"
ActiveCell.Offset(0, 7).NumberFormat = "#,##0.00"
'Centralizando as informações nas células
ActiveCell.Offset(0, 4).HorizontalAlignment = xlCenter
ActiveCell.Offset(0, 5).HorizontalAlignment = xlCenter
'Limpando o conteúdo dos controles
txtAluno = ""
lblValor = "0,00"
cmbCurso = ""
optVista = False
optPrazo = False
lblRotQtde.Visible = False

319
Excel 2016 VBA - Módulo I

txtQtde.Visible = False
spiQtde.Visible = False
lblRotParcela.Visible = False
lblValParcela.Visible = False
lblRotVista.Visible = False
lblVista.Visible = False
'Posicionando o cursor no controle
txtAluno.SetFocus
End Sub

Private Sub cmdFechar_Click()


Unload Me
End Sub

Private Sub optPrazo_Click()


'ocultar controles da opção "À Vista"
lblRotVista.Visible = False
lblVista.Visible = False
'Exibir controles da opção "A Prazo"
lblRotQtde.Visible = True
txtQtde.Visible = True
spiQtde.Visible = True
lblRotParcela.Visible = True
lblValParcela.Visible = True
'Calcular o valor de cada parcela
lblValParcela = Format(lblValor / txtQtde, "#,##0.00")
End Sub

•• Criando um formulário para inserir um novo curso na planilha Apoio

Como o controle Caixa de Combinação está capturando as informações contidas


no intervalo denominado Cursos da planilha Apoio, criaremos um formulário
para inserir um novo curso na planilha, o qual pertencerá à lista de opções do
cmbCurso do formulário de alunos.

320
Objeto UserForm
7
Primeiramente, criaremos um novo formulário com o nome frmCursos,
conforme o exemplo adiante:

•• Propriedades dos Objetos

•• Name: frmCurso;
•• Caption: Inclusão de Cursos.

•• Name: lblRotCurso;
•• Caption: Curso.

•• Name: lblRotValor;
•• Caption: Valor.

•• Name: txtCurso.

•• Name: txtValor.

•• Name: cmdInserir;
•• Accelerator: I.

321
Excel 2016 VBA - Módulo I

Observe, a seguir, um exemplo bem simples para definir uma máscara de


formatação no controle que irá receber o valor do curso (txtValor) e que irá
formatar o valor numérico com separador de milhares e duas casas decimais.
Utilizaremos a função Format() dentro do evento AfterUpdate da Caixa de
combinação:

Private Sub txtValor_AfterUpdate()


txtValor = Format(txtValor, "#,##0.00")
End Sub

O controle Botão de Comando (neste caso cmdInserir) será responsável por


executar os códigos de procedimentos para cadastrar a nova informação na
planilha. Faremos a consistência das informações e, com o auxílio da instrução
For Each, verificaremos, na planilha Apoio, a existência do curso a ser cadastrado,
não permitindo o cadastramento de dois ou mais cursos com o mesmo nome.

Caso a informação digitada no controle txtCurso não exista na planilha, o cursor


irá selecionar uma célula dentro do intervalo Cursos e inserir uma nova linha
neste local, a qual receberá as informações digitadas nas caixas de texto. Após
este processo, será feita a classificação por ordem alfabética de cursos.

Em seguida, aplicamos um duplo-clique no controle cmdInserir e digitamos o


seguinte procedimento:

Private Sub cmdInserir_Click()


Dim procura As Object
'Consistência de Dados
If txtCurso = "" Then
MsgBox "Digite o Curso"
txtCurso.SetFocus
Exit Sub
End If
If txtValor = "" Or Not IsNumeric(txtValor) Then
MsgBox "Digite o valor"
txtValor = ""
txtValor.SetFocus
Exit Sub
End If

322
Objeto UserForm
7
Sheets("Apoio").Select
'verificar a existência do Curso
For Each procura In Range("cursos")
If UCase(procura.Value) = UCase(txtCurso) Then
MsgBox txtCurso & vbCrLf & _
"Curso já existente! Digite outro"
txtCurso = ""
txtValor = ""
txtCurso.SetFocus
Exit Sub
End If
Next
'Posicionar na tabela e inserir uma linha
Range("a65536").End(xlUp).Select
ActiveCell.EntireRow.Insert
'Inserir informações
ActiveCell = txtCurso
ActiveCell.Offset(0, 1) = CDbl(txtValor)
ActiveCell.Offset(0, 1).NumberFormat = "#,##0.00"
'Classificar a planilha pela coluna de cursos (Coluna A)
Range("a2").Sort key1:=Range("a2"), _
order1:=xlAscending, Header:=xlYes
End Sub

7.3.1. Exibindo um formulário

Para fazer com que um formulário criado seja exibido ao usuário, devemos criar
um procedimento com o método Show. Esse procedimento deve ser inserido
em um módulo VBA, e não no código do formulário. O código de exemplo a
seguir exibirá um formulário chamado FrmAlunos:

Sub ShowDialog()
frmAlunos.Show
' Demais instruções
End Sub

323
Excel 2016 VBA - Módulo I

É possível indicarmos a exibição de um formulário assim que o arquivo for


aberto, através do método Auto_Open:

Sub Auto_Open()
frmAlunos.Show
' Demais instruções
End Sub

Os procedimentos a seguir abordam a criação de códigos para a abertura de


formulários, a atribuição desses códigos a botões de planilha e a criação de
outros códigos envolvidos no trabalho com formulários:

1. Insira no módulo os códigos para abrir os formulários frmAlunos e


frmCursos, exibidos a seguir:

Sub Abrir_Alunos()
frmAlunos.show
End Sub

Sub Abrir_Cursos()
frmCursos.show
End Sub

2. Insira uma nova planilha com o nome Abertura, incluindo botões que serão
responsáveis pela abertura dos formulários, como ilustra a imagem a seguir:

324
Objeto UserForm
7
Para adicionar um botão diretamente na planilha, basta ir à guia Desenvolvedor
e, no grupo Controles, clicar no botão Inserir. Então será exibida uma lista
com diversos controles que podem ser adicionados à planilha. Ao adicionar
cada botão, aparecerá uma janela, na qual vamos atribuir uma macro para eles,
atribua para o primeiro botão a macro Abrir_Alunos e para o segundo a macro
Abrir_Cursos:

Depois, renomeie os botões como "Alunos" e "Cursos" respectivamente,


clicando com o botão direito no botão e na opção Editar Texto.

3. Insira mais uma linha de código para o botão cmdFechar do formulário


frmAluno. Esse código, exibido a seguir, deve fazer com que um clique no
botão, além de fechar o formulário, que era o que já fazia, também retorne para
a planilha Abertura:

Private Sub cmdFechar_Click()


Unload Me
Sheets("abertura").Select
End Sub

4. Crie um código para que o evento Terminate do formulário frmCurso retorne


para a planilha Abertura:

Private Sub UserForm_Terminate()


Sheets("abertura").Select
End Sub

325
Excel 2016 VBA - Módulo I

5. Dentro no módulo, insira um código para ocultar alguns objetos do Excel,


insira a data do sistema operacional na barra de status e selecione a planilha
Abertura:

Sub auto_open()
'oculta as guias de planilha
ActiveWindow.DisplayWorkbookTabs = False
'oculta cabeçalho de linha e coluna
ActiveWindow.DisplayHeadings = False
'oculta as barras de rolagem vertical e horizontal
ActiveWindow.DisplayHorizontalScrollBar = False
ActiveWindow.DisplayVerticalScrollBar = False
'Exibe a data do sistema na barra de status
Application.StatusBar = "Data: " & Date
'Seleciona a planilha
Sheets("abertura").Select
End Sub

Quando utilizamos o método Show, a execução da


macro é pausada quando o formulário é exibido.
Assim que o formulário é fechado, a macro retoma sua
execução, executando quaisquer outros procedimentos
que possua (na maioria das vezes não utilizamos outros
procedimentos).

326
Objeto UserForm
7
Pontos principais
Atente para os tópicos a seguir. Eles devem ser estudados com muita
atenção, pois representam os pontos mais importantes do capítulo.

•• Dentre os diversos modos de enviar informações para um computador, o uso


de formulários é um dos principais métodos adotados pelos desenvolvedores
de programas. Os formulários permitem interatividade com o usuário, são
um meio seguro de colocar os dados em suas posições corretas e conferem
consistência às informações;

•• O Visual Basic utiliza o objeto UserForm, também conhecido como


formulário, como interface entre os usuários e o computador;

•• Inicialmente, todos os formulários criados são vazios, ou seja, não


apresentam controles como botões, caixas de texto ou caixas de opções.
Todos os controles devem ser inseridos por meio da Caixa de ferramentas;

•• O objeto UserForm e cada um dos controles que podem ser inseridos


em um formulário possuem propriedades diversas que, de acordo com o
valor definido, fazem com que os controles apresentem uma aparência ou
comportamento específico. Essas propriedades podem ser visualizadas e
editadas por meio da janela de Propriedades;

•• A Barra de ferramentas UserForm possui ferramentas úteis no trabalho


de edição e organização dos controles. Para visualizá-la, devemos clicar
no menu Exibir, depois em Barras de ferramentas e, em seguida, em
UserForm;

327
Excel 2016 VBA - Módulo I

•• Para que os controles do formulário executem ações, ou seja, tornem-


se funcionais, é necessário que sejam vinculados a eventos de objetos.
Exemplos de eventos são clicar em um botão, ativar uma janela ou selecionar
uma célula. Os procedimentos de eventos executam ações em resposta a
um evento. Os eventos mais frequentemente utilizados são os eventos de
planilha (Worksheet) e os eventos de pasta de trabalho (Workbook);

•• Para fazer com que um formulário criado seja exibido ao usuário, devemos
criar um procedimento com o método Show. Esse procedimento deve ser
inserido em um módulo VBA, e não no código do formulário.

328
Objeto UserForm
7
Teste seus conhecimentos
Excel 2016 VBA - Módulo I

1. Qual é o procedimento para criar um UserForm?

☐☐ a) Menu Inserir / Userform.

☐☐ b) Pressionar a tecla F5.

☐☐ c) Não é possível criar um UserForm.

☐☐ d) Aplicar um duplo-clique na janela de projeto.

☐☐ e) Nenhuma das alternativas anteriores está correta.

2. Qual das alternativas a seguir representa o local que


contém os controles que serão inseridos no formulário?

☐☐ a) Menu Inserir / Arquivo.

☐☐ b) Caixa de Ferramentas

☐☐ c) UserForm

☐☐ d) Project Explorer

☐☐ e) As alternativas A e B estão corretas.

330
Objeto UserForm
7
3. Qual das alternativas a seguir é utilizada para exibir um
texto dentro do formulário?

☐☐ a) Controle Combobox

☐☐ b) Userform

☐☐ c) Caixa de Ferramentas

☐☐ d) Não é possível exibir um texto dentro do formulário.

☐☐ e) Controle Label

4. Qual é o procedimento utilizado para alinhar controles


dentro de um formulário?

☐☐ a) Menu Arquivo / Alinhamento.

☐☐ b) Selecionar todos os controles, clicar com o botão


direito do mouse e acessar a opção desejada no submenu
Alinhar.

☐☐ c) Selecionar apenas um controle e pressionar as teclas


SHIFT + CTRL.

☐☐ d) Selecionar todos os controles e realizar o alinhamento


arrastando o mouse para a direita.

☐☐ e) Nenhuma das alternativas anteriores está correta.

331
Excel 2016 VBA - Módulo I

5. Para que um controle ComboBox liste informações


contidas em uma região de células, qual propriedade
deverá ser alterada?

☐☐ a) RowSource

☐☐ b) Value

☐☐ c) Select

☐☐ d) Name

☐☐ e) Column

332
Objeto UserForm
7
Mãos à obra!
Excel 2016 VBA - Módulo I

Laboratório 1

A – Criando um formulário que será executado automaticamente ao


abrirmos a pasta de trabalho

1. Desenvolva o formulário denominado frmCalcular, conforme o exemplo a


seguir:

•• Ao clicar nos botões +, -, x e /, deverá ser exibido, na última caixa de texto,


o resultado do cálculo da operação entre o primeiro e o segundo número;

•• Ao clicar no botão Limpar, o conteúdo das três caixas de texto deverá ser
removido, e o cursor deve ficar posicionado na primeira caixa de texto;

•• Ao clicar no botão Fechar, o formulário deverá ser encerrado;

•• Criar uma macro Auto_Open() para executar o formulário no momento em


que o arquivo for aberto.

334