Você está na página 1de 333

VBA

EXCEL 2016
Elaborada por: Claudio Fernando Scatolin

DIREITOS AUTORAIS ADQUIRIDOS PELA DIGICAD INFORMÁTICA E CONSULTORIA


LTDA. PROIBIDA A REPRODUÇÃO DOS TEXTOS ORIGINAIS, MESMO PARCIAIS, POR
QUALQUER PROCESSO, SEM PRÉVIA AUTORIZAÇÃO DA DIGICAD INFORMÁTICA E
CONSULTORIA LTDA.

Revisão: 00
Fevereiro/2020

Pag.: 2 Reprodução Proibida Fone: 4121-6166


VBA para Excel

18/02/2020

INFORMAÇÕES AOS ALUNOS


Prezado aluno a Digicad tem um imenso prazer em contar com sua presença em nossos treinamentos.
Esperamos que você tenha um excelente aproveitamento, replicando os conhecimentos na área
profissional e pessoal.

Abaixo algumas informações e procedimentos importantes para um perfeito andamento de seu


treinamento.

• Assinar a lista de presença em todas as aulas em que estiver presente, conferindo a grafia do
nome, pois assim será impressa no certificado.
• Todo atraso e saída antecipada será anotada pelo instrutor na lista de presença.
• Desligar ou colocar em modo silencioso seu aparelho celular.
• Não comer ou beber em sala de aula.
• Haverá, em todas as aulas, um intervalo de 15 minutos para café.
• Para a certificação, o aluno deve ter frequência mínima de 80% e aproveitamento mínimo, na
avaliação do instrutor.
• Cancelamento de aula em cursos VIP: conforme contrato os alunos de curso VIP devem
desmarcar aulas com 12 horas de antecedência para as aulas diurnas e 6 horas de
antecedência para as aulas noturnas, caso contrário as horas agendadas serão consideradas
como ministradas.
• Garantia de aprendizado:
o Repita o curso quantas vezes forem necessárias durante o prazo de 01 ano após o
termino do curso.
o Escolha uma nova turma que possua vaga disponível e matricule-se um dia antes do
seu início;
o Pague uma pequena taxa correspondente a 5% do valor atual do curso para cada nova
turma;
o Não há quantidade estabelecido para as repetições, desde que o mesmo curso, com
a mesma versão do software, ainda esteja sendo oferecido pela escola;
o Caso o curso tenha sido descontinuado, modificado ou substituído, consulte novas
condições comerciais com o atendimento da escola e conheça nosso programa de
reciclagem profissional, mais uma vantagem para o aluno Digicad.
• Você terá suporte permanente mesmo após o curso podendo tirar suas dúvidas pertinentes
ao treinamento e obter outras informações pelo e-mail:

duvidas@digicad.com.br
Agradecemos sua confiança em nossos treinamentos.

Atenciosamente

Direção
VBA para Excel

SUMÁRIO
INTRODUÇÃO .......................................................................................................................................................13
O QUE É UMA MACRO? ................................................................................................................................................ 13

COMO CRIAR UMA MACRO? ......................................................................................................................................... 15

Gravar uma Macro ............................................................................................................................................ 15

Analisando a macro ........................................................................................................................................... 20

Gravando um movimento Relativo .................................................................................................................... 23

Adicionando um botão de comando na planilha ............................................................................................... 25

Executar uma Macro ......................................................................................................................................... 29

As Diversas Formas de Executar uma Macro ..................................................................................................... 29

Formas ou Imagem ..........................................................................................................................................................30

Botão Localizado na QAT .................................................................................................................................................30

Botão Localizado na Faixa de Opções ..............................................................................................................................30

Via editor do Visual Basic for Application ( VBE ) ............................................................................................................33

Adicionando um botão na Barra de ferramentas de Acesso Rápido (QAT). ....................................................................33

COMANDOS DE USO CORRENTE ...................................................................................................................................... 34

Remover Macros .............................................................................................................................................................34

Alterando uma Tecla de Atalho ......................................................................................................................... 35

A JANELA DO EDITOR DO VBA ..............................................................................................................................36


AS CORES USADAS NO EDITOR DO VBA ........................................................................................................................... 36

COMENTÁRIOS............................................................................................................................................................ 37

CARACTERE DE CONTINUAÇÃO DE LINHA .......................................................................................................................... 38

PARTES DA JANELA DO VBA .......................................................................................................................................... 38

Janela de Projetos .............................................................................................................................................. 39

Janela de Propriedades ...................................................................................................................................... 39

Janela UserForm ................................................................................................................................................ 40

Janela de Edição ................................................................................................................................................ 40

Pesquisador de Objetos ..................................................................................................................................... 41

Janela Code ........................................................................................................................................................ 41

Dividir a janela Code ........................................................................................................................................................42

Janela Verificação imediata ............................................................................................................................... 43

Autolist Members .............................................................................................................................................. 44

TIPOS DE MÉTODOS .............................................................................................................................................45


DEFINIÇÃO DE UM MÉTODO SUB (AÇÃO) ........................................................................................................................ 45

Pag.: 4 Reprodução Proibida Fone: 4121-6166


VBA para Excel

DEFINIÇÃO DE UM MÉTODO FUNCTION (RETORNO) ........................................................................................................... 46

SIMPLIFICANDO........................................................................................................................................................... 49

VARIÁVEIS ............................................................................................................................................................50
TRABALHANDO COM VARIÁVEIS ..................................................................................................................................... 50

TIPOS DE VARIÁVEIS DO VBA ........................................................................................................................................ 51

USANDO CARACTERE DE TIPO ........................................................................................................................................ 52

DECLARANDO VARIÁVEIS ............................................................................................................................................... 52

Regras de nomenclatura do Visual Basic ........................................................................................................... 52

Utilizando a instrução Static .............................................................................................................................. 53

Utilizando a instrução Option Explicit................................................................................................................ 54

Declarando uma variável de objeto para automação ....................................................................................... 55

Associação de Valores a Variáveis ..................................................................................................................... 55

Utilização de Variáveis como se Fossem Valores............................................................................................... 56

Declaração Opcional e o tipo Variant ................................................................................................................ 56

Instrução Option Private .................................................................................................................................... 56

Exemplo da instrução Option Private ..............................................................................................................................57

CONSTANTES ........................................................................................................................................................58
INSTRUÇÃO CONST ...................................................................................................................................................... 58

DECLARANDO CONSTANTES ........................................................................................................................................... 59

Exemplo da instrução Const .............................................................................................................................. 60

BOAS PRÁTICAS DE PROGRAMAÇÃO ....................................................................................................................61


MODIFICADORES DE ACESSO ...............................................................................................................................62
CAIXAS DE DIÁLOGO ............................................................................................................................................65
FUNÇÃO MSGBOX....................................................................................................................................................... 65

Exemplo da função MsgBox .............................................................................................................................. 67

FUNÇÃO INPUTBOX ..................................................................................................................................................... 68

Exemplo da função InputBox ............................................................................................................................. 69

MÉTODO INPUTBOX .................................................................................................................................................... 70

Exemplo do método InputBox............................................................................................................................ 71

ESTRUTURAS DOS OBJETOS DO MS EXCEL ...........................................................................................................72


OBJETOS DO MICROSOFT EXCEL ..................................................................................................................................... 72

WORKSHEET............................................................................................................................................................... 73

Fone: 4121-6166 Reprodução Proibida Pag.: 5


VBA para Excel

CHARTS ..................................................................................................................................................................... 73

SHAPES ..................................................................................................................................................................... 74

CHARTGROUPS ........................................................................................................................................................... 74

HIERARQUIA DO OBJETO RANGE ..................................................................................................................................... 75

EXEMPLOS ................................................................................................................................................................. 78

WORKBOOKS ..................................................................................................................................................... 78

WORKSHEETS ..................................................................................................................................................... 79

RANGE ............................................................................................................................................................... 80

PROGRAMANDO ..................................................................................................................................................81
ESCREVENDO CÓDIGOS ................................................................................................................................................. 82

ESTRUTURAS ........................................................................................................................................................85
O QUE SÃO ESTRUTURAS .............................................................................................................................................. 85

OPERADORES ............................................................................................................................................................. 85

Operadores relacionais ...................................................................................................................................... 86

Operadores Lógicos ........................................................................................................................................... 86

ESTRUTURAS DE DECISÃO ............................................................................................................................................. 87

Decisão Simples (If ... Then) ............................................................................................................................... 87

Instrução múltipla (If...Then...Else) .................................................................................................................... 88

Estrutra Multipla (Select Case) .......................................................................................................................... 93

Utilizando instruções Select Case ...................................................................................................................... 94

ESTRUTURAS DE REPETIÇÃO .......................................................................................................................................... 98

For ... Next (Para)............................................................................................................................................... 98

While ... Wend (Enquanto) .............................................................................................................................. 100

DO .................................................................................................................................................................... 102

Do While ... Loop (Fazer Enquanto) ................................................................................................................. 102

Do Until ... Loop (Fazer Até) ............................................................................................................................. 102

Do ... Loop While (Fazer ... Ciclo Enquanto) ..................................................................................................... 103

Do ... Loop Until (Fazer ... Ciclo Até) ................................................................................................................ 103

Utilizando Do While ... Loop ..........................................................................................................................................104

Utilizando Do ... Loop While ..........................................................................................................................................104

For Each ... Next (Para cada) ........................................................................................................................... 105

Exemplo da instrução For Each...Next ...........................................................................................................................106

VARIÁVEIS INDEXADAS ......................................................................................................................................109


VARIÁVEIS ARRAYS (VETOR) ........................................................................................................................................ 109

Pag.: 6 Reprodução Proibida Fone: 4121-6166


VBA para Excel

O que é uma Matriz (Array)? ........................................................................................................................... 109

Declarando uma matriz fixa unidimensional ................................................................................................... 110

MATRIZ ................................................................................................................................................................... 112

Declarando uma matriz fixa Multidimensional ............................................................................................... 112

Declarando uma matriz dinâmica ................................................................................................................... 113

Resumo ............................................................................................................................................................ 114

FUNÇÕES ............................................................................................................................................................115
FUNÇÕES MATEMÁTICAS ............................................................................................................................................. 115

FUNÇÕES MATEMÁTICAS DERIVADAS ............................................................................................................................. 117

FUNÇÕES FINANCEIRAS............................................................................................................................................... 118

FUNÇÕES DE DATA E HORA ......................................................................................................................................... 119

Código das funções Data e Hora ...................................................................................................................... 121

FUNÇÕES PARA O TRATAMENTO DE TEXTO ...................................................................................................................... 124

Função StrConv ................................................................................................................................................ 124

Função Lcase.................................................................................................................................................... 124

Função Ucase ................................................................................................................................................... 125

Função Len ....................................................................................................................................................... 125

Função InStr ..................................................................................................................................................... 125

Função InStrRev ............................................................................................................................................... 126

Função Left ...................................................................................................................................................... 128

Função Right .................................................................................................................................................... 128

Função StrReverse ........................................................................................................................................... 129

Função Mid ...................................................................................................................................................... 129

Funções Trim, LTrim e RTrim ........................................................................................................................... 130

Função String ................................................................................................................................................... 131

Função Space ................................................................................................................................................... 131

Função Asc ....................................................................................................................................................... 132

Função Chr ....................................................................................................................................................... 132

Código das funções Texto ................................................................................................................................ 133

FUNÇÕES DE CONVERSÃO............................................................................................................................................ 136

Listagem das funções de conversão: ............................................................................................................... 137

FUNÇÕES DE PLANILHA DO EXCEL ......................................................................................................................139

Fone: 4121-6166 Reprodução Proibida Pag.: 7


VBA para Excel

Lista das funções de planilha disponíveis no VBA do Excel 2016: .................................................................... 139

O QUE SÃO OBJETOS. .........................................................................................................................................141


ADD-INS .............................................................................................................................................................142
VANTAGENS DO ADD-IN: ............................................................................................................................................ 143

DESVANTAGENS: ....................................................................................................................................................... 143

COMPORTAMENTO DE UM ADD-IN ............................................................................................................................... 143

ESCREVER UMA NOVA FUNÇÃO.................................................................................................................................... 143

CRIANDO UM ADD-IN ................................................................................................................................................ 150

ALTERAR OU ADICIONAR NOVA FUNÇÃO EM UM ADD-IN ................................................................................................... 156

TRATAMENTO DE ERROS ....................................................................................................................................157


TIPOS DE ERROS ........................................................................................................................................................ 157

Erros de sintaxe ............................................................................................................................................... 157

Erros de Run-Time............................................................................................................................................ 158

Erros de Lógica................................................................................................................................................. 159

UTILIZANDO O MÉTODO BREAK .................................................................................................................................... 160

A Barra de ferramentas Depurar ..................................................................................................................... 160

Descrição dos Botões da Barra de Ferramentas Depurar ................................................................................ 161

TRATANDO ERROS ..................................................................................................................................................... 162

Instrução On Error ........................................................................................................................................... 162

CÓDIGOS DOS ERROS INTERCEPTÁVEIS ........................................................................................................................... 166

FORMULÁRIOS (USERFORMS) ............................................................................................................................170


O QUE É UM FORMULÁRIO .......................................................................................................................................... 171

O QUE SÃO CONTROLES .............................................................................................................................................. 172

Inserindo controles no formulário ................................................................................................................... 172

Lista dos Controles da Caixa de Ferramentas do VBA ...................................................................................................172

Propriedades dos objetos ................................................................................................................................ 174

Tabela com as principais propriedades dos objetos ......................................................................................................175

EXEMPLOS DE FORMULÁRIOS E DESCRIÇÃO DE CONTROLES ................................................................................................. 178

CONSTRUINDO UM FORMULÁRIO.................................................................................................................................. 178

EVENTOS ................................................................................................................................................................. 179

TRABALHANDO COM TEXTBOX ..................................................................................................................................... 181

Como carregar um formulário ......................................................................................................................... 184

Ocultar um formulário ..................................................................................................................................... 185

Descarregar um formulário ............................................................................................................................. 185

Pag.: 8 Reprodução Proibida Fone: 4121-6166


VBA para Excel

Como passar de um formulário para outro ..................................................................................................... 185

Formulário de cálculos ..................................................................................................................................... 186

Reaproveitando Código ................................................................................................................................... 189

Alterando Propriedades pelo código ............................................................................................................... 193

Opções (OptionButton e CheckBox) ................................................................................................................. 196

FORMULÁRIO DE CADASTRO ........................................................................................................................................ 200

Código Completo: ............................................................................................................................................ 204

PROJETO FINAL ..................................................................................................................................................207


RESUMO DO SISTEMA: ............................................................................................................................................... 207

REQUISITOS:............................................................................................................................................................. 207

Cadastro de Clientes ........................................................................................................................................ 207

Formulário ....................................................................................................................................................... 214

Título do formulário ......................................................................................................................................................214

Barra de ferramentas ....................................................................................................................................................214

Campos ..........................................................................................................................................................................215

Grid (Tabela) ..................................................................................................................................................................216

MÓDULO ................................................................................................................................................................. 217

Código completo .............................................................................................................................................. 222

EVENTOS DO FORMULÁRIO ......................................................................................................................................... 224

CADASTRO DE FORNECEDORES ..................................................................................................................................... 233

CÓDIGO COMPLETO ................................................................................................................................................... 236

FORMULÁRIO DE LOGIN .............................................................................................................................................. 241

Código completo .............................................................................................................................................. 244

FAIXA DE OPÇÕES PERSONALIZADA ............................................................................................................................... 246

Código Completo ............................................................................................................................................. 259

REVIEW ................................................................................................................................................................... 260

ASSINATURA DIGITAL .........................................................................................................................................263


CRIAR UM CERTIFICADO DIGITAL .................................................................................................................................. 264

ASSINAR DIGITALMENTE UM PROJETO DE MACRO ............................................................................................................. 264

USANDO UM CERTIFICADO DIGITAL EM SEU CÓDIGO ......................................................................................................... 265

ADICIONAR UM DESENVOLVEDOR DE MACROS À LISTA DE FONTES CONFIÁVEIS ..............................................267


ALTERAR O NÍVEL DE SEGURANÇA DA PROTEÇÃO CONTRA VÍRUS DE MACRO ...................................................268

Fone: 4121-6166 Reprodução Proibida Pag.: 9


VBA para Excel

CÓDIGOS EXTRAS ...............................................................................................................................................269


RESPOSTA DOS DESAFIOS ..................................................................................................................................273
APÊNDICE 1 ........................................................................................................................................................275
GLOSSÁRIO .............................................................................................................................................................. 276

APÊNDICE 2 ........................................................................................................................................................281
PRINCIPAIS PROPRIEDADES DO OBJETO APPLICATION. ...................................................................................................... 282

Propriedade ActiveCell ..................................................................................................................................... 282

Propriedade ActiveWindow ............................................................................................................................. 283

Propriedade Caption ........................................................................................................................................ 284

Propriedade CutCopyMode .............................................................................................................................. 284

Propriedade DataEntryMode ........................................................................................................................... 285

Propriedade Dialogs ........................................................................................................................................ 286

Propriedade DisplayAlerts ............................................................................................................................... 286

Propriedade DisplayStatusBar ......................................................................................................................... 287

Propriedade EnableCancelKey ......................................................................................................................... 288

Propriedade EnableEvents ............................................................................................................................... 289

Propriedade OnWindow .................................................................................................................................. 289

Propriedade Path ............................................................................................................................................. 290

Propriedade ScreenUpdating ........................................................................................................................... 290

Propriedade ThisWorkbook ............................................................................................................................. 291

Propriedade WindowState............................................................................................................................... 292

APÊNDICE 3 ........................................................................................................................................................294
PRINCIPAIS MÉTODOS DO OBJETO APPLICATION ............................................................................................................. 295

Método Calculate ............................................................................................................................................ 295

Método GetOpenFilename .............................................................................................................................. 295

Método MacroOptions .................................................................................................................................... 297

Método OnKey ................................................................................................................................................. 299

Método Quit .................................................................................................................................................... 301

Método SendKeys ............................................................................................................................................ 302

Método Volatile ............................................................................................................................................... 303

Método Wait ................................................................................................................................................... 305

APÊNDICE 4 ........................................................................................................................................................307
PRINCIPAIS PROPRIEDADES DO OBJETO WORKBOOKS ....................................................................................................... 308

Pag.: 10 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Propriedade FullName ..................................................................................................................................... 308

Propriedade Name ........................................................................................................................................... 308

Propriedade ProtectStructure .......................................................................................................................... 308

Propriedade Saved ........................................................................................................................................... 309

Propriedade Sheets .......................................................................................................................................... 309

APÊNDICE 5 ........................................................................................................................................................311
PRINCIPAIS MÉTODOS DO OBJETO WORKBOOK ............................................................................................................... 312

Método Activate .............................................................................................................................................. 312

Método Add ..................................................................................................................................................... 312

Método Close ................................................................................................................................................... 313

Método Open ................................................................................................................................................... 314

Método Protect................................................................................................................................................ 317

Método RunAutoMacros ................................................................................................................................. 317

Método Save .................................................................................................................................................... 319

Método SaveAs ................................................................................................................................................ 319

Método SaveCopyAs ........................................................................................................................................ 319

Método SendMail ............................................................................................................................................ 320

Método Unprotect ........................................................................................................................................... 320

APÊNDICE 6 ........................................................................................................................................................322
PRINCIPAIS MÉTODOS DO OBJETO WORKSHEET............................................................................................................... 323

Método Add ..................................................................................................................................................... 323

Método Copy ................................................................................................................................................... 324

Método Delete ................................................................................................................................................. 325

Método Move .................................................................................................................................................. 326

Método Select .................................................................................................................................................. 326

APÊNDICE 7 .......................................................................................................................................................328
PRINCIPAIS PROPRIEDADES DO OBJETO WORKSHEET ........................................................................................................ 329

Propriedade Count ........................................................................................................................................... 329

Propriedade HPageBreaks ............................................................................................................................... 330

Propriedade Item ............................................................................................................................................. 331

Propriedade Visible .......................................................................................................................................... 331

Propriedade VPageBreaks ............................................................................................................................... 332

Fone: 4121-6166 Reprodução Proibida Pag.: 11


VBA para Excel

Propriedade EnableSelection ........................................................................................................................... 332

Propriedade ScrollArea .................................................................................................................................... 333

Propriedade ProtectContents .......................................................................................................................... 333

Pag.: 12 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Introdução

Este curso tem por finalidade, ensinar os principais comandos da linguagem VBA (Visual Basic for
Applications). Esta linguagem foi incorporada ao Office, a partir da versão 97 e, vem sendo atualizada a
cada nova versão do Office. Este material cobre a versão do Office 2016, porém ele lhe será muito útil
tanto em versões anteriores (com poucas readaptações) quanto em versões posteriores.

O VBA pode ser usado para automatizar ou personalizar qualquer aplicativo do Office (Word, Excel,
Access, Power Point, Outlook) e outros aplicativos tais como Autocad, CorelDraw etc. Porém, este curso,
será específico para o MS Excel.

O VBA é utilizado para solucionar problemas no Excel, os quais não são possíveis de serem solucionados
usando funções e comandos de planilha. Por exemplo, não existe uma função no Excel para a validação
de um CPF, CNPJ, PIS etc. Neste caso, somente usando programação, o usuário poderá criar uma função
personalizada para fazer as validações. Neste curso você aprenderá, dentre outras coisas, a criar funções
personalizadas, as quais atendem necessidades específicas.

O Visual Basic que vem com o Excel não é a única linguagem que poderá comunicar-se com a biblioteca
de objetos. Qualquer linguagem que ofereça suporte à automação poderá controlar o Excel.

Para um melhor aproveitamento do curso, é fundamental ter conhecimentos avançados em Excel e ter
noções sobre lógica de programação (desenvolvimento de algoritmos).

O que é uma Macro?


Uma macro é um conjunto de instruções do computador que podem ser escritas ou gravadas e
associadas a uma combinação de teclas de atalho ou a um botão ou a um nome de macro.

Em seguida, quando pressionar a combinação de teclas de atalho ou clicar no nome da macro, o


software executará as instruções contidas na macro. Este procedimento poupa tempo ao substituir uma
série de ações utilizadas frequentemente, e por vezes demoradas, por uma ação menos demorada. Por
exemplo, em vez de clicar em vários menus e botões para adicionar texto aos documentos no Microsoft
Word, poderá gravar esses passos numa macro e, em seguida, clicar na macro para adicionar o texto
num só passo.

O Office permite automatizar não só os pressionamentos de teclas, mas também a maior parte das
ações executadas no Office. É possível automatizar, através de macros, quase todas as ações executadas
através das opções da faixa de opções.

O objetivo das macros é programar funções típicas do Excel de forma a facilitar a execução de tarefas
repetitivas.

A criação de uma Macro é semelhante à gravação de uma fita cassete, inicia-se a gravação e realiza-se a
tarefa pretendida que é convertida automaticamente em código de Visual Basic (VB). A tarefa pode ser,
por exemplo, abrir um determinado arquivo de resultados, escolher algumas colunas e criar um
determinado tipo de gráfico.

Fone: 4121-6166 Reprodução Proibida Pag.: 13


VBA para Excel

Com a utilização da macro podemos repetir este conjunto de tarefas o número de vezes que forem
necessário poupando bastante tempo no caso de estarmos analisando uma grande quantidade de
resultados.

Existem tarefas comuns que o usuário repete e volta a repetir várias vezes. Por exemplo, aplica
frequentemente a mesma combinação de formatos ou recebe dados todas as semanas ou meses que
organiza e analisa sempre do mesmo modo. É possível utilizar uma macro para combinar todos os
passos de uma tarefa num único comando.

A macro grava cliques do mouse e combinações de teclas à medida que o usuário trabalha e permite
reproduzi-las mais tarde. É possível utilizar uma macro para gravar a sequência de comandos utilizados
ao efetuar determinada tarefa. Quando uma macro é executada, reproduz os comandos exatos, na
mesma ordem em que foram gravados, o que faz com que o Excel se comporta como se o próprio
usuário tivesse digitado os comandos.

É fácil criar macros: o usuário dá instruções ao Excel para começar a gravar, efetuar as ações que realiza
normalmente e, em seguida, indica ao Excel que terminou. O Excel utiliza uma linguagem de
programação denominada Visual Basic for Applications (VBA) para gravar as instruções. Não é
necessário ter conhecimentos de programação ou de VBA para gravar e utilizar macros que irão poupar
tempo e facilitar o trabalho.

Este material mostra desde como criar e utilizar, usando o gravador de macros, uma simples macro de
formatação de células e como alterar esta macro para fazer ainda mais, até códigos avançados que não
são possíveis de serem criados através do gravador de macros. Também explica as opções de
armazenamento de macros, de modo a poder utilizá-las a partir de qualquer pasta de trabalho.

Aplicar formatos é um exemplo de macro bastante simples, mas é possível gravar macros para efetuar
tarefas mais complexas, tais como obter e filtrar dados externos, criar e personalizar gráficos, criar
funções para cálculos científicos e muito mais.

O gravador de macros é limitado, ou seja, não consegue criar códigos para todos os passos que você
desejar. Sendo assim, é necessário, ter conhecimento dos principais eventos, métodos, propriedades,
objetos e comandos de programação do MS Excel, que serão vistos no decorrer do curso. E, de posse
destes conhecimentos, poder criar códigos sem a utilização do gravador de macros.

Inconvenientes

A macro executa literalmente as tarefas que foram gravadas. Imagine, por exemplo, que você pretende
abrir um arquivo de resultados chamado resultados.xls com 3 colunas e 100 linhas que se encontra na
pasta C:\resultados e fazer um gráfico de pontos com a coluna 1 e 3. Para a macro ser bem sucedida
sempre que for chamada, estas condições têm que ser mantidas, ou seja, se o arquivo tiver outro nome
ou estiver armazenado em outra pasta a macro dará, imediatamente, indicação de erro. Pode ainda
acontecer de, o novo arquivo de resultados ter 200 linhas, neste caso só as primeiras 100 linhas vão ser
plotadas no gráfico, pois foi este o limite imposto durante a gravação da macro ou ainda a coluna 3 estar
vazia o que irá gerar obviamente um gráfico sem pontos.

No entanto todos estes inconveniente podem ser resolvidos por meio de programação simples da
macro em que parâmetros como o nome e o caminho para o arquivo, ou ainda os limites para a
realização de gráficos podem ser definidos pelo usuário através de uma interface programável. Para
acessar o ambiente de programação é necessário editar a macro como será demonstrado no decorrer

Pag.: 14 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

do curso. Em alguns casos, pode-se, durante a gravação da macro, usar referencias relativas. Assim o
código não ficará amarrado a um determinado intervalo.

Como criar uma Macro?


A forma mais fácil para se criar uma macro, é usando o gravador de macros existente no Office. O
gravador de macros é uma espécie de dedo duro, ou seja, após sua ativação, grava quase todos os
passos/comandos que você executar.

Gravar uma Macro


Para gravar uma nova macro, clique no botão Gravar Macro, que está no canto inferior esquerdo da
janela do Excel.

Este botão também está presente na guia Desenvolvedor. Caso esta guia não esteja visível, siga o
procedimento abaixo para exibi-la.

1. Clique, com o botão direito do mouse, em qualquer lugar da Faixa de Opções. O Excel exibirá o
seguinte menu:

2. Clique na opção Personalizar a Faixa de Opções.

3. No dialogo Opções do Excel, que será exibido, ative, no painel à direita, a opção Desenvolvedor.

Fone: 4121-6166 Reprodução Proibida Pag.: 15


VBA para Excel

4. Após clicar no botão OK, a guia Desenvolvedor, será exibida normalmente.

Após clicar no botão Gravar Macro, será aberta a caixa de diálogo Gravar macro.

A caixa de diálogo Gravar macro possui os seguintes itens:

Nome da macro: Digite um nome para a macro com até 64 caracteres (não utilize espaços).

Tecla de Atalho: Digite uma letra para ser usada como tecla de atalho. Para atalhos do tipo: Ctrl+Letra
use letra minúscula, para Ctrl+Shift+Letra use letra maiúscula. A definição de uma
tecla de atalho não é obrigatória.

Importante: caso seja definida uma tecla de atalho que execute comandos do Excel, como Ctrl+C
(Copiar), por exemplo. Ao pressionar o atalho, será executada a macro e não o comando do Excel.
Sendo assim, é preferível preservar os atalhos do Excel, defina sempre uma letra maiúscula como
atalho.

Armazenar macro em: Escolha aqui, o local onde a macro será armazenada.

Pasta de trabalho pessoal de macros

Pag.: 16 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Armazena a macro em um arquivo com o nome Personal.xlsb, que fica localizado no caminho:
“D:\Users\NomeDoUsuário\AppData\Roaming\Microsoft\Excel\XLINÍCIO”.
As pastas de trabalho deste diretório são abertas na inicialização do Excel.
O arquivo Personal.xlsb fica oculto.
Para ver seu conteúdo clique na guia Reexibir / grupo Janela / botão Reexibir.

Mas não é necessária a sua exibição. Na verdade, o ideal é que fique oculta.

Nova pasta de trabalho – Cria um novo arquivo xlsm para armazenar a macro.

Esta pasta de trabalho – armazena a macro na pasta de trabalho ativa.


Esta é a forma mais usada para armazenar macros. Pois a macro será salva no mesmo arquivo
onde está sendo criada. Assim, onde você levar o arquivo, a macro irá junto.

Descrição: Insira um comentário que descreva a finalidade ou o objetivo da macro.

O Excel insere um texto padrão: “Macro gravada em dd/mm/aaaa por NomeDaMáquina”.

Após clicar no botão OK, o botão Gravar macro será alterado para Parar gravação .

Ativa o gravador de macro.


Interrompe a gravação da macro. Clique neste botão quando quiser interromper a
gravação da macro.
Determina se a gravação de macros usa referências relativas ou absolutas. Por padrão é
usada a referência absoluta.
Execute os passos que deseja gravar em sua macro e clique no botão Parar gravação .

Exemplo passo-a-passo 1

Vamos começar com um exemplo bem simples, pintar um intervalos selecionado.

1. Clique no botão Gravar Macro .

2. Em Nome da macro digite: Pintar.

3. Em Tecla de atalho digite a letra: P (maiúscula) e clique OK.

4. Em Armazenar Macro em escolha: Esta pasta de trabalho.

5. Em Descrição digite: Pintar intervalo selecionado.

Fone: 4121-6166 Reprodução Proibida Pag.: 17


VBA para Excel

6. Não clique em nenhum lugar na planilha, apenas clique na guia Página Inicial
, escolha uma cor .

7. Clique no botão Parar gravação.

Analisando o código
Para visualizar o código gerado pelo gravador de macros, use o atalho ALT+F11 ou clique na guia
Desenvolvedor e depois no botão Visual Basic. Será exibido a seguinte tela:

De um duplo clique no item módulos e, em seguida, um duplo clique em Módulo1. Será exibido a
seguinte tela:

Onde contém o código gerado pela Macro.

Outra forma para você visualizar o código é a seguinte: Clique na guia Desenvolvedor e em seguida no
botão Macros ou use o atalho Alt+F8 será aberta a caixa diálogo Macro, onde você poderá selecionar o
nome da macro desejada e clicar no botão Editar.

Pag.: 18 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Após clicar no botão Editar, será exibida a janela


de código do VBA Excel, onde você poderá
visualizar ou alterar o código da macro gravada
anteriormente.

Para voltar ao Excel e manter o VBA aberto,


pressione ALT+F11 ou clique no botão Exibir
Microsoft Excel na barra de ferramentas Padrão
ou clique no botão do Excel na barra de Tarefas.

Para voltar ao Excel e fechar o VBA, use o atalho ALT+Q.

Atenção:
Ao salvar pela primeira vez, um arquivo com macro, você receberá a seguinte mensagem:

Fone: 4121-6166 Reprodução Proibida Pag.: 19


VBA para Excel

Clique no botão não e altere o tipo de arquivo conforme figura abaixo:

Em seguida, clique no botão Salvar novamente.

Quando Salvamos apenas uma pasta de trabalho sem Macros, é criado um arquivo .xlsx, o projeto é um
arquivo .xlam, quando salvamos uma pasta de trabalho habilitada para Macros, serão encapsulados os 2
arquivos em um único criando o arquivo .xlsm.

Analisando a macro
Para executar a Macro, selecionamos um intervalo qualquer e pressione o atalho Ctrl+Shift+P e observe
que os intervalos serão pintados automaticamente.

Exemplo passo-a-passo 2

Vamos criar um processo simples, porém que gera grande quantidade de código. Isso mostra que
mesmo em projetos mais avançados utilizando o VBA, podemos utilizar uma Macro para aproveitar um
código.

Pag.: 20 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

1. Clique no botão Gravar Macro .

2. Em Nome da macro digite: Bordas.

3. Em Tecla de atalho digite a letra: B (maiúscula) e clique OK.

4. Em Armazenar Macro em escolha: Esta pasta de trabalho.

5. Em Descrição digite: Inserir bordas no intervalo selecionado.

6. Não clique em nenhum lugar na planilha, apenas clique na guia Página Inicial ,
selecione Todas as bordas.

7. Clique no botão Parar gravação.

Analisando o código
Assim como no exemplo anterior, vamos abrir o código em Visual Basic ou Editar Macro.

A Macro será criada no mesmo módulo que a Macro anterior.

Fone: 4121-6166 Reprodução Proibida Pag.: 21


VBA para Excel

Como podemos analisar, foram gerados várias linhas de código, porém quando o código é gerado
automaticamente, gera alguns comandos que não são necessário para o que precisamos.

No código acima vamos fazer um refinamento, ou seja, vamos eliminar o código desnecessário.

Como realizamos esse processo de refinamento, deletamos linha a linha e testamos se o código
continua executando com o resultado que esperamos.

Segue abaixo o código acima após o refinamento.

Pag.: 22 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Como podemos ver, removemos grande parte do código que seria desnecessário para nosso objetivo.

Nota:
É uma boa prática remover o código desnecessário na geração da Macro, dessa forma ganha-se em
performance no processo já que ele deixa de executar comandos que não interferem no objetivo final.

Gravando um movimento Relativo

Para este novo exemplo, abra uma


nova Pasta de trabalho com duas
planilhas conforme figuras:

Fone: 4121-6166 Reprodução Proibida Pag.: 23


VBA para Excel

Planilha Formulário

Planilha Base de dados

Salve a pasta de trabalho com o nome Cadastro de Clientes.

Esta macro deverá pegar os dados digitados na planilha Formulário e movê-los para a primeira linha
vazia da planilha Base de dados.

Exemplo Passo-a-passo 3:
1. Clique na guia da planilha Formulário para ativá-la.

2. Ative o gravador de macros.

Nome da macro: GravarRegisto

Tecla de atalho: G

Armazenar macro em: Esta pasta de trabalho

Descrição: Gravar registros do Fomulário para a Base de dados

3. Selecione a célula A2. A célula A2 deve ser selecionada após o inicio da gravação da Macro, mesmo
que ela já esteja seleciona, pois precisamos informar onde a Macro deve iniciar.

4. Precione as teclas Ctrl+Shift+SetaDireita. Esse processo poderia ser selecionado todo o intervalo
“A2:D2”, porém faremos dessa forma para analisar como o código reage com essa ação.

5. Apó selecionado, clique no botão Recortar, ou o atalho Ctrl+X.

6. Clique na guia da planilha Base de dados, para ativá-la.

7. Na Caixa de nome digite: A1048576 e pressione Enter.

8. Pressione Ctrl+SetaAcima (seleciona a última célula preenchida).

9. Na guia Desenvolvedor, clique no botão Usar Referências relativas . Podemos vericar queo botão
ficou marcado como selecionado.

10. Pressione a tecla Seta para baixo (seleciona a primeira linha em branco).

11. Clique no botão Colar, ou a tecla de atalho Ctrl+V.

Pag.: 24 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

12. Pressione a tecla Home.

13. Na guia Desenvolvedor, clique novamente no botão Usar Referências relativas para deixa-lo
desmarcado.

14. Ative a planilha Formulário.

15. Pressione a tecla Home.

16. Clique no botão Parar gravação.

17. Clique no botão Salvar.

Para testar a macro, digite novos dados e pressione o atalho Ctrl+Shift+B.

Adicionando um botão de comando na planilha

Para acionar esta nova macro, vamos adicionar um botão de comando na planilha. Para isto, execute os
passos a seguir:

1. Na guia Desenvolvedor, clique no botão Iserir e insira o Controle de Formulário Botão de comando.

2. Clique no botão denominado Botão de comando e, em seguida clique na planilha.

Fone: 4121-6166 Reprodução Proibida Pag.: 25


VBA para Excel

3. Será exibido a janela Atribuir macro, onde iremos selecionar a macro GravarRegistro e clicar no
botão OK.

4. Com o botão ainda selecionado, clique com o botão direito do Mouse e selecione a opção Editar
Texto.

5. Altere o texto do botão para Gravar e clique fora para remover a seleção.

Para testar, digite novos dados e clique no botão Gravar.

Nota:
Para editar novamente o botão, ou mover para outro local, clique com o botão direito do Mouse sobre
ele para poder selecionar, depois pode editar ou movimentar conforme necessário.

Analisando o Código
Pag.: 26 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Assim como nos exemplos anteriores, vamos abrir o código em Visual Basic ou Editar Macro.

Vamos selecionar com duplo-clique o Módulo1 e ver o código gerado.

Podemos ver que o nome do Método é o nome que demos para a Macro “GravarRegistro()”.

Abaixo vemos, com o texto em verde e iniciando com apóstrofos, comentários do código. (Os
comentários são trechos que não são executados quando rodamos o método, são utilizados para
informações do método). Podemos que a primeira linha de comentário é o nome da macro, seguido pelo
texto que inserimos no campo Descrição, e finalizando com a tecla de atalho para chamar o método.

Analisando as linhas de código executáveis temos.

Range("A2").Select Seleciona a célula A2 na planilha ativa

Range(Selection, Seleciona o interval iniciando da célula ativa até o


Selection.End(xlToRight)).Select ultimo registro com dados a direita. (Atalho
Ctrl+Shift+SetaDireita)

Selection.Cut Recorta todo o intervalo selecionado

Sheets("Base de dados").Select Seleciona a planilha Base de dados

Application.Goto Reference:="R1048576C1" Seleciona a Célula A1048576, o R da código


significa ROW (Linha) e o C COLUMN (Coluna).

Selection.End(xlUp).Select Selecionar o ultimo registro acima. Atalho


Ctrl+SetaAcima

Fone: 4121-6166 Reprodução Proibida Pag.: 27


VBA para Excel

ActiveCell.Offset(1, 0).Range("A1").Select Nesse momento foi ativado o recurso Referência


Relativa. Com isso foi comando que informa ao
sistema, mova-se 1 linha e 0 colunas, Offset(1, 0).

Se não estivesse ativo a Referência Relativa, seria


gerado uma referência absoluta com a célula
selecionada no momento de grava a Macro,
exemplo Range(“A3”) e sempre que executa-se a
macro, seria selecionado o intervalo A3 e sempre
iria sobrescrever o registro anterior

ActiveSheet.Paste Colar os dados na planilha ativa

ActiveCell.Select Selecionar a célula ativa. Lembrando que célula


ativa é diferente de célula selecionada. Podemos
ter várias células selecionadas, um intervalo de
células, porém temos apenas 1 célula ativa.

Nesse exemplo temos o intervalo A1:C5


selecionado, porém a célula ativa é apenas a A1.

Sheets("Formulário").Select Selecionar a planilha Formulário

Range("A2").Select Selecionar a célula A2.

Aqui podemos ver que, mesmo utilizando o


mesmo processo que executamos anteriormente,
tecla Home, diferente do processo acima que
gerou o comando ActiveCell.Offset(1,
0).Range("A1").Select, aqui foi gerado o
comando Range(“A2”).Select porque o processo
anterior a Referência Relativa estava ativado, e
agora estava desativado. Com a Referência
Relativa ativado o comando informa para gerar
um movimento a partir da célula selecionada, já
quando está desativado, sempre é gerado um
comando com intervalo fixo.

Pag.: 28 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Executar uma Macro

Para executar uma macro qualquer, podemos


usar o seguinte procedimento:

Pressione o atalho Alt+F8, será exibido a caixa de


diálogo Macro (figura ao lado).

Selecione a macro desejada e clique no botão


Executar. Você também pode dar um duplo
clique sobre o nome da macro que deseja
executar.

botões Finalidade

Executar: Executa a macro selecionada.

Cancelar: Cancela a operação fechando a caixa de diálogo Macro

Depurar: Executa a macro selecionada uma linha de código de cada vez.

Editar: Abre a janela do VBA para edição do código

Criar: Permite a criação de uma nova macro

Excluir: Exclui a macro selecionada

Opções: Permite a atribuição/alteração de uma tecla de atalho e/ou descrição da macro.

As Diversas Formas de Executar uma Macro


Podemos executar uma macro de diversas formas:
1. Tecla de atalho.

2. Botão de macro na planilha

3. Objeto de desenho.

4. Caixa de macro.

5. Botão na Barra de Ferramentas de Acesso Rápido.

6. Item de menu.

Fone: 4121-6166 Reprodução Proibida Pag.: 29


VBA para Excel

Já utilizamos nos exemplos acima, telha de atalho, Botão de Comando e com a Caixa Executar Macro,
agora vamos outras formas.

Formas ou Imagem

Você poderá atribuir uma macro a qualquer objeto de desenho


(Clip-Art, Autoforma etc).

Insira uma Forma ou uma imagem em sua planilha, clique com


botão direito no clip-art e selecione a opção Atribuir macro. Na
caixa de diálogo Macro, selecione a macro desejada e clique
OK.
Ou
Observe que ao passar o mouse sobre a figura, o ponteiro do
mouse assume a forma de uma mão.

Botão Localizado na QAT

Você pode inserir um botão na Barra de ferramentas de acesso rápido e, depois, associar uma macro a
ele.

Botão Localizado na Faixa de Opções

O uso de botões na Faixa de Opções, sem usar comandos XML, só devem ser usados para comandos
genéricos. Ou seja, comandos que podem ser usados em qualquer pasta de trabalho. E, neste caso, os
códigos devem estar na pasta pessoal de macros Personal.xlsb.

Antes de se aventurar na personalização da Faixa de Opções (Ribbon) é necessário entender alguns


conceitos simples, mas fundamentais: Guias, Grupos e Comandos.

1. Guia – são os títulos na parte superior da Faixa de Opções


ex: Arquivo, Página Inicial, Fórmulas, Dados etc.

2. Grupo – são as descrições que aparecem na parte inferior da Faixa de


opções as descrições dependem da guia selecionada no momento.
Se você estiver com a guia Inserir selecionada, os grupos serão:
Tabelas, Ilustrações, gráficos, Minigráficos etc.

Pag.: 30 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Grupo Fonte da guia Página Inicial Grupo Classificar e Filtrar da guia Dados

3. Comandos – são os Botões de comando, Caixas de Combinação, Caixas


de Verificação etc existentes em cada grupo.
Por exemplo, no grupo Fonte da figura acima, temos os comandos:
Negrito, Itálico, Bordas etc além do botão de Grupo .
O grupo Classificar e Filtrar não possui o Botão de Grupo.

Para adicionar um botão para acionar a macro AzulNegr16, clique com o botão direito do mouse sobre a
Faixa de Opções e selecione a opção Personalizar a Faixa de Opções.

No diálogo Opções do Excel, painel direito, selecione a guia desejada. No caso, Pagina Inicial.
Clique no símbolo de adição à esquerda de Página Inicial para exibir seu conteúdo.

Para adicionar um botão de comando no Ribbon, é necessário criar um novo grupo. Para isto, selecione
o item Fonte e depois no botão Novo grupo.

O Excel criará um novo grupo com nome padrão.

Clique no botão Renomear e digite Formatação para alterar o texto.

Fone: 4121-6166 Reprodução Proibida Pag.: 31


VBA para Excel

Em seguida, no painel da esquerda, item Escolher comandos em: clique em Macros.

No painel da esquerda, clique em GravarRegistro e arraste para cima do item Formatação do painel da
direita. Apos soltar o mouse, clique no botão Renomear e, se necessário, altere o texto do botão. Para
alterar a imagem do botão personalizado, clique no botão Renomear e escolha uma imagem conforme
tela abaixo:

Após pressionar OK, a faixa de opções terá a seguinte aparência:

Para fazer testes, basta selecionar uma ou mais células e clicar no botão que você acabou de adicionar.

Se quiser, você poderá adicionar uma nova guia personalizada. Ou seja, uma guia exclusiva só para
acomodar suas macros.

Pag.: 32 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Via editor do Visual Basic for Application ( VBE )

Para executar uma macro, estando dentro do editor do VBA, clique


em qualquer linha do código desejado e execute uma das opções
abaixo:

1. Pressione a tecla F5.

2. No menu Executar clique na opção Executar sub/UserForm.

Ou clique no botão Executar macro.

Adicionando um botão na Barra de ferramentas de Acesso Rápido (QAT).

1. Clique no botão Personalizar a Barra de Ferramentas de Acesso Rápido.

2. Clique no item Mais Comandos.

3. Em Escolher comandos em, selecione o item Macros.

4. Selecione o nome da macro desejada, no caso, GravarRegistro e clique no botão Adicionar.

Fone: 4121-6166 Reprodução Proibida Pag.: 33


VBA para Excel

5. Note que o Excel adicionou automaticamente, o ícone padrão para o botão. Para escolher um novo
ícone, mantenha GravarRegistro selecionado, clique no botão Modificar e escolha uma das figuras
exibidas no quadro.

6. Pressione OK para confirmar a figura selecionada e, em seguida, pressione OK para fechar o diálogo
Opções do Excel.

É possível adicionar uma imagem customizada. Mas, para isto, é necessário usar código XML.

Para testar, selecione uma ou mais células com o texto Teste e clique no botão que você acabou de
adicionar.

Comandos de uso corrente


Remover Macros

Para remover uma macro qualquer, pressione


Alt+F8, no diálogo Macro selecione a macro
desejada e clique no botão Excluir.

ATENÇÃO:

Cuidado para não excluir a macro errada. Mas, se


isto acontecer, pressione Alt+F11 e clique no botão
Desfazer logo em seguida à exclusão da macro.

Após Salvar, o desfazer ficará desabilitado.

Pag.: 34 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Alterando uma Tecla de Atalho

Para alterar uma tecla de atalho, atribuída


anteriormente, pressione Alt+F8. Na caixa de
diálogo Macro, clique no botão Opções.

Na caixa de diálogo Opções de macro digite a nova


letra para o atalho e clique no botão OK.

Na caixa de diálogo Macro, clique no botão Cancelar


ou em Fechar .

Fone: 4121-6166 Reprodução Proibida Pag.: 35


VBA para Excel

A Janela do Editor do VBA


A janela do editor do VBA (VBE – Visual Basic Editor) é o local onde você poderá digitar e/ou alterar
códigos na linguagem VBA. Para acessar o editor de Visual Basic for Applications (VBA) clique em:
Ferramentas | Macro | Editor do Visual Basic (Alt+F11).

As Cores usadas no editor do VBA


A Janela de Edição é onde podemos criar, colar ou alterar o código de objetos, eventos, procedimentos
etc. Uma das características desta janela é que o código, de cada procedimento, é exibido, usando-se
diversas cores, sendo que cada uma das cores possui um significado específico.

Podemos alterar as cores acessando: Ferramentas  Opções  guia Formato do editor.

Podemos alterar as cores, porém cuidado pois não é recomendado utilizar cores padrões em outros
componentes, pois podemos confundir.

Cor Significado

A cor azul é usada para destacar as Palavras-Chave da linguagem. Ex: Sub, End Sub,
Azul
Function, If, Then, Else, While, Loop,…

A cor vermelha aparece durante a edição do código e, é usada para destacar as linhas
Vermelho
que possuem erros de sintaxe.

Pag.: 36 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Preto A cor preta indica nome de variáveis, procedimentos, valores, operadores,…

Verde A cor verde indica que o texto nesta cor é um comentário.

A cor de fundo amarela é usada para indicar que ocorreu um erro, na linha onde a cor
Amarelo
se apresentar, durante a execução do código.

Segue alterativa de cores que podemos utilizar

Para essa configuraçã, as cores alteradas foram:

Texto normal Primeiro plano: Cinza claro

Plano de fundo: Preto

Texto de erro de sintaxe Plano de fundo: Preto

Texto de Comentário Primeiro plano: Verde claro

Plano de fundo: Preto

Texto de palavra-chave Primeiro plano: Azul claro

Plano de fundo: Preto

Texto de identificador Primeiro plano: Branco

Texto de indicador Plano de fundo: Preto

Texto de retorno de chamada

Comentários
Os comentários são um ótimo recurso para a documentação do código. Para inserir um comentário, use
o símbolo apóstrofo ( ' aspas simples) da seguinte forma:
'A linha abaixo declara a variável X.

Dim X As Double

Fone: 4121-6166 Reprodução Proibida Pag.: 37


VBA para Excel

X = 3.141592654 'Atribui o valor de Pi à variável X.

O compilador do VBA desconsidera todos os caracteres que estiverem à direita do apóstrofo.

No código, os comentários, terão como padrão, a cor verde.

Nota:
Os comentários também são utilizados como documentação do código, porém cuidado com o excesso
de comentários, pois em metodologia de Clean Code (Código Limpo), onde visamos um código funcional
e simples, é defido que não é necessário utilizar comentários, pois o código em si já seria a
documentação, pois ele tem que ser claro e objetivo, o próprio código já falar o que faz.

Caractere de continuação de linha


Certas linhas de código são extensas, o que dificulta sua visualização na janela do VBA.

Para contornar este problema, use o caractere _ (sublinhado) ele, nos permite indicar ao VBA que a
instrução continuará na próxima linha.

Observe que você deverá colocar um espaço antes do símbolo _.

A linha abaixo, gera erro de sintaxe (note que não há espaço antes do sublinhado).
MsgBox "A área é: " & Area, vbInformation, "Calculo da Área do Círculo"

Quando você precisar quebrar a linha no meio de um texto, proceda da seguinte forma: Feche o texto
com aspas " Digite o caractere & (e comercial) pressione a tecla Espaço e digite o caractere de
continuação de linha _.

Exemplo: MsgBox "Este texto é um exemplo para ilustrar a " & _

"quebra de linha no meio de uma frase qualquer.", _

vbInformation, "Exemplo para quebra de linha"

Partes da Janela do VBA

A janela do VBA possui outras janelas, as quais podem ficar flutuando na tela ou encaixada em uma das
quatro laterais.

Pag.: 38 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Janela de Projetos

Exibe uma lista hierárquica dos projetos e de todos os itens


contidos e referenciados em cada um dos projetos.

Se a janela não estiver visível ative-a em:


Exibir  Project Explorer (Ctrl+R).

Nesta janela você visualiza a hierarquia dos projetos de VBA


ativos nesse momento.

Exibir código Exibe a janela Code para que você possa gravar e editar código associado ao item
selecionado.

Exibir objeto Exibe a janela Objeto para o item selecionado, um Documento ou UserForm
existente.

Alternar pastas Oculta e mostra as pastas de objetos enquanto exibe os itens individuais contidos
nelas.

Janela de Propriedades

Se a janela das propriedades não estiver visível ative-a


através do menu Exibir  janela Propriedades atalho:
(F4).

Nesta janela você poderá visualizar ou alterar as


propriedades que definem o objeto selecionado: (Name,
Caption etc).

Lista as propriedades em tempo de criação (Design


Time), para os objetos selecionados e suas configurações
atuais. Você pode alterar estas propriedades em tempo
de criação.

Quando você seleciona múltiplos controles, a janela


Propriedades exibe uma lista das propriedades comuns a
todos os controles selecionados.

Fone: 4121-6166 Reprodução Proibida Pag.: 39


VBA para Excel

Janela UserForm
Permite-lhe criar as janelas ou caixas de diálogo no
seu projeto. Você desenha e visualiza controles em um
formulário.

Enquanto estiver desenvolvendo um formulário:

Cada janela do formulário tem um botão Maximizar,


Minimizar e Fechar.

Você pode exibir a grade do formulário e determinar o


tamanho das linhas de grade, na guia Geral da caixa
de diálogo Opções.

Utilize os botões da Caixa de ferramentas para desenhar


controles no formulário. Você pode definir seus controles
para alinhar com a grade do seu formulário, a partir da guia
Geral da caixa de diálogo Opções.

Janela de Edição
A janela de edição exibe o código em Visual Basic for Applications
associado ao elemento selecionado na janela do Project Explorer.

Onde:

Permite a seleção de Objetos.

Permite a seleção de Procedimentos


disponíveis para o objeto selecionado.

Configura a exibição de um único


procedimento por vez.

Configura a exibição de todos os


procedimentos do módulo.

Pag.: 40 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Pesquisador de Objetos
O Pesquisador de objeto permite que você procure
todos os objetos disponíveis no seu projeto e veja suas
propriedades, métodos e eventos. Além disso, você
pode ver os procedimentos e constantes que estão
disponíveis em bibliotecas de objetos no seu projeto.
Você pode facilmente exibir a Ajuda on-line enquanto
procura. Você pode usar o Pesquisador de objeto para
localizar e usar objetos que você cria ou objetos de
outros aplicativos.

Para exibir a janela do Pesquisador de objetos, clique


no menu Exibir e selecione a opção: Pesquisador de
Objetos atalho: (F2).

Para pesquisar uma palavra qualquer no Pesquisador de objetos, proceda da seguinte forma: digite o
texto de pesquisa e, em seguida clique no botão Pesquisar .

Na Caixa de combinação onde está escrito Todas as bibliotecas, selecione a aplicação para a qual
pretende ajuda – neste caso Excel. Convém referir que poderá utilizar as funções de toda e qualquer
aplicação.

Na área intitulada Classes, aparecem todos os objetos específicos para o manuseamento da aplicação
selecionada. A classe especial designada Globais refere-se às funções que estão disponíveis na aplicação
independentemente dos objetos selecionados.

Selecione um dos objetos e visualize do lado direito os Membros do Elemento selecionado. No caso
Globais.

Para cada membro da classe dispõe de uma ajuda on-line que o esclarece sobre a respectiva função e
funcionamento, dando um exemplo que poderá testar. Para tal basta clicar sobre o botão de Ajuda da
janela do Pesquisador de Objetos.

Janela Code

Abaixo, alguns modelos da janela Code.

Fone: 4121-6166 Reprodução Proibida Pag.: 41


VBA para Excel

Planilha

Formulário Pasta de trabalho Módulo Geral

Use a janela Code para escrever, exibir ou editar códigos de Visual Basic. Você pode abrir tantas janelas
Code quantos forem os módulos, de modo que possa visualizar facilmente o código em diferentes
formulários ou módulos e copiar e colar entre eles.

Você pode abrir uma janela Code a partir da janela:

Projeto: selecione um formulário ou módulo e clique no botão Exibir código.

UserForm: clique duas vezes em um controle ou formulário e escolha Código no menu Exibir ou
pressionando F7.

Dividir a janela Code

Você pode dividir a janela Code horizontalmente em dois painéis para exibir diferentes segmentos do
código de um módulo ao mesmo tempo. Cada painel se movimenta separadamente, na horizontal e na
vertical. As opções da caixa Procedimento e Objeto referem-se ao painel que está com o foco. As
alterações de código são imediatamente refletidas nos dois painéis.

Pag.: 42 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Para dividir a janela Code em painéis Arraste a barra de


divisão na parte superior da barra de rolagem vertical
para baixo a partir do canto superior direito da janela
Code.

Para remover a divisão da janela Code Clique duas vezes


na barra de divisão ou arraste-a para a parte superior ou
para a parte inferior da janela Code.

Janela Verificação imediata

A janela Verificação imediata exibe informações que são o resultado de instruções de depuração no seu
código ou de comandos digitados diretamente na janela.

Para exibir a janela "Verificação imediata", clique no menu Exibir,


selecione a opção janela Verificação imediata ou use o atalho
(Ctrl+G).

Permite executar as seguintes ações:

• Digitar ou colar uma linha de código e pressionar ENTER para executá-la.

• Copiar e colar o código da janela Verificação imediata para a janela Code, mas não permite salvar
código na janela Verificação imediata.

• A janela Verificação imediata pode ser arrastada e posicionada em qualquer lugar na sua tela a
menos que você a tenha tornado uma janela encaixável a partir da guia Encaixe na caixa de diálogo
Opções.

• Você pode fechar a janela clicando no botão Fechar. Se o botão Fechar não estiver visível, clique
duas vezes na barra de título para tornar o botão Fechar visível e, em seguida, clique nele.

Observação No modo interromper, uma instrução na janela Verificação imediata é executada no


contexto ou no escopo exibido na caixa Procedimento.
Por exemplo, se você digitar Print NomeDaVariável, sua saída será o valor de uma variável local. É
como se o método Print tivesse ocorrido no procedimento que você estava executando quando o
programa parou.

• Você pode alterar o tamanho dos cabeçalhos das colunas arrastando a sua borda para a direita para
aumentá-la ou para a esquerda para diminuí-la.

• Arrastar uma variável selecionada para a janela Imediata.

Fone: 4121-6166 Reprodução Proibida Pag.: 43


VBA para Excel

• Fechar a janela, clicando na caixa Fechar. Se a caixa não estiver visível, clique duas vezes na barra
Título para torná-la visível.

Autolist Members

O Editor do VBA, disponibiliza ao usuário um sistema


de ajuda constante. Assim, quando se constroem
procedimentos, na janela de edição, à medida que a
linguagem é escrita o editor abre oportunamente
listas de opções para ajudar a escrever o código.

Esta ajuda é denominada Autolist Members


(Autolistar Membros) e pode ser configurada na
janela Opções do menu Ferramentas.

Pag.: 44 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Tipos de Métodos

Cada código criado através da linguagem VBA (Visual Basic for Applications), seja através do gravador de
macros ou editadas manualmente, é denominado Método.

Existem dois tipos Métodos: Ação (Sub) e Retorno (Function).

Definição de um Método Sub (Ação)


Os métodos de Ação, executam um procedimento que gera alguma ação que poderia ser realizada pelo
usuário, exemplo: Abrir um arquivo, colorir um intervalo, formatar uma planilha, criar uma tabela
dinâmica, exibir mensagens para o usuário, etc.

Os métodos de ação podem ou não ter argumentos para serem chamados, e podem ser executados
diretamente pelo código ou chamados de algum evento ou outros métodos.

Sub NomeDoMétodo(argumentos)
...
Linhas de código
...
End Sub

Para criar o método iniciamos declarando qual o tipo do método, nesse caso utilizamos a palavra Sub,
em seguida informamos um nome para esse método e pressionamos Enter. Nesse momento será criado
a estrutura de bloco do método contento o início do método “Sub NomeMetodo()” e o fechamento de
bloco do método “End Sub”. Todo precedimento que o método deverá executar, deve ser escrito dentro
do bloco.

Nota:
O nome tem algumas regras que iremos estudar com mais detalher mais a frente em Regras de
Nomenclatura, resumindo não podemos utilizar caracteres especiais nem espaços em branco no nome.

Observe os parênteses () eles fazem parte do método e sua finalidade é a de delimitar os argumentos
passados para o método.

Os parâmetros (argumentos) não são obrigatórios em um método Sub. Mas, mesmo assim, os
parênteses () devem estar presente.

O método Sub a seguir tem comentários que explicam cada linha.

' Criando um método Sub


Sub Mensagem()' Este método não utiliza argumentos
Dim nome As String ' Declara a variável para receber um nome

Fone: 4121-6166 Reprodução Proibida Pag.: 45


VBA para Excel

' Atribui o valor de retorno da função InputBox à nome


nome = InputBox("Informe seu nome")

' Exibindo uma mensagem ao usuário


MsgBox "Bom dia " & nome
End Sub ' Encerra o método Sub

Desafio 1
Vamos criar um método que receba um nome, depois o sobrenome e exibir uma mensagem contendo
o nome completo.

Definição de um Método Function (Retorno)


Os métodos de Retorno, assim como os métodos de Ação, executam um procedimento, geralmente
cálculos, refinamento ou busca, e diferente dos métodos de Ação, ele retorna um resultado para o local
onde o método foi chamado.

Também é possível executar os mesmos procedimentos que são executados nos métodos de Ação em
um método de retorno, porém não é uma boa prática, pois os métodos que executam tarefas são os de
Ação, por exemplo, não é uma boa prática criar Caixas de Diálogo (MsgBox ou InpuBox) dentro de um
método de Retorno (Function). Mais a frente será demonstrado um exemplo de, porque não utilizar
métodos de Retorno com procedimentos de Ação.

Outra diferença entre os métodos de Ação e Retorno, é a forma de executar os métodos. Os métodos de
Ação são executados conforme informado acima, atribuindo a chamada a um botão, imagem,
executando pela janela de Macros, ou diretamente pela tela de código pressionado o botão executar ou
atalho F5. Já os métodos de Retorno são chamados de algum lugar e o resultado atribuído a algum local.
Exemplo chamamos a Function e atribuímos o resultado a uma variável.

Vamos conhecer a estrutura dos métodos de Retorno (Function)

Function NomeDoMétodo(argumentos) as TipoDeRetorno


...
Linhas de código
...
End Funciton

Para criar os métodos iniciamos pela palavra que define o tipo do método, Function, damos um nome
ao métodos, se necessário informamos um argumento e, diferente do método de Ação, informamos
qual tipo de dado o método irá retornar (String, Integer, Boolean, etc...)

Criando um método Funcion


' Criando um método Function
' Este método não utiliza argumentos e retorna um texto (String)
Function RetornaMensagem() As String
Dim mensagem As String ' Declara a variável para receber uma mensagem

Pag.: 46 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

' Atribuindo à variável uma mensagem que irá retornar


mensagem = "Bom dia turma do VBA"

' Retornando a Mensagem


RetornaMensagem = mensagem
End Function ' Encerra o método Function

Criamos um método que retornará uma mensagem quando for chamado.

Analinando linha a linha

• Na primeira linha (Function RetornaMensagem() As String) foi definido o nome para o método
como RetornaMensagem, o método não contém argumento e retorna um texto (As String)
• Na segunda linha (Dim mensage As String) definimos a variável com o nome mensagem.
• Na terceira linha (nome = "Bom dia turma do VBA") atribuímos um valor para a
variável
• E na ultima linha (End Function) encerramos o bloco Function.

Agora como podemos executar esse método? Conforme falamos acima, o método não é executado e
sim chamado de algum local. Vamos criar um método de Ação (Sub) para chamar nosso método.
' Criando um método Sub para chamar a Function
Sub ExecutandoMensagem()' Este método não utiliza argumentos
Dim mensagem As String ' Declara a variável que irá receber a Function

' Chamando a function e atribuindo a variavel


mensagem = RetornaMensagem ' Aqui chamamos a função

' Exibindo a variável mensagem, que recebeu o valor do método Function


MsgBox mensagem
End Sub ' Encerra o método Sub

Agora quando executarmos o método ExecutarMensagem, ele irá chamar a Function


RetornaMensagem e irá exibir em uma Caixa de Diálogo.

Agora vamos imaginar que será necessário informar um nome para a mensagem, Exemplo “Bom dia
José”, precisamos um um nome de uma forma dinâmica. Como vimos no método Sub, podemos utilizar
a Caixa de Diálogo InputBox, e em tempo de execução informar um nome que será concatenado a
mensagem, mas na Function, por mais que permita, não é remendado utilizar Caixas de Diálogo. Então
como faremos?

Sempre que for necessário passar um valor para uma Function, iremos utilizar Argumentos, como no
exemplo abaixo.
Function RetornaMensagemComNome(nome As String) As String
Dim mensagem As String ' Declara a variável para receber uma mensagem

' Atribuindo à variável uma mensagem que irá retornar


nome = "Bom dia " & nome

Fone: 4121-6166 Reprodução Proibida Pag.: 47


VBA para Excel

' Retornando a Mensagem


RetornaMensagemComNome = mensagem

End Function

No exemplo acima, criamos um argumento nome do tipo String, agora sempre que chamar o método,
será necessário informar um valor para o argumento.
' Criando um método Sub para chamar a Function
Sub ExecutandoMensagem()' Este método não utiliza argumentos
Dim mensagem As String ' Declara a variável que irá receber a Function
Dim nome As String ' Declara a variável que receberá um nome

' Atribui o valor de retorno da função InputBox à nome


nome = InputBox("Informe seu nome")

' Chamando a function e passando o valor para o argumento


mensagem = RetornaMensagemComNome(nome)

' Exibindo a variável mensagem, que recebeu o valor do método Function


MsgBox mensagem
End Sub ' Encerra o método Sub

Agora podemos passar argumentos para nosso método. Com um método Sub, recebemos um nome
utilizando uma Caixa de Diálogo (InputBox) para atribuir a uma variável nome, e passamos essa variável
como argumento no método RetornaMensagemComNome.

Famos facilitar o entendimento, suponhamos que exista uma lista com diversos nomes, e será
necessário criar uma mensagem para cada nome.

Podemos fazer da seguinte maneira.

Também é possível chamar as Function diretamente pelo Excel.

Pag.: 48 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Simplificando
Sempre que gravamos uma Macro, é executado uma Ação, ou seja, movimentos pela tela, serão gerados
métodos Sub.

Todas a Funções do Excel (PROCV, SOMASE, ÍNDICE, CORRESP, etc...) são Functions, pois são chamadas
de um local, célula do Excel, executam alguma tarefa de cálculo, buscar, analise, e retornam um
resultado onde foi chamado. O sinal de “=” dentro da célula quando vamos chamar uma função no
Excel, significa que estamos atribuindo um valor para aquela célula, no caso o resultado do método.

Desafio 2
Vamos criar uma função que receba 2 argumentos, um nome e um sobrenome, e devolva o nome
completo.

Obs. Para adicionar mais que um argumento, utilizamos Vírgula (,) para separa, e quando chamamos
no Excel, assim como os argumentos de métodos como PROCV, utilizamos Ponto e Vírgula (;)

Fone: 4121-6166 Reprodução Proibida Pag.: 49


VBA para Excel

Variáveis
Variável é um local de armazenamento nomeado que pode conter dados, os quais podem ser
modificados durante a execução do programa. Cada variável possui um nome que a identifica com
exclusividade dentro de seu escopo. Um tipo de dados pode ser ou não especificado.

Os nomes de variável devem começar com um caractere alfabético, devem ser exclusivos dentro do
mesmo escopo, não podem ter mais de 255 caracteres e também não podem conter um ponto ou
caractere de declaração de tipo incorporado.

Imagine a memória de um computador como um grande arquivo, com várias gavetas, onde é possível
guardar, em cada gaveta, apenas um único valor por vez. E que estas gavetas deverão, como em um
arquivo, estarem identificadas como uma etiqueta contendo um nome.

‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ...

‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ...

‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ‫ם‬ ...

... ... ... ... ... ... ... ...

Representação gráfica da memória de um computador em nível de variáveis.

Trabalhando com Variáveis


Antes da utilização de uma variável, devemos fazer a declaração da mesma.

Declarar uma variável é estabelecer o seu tipo, de acordo com a finalidade (uso) da mesma.

Para declarar uma variável, usamos a palavra Dim (abreviação de Dimension).

Sintaxe: Dim <NomeDaveriável> As <tipoDaVariável>

Exemplos:
Dim nome As String
Dim pi As Double
Dim x As Integer

Você poderá declarar várias variáveis em uma só linha:


Dim xome As String, pi As Double, x As Integer, y As Integer

Observe que devemos declarar o tipo para cada uma das variáveis, se você usar, por exemplo:
Dim x, y As Integer

Apenas y será do tipo Integer. Pois, quando não explicitamos o tipo de uma variável, como no caso do x,
o VBA assume como sendo do tipo Variant.

Pag.: 50 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Tipos de Variáveis do VBA

A tabela abaixo mostra os tipos de dados, incluindo tamanhos de armazenamento e intervalos.

Tipo de dados Tamanho Intervalo


Byte 1 byte de 0 a 255
Boolean 2 bytes True ou False
Integer 2 bytes de -32.768 a 32.767
Long (número inteiro longo) 4 bytes de -2.147.483.648 a 2.147.483.647
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
LongLong (LongLong integer) 8 bytes
(válido somente em plataformas de 64 bits)
LongPtr
4 bytes em 32 bits, -2.147.483.648 a 2.147.483.647 32 bits,
(Inteiro longo em 32 bits, inteiro
8 bytes em 64 bits -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 64 bits
LongLong em 64 bits)
Single
de –3,402823E38 a -1,401298E-45 para valores negativos;
(vírgula flutuante de precisão 4 bytes
de 1,401298E-45 a 3,402823E38 para valores positivos
simples)
de –1,79769313486231E308 a
Double -4,94065645841247E-324 para valores negativos;
8 bytes
(flutuante de dupla precisão) de 4,94065645841247E-324 a 1,79769313486232E308 para
valores positivos.
Currency
8 bytes de -922.337.203.685.477,5808 a 922.337.203.685.477,5807
(número inteiro em escala)
+/-79.228.162.514.264.337.593.543.950.335
sem vírgula decimal;
+/-7,9228162514264337593543950335
Decimal 14 bytes
com 28 casas decimais à direita;
o menor número diferente de zero é
+/-0,0000000000000000000000000001.
Date 8 bytes De 1 de janeiro de 100 a 31 de dezembro de 9999
Objeto 4 bytes Qualquer referência Object
10 bytes + compr. da
String (comprimento variável) De 0 a aproximadamente 2 bilhões
sequência
String (comprimento fixo) Compr. da sequência De 1 a aproximadamente 65.400
Variant (com números) 16 bytes Qualquer valor até o intervalo de um Double
22 bytes + compr. da
Variant (com caracteres) O mesmo que String de comprimento variável
sequência
Número requerido O intervalo de cada elemento é igual ao intervalo do seu tipo de
Definido pelo usuário (Type)
por elementos dados.

Fone: 4121-6166 Reprodução Proibida Pag.: 51


VBA para Excel

Usando Caractere de Tipo


Caractere Tipo de dados String

$ String
Exemplo de como Declarar uma variável usado o
% Integer
caractere de tipo:
& Long

! Single
Dim S$, I%, L&, Si!, D#, C@
# Double

@ Currency

Declarando variáveis
Ao declarar variáveis, você geralmente utiliza uma instrução Dim. Uma instrução de declaração pode ser
colocada dentro de um método para criar uma variável de nível de procedimento. Ou ela pode ser
colocada na parte superior de um módulo, na seção Declarações, para criar uma variável de nível de
módulo.

O exemplo a seguir cria a variável strName e especifica o tipo de dados String.


Dim strName As String

Se esta instrução aparecer dentro de um procedimento, a variável strName poderá ser utilizada
somente nesse procedimento. Se a instrução aparecer na seção Declarações do módulo, a variável
strName estará disponível para todos os procedimentos dentro do módulo, mas não para
procedimentos em outros módulos no projeto. Para tornar essa variável disponível para todos os
procedimentos no projeto, preceda-a com a instrução Public, como no exemplo a seguir:
Public strName As String

Regras de nomenclatura do Visual Basic


Utilize as seguintes regras quando nomear procedimentos, constantes, variáveis e argumentos em um
módulo do Visual Basic:
• Você deve utilizar uma letra como o primeiro caractere.

• Você não pode utilizar um espaço, ponto (.), ponto de exclamação (!) ou os caracteres @, &, $, # no
nome.

• O nome, de uma variável, pode ter no máximo 255 caracteres.

• Geralmente, você não deve utilizar nomes iguais às funções, instruções e métodos do Visual Basic.
Você acaba encobrindo as mesmas palavras-chave na linguagem. Para utilizar uma função, instrução
ou método intrínsecos da linguagem que entre em conflito com um nome atribuído, você deve
identificá-lo explicitamente. Preceda o nome da função, instrução ou método intrínseco com o nome
da biblioteca de tipos a que está associado.

Pag.: 52 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Por exemplo, se você tiver uma variável chamada Left, só poderá invocar a função Left utilizando
VBA.Left.

• Você não pode repetir nomes dentro do mesmo nível de escopo. Por exemplo, você não pode
declarar duas variáveis com o nome idade dentro do mesmo procedimento.
No entanto, é possível declarar uma variável privada com o nome idade e uma variável em nível de
procedimento com o nome idade dentro do mesmo módulo.

Observação O Visual Basic não diferencia maiúsculas de minúsculas, mas preserva a colocação em
minúscula na instrução em que o nome for declarado. Falaremos mais sobre boas prática mais a
frente.

As variáveis podem ser declaradas como um dos seguintes tipos de dados: Boolean, Byte, Integer, Long,
Currency, Single, Double, Date, String (para sequências de caracteres de comprimento variável), String
* length (para sequências de caracteres de comprimento fixo), Object, ou Variant. Caso você não
especifique um tipo de dados, o tipo de dados Variant será atribuído como padrão. Você também pode
criar um tipo definido pelo usuário através da instrução Type. Para obter mais informações sobre tipos
de dados, consulte Resumo de tipos de dados na Ajuda do Visual Basic.

Você pode declarar diversas variáveis em uma instrução. Para especificar um tipo de dados, você deve
incluir o tipo de dados para cada variável. Na instrução a seguir, as variáveis intX, intY e intZ são
declaradas como tipo Integer.
Dim intX As Integer, intY As Integer, intZ As Integer

Na instrução a seguir, intX e intY são declaradas como tipo Variant; apenas intZ é declarada como tipo
Integer.
Dim intX, intY, intZ As Integer

Você não precisa fornecer o tipo de dados da variável na instrução de declaração. Caso você omita o
tipo de dados, a variável será do tipo Variant.

Utilizando a instrução Static


Quando você utilizar a instrução Static no lugar de uma instrução Dim, a variável declarada manterá
seus valores atualizados entre as chamadas do procedimento.

Fone: 4121-6166 Reprodução Proibida Pag.: 53


VBA para Excel

Utilizando a instrução Option Explicit


Sintaxe: Option Explicit

Para forçar a declaração explícita de todas as variáveis desse módulo use a instrução Option Explicit.

Comentários: Se usada, a instrução Option Explicit deve aparecer em um módulo antes de qualquer
procedimento.

Quando Option Explicit aparece em um módulo, você será forçado a declarar explicitamente todas as
variáveis usando as instruções Dim, Private, Public, ReDim ou Static. Se você tentar usar o nome não
declarado de uma variável, ocorrerá um erro em tempo de compilação.

Se você não usar a instrução Option Explicit, todas as variáveis não declaradas serão do tipo Variant, a
menos que o tipo padrão seja especificado com uma instrução Deftipo.

Observação Use Option Explicit para evitar a digitação incorreta do nome de uma variável existente ou
para evitar confusão no código em que o escopo da variável não esteja claro e também, por questão de
portabilidade.

Você pode definir uma opção no ambiente de programação do Visual Basic para incluir
automaticamente a instrução Option Explicit em todos os módulos novos.

Para isto, na janela do VBA, clique no menu Ferramentas / Opções e ative a opção Requerer declaração
de variável.

Observação Você deve declarar explicitamente as matrizes fixas e as matrizes dinâmicas.

Pag.: 54 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Declarando uma variável de objeto para automação

Quando você utiliza um aplicativo para controlar os objetos de outro aplicativo, você deve definir uma
referência à biblioteca de tipos do outro aplicativo. Quando você define uma referência, pode declarar
as variáveis de objeto de acordo com o tipo mais específico. Por exemplo, caso esteja no Microsoft
Word ao definir uma referência à biblioteca de tipos do Microsoft Excel, você pode declarar uma
variável do tipo Worksheet a partir do Microsoft Word para representar um objeto Worksheet do
Microsoft Excel.

Caso você esteja utilizando outro aplicativo para controlar objetos do Microsoft Access, poderá, na
maioria dos casos, declarar as variáveis de objeto de acordo com o tipo de dados mais específico. Você
também pode utilizar a palavra-chave New para criar automaticamente uma nova ocorrência de um
objeto. No entanto, talvez você deva indicar que ele é um objeto do Microsoft Access. Por exemplo,
quando você declara uma variável de objeto para representar um formulário do Microsoft Access, a
partir do Microsoft Visual Basic, deve diferenciar o objeto Form do Microsoft Access de um objeto Form
do Visual Basic. Inclua o nome da biblioteca de tipos na declaração da variável, como no exemplo a
seguir:
Dim frmEncomendas As New Access.Form

Alguns aplicativos não reconhecem tipos de objeto individuais do Microsoft Access. Mesmo se definir
uma referência à biblioteca de tipos do Microsoft Access a partir desses aplicativos, você deve declarar
todas as variáveis de objeto do Microsoft Access como tipo Object. Você também não pode utilizar a
palavra-chave New para criar uma nova ocorrência do objeto. O exemplo a seguir mostra como se
declara uma variável para representar uma ocorrência do objeto Application do Microsoft Access a
partir de um aplicativo que não reconhece tipos de objeto do Microsoft Access. Em seguida, o aplicativo
cria uma ocorrência do objeto Application.
Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

Para determinar a qual sintaxe um aplicativo oferece suporte, consulte a documentação do aplicativo.

Associação de Valores a Variáveis


Para associar um valor a uma determinada variável, usamos a seguinte sintaxe:
Dim nomeDaVariável As Tipo
NomeDaVariável = Valor

Exemplos:
Dim pi As double, nome As string
pi = 3,14159
Nome = "João da Silva"

Fone: 4121-6166 Reprodução Proibida Pag.: 55


VBA para Excel

Utilização de Variáveis como se Fossem Valores


Após a atribuição de valores às variáveis, podemos usá-las em nossos cálculos em lugar dos valores
propriamente.

Exemplo: Calcular a área de círculo


Sub CalculaAreaCirculo()
Dim pi As Double, area As Double, raio As Double
pi = 3,14159
raio = InputBox("Digite o valor do Raio", "Entrada")
area = pi * raio ^ 2
MsgBox "A área é: " & Area, vbInformation, "Calculo da Área do Círculo"
End Sub

Declaração Opcional e o tipo Variant


O tipo de dados Variant é automaticamente especificado caso você não especifique um tipo de dados
quando declara uma constante, variável ou argumento. As variáveis declaradas como o tipo de dados
Variant pode conter valores de sequência de caracteres, de data, de hora, Boolean ou numéricos, e
podem converter automaticamente os valores que contêm. Os valores numéricos Variant exigem 16
bytes de memória (o que é significativo apenas em grandes procedimentos ou módulos complexos) e o
acesso a eles é mais lento do que a qualquer variável de outro tipo digitada explicitamente. Raramente
você utiliza o tipo de dados Variant em uma constante. Os valores de sequência de caracteres Variant
exigem 22 bytes de memória.

As instruções a seguir criam variáveis Variant:


Dim Var1
Dim Var2 As Variant
Var3 = "Texto."

A última instrução não declara explicitamente a variável Var3, mas declara a variável implícita ou
automaticamente. As variáveis que são declaradas implicitamente são especificadas como o tipo de
dados Variant.

Dica Se você especificar um tipo de dados para uma variável ou argumento e, em seguida, utilizar o
tipo de dados errado ocorrerá um erro de tipo de dados. Para evitar erros de tipo de dados, utilize
somente variáveis implícitas (o tipo de dados Variant) ou declare explicitamente todas as suas variáveis
e especifique um tipo de dados. O último método é mais apropriado.

Instrução Option Private

Quando usada em aplicativos do host que permitem referências em múltiplos projetos, Option Private
Module impede que o conteúdo de um módulo seja referenciado fora do seu projeto.
Pag.: 56 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Sintaxe: Option Private Module

Comentários
Se usada, a instrução Option Private deve aparecer no nível de módulo antes de qualquer
procedimento.
Quando um módulo contém Option Private Module, as partes públicas, por exemplo, variáveis, objetos
e tipos definidos pelo usuário declarados no nível de módulo, continuam disponíveis dentro do projeto
que contém o módulo, mas não ficam disponíveis para outros aplicativos ou projetos.

Exemplo da instrução Option Private

Este exemplo demonstra a instrução Option Private, que é usada no nível de módulo para indicar que o
módulo inteiro é privado. Com Option Private Module, as partes no nível de módulo não declaradas
Private ficam disponíveis para outros módulo do projeto, mas não para outros projetos ou aplicativos.

Option private Module 'Indica que o módulo é privado.

Fone: 4121-6166 Reprodução Proibida Pag.: 57


VBA para Excel

Constantes

Um item nomeado que mantém um valor constante por toda a execução de um programa. Uma
constante pode ser uma literal de sequência de caracteres ou numérica, outra constante ou qualquer
combinação que inclua operadores aritméticos ou lógicos, exceto o operador Is e o operador ^
(Exponenciação). Cada aplicativo host pode definir seu próprio conjunto de constantes.

Constantes adicionais podem ser definidas pelo usuário com a instrução Const. Você pode utilizar
constantes em qualquer lugar do seu código em vez de valores reais.

Instrução Const
Declara as constantes a serem usadas no lugar de valores literais.

Sintaxe: [Public | Private] Const constname [As type] = expression

A sintaxe da instrução Const possui as partes a seguir:

Parte Descrição

Opcional. Palavra-chave usada no nível de módulo para declarar constantes que estejam
Public disponíveis para todos os procedimentos em todos os módulos. Não é permitida em
procedimentos.

Opcional. Palavra-chave usada no nível de módulo para declarar constantes disponíveis apenas
Private
dentro do módulo no qual a declaração é feita. Não é permitida em procedimentos.

constname Obrigatória. Nome da constante; segue as convenções padrões de nomenclatura de variáveis.

Opcional. Tipo de dados da constante; pode ser Byte, Boolean, Integer, Long, Currency, Single,
type Double, Date, String ou Variant. Use uma cláusula As type separada para cada constante que for
declarada.

Obrigatória. Um literal, outra constante ou qualquer combinação que inclua todos os


expression
operadores aritméticos ou lógicos com exceção de Is.

Comentários

As constantes são particulares por padrão. Dentro de procedimentos, as constantes sempre serão
particulares; sua visibilidade não pode ser alterada. Em módulos padrão, a visibilidade padrão de
constantes no nível de módulo pode ser alterada com a palavra-chave Public. Nos módulos de classe,
contudo, as constantes só podem ser particulares e sua visibilidade não pode ser alterada com a
palavra-chave Public.

Para combinar diversas declarações de constantes na mesma linha, separe cada atribuição de constante
com uma vírgula. Quando as declarações de constante são combinadas dessa forma, a palavra-chave
Public ou Private, se usada, aplica-se a todas elas.
Pag.: 58 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

• Você não pode usar variáveis, funções definidas pelo usuário ou funções intrínsecas ao Visual
Basic (como Chr) em expressões atribuídas a constantes.
Observação As constantes podem tornar seus programas automaticamente documentáveis e
fáceis de serem modificados. Ao contrário das variáveis, as constantes não podem ser alteradas
inadvertidamente enquanto seu programa está sendo executado.

• Se você não declarar explicitamente o tipo de constante usando As type, a constante receberá o
tipo de dados mais apropriado a expression.
• As constantes declaradas em um procedimento Sub, Function ou Property são locais a esse
procedimento. Uma constante declarada fora de um procedimento é definida em todo o
módulo no qual é declarada. Você pode usar constantes em qualquer lugar em que for possível
usar uma expressão.

Declarando constantes
Através da declaração de uma constante, você pode atribuir um nome significativo a um valor. Utilize a
instrução Const para declarar uma constante e definir o seu valor. Depois que uma constante tiver sido
declarada, não será possível modificá-la ou atribuir-lhe um novo valor.

Você pode declarar uma constante dentro de um procedimento ou na parte superior de um módulo, na
seção Declarações. Como padrão, as constantes em nível de módulo são privadas. Para declarar uma
constante em nível de módulo público, preceda a instrução Const com a palavra-chave Public. Para
declarar explicitamente uma constante privada, preceda a instrução Const com a palavra-chave Private
para facilitar a leitura e a interpretação do seu código. Para obter mais informações, consulte
Compreendendo o escopo e a visibilidade na Ajuda do VBA. O exemplo a seguir declara a constante
Public IdadeLimite como um Integer e atribui a ela o valor 34.
Public Const IDADE_LIMITE As Integer = 34

As constantes podem ser declaradas como um destes tipos de dados: Boolean, Byte, Integer, Long,
Currency, Single, Double, Date, String ou Variant. Como você já conhece o valor de uma constante,
pode especificar o tipo de dados em uma instrução Const. Para obter mais informações sobre tipos de
dados, consulte Resumo de tipos de dados na Ajuda do VBA.

Você pode declarar diversas constantes em uma instrução. Para especificar um tipo de dados, você deve
incluir o tipo de dados de cada constante. Na instrução a seguir, as constantes Idade e Salario são
declaradas como Integer e Currency respectivamente.
Const IDADE As Byte = 34, SALARIO As Currency = 35.000

Fone: 4121-6166 Reprodução Proibida Pag.: 59


VBA para Excel

Exemplo da instrução Const


A instrução Const serve para declarar constantes para uso em lugar de valores literais.
As constantes Public ocorrem em uma seção geral de um módulo padrão, em vez de em um módulo de
classe.
As constantes Private podem aparecer na seção geral de qualquer tipo de módulo.
' As constantes são Private por padrão.
Const MY_VAR = 459

' Declara a constante Public.


Public Const MY_STRING = "AJUDA"

' Declara a constante Integer Private.


Private Const MY_INT As Integer = 5

' Declara múltiplas constantes na mesma linha.


Const MY_STRING = "Olá", MY_DOUBLE As Double = 3.4567

Desafio 3
Vamos criar um método que receba doi nomes, exemplor JOSÉ e MARIA, armazenar cada nome em
uma variável e depois trocar o valor das variáveis uma com a outra.

Ex.

nome1 = “MARIA”
nome2 = “JOSE”

realizar a troca que o resultado seja

nome1 = “JOSE”
nome2 = “MARIA”

Pag.: 60 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Boas Práticas de Programação


Na programação temos algumas regras, onde são obrigatórios determinadas definições, exemplo ao
definir uma variável, não é possível utilizar caracteres especiais no nome ou o uso de espaço. Porém
temos também as Boas Práticas de Programação, que são regras não obrigatórias porém boas maneiras
de executar as regras.

Alguns exemplos são na forma de definir nomes (variáveis, métodos, objetos, constantes), que defimos
uma forma para cada tipo.

O Visual Basic não faz diferença entre letras maiúsculas e minúsculas para os objetos porém se forem
criados maiúsculo, ela será utilizada maiúscula, não tem como utilizar minúscula.

Na tabela abaixo veremos algumas boas práticas de nomenclatura. Lembrando que não é obrigatório o
uso, apenas boas práticas.

OBJETO FORMA DE UTILIZAR DESCRIÇÃO

Métodos Executar() Em métodos utilizamos uma prática chamado de Pascal Case,


onde podemos utilizar palavras compostas porém a primeira
NomeDoMetodo()
letra de cada palavra será utilizado em maiúscula

Variáveis nome Para variáveis utilizamos uma prática chamado de Camel


Case, onde a sempre inicará com letra minúscula, porém se
minhaVariavel
tiver palavras compostas, a demais palavras terão a primeira
letra maiúscula

Constantes CAMINHO Para as constantes, utilizamos toda a palavra em maiúsculo, e


se tiver palavra compostar, utilizamos underline “_” para
ENDERECO_PADRAO
separar as palavras

Utilizando essas práticas, saberemos identificar cada tipo dentro de um método.

Outra coisa que normalmente não utilizamos, mas o sistema permite é utilização de acentos nos nomes
de métodos, variáveis ou constantes.

O problema na utilização de acentos é que quando for chamar o método, variável ou constante que
contém algum acento, e esquecer de colocar o acento, irá gerar um erro ao executar.
Public Sub BoasPraticas()
' atribuindo valor a uma variável
' sabemos que é uma variável pois iniciou com minusculo
mensagem = "Bom dia turma do VBA"
' chamando um método. Cada palavra inicia com maiúsculo
AbrirArquivo
' aqui temos uma variável (imagem) que recebe o endereço padrão das imagens
' concatenado com o nome do arquivo. O endereço padrão é uma constante
' vemos que o nome está inteiro em maiúsculo
imagem = ENDERECO_IMAGENS & "produto.jpg"

End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 61


VBA para Excel

Modificadores de Acesso

Os modificadores de acesso são utilizados para definir o nível de acesso a uma variável (no nível de
módulo), método ou constante.
Os modificadores são PUBLIC e PRIVATE, que são definidos no ínicio da criação, conforme exemplos
abaixo.

' Variáveis à nível de métodos

' Definindo uma variável publica


Public variavelPublica As String

' Definindo uma variável Privada


Private variavelPrivada As String

' Definindo uma variável com a instrução DIM, que ficará com nível privado
Dim variavelPrivada As String

' Definindo um método público


Public Sub MetodoPublico()
Dim nome As String
nome = InputBox("Digite seu nome")
MsgBox "Olá " & nome & ", você está em um método público"
End Sub

' Definindo um método privado


Private Sub MetodoPrivate()
Dim nome As String
nome = InputBox("Digite seu nome")
MsgBox "Olá " & nome & ", você está em um método privado"
End Sub

Os modificadores Public podem ser acessados de qualquer lugar do projeto, em outros módulos, em
formulários, em códigos de planilhas, já os modificadores Private podem ser acessados somente dentro
da própria escopo.

Pag.: 62 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Vamos analisar o exemplo abaixo:

O módulo do lado esquerdo, temos os métodos com seus respectivos Modificadores, e o ultimo método
não foi definido modificador.
O módulo do lado esquerdo, temos os métodos que irão acessar os métodos do primeiro módulo.
O primeiro método consegue acessar, pois o método MetodoPublico foi definido como Public, portanto
é possível acessar de outro escopo.
O segundo método não conseguirá acesso, será gerado um erro ao tentar executar.

Já o terceiro método também conseguirá o acesso, pois quando não definimos um modificador ao
método, o mesmo será considerado Public.
Agora vamos analisar a seguinte situação.

Fone: 4121-6166 Reprodução Proibida Pag.: 63


VBA para Excel

Nesse cenário, temo 3 métodos no módulo do lado esquerdo, o primeiro e o terceiro são Public e o
segundo é Private, porém o ultimo método chama os 2 primeiros. Como eles estão no mesmo escopo, o
os 3 métodos podem chama-los a sem nenhuma restrição.
No módulo do lado direito, temos um método que chama o método do outro escopo,
AcessandoOutrosMetodos, que é Public, portanto ele pode acessar sem restrição. Mas dentro desse
método, ele chama um método Private.
Nesse caso será que é possível o acesso ao método Private, já que está sendo chamado indiretamente
através de outro escopo?
Sim, é possível chamar o indiretamente um método Private de outro escopo, na verdade os métodos do
tipo Private, normalmente contém alguma regra específica que só pode ser chamada dentro do escopo
que ele foi construído, porém eles estão dentro de algum método Public, que o utiliza para algum
procedimento específico.
Um exemplo, em uma classe de conta bancária, tem uma variável que controla o Saldo. Essa variável
não pode ser acessada diretamente, pois seria uma falha de segurança. Imagina acessar por engado a
variável e alterar o valor do saldo para R$1.000.000,00. Essa variável será Private e será acessada
através de métodos Public como Depositar, Transferir, Sacar e dento desses métodos, após passar por
alguma validação, ela poderá ser alterada.
Seja exemplo abaixo:

Podemos ver que a variável saldo não poderá ser acessada diretamente por outro escopo, mas
indiretamente, através dos métodos Depositar e Sacar, poderá ser modificado, onde passará por uma
validação antes que possa alterar o valor.

Pag.: 64 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Caixas de Diálogo

Uma função é uma instrução que realiza um trabalho significativo (por exemplo, emitir uma informação
ao usuário, pedir uma informação ao usuário ou calcular uma equação) e dar resultado ao programa. O
valor retornado por uma função poderá ser atribuído a uma variável ou pode ser atribuído a uma
propriedade ou outra instrução ou função. As funções do VBA podem possuir um ou mais argumentos
para definir suas atividades. Se uma função utiliza mais de um argumento, os argumentos deverão
aparecer separados por vírgulas, e todo o grupo de argumentos entre parênteses.

As funções mais comuns do VBA são: MsgBox e InputBox. Mais adiante veremos outros tipos de
funções.

Função MsgBox

Exibe uma mensagem em uma caixa de diálogo, aguarda que o usuário clique em um botão e retorna
um Integer que indica qual botão o usuário clicou.

Sintaxe: MsgBox(prompt[, buttons] [, title] [, helpfile, context])

A sintaxe da função MsgBox tem os seguintes argumentos nomeados:


Parte Descrição

Obrigatória. Expressão de sequência de caracteres exibida como mensagem na caixa de diálogo. O


comprimento máximo de prompt é de aproximadamente
prompt 1.024 caracteres, dependendo da largura dos caracteres utilizados. Se prompt consistir em mais de uma linha,
você poderá separar as linhas utilizando um caractere de retorno de carro (Chr(13)) ou vbCr, um caractere de
alimentação de linha (Chr(10)) ou uma combinação de caracteres de retorno de carro e alimentação de linha
(Chr(13) & Chr(10)) entre cada linha.

Opcional. Expressão numérica que é a soma de valores que especifica o número e o tipo de botões a exibir, o
buttons estilo de ícone a utilizar, a identidade do botão padrão e a modalidade da caixa de mensagem. Se omitido, o
valor padrão para buttons é 0.

Fone: 4121-6166 Reprodução Proibida Pag.: 65


VBA para Excel

title Opcional. Expressão de sequência de caracteres exibida na barra de título da caixa de diálogo. Se você omitir
title, o nome do aplicativo será inserido na barra de título.

As definições do argumento buttons são as seguintes:


Constante Valor Descrição

VbOKOnly 0 Exibe somente o botão OK.

VbOKCancel 1 Exibe 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 O primeiro botão é o padrão.

vbDefaultButton2 256 O segundo botão é o padrão.

vbDefaultButton3 512 O terceiro botão é o padrão.

vbDefaultButton4 768 O quarto botão é o padrão.

Janela restrita do aplicativo; o usuário deve responder à caixa de mensagem


vbApplicationModal 0
antes de continuar o trabalho no aplicativo atual.

Janela restrita de sistema; todos os aplicativos são suspensos até que o usuário
vbSystemModal 4096
responda à caixa de mensagem.

vbMsgBoxHelpButton 16384 Adiciona o botão ‘Ajuda’ à caixa de mensagens

VbMsgBoxSetForeground 65536 Especifica a janela da caixa de mensagens como a janela de primeiro plano

vbMsgBoxRight 524288 O texto é alinhado à direita

Especifica que o texto deve aparecer como leitura da direita para a esquerda
vbMsgBoxRtlReading 1048576
em sistemas hebraico e árabe

O primeiro grupo de valores (0 a 5) descreve o número e o tipo de botões exibidos na caixa de diálogo; o
segundo grupo (16, 32, 48, 64) descreve o estilo de ícone; o terceiro grupo
(0, 256, 512) determina qual botão é o padrão e o quarto grupo (0, 4.096) determina a modalidade da
caixa de mensagem. Quando estiver somando números para criar um valor final para o argumento
buttons, utilize somente um número de cada grupo.

Pag.: 66 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Observação Essas constantes são especificadas pelo Visual Basic for Applications. Como resultado, os
nomes podem ser utilizados em qualquer lugar do seu código em vez dos valores reais.

Valores retornados

Constante Valor Descrição

vbOK 1 OK

vbCancel 2 Cancelar

vbAbort 3 Abortar

vbRetry 4 Repetir

vbIgnore 5 Ignorar

vbYes 6 Sim

vbNo 7 Não

Comentários

Se a caixa de diálogo exibir um botão Cancelar, pressionar a tecla ESC terá o mesmo efeito que clicar em
Cancelar.

Exemplo da função MsgBox


Este exemplo utiliza a função MsgBox para exibir uma mensagem de erro crítico em uma caixa de
diálogo com os botões Sim e Não. O botão Não é especificado como a resposta padrão. O valor
retornado pela função MsgBox depende do botão escolhido pelo usuário. Este exemplo supõe que
DEMO.HLP é um arquivo de Ajuda que contém um tópico com um número de contexto da Ajuda igual a
1000.
' Neste exemplo, veremos como usar variáveis para
' preencher os argumentos da função MsgBox.
Sub ExemploMsgbox()
Dim Msg As String, Style As Long, Title As String, _
Help As String, Ctxt As Long, Resp As Long, _
Texto As String

Msg = "Deseja continuar?" ' Define a mensagem.


Style = vbYesNo + vbCritical + vbDefaultButton2 ' Define os botões.
Title = "Demonstração de MsgBox" ' Define o título.

' Exibe a mensagem.


Resp = MsgBox(Msg, Style, Title)
If Resp = vbYes Then ' O usuário escolheu Sim.
Texto = "Sim" ' Executa alguma ação.
Else ' O usuário escolheu Não.
Texto = "Não" ' Executa alguma ação.

Fone: 4121-6166 Reprodução Proibida Pag.: 67


VBA para Excel

End If
MsgBox "Você clicou no botão: " & Texto
End Sub

Função InputBox

Exibe um aviso em uma caixa de diálogo, aguarda até que o usuário insira texto ou clique em um botão
e retorna uma String com o conteúdo da caixa de texto.

Sintaxe: InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

A sintaxe da função InputBox tem os seguintes argumentos nomeados:

Parte Descrição

Obrigatória. Expressão de sequência de caracteres exibida como mensagem na caixa de


diálogo. O comprimento máximo de prompt é de aproximadamente 1.024 caracteres,
dependendo da largura dos caracteres utilizados. Se prompt consistir em mais de uma
Prompt
linha, você poderá separar as linhas utilizando um caractere de retorno de carro (Chr(13)),
um caractere de alimentação de linha (Chr(10)) ou uma combinação de caracteres de
retorno de carro e alimentação de linha (Chr(13) & Chr(10)) entre cada linha.

Opcional. Expressão de sequência de caracteres exibida na barra de título da caixa de


Title
diálogo. Se você omitir title, o nome do aplicativo será inserido na barra de título.

Opcional. Expressão de sequência de caracteres exibida na caixa de texto como resposta


Default padrão se nenhuma entrada for fornecida. Se você omitir default, a caixa de texto será
exibida vazia.

Opcional. Expressão numérica que especifica, em twips, a distância horizontal da borda


esquerda da caixa de diálogo em relação à borda esquerda da tela. Se xpos for omitido, a
Xpos caixa de diálogo será centralizada horizontalmente.

(1twip = 1/20ponto, 1cm = 567twips, 1" = 1.440twips, 15twips = 1pixel)

Opcional. Expressão numérica que especifica, em twips, a distância vertical da borda


Ypos superior da caixa de diálogo em relação ao alto da tela. Se ypos for omitido, a caixa de
diálogo será posicionada verticalmente na terça parte inferior da tela.

Opcional. Expressão de sequência de caracteres que identifica o arquivo de Ajuda a ser


Helpfile
utilizado para fornecer ajuda sensível ao contexto relativa à caixa de diálogo.

Pag.: 68 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Opcional. Expressão numérica que é o número de contexto da Ajuda atribuído ao tópico da


Context
Ajuda apropriado por seu autor.

Comentários

Se o usuário clicar em OK ou pressionar, a função InputBox retornará o que estiver na caixa de texto. Se
o usuário clicar em Cancelar, a função retornará uma sequência de caracteres de comprimento zero ("").

Exemplo da função InputBox


Este exemplo mostra várias maneiras de utilizar a função InputBox para solicitar ao usuário que digite
um valor. Se as posições x e y forem omitidas, a caixa de diálogo será automaticamente centralizada em
relação aos respectivos eixos. A variável MeuValor contém o valor digitado pelo usuário se ele clicar em
OK ou pressionar a tecla ENTER. Se o usuário clicar em Cancel, será retornada uma sequência de
comprimento zero.

Sub ExemploImputBox()
Dim Message As String, Title As String, _
Default As String, MyValue As Byte

Message = "Digite um valor entre 1 e 3" ' Define o aviso.


Title = "Demonstração da CaixaDeEntrada" ' Define o título.
Default = "1" ' Define o padrão.

' Exibe a mensagem, o título e o valor padrão.


MyValue = InputBox(Message, Title, Default)

MsgBox "Você digitou: " & MyValue

' Utiliza o arquivo de Ajuda e o contexto.


' O botão Ajuda é adicionado automaticamente.
MyValue = InputBox(Message, Title, , , , "DEMO.HLP", 10)

MsgBox "Você digitou: " & MyValue

' Exibe a caixa de diálogo na posição 100, 100.


MyValue = InputBox(Message, Title, Padrão, 100, 100)

MsgBox "Você digitou: " & MyValue


End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 69


VBA para Excel

Método InputBox

Exibe uma caixa de diálogo para entrada pelo usuário. Retorna as


informações inseridas na caixa de diálogo.

Sintaxe:
expressão.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)

A sintaxe do Método InputBox tem os seguintes argumentos nomeados:

Parte Descrição

expressão Obrigatória. Uma expressão que retorne um objeto Application.

String obrigatória. A mensagem a ser exibida na caixa de diálogo. Pode ser uma sequência,
Prompt um número, uma data ou um valor Boolean (o Microsoft Excel converte o valor
automaticamente para uma String antes de ele ser exibido).

Variant opcional. O título da caixa de entrada. Se esse argumento for omitido, o título padrão
Title
será "Entrada".

Variant opcional. Especifica um valor que aparecerá na caixa de texto quando a caixa de
Default diálogo for inicialmente exibida. Se esse argumento for omitido, a caixa de texto será
deixada vazia. Esse valor pode ser um objeto Range.

Left Variant opcional. Especifica uma posição x para a caixa de diálogo.

Top Variant opcional. Especifica uma posição y para a caixa de diálogo.

HelpFile Opcional Variant O nome do arquivo de ajuda para essa caixa de entrada.

HelpContextID Opcional Variant O número de identificação do contexto do tópico da Ajuda.

Opcional Variant Especifica o tipo de dados retornado. Se esse argumento for omitido, a
Tipo
caixa de diálogo retornará texto.

Valores válidos para o argumento Type:


Valor Significado

0 Uma fórmula
Você pode usar a soma dos valores
1 Um número
permitidos para Type.
2 Texto (uma sequência)
Por exemplo, para uma caixa de
4 Um valor lógico (True ou False) entrada que possa aceitar tanto texto
como números, defina Type como 1 +
8 Uma referência a células, como um objeto Range
2.
16 Um valor de erro, como #N/D

64 Uma matriz de valores

Pag.: 70 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Comentários: Use InputBox para exibir uma caixa de diálogo simples para 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.
Quando você escolhe o botão OK, InputBox retorna o valor inserido na caixa de diálogo. Quando você
clica no botão Cancelar, InputBox retorna False.

Quando Type é 0, InputBox retorna a fórmula na forma de texto, por exemplo, =2*PI()/360. Se houver
quaisquer referências na fórmula, elas serão retornadas como referências de estilo A1. (Use
ConvertFormula para fazer a conversão entre estilos de referências).

Quando Type é 8, InputBox retorna um objeto Range. Você precisa usar a instrução Set para atribuir o
resultado a um objeto Range, como mostrado no exemplo seguinte.
Set myRange = Application.InputBox(prompt:= "Exemplo", type:= 8)

OBS.: Se você não usar a instrução Set, a variável será definida com o valor no intervalo em vez do
próprio objeto Range.

Se você usar o método InputBox para pedir uma fórmula ao usuário, você terá que usar a propriedade
FormulaLocal para atribuir a fórmula a um objeto Range. A fórmula de entrada deverá estar no idioma
do usuário.

O método InputBox difere da função InputBox em permitir validação seletiva da entrada do usuário, e
em poder ser usada com objetos, valores de erro e fórmulas do Microsoft Excel. Observe que
Application.InputBox chama o método InputBox; InputBox sem qualificador de objeto chama a função
InputBox.

Exemplo do método InputBox


Este exemplo pede um número ao usuário.
Num = Application.InputBox("Digite um número")

Este exemplo usa o argumento Type para assegurar que o valor retornado seja uma referência de célula
válida (um objeto Range).
Sub ExMetodoInputBox()
Dim Intervalo As Range
Worksheets("Plan1").Activate

Set Intervalo = Application.InputBox( _


prompt:="Selecione uma célula" & vbCr & _
"ou um intervalo de células", Type:=8)

MsgBox "Você selecionou o intervalo: " & Intervalo.Address


End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 71


VBA para Excel

Estruturas dos Objetos do MS Excel

O conhecimento da estrutura hierárquica dos objetos do Excel é fundamental para a criação de


procedimentos no VBA.

Objetos do Microsoft Excel

Pag.: 72 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Worksheet

Charts

Fone: 4121-6166 Reprodução Proibida Pag.: 73


VBA para Excel

Shapes

ChartGroups

As linhas de código devem fazer referência ao objeto que será controlado, seguindo o caminho da
hierarquia do mais alto para o mais baixo.

Exemplo:
Carro.PortaEsquerda.Maçaneta.Puxar
Às vezes fica mais fácil ler o código da direita para a esquerda:

Puxar | a Maçaneta | da Porta Esquerda | do Carro.

Pag.: 74 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Hierarquia do objeto Range

De acordo com a hierarquia acima, deveríamos usar a seguinte linha de comando:

Application.Workbooks("ExerciciosVBA") _

.Worksheets("Cadastro").Range("A2:A25").Select

para selecionar o intervalo A2:A25. porém, alguns objetos podem ser omitidos.

Por Exemplo, Application representa o próprio Excel. Estamos executando o código dentro do Excel.
Logo, podemos usar:

Workbooks("ExerciciosVBA") _

.Worksheets("Cadastro").Range("A2:A25").Select

Se o nome da pasta onde o código está sendo executado for ExerciciosVBA, podemos, também omitir
este trecho de código.

Worksheets("Cadastro").Range("A2:A25").Select

Fone: 4121-6166 Reprodução Proibida Pag.: 75


VBA para Excel

Seguindo o raciocínio anterior, se a macro for executada dentro da planilha Cadastro, podemos reduzir
o código à seguinte linha de código:

Range("A2:A25").Select

Vamos analisar o seguinte cenário.

José está em uma sala (Sala A) e deseja utilizar o computador 2 (Comp2). Podermos dizer que:

José usa Comp2

Representando por código

Jose = Comp2

Agora vamos imaginar que José está fora da sala e deseja utilizar o computador 2

Agora diremos que


Pag.: 76 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

José usa o Comp2 da Sala A

Representando por código

Jose = SalaA.Comp2

E no terceiro cenário, José está fora do prédio e deseja utilizar o computador 2

Agora diremos que:

José usa Computador 2 da Sala A do Prédio X

Representando por código

Jose = PredioX.SalaA.Comp2

Na representação acima, quando mais fora do objetivo José está, mais detalhes precisa passar. No caso
dos objetos será a mesma coisa, se deseja alterar um valor na própria planilha que está ativa, não será
necessário utilizar o objeto Worksheet para alterar um intervalo, apenas o objeto Range, agora se existir
mais que uma planilha, e o intervalo alterado não será da planilha ativa, nesse caso é necessário
especificar mais, Worksheets(1).Range(“A2”).Value.

Fone: 4121-6166 Reprodução Proibida Pag.: 77


VBA para Excel

Exemplos
WORKBOOKS
' Utilizando objeto Workbooks
Public Sub PlastaDeTrabalho()
' Workbooks (Objetos que gerencia todas as pastas de trabalho abertas)

' Criando uma nova pasta de trabalho


Workbooks.Add

' Selecionando a nova pasta de trabalho


' Utilizando o objeto Workbooks com índice.
' O índice é pela ordem de abertura.
' A pasta de trabalho principal nesse caso é a 1,
' e a que criamos será o índice 2
Workbooks(2).Activate

' Salvando a nova pasta e trabalho com o objeto


' ActiveWorkbook, que faz referência com a pasta de trabalho ativa
' Comando SaveAs com o caminho onde deseja salvar + o
' nome que deseja para o arquivo
ActiveWorkbook.SaveAs "C:\Curso Excel Com VBA\PlanilhaTeste.xlsx"

' Voltando para a pasta de trabalho principal utilizando o objeto


' ThisWorkbook, que faz referência com a pasta de trabalho que está
' executando o código. A pasta de trabalho principal
ThisWorkbook.Activate

' Utilizando uma variavel com o objeto Workbook.


' Diferente do objeto Workbooks, que gerencia 1 ou
' mais pastas de trabalhos abertas
' o Objeto Workbook faz referência a apenas 1 pasta de trabalho.
Dim pasta As Workbook

' Até o momento o objeto foi criado mas não está pronto para uso pois
' não tem referência com nenhuma pasta de trabalho
' Para referenciá-lo utilizamos o instrutor SET
' Utilizamos o Workbooks com o nome dessa vez no lugar do índice.
' No caso a PlanilhaTeste.xlsx, é a mesma que está no índice 2
Set pasta = Workbooks("PlanilhaTeste.xlsx")

' Atribuindo um valor no intervalo A2 da pasta representada pela variavel


' Como ela não está ativa, faremos uma referência completa
pasta.Worksheets(1).Range("A2") = "Esta é a pasta de trabalho " & _
pasta.Name

' Selecionando a pasta de trabalho


pasta.Activate

' Salvando a pasta e fechando


pasta.Save
pasta.Close

' Salvando seu projeto

Pag.: 78 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

ThisWorkbook.Save
End Sub

O exemplo mostra diversas formas de utilizar objetos que representam a Pasta de Trabalho.

WORKSHEETS
' Utilizando objeto Worksheets
Public Sub Planilhas()
' Objeto Worksheets gerencia todas as planilhas da pasta de trabalho
' atual
' O índice é definido pela ordem das planilhas no arquivo,
' e não pela ordem em que foram criadas
Worksheets(2).Select
Worksheets(3).Select
Worksheets(1).Select

' Utilizando o nome


Worksheets("Plan1").Name = "Painel"
Worksheets("Plan2").Name = "Formulário"
Worksheets("Plan3").Name = "Base de dados"

' Utilizando o objeto Sheets


' Será identico ao objeto Worksheets
' Vamos começar utilizando o índice
Sheets(1).Range("A1").Value = "Painel de controle"
Sheets(2).Range("A1").Value = "Formulário de cadastro"
Sheets(3).Range("A1").Value = "Base de dados"

' Utilizando o nome


Sheets("Formulário").Select
Sheets("Base de dados").Select
Sheets("Painel").Select

' Objeto da planilha ativa


Range("B3").Value = ActiveSheet.Name

' Utilizando variavel


' Assim como no Workbook, iremos utilizar o objeto Worksheet
' O objeto também será criado mas só poderá ser utilizando
' após realizar uma referencia (SET)
Dim planilha As Worksheet

Set planilha = Sheets(2)

planilha.Select

' Utilizando objetos do Excel do projeto


Plan1.Name = "Plan1"
Plan2.Name = "Plan2"
Plan3.Name = "Plan3"
Plan1.Select
End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 79


VBA para Excel

No exemplo acima temos vários objetos para trabalhar com Planilhas

RANGE
' Utilizando Objetos Range
Public Sub Intervalos()
' Objetos Range representam os intervalos de uma planilha

' Selecionando intervalo


Range("A1:D20").Select

' Objeto Selection representa os intervalos selecionados


Selection.Value = "#"

' O Objeto ActiveCell, representa a célula ativa


' Lembrando que célula ativa é diferente de intervalo selecionado
' O intervalo selecionado podem ser varias células,
' a célula ativa é apenas 1, a que, na seleção fica em branco
ActiveCell.Value = "***"

' O objeto Cells é utilizando para representar


' apenas uma célula que informamos o índice
' da linha e da coluna
Cells(15, 6).Value = "Linha 15, coluna 6"

' Utilizando Variável


' Também será necessário referenciar a variavel com algum
' intervalo válido
Dim intervalo As Range

Set intervalo = Range("B5:C15")

' alterando valores da variavel


intervalo.Value = Empty

End Sub

Pag.: 80 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Programando

O gravador de macros é muito útil para a criação de macros. Porém, é limitado. Ou seja, se você precisar
inserir uma condição, uma caixa de mensagem, uma caixa de entrada, fazer um loop etc, terá que inserir
tais comandos manualmente, pois o gravador não é suficiente para criar tais comandos.

Além do que, ao gravar uma determinada macro, cria muitas linhas que podem ser suprimidas sem que
o código perca sua finalidade.

Veja um exemplo: a macro abaixo, gerada pelo gravador, seleciona o intervalo A1:D1 e aplica Negrito,
cor vermelha, tamanho 12 e padrão verde claro.
Sub Formatar()
Range("A1:D1").Select
Selection.Font.ColorIndex = 3
Selection.Font.Bold = True
With Selection.Interior
.ColorIndex = 35
.Pattern = xlSolid
End With
With Selection.Font
.Name = "Arial"
.FontStyle = "Negrito"
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 3
End With
End Sub

Refinando o código, a macro acima, que contem 21 linhas, será reduzida para o código abaixo que
contem 9 linhas.
Sub Formatar1()
Range("A1:D1").Select
Selection.Interior.ColorIndex = 35
With Selection.Font
.FontStyle = "Negrito"
.Size = 12
.ColorIndex = 3
End With

Fone: 4121-6166 Reprodução Proibida Pag.: 81


VBA para Excel

End Sub

Na dúvida, em saber quais linhas poderão ser removidas. Proceda da seguinte forma: usando o
apóstrofo (aspas simples), comente as linhas que você acha que sejam desnecessárias e reexecute o
código. Se algo não der certo, é porque você comentou uma linha importante para o código. Retire o
apóstrofo e comente outra(s) linha(s).

DICA: comente apenas uma linha por vez, assim fica mais fácil identificar onde ocorreu o erro.

Escrevendo códigos
Para exibir a janela do VBA, pressione o atalho ALT+F11. Será exibida a seguinte janela:

Observe que o Excel abre a janela do VBA sem nenhum módulo ativo. Você pode inserir um novo
módulo de três formas:

1. Clique no menu Inserir  Módulo

2. Clique inversamente na janela Project Explorer e selecione a opção Inserir  Módulo.

3. Usando o botão Inserir Módulo na barra de ferramentas

Note, na figura abaixo, o novo módulo que foi inserido dentro da pasta módulos.

Pag.: 82 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Se desejar, você poderá alterar o nome de Módulo1. Para isto, na janela propriedades, altere a
propriedade Name para o nome desejado, lembrando de utilizar boas práticas.

Vamos criar um método com o nome SelecionarCelula, para isto


digite: Public sub SelecionarCelula e pressione a tecla Enter. O Excel
exibirá:

Pressione a tecla TAB uma vez e digite a seguinte linha:


Range("C5").Select

Fone: 4121-6166 Reprodução Proibida Pag.: 83


VBA para Excel

Observe que, ao digitar o ponto o Excel exibe uma lista


suspensa onde você poderá escolher um método
ou uma propriedade do objeto.

DICA: Habitue-se a digitar as linhas de código em minúsculo. Assim, quando o cursor mudar de linha,
algumas letras das palavras chave ficarão maiúscula. Caso isto não ocorra, provavelmente existe algum
erro de sintaxe.

Pressione F5 para executar a macro e veja na planilha, que a célula C2 foi selecionada.

Digamos que, nesta célula, você queira inserir o seu primeiro nome. Neste caso, proceda da seguinte
forma:
Range("C5").Select

Selection.Value = "SeuPrimeiroNome"

Se você usar:
ActiveCell.Value = "SeuPrimeiroNome"

Obterá o mesmo efeito. Pois, Selection e ActiveCell, referem-se à mesma célula. Ou seja, a célula que
contém o foco. Apenas se tiver somente uma célula selecionada, se houvem várias células selecionadas,
todas serão alteradas com o SeuPrimeiroNome

Pag.: 84 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Estruturas

O VBA disponibiliza algumas estruturas que pode utilizar para controlar o decurso da execução da
rotina. Estas estruturas dão ao programador um poder enorme para construir rotinas bastante
complexas e flexíveis.

O que são Estruturas

São instruções, da linguagem, que permitem ao programador, controlar o fluxo do programa e


determinar a quantidade de vezes que um determinado trecho do código será executado.

Podem ser de dois tipos Decisão ou Repetição.

A tabela abaixo ilustra as estruturas disponíveis no VBA.

Estrutura Descrição
Decisão

If - Then - Else Testa uma condição e executa um determinado conjunto de instruções


dependendo do resultado dessa avaliação

Select - Case Seleciona um dos segmentos de código a processar mediante a avaliação


consecutiva de condições.
For – Next Executa uma determinada tarefa um determinado número de vezes.

While - Wend Executa uma determinada tarefa enquanto uma determinada condição
Repetição

permanecer verdadeira. (Obsoleta)

Do – Loop Executa uma determinada tarefa enquanto que a avaliação de uma


condição permaneça Verdadeira ou então até que seja Verdadeira.

For – Each – Next Realiza uma determinada tarefa repetitiva em cada objeto de uma coleção
ou em cada item de uma matriz.

Operadores

Antes de prosseguir no estudo das estruturas, vamos conhecer alguns operadores amplamente
utilizados nas estruturas de decisão operadores Lógicos e Relacionais.

Fone: 4121-6166 Reprodução Proibida Pag.: 85


VBA para Excel

Operadores relacionais

Operador Descrição

Ao ser utilizada uma instrução do tipo If...Then, esta < Menor que
implica na utilização de condições para verificar o estado
<= Menor ou igual a
de uma determinada variável quanto verdadeiro ou falso.
Ou seja, uma condição pode ser verificada como: > Maior que
diferente de; igual a etc. Estas verificações são efetuadas
>= Maior ou igual a
com a utilização de operadores Relacionais, conforme
tabela a seguir: = Igual a

<> Diferente de

Quando o VBA compara duas expressões, ele retorna um de dois valores possíveis, True ou False.

Operadores Lógicos
Pode ser que você necessite, em algum momento, trabalhar com o relacionamento de duas ou mais
condições ao mesmo tempo na mesma instrução If, efetuando desta forma testes múltiplos. Para estes
casos é necessário trabalhar com a utilização dos operadores lógicos, também conhecidos como
operadores booleanos. Veja tabela abaixo:

Operador Função

And Combina duas expressões. Cada expressão deverá ser verdadeira para que toda a
expressão seja verdadeira.

Or Combina duas expressões. Se uma expressão for verdadeira, a expressão toda será
verdadeira.
Not O inverso de uma única expressão.

Xor Combina duas expressões. A expressão toda é considerada verdadeira se as duas


expressões não forem, ambas, verdadeiras ou falsas.

Eqv Combina duas expressões. Ambas as expressões devem ser verdadeiras ou ambas as
expressões devem ser falsas, para toda a expressão ser verdadeira.

Imp Combina duas expressões. A expressão toda é verdadeira exceto quando a primeira
expressão for verdadeira e a segunda expressão for falsa.

Destes operadores, os mais comuns são And, Or e Not.

Pag.: 86 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Estruturas de Decisão

Estruturas de Decisão permitem escrever códigos para responder a diferentes situações dependendo do
resultado do teste de uma condição. A condição pode ser uma comparação ou qualquer expressão que
avalie um valor numérico.

Decisão Simples (If ... Then)

A estrutura IF...Then avalia se uma condição é verdadeira ou falsa e direciona o fluxo do programa de
acordo com o resultado. Esta estrutura pode usar a sintaxe de uma única linha ou múltiplas linhas.

1. Única linha:
If condição Then instrução IF Nota < 5 Then Escreva “Reprovado”

se a condição for verdadeira execute a instrução.

2. Múltiplas linhas:
If condição Then IF Nota < 5 Then

[instruções] Escreva “Reprovado”

End If End If

Note que a versão de uma linha não requer a instrução End If. A versão de múltiplas linhas pode
executar uma ou várias instruções. Em ambos os casos, o princípio essencial envolvido é: “Se condição é
verdadeira então faça...”.

Observação Com a forma de uma linha, é possível ter múltiplas instruções executadas como resultado
de uma decisão If...Then. Todas as instruções devem estar na mesma linha e separadas por dois-pontos,
como na seguinte instrução:

If A > 10 Then A = A + 1 : B = B + A : C = C + B

Fone: 4121-6166 Reprodução Proibida Pag.: 87


VBA para Excel

Uma instrução If em forma de bloco deve ser a primeira em uma linha. As partes Else, ElseIf e End If da
instrução podem ter somente um número de linha ou rótulo de linha precedendo-as. O bloco If deve ser
encerrado com uma instrução End If.
If A > 10 Then
A = A + 1
B = B + A
C = C + B
End If

O exemplo abaixo verifica se a temperatura digitada é maior que 37. Se sim, emite a mensagem: “Você
está com febre” senão, não faz nada.
Sub termometro()
Dim Temp As Integer
Temp = InputBox("Digite uma temperatura", "Termômetro")
If Temp > 37 Then MsgBox "Você está com febre"
End Sub

Na descisão simples não é necessário informar uma instrução caso a condição seja falsa

Instrução múltipla (If...Then...Else)

Um bloco If...Then...Else permite definir dois blocos de código e tem a execução do programa baseada
no resultado de uma condição.
If condição Then

[instruções1]

[Else]

[instruções2]]

End If

No exemplo abaixo, o código testa se uma senha de usuário é valida comparando-a com a senha
correta. Se a senha for válida, o usuário terá acesso permitido. Se a senha for falsa, o usuário verá uma
mensagem indicando que a senha é inválida.
Public Sub ClassificarIdade()

Pag.: 88 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Dim idade As Integer

idade = InputBox("Informe sua idade", "Idade")

If idade >= 18 Then


' Se a idade for maior ou igual a 18
MsgBox "Maior de idade", 0, "Maior"
Else
' Caso contrario, se for menor que 18
MsgBox "Menor de idade", 0, "Menor"
End If

End Sub

Vamos criar o mesmo método como uma Function


Public Function RetornaClassificarIdade(idade As Integer) As String

If idade >= 18 Then


' Se a idade for maior ou igual a 18
RetornaClassificarIdade = "Maior de idade"
Else
' Caso contrario, se for menor que 18
RetornaClassificarIdade = "Menor de idade"
End If

End Function

Em outro exemplo vamos receber um valor “F” ou “M”, e verificar o sexo.


Public Function TipoSexo(sexo As String) As String

If sexo = "m" Then


TipoSexo = "Masculino"
Else
TipoSexo = "Feminino"
End If

End Function

Dessa forma, quando for realizar os testes iremos depara com alguns erros. Primeiro se informarmos um
“M” maiúsculo, ele irá retornar “Feminino”, pois na verificação de texto, o VB é Case Sensitive, ou seja,
faz diferença entre maiúsculas e minúscula. Outra coisa é que, qualquer outro valor que informarmos,
retornará Feminino, e não somente o “F”.

Fone: 4121-6166 Reprodução Proibida Pag.: 89


VBA para Excel

Vamos ver corrigindo.


Public Function TipoSexo(sexo As String) As String

' Método UCase, transforma o valor para maúscula


If UCase(sexo) = "M" Then
TipoSexo = "Masculino"
Else
' Caso não seja um "M", irá analisar
' se é um "F".
If UCase(sexo) = "F" Then
TipoSexo = "Feminino"
Else
TipoSexo = "Inválido"
End If
End If

End Function

Agora vimos que primeiro será analisado se o valor informado é um “M”, caso seja verdadeiro retorna
“Masculino” senão será analisado se o valor é um “F”, caso seja verdadeiro retorna “Feminino”, senão
retorna “Inválido”.

Para resolver o problema entre Maiúscula e Minúscula, utilizamos o método UCase que transforma o
valor da variável em Maiúscula e compara com o “M” ou o “F” também Maiúscula.

Nesse caso serão estruturas aninhadas.

Vamos ver o seguinte cenário.

Iremos receber um salário e iremos retornar a alíquota do Imposto de Renda. Vamos utilizar a tabela
abaixo:

Base de Cálculo (R$) Alíquota (%)

Até 1.903,98 0

De 1.903,99 até 2.826,65 7,5

De 2.826,66 até 3.751,05 15

De 3.751,06 até 4.664,68 22,5

Acima de 4.664,68 27,5

Public Function RetornaIR(salario As Double) As Single

Pag.: 90 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

If salario <= 1903.98 Then


RetornaIR = 0
Else
If salario <= 2826.65 Then
RetornaIR = 0.075
Else
If salario <= 3751.05 Then
RetornaIR = 0.15
Else
If salario <= 4664.68 Then
RetornaIR = 0.225
Else
RetornaIR = 0.275
End If
End If
End If
End If

End Function

Porém podemos realizar outra abordagem

If...Then...ElseIf

Este comando é como o anterior, exceto que ele permite que seu programa escolha mais de duas
alternativas.

Fone: 4121-6166 Reprodução Proibida Pag.: 91


VBA para Excel

If condição1 Then

[instruções1]

[ElseIf condição2 Then Se condição1 for verdadeira então execute as instruções1.


[instruções2]] ... Senão, se condição2 for verdadeira, execute as intruções2 senão
[Else execute as instruções3.
[instruções3]]

End If

Vejamos o Exemplo do Imposto de renda utilizando essa estrutura


Public Function RetornaIR2(salario As Double) As Single

If salario <= 1903.98 Then


RetornaIR2 = 0
ElseIf salario <= 2826.65 Then
RetornaIR2 = 0.075
ElseIf salario <= 3751.05 Then
RetornaIR2 = 0.15
ElseIf salario <= 4664.68 Then
RetornaIR2 = 0.225
Else
RetornaIR2 = 0.275
End If

End Function

Vemos que no próprio Else, tem uma condicional utilizando ElseIf o que torna a estrutura única e não
aninhada, com um único End If.

Pag.: 92 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Desafio 4

1. Crie um método que classifique etariamente um indivíduo em função da sua idade.


A classificação pretendida é a seguinte:
Faixa Etária Classe

Menos de 3 anos Bebe

Dos 3 aos 12 Criança

Dos 13 aos 17 Adolescente

Dos 18 aos 25 Jovem

Dos 26 aos 65 Adulto

Mais de 65 Idoso

2. Desenvolver uma UDF que leia valores de três células, representando os lados de um triângulo.
Verificar se os lados formam realmente um triângulo, e se for esta condição verdadeira, deverá
ser indicado qual tipo de triângulo foi formado: isósceles, escaleno ou equilátero.

Estrutra Multipla (Select Case)

Executa um dos diversos grupos de instruções, dependendo do valor de uma expressão.

Sintaxe
Select Case testexpression

[Case expressionlist-n

[statements-n]] ...

[Case Else

[elsestatements]]

End Select

Fone: 4121-6166 Reprodução Proibida Pag.: 93


VBA para Excel

Comentários

A cláusula Case Else é usada para indicar as elsestatements a serem executadas se não for encontrada
coincidência entre testexpression e uma expressionlist em qualquer das outras seleções Case. Embora
não seja necessário, é uma boa ideia ter uma instrução Case Else no seu bloco Select Case para tratar
valores testexpression não previstos.

Usando como exemplo o cenário do cálculo de alíquota de Imposto de Renda, vamos analisar como
ficaria utilizando Select Case.

Public Function RetornaIR3(salario As Double) As Single

Select Case salario


Case Is <= 1903.98
RetornaIR3 = 0
Case Is <= 2826.65
RetornaIR3 = 0.075
Case Is <= 3751.05
RetornaIR3 = 0.15
Case Is <= 4664.68
RetornaIR3 = 0.225
Case Else
RetornaIR3 = 0.275
End Select

End Function

Na instrução select case, informamos a variável apenas no cabeçalho do bloco, e as sequências são
condições que, caso positivo executa a instrução.

Utilizando instruções Select Case


Utilize a instrução Select Case como uma alternativa a ElseIf nas instruções If...Then...Else ao comparar
uma expressão a diversos valores diferentes. Enquanto as instruções If...Then...Else podem avaliar uma
expressão diferente em cada instrução ElseIf, a instrução Select Case avalia uma expressão somente
uma vez, na parte superior da estrutura de controle.

A seguir vamos imaginar o seguinte cenário. Iremos receber uma idade e classificar conforme tabela
abaixo:

Idade Classe

0 até 5 anos CLASSE A

6, 8 e 10 anos CLASSE B

7 e 9 anos CLASSE C

11 até 19 anos CLASSE D

20 até 30 e 40 até 50 anos CLASSE E

Pag.: 94 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

As demais CLASSE F

Public Function ClasseIF(idade As Integer) As String

If idade >= 0 And idade <= 5 Then


ClasseIF = "CLASSE A"
ElseIf idade = 6 Or idade = 8 Or idade = 10 Then
ClasseIF = "CLASSE B"
ElseIf idade = 7 Or idade = 9 Then
ClasseIF = "CLASSE C"
ElseIf idade >= 11 And idade <= 19 Then
ClasseIF = "CLASSE D"
ElseIf (idade >= 20 And idade <= 30) Or _
(idade >= 40 And idade <= 50) Then
ClasseIF = "CLASSE E"
Else
ClasseIF = "CLASSE F"
End If

End Function

Public Function ClasseCase(idade As Integer) As String

Select Case idade


Case 0 To 5
ClasseCase = "CLASSE A"
Case 6, 8, 10
ClasseCase = "CLASSE B"
Case 7, 9
ClasseCase = "CLASSE C"
Case 11 To 19
ClasseCase = "CLASSE D"
Case 20 To 30, 40 To 50
ClasseCase = "CLASSE E"
Case Else
ClasseCase = "CLASSE F"
End Select

End Function

Comparação entre as estruturas Select Case e If...Then...ElseIf.

Note que a estrutura If é um pouco mais complexa.

Na estrutura If utilizamos os operadores And e Or e também é necessário informar a variável em todas


as condições, já na estrutura Select Case, utilizamos vírgula (,) no lugar do operado Or e To no lugar do
operador And e não é necessário informar a variável, somente no início da intrução.

Fluxograma da Estrutura Select Case para o cálculo do IMC

Fone: 4121-6166 Reprodução Proibida Pag.: 95


VBA para Excel

Algoritmo Cálculo do IMC.

Sub Calcula_IMC()
Dim P As Single, Msg As String
Dim A As Single, IMC As Single
P = InputBox("Digite seu peso em Kg", "Peso")
A = InputBox("Digite sua altura em Metros", "Altura")
IMC = P / A ^ 2
Select Case IMC
Case 0 To 16.99
Msg = "Muito abaixo do peso"
Case 17 To 18.49
Msg = "Abaixo do peso"
Case 18.5 To 24.99
Msg = "Peso normal"
Case 25 To 29.99
Msg = "Acima do peso"
Case 30 To 34.99
Msg = "Obesidade I"
Case 35 To 39.99
Msg = "Obesidade II (Severa)"
Case Is >= 40
Msg = "Obesidade III (Mórbida)"
End Select
MsgBox Msg
End Sub

Pag.: 96 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Exercícios

1. Crie uma função para classificar as médias finais dos alunos seguindo a seguinte tabela:
0 a 4,9 5 A 5,9 6 A 6,9 7 A 7,9 8 A 8,9 9 A 10

F E D C B A

Function Grade(Média As Double) As String


Dim Letra As String
Select Case Média
Case 0 To 4.9
Letra = "F"
Case 5 To 5.9
Letra = "E"
Case 6 To 6.9
Letra = "D"
Case 7 To 7.9
Letra = "C"
Case 8 To 8.9
Letra = "B"
Case 9 To 10
Letra = "A"
Case Else
Letra = ""
End Select
Grade = Letra
End Function

2. Crie um código, que identifique qual botão foi clicado em uma MsgBox. A MsgBox deverá
apresentar os seguintes botões: Anula, Repetir e Ignorar.
Sub Diálogos()
Dim R As Long
R = MsgBox("Clique em um botão", vbAbortRetryIgnore, "Select Case")
Select Case R
Case vbAbort
MsgBox "Você clicou em Anular", vbInformation, "Informação"
Case vbRetry
MsgBox "Você clicou em Repetir", vbInformation, "Informação"
Case vbIgnore
MsgBox "Você clicou em Ignorar", vbInformation, "Informação"
End Select
End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 97


VBA para Excel

Estruturas de Repetição
As estruturas de Repetição permitem que se possa executar determinados trechos do código um
determinado número de vezes.

Para se determinar qual a estrutura de repetição usar, considere duas questões:

1. O número de vezes é conhecido?

2. O loop deve ser executado pelo menos uma vez?

As estruturas de repetição suportadas pelo VBA são:

For ... Next (Para)


A estrutura For ... Next possui uma sintaxe que permite uma definição completa dentro da própria
sintaxe para que ele ele saiba quantas vezes deverá passar pelo loop de instruções.

Sintaxe:
For contador = início To fim [Step passo]

[instruções]
[Exit For]

[instruções]

Next [contador]

A sintaxe da instrução For…Next possui as seguintes partes:


Parte Descrição

Obrigatória. Variável numérica usada como um contador de loops. A variável não pode
Contador
ser um Boolean ou um elemento da matriz.

Inicio Obrigatória. Valor inicial de Contador.

Fim Obrigatória. Valor final de Contador.

Opcional. A quantidade em que Contador é alterado sempre que passa pelo loop. Se Step
Passo
não for especificado, o padrão será um.

Opcional. Uma ou mais instruções entre For e Next que são executadas conforme o
Instruções
número de vezes especificado.

Pag.: 98 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Comentários

O argumento Step pode ser positivo ou negativo. O valor do argumento Step determina o
processamento do loop como a seguir:
Valor do Passo O loop é executado se

Positivo ou 0 Contador <= Fim

Negativo Contador >= Fim

Depois que todas as instruções do loop foram executadas, Passo é adicionado a Contador. Neste ponto,
as instruções do loop são executadas novamente (baseadas no mesmo teste que causou a execução
inicial do loop) ou o loop sai e a execução continua com a instrução seguinte à instrução Next.

Dica A alteração do valor de Contador enquanto dentro de um loop pode dificultar a leitura e
depuração do código.

Qualquer número de instruções Exit For pode ser posicionado em qualquer lugar do loop como meio
alternativo de sair. Muitas vezes, Exit For é usada depois da avaliação de alguma condição, por exemplo,
If...Then, e transfere o controle para a instrução imediatamente seguinte a Next.

Você pode aninhar loops For...Next posicionando um dentro do outro. Dê um nome de variável
exclusivo como seu Contador a cada loop. A construção a seguir é correta:
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
...
Next k
Next j
Next i

Observação Se você omitir Contador em uma instrução Next, a execução continua como se Contador
estivesse incluído. Se uma instrução Next for encontrada antes de sua instrução For correspondente,
ocorrerá um erro.

Exemplo da instrução For...Next

Este exemplo usa a instrução For...Next será exibido uma mensagem com o valor do contador por 10
vezes.
Public Sub ExmploForNext1()
Dim cont As Integer

For cont = 1 To 5 Step 1 ' Configure 5 repetições.


MsgBox "Contador = " & cont
Next cont
End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 99


VBA para Excel

Resultados

...

Poderiamos utilizar um exemplo mais simplificado da estrutura For ... Next.

Public Sub ExmploForNext1()


Dim cont As Integer

For cont = 1 To 5 ' Configure 5 repetições.


MsgBox "Contador = " & cont
Next
End Sub

Nesse exemplo, identico ao anterior, removemo a instrução Step e a variável cont que vinha após a
instrução Next, pois como iremos incrementar de 1 em 1, não é necessário o Step pois esse é o valor
padrão dele, e também não é necessário informar a variável após o Next pois a estrutura já sabe qual
variável irá incrementar.

Cuidado: Tenha a certeza de estar definindo corretamente os itens: Início, Fim e Passo. Caso contrário,
você gerará um Ciclo Infinito, ou seja, seu código nunca terminará.

While ... Wend (Enquanto)

A estrutura While-Wend tem um funcionamento similar ao For-Next. Realiza um looping um


determinado número de vezes, até que uma determinada condição seja verdadeira. Ou seja, executa
uma série de instruções desde que uma determinada condição seja True.

Sintaxe
While condition

[statements]

Wend

A sintaxe da instrução While...Wend possui as seguintes partes:

Pag.: 100 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Parte Descrição

condition Obrigatória. Expressão numérica ou expressão de sequência que avalia como True ou
False. Se condition for Null, ela será tratada como False.

statements Opcional. Uma ou mais instruções executadas enquanto a condição for True.

Comentários

Se condition for True, todas as statements serão executadas até que a instrução Wend seja encontrada.
Então o controle retorna para a instrução While e condition é novamente verificada. Se condition ainda
for True, o processo é repetido. Se não for True, a execução continua com a instrução seguinte à
instrução Wend.

Os loops While...Wend podem ser aninhados a qualquer nível. Cada Wend corresponde ao mais recente
While.

Exemplo da instrução While ... Wend

Vamos utilizar o mesmo exemplo da estrutura For para instrução While...Wend para incrementar uma
variável do contador. As instruções no loop são executadas desde que a condição avalie como True.

Public Sub ExemploWhileWend()


Dim cont As Integer

' Adicionando valor ao contador


cont = 1

While cont <= 5


MsgBox "Contador = " & cont

' Incrementando a varial cont


cont = cont + 1
Wend
End Sub

Como vimos no exemplo acima, antes de entrar na estrutura da instrução While, precisamos adicionar
um valor para a variável, pois no bloco, diferente da instrução For, não é possível iniciar um valor para
ela.

Outra coisa importante é que a instrução também não tem um incremento da variável na estrutura,
igual a instrução Step da instrução For, por isso é necessário adicionar um incremento da variável no
statements para que a variável entre na condition com um valor diferente e não entre em um loop
infinito.

Fone: 4121-6166 Reprodução Proibida Pag.: 101


VBA para Excel

DO
A instrução While já está obsoleta, mas ainda mantém por compatibilidade de aplicações mais antigas,
no lugar temos as instruções “DO” que contém 4 sintaxes de instruções para utilizarmos

Do While ... Loop (Fazer Enquanto)


Igual a instrução While, executa instruções enquanto a condição for Verdadeira
Public Sub ExemploDoWhileLoop()
Dim cont As Integer

' Adicionando valor ao contador


cont = 1

Do While cont <= 5


MsgBox "Contador = " & cont

' Incrementando a varial cont


cont = cont + 1
Loop
End Sub

Do Until ... Loop (Fazer Até)


Bem parecido com a instrução Do While, porém ele executa a instrução até que a condição se torne
Verdadeira.
Public Sub ExemploDoUntilLoop()
Dim cont As Integer

' Adicionando valor ao contador


cont = 1

Do Until cont > 5


MsgBox "Contador = " & cont

' Incrementando a varial cont


cont = cont + 1
Loop
End Sub

Podemos ver que nesse exemplo, a condição muda, enquanto na While a condição será “cont <= 5”, ou
seja, enquanto o contador for menor ou igual a 5, na instrução Until a condição será “cont > 5”, até que
o contador seja maior que 5.

Pag.: 102 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Do ... Loop While (Fazer ... Ciclo Enquanto)


Já na instrução Do ... Loop While, a condição é analisada somente no final do bloco, portanto o processo
passará, pelo menos, uma vez no statement.
Public Sub ExemploDoLoopWhile()
Dim cont As Integer

' Adicionando valor ao contador


cont = 1

Do
MsgBox "Contador = " & cont

' Incrementando a varial cont


cont = cont + 1
Loop While cont <= 5

End Sub
Esse exemplo vemos que o statement será executado pelo menos uma vez, pois mesmo que o contador
iniciasse com o valor 10, ele só iria analisar a condição no final do bloco.

Do ... Loop Until (Fazer ... Ciclo Até)


Na instrução Do ... Loop Until, também analisa a condição no final do bloco, porém ele continua
repetindo as instruções até que a condição se torne Vedadeira.

Public Sub ExemploDoLoopUntil()


Dim cont As Integer

' Adicionando valor ao contador


cont = 1

Do
MsgBox "Contador = " & cont

' Incrementando a varial cont


cont = cont + 1
Loop Until cont > 5

End Sub

Vejamos um exemplo de utilização do Do While ... Loop e do Do ... Loop While, para vermos quando
seria mais vantagem utilizar um ou outro.

Fone: 4121-6166 Reprodução Proibida Pag.: 103


VBA para Excel

Utilizando Do While ... Loop


Public Sub AdivinharNomeDoWhileLoop()
Dim nome As String

nome = InputBox("Adivinhe o nome", 0, "Nome")

Do While UCase(nome) <> "MARIA"


nome = InputBox("Adivinhe o nome", 0, "Nome")
Loop

MsgBox "Acertou, parabéns!!!", 0, "Acertou"


End Sub

Utilizando Do ... Loop While


Public Sub AdivinharNomeDoWhileLoop()
Dim nome As String

Do
nome = InputBox("Adivinhe o nome", 0, "Nome")
Loop While UCase(nome) <> "MARIA"

MsgBox "Acertou, parabéns!!!", 0, "Acertou"


End Sub

Vemos que no primeiro exemplo, será incrementado um valor a variável nome antes de entrar no bloco
para que ele já consiga uma avaliação na primeira condição, e depois essa mesma instrução será
repetida dentro do bloco.

Já no segundo exemplo não será necessário incrementar um valor para a variável nome antes do bloco,
pois a avaliação da condição será somente no final do bloco.

Observação Para interromper um loop contínuo, pressione ESC ou CTRL+BREAK.

Resumindo

Qando utilizo cada uma das instruções? No poderemos utilizar qualquer uma das instruções, mas
quando a condição é numérica, a melhor instrução seria a For ... Next, pois sua sintaxe já permite iniciar
um valor para a variável e incrementar a variável, nas demais inscruções será necessário iniciar a
variável antes e será necessário um incremento da variável que será utilizada na condição.

Já quema a condição não é relacionado a número, como os exemplos acima que utiliza uma variável
nome, não tem como utilizar a instrução For ... Next, e como a instrução While ... Wend já está
obsoleta, podemos utilizar qualquer instrução Do, sendo que, se for necessário passar pelo menos uma
vez dentro do statement, utilizamos o Do ... Loop While ou Until, senão utilizamos Do While ou Until ...
Loop.

Pag.: 104 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

For Each ... Next (Para cada)

Repete um grupo de instruções para cada elemento em uma matriz ou coleção.

A instrução For Each ... Next, é diferente das demais instruções pois trabalha com loop utilizando
alguma coleção, vamos ver a figura abaixo.

Na imagem acima temos uma coleção de Personagens, um Ator e um Teatro. A Coleção deve ser algo
que o ator possa interpretar, nesse caso são personalidade e profissões de pessoas e o ator é uma
pessoa, por isso é possível interpretar, se a coleção fossem lugare, por exemplo, não seria possível o
ator interpretar, por exemplo o ator não tem como interpretar, São Paulo, pois é um lugar. O Teatro
seria o local onde o ator irá interpretar.

Passando isso para a instrução For Each, a coleção de Personagens, seriam a coleção que iria percorrer
no loop, o ator, o elemento que irá receber todas as características de cada um dos itens da coleção, e o
teatro o local onde será executado (Statements).

Sintaxe
For Each element In group

[statements]

[Exit For]

[statements]

Next [element]

A sintaxe da instrução For ... Each ... Next possui as seguintes partes:

Fone: 4121-6166 Reprodução Proibida Pag.: 105


VBA para Excel

Parte Descrição

Element Obrigatória. Variável usada para iterar através dos elementos da coleção ou matriz.
Para coleções, element pode ser somente uma variável Variant, uma variável de objeto
genérica ou qualquer variável de objeto específica. Para matrizes, element somente
pode ser uma variável Variant.

Group Obrigatória. Nome de uma coleção ou matriz de objetos (exceto uma matriz de tipos
definidos pelo usuário).

Statements Opcional. Uma ou mais instruções que são executadas em cada item de group.

Observação Você não pode usar a instrução For ... Each ... Next com uma matriz de tipos definidos
pelo usuário porque uma Variant não pode conter um tipo definido pelo usuário.

Exemplo da instrução For Each...Next

Este exemplo usa a instrução For Each...Next vamos alterar o nome das planilhas de uma pasta de
trabalho.

Vamos criar uma pasta de trabalho com 12 planilhas.

Segue método.

Public Sub RenomearPlanilhas()


Dim planilha As Worksheet
Dim mes As Integer

' planilha é o elemento e Worksheets a coleção


For Each planilha In Worksheets
' variavel para representar cada mês
mes = mes + 1

' renomeando a planilha


planilha.Name = StrConv(MonthName(mes), vbProperCase)
Next

End Sub

No exemplo acima, foi criado uma variável do tipo Worksheet, pois eles irá receber itens da coleção
Worksheets. Foi criado uma variável “mes” apenas para utilização do exemplo, ela não tem impacto na
instrução For Each em si.

Vimos que não é necessário informar o final do loop, pois essa instrução já sabe que deve percorrer
todos os itens da coleção, não importa quantos tenham.

Vamos ver outros exemplos abaixo

Pag.: 106 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

O exemplo abaixo, oculta todas as planilhas O exemplo abaixo, reexibe todas as planilhas
exceto a de nome Maio. ocultas.
Sub OcultarPlanilhas() Sub ReexibirPlanilhas()
Dim P As Worksheet Dim P As Worksheet
For Each P In Worksheets For Each P In Worksheets
If P.Name <> "Maio" Then P.Visible = xlSheetVisible
P.Visible = xlSheetHidden Next
End If End Sub
Next
End Sub

O exemplo abaixo protege todas as planilhas da O exemplo abaixo desprotege todas as planilhas
pasta com a senha: 123. protegidas anteriormente.
Sub ProtegerPlanilhas() Sub DesprotegerPlanilhas()
Dim P As Worksheet Dim P As Worksheet
For Each P In Worksheets For Each P In Worksheets
P.Protect "123" P.Unprotect "123"
Next Next
End Sub End Sub

Vamos criar uma função parecida com a CONT.SE do Excel

Public Function MeuContSe(intervalo As Range, valor As Variant) As Long


Dim temp As Range
Dim cont As Long

For Each temp In intervalo


If UCase(temp.Value) = UCase(valor) Then
cont = cont + 1
End If
Next

MeuContSe = cont

End Function

Para testar vamos criar uma tabela com alguns nomes e chamar nossa função passando algum dos
nomes com parâmetro, igual ao exemplo abaixo.

Fone: 4121-6166 Reprodução Proibida Pag.: 107


VBA para Excel

O resultado ficará conforme abaixo.

Pag.: 108 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Variáveis Indexadas

Variáveis arrays (Vetor)


As Matrizes Array (Vetor) são declarados da mesma maneira que as outras variáveis, utilizando
instruções Dim, Static, Private ou Public. A diferença entre as variáveis escalares (que não são matrizes)
e variáveis de matriz é que geralmente você deve especificar o tamanho da matriz. Uma matriz cujo
tamanho é especificado é uma matriz de tamanho fixo. Uma matriz cujo tamanho pode ser alterado
durante a execução de um programa é uma matriz dinâmica.

A indexação de uma matriz a partir de 0 ou 1 depende da definição da instrução Option Base. Se Option
Base 1 não for especificada, todos os índices de matriz iniciarão em zero.

OBS.: O uso da instrução Option Base em seus projetos pode acarretar problemas de portabilidade.
Pois, na maioria das linguagens, o índice inicia-se em 0 (zero). Porém utilizando no Excel, é
recomendado utilizar Option Base 1, pois as matrizes das funções do Excel inical com 1

O que é uma Matriz (Array)?


O Array é uma estrutura padrão para armazenar dados em qualquer linguagem de programação.
Enquanto variáveis individuais podem conter entidades isoladas, como um número, uma data ou um
texto, os arrays, podem conter conjuntos de dados relacionados. Estes conjuntos devem ser do mesmo
tipo (Homogêneos). Um array possui um nome, assim como uma variável, e os valores armazenados
nele podem ser acessados por meio de um índice.

Suponha que você use uma variável denominada salário para armazenar um valor do salário de um
funcionário.
Salário = 8350

E se você quisesse armazenar 25 salários, um para cada funcionário? Você poderia declarar 25 variáveis:
salario1, salario2, até salário25, ou poderia declarar um array com 25 elementos.
Dim Salário(25) As Currency

Fone: 4121-6166 Reprodução Proibida Pag.: 109


VBA para Excel

Declarando uma matriz fixa unidimensional

Na linha de código a seguir, uma matriz de tamanho fixo é declarada como uma matriz String com 5
colunas. Este tipo de matriz é, comumente chamado de Vetor.
Dim Nome(4) As String

Repare, na figura acima, os nomes e seus respectivos índices.

Observe que, embora a declaração tenha sido Nome(4), foram declarados 5 nomes, onde o primeiro
possui índice 0 e o último possui índice 4. Ou seja, (0, 1, 2, 3, 4).

Exemplos:
MsgBox Nome(3) ‘exibe o nome cujo índice é o número 3, ou seja: Daniele.

MsgBox Nome(0) ‘exibe o nome cujo índice é o número 0, ou seja: Maria.

Comparando variáveis escalares com variáveis Array.


' Método com variáves escalares
Public Sub Escalares()
Dim nome1 As String
Dim nome2 As String
Dim nome3 As String
Dim nome4 As String
Dim nome5 As String

nome1 = InputBox("Informe o 1o nome")


nome2 = InputBox("Informe o 2o nome")
nome3 = InputBox("Informe o 3o nome")
nome4 = InputBox("Informe o 4o nome")
nome5 = InputBox("Informe o 5o nome")

MsgBox "O 3o nome é " & nome3


End Sub

' Método com variáves array


Public Sub ComArray()
Dim nomes(4) As String

nome(0) = InputBox("Informe o 1o nome")


nome(1) = InputBox("Informe o 2o nome")
nome(2) = InputBox("Informe o 3o nome")
nome(3) = InputBox("Informe o 4o nome")
nome(4) = InputBox("Informe o 5o nome")

MsgBox "O 3o nome é " & nome(2)

End Sub

Pag.: 110 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Utilizando Option Base com índice 1


' Método com variáves array com Option Base 1
Public Sub ComArrayOptionBase1()
Dim nomes(1 To 5) As String
Dim i As Integer ' Índice

For i = 1 To 5
nome(i) = InputBox("Informe o " & i & "o nome")
Next

MsgBox "O 3o nome é " & nome(3)

End Sub

Agora vimos a verdadeira utilidade de variáveis de Matriz (Array), pois diverente das variáveis escalares,
nos podemos utilizar a mesma variável em uma estrutura de repetição e armazenar vários valores.
Nesse exemplo acima utilizamos uma condição FOR ... NEXT para receber os valores da variável, ao
invés de criarmos 5 linhas de código, 1 para cada variável, criamos 3 linhas contando com a condição
For. Se necessitarmos de mais armezamento, não precisamos adicionar mais nenhuma linha de código,
apenas alterar o tamanho da Matriz e o índice final da condição For.

' Método com variáves array Carregando uma planilha


Public Sub ComArrayParaPlanilha()
Dim nomes(1 To 5) As String
Dim i As Integer ' Índice

For i = 1 To 5
nome(i) = InputBox("Informe o " & i & "o nome")
Next

For i = 1 To 5
Range("A" & i) = nome(i)
Next

End Sub

Nesse exemplo, além do loop para alimentar a variável Matriz, também utilizamos outro loop para
enviar da Matriz para uma planilha.

Fone: 4121-6166 Reprodução Proibida Pag.: 111


VBA para Excel

Matriz
Declarando uma matriz fixa Multidimensional
Na linha de código a seguir, uma matriz de tamanho fixo é declarada como uma matriz Integer com 10
linhas e 10 colunas:
Dim Matriz1(Linhas, Colunas) As Tipo

Dim Matriz1(9, 9) As Integer

O primeiro argumento representa as linhas; o segundo


argumento representa as colunas.

Como ocorre com qualquer outra declaração de variável, a menos que você especifique um tipo de
dados para a matriz, o tipo de dados dos elementos em uma matriz declarada é Variant. Cada elemento
numérico Variant da matriz utiliza 16 bytes. Cada elemento Variant de sequência de caracteres utiliza
22 bytes. Para criar código o mais compacto possível, declare explicitamente as suas matrizes como um
tipo de dados diferente de Variant.

Exemplos:
MsgBox MeuArray(6, 0) ‘Exibe o número 973.

MsgBox MeuArray(5, 5) ‘Exibe o número 289.

As linhas de código a seguir comparam o tamanho de diversas matrizes:


' Matriz Integer utiliza 22 bytes (11 elementos * 2 bytes).
Dim MyIntegerArray(10) As Integer

' Matriz de dupla precisão utiliza 88 bytes (11 elementos * 8 bytes).


Dim MyDoubleArray (10) As Double
' Matriz Variant utiliza pelo menos 176 bytes (11 elementos * 16 bytes).
Dim MyVariantArray (10)

' Matriz Integer utiliza 100 * 100 * 2 bytes (20.000 bytes).


Dim MyIntegerArray (99, 99) As Integer

' Matriz de dupla precisão utiliza 100 * 100 * 8 bytes (80.000 bytes).
ReDim MyDoubleArray (99, 99) As Double

' Matriz Variant utiliza pelo menos 160.000 bytes (100 * 100 * 16 bytes).
Dim MyVariantArray (99, 99)

O tamanho máximo de uma matriz varia com base no seu sistema operacional e na quantidade de
memória disponível. A utilização de uma matriz que exceda a quantidade de RAM disponível no seu
sistema é mais lenta porque os dados devem ser lidos e gravados no disco.

Pag.: 112 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Declarando uma matriz dinâmica

Ao declarar uma matriz dinâmica, você pode dimensionar a matriz durante a execução do código. Utilize
uma instrução Static, Dim, Private ou Public para declarar uma matriz, deixando vazios os parênteses,
como mostra o exemplo a seguir.
Dim sngArray() As Single

Observação Você pode utilizar a instrução ReDim para declarar uma matriz implicitamente dentro de
um procedimento. Tome cuidado para não digitar errado o nome da matriz quando utilizar a instrução
ReDim. Mesmo que haja uma instrução Option Explicit incluída no módulo, será criada uma segunda
matriz.

Em um procedimento dentro do escopo da matriz, utilize a instrução ReDim para alterar o número de
dimensões, definir o número de elementos e definir os limites superior e inferior de cada dimensão.
Você pode utilizar a instrução ReDim para alterar a matriz dinâmica com a frequência necessária. No
entanto, todas as vezes que você tomar essa providência, os valores existentes na matriz serão
perdidos. Utilize ReDim Preserve para expandir uma matriz enquanto preserva os valores existentes na
matriz. Por exemplo, a instrução a seguir acrescenta 10 elementos à matriz varArray sem perder os
valores atuais dos elementos originais.
ReDim Preserve varArray(UBound(varArray) + 10)

Vamos ver um exemplo de matriz utilizando loop aninhado

' Criando uma tabuada do 1 ao 10


Public Sub TabuadaCompleta()
Dim tabuada(1 To 10, 1 To 10) As String
Dim operacao As String
Dim resultado As Integer
Dim lin As Integer
Dim col As Integer

For lin = 1 To 10
For col = 1 To 10
operacao = lin & "x" & col & "=" ' ex. 3x5=
resultado = lin * col ' ex. 15
tabuada(lin, col) = operacao & resultado ' ex. 3x5=15
Next
Next

Fone: 4121-6166 Reprodução Proibida Pag.: 113


VBA para Excel

For lin = 1 To 10
For col = 1 To 10
Cells(lin, col) = tabuada(lin, col)
' No comando acima, a tabuada será criada na horizontal
' para inverter para vertival, utilizamos conforme abaixo
' Cells(col, lin) = tabuada(lin, col)
Next
Next

End Sub

Observação Quando utilizar a palavra-chave Preserve com uma matriz dinâmica, você pode alterar
somente o limite superior da última dimensão, mas não pode alterar o número de dimensões.

Resumo
Vetor (array uni-dimensional) é uma variável que armazena várias variáveis do mesmo tipo.

Matriz (array multi-dimensional) é um vetor de vetores. Nele temos linhas e coluna, sendo que primeiro
informamos a linha e depois a coluna.

Pag.: 114 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Funções
O VBA disponibiliza diversas funções para uso em seus códigos. Elas estão distribuídas em categorias,
tais como:

• Cálculos matemáticos
• Conversão
• Datas e horas
• Diretórios e arquivos
• Entrada e saída
• Erros
• Finanças
• Manipulação de sequência de caracteres
• Matrizes
• Miscelânea
• Operadores

Funções matemáticas

Função Descrição

Abs Retorna o valor absoluto de um número. Abs(-5) é igual a 5.


Atn Retorna o arco tangente de um número.
Cos Retorna o co-seno de um ângulo. Cos(0) é igual a 1.
Retorna e (base dos logaritmos naturais) elevado a potência de um número.
Exp
A função Exp complementa a ação da função Log e às vezes é chamada de antilogaritmo.
Retorna a parte inteira de um número. Fix(99,2) ' Retorna 99
Fix
Fix(-99,8) ' Retorna –99 Fix(-99,2) ' Retorna -99
Retorna a parte inteira de um número. Int(99,8) ' Retorna 99
Int
Int(-99,8) ' Retorna –100 Int(-99,2) ' Retorna -100
Log Retorna o logaritmo natural de um número, que é o logaritmo na base e (2,718282)
Retorna um número aleatório entre 0 e 1.
Rnd Para produzir números inteiros aleatórios em um dado intervalo, utilize esta fórmula:
Int((limitesuperior - limiteinferior + 1) * Rnd + limiteinferior)
Sgn Retorna o sinal de um número. Sgn(5) = 1; Sgn(-7) = -1; Sgn(0) = 0.
Retorna o Seno de um ângulo. O ângulo deve estar em radianos. 0, /2, 3/2, 2
Sin Para converter graus em radianos, multiplique graus por pi/180. Para converter radianos em
graus, multiplique radianos por 180/pi.
Sqr Retorna a raiz quadrada de um número.
Tan Retorna a tangente de um ângulo.

Fone: 4121-6166 Reprodução Proibida Pag.: 115


VBA para Excel

Pag.: 116 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Funções matemáticas derivadas


A lista abaixo é uma lista de funções matemáticas não intrínsecas que podem ser derivadas a partir das
funções matemáticas intrínsecas:
Função Equivalentes derivadas

Secante Sec(X) = 1 / Cos(X)


Co-secante Cosec(X) = 1 / Sin(X)
Co-tangente Cotan(X) = 1 / Tan(X)
Seno inverso Arcsin(X) = Atn(X / Sqr(-X * X + 1))
Co-seno inverso Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
Secante inversa Arcsec(X) = Atn(X / Sqr(X * X – 1)) + Sgn((X) – 1) * (2 * Atn(1))
Co-secante inversa Arccosec(X) = Atn(X / Sqr(X * X – 1)) + (Sgn(X) – 1) * (2 * Atn(1))
Co-tangente inversa Arccotan(X) = Atn(X) + 2 * Atn(1)
Seno hiperbólico Sinh(X) = (Exp(X) – Exp(-X)) / 2
Co-seno hiperbólico Cosh(X) = (Exp(X) + Exp(-X)) / 2
Tangente hiperbólica Tanh(X) = (Exp(X) – Exp(-X)) / (Exp(X) + Exp(-X))
Secante hiperbólica Sech(X) = 2 / (Exp(X) + Exp(-X))
Co-secante hiperbólica Cosech(X) = 2 / (Exp(X) – Exp(-X))
Co-tangente hiperbólica Cotanh(X) = (Exp(X) + Exp(-X)) / (Exp(X) – Exp(-X))
Seno hiperbólico inverso Arcsinh(X) = Log(X + Sqr(X * X + 1))
Co-seno hiperbólico inverso Arccosh(X) = Log(X + Sqr(X * X – 1))
Tangente hiperbólica inversa Arctanh(X) = Log((1 + X) / (1 – X)) / 2
Secante hiperbólica inversa Arcsech(X) = Log((Sqr(-X * X + 1) + 1) / X)
Co-secante hiperbólica inversa Arccosech(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)
Co-tangente hiperbólica inversa Arccotanh(X) = Log((X + 1) / (X – 1)) / 2
Logaritmo de base N Logn(X) = Log(X) / Log(N)

Fone: 4121-6166 Reprodução Proibida Pag.: 117


VBA para Excel

Funções Financeiras
As funções desta categoria são utilizadas para cálculos financeiros.

Lista dos argumentos das funções financeiras:

fv: é o valor futuro. Se você aplicar R$ 250,00 por mês e resgatar R$ R$ 3.000,00 no final do
investimento, o valor futuro será 3000.

Nper: é o número total de períodos. Ex: 36 meses.

pmt: é o pagamento por período (valor da parcela) Ex: -250.

pv: é o valor presente. Quando você aplicar R$ 250,00 e resgatar 500, 250 é o valor atual.

rate: é a taxa de juros por período.

type: é o tipo de pagamento 0 ou omitido (final do período) ou 1 (início do período).


Função Descrição

Retorna o valor futuro de uma anuidade com base em depósitos fixos periódicos e uma taxa de juros
FV
fixa. FV(rate, nper, -pmt[, -pv][, tipo])

Retorna o número de períodos para uma anuidade com base em pagamentos fixos e periódicos e uma
NPer
taxa de juros fixa. Nper(rate, -pmt, pv[, fv][, tipo])

Retorna o quanto deve ser pago a cada período com base em pagamentos fixos, periódicos e uma taxa
Pmt
de juros fixa. Pmt(rate, nper, -pv[, fv][, tipo])

Retorna o valor atual de uma anuidade com base em pagamentos fixos periódicos a serem pagos no
PV
futuro e taxas de juros fixas. PV(rate, nper, -pmt [, fv][, tipo)

Retorna a taxa de juros por período. Quando você financiar um veículo a uma taxa de 1,5% ao mês
Rate Rate(nper, -pmt, pv[, fv][, tipo][, guess])

guess especifica uma estimativa, se omitido é assumido 10%.

Pag.: 118 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Funções de Data e Hora

São utilizadas na manipulação de datas e horas.

Uma data é tratada pelo VBA como sendo um número inteiro, sendo a data 30/12/1899 representada
pelo número 0. Números menores que zero representam datas inferiores a 30/12/1899. Sendo assim, -1
representa a data de 29/12/1899 e assim regressivamente até a data de 01/01/100 (-657.434). As datas
posteriores a 30/12/1899 são representadas por números inteiros positivos, de 31/12/1899 (1) até a
maior data que é 31/12/9999 (2.958.465). Por ser um número inteiro, a diferença entre duas datas é
equivalente ao número de dias existentes entre as duas datas.
' Este exemplo mostra algumas datas entre os anos 100 e 3000.
Sub MostraDatas()
Dim J As Long

For J = 100 To 3000 Step 100


MsgBox CLng(DateValue("01/01/" & J)) & _
" - " & DateValue("01/01/" & J)
Next J

End Sub

00:00:00 0
As horas são representadas por números fracionários entre 0 e 1. Ou 01:00:00 0,041666667
seja, uma hora é representada por 1/24 avos do dia,
conforme tabela ao lado. 12:00:00 0,5

23:59:59 0,999988425

Para as funções abaixo, adote Data e Hora do sistema como sendo:


21/01/2004 11:59:25.
Função Descrição

Retorna a data do sistema.


Date
Range("A1") = Date A1 conterá a data do sistema, ou seja, 21/01/2004.
Retorna um inteiro entre 1 e 31
Day
Range("A2") = Day(Date) A2 conterá o número 21.
Retorna um inteiro entre 1 e 12.
Month
Range("A3") = Month(Date) A3 conterá o número 1.
Retorna um numero representando o ano de uma determinada data.
Year
Range("A4") = Year(Date) A4 conterá o número 2004.
Retorna a date e o Horário do sistema.
Now
Range("A5") = Now A5 conterá: 21/01/2004 11:59:25

Fone: 4121-6166 Reprodução Proibida Pag.: 119


VBA para Excel

Função Descrição

Retorna a data composta a partir do ano, mês e dia fornecido.


DateSerial Sintaxe: DateSerial(year, month, day)

Range("A6") = DateSerial(2000, 06, 25) A6 conterá a data: 25/06/2000


Converte uma data que esteja na forma de texto para a forma Date.
DateValue
Range("A7") = DateValue(dia & "/" & mês & "/" & ano)
mês pode ser número ou texto.
Retorna um número entre 1 e 7 representando o dia da semana de uma data.

Sintaxe: WeekDay(date[,firstdayofweek])
WeekDay
Se FirstDayOfWeek não for especificado o VBA assume 1 (Domingo).

Range("A8") = WeekDay(Date) A8 conterá o número 4.

Retorna o nome do dia da semana.

Sintaxe: WeekdayName(weekday, [abbreviate], [firstdayofweek])

weekDay é o número do dia da semana cujo nome você deseja obter.


WeekdayName abbreviate se True retorna qua, se False (omitido) retorna quarta-feira.

firstdayofweek representa o primeiro dia da semana 1 (omitido) para dom.

Range("A9") = WeekdayName(Weekday(Date), False, vbSunday)


A9 conterá: quarta-feira

Retorna o nome do mês.


MonthName Sintaxe: MonthName(month, [abbreviate])

Range("A10") = MonthName(Month(Date), False) retorna: janeiro


Retorna a Hora do sistema.
Time
Range("A11") = Time A11 conterá: 11:59:25
Retorna a Hora em segundos.
Timer
Range("A12") = Timer A12 conterá: 47.481,6 se a hora for: 13:11:21
Retorna um número entre 0 e 23 representando as horas.
Hour
Range("A13") = Hour(Time) A13 conterá: 11
Retorna um número entre 0 e 59 representando os minutos.
Minute
Range("A14") = Minute(Time) A14 conterá: 59
Retorna um número entre 0 e 59 representando os segundos.
Second
Range("A15") = Second(Time) A15 conterá: 25
Retorna um horário a partir de um dado em forma de texto.
TimeValue
Range("A16") = TimeValue(13 & ":" & 25 & ":" & 32)
A16 conterá: 13:25:32
Retorna um horário a partir de uma hora, minuto e segundo especificados.
TimeSerial Sintaxe: TimeSerial(hour, minute, second)

Range("A17") = TimeSerial(16, 35, 17) A17 conterá: 16:35:17

Pag.: 120 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Abaixo uma tabela mostrando a semelhança entre as funções do VBA e do Excel.

Código das funções Data e Hora


' Retorna data atual
Public Function RetornaData() As Date
RetornaData = Date
End Function

' Retorna o dia de uma data


Public Function RetornaDia(data As Date) As Integer
RetornaDia = Day(data)
End Function

' Retorna o mês de uma data


Public Function RetornaMes(data As Date) As Integer
RetornaMes = Month(data)
End Function

' Retorna o ano de uma data


Public Function RetornaAno(data As Date) As Integer
RetornaAno = Year(data)
End Function

' Monta uma data


Public Function MontarData(ano As Integer, mes As Integer, dia As Integer) _
As Date
MontarData = DateSerial(ano, mes, dia)
End Function

' Converter texto em data


Public Function TextoEmData(data As String) As Date
TextoEmData = DateValue(data)

Fone: 4121-6166 Reprodução Proibida Pag.: 121


VBA para Excel

End Function

' Retornando o dia da semana


Public Function DiaSemana(data As Date) As Integer
DiaSemana = Weekday(data)
End Function

' Retorna o nome do dia da semana


Public Function NomeDiaSemana(data As Date) As String
Dim dia As Integer

dia = Weekday(data)

NomeDiaSemana = WeekdayName(dia)
End Function

' Retorna nome do dia do mês


Public Function NomeDoMes(data As Date) As String
Dim mes As Integer

mes = Month(data)

NomeDoMes = MonthName(mes)
End Function

' *** TEMPO ***

' Retornando data e tempo atual


Public Function RetornaAgora() As Date
' Application.Volatile ativa a atualização dos métodos
' do VBA junto com as atualizações do Excel, ou seja
' quando for calculado uma função do Excel na planilha,
' também serão calculadas as funções do VBA (F9).
Application.Volatile
RetornaAgora = Now
End Function

' Retornando data e tempo atual


Public Function RetornaTempo() As Date
Application.Volatile
RetornaTempo = Time
End Function

' Retorna a hora de um tempo


Public Function RetornaHora(tempo As Date) As Integer
RetornaHora = Hour(tempo)
End Function

' Retorna o minuto de um tempo


Public Function RetornaMinuto(tempo As Date) As Integer
RetornaMinuto = Minute(tempo)
End Function

' Retorna o segundo de um tempo


Public Function RetornaSegundo(tempo As String) As Integer
RetornaSegundo = Second(tempo)
Pag.: 122 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

End Function

' Montar tempo


Public Function MontarTempo(hora As Integer, minuto As Integer, _
segundo As Integer) As Date
MontarTempo = TimeSerial(hora, minuto, segundo)
End Function

' Texto para tempo


Public Function TextoEmTempo(tempo As String) As Date
TextoEmTempo = TimeValue(tempo)
End Function

Desafio 5
1º. Vamos criar um método que receba um tempo e retorne uma mensagem conforme tabela abaixo.

INTERVALO DE TEMPO MENSAGEM

06:00:00 até 11:59:59 Bom dia!

12:00:00 até 17:59:59 Boa tarde!

18:00:00 até 05:59:59 Boa noite!

2º. Vamos criar um método que receba um tempo e retorne uma mensagem conforme tabela abaixo.

INTERVALO DE TEMPO MENSAGEM

06:00:01 até 12:00:00 Bom dia!

12:00:01 até 18:00:00 Boa tarde!

18:00:01 até 06:00:00 Boa noite!

Fone: 4121-6166 Reprodução Proibida Pag.: 123


VBA para Excel

Funções para o tratamento de texto

Em muitas situações, uma operação resulta em um valor String que precisa ser manipulado. O VBA traz
várias funções para trabalhar com sequências de caracteres. Veja as funções descritas abaixo:

Função StrConv
Retorna uma Variant (String) convertida conforme especificado.

Sintaxe: StrConv(string, conversion, LCID)

A sintaxe da função StrConv tem os seguintes argumentos nomeados:


Argumento Descrição

string Obrigatória. A Expressão de sequência a ser convertida.

Obrigatória. Integer. A soma dos valores que especificam o tipo de conversão a ser
executada.
conversion 1 vbUpperCase Converte para maiúsculos.
2 vbLowerCase Converte para minúsculos.
3 vbProperCase Primeira letra em maiúscula as demais minúsculas.
64 vbUnicode Converte a sequência em Unicode
LCID Opcional. (A LocaleID do sistema é o padrão.) Geralmente não é especificado.

Exemplo:
MsgBox StrConv("EDSON ARANTES", 3) ‘retorna: Edson Arantes

Função Lcase
Converte uma string para letras minúsculas.

Sintaxe: Lcase(string)

Exemplo:
Sub ConvParaMinúsculo()
Dim S As String
S = InputBox("Digite um texto qualquer", "Converte para minúsculas")
MsgBox LCase(S)
End Sub

Pag.: 124 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Função Ucase
Converte uma string para letras maiúsculas.

Sintaxe: Ucase(string)

Exemplo:
Sub ConvParaMaiúsculo()
Dim S As String
S = InputBox("Digite um texto qualquer", "Converte para maiúsculas")
MsgBox UCase(S)
End Sub

Função Len
Retorna a quantidade de caracteres de uma string.

Sintaxe: Len(expressão)

Exemplo:
Sub ContaCaracteres()
Dim S As String
S = InputBox("Digite um texto qualquer", "Conta caracteres")
MsgBox Len(S)
End Sub

Função InStr
Retorna a posição da primeira ocorrência de uma sequência de caracteres dentro de outra.

Sintaxe: InStr([start, ]string1, string2[, compare])

A sintaxe da função InStr tem os seguintes argumentos:


Parte Descrição

Opcional. Expressão numérica que define a posição inicial de cada pesquisa. Se omitido, a
start pesquisa iniciará na posição do primeiro caractere. Se start contiver Null, ocorrerá um
erro. O argumento start será necessário, se compare for especificado.

string1 Obrigatória. Expressão de sequência sendo pesquisada.

string2 Obrigatória. Expressão de sequência de caracteres procurada.

compare Opcional. Especifica o tipo de comparação de sequência de caracteres.

Fone: 4121-6166 Reprodução Proibida Pag.: 125


VBA para Excel

Se compare for Null, ocorrerá um erro.

Definições

As configurações do argumento compare são as seguintes:


Constante Valor Descrição

vbUseCompareOption -1 Executa uma comparação usando Option Compare.

vbBinaryCompare 0 Executa uma comparação binária.

vbTextCompare 1 Executa uma comparação textual.

Somente Microsoft Access. Efetua uma comparação, com base nas


vbDatabaseCompare 2
informações existentes no banco de dados.

Se A InStr retornará

string1 tiver comprimento zero 0

string1 for Null Null

string2 tiver comprimento zero start

string2 for Null Null

string2 não for encontrado 0

string2 for encontrado dentro de string1 A posição em que a correspondência foi encontrada

start > string2 0

Exemplo:
Sub PesquisaString()
Dim s1 As String, s2 As String

s1 = InputBox("Digite um texto qualquer", "Texto", _


"Este é um texto padrão para o exercício")

s2 = InputBox("Digite um caractere ou uma palavra a " & _


"ser pesquisada", "Pesquisa")

MsgBox InStr(1, s1, s2, vbTextCompare)


End Sub

Função InStrRev
Descrição

Retorna a posição de uma ocorrência de uma sequência de caracteres dentro de outra, a partir do final
da sequência de caracteres.

Pag.: 126 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Sintaxe: InstrRev(stringcheck, stringmatch[, start[, compare]])

A sintaxe da função InstrRev tem os seguintes argumentos nomeados:

Parte Descrição

stringcheck Obrigatória. A expressão de sequência que está sendo pesquisada.

stringmatch Obrigatória. A expressão de sequência de caracteres que está sendo procurada.

start Opcional. A expressão numérica que define a posição inicial para cada pesquisa. Se for
omitida, –1 será usado, o que significa que a pesquisa começará na posição do último
caractere. Se start contiver Null, ocorrerá um erro.

compare Opcional. O valor numérico que indica o tipo de comparação a ser usado ao avaliar
subsequências de caracteres. Se for omitido, uma comparação binária será efetuada.
Consulte a seção Configurações para obter os valores.

Definições

O argumento compare são idênticos aos da função InStr.

Valores retornados

InStrRev retorna valores semelhantes a função InStr.

Comentários:

Observe que a sintaxe da função InstrRev não é igual à sintaxe da função Instr.

Exemplo:
Sub PesquisaString()
Dim s1 As String, s2 As String

s1 = InputBox("Digite um texto qualquer", "Texto", _


"Este é um texto padrão para o exercício")

S2 = InputBox("Digite um caractere ou uma palavra a " & _


"ser pesquisada", "Pesquisa")

MsgBox InStrRev(S1, S2, -1, vbTextCompare)


End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 127


VBA para Excel

Função Left
Retorna caracteres à esquerda de uma string.

Sintaxe: Left(String, length)

Exemplos:
' Extrai 10 caracteres à esquerda de um texto.
Sub Esquerda()
Dim s As String

s = "Exemplo da função left"

MsgBox Left(s, 10)


End Sub

' Extrai o primeiro nome.


Sub PrimeiroNome()
Dim s As String

s = InputBox("Digite um nome qualquer", "Primeiro Nome", _


"Joaquim José da Silva Xavier")

MsgBox Left(s, InStr(1, s, " ") - 1)


End Sub

Função Right
Retorna caracteres à direita de uma string.

Sintaxe: Right(string, length)

Exemplos:
' Retorna 12 caracteres à direita de um texto.
Sub Direita()
Dim S As String

S = "Exemplo da função right"

MsgBox Right(S, 12)


End Sub

' Retorna o sobrenome.


Sub SobreNome()
Dim s As String

s = InputBox("Digite um nome qualquer", "Sobre Nome", _


"Joaquim José da Silva Xavier")

MsgBox Right(s, Len(s) - InStr(1, s, " "))


End Sub

Pag.: 128 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Função StrReverse
Retorna uma string em ordem inversa.

Sintaxe: StrReverse(string)

Curiosidade: Esta função “pode” determinar se uma palavra ou frase é um palíndromo, ou seja, a
palavra ou frase pode ser lida da esquerda para a direita ou da direita para a
esquerda. Pois, em qualquer direção, possui o mesmo significado.

Tais como: osso, asa, “o galo nada no lago”, “ame o poema”, “anotaram a data da
maratona”, arara, radar, rever etc.

Exemplo:
Sub MostraStrReverse()
Dim s As String

s = InputBox("Digite um texto qualquer", "StrReverse", _


"anotaram a data da maratona")

MsgBox StrReverse(s)
End Sub

Função Mid
Retorna uma string com um número determinado de caracteres, da esquerda para a direita, a partir de
uma determinada posição.

Sintaxe: Mid(string, start, length)

Onde:

string é o texto de onde serão extraídos os caracteres.

start é a posição do primeiro caractere a ser extraído.

length é a quantidade de caracteres a serem extraídos a partir da posição inicial (start).

Exemplos:
Sub DemoMid()
Dim s As String

s = "Demonstração da função Mid" ' Criar a sequência de texto.

MsgBox Mid(s, 1, 3) ' Retorna "Mid".


MsgBox Mid(s, 14, 4) ' Retorna "Demo".
MsgBox Mid(s, 5) ' Retorna "Demonstração da função".

End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 129


VBA para Excel

' Retorna a última palavra de um texto.


Sub UltimaPalavra()
Dim S As String

S = InputBox("Digite um nome qualquer", "Ultimo Nome", _


"Joaquim José da Silva Xavier")

MsgBox Right(S, InStr(1, StrReverse(S), " ", vbTextCompare) - 1)


End Sub

Funções Trim, LTrim e RTrim


Trim remove espaços à direita e a esquerda de uma string, LTrim remove espaços à esquerda e RTrim
remove espaços à direita.

Sintaxe: Trim(string)

Ltrim(string)

Rtrim(string)

Onde: string é o texto de onde serão removidos os espaços.

Exemplos:
Sub LTrimRTrimTrim()
Dim s As String

s = " Observe os espaços à direita e a esquerda "


MsgBox "|" & s & "|"
MsgBox "|" & Trim(s) & "|"
MsgBox "|" & LTrim(s) & "|"
MsgBox "|" & RTrim(s) & "|"

End Sub

'Esta função remove todos os espaços extras de um texto.


'Ou seja, deixa somente um espaço entre duas palavras.
Function AllTrim(T As String) As String
Dim J As Integer, L As Integer, Y As String, X As String

X = Trim(T)
J = 0

For L = 1 To Len(X)
If Mid(X, L, 1) = " " Then
Pag.: 130 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

J = J + 1
If J <= 1 Then Y = Y & Mid(X, L, 1)
Else
Y = Y & Mid(X, L, 1)
J = 0
End If
Next L
AllTrim = Y
End Function

Função String
Retorna uma string que contém uma seqüência de caracteres repetida com o comprimento
especificado.

Sintaxe: String(number, character)

Exemplo:
Sub FunçãoString()
MsgBox String(5, ".") ' Retorna ".....".
MsgBox String(5, 42) ' Retorna "*****".
MsgBox String(10, "ABC") ' Retorna "AAAAAAAAAA".
End Sub

Função Space
Retorna uma quantidade especificada de espaços.

Sintaxe: Space(number)

Observação: Space(number) produz o mesmo efeito que String(" “, number).

Exemplo:
Sub FunçãoSpace()
MsgBox "|" & Space(25) & "|"
End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 131


VBA para Excel

Função Asc
Retorna um Número inteiro que representa o código de caractere correspondente à primeira letra de
uma sequência.

Sintaxe: Asc(string)

Exemplo:
Sub funçãoAsc()
MsgBox Asc("A") ' Retorna 65.
MsgBox Asc("a") ' Retorna 97.
MsgBox Asc("Amora") ' Retorna 65.
End Sub

Função Chr
Retorna uma sequência de caracteres que contém o caractere associado ao código de caractere
especificado.

Sintaxe: Chr(charcode)

O argumento charcode necessário é um Long que identifica um caractere.

Exemplo:
Sub FunçãoChr()
MsgBox Chr(65) ' Retorna A.
MsgBox Chr(97) ' Retorna a.
MsgBox Chr(62) ' Retorna >.
MsgBox Chr(37) ' Retorna %.
End Sub

Abaixo uma tabela mostrando a semelhança entre as funções do VBA e do Excel.

Pag.: 132 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Código das funções Texto


' Localizando texto
Public Function LocalizarTexto(textoProcurado As String, _
noTexto As String) As Integer
' InStr: INdice STRing
LocalizarTexto = InStr(1, noTexto, textoProcurado, vbTextCompare)
End Function

' Procurando texto


Public Function ProcurarTexto(textoProcurado As String, noTexto _
As String) As Integer
ProcurarTexto = InStr(1, noTexto, textoProcurado, vbBinaryCompare)
End Function

' Transformar texto em maiúsculo


Public Function TextoMaiusculo(texto As String) As String
' UCase: UpperCase
TextoMaiusculo = UCase(texto)

Fone: 4121-6166 Reprodução Proibida Pag.: 133


VBA para Excel

End Function

' Transformar texto em minúsculo


Public Function TextoMinusculo(texto As String) As String
' LCase: LowerCase
TextoMinusculo = LCase(texto)
End Function

' Transformar primeira letra em maiúsculo e demais em minúsculo


Public Function PrimeiraMaiuscula(texto As String) As String
'StrConv: STRing CONVert
PrimeiraMaiuscula = StrConv(texto, vbProperCase)
End Function

' Arrumando texto


Public Function ArrumarTexto(texto As String) As String
' LTrim: Left Trim
' RTrim: Right Trin
' Trim
ArrumarTexto = Trim(texto)
End Function

' Número de caracteres


Public Function NumeroCaracteres(texto As String) As String
' Len: LENgth
NumeroCaracteres = Len(texto)
End Function

' Substituir texto


Public Function SubstituirTexto(texto As String, _
textoAntigo As String, novoTexto As String) As String

SubstituirTexto = Replace(texto, textoAntigo, _


novoTexto, Compare:=vbTextCompare)

End Function

' Retornar texto a esquerda


Public Function RetornarEsquerda(texto As String, _
tamanho As Integer) As String
RetornarEsquerda = Left(texto, tamanho)
End Function

' Retornar texto a direita


Public Function RetornarDireita(texto As String, _
tamanho As Integer) As String
RetornarDireita = Right(texto, tamanho)
End Function

' Retornar texto do meio do texto


Public Function RetornarMeio(texto As String, posicao As Integer, _
tamanho As Integer) As String
RetornarMeio = Mid(texto, posicao, tamanho)
End Function

' Repetir texto


Public Function RepetirTexto(texto As String, _
numeroVezes As Integer) As String
RepetirTexto = String(numeroVezes, texto)
End Function

Pag.: 134 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

' Reperir espaços em branco


Public Function Espacos(numeroVezes As Integer) As String
Espacos = Space(numeroVezes)
End Function

' Texto em Código ASCII


Public Function CaracterEmAscii(caracter As String) As Integer
CaracterEmAscii = Asc(caracter)
End Function

' Código ASCII em Caracter


Public Function AsciiEmCaracter(ascii As Integer) As String
AsciiEmCaracter = Chr(ascii)
End Function

Fone: 4121-6166 Reprodução Proibida Pag.: 135


VBA para Excel

Funções de conversão

As funções de conversão são usadas para converter uma expressão em um tipo de dados específico.

Dim A, B, Check Dim MyDouble, MyByte

A = 5: B = 5 MyDouble = 125.5678

Check = CBool(A = B) MyByte = CByte(MyDouble)

Dim Dt, MyShortDate, Tm,


MyShortTime
Dim MyDouble, MyCurr
Dt = "12 de fevereiro de 1969"
MyDouble = 543,214588
MyShortDate = CDate(Dt)
MyCurr = CCur(MyDouble * 2)
Tm = "4:35:47 PM"

MyShortTime = CDate(Tm)

Dim MyCurr, MyDouble Dim MyDecimal, MyCurr

MyCurr = CCur(234.456784) MyCurr = 10000000.0587

MyDouble = CDbl(MyCurr * 8.2 * 0.01) MyDecimal = CDec(MyCurr)

Dim Val1, Val2, Long1, Long2


Dim MyDouble, MyInt
Val1 = 25427.45: Val2 = 25427.55
MyDouble = 2345,5678
Long1 = CLng(Val1)
MyInt = CInt(MyDouble)
Long2 = CLng(Val2)

Dim Double1, Double2, Single1, Single2


Dim Double1, String1
Double1=75.342115: Double2=75.342155
Double1 = 437,324
Single1 = CSng(Double1)
String1 = CStr(Double1)
Single2 = CSng(Double2)

Dim Int1, Var1

Int1 = 4534

Var1 = CVar(Int1 & "000")

Pag.: 136 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Listagem das funções de conversão:

Valor de
Sintaxe Intervalo de expression
retorno

CBool(expression) Booleano Qualquer seqüência ou expressão numérica válida.

Um tipo de dados com apenas dois valores possíveis, True (-1) ou False (0). As variáveis Boolean são
armazenadas como números de 16 bits (de 2 bytes).

CByte(expression) Byte números inteiros positivos de 0 a 255.

As variáveis Byte são armazenadas como números de 8 bits simples (1 byte) e sem sinal.

CCur(expression) Currency de -922.337.203.685.477,5808 922.337.203.685.477,5807.

Utilize este tipo de dados para cálculos que envolvam moedas e para cálculos de ponto fixo em que a precisão
seja extremamente importante. O caractere de declaração é o sinal de arroba @.

CDate(expression) Date Qualquer expressão de data válida.

Um tipo de dados utilizado para armazenar datas e horas como um número real. As variáveis de data são
armazenadas como números de 64 bits (8 bytes). O valor à esquerda do decimal representa uma data e o valor à
direita do decimal representa uma hora.

de -1,79769313486231E308 a -4,94065645841247E-324 (negativos)


CDbl(expression) Double
de 4.94065645841247E-324 a 1,79769313486232E308 (positivos)

Um tipo de dados que contém números de ponto flutuante de precisão dupla como números de 64 bits. O
caractere de declaração é o sinal numérico #.

+/-79.228.162.514.264.337.593.543.950.335, para números inteiros, isto é,


números sem casas decimais. Para números com 28 casas decimais, o
CDec(expression) Decimal intervalo é +/-7,9228162514264337593543950335.

O menor número possível diferente de zero é


0,0000000000000000000000000001.

Um tipo de dados que contém números decimais na escala de potência de 10. Observe que o tipo de dados
Decimal só pode ser utilizado dentro de uma Variant. Você não pode declarar uma variável do tipo Decimal. No
entanto, você pode criar uma Variant com o subtipo Decimal usando a função CDec.

CInt(expression) Integer de -32.768 a 32.767; as frações são arredondadas.

Um tipo de dados que contém variáveis de números inteiros armazenadas como números inteiros de 2 bytes. O
tipo de dados Integer também é utilizado para representar valores enumerados. O caractere de declaração é o
sinal de percentual %.

CLng(expression) Long de -2.147.483.648 2.147.483.647; as frações são arredondadas.

Um número inteiro de 4 bytes. O caractere de declaração é o E comercial &.

de -3,402823E38 a -1,401298E-45, para valores negativos;


CSng(expression) Single
de 1,401298E-45 a 3,402823E38, para valores positivos.

Fone: 4121-6166 Reprodução Proibida Pag.: 137


VBA para Excel

Um tipo de dados que armazena variáveis de ponto flutuante de precisão simples como números de ponto
flutuante de 32 bits (4 bytes). O caractere de declaração é o ponto de exclamação !.

CStr(expression) String Retornos para CStr dependem do argumento expression.

Um tipo de dados que consiste em uma sequência de caracteres contíguos que representam os próprios
caracteres no lugar de seus valores numéricos. Uma String pode incluir letras, números, espaços e pontuação. O
tipo de dados String pode armazenar sequências de caracteres de comprimento fixo que variam em tamanho de
0 a aproximadamente 63 mil caracteres e sequências de caracteres dinâmicas que variam em comprimento de 0
a aproximadamente 2 bilhões de caracteres. O caractere de declaração é o cifrão $.

Mesmo intervalo de Double para valores numéricos.


CVar(expression) Variant
Mesmo intervalo de String para valores não-numéricos.

Um tipo de dados especial que pode conter dados numéricos, de sequência de caracteres ou de data, assim
como os tipos definidos pelo usuário e os valores especiais Empty e Null. O tipo de dados Variant possui um
tamanho de armazenamento numérico de 16 bytes e pode conter dados até o intervalo de um Decimal ou um
tamanho de armazenamento de caractere de 22 bytes (mais o comprimento da sequência de caracteres), e pode
armazenar qualquer texto de caractere. A função VarType define como os dados de uma Variant são tratados.
Todas as variáveis tornam-se tipos de dados Variant se não forem declaradas explicitamente como algum outro
tipo de dados.

Pag.: 138 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Funções de Planilha do Excel

Você pode usar a maioria das funções de planilha do Microsoft Excel em suas instruções de Visual Basic.
Para fazer uso de uma função de planilha é preciso especificar que a função pertence ao objeto
Application, de acordo com a seguinte sintaxe:

Application.WorksheetFunction.NomeDaFunção(argumentos)

Observação As funções do Visual Basic não usam o qualificador WorksheetFunction. Uma função pode
ter o mesmo nome que uma função do Microsoft Excel e ainda assim funcionar de maneira diferente.
Por exemplo, Application.WorksheetFunction.Log (decimal) e Log (natural) retornam valores
diferentes.

Exemplo:
Média = Application.WorksheetFunction.Average(Range("C2:C32"))

Lista das funções de planilha disponíveis no VBA do Excel 2016:


AccrInt, AccrIntM, Acos, Acosh, AmorDegrc, AmorLinc, And, Asc, Asin, Asinh, Atan2, Atanh, AveDev, Average,
A
AverageIf, AverageIfs

BahtText, BesselI, BesselJ, BesselK, BesselY, BetaDist, BetaInv, Bin2Dec, Bin2Hex, Bin2Oct,
B
BinomDist

Ceiling, ChiDist, ChiInv, ChiTest, Choose, Clean, Combin, Complex, Confidence, Convert, Correl, Cosh, Count,
C CountA, CountBlank, CountIf, CountIfs, CoupDayBs, CoupDays, CoupDaysNc, CoupNcd, CoupNum,
CoupPcd, Covar, CritBinom, CumIPmt, CumPrinc

DAverage, Days360, Db, DCount, DCountA, Ddb, Dec2Bin, Dec2Hex, Dec2Oct, Degrees, Delta, DevSq,
D DGet, Disc, DMax, DMin, Dollar, DollarDe, DollarFr, DProduct, DStDev, DStDevP, DSum, Duration, DVar,
DVarP

E EDate, Effect, EoMonth, Erf, ErfC, Even, ExponDist

Fact, FactDouble, FDist, FInv, Finv, Fisher, FisherInv, Fixed, Floor, Forecast, Frequency, FTest, Fv,
F
FVSchedule

G GammaDist, GammaInv, GammaLn, Gcd, GeoMean, GeStep, Growth

H HarMean, Hex2Bin, Hex2Dec, Hex2Oct, Hlookup, HypGeomDist

IfError, ImAbs, Imaginary, ImArgument, ImConjugate, ImCos, ImDiv, ImExp, ImLn, ImLog10, ImLog2,
I ImPower, ImProduct, ImReal, ImSin, ImSqrt, ImSub, ImSum, Index, Intercept, IntRate, Ipmt, Irr, IsErr,
IsError, IsEven, IsLogical, IsNA, IsNonText, IsNumber, IsOdd, Ispmt, IsText

K Kurt

Fone: 4121-6166 Reprodução Proibida Pag.: 139


VBA para Excel

L Large, Lcm, LinEst, Ln, Log, Log10, LogEst, LogInv, LogNormDist

M Match, Max, Mdeterm, MDuration, Median, Min, Minverse, Mirr, Mmult, Mode, MRound, MultiNomial

N NegBinomDist, NetworkDays, Nominal, NormDist, NormInv, NormSDist, NormSInv, Nper, Npv

O Oct2Bin, Oct2Dec, Oct2Hex, Odd, OddFPrice, OddFYield, OddLPrice, OddLYield, Or

Pearson, Percentile, PercentRank, Permut, Phonetic, Pi, Pmt, Poisson, Power, Ppmt, Price, PriceDisc,
P
PriceMat, Prob, Product, Proper, Pv

Q Quartile, Quotient

R Radians, RandBetween, Rank, Rate, Received, Rept, Roman, Round, RoundDown, RoundUp, RSq, RTD

SeriesSum, Sinh, Skew, Sln, Slope, Small, SqrtPi, Standardize, StDev, StDevP, StEyx, Substitute, Subtotal,
S
Sum, SumIf, SumIfs, SumProduct, SumSq, SumX2MY2, SumX2PY2, SumXMY2, Syd

T Tanh, TBillEq, TBillPrice, TBillYield, TDist, Text, TInv, Transpose, Trend, Trim, TrimMean, TTest

V Var, VarP, Vdb, VLookup

W Weekday, WeekNum, Weibull, WorkDay

X Xirr, Xnpv

Y YearFrac, YieldDisc, YieldMat

Pag.: 140 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

O Que São Objetos.


Objetos são coisas definidas por CLASSES e que possuem Propriedades, Métodos e Eventos. Uma
janela, um botão e um banco de dados são objetos. Mas para entender bem o que é um objeto ainda é
preciso definir as tais das Propriedades, dos Métodos e dos Eventos:

Comecemos pelas Classes. Uma janela é muito diferente de um botão, mas os dois são objetos. Isso
acontece porque eles são definidos por Classes diferentes. Classes definem um objeto a grosso modo.
As Classes definem suas Propriedades, seus Métodos e seus Eventos. Podemos dizer que as Classes são
os moldes dos objetos.

Um botão pode ser diferente do outro (maior ou menor, com uma legenda diferente...). Mas como isso
é possível se eles pertencem à mesma classe? Porque suas propriedades são diferentes. As
Propriedades definem características mais específicas dos objetos. Um botão tem, por exemplo,
propriedades que determinam sua altura, sua largura e sua legenda.

Um Método é uma função, uma ação que age sobre um objeto. Por exemplo, se tivermos uma lista (tipo
as listas de tópicos no "procurar" da ajuda do Windows), adicionamos ou removemos itens através de
Métodos. Ou ainda, se quisermos mover um certo objeto pela tela, poderíamos usar um Método.

Por fim, o Evento. Digamos que em um certo programa, pressionamos um botão e um Beep é emitido.
Como o programa sabe quando apertamos o botão? Ele sabe por que quando um objeto da classe botão
é clicado, é gerado um Evento. E é a esse Evento que está associado o Código (comandos) que produzirá
o beep. Ocorrem também Eventos, por exemplo, ao modificarmos o texto de uma caixa de texto ou ao
mover o cursor do mouse sobre uma janela.

Só para ficar mais claro, um exemplo não muito nobre: digamos que haja uma classe "Galinha". Um
objeto Galinha poderia ter a propriedade "Idade", uma propriedade "CorDasPenas" e uma propriedade
"Nome". Ela teria um Método "PoeOvo" e um Método "Cacareja". E ela geraria Eventos ao dormir ao
acordar e ao ser ameaçada.

Fone: 4121-6166 Reprodução Proibida Pag.: 141


VBA para Excel

Add-Ins

Um Add-In do Excel é um arquivo (normalmente com a extensão .XLA) que o Excel pode carregar
quando ele for inicializado. O Add-In contem códigos que adicionam funcionalidades ao Excel. Ou seja,
disponibiliza novas funções, menus e ferramentas ao Excel.

Os Add-Ins são uma excelente forma de aumentar o potencial do Excel. Além do que, são a forma ideal
para a distribuição de funções customizadas. O Excel é disponibilizado com vários Add-Ins tais como:
Solver, Ferramentas de análise, Autosalvamento etc. A Microsoft também disponiliza Add-Ins
gratuitamente, por exemplo, o PowerPivot que aumenta, em muito, a capacidade de processamento
com centenas de milhões de linhas.

Um Add-In (Suplemento) é uma pasta de trabalho com comandos e funções customizadas que podem
ser usadas com o Excel.

Os Add-In são usados para a distribuição de macros, UDF’s (User Defined Function) "Função Definida
pelo Usuário" ou soluções customizadas para outros usuários.

Se o Add-In contiver códigos VBA que se refere à pasta de trabalho onde está o código em execução,
você deverá usar o objeto ThisWorkbook em vez de ActiveWorkbook. Um Add-In nunca será a
ActiveWorkbook.

O Excel 97 ou superior, pode abrir e editar os Add-Ins, assim não é necessário manter a cópia original da
pasta de trabalho que gerou o Add-In. A partir da versão 97 é possível proteger, com senha, o conteúdo
de um projeto VBA de uma pasta de trabalho. Assim, com esta proteção, o código ficará protegido
contra visualização e edição por outros usuários.

Os Add-Ins podem ser instalados abrindo normalmente o arquivo, assim como você abre qualquer pasta
de trabalho. Outra forma de instalar um Add-In é a seguinte: salve o Add-in na pasta Suplementos e
instale-o através do Gerenciador de Suplementos (Addin Manager) clicando no menu Ferramentas
(Tools) e escolhendo a opção Suplementos (Add-ins).

Quando você instala um Addin as funções, menus e barras de ferramentas contidas nele, ficam
disponíveis para uso em qualquer pasta de trabalho do Excel aberta na máquina onde o Add-in foi
instalado.

A vantagem de se usar o Gerenciador de suplementos para instalar um Add-In, é


que estes podem ser desinstalados. Para isto, na lista de suplementos do
Gerenciador de suplementos, desmarque o item desejado.

Também é possível instalar ou desinstalar um Add-In através de um código VBA.

Pag.: 142 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Vantagens do Add-In:
1. Os códigos sempre serão carregados e rodam em qualquer Pasta de trabalho.

2. Como não roda dentro do VBE não existe nenhum conflito com demais rotinas da planilha. Com isto
um dos maiores problemas do uso dos scripts é eliminado.

3. Usar Add-In é fácil e pratico principalmente para planilhas muito pesadas que utilizem macros e
scripts pois minimiza erros.

Desvantagens:
1. Não é possível ver o código via VBE

2. Caso uma planilha seja aberta em um outro computador que não tenha o Add-In a função não ira
funcionar. Para solucionar o problema instale o Add-In na outra máquina.

Comportamento de um Add-In

Um Add-In é um tipo especial de pasta de trabalho do Excel (XLAM). Um Add-In pode conter: planilhas,
gráficos, procedimentos Sub, Function e Class. Os códigos contidos em um Add-In adicionam comandos
opcionais e características ao Excel sem que o usuário possa visualizar ou editar.

Diferentemente de uma pasta de trabalho normal, um Add-In, quando aberto, não fica visível na tela e
você não poderá exibir o conteúdo, mesmo usando o comando reexibir da guia Exibição. Um Add-In é
exibido somente na janela do editor do Visual Basic.

Se o Add-In foi, previamente protegido com uma senha, você não poderá visualizar nem editar o seu
código.

Escrever uma Nova Função

Um Add-In pode conter o número UDF’s que você precisar, e você poderá adicionar outras funções mais
tarde. Basta abrir e editar o conteúdo do Add-In.

Vamos criar um valiador de CPF e CNPJ.

Passo 1: Adicionar um Módulo de código em uma nova pasta de trabalho

Inicie o Excel ou, se você já estiver com o Excel aberto, crie uma nova pasta de trabalho.

Fone: 4121-6166 Reprodução Proibida Pag.: 143


VBA para Excel

Abra o Editor do Visual Basic guia Desenvolvedor / Visual Basic (atalho Alt+F11).

Na janela do VBA, painel VBAProject, caso você tenha mais de uma pasta aberta, selecione o nome da
nova pasta de trabalho VBAProject (Pasta1).

Em seguida, clique na opção Módulo do menu Inserir.

No menu Inserir da janela do VBA ou na barra de ferramentas Padrão escolha Módulo. Isto irá adicionar
um novo modulo de código em branco na pasta de trabalho selecionada. Você também verá o nome do
modulo na janela do Project Explorer. Se você já estiver trabalhando com o Excel o nome talvez seja
diferente – verifique o nome na barra de titulo da janela do Excel caso você não tenha certeza. Se a
janela VBAProject não estiver visível, abra-a clicando no menu Exibir / Project Explorer (atalho Ctrl+R).

Pag.: 144 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Passo 2: Renomeando objetos

Na janela de código, do Project Explorer, clique com o botão direito do mouse sobre
VBAProject(Pasta1) ou no menu Ferramentas escolha a opção Propriedades do VBA Project.

Vamos alterar o Nome do projeto para “ValidadorDocumentos”.

Em Descrição do projeto, digitar “Validador de CPF e CNPJ”.

Na guia Proteção, selecionar a opção Bloquear projeto para exibição.

Em Senha e Confirmar senha, colocar “1234” ou uma senha de sua escolha.

Clicar em OK.

Fone: 4121-6166 Reprodução Proibida Pag.: 145


VBA para Excel

Mudar o nome do Módulo para ModValidador.

Passo 3: Digitando o código

A validação de CPF funciona tem as seguintes regras

Primeiro obtemos o valor do primeiro Dígito Verificador, para isso deve-se multiplicar os 9 primeiros
dígitos pela sequência de 1 até 9, com esse resultado utilizamos o resto da divisão por 11.

Posição 1 2 3 4 5 6 7 8 9 10 11

CPF 4 6 2 7 1 7 5 3 0 2 7

Multiplicador 1 2 3 4 5 6 7 8 9

Resultado 4 12 6 28 5 42 35 24 0 2

Multiplicando cada dígito dos 9 primeiros números do CPF pelo multiplicador da sequência temos um
resultado que a soma é 156, com esse resultado dividimos por 11 e o resto da divisão é o primeiro dígito
verificador, 156 / 11 = 14 e o resto da divisão é 2.

Agora para conseguir o segundo Dígito Verificador, deverá ser multiplicado os 10 primeiros dígitos
porém agora iniciando a sequência de multiplicador com 0 (zero).

Posição 1 2 3 4 5 6 7 8 9 10 11

CPF 4 6 2 7 1 7 5 3 0 2 7

Multiplicador 0 1 2 3 4 5 6 7 8 9

Resultado 4 12 6 28 5 42 35 24 0 2 7

Multiplicando cada dígito dos 10 primeiros números do CPF pelo multiplicador da sequência temos um
resultado que a soma é 139, com esse resultado dividimos por 11 e o resto da divisão é o primeiro dígito
verificador, 139 / 11 = 12 e o resto da divisão é 7.

Na janela de código, digite o código conforme abaixo:


' Validando CPF
Public Function ValidarCPF(sCPF As String) As Boolean
Dim d1 As Integer
Dim d2 As Integer
Dim d3 As Integer
Dim d4 As Integer
Dim d5 As Integer
Dim d6 As Integer
Dim d7 As Integer
Dim d8 As Integer
Dim d9 As Integer
Dim d10 As Integer

Pag.: 146 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Dim d11 As Integer


Dim DV1 As Integer
Dim DV2 As Integer
Dim UltDig As Integer

' Removendo pontos e hífen


sCPF = Replace(sCPF, ".", "")
sCPF = Replace(sCPF, "-", "")

' Completa com zeros à esquerda caso não esteja com os 11 digitos
If Len(sCPF) < 11 Then
sCPF = String(11 - Len(sCPF), "0") & sCPF
End If

' Pega a posição do último dígito


UltDig = Len(sCPF)

' Sai da função caso a célula esteja vazia


If sCPF = "00000000000" Then
ValidarCPF = False
Exit Function
End If

' Pega cada dígito do CPF informado e


' coloca nas variáveis específicas
d1 = CInt(Mid(sCPF, UltDig - 10, 1))
d2 = CInt(Mid(sCPF, UltDig - 9, 1))
d3 = CInt(Mid(sCPF, UltDig - 8, 1))
d4 = CInt(Mid(sCPF, UltDig - 7, 1))
d5 = CInt(Mid(sCPF, UltDig - 6, 1))
d6 = CInt(Mid(sCPF, UltDig - 5, 1))
d7 = CInt(Mid(sCPF, UltDig - 4, 1))
d8 = CInt(Mid(sCPF, UltDig - 3, 1))
d9 = CInt(Mid(sCPF, UltDig - 2, 1))
d10 = CInt(Mid(sCPF, UltDig - 1, 1)) ' Primeiro Digito Verificador
d11 = CInt(Mid(sCPF, UltDig, 1)) ' Segundo Digito Verificador

' Calculo para obter os digitos verificadores corretos


DV1 = d1 + (d2 * 2) + (d3 * 3) + (d4 * 4) + (d5 * 5) + (d6 * 6) _
+ (d7 * 7) + (d8 * 8) + (d9 * 9)
DV1 = DV1 Mod 11 'Obtem o resto

' Se o resto for igual a 10 altera pra 0


If DV1 = 10 Then
DV1 = 0
End If

DV2 = d2 + (d3 * 2) + (d4 * 3) + (d5 * 4) + (d6 * 5) + (d7 * 6) _


+ (d8 * 7) + (d9 * 8) + (DV1 * 9)
DV2 = DV2 Mod 11 'Obtem o resto

' Se o resto for igual a 10 altera pra 0


If DV2 = 10 Then
DV2 = 0

Fone: 4121-6166 Reprodução Proibida Pag.: 147


VBA para Excel

End If

' Comparando os Digitos Verificados obtidos pelo cálculo com os


' informados
If d10 = DV1 And d11 = DV2 Then
ValidarCPF = True
Else
ValidarCPF = False
End If

End Function

Validando CPNJ

As regras para validar o CNPJ é parecida com a do CPF, porém os multiplicadores tem outros valores

Posição 1 2 3 4 5 6 7 8 9 10 11 12 13 14

CNPJ 1 8 9 1 5 0 8 3 0 0 0 1 0 4

Multiplicador 6 7 8 9 2 3 4 5 6 7 8 9

Resultado 6 56 72 9 10 0 32 15 0 0 0 9 0

No CNPJ os multiplicadores iniciam em 6 até 9 depois de 2 até 9, multiplicando assim os 12 primeiros


dígitos. Com o resultado da soma das multiplicações, utiliza-se o resto da divisão por 11.

209 / 11 = 19, o resto é 0.

Agora, com o primeiro Dígito Verificador, calculamos o segundo Dígito Verificador, com os
multiplicadores iniciando em 5 até 9 e 2 até 9, multiplicando agora os 13 primeiros números.

Posição 1 2 3 4 5 6 7 8 9 10 11 12 13 14

CNPJ 1 8 9 1 5 0 8 3 0 0 0 1 0 4

Multiplicador 5 6 7 8 9 2 3 4 5 6 7 8 9

Resultado 6 56 72 9 10 0 32 15 0 0 0 9 0 4

A soma dos resultado da multiplicação é 213, 213 / 11 = 19, o resto é 4. Obtendo assim o segundo Dígito
Verificador.

No mesmo Módulo iremos digitar o seguinte código.

' Validados de CNPJ


Public Function ValidarCNPJ (sCNPJ As String) As Boolean
Dim d1 As Integer
Dim d2 As Integer
Dim d3 As Integer
Dim d4 As Integer
Dim d5 As Integer
Pag.: 148 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Dim d6 As Integer
Dim d7 As Integer
Dim d8 As Integer
Dim d9 As Integer
Dim d10 As Integer
Dim d11 As Integer
Dim d12 As Integer
Dim d13 As Integer
Dim d14 As Integer
Dim DV1 As Integer
Dim DV2 As Integer
Dim UltDig As Integer

' Removendo pontos, barra e hífen


sCNPJ = Replace(sCNPJ, ".")
sCNPJ = Replace(sCNPJ, "/")
sCNPJ = Replace(sCNPJ, "-")

' Completa com zeros à esquerda caso não esteja com os 14 digitos
If Len(sCNPJ) < 14 Then
sCNPJ = String(14 - Len(sCNPJ), "0") & sCNPJ
End If

' Pega a posição do último dígito


UltDig = Len(sCNPJ)

' Sai da função caso a célula esteja vazia


If sCNPJ = "00000000000000" Then
ValidarCNPJ= False
Exit Function
End If

' Pega cada dígito do CNPJ informado e


' coloca nas variáveis específicas
d1 = CInt(Mid(sCNPJ, UltDig - 13, 1))
d2 = CInt(Mid(sCNPJ, UltDig - 12, 1))
d3 = CInt(Mid(sCNPJ, UltDig - 11, 1))
d4 = CInt(Mid(sCNPJ, UltDig - 10, 1))
d5 = CInt(Mid(sCNPJ, UltDig - 9, 1))
d6 = CInt(Mid(sCNPJ, UltDig - 8, 1))
d7 = CInt(Mid(sCNPJ, UltDig - 7, 1))
d8 = CInt(Mid(sCNPJ, UltDig - 6, 1))
d9 = CInt(Mid(sCNPJ, UltDig - 5, 1))
d10 = CInt(Mid(sCNPJ, UltDig - 4, 1))
d11 = CInt(Mid(sCNPJ, UltDig - 3, 1))
d12 = CInt(Mid(sCNPJ, UltDig - 2, 1))
d13 = CInt(Mid(sCNPJ, UltDig - 1, 1)) ' Primeiro Dígito Verificador
d14 = CInt(Mid(sCNPJ, UltDig, 1)) ' Segundo Dígito Verificador

' Calculo para obter os digitos verificadores corretos


DV1 = (d1 * 6) + (d2 * 7) + (d3 * 8) + (d4 * 9) + (d5 * 2) + _
(d6 * 3) + (d7 * 4) + (d8 * 5) + (d9 * 6) + (d10 * 7) + (d11 * 8) + (d12 * 9)

DV1 = DV1 Mod 11 ' Obtem o resto

Fone: 4121-6166 Reprodução Proibida Pag.: 149


VBA para Excel

' Se o resto for igual a 10 altera pra 0


If DV1 = 10 Then
DV1 = 0
End If

DV2 = (d1 * 5) + (d2 * 6) + (d3 * 7) + (d4 * 8) + (d5 * 9) + (d6 * 2) _


+ (d7 * 3) + (d8 * 4) + (d9 * 5) + (d10 * 6) + (d11 * 7) + (d12 * 8) _
+ (DV1 * 9)

DV2 = DV2 Mod 11 ' Obtem o resto

' Se o resto for igual a 10 altera pra 0


If DV2 = 10 Then
DV2 = 0
End If

' Comparando os Digitos Verificados obtidos pelo cálculo com os


' informados
If d13 = DV1 And d14 = DV2 Then
ValidarCNPJ= True
Else
ValidarCNPJ= False
End If
End Function

Parte 3: Testando a função

Em uma planilha do Excel digite, na célula


A1, a seguinte um CPF Válido e na célula
A2 um CPF inválido, utilize a função
ValidarCPF(A1) e na célula B1 e na B2 a
função ValidarCPF(B2)

Criando um Add-In

Passo 1: Inserindo uma descrição para as funções

Pag.: 150 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Na janela do Excel, ative a guia Desenvolvedor e clique no botão Macros (atalho Alt+F8).

Será exibida a caixa de dialogo Macro, com


uma lista de todos os procedimentos
disponíveis.

Mas, as UDF’s, não aparecerão na listagem das


macros.

Para adicionar uma descrição a uma UDF, no


campo Nome da macro, digite o nome da
função, no caso, ValidarCPF.

Clique no botão Opções, digite a descrição


desejada, clique no botão OK e depois em
Cancelar para fechar a caixa de dialogo Macro.

Após adicionar a descrição, conforme descrito acima, clique no botão


Inserir Função.

Será aberta a caixa de diálogo Inserir função. Nela, selecione a categoria Definida pelo usuário. Note
que, na lista Nome da função, aparecerá o nome da UDF ValidarCPF. Selecione o nome ValidarCPF e
observe, na parte inferior da caixa de diálogo, a descrição que você acabou de adicionar.

Repetir o processo com o ValidarCNPJ.

Passo 2: Adicionar uma descrição em um Add-In

Fone: 4121-6166 Reprodução Proibida Pag.: 151


VBA para Excel

Clique em Arquivo / Informações / Propriedades / Propriedades Avançadas.

Antes de salvar como um suplemento, vamos


adicionar mais um comentário ao nosso Add-
In.

Este comentário será exibido na caixa de


diálogo suplementos. Sua finalidade é dar
informações sobre o suplemento que está
sendo instalado.

Para adicionar este comentário, clique na guia


Arquivo / Informações / Propriedades /
Propriedades Avançadas / guia Resumo.

Na caixa de diálogo propriedades, preencha os


dados conforme a figura ao lado e pressione o
botão OK.

Passo 3: Salvar a pasta de trabalho como um Add-In

Agora, vamos salvar a pasta de trabalho, criada anteriormente, como um Add-In. Para isto, na guia
Arquivo, clique na opção Salvar como.

Pag.: 152 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

No diálogo Salvar como, observe que a lista Salvar em, automaticamente, selecionou a pasta
Suplementos. Esta é uma pasta especial do Excel, específica para armazenar suplementos.

Clique na caixa Nome do arquivo e digite: Validador de Documentos Add-In. Em seguida, na lista Tipo,
selecione o item Suplemento do Excel ( *.xlam ). clique no botão Salvar. O local onde será gravado o
suplemento irá variar de acordo com a versão do Windows e do Office.

Passo 4: Instalar o Add-In

Reinicie o Excel para que ele reflita o novo Add-In.

Na janela do Excel, clique na guia Arquivo / Opções / Suplementos / Ir , ou na guia de Desenvolvedor,


Grupo Suplementos, controle Suplementos.

Será aberta a caixa de diálogo Suplementos onde você irá selecionar o suplemento desejado. No caso:
Meu Primeiro Suplemento Observe, na parte inferior da caixa de diálogo, a descrição que você
adicionou acima (passo 2). Ative o CheckBox relativo ao suplemento e clique no botão OK para ativar o
suplemento.

Fone: 4121-6166 Reprodução Proibida Pag.: 153


VBA para Excel

Ou

Para desinstalar o Add-In, desative o CheckBox correspondente ao Add-In (Suplemento).

O suplemento Meu Primeiro Suplemento ficará disponível para uso em qualquer pasta de trabalho do
Excel.

Pag.: 154 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Após a instalação do Add-In, você poderá encontrar a nova função na categoria denominada: Definida
pelo usuário. Clique no botão Inserir função e selecione a categoria "Definida pelo usuário" em Ou
selecione uma categoria.

Fone: 4121-6166 Reprodução Proibida Pag.: 155


VBA para Excel

Alterar ou adicionar nova função em um Add-In

Seu arquivo Add-In pode conter diversos módulos com várias funções cada um. Você poderá adicionar
uma nova função ou módulo a qualquer momento.

Se seu Add-In estiver instalado, você o verá na lista do Project Explorer no Editor do VBA. Localize o
módulo contendo sua função e faça a alteração ou adição desejada.

Se seu Add-In não estiver instalado, procure pelo arquivo do Add-In e dê um duplo clique para abri-lo no
Excel. O Add-In não será visível na janela do Excel, mas estará visível na janela Editor do VBA.

Não se esqueça de salvar as alterações efetuadas em seu Add-In. Na janela do Editor do VBA, clique no
botão Salvar ou use o menu Arquivo.

Pag.: 156 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Tratamento de Erros

Durante o desenvolvimento de um projeto, encontrar e corrigir erros, constitui uma etapa de


fundamental importância para obter resultados satisfatórios.

Tipos de erros

Erros de programação, geralmente enquadram-se em três categorias:

1. Sintaxe

2. Run-time

3. Lógica

Erros de sintaxe

Erros de sintaxe (compilação) ocorrem quando o código é construído incorretamente. Ou seja, a


digitação incorreta de uma palavra chave, a omissão de pontuações, um comando If sem Then, um
comando Next sem um For correspondente etc.

O VBA inclui uma opção chamada Autoverificar


sintaxe (Auto syntax Check) que pode ser
configurada em Ferramentas / Opções / guia
Editor na janela do VBA.

Ela pode detectar erros durante a digitação do


código.

Com esta opção, devidamente configurada, o


VBA interpreta o código durante a digitação e,
caso ocorra algum erro, ele seleciona a linha e
exibe uma caixa de diálogo com uma mensagem
explicando o erro com opção de ajuda para
corrigi-lo.

Fone: 4121-6166 Reprodução Proibida Pag.: 157


VBA para Excel

Os erros de sintaxe, são os erros mais fáceis de se corrigir. Pois o VBA, normalmente, indica o tipo do
erro que ocorreu e formata a linha que contem o erro na cor vermelha. Facilitando assim, a identificação
e a correção do mesmo.

O VBA não permite que o código seja executado enquanto os erros de sintaxe não forem corrigidos.

Atenção: um nome de arquivo digitado errado, por exemplo, é considerado um erro de sintaxe. Porém,
o VBA, não tem como identificar se ele está ou não correto.

Ai é que entra a atenção do programador.

Erros de Run-Time

Erros de run-time (tempo de execução) é um erro que faz com que a execução do código seja
interrompida inesperadamente em tempo de execução. Estes erros ocorrem quando um evento externo
ou erros de sintaxe não descobertos forçam a interrupção de execução do código. Um nome de arquivo
errado, a falta de um Pen drive na unidade são condições que podem provocar erros de execução.

Exemplo 1:

Um erro de Run-Time bem comum é o exemplo abaixo, onde declaramos uma variável X como sendo do
tipo Integer. Porém, de acordo com o código, ela poderá receber valores bem altos, veja:

Sub TestaErros1()
Dim X As Integer
' solicita a digitação de um número
X = InputBox("Digite um número qualquer", "Entrada")
X = X ^ 2 ' eleva X ao quadrado
MsgBox X ' exibe o valor de X
End Sub

Se você digitar um valor maior que 181, receberá a seguinte mensagem de erro:

Pag.: 158 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Por quê?

Simples, ocorre que variáveis do tipo Integer, podem receber valores entre -32.768 até 32.767 e, 182 ao
quadrado, da 33.124 que é maior que o limite definido para o tipo Integer. Logo, para que o código
acima funcione adequadamente, declare X como sendo do tipo Double que possui um limite superior de
1,79769313486232E+308 que é um número astronômico.

Erros de Lógica
Um erro de lógica afeta o programa apenas em tempo de execução. Um erro de lógica fatal faz o
programa falhar e ser finalizado prematuramente. Um erro de lógica não fatal não finaliza a execução de
um programa, mas faz com que o programa produza resultados incorretos. Ou seja, resultados
diferentes do esperado.

A maioria dos recursos de depuração estão voltados à rastrear os erros de lógica cometidos pelo
programador.

Exemplo 1:

Considere a seguinte estrutura de decisão If...Then, que avalia duas expressões condicionais e exibe
uma das mensagens baseadas no resultado:

If Idade > 13 And Idade < 20 Then


MsgBox "Você é um adolescente"
Else
MsgBox "Você não é adolescente"
End If

Você consegue identificar o erro na estrutura de decisão acima?

Um adolescente é uma pessoa com idade entre 13 e 19 anos, mas a estrutura não consegue identificar a
pessoa que tem exatamente 13 anos.

Este tipo de erro, não é um erro de sintaxe (as instruções seguem as regras do VBA). Também não é um
erro de run-time. Pois não provoca a interrupção da execução do código.

É um erro de raciocínio (erro de lógica). A estrutura correta deverá conter o operador "maior ou igual
a" >= conforme abaixo:

If Idade >= 13 And Idade < 20 Then

A ocorrência deste tipo de erro é comum.

Fone: 4121-6166 Reprodução Proibida Pag.: 159


VBA para Excel

Porém, de difícil identificação. Pois o erro não ocorre frequentemente, ou seja só ocorrerá quando for
digitada a idade de 13 anos, nas demais idades, funcionará corretamente.

Utilizando o método Break


Uma das maneiras de identificar um erro de lógica é executar seu código de programa linha a linha e
examinar o conteúdo de uma ou mais variáveis ou propriedades à medida que muda. Para fazer isso,
você pode entrar no modo Break enquanto o seu programa está rodando e visualizar seu código na
janela de código. O modo Break permite que você tenha uma visualização de perto de seu programa
enquanto o compilador do VBA está em execução.

Enquanto você está depurando seu aplicativo, talvez queira abrir a barra de ferramentas Debug
(Depurar) com botões para rastrear erros.

Você pode também querer abrir a janela Watches (Inspeção de variáveis) que pode exibir o conteúdo de
variáveis críticas que você está interessado em ver. Para inserir instruções de programa e ver seu efeito
imediato, utilize a janela Immediate (Verificação Imediata).

A Barra de ferramentas Depurar

A barra de ferramentas acima pode ser exibida clicando em: Exibir / Barras de ferramentas / Depurar
esta BF contém botões que são atalhos para alguns itens de menu frequentemente utilizados na
depuração do código.

Você pode clicar uma vez em um botão da barra de ferramentas para realizar a ação representada por
esse botão. Você pode selecionar a opção Mostrar dicas de ferramentas na guia Geral da caixa de
diálogo Opções se desejar exibir as Dicas de ferramentas dos botões da barra de ferramentas.

Pag.: 160 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Descrição dos Botões da Barra de Ferramentas Depurar

Modo Design - Ativa e desativa o modo Design

Executar Sub/UserForm ou Executar macro ( Start/Continue ) - Executa o procedimento atual


se o cursor estiver em um procedimento, executa o UserForm se um UserForm estiver ativo
no momento ou executa uma macro se nem a janela Código nem um UserForm estiver ativo.
Interromper ( Break ) - Para a execução de um programa em execução e alterna para o modo
de interrupção.
Redefinir ( End ) - Limpa a pilha de execução e as variáveis em nível de módulo e redefine o
projeto.
Ativar/desativar pontos de interrupção ( Toggle Breakpoint ) - Define ou remove um ponto
de interrupção na linha atual.
Depuração total ( Step Into ) - Executa o código uma instrução de cada vez.
Depuração parcial ( Step Over ) - Executa o código, um procedimento ou instrução de cada
vez na janela Código.
Depuração circular ( Step Out ) - Executa as linhas restantes de um procedimento em que se
encontra o ponto de execução atual.
Janela Variáveis locais ( Locals ) - Exibe a janela Variáveis locais.

Janela Verificação imediata ( Immediate) - Exibir a janela Verificação imediata.

Janela Inspeção de variáveis ( Watches ) - Exibe a janela Inspeção de variáveis.


Inspeção de variáveis rápida ( Quick Watch )- Exibe a caixa de diálogo Inspeção de variáveis
rápida com o valor atual da expressão selecionada.
Pilha de chamadas ( Call Stack ) - Exibe a caixa de diálogo Chamadas, que lista as chamadas de
procedimentos atualmente ativos (procedimentos no aplicativo que foram iniciados mas não
concluídos).

Fone: 4121-6166 Reprodução Proibida Pag.: 161


VBA para Excel

Tratando erros

Quando sabemos, de antemão que pode ocorrer algum erro em nosso código, podemos fazer uso do On
Error.

On Error GoTo Linha para tratar a ocorrência de erros.

Linha pode ser um número de linha ou o nome de um label (mais usado). Veja exemplo:

Sub TestaErros2()
Dim X As Integer

'se ocorrer algum erro desvie para o label trataErros


On Error GoTo TrataErros

X = InputBox("Digite um número qualquer", "Entrada")


X = X ^ 2
MsgBox X

Exit Sub 'termina o procedimento


TrataErros:
MsgBox "Digite números entre -181 e 181" & vbCr & vbCr & _
"Qualquer número fora do intervalo provocará erro.", _
vbExclamation, "Atenção"
End Sub

A linha On error GoTo TrataErros, diz ao VBA que: caso ocorra algum erro, a execução do código deverá
ser desviada para o label TrataErros: observe que o símbolo : (dois pontos) faz parte do label.

A instrução Exit Sub, faz com que o procedimento finalize nesta linha. Caso contrário, mesmo sem
ocorrer erro, será emitida a mensagem de alerta.

Instrução On Error

Ativa uma rotina de tratamento de erro e especifica o local da rotina dentro de um procedimento; pode
ser usada também para desativar uma rotina de tratamento de erro.

Sintaxe: On Error GoTo Line

On Error Resume Next

On Error GoTo 0

Pag.: 162 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

A sintaxe da instrução On Error pode ter qualquer uma das seguintes formas:

Instrução Descrição

Ativa a rotina de tratamento de erro que inicia na linha especificada do argumento line
(obrigatório). O argumento line é qualquer rótulo de linha ou número de linha. Se
On Error GoTo Line ocorrer um erro em tempo de execução, o controle desvia para line, tornando o
tratamento de erro ativo. A line especificada deve estar no mesmo procedimento em
que se encontra a instrução On Error.

Especifica que, quando ocorrer um erro em tempo de execução, o controle passará


On Error Resume Next para a instrução imediatamente seguinte à instrução onde ocorreu o erro e a
execução continua.

On Error GoTo 0 Desativa o manipulador de erro ativo no procedimento atual.

Comentários

Se você não usar uma instrução On Error, qualquer erro em tempo de execução que ocorrer será fatal,
isto é, será exibida uma mensagem de erro e a execução para.

Um manipulador de erro ativado é o que foi ativado por uma instrução On Error; um manipulador de
erro ativo é um manipulador de erro ativado que está no processo de tratar um erro. Se ocorrer um
erro enquanto o manipulador de erro estiver ativo (entre a ocorrência do erro e uma instrução Resume,
Exit Sub, Exit Function ou Exit Property), o manipulador de erro do procedimento atual não poderá
tratar o erro. O controle retornará para o procedimento de chamada. Se o procedimento de chamada
possuir um tratamento de erro ativado, ele será ativado para tratar o erro. Se o manipulador de erro do
procedimento de chamada também estiver ativo, o controle passará de volta pelos procedimentos de
chamada anteriores até encontrar um manipulador de erro ativado, mas inativo. Se não for encontrado
nenhum manipulador de erro ativado e inativo, o erro será fatal no ponto em que ele realmente
ocorreu. Sempre que o manipulador de erro passa o controle de volta para um procedimento de
chamada, esse procedimento torna-se o procedimento atual. Uma vez que o erro é tratado por um
manipulador de erro em qualquer procedimento, a execução continua no procedimento atual no ponto
designado pela instrução Resume.

Observação Uma rotina de tratamento de erro não é um procedimento Sub ou Function. É uma seção
do código marcada por um rótulo ou número de linha.

As rotinas de tratamento de erro dependem do valor na propriedade Number do objeto Err para
determinar a causa do erro. A rotina de tratamento de erro deve testar ou salvar valores de propriedade
relevantes do objeto Err antes que qualquer outro erro possa ocorrer ou antes que um procedimento
que possa causar um erro seja chamado. Os valores de propriedade no objeto Err refletem somente o
erro mais recente. A mensagem de erro associada a Err.Number está contida em Err.Description.

On Error Resume Next faz com que a execução continue com a instrução imediatamente após a
instrução que causou o erro em tempo de execução ou continue com a instrução imediatamente após a
chamada mais recente do procedimento que contém a instrução On Error Resume Next. Essa instrução
permite que a execução continue apesar de um erro em tempo de execução. Você pode colocar a rotina

Fone: 4121-6166 Reprodução Proibida Pag.: 163


VBA para Excel

de tratamento de erro onde é possível a ocorrência de erro, em vez de transferir o controle para outro
local dentro do procedimento. Uma instrução On Error Resume Next torna-se inativa quando outro
procedimento for chamado, assim você deve executar uma instrução On Error Resume Next em cada
rotina chamada para tratar os erros em linha dentro dessa rotina.

Observação A construção On Error Resume Next pode ser preferível a On Error GoTo ao tratar erros
gerados durante o acesso a outros objetos. Verificar Err após cada interação com um objeto remove a
ambiguidade sobre qual objeto foi acessado pelo código. Você pode ter certeza de qual objeto colocou o
código de erro em Err.Number, assim como qual objeto gerou originalmente o erro (o objeto especificado
em Err.Source).

On Error GoTo 0 desativa o tratamento de erro no procedimento atual. Ele não especifica a linha 0
(zero) como início do código de tratamento de erro, mesmo que esse procedimento contenha uma linha
com o número 0. Sem a instrução On Error GoTo 0, um tratamento de erro é automaticamente
desativado ao sair do procedimento.

Para evitar que o código de tratamento de erro seja executado quando não ocorreram erros, coloque
uma instrução Exit Sub, Exit Function ou Exit Property imediatamente antes da rotina de tratamento de
erro, como no exemplo a seguir:

Sub InitializeMatrix(Var1, Var2, Var3, Var4)

On Error GoTo ErrorHandler


. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub

O código de tratamento de erro segue a instrução Exit Sub e precede a instrução End Sub para separá-lo
do fluxo de procedimento. O código de tratamento de erro pode ser colocado em qualquer lugar do
procedimento.

Os erros não interceptados em objetos são retornados ao aplicativo de controle quando o objeto está
sendo executado como um arquivo executável. Dentro do ambiente de desenvolvimento, os erros não
interceptados são retornados ao aplicativo de controle somente se as opções apropriadas estiverem
definidas. Consulte a documentação de seu aplicativo host para obter uma descrição das opções que
devem ser definidas durante a depuração, como defini-las e se o host pode criar classes.

Se você criar um objeto que acessa outros objetos, deve tentar tratar os erros que foram retornados
deles sem que tenham sido tratados. Se você não puder tratar esses erros, mapeie o código do erro em
Err.Number para um de seus próprios erros e, em seguida, retorne-os para o chamador de seu objeto.
Você deve especificar seu erro adicionando o código de erro à constante vbObjectError. Por exemplo, se
o código de erro for 1052, atribua-o como a seguir:
Err.Number = vbObjectError + 1052

Pag.: 164 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Observação Os erros de sistema durante as chamadas às dynamic-link libraries (DLL, bibliotecas de


vínculo dinâmico) ou aos recursos de código do Macintosh não levantam exceções e não podem ser
interceptados com a interceptação de erro do Visual Basic. Ao chamar funções DLL, você deve verificar o
êxito ou falha de cada valor retornado (de acordo com as especificações API (Application Programming
Interface, interface de programação de aplicativo)) e, em caso de falha, verificar o valor da propriedade
LastDLLError do objeto Err. LastDLLError sempre retorna zero no Macintosh.

Exemplo da instrução On Error

Este exemplo primeiramente usa a instrução On Error GoTo para especificar o local de uma rotina de
tratamento de erro dentro de um procedimento. No exemplo, uma tentativa de excluir um arquivo
aberto gera o erro número 55. O erro é tratado na rotina de tratamento de erro e, em seguida, o
controle é retornado à instrução que provocou o erro. A instrução On Error GoTo 0 desativa a
interceptação de erro. Em seguida, a instrução On Error Resume Next é usada para adiar a
interceptação de erro de modo que o contexto do erro gerado pela próxima instrução possa ser
conhecido com certeza. Observe que Err.Clear é usada para limpar as propriedades do objeto Err depois
que o erro é tratado.

Sub OnErrorStatementDemo()
' Ative a rotina de tratamento de erro.
On Error GoTo ErrorHandler

Open "ARQTESTE" For Output As #1 ' Abra o arquivo para saída.


Kill "ARQTESTE" ' Tente excluir arquivo aberto.

On Error GoTo 0 ' Desative a interceptação de erro.

On Error Resume Next ' Adie a interceptação de erro.

' Tente iniciar um objeto inexistente e, em seguida, teste


ObjectRef = GetObject("MyWord.Basic")

' Verifique possíveis erros de automação.


If Err.Number = 440 Or Err.Number = 432 Then
' Informe ao usuário o que ocorreu.
' Em seguida, limpe o objeto Err.
Msg = "Houve um erro ao tentar abrir o Objeto de automação!"

MsgBox Msg, , "Teste de erro adiado"


Err.Clear ' Limpe os campos do objeto Err

End If

Fone: 4121-6166 Reprodução Proibida Pag.: 165


VBA para Excel

Exit Sub ' Saia para evitar manipulador.

ErrorHandler: ' Rotina de tratamento de erro.

Select Case Err.Number ' Avalie o número do erro.

Case 55 ' Erro "O arquivo já está aberto".


Close #1 ' Feche o arquivo aberto.

Case Else
' Trate outras situações aqui...
End Select
Resume ' Continue a execução na mesma linha que provocou o erro.
End Sub

Códigos dos Erros interceptáveis

Os erros interceptáveis podem ocorrer quando um aplicativo está sendo executado. Alguns erros
interceptáveis podem ocorrer também durante o desenvolvimento ou o tempo de compilação. Você
pode testar e responder a erros interceptáveis usando a instrução On Error e o objeto Err. Números de
erro, não usados no intervalo 1 – 1000, são reservados para uso futuro do Visual Basic.
Código
Descrição
do Erro

0003 Return sem GoSub

0005 Argumento ou chamada de procedimento inválida

0006 Estouro

0007 Memória insuficiente

0009 Subscrito fora do intervalo

0010 Esta matriz é fixa ou está temporariamente bloqueada

0011 Divisão por zero

0013 Tipos incompatíveis

0014 Espaço insuficiente para sequência de caracteres

0016 Expressão muito complexa

0017 É impossível executar a operação solicitada

0018 Ocorreu uma interrupção do usuário

0020 Recomeçar sem erro

0028 Espaço insuficiente para pilha

0035 Sub' ou 'Function' não definida

Pag.: 166 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Código
Descrição
do Erro

0047 Número excessivo de clientes do aplicativo DLL

0048 Erro ao carregar DLL

0049 Convenção de chamada DLL incorreta

0051 Erro interno

0052 Nome ou número de arquivo incorreto

0053 O arquivo não foi localizado

0054 Modo de arquivo incorreto

0055 O arquivo já foi aberto

0057 Erro de E/S em dispositivo

0058 O arquivo já existe

0059 Tamanho de registro incorreto

0061 Disco cheio

0062 Entrada depois do fim do arquivo

0063 Número de registro incorreto

0067 Número excessivo de arquivos

0068 Dispositivo não disponível

0070 Permissão negada

0071 O disco não está pronto

0074 É impossível renomear com unidade de disco diferente

0075 Erro de acesso a caminho/arquivo

0076 Caminho não localizado

0091 A variável do objeto ou a variável do bloco 'With' não foi definida

0092 Loop 'For' não inicializado

0093 Sequência de caracteres de padrão inválido

0094 Uso de 'Null' inválido

Impossível reduzir os eventos do objeto, pois o objeto já está disparando eventos para o número
0096
máximo de receptores de eventos que suporta

0097 Impossível chamar uma função adequada que não seja uma instância de definição de classe

Uma chamada de propriedade ou método não pode incluir uma referência a um objeto particular,
0098
seja como um argumento ou como um valor de retorno

Fone: 4121-6166 Reprodução Proibida Pag.: 167


VBA para Excel

Código
Descrição
do Erro

0321 Formato de arquivo inválido

0322 Não é possível criar arquivo temporário necessário

0325 Formato inválido no arquivo de recurso

0380 Valor da propriedade é inválido

0381 Índice de matriz de propriedades inválido

0382 Não há suporte para 'Set' em tempo de execução

0383 Não há suporte para 'Set' (propriedade somente leitura)

0385 É necessário o índice de matriz de propriedade

0387 Set' não permitida

0393 Não há suporte para 'Get' em tempo de execução

0394 Não há suporte para 'Get' (propriedade somente leitura)

0422 Propriedade não localizada

0423 Propriedade ou método não localizado

0424 O objeto é obrigatório

0429 O componente ActiveX não pode criar objeto

0430 Classe não oferece suporte a automação ou a interface esperada

0432 O nome ou a classe do arquivo não foi encontrada durante a operação de Automação

0438 O objeto não aceita esta propriedade ou método

0440 Erro de automação

A conexão à biblioteca de objetos ou de tipos foi perdida. Pressione OK para o diálogo remover a
0442
referência.

0443 O objeto de automação não possui um valor padrão

0445 O objeto não aceita esta ação

0446 O objeto não aceita argumentos nomeados

0447 O objeto não aceita a definição atual de localidade

0448 Argumento nomeado não localizado

0449 O argumento não é opcional

0450 Número de argumentos incorreto ou atribuição de propriedade inválida

0451 O procedimento Property Let não foi definido e o procedimento Property Get não retornou um objeto

0452 Ordinal inválido

Pag.: 168 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Código
Descrição
do Erro

0453 Função DLL especificada não localizada

0454 Recurso de código não localizado

0455 Erro de proteção de recurso do código

0457 Esta tecla já está associada com um elemento desta coleção

0458 A variável usa um tipo de automação não suportada no Visual Basic

0459 O conjunto de eventos não é suportado pelo objeto ou classe

0460 Formato inválido da área de transferência

0461 Método ou membro de dados não encontrado

0462 A máquina do servidor remoto não existe ou não está disponível

0463 Classe não registrada na máquina local

0481 Figura inválida

0482 Erro na impressora

0735 Não é possível salvar o arquivo em TEMP

0744 Texto de procura não localizado

0746 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 Criando procedimentos recursivos

Fone: 4121-6166 Reprodução Proibida Pag.: 169


VBA para Excel

Formulários (UserForms)

Com a utilização de UserForms você pode criar formulários personalizados, semelhantes aos que podem
ser criados usando linguagens de programação como o Visual Basic ou Delphi.

Você pode criar interfaces personalizadas, parecidas com as utilizadas em programas do Windows. Você
pode criar formulários onde são inseridos controles tais como:

Caixa de Seleção Botão de Opção

Caixa de Combinação Barra de Rolagem

Botão de Comando Botão de Rotação

Imagem Caixa de Texto

Rótulo Botão de Alternância

Caixa de Listagem

O uso prático de um UserForm é na criação de um formulário que facilita a utilização das planilhas de
uma pasta de trabalho do Excel. Por exemplo, você pode criar um formulário onde o usuário seleciona o
nome de um cliente em um controle do tipo Caixa de Combinação.

Ao selecionar o nome do cliente, no controle Caixa de Combinação, será disparado o Evento Após
alterar da Caixa de Combinação. Em resposta a este evento, você pode utilizar código VBA para localizar
os dados do cliente selecionado e exibi-los em Caixas de texto no UserForm. Este é apenas um pequeno
exemplo das possibilidades disponibilizadas pelos UserForms, juntamente com o modelo de Eventos do
Windows e a utilização do VBA.

Com o uso destes recursos é possível criar aplicativos bastante sofisticados, usando o Excel.

Mesmo com todos estes recursos, sempre é importante lembrar que é um erro querer utilizar o Excel
para solucionar todo e qualquer problema. Existe até um ditado bastante popular para descrever esta
situação: "Quando a única ferramenta que você conhece é um martelo, todos os problemas se
parecerão com um prego."

Ou seja, é um erro querer adaptar todos os problemas para serem resolvidos com o Excel, só porque
esta é a ferramenta que você mais domina. Em situações que envolvam um grande volume de registros
(milhões de registros), ou um grande número de tabelas ou problemas que envolvem muitos cálculos ou
cálculos complexos, a ferramenta mais indicada não é o Excel.

Para grandes volumes de dados e para problemas que envolvam um grande número de diferentes
tabelas você pode usar um banco de dados, como o Microsoft Access ou SQL Server.

Em situações que envolvam muitos cálculos e uma lógica complexa, é recomendado o uso de uma
linguagem de programação para geração de aplicativos, tais como o Visual Basic, VB.NET, Delphi, C++,
C#, Java e assim por diante.

Pag.: 170 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

No entanto, com o lançamento do Excel 2010, a Microsoft lançou, também, o PowerPivot suplemento
para lidar com centenas de milhões de dados descrito mais abaixo.

O uso mais comum e prático para os UserForms é a criação de formulários que atuam como uma
interface mais amigável para o usuário utilizar os dados de uma ou mais planilhas de uma pasta de
trabalho:

Uma situação típica para a utilização de UserForms é quando você precisa criar uma ou mais planilhas,
as quais serão utilizadas por funcionários que não foram treinados no Excel e, portanto, não sabem
utilizar os recursos de uma planilha do Excel. Nestas situações você cria uma ou mais formulários,
usando UserForms, formulários estes que atuam como uma interface entre o usuário final e as planilhas
do Excel. Ou seja, o usuário final – que nada conhece do Excel, interage diretamente com os formulários,
usando os recursos disponíveis nos formulários, para inserir, pesquisar, classificar e excluir dados.

O que é um Formulário

Um objeto UserForm é uma janela ou caixa de diálogo que constitui parte da interface de usuário de um
aplicativo. Podemos dizer que os formulários são recipientes de controles.

No VBA, a interface entre o usuário e o computador é feita pelas caixas de diálogo, que são criadas
através de UserForms, nos quais você pode inserir os controles que desejar e colocar botões para o
usuário responder aos controles, tornando a aplicação personalizada. Através de um formulário você
poderá dar consistência às informações fornecidas e executar as ações que desejar quando for
pressionado o botão OK.

Para inserir um formulário, na janela do VBA clique no menu Inserir  UserForm. Surgirá uma nova
pasta com o nome de Formulários, na qual os formulários serão armazenados. Dentro da pasta há um
formulário com o nome de UserForm1. também será exibida uma caixa de ferramentas contendo os
controles de formulários que será utilizada para inserir objetos no formulário.

Caso a caixa de ferramentas não apareça, clique no menu Exibir  Caixa de Ferramentas.

Você poderá inserir diversos formulários em um mesmo projeto.

Fone: 4121-6166 Reprodução Proibida Pag.: 171


VBA para Excel

O que são Controles

Um objeto que você pode inserir em um formulário que possui seu próprio conjunto de propriedades,
métodos e eventos reconhecidos. Você utiliza controles para receber entrada do usuário, exibir saída e
acionar procedimentos de evento. Você pode manipular a maioria dos controles utilizando métodos.
Alguns controles são interativos (respondem a ações do usuário), enquanto outros são estáticos
(acessíveis somente por meio de código).

Inserindo controles no formulário

Na caixa de ferramentas, clique no botão (controle) desejado.

Posicione o mouse sobre o formulário e clique e solte o mouse na posição onde deseja colocar o
controle. Se desejar, você poderá: clicar e arrastar o mouse para desenhar o controle no tamanho
desejado.
Lista dos Controles da Caixa de Ferramentas do VBA

Nome
Botão Descrição
prefixo

Object Selecionar objetos é o único item da Caixa de ferramentas que não desenha um
controle. Ao selecioná-lo, você somente poderá redimensionar ou mover um
Selection controle que já tenha sido desenhado em um formulário.

Label Permite-lhe ter algum texto que você não deseja que o usuário altere, como uma
lbl legenda sob um gráfico.

TextBox
Contém texto que o usuário pode inserir ou alterar.
txt

ComboBox Permite-lhe desenhar uma combinação de caixa de listagem e caixa de texto. O


cbo usuário pode escolher um item da lista ou digitar um valor na caixa de texto.

ListBox Utilizada para exibir uma lista de itens que o usuário pode escolher. A lista pode
lst ser deslocada se tiver mais itens do que podem ser exibidos de uma só vez.

CheckBox Cria uma caixa que o usuário pode facilmente escolher para indicar se algo é
verdadeiro ou falso ou para exibir várias opções quando o usuário desejar
chk escolher mais de uma.

OptionButton
Permite-lhe exibir várias opções das quais o usuário pode escolher somente uma.
opt

Pag.: 172 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

ToggleButton Cria um botão com dois estágios, ativado (pressionado) ou desativado. Usando
dois OptionButtons ou um CheckBox você terá o mesmo efeito.
tgb

Frame Permite-lhe criar um agrupamento gráfico ou funcional para controles. Para


agrupar controles, primeiro desenhe a moldura e, em seguida, desenhe controles
fra dentro dela.

CommandButton
Cria um botão que o usuário pode escolher para executar um comando.
cmd

TabStrip Permite-lhe definir várias páginas para a mesma área de uma janela ou caixa de
diálogo do seu aplicativo.
tst

Page
Apresenta várias telas de informações como um único conjunto.
pge
Fornece uma ferramenta gráfica para navegação rápida através de uma longa
ScrollBar lista de itens ou de uma grande quantidade de informações, para indicar a
scr posição atual em uma escala ou como um dispositivo de entrada ou indicador de
velocidade ou quantidade.

SpinButton Um controle de rotação que você pode utilizar com outro controle para
incrementar e decrementar números. Você pode também utilizá-lo para rolar
spi para trás e para frente, através de um intervalo de valores ou uma lista de itens.

Exibe uma imagem gráfica de um BitmapIconeMetafile no seu formulário. As


imagens exibidas em um controle Imagem somente podem ser decorativas e
Image utilizam menos recursos que uma Caixa de figura.

Tipos permitidos: *.bmp, *.cur, *.gif, *.iço, *.jpg, *.wmf


img
Obs Você pode, também, exibir uma figura em um Label. entretanto, o Label não
permite cortar, dimensionar ou aplicar zoom à figura.

O controle RefEdit deve ser usado quando você queira dar, ao usuário, a
RefEdit liberdade de selecionar um intervalo na planilha.

rfe Para adicionar este controle, clique inversamente na BF Caixa de Ferramentas e


selecione a opção Controles Adicionais (RefEdit.ctrl).

Fone: 4121-6166 Reprodução Proibida Pag.: 173


VBA para Excel

Propriedades dos objetos

Todos os controles de um formulário, inclusive o próprio formulário possuem propriedades e métodos.


Para alterar as propriedades, selecione o objeto a ser modificado para que a janela propriedades exiba
as características (propriedades) deste objeto.

Propriedades do Formulário Propriedades do Label

Pag.: 174 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Tabela com as principais propriedades dos objetos

Propriedade Descrição

Name Todos os objetos possuem esta propriedade.

É um caractere qualquer para representar a tecla de aceleração do comando. Este caractere ficará
Accelerator sublinhado para chamar a atenção seu uso é ALT+caractere.

Se True, o controle será redimensionado o suficiente para mostrar todo seu conteúdo. Se False,
Autosize mostra/exibe parte do conteúdo.

Especifica se ocorre tabulação automática quando um usuário digita o número máximo de caracteres
Autotab permitido em um TextBox ou na parte da caixa de texto de um ComboBox.

Especifica o modo de seleção de palavras em um TextBox ou ComboBox. Se for True, ao arrastar o mouse
pelos caracteres de uma palavra para selecionar, quando iniciar a seleção da próxima palavra, ambas
AutoWordSelect ficarão automaticamente selecionadas. Se False, ao arrastar o mouse para selecionar, somente serão
selecionados os caracteres, não selecionando automaticamente a palavra inteira.

BackColor Especifica a cor de fundo (preenchimento) do objeto.

Retorna ou define o estilo de segundo plano para um objeto.

BackStyle 0 – Transparente 1 – Opaco

se definido como transparente, a propriedade BackColor não terá efeito.

BorderColor Especifica a cor da borda de um objeto.

Especifica o tipo de borda utilizado por um controle ou um formulário.

BorderStyle 0 – Nenhuma. 1 – Simples.

Se definida como nenhuma, BorderColor ficará sem efeito.

Define qual coluna de um ComboBox ou ListBox de várias colunas contém o dado a ser armazenado.

0 – Atribui o valor da propriedade ListIndex ao controle.


BoundColumn
1 – ou maior Atribui o valor da coluna especificada ao controle. As colunas

são numeradas a partir de 1 ao utilizar essa propriedade (padrão).

Se o valor desta propriedade for True, o botão de comando será o botão Cancelar do formulário, que é o
Cancel botão a ser executado ao pressionar a tecla ESC. Se for definido como False, este não será o botão cancelar.
Somente um botão de comando pode ter o valor desta propriedade definido como True.

Rótulo ou título do objeto. Esta propriedade define o que será exibido como texto na barra de titulo do
Caption form ou o rótulo de um objeto, como um Label.

Especifica quantas colunas serão exibidas em um ComboBox ou ListBox. Se for 0, nenhuma coluna da lista
ColumnCount será exibida e –1 exibe todas as colunas.

Indica o local onde serão armazenados ou definidos os valores do controle. Por exemplo, ao digitar um
ControlSource texto em um TextBox, você pode especificar que este texto seja armazenado em uma determinada célula
de uma determinada planilha. Por exemplo: Plan1!A1. Pode-se usar uma célula nomeada.

Especifica o texto que aparece quando o usuário mantém, durante um momento, o ponteiro do mouse
ControlTipText sobre um controle sem clicar.

Designa o botão de comando padrão em um formulário. Ou seja, caso o usuário pressionar Enter, este será
Default o botão executado.

Fone: 4121-6166 Reprodução Proibida Pag.: 175


VBA para Excel

Enabled Especifica se um controle pode receber o foco e responder aos eventos gerados pelo usuário.

Font Define as características do texto utilizado por um controle ou formulário.

ForeColor Especifica a cor de primeiro plano de um objeto.

A altura em pontos, de um objeto. Um ponto é igual a 0,0353 cm. Costuma-se medir em pontos os
Height tamanhos de fonte.

HideSelection Especifica se o texto selecionado permanece realçado quando um controle não tem o foco.

Indica se um ListBox ou TextBox exibe linhas completas de texto em uma lista ou linhas parciais. A
IntegralHeight propriedade IntegralHeight refere-se à altura da lista, da mesma forma que a propriedade AutoSize se
refere à largura da lista.

Left À distância entre um controle e a borda esquerda ou superior do formulário que o contém.

Especifica o número máximo de linhas a exibir na lista. Se o número de itens na lista exceder o valor da
ListRows propriedade ListRows, aparecerá uma barra de rolagem na borda direita da parte caixa de listagem da
caixa de combinação.

Propriedade Descrição
Especifica se um controle pode ser editado. Quando um controle está bloqueado e ativado, ele ainda
Locked pode iniciar eventos e ainda pode receber o foco.

Retorna ou define um valor indicando como um ListBox ou ComboBox pesquisa sua lista à medida que o
usuário digita. Por exemplo, se digitar a letra M, surgirá a primeira palavra iniciada por esta letra. Esta
propriedade define a maneira como é feita a pesquisa e seu valor pode ser:

0 – A pesquisa é feita de forma que será exibida a primeira palavra iniciada com o caractere digitado. Se
Matchentry digitar M, será exibido Maio. Se, em seguida, digitar J, será exibido Janeiro.

1 – A pesquisa é feita conforma a sequência de caracteres digitados. Se digitar A, será exibido


Abril.quando digitar, em seguida a letra G, será exibido Agosto.

2 – não há correspondência na pesquisa. Se digitar D, será exibido a letra D.

Determina se o texto digitado na caixa de texto de uma ComboBox deve ser igual a um item da lista do
MathRequired controle. Pode ser True, indicando que o texto deve existir na lista, ou False, que aceita qualquer valor.

Especificam os valores máximo e mínimo aceitáveis para a propriedade Value de um ScrollBar ou


Max SpinButton.

Especifica o número máximo de caracteres que um usuário pode digitar em um TextBox ou ComboBox.
MaxLenght Definir a propriedade MaxLength como 0 indica que não há nenhum outro limite além do criado por
restrições de memória.

Especificam os valores máximo e mínimo aceitáveis para a propriedade Value de um ScrollBar ou


Min SpinButton.

Atribui um ícone personalizado a um objeto. A propriedade MouseIcon é válida quando a propriedade


MouseIcon MousePointer é definida como 99. O ícone de mouse de um objeto é a imagem que aparece quando o
usuário move o mouse através desse objeto.

Especifica o tipo de ponteiro exibido quando o usuário posiciona o mouse sobre um determinado objeto.
Utilize a propriedade MousePointer quando desejar indicar mudanças na funcionalidade à medida que o
MousePointer ponteiro do mouse passar sobre controles de um formulário. Por exemplo, a definição de ampulheta (11)
é útil para indicar que o usuário deve aguardar o término de um processo ou operação.

Pag.: 176 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

MultiLine Especifica se um controle pode aceitar e exibir várias linhas de texto.

Especifica se caracteres de espaço reservado são exibidos no lugar dos caracteres realmente digitados em
um TextBox.
PasswordChar
Você pode utilizar a propriedade PasswordChar para proteger informações importantes, como senhas ou
códigos de segurança.

Picture Especifica o bitmap (figura) a exibir em um objeto.

Especifica a origem que fornece uma lista para um ComboBox ou ListBox. Pode ser uma célula ou um
RowSource intervalo.

Especifica se um controle, formulário ou página possui barra de rolagem vertical, horizontal ou ambas.

ScrollBars 0 – Não exibe as barras de rolagem 1 – Exibe a barra de rolagem horizontal

2 – exibe a barra de rolagem vertical 3 – Exibe as duas barras de rolagem

ShowModal Se True, a janela será restrita. Ou seja, para acessar outras janelas você deverá fechar o formulário.

Especifica a quantidade de movimento que ocorre quando o usuário clica em qualquer uma das setas de
SmallChange rolagem em um ScrollBar ou SpinButton.

SpecialEffect Especifica o aspecto visual de um objeto.

Para ComboBox, especifica como o usuário pode escolher ou definir o valor do controle.

Para MultiPage e TabStrip, identifica o estilo das tabulações no controle.


Style
0 – Aceita a entrada de um valor não existente na lista

2 – Somente aceita valores da lista

Especifica a posição de um único objeto na ordem de tabulação do formulário. O valor de índice do


TabIndex primeiro objeto na ordem de tabulação é zero.

Determina se as tabulações são permitidas na região de edição.


TabKeyBehavior Se True, ao pressionar a tecla TAB, será inserido um caractere de tabulação na área de edição. Se False,
ao pressionar TAB o foco será movido para o próximo controle.

TabStop Indica se um objeto pode receber o foco quando o usuário tabula até ele.

Text Retorna ou define o texto em um TextBox. Muda a linha selecionada em um ComboBox ou ListBox.

Propriedade Descrição
Especifica como o texto é alinhado em um controle.
TextAlign
1 – Esquerda 2 – Centralizado 3 – Direita

TextColumn Em uma lista com várias colunas, esta propriedade define qual coluna será exibida ao usuário.

Top A distância entre um controle e a borda esquerda ou superior do formulário que o contém.

Visible Especifica se um objeto está visível ou oculto.

Width A largura, em pontos, de um objeto. Um ponto é igual a 0,0353 cm.

Fone: 4121-6166 Reprodução Proibida Pag.: 177


VBA para Excel

WordWrap Indica se o conteúdo de um controle quebra automaticamente a linha no final.

Exemplos de formulários e descrição de controles

Frame Page

Label
TextBox

OptionButton

CommandButton
ComboBox
CheckBox
Frame

Construindo um formulário

Usando os controles da barra de ferramentas Caixa de


Ferramentas, desenhe um formulário conforme o exemplo
ao lado:

Altere as propriedades conforme a tabela:


Controle Name Caption Comentários

Commandbutton1 BtnMensagem Clique aqui

UserForm1 frmPrimeiro Meu Primeiro Formulário

De um duplo clique no botão Clique aqui e preencha o código para que fique da seguinte forma:

' Evento Clicar do botão BtnMensagem


Private Sub BtnMensagem_Click()
MsgBox "Olá pessoal do VBA!"

Pag.: 178 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

End Sub

Pressione a tecla F5 e clique no botão Clique Aqui. Será executado o evento com o comando MsgBox
que exibirá uma mensagem.

Se você clicar no botão x (canto superior direito do form) o formulário também será fechado.

Eventos
Os Eventos são métodos que são disparados através de alguma ação realizada no formulário. Todos os
controles contém Eventos, alguns são comuns entre eles, mas alguns Eventos são específicos para
determinado controle.

Também temos Eventos nos objetos do Excel (Planilhas e Pasta de Trabalho).

Vamos ver alguns eventos e como chama-los

Quando damos duplo-clique em alguns controle adicionado ao Formulário, seremos direcionados a


página de código do Formulário que estamos trabalhando e será criado automaticamente um evento
padrão daquele controle. Exemplo ao inserirmos um CommandButton, o evento padrão desse controle
será o evento Click, (Private Sub CommandButton1_Click()). A estrutura criada contém

Pois os eventos de algum controle, por padrão será privado, pois ele
depende do formulário aberto para ser executado, então é um método
Private exclusivo do formulário.

Em raros momentos, deixamos um Evento como Public.

Sub Todos os eventos são uma Ação, portanto são do tipo SUB.

O nome do seu controle. O VBA depende do nome do controle para


CommandButton1
vincular o método de evento ao controle

_Click O tipo de evento que ocasionará a execução do Evento

Fone: 4121-6166 Reprodução Proibida Pag.: 179


VBA para Excel

Para mudarmos o evento, por exemplo, desejamos que um CommandButton seja executado apenas
com duplo-clique e não um clique normal, dessa forma, criamos o evento Click, dando duplo-clique no
controle, e quando for direcionado à página de código com o Evento criado, com o curso dentro do
evento, selecionamos o evento desejado conforme imagem abaixo.

Dessa forma será criado um novo Evento, e como não iremos utilizar o evento Click, podemos Deletar o
mesmo para não ficar com códigos que não serão utilizados.

Alguns controles permitem que utilizemos mais que um Evento para o mesmo controle, exemplo o
controle TextBox que podemos utilizar os controles Change, Enter, Exit, KeyPress. Porém alguns
Eventos podem impedir a execução de outro, por exemplo no CommandButton, não podem ser
utilizados os Eventos Click e DblClick simultaneamente, pois quando clicar uma vez já será executado,
não possibilitando assim realizar o segundo clique.

Vamos ver alguns Eventos e quando são executados.

EVENTO QUANDO SERÁ EXECUTADO

Pag.: 180 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Click Quando realizar 1 clique no botão do mouse sobre o controle

DblClick Quando realizar duplo-clique no botão do mouse sobre o controle

Change Utilizado no controle TextBox, é executado sempre que alterar o texto do


controle

Enter Sempre que o controle receber o foco. Exemplo, quando entrar em um


TextBox para digitar algo

Exit O oposto do Evento Enter, esse será executado sempre que saír do
controle

KeyPress Sempre que pressionar alguma tecla do teclado estando com o cursor
dentro do controle

Initialize Evento do Formulário que executa algum comando quando inicializar o


formulário

QueryClose Outro Evento do Formulário que será executado quando solicitado o


fechamento do Formulário. Esse evento executa antes de fechar o
formulário, dentro dele ainda pode ser cancelado o fechamento

Terminate Mais um Evento do Formulário que também é executado quando


solicitado o fechamento, porém esse não pode mais impedir o
fechamento do formulário, pois ele é executado após o mesmo ser
descarregado.

Open Um evento do objeto do Excel Workbook (Workbook_Open()), que é


executado quando abrir um arquivo (pasta de trabalho)

SelectionChange Um Evento da planilha (Worksheet_SelectionChange) que é executado


sempre que é executado qualquer tipo de alteração na planilha, até
mesmo mudar a seleção de uma célula.

Temos diversos outro eventos, que veremos alguns outros no decorror na dos exemplos.

DICAS: Alterando a propriedade Default do botão CommandButton para True. Assim, em vez de
clicar no botão, basta pressionar a tecla Enter.

Altere a propriedade Cancel de outro botão CommandButton para True. Assim poderá
pressionar a tecla Esc para executar o comando. Normalmente utilizamos relacionado a
algum botão para fechar o formulário.

Trabalhando com TextBox


Um TextBox é o controle mais comumente utilizado para exibir informações inseridas por um usuário.
Além disso, pode exibir um conjunto de dados, como tabela, consulta, planilha ou resultado de um

Fone: 4121-6166 Reprodução Proibida Pag.: 181


VBA para Excel

cálculo. Se um TextBox estiver ligado a uma fonte de dados, a alteração do conteúdo do TextBox irá
alterar também o valor da fonte de dados acoplada.

A formatação aplicada a qualquer parte do texto em um TextBox afetará todo o texto do controle. Por
exemplo, se você alterar a fonte ou o tamanho, em ponto, de qualquer caractere do controle, essa
alteração afetará todos os caracteres desse controle.

A propriedade padrão de um TextBox é a propriedade Value.

O evento padrão de um TextBox é o evento Change.

Vamos melhor o formulário, agora gostaríamos que a mensagem fosse personalizada, ou seja,
informamos um nome para que na mensagem contenha o nome.

Como estamos utilizando um formulário, nesse caso não será necessário utilizar o comando InputBox,
vamos criar uma caixa de texto (TextBox) que receberá o nome.

Vamos criar um novo formulário conforme abaixo:

Vamos modificar as propriedades conforme abaixo.

CONTROLE PROPRIEDADE VALOR

UserForm (Name) FrmMensagem

UserForm Caption Mensagem Dinâmica

Label Caption Nome

TextBox (Name) TxtNome

CommandButton (Name) BtnExecutar

CommadButton Caption Executar

Como podemos repara, não será necessário alterar a propriedade (Name) do controle Label, pois
normalmente é recomendado alterar o nome dos controle que sofrerão alguma alteração através do
código. Nesse exemplo o controle Label será somente para informar que o TextBox refere-se a um
nome.
Pag.: 182 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Agora daremos duplo-clique no controle BtnExecutar para gerar o evento Click que iremos criar um
comando conforme abaixo:
Private Sub BtnExecutar_Click()
MsgBox "Olá " & TxtNome.Text & ", como vai?"
End Sub

Agora vamos executar para ver o comportamento do formulário.

Com esse mesmo formulário, vamos realizar uma alteração para, ao invés de informar a mensagem em
um MsgBox, não utilizar um controle Label. Ficará com a aparencia abaixo.

Para isso vamos modificar as propriedades desse novo Label conforme abaixo:

CONTROLE PROPRIEDADE VALOR

Label (Name) LblMensagem

Fone: 4121-6166 Reprodução Proibida Pag.: 183


VBA para Excel

Label BackColor &H0080FFFF&

Label Caption Deixar vazio, sem texto

Vamos modificar o Evento Click conforme abaixo:


Private Sub BtnExecutar_Click()
LblMensagem.Caption = "Olá " & TxtNome.Text & ", como vai?"
End Sub

O resultado veremos abaixo.

Como carregar um formulário

Após a confecção de um formulário, você precisará exibi-lo na tela.

Para exibir um formulário utilize o método Show:


NomeDoFormulário.Show

A instrução Load, carrega um formulário para a memória. Mas, o formulário não será exibido. Ou seja,
ficará oculto.
Load NomeDoFormulário

• Esta instrução é útil quando se tem diversos formulários e, a maioria deles sejam grandes. Neste caso,
ao carregar a pasta de trabalho escreve-se no evento Open da Workbook o código para o
carregamento de todos os formulários. Assim, quando precisar exibir um formulário, basta usar o
método Show e o formulário será exibido rapidamente.

O método Show possibilita a exibição de um formulário na tela.

Pag.: 184 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Se o formulário foi previamente carregado com a instrução Load, o método Show simplesmente exibe o
formulário.

Caso o formulário não esteja carregado, o método show carrega e exibe o formulário. Ou seja, o método
Show, executa a instrução Load automaticamente.

Ocultar um formulário
Fechar e reabrir novamente um formulário pode levar certo tempo, principalmente se o formulário for
grande. Neste caso é melhor Ocultar o formulário e depois reexibi-lo.

Para ocultar um formulário use o método Hide.


NomeDoFormulário.Hide

Descarregar um formulário
Se você terminou de fazer uso de um formulário e não vai mais precisar dele, então é melhor
descarregá-lo da memória. Para tal, use a instrução Unload.
Unload NomeDoFormulário 'descarrega o formulário especificado

Unload Me 'descarrega o formulário atual.

Como passar de um formulário para outro


É bastante comum a tarefa de passar de um formulário para outro. Para isto, você deverá ocultar ou
fechar o formulário atual e exibir o próximo formulário.

Oculta o formulário1 e exibe o formulário2


Formulário1.Hide
Formulário2.Show

Descarrega o formulário1 e exibe o formulário2


Unload Formulário1
Formulário2.Show

Código para listar as barras de ferramentas do Excel

Este código gera, na planilha ativa, uma lista de nomes das barras de ferramentas do Excel.

Sub ListaNomeDasBarras()
Dim L As Integer, C As CommandBar, LIN As Integer
L = 2
With Worksheets("Plan2")
With .Range("A1:C1")
Fone: 4121-6166 Reprodução Proibida Pag.: 185
VBA para Excel

.Font.Bold = True
.Value = Array("Index", "Nome (Inglês)", "Nome (Português)")
End With
For Each C In CommandBars
.Cells(L, 1).Value = C.Index
.Cells(L, 2).Value = C.Name
.Cells(L, 3).Value = C.NameLocal
L = L + 1
Next C
.Range("A1").CurrentRegion.Columns.AutoFit
.Range("A1:A" & L).HorizontalAlignment = xlCenter
End With
End Sub

Formulário de cálculos
Utilizando um formulário para calcular valores. Vamos começar com um formulário simples, onde irá
receber 2 valores, somar e devolver a resposta.

Criar um formulário confirme abaixo:

Esse formulário deve conter algumas validações.

1º Nos campos Valor 1 e Valor 2, deverá aceitar apenas números.

2º. O campo Resultado deve estar bloqueado para alteração, mas pode ser selecionado e até copiado.

3º. O calculo será efetuado apenas após o clique do botão Calcular.

Após criar o formulário conforme exemplo acima, devemos renomear os objetos que serão utilizados no
código conforme tabela abaixo:

CONTROLE PROPRIEDADE VALOR

Label Caption Valor 1:

Label Caption Valor 2:

Label Caption Resultado:

Pag.: 186 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Frame Caption Operação

TextBox (Name) TxtValor1

TextBox TextAlign 3 – fmTextAlignRight

TextBox (Name) TxtValor2

TextBox TextAlign 3 – fmTextAlignRight

TextBox (Name) TxtResultado

TextBox Locked True

Essa propriedade bloqueia o


campo para alteração

TextBox TextAlign 3 – fmTextAlignRight

CommandButton (Name) BtnCalcular

CommandButton Caption Calcular

UserForm (Name) FrmSomarValores

UserForm Caption Somando 2 Valores

Primeiro vamos deixar os campos Valor 1 e Valor 2 aceitando apenas números (0 – 9).

Para isso vamor dar duplo-clique no controle Valor 1, isso irá criar um evento Change.

Vamos gerar o evento KeyPress e depois deletar o evento Change. Com o cursor no evento Change,
vamos escolher o evento KeyPress.

Fone: 4121-6166 Reprodução Proibida Pag.: 187


VBA para Excel

Dentro do evento KeyPress vamos criar o seguinte código.

O Evento KeyPress recebe um argumento, KeyAscii, que representa o código ASCII da tecla digitada. O
código 48 refere-se ao número “0” e o 57 o número “9”. Dessa forma o código verifica se a tecla digitada
estiver fora do intervalo entre os códigos ASCII 48 e 57, ou seja os números 0 até 9, ele irá retornar o
código ASCII 0, que refere-se a nulo.

Repetir o processo com o controle Valor 2.

Agora iremos adicionar o comando para calcular os valores do Evento Clique do botão.

O controle Resultado irá receber a soma de Valor 1 + Valor 2. No código acima utilizaremos a instrução
VAL(), que converte o texto em Double, pois se efetuar a soma sem a conversão dos valores
TxtValor1.Text + TxtValor2.Text, como os 2 controles são campos de texto, ao invés de soma os valores
serão concatenados, exemplo, 5 + 4, o código entenderá que está recebendo 2 texto, então irá juntar e
o resultado será 54. Com a instrução VAL(), os valores serão convertidos para double primeiramente,
depois serão somandos, dai sim o resultado será 9

Resultado Final

Pag.: 188 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Reaproveitando Código
No próximo formulário, faremos uma forma diferente, iremos reaproveitar os códigos, ou seja, o mesmo
método será utilizado em vários locais.

Vamos pensar da seguinte maneira, se vais que um controle utiliza o mesmo algorítimo, ou muito
semelhante, podemos criar um único método e chama-lo de outros locais.

Vamos criar mais um formulário para realizar cálculos, mas dessa vez com as 4 operações fundamentais,
conforme exemplo abaixo:

1º. Os campos Valor 1 e Valor 2 sé devem receber números.

2º. O Resultado deve ser travado para alteração mas pode ser selecionado e até copiado.

3º. Ao clicar em algum dos botões, Adicionar, Subtrair, Multiplicar ou Dividir, deverá executar a
operação e aparecer o resultado no controle Resultado.

Após criar o formulário com os controles, vamos alterar as propriedades conforme abaixo:

CONTROLE PROPRIEDADE VALOR

Label Caption Valor 1:

Label Caption Valor 2:

Label Caption Resultado:

Fone: 4121-6166 Reprodução Proibida Pag.: 189


VBA para Excel

Frame Caption Operação

TextBox (Name) TxtValor1

TextBox TextAlign 3 – fmTextAlignRight

TextBox (Name) TxtValor2

TextBox TextAlign 3 – fmTextAlignRight

TextBox (Name) TxtResultado

TextBox Locked True

Essa propriedade bloqueia o


campo para alteração

TextBox TextAlign 3 – fmTextAlignRight

CommandButton (Name) BtnSomar

CommandButton Caption +

CommandButton (Name) BtnSubtrair

CommandButton Caption -

CommandButton (Name) BtnMultiplicar

CommandButton Caption *

CommandButton (Name) BtnDividir

CommandButton Caption /

UserForm (Name) FrmCalculadora

UserForm Caption Calculadora

Assim como no formulário anterior, vamos deixar os campos Valor 1 e Valor 2 aceitando apenas
números, porém será criado um único método que os 2 controles irão chamar.

Agora nos eventos dos controle iremos chamar esse método.

Pag.: 190 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Dessa forma, caso seja necessário alguma alteração, basta alterar no método SomenteNumeros que irá
refletir em todos os locais que estão chamando.

Para executar as operações, também será criado um único método, que os botões irão chamar.

Nesse caso, será necessário criar um argumento que consiga diferenciar qual o tipo de operação será
realizado. Não seria uma boa prática criar um argumento do tipo String, pois os a validação pode está
em maiúsculo e passar o argumento minúsculo, ou escrever diferente, a melhor alternativa seria um
número, pois se o número for 1 não teria como o número de outra forma. O problema é que ficaria
difícil lembrar números, principalmente se forem muitas opções, então iremos utilizar uma estrutura
chamada Enumeration. Simplificando, Enumeration é uma forma de dar nome a um número, no próprio
Excel utilizamos os Enumeration, que são listas com item que representam um valor numérico, a Função
SUBTOTAL, por exemplo, utiliza uma lista Enumeration.

No VBA temos Enumeration no método MsgBox, no argumento referente ao tipo de botão que será
utilizado.

Fone: 4121-6166 Reprodução Proibida Pag.: 191


VBA para Excel

A lista Enumeration, deve ser criada no topo do módulo, antes das variáveis e métodos. Para criar uma
lista Enumeration iniciamos com a chabe Enum, seguida pelo nome que deseja para a lista, será
necessário fechar o bloco com um End Enum e no meio do bloco deve ser criado a lista com o valor
numérico referente a cada item. Deve criar um item por linha.

Segue abaixo como será criado no código.

Será criado uma lista Enumeration para representar os operadores conforme acima. Quando for
necessário passar um argumento do tipo Enumeration, pode ser informado seu nome ou número
referente.

Agora para criar o método, basta passar qual tipo de Operador ele deverá calcular e os 2 valores, e
dentro será de responsabilidade do método calcular dependendo do argumento passado.

É criado uma variável do tipo Double que irá receber o resultado da operação, dependendo do tipo de
operação, o método é responsável pelo calculo, depois devolve o resultado do cálculo.

Nos eventos clique de cada botão iremos passar o tipo de operação e os 2 valores para calculo, e
resultado será armazenado no controle Resultado.

Pag.: 192 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Em cada evento, será chamado a função ExecutarOperacao, passando os argumentos o tipo de


paramentro, e os controles TxtValo1 e TxtValor2 com a instrução VAL().

Alterando Propriedades pelo código

Muitas vezes são necessárias alterações de propriedades dos controles em tempo de execução, ou seja,
enquanto o formulário é executado. Para isso precisamos alterar as propriedades através do código.

Vamos criar um formulário que altere algumas propriedades dinamicamente em tempo de execução.

Iremos utilizar alguns controles novos nesse exemplo como o ScrollBar e o Image.

Vamos criar um formulário igual ao exemplo abaixo:

Esse formulário tem como objetivo misturar as cores conforme alteramos o valor do ScrollBar, e nos
Label de cada ScrollBar, será exibido o valor do respectivo ScrollBar e alterado a cor somente em sua
tonalidade.

Para isso precisamos dos seguintes controles com suas propriedades.

Fone: 4121-6166 Reprodução Proibida Pag.: 193


VBA para Excel

CONTROLE PROPRIEDADE VALOR

Label1 Caption Vermelho

Label1 Font: Tamanho 12

Label1 ForeColor &H000000FF&

Label2 Caption Verde

Label2 Font: Tamanho 12

Label2 ForeColor &H0000C000&

Label3 Caption Azul

Label3 Font: Tamanho 12

Label3 ForeColor &H00C00000&

Label4 (Name) LblVermelho

Label4 Caption 0

Label4 Font: Tamanho 14

Label4 ForeColor &H0000FFFF&

Label4 BackColor &H00000000&

Label4 TextAlign 2 - fmTextAlignCenter

Label5 (Name) LblVerde

Label5 Caption 0

Label5 Font: Tamanho 14

Label5 ForeColor &H0000FFFF&

Label5 BackColor &H00000000&

Label5 TextAlign 2 - fmTextAlignCenter

Label6 (Name) LblAzul

Label6 Caption 0

Label6 Font: Tamanho 14

Label6 ForeColor &H0000FFFF&

Label6 BackColor &H00000000&

Label6 TextAlign 2 - fmTextAlignCenter

ScrollBar1 (Name) ScbVermelho

ScrollBar1 Max 255

Pag.: 194 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

ScrollBar2 (Name) ScbVerde

ScrollBar2 Max 255

ScrollBar3 (Name) ScbAzul

ScrollBar3 Max 255

Image (Name) ImgCores

Image BackColor &H00000000&

UserForm (Name) FrmCores

UserForm Caption Cores

Nesse formulário iremos fazer uma mistura com referencia aos comandos dos Eventos, iremos criar um
método que todos os eventos irão chamar, porém cada evento também terão seus próprios comandos.

Primeiro iremos criar o método que todos os eventos irão utilizar.

Nesse método, será atribuído ao controle ImgCores, na propriedade BackColor, o resultado do método
RGB, que recebe valores de 0 até 255 dos argumentos Vermelho, Verde e Azul, com isso o método
realiza o calculo e retorna um valor referente a mistura dessas cores.

Agora iremos criar os eventos de cada ScrollBar. Esse controle contém o evento padrão Change, que é
executado quando alterado o valor do ScrollBar.

Em cada evento, ele primeiro altera os valores de sua respectiva Label e depois chama o método
MisturarCores, que irá alterar a cor do controle ImgCores.
LblVermelho.Caption = ScbVermelho.Value

Fone: 4121-6166 Reprodução Proibida Pag.: 195


VBA para Excel

Nessa primeira linha o controle Label LblVermelho recebe o valor do ScrollBar ScbVermelho.
LblVermelho.BackColor = RGB(ScbVermelho.Value, 0, 0)

Nesse segunda linha o controle Label LblVermelho, a propriedade BackColor, recebe da propriedade
RGB somente alterações da cor Vermelha. Podemos notar que os argumentos referente ao Verde e o
Azul, estão com valor “0”.

Opções (OptionButton e CheckBox)


Em alguns momentos o cliente deseja escolher algumas opções, para isso iremos criar um formulário
que irá simular a cobrança de entrada de um estabeleciomento, onde teremos algumas regras para
cobrança.

Será informado um valor de entrada por padrão, mas esse valor poderá ser modificado.

Se for uma mulher, terá um desconto de 10% sobre a entrada.

Caso escolha a área VIP, terá um acréscimo de 50% do valor da entrada. No case de mulher, será
acrescido 50% sobre o valor já com o desconto.

Se for no período Noturno, será proibido a entrada de menores. Deverá apresentar uma mensagem com
as cores em vermelho.

Para isso iremos criar um formulário conforme abaixo.

Pag.: 196 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Algumas opções já vem pré-definidas, mas poderão ser alteradas, e para exibir o valor, ou a mensagem,
deverá clicar no botão Calcular.

Vamos precisar dos seguintes controles:

CONTROLE PROPRIEDADE VALOR

Frame1 Caption Entrada

TextBox1 (Name) TxtEntrada

TextBox1 Text 100,00

CheckBox1 (Name) CkbVip

CheckBox1 Caption VIP

OptionButton1 (Name) OptHomem

OptionButton1 Caption Homem

OptionButton1 Value True

OptionButton2 (Name) OptMulher

OptionButton2 Caption Mulher

Frame2 Caption Período

Label1 Caption Entrada:

Label2 Caption Idade:

TextBox2 (Name) TxtIdade

TextBox2 Locked True

TextBox2 Text 18

TextBox2 TextAlign 2 – TextAlignCenter

Fone: 4121-6166 Reprodução Proibida Pag.: 197


VBA para Excel

SpinButton1 (Name) SbpIdade

SpinButton1 Min 14

SpinButton1 Value 18

OptinButton3 (Name) OptMatine

OptinButton4 (Name) OptNoturno

OptinButton4 Value True

UserForm (Name) FrmPagamento

Label3 (Name) LblMensagem

Label3 Caption Entrada: R$ 100,00

Label3 BackColor &H0080FFFF&

Label3 Font (Tamanho) 16

CommandButton1 (Name) BtnCalcular

CommandButton1 Caption Calcular

CommandButton2 (Name) BtnFechar

CommandButton2 Caption Fechar

Começando com o código do botão Fechar. Vamos dar um duplo clique no botão para gerar o evento
Click, porém desta vez o comportamento de fechar o formulário será um pouco diferente. Será possível
fechar o formulário somente pelo botão Fechar, o botão “X” do próprio formulário será desativado.

Primeiro iremos para o eveto Click do botão.

Agora, iremos codificar o evento QueryClose do formulário.

Nesse métodos, caso o CloseMode seja “0” (zero), significa que o formulário foi fechado pelo botão “X”
do formulário ou pelo atalho Ctrl+F4.

Pag.: 198 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Depois definir que o campo TxtEntrada receba somente números ou vírgula. Será feito no evento
KeyPress.

Caso a tecla digitada, com o cursor dentro do campo, será um número (intervalo ASCII entre 47 e 58) ou
uma vírgula (código ASCII 44), ele irá aceita, senão irá retorna um ASCII 0, que significa vazil.

Anter que criar o método principal, executado pelo botão BtnCalcular, iremos executar o comando do
botão SpbIdade, que irá modificar o valor do campo TxtIdade. Para esse compando iremos utilizar o
evento Change do controle SpinButton.

Nesse comando o controle TxtIdade, na propriedade Value, recebe o valor do botão SpbIdade, também
da propriedade Value.

Agora que já criamos todos os métodos menores do formulário, iremos para o método principal.

Vamos analisar o código.

No inicio do método, logo após o comentário, será realizado a verificação se o período é Noturno e se a
pessoa é menor de idade, caso a verificação seja positiva, ou seja, é noturno a pessoa é menor de idade,
será exibido a mensagem, o texto ficará da cor vermelha do controle LblMensagem e sairá do método,
pois não há necessidade de continuar executando os demais códigos.

Fone: 4121-6166 Reprodução Proibida Pag.: 199


VBA para Excel

Caso o fluxo da validação esteja ok, dará sequencia nos demais passos.

A seguir será criado uma variável que irá receber o valor do campo TxtEntrada, que será convertido para
o tipo Double.

Depois o a cor do texto do controle LblMensagem ficará preta, pois caso em algum momento a
validação deixou ela vermelha, deverá voltar a cor preta.

Em seguida será analisado se foi selecionado a opção Mulher. Caso sim data um desconto de 10%.

Depois se foi selecionado área VIP, caso afirmativo, terá um acréscimo de 50%.

Pra finalizar, no controle LblMensagem, será exibido a mensagem com o valor total da entrada, onde o
a variável é formatada para ficar com da forma monetária.

Formulário de Cadastro
Uma das principais funções de um formulário é para gravar e visualizar informações de uma forma mais
rápido e fácil, assim como são nos sistema corporativos, ERP, CRM, Sistemas Financeiros, de RH,
Contábeis, etc.

Com o VBA no Excel, podemos utilizar as próprias planilhas para simular um banco de dados, como
existem diversas outras formas também para trabalhar com cadastro.

Esse próximo exemplo iramos criar um formulário e gravar seus dados em memória, uma variável Array,
ou seja, só será visível enquanto o formulário estiver aberto.

Também será possível copiar essa base de dados para a planilhas.

Existem várias formar de cadastrar e recuperar dados de uma planilha, e iremos trabalhar com uma
técnica bem eficiente e simples.

Primeiro vamos criar um formulário parecido com o abaixo.

CONTROLE PROPRIEDADE VALOR

Label1 Caption Nome:

Label2 (Name) LblRegistros

Pag.: 200 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Label2 Caption 1/?

Label2 Fonte.Tamanho 16

Label2 TextAlign 2 – fmTextAlingCenter

TextBox (Name) TxtNome

TextBox MaxLength 50

CommandButton1 (Name) BtnCopiar

CommandButton1 Caption Copiar para planilha

CommandButton2 (Name) BtnFechar

CommandButton2 Caption Fechar

CommandButton3 (Name) BtnPrimeiro

CommandButton3 Caption <<

CommandButton4 (Name) BtnVoltar

CommandButton4 Caption <

CommandButton5 (Name) BtnProximo

CommandButton5 Caption >

CommandButton6 (Name) BtnUltimo

CommandButton6 Caption >>

UserForm (Name) FrmCadastro

UserForm Caption Cadastro de Nomes

Nesse formulário iremos trabalhar com variáveis de Módulo, onde teremos 3 variáveis que todos os
métodos irão compartilhar

Variáveis

• nomes(): Um array de String que serão armazenados os dados. Não iremos definir o
tamanho do array na criação, faremos de forma dinâmica quando iniciar o formulário
• i: Variável que irá representar o índice do Array.
• t: Variável que irá representar o tamanho total do índice do array de dados, quantos
registros ele poderá armazenar.
Também iremos utilizar um Enumerador “Enum”, para chamar o método que ficará encarregado de
armazenar os dados e exibir no formulário.

Começando com o Enum e as variáveis.

Fone: 4121-6166 Reprodução Proibida Pag.: 201


VBA para Excel

Primeiro iremos criar um método que preenche o controle LblRegistros.

Com as variáveis prontas, vamos inicializar o formulário, nele através de um InputBox vamos atribuir um
valor à variável t, com o tamanho que desejamos o array nomes(), depois iremos redefinir o tamanho do
array (ReDim) que irá do índice 1 até o tamanho de t.

Pra finalizar iremos chamar o método ExibirRegistros para preencher o controle LblRegistro.

Esse processo será executado no método Initialize do UserForm.

Agora precisamos de mais 1 método, para salvar os dados e exibir.

Pag.: 202 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Esse método, NavegarRegistros, recebe um argumento do tipo Navegadores, que é o Enum que
criamos acima. Com esse argumento o método irá tomar as decisões de qual ação será executada.

Ele preenche a variável i,que representa o índice de nosso Array.

Primeiro será gravado no array da posição atual do i, o valor que está no controle TxtNomes.

Depois, dependendo da ação informada no parâmetro, será tomado uma decisão de qual ação executar.

Para retornar ao Primeiro registro, i será igual a 1, que é o primairo índice do array.

Para Voltar 1 registro, será decrementado 1 do valor de i, desde que ele seja maior que 1, ou seja,
poderá ser decrementado até chegar ao valor 1.

Para o Próximo registro, será acrescentado 1 à variável i, desde que ele seja menor que o valor da
variável t, ou seja, poderá chegar no máximo até o valor de t.

E para o Último registro, o valor de i será igual ao valor de t, que é o índice máximo do array.

No final será exibido no controle TxtNomes, o valor que se encontroa no array da posição i, lembrando
que agora o valor de i foi alterado. Caso fique em branco, significa que o array na posição de i encontra-
se vazio.

Também será tratado o formulário ao fechar, onde será exibido uma mensagem se realmente deseja
fechar. Esse tratamento será realizado no evento QueryClose do UserForm.

E o botão fechar que irá chamar o método de fechar o formulário, mas lembrando que antes de fechar
ele irá passar pelo evento QueryClose.

Agora iremos executar os comandos dos botões, e como veremos, todos irão utilizar o mesmo método,
passando como argumento um valor do Enum.

Fone: 4121-6166 Reprodução Proibida Pag.: 203


VBA para Excel

Pra finalizar, vamos chamar o botão BtnCopiar.

No botão copiar, faremos um loop (For ... Next) onde iremos pegar todos os dados do array nomes e
copiar para a planilha local, a partir da célula A1 até o total de registros.

Código Completo:

Option Explicit

Enum Navegadores
Primeiro = 1
Voltar = 2
Proximo = 3
Ultimo = 4
End Enum

Dim nomes() As String


Private i As Integer ' Índice
Private t As Integer ' Total de registros

Private Sub BtnCopiar_Click()


Dim linha As Integer

For linha = 1 To t
Range("A" & linha).Value = nomes(linha)
Pag.: 204 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Next
End Sub

Private Sub BtnFechar_Click()


Unload Me
End Sub

Private Sub BtnPrimeiro_Click()


NavegarRegistros Primeiro
End Sub

Private Sub BtnProximo_Click()


NavegarRegistros Proximo
End Sub

Private Sub BtnUltimo_Click()


NavegarRegistros Ultimo
End Sub

Private Sub BtnVoltar_Click()


NavegarRegistros Voltar
End Sub

Private Sub UserForm_Initialize()


t = InputBox("Quantos nomes deseja registrar?", "Total de registros")
i = 1

ReDim nomes(1 To t) As String


ExibirRegistros
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)


If MsgBox("Deseja fechar o formulário?", vbYesNo, "Fechar") = vbNo Then
Cancel = 1
End If
End Sub

Private Sub NavegarRegistros(navegador As Navegadores)


nomes(i) = TxtNome.Value

Select Case navegador


Case Primeiro
i = 1
Case Voltar
If i > 1 Then i = i - 1
Case Proximo
If i < t Then i = i + 1
Case Ultimo
i = t
End Select

TxtNome.Value = nomes(i)
ExibirRegistros
End Sub

Private Sub ExibirRegistros()

Fone: 4121-6166 Reprodução Proibida Pag.: 205


VBA para Excel

LblRegistros.Caption = i & "/" & t


End Sub

Pag.: 206 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Projeto Final

Agora iremos criar nosso projeto final do curso. Vamos criar um sistema de cadastro de Clientes e
Fornecedores, onde teremos 2 formulários de cadastro, uma tela de login para autenticação do usuário,
além de uma faixa de opções personalizada ao projeto.

O projeto também terá 3 planilhas, sendo 2 que irão trabalhar como uma base de dados e 1 que será a
Capa do sistema.

Todo o projeto será customizado com relação a nomes de objetos e segurança.

Iremos utilizar algumas imagens no projeto que estarão disponíveis no material do aluno, ou se
desejarem podem utilizar outras imagens buscada na internet.

Todos os controles e códigos do projeto serão comentados e descritos um passo a passo nessse
material, também terá um demo do projeto no material de apoio ao aluno.

Todas as senha que serão gravadas no projeto para esse documento, serão sempre, por padrão, 1234.

Vamos começar com os requisitos do projeto.

Resumo do Sistema:
O sistema permitirá, através de formulários, o cadastro e consulta aos clientes e fornecedores.

Os formulários terão os campos básicos com mascaram quando necessário.

O formulário terá uma grid de dados onde o usuário poderá selecionar o Cliente/Fornecedore que
deseja visualizar nos campos, depois podendo editá-lo.

Também terá disponível uma busca através do código do Cliente/Fornecedor.

Requisitos:

Cadastro de Clientes
O comportamento normal do formulário ao iniciar será de trazer todos os campos bloqueados e
somente alguns botões desbloqueados

O formulário de cadastro de clientes deverá conter 6 botões em uma barra de ferramentas que serão
eles:

Adicionar Adicionar um novo registro.

Fone: 4121-6166 Reprodução Proibida Pag.: 207


VBA para Excel

• Deverá iniciar desbloqueado.


• Ao clicar, os campos deverão ser desbloqueados e limpos para que seja
efetuado um novo cadastro.
• Deverá desbloquear também os botões de Desfazer e Salvar.
• Deverá bloquear ele mesmo além do botão Editar.

Editar Editar um registro existente

• Deverá iniciar desbloqueado


• Ao clicar, os campos deverão ser desbloqueados e os registro que
estiverem no campo devem permanecer para que possam ser editados.
• Deverá desbloquear também os botões de Desfazer e Salvar.
• Deverá bloquear ele mesmo além do botão Adicionar.

Desfazer Desfazer alguma alteração iniciada.

• Deverá iniciar bloqueado


• Quando estiver cadastrando um novo registro, ou editando algum
existente, o botão Desfazer estará disponível para que possa “Cancelar” a
alteração. Ele ignora o que foi alterado.
• Deverá desbloquear também os botões de Adicionar e Editar.
• Deverá bloquear ele mesmo além do botão Salvar.

Salvar Desfazer salvar novos registros ou registros editados.

• Deverá iniciar bloqueado


• Quando estiver cadastrando um novo registro, ou editando algum
existente, o botão irá gravar os dados na planilha de Cadastro de Clientes.
• Deverá desbloquear também os botões de Adicionar e Editar.
• Deverá bloquear ele mesmo além do botão Desfazer.

Deletar Deleta um registro existente e selecionado.

• Deverá iniciar desbloqueado


• Quando algum registro for selecionada, será possível deletá-lo, mas anter
aparecerá uma mensagem perguntando se realmente deseja deletar o
registro.

Fechar Fecha o formulário

Desfazer alguma alteração iniciada.

• Deverá fechar o formulário, mas anter irá perguntar se realmente deseja


fechar.

Os campos necessário para o cadastro

Pag.: 208 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Código Código automático para identificar o cliente.

O campo estará bloqueado para alteração pois será preenchido


automaticamente.

Ele também será utilizado para buscar clientes pelo código

Nome Razão Social ou Nome Fantasia do cliente.

Tamanho máximo de 50 caracteres

CNPJ CNPJ do Cliente.

Terá uma máscara de CNPJ que será preenchida ao digitar o CNPJ.

Deverá aceitar somente números

Tamanho máximo de 18 caracteres

Responsável Nome de um responsável

Tamanho máximo 50 caracteres

Telefone Telefone do cliente

Terá uma máscara de telefone celular com DDD

O formato será realizado durante a digitação

Deverá aceitar somente números

Ativo Informa se o cliente está ativo ou desativado

Campo booleano (Checkbox)

Também terá uma Grid com todos os clientes cadastros, que ao selecionar um registro, o mesmo será
preenchido nos campos do cadastro.

Vamos começar criando um arquivo novo e salvando como Projeto Final VBA.xlsm.

Agora nosso arquivo precisa de 3 planilhas que serão elas

Painel Será a capa de rosto do nosso sistema

Cadastro de Clientes Base para armazenar os registros de clientes

Cadastro de Fornecedores Base para armazenar os registros de fornecedores

Fone: 4121-6166 Reprodução Proibida Pag.: 209


VBA para Excel

O Painel de apresentação, iremos inserir algumas imagens, que estarão disponível no material do aluno,
mas poderão ser alteradas pois não há impacto no sistema.

Também adicionaremos um título e a versão do sistema.

Podemos ocultar as Linhas de Grades, Titulos e Barra de Fórmulas.

O Painel ficará da seguinte forma.

Agora na planilha Cadastro de Clientes, iremos adicionar o cabeçalho de nossa base de dados, que serão
os campos dos nossos registros, conforme abaixo.

A planilha de Cadastro de Fornecedores terá os mesmos campos de Cadastro de Clientes, e ficará da


seguinte forma.

Pag.: 210 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Agora vamos configurar nosso projeto VBA. Iremos no VBE, no menu Ferramentas/Propriedades de
VBAProject.

Na janela de propriedades, vamos alterar o nome do projeto para ProjetoVBA, a descrição do projeto
para Projeto final de cadastro com VBA.

Na guia Proteção, vamos selecionar a opção Bloquear projeto para exibição, e inserir uma Senha depois
Confirmar senha. A senha padrão para o projeto será “1234”.

Fone: 4121-6166 Reprodução Proibida Pag.: 211


VBA para Excel

Agora iremos renomear os Objetos do Excel na barra de Projet Explorer. Para os objetos vamos adotar
um padrão que, o início do nome será o tipo do objeto, seguido por um nome intuitivo, exemplo um
TextBox que irá receber um nome será TxtNome.

O objeto da pasta de trabalho será renomeado para PasProjeto.

As planilhas ficarão PlCadClientes, PlCadFornecedores e PlPainel.

Lembrando que para alterar os nomes, basta selecionar o objeto e alterar na janela de Propriedades.

Pag.: 212 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Agora já deixaremos criados os objetos que iremos trabalhar no projeto que serão 3 UserForms e 1
Módulo, já podemos alterar os nomes conforme imagem abaixo.

Pronto, agora estamos prontos para começar a criar o formulário de cadastro de clientes. Vamos criar
um formulário igual ao mostrado abaixo.

Fone: 4121-6166 Reprodução Proibida Pag.: 213


VBA para Excel

Vamos descrever cada uma das partes do formulário e informar os controles e propriedades.

Formulário
CONTROLE PROPRIEDADE VALOR

UserForm (Name) FrmCadClientes

UserForm Caption Formulário de cadastro de Clientes

UserForm BackColor &H00FFFFFF&

Título do formulário

O título do formulário será criado com um objeto Label

CONTROLE PROPRIEDADE VALOR

Label1 Caption Cadastro de Clientes

Label1 BackColor &H8000000D&

Label1 Font.Tamanho 18

Label1 Font.Estilo da fonte Negrito

Label1 ForeColor &H00FFFFFF&

Label1 TextAlign 2 – fmTextAlignCenter

A Label deverá ser posicionada no topo do formulário e redimensionada com que ocupe toda a estenção
horizontal do formulário.
Barra de ferramentas

Pag.: 214 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

IMAGEM CONTROLE PROPRIEDADE VALOR

Frame (Name) FrBotoes

Frame Caption “Deixar em branco”

CommandButton (Name) BtnAdicionar

CommandButton Caption Adicionar

CommandButton Picture Selecionar uma imagem.

CommandButton (Name) BtnEditar

CommandButton Caption Editar

CommandButton Picture Selecionar uma imagem.

CommandButton (Name) BtnDesfazer

CommandButton Caption Desfazer

CommandButton Picture Selecionar uma imagem.

CommandButton (Name) BtnDeletar

CommandButton Caption Deletar

CommandButton Picture Selecionar uma imagem.

CommandButton (Name) BtnSalvar

CommandButton Caption Salvar

CommandButton Picture Selecionar uma imagem.

CommandButton (Name) BtnFechar

CommandButton Caption Fechar

CommandButton Picture Selecionar uma imagem.

Campos

Fone: 4121-6166 Reprodução Proibida Pag.: 215


VBA para Excel

CONTROLE PROPRIEDADE VALOR

Frame (Name) FrDados

Frame Caption Dados

Frame Font.Estilo da fonte Negrito

Label1 Caption Código:

Label2 Caption Nome:

Label3 Caption CNPJ:

Label4 Caption Responsável:

Label5 Caption Telefone:

TextBox1 (Name) TxtCodigo

TextBox1 Locked True

TextBox1 TextAlign 2 – fmTextAlignCenter

TextBox2 (Name) TxtNome

TextBox2 MaxLength 50

TextBox3 (Name) TxtCnpj

TextBox3 MaxLength 18

TextBox3 Tag c

TextBox4 (Name) TxtResponsavel

TextBox4 MaxLength 30

TextBox5 (Name) TxtTelefone

TextBox5 Tag t

TextBox5 MaxLength 16

CheckBox (Name) CkbAtivo

CommandButton (Name) BtnPesquisar

CommandButton Picture Selecionar uma imagem.

Grid (Tabela)

Pra finalizar vamos criar nossa Grid para visualizar os dados já cadastrados.
Inicialmente nossa grade não irá exibir o cabeçalho, isso faremos no decorrer do projeto.

Pag.: 216 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

CONTROLE PROPRIEDADE VALOR

ListBox (Name) LbxRegistro

ListBox BackColor &H00C0FFFF&

Com o Formulário criado, vamos iniciar a codificação.


Iremos iniciar com os métodos que serão utilizados pelos formulários, serão métodos genéricos, ou seja,
o mesmo método poderá ser utilizado por ambos os formulários.

Módulo
Vamos abrir o módulo que criamos (ModCadastros).
Para dar uma cara mais profissional, vamos adicionar uma nota no cabeçalho do módulo.

Iremos utilizar algumas constantes em ambos os formulários, então iremos criar no próprio módulo

Essas constantes serão utilizadas para inserir as máscaras nos campos CNPJ e Telefone.
O próximo método será utilizado para retornar a última linha com registro em uma planilha

Fone: 4121-6166 Reprodução Proibida Pag.: 217


VBA para Excel

Para isso vamos precisar de um argumento do tipo Worksheet, dentro do método utilizamos uma
função do próprio Excel (WorksheetFunction.CountA) que se refere a função CONT.VALORES. Ela irá
retornar quantos linhas estão com algum valor na coluna “A”, que representa o Código, um campo
obrigatório. O argumento planilha, será utilizado para informar que será nessa planilha específica que
será contado os registros.
O próximo método é bem parecido com o anterior, porém ele retorna o número referente a próxima
linha disponível, ou seja, um após o ultimo registro.

Esse método também precisa informar um argumento do tipo Worksheet, e como podemos ver, ele irá
chamar o método anterior, RetornaUltimaLinha(), e adiciona 1 ao resultado para depois retornar a
função.
Agora precisamos de um método para Gerar um código automático para nossos cadastros.

Esse método também precisa de um argumento do tipo Worksheet, pois ele irá analisar qual o próximo
código da planilha informada.
Ele também chama o método RetornaUltimaLinha, para saber o valor do ultimo código inserido

Pag.: 218 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Com a informação da ultima linha, podemos ver que será analisado se o valor que está na coluna “A”, da
última linha de código, é do tipo numérico, pois caso não seja numérico, significa que o valor refere-se
ao cabeçalho, pois ainda não existe nenhum registro cadastrado, nesse caso o código será 1, senão, se o
valor for numérico, então será acrescentado 1 ao valor do código do último registro.

Agora um método que utilizamos em outros exemplos, para aceitar somente número em um campo.
Esse método será utilizado nos campos Telefone e CNPJ de ambos os formulários.

Caso a telha digitada estiver fora do intervalo do código ASCII que representa os número, então
retornará “0” que significa vazio.
O próximo método será utilizado nos campos de cadastro, para de uma forma genérica percorrermos
todos os controles de cadastro para limpar os valores deles.

Esse método, iremos informar um controle que é do tipo container. O que seria um container.
Os controles do tipo container são todos aqueles que podem armazenar outros controles dentro, por
exemplo o próprio UserForm, os Frames, os Multi-Pages, os TabStrip, ou seja, todos os controles que
podem adicionar armazenas outros controles.
No método acima, podemos informar tanto o UserForm ou o Frame que contém os campos de cadastro,
que será o melhor para esse exemplo, pois ficará com uma performance melhor.
Vamos entender como funciona.
Vamos receber pelo argumento um container, depois criamos uma variável do tipo Object para utilizar
no Loop. Para isso iremos utilizar o For Each, que irá percorrer todos os controles dentro do container
indicado, e caso seja do tipo TextBox, ele ira analisar a propriedade Tag dos controle, por esse motivo
nos controles de CNPJ e de Telefone foram alterados a propriedade Tag.

Fone: 4121-6166 Reprodução Proibida Pag.: 219


VBA para Excel

Quando ele encontrar uma Tag vazia, que é o padrão dos controles, ele irá alterar a propriedade Value
do controle para Empty, que significa vazio. Agora se a Tag for “c” então a propriedade Value recebe a
constante FORMA_CNPJ, que contém o formato de um CNPJ. Já se a Tag for um “t”, então ele recebe a
constante FORMA_TELEFONE, que contém o formato de um Telefone. Agora se o controle for do tipo
CheckBox, então a propriedade Valor irá receber um valor False.
O próximo método será parecido com o de limpar os campos, porém ele irá habilitar ou bloquear os
campos.

Esse método também ira utilizar um container para percorrer os controles, ele não fara tratará de forma
diferente os TextBox e os CheckBox, pois eles serão modificados a mesma propriedade com o mesmo
valor. Se ele será habilitado ou bloqueado, será passado pelo argumento habilitado que é do tipo
Boolean, que será utilizado na propriedade Enabled do controle.
Porque é necessário verificar se é do tipo TextBox ou CheckBox? Dentro do Frame de dados, existe
também os controles Label que não é necessário limpar ou mesmo bloquear nos métodos acima, e caso
seja informado o UserForm como container, para não correr o risco de limpar ou bloquear todos os
controles dentro do formulário.
Também iremos precisar de um método que localiza em qual linha está um determinado código, para
que possamos realizar buscar.

Esse método utiliza uma função CORRESP do Excel em toda a coluna “A”, procurando o código
informado por argumento e retorna a linha encontrada. Também utilizamos um tratamento de erros,
pois se for informado um código que ele não encontre será gerado um erro. Então será retornado 0 e
tratamos depois informando que não foi encontrado.
O último método que precisamos no Módulo será para preencher as Grids (Listas) dos formulários.

Pag.: 220 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Esse método recebe como argumento uma variável do tipo Object que será o objeto ListBox de nosso
formulário. Também terá um argumento Worksheet.
O método irá preencher 3 propriedades do controle ListBox, são eles.
RowSource O endereço que estão os dados. Será necessário informar o caminho
completo do intervalo, inclusive o nome da planilha. Ex.:
'Planilha1'!A2:D10.
Será somente o intervalo de dados, não será infomado a linha do
cabeçalho.
ColumnCount Quantidade de colunas que serão exibidas na lista
ColumnHeads Se irá exibir o cabeçalho.
Quando é utilizado essa propriedade, ele sempre utiliza a linha
acima dos dados informados com os dados para o cabeçalho. Se o
intervalo de dados é de A2:D10, será utilizado o intervalo de A1:D1
como o cabeçalho. Se o intervalo de dados for de A1:D10, como não
existe linha antes da linha 1, ele irá criar um cabeçalho como
“Coluna1”, “Coluna2”, “Coluna3”, etc.

No método, para conseguir o endereço dos intervalos de dados, primeiro será utilizado o método
RetornaUltimaLinha para conseguir qual o ultimo registro.
Em uma variável do tipo String, será recebido o seguinte valor. Apóstrofo entre aspas concatenando
com o nome da planilha, depois concatena com o fechamento do apóstrofo mais uma exclamação
seguido pelo inicio de intervalo A2:D, e concatenando com o total de linhas com registros.
O resultado ficará algo parecido com
'Cadastro de Clientes'!A2:D10
Sempre iremos utilizar o cabeçalho com a linha 1, por esse motivo inicia com “A2”, e iremos exibir
apenas 4 colunas, por isso irá apenas até a coluna “D”.

Fone: 4121-6166 Reprodução Proibida Pag.: 221


VBA para Excel

Código completo
Option Explicit

' #########################################################
'
' MÓDULO COM MÉTODOS DE CADASTRO
'
' Descrição: Módulo contendo métodos genéricos que
' serão utilizados pelos formulários de cadastro
' Desenvolvedor: Claudio Fernando Scatolin
' Data: 01/02/2020
'
' #########################################################

' Constantes
Public Const FORMA_CNPJ As String = "__.___.___/____-__"
Public Const FORMA_TELEFONE As String = "(__) _ ____-____"

' Retornar ultima linha de registro cadastrado


Public Function RetornaUltimaLinha(planilha As Worksheet) As Long
Dim linha As Long

linha = WorksheetFunction.CountA(planilha.Range("A:A"))

RetornaUltimaLinha = linha
End Function

' Retorna próxima linha para registro para cadastro


Public Function RetornaProximaLinha(planilha As Worksheet) As Long
Dim linha As Long

linha = RetornaUltimaLinha(planilha) + 1

RetornaProximaLinha = linha
End Function

' Numeração de código automático


Public Function GerarCodigo(planilha As Worksheet)
Dim linha As Long
Dim codigo As Long

linha = RetornaUltimaLinha(planilha)

With planilha
If IsNumeric(.Range("A" & linha).Value) Then
codigo = .Range("A" & linha).Value + 1
Else
codigo = 1
End If
End With

GerarCodigo = codigo
End Function

Pag.: 222 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

' Somente números


Public Sub SomenteNumeros(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

' Limpar campos


Public Sub LimparCampos(controles As Object)
Dim ctr As Object

For Each ctr In controles.Controls


Select Case TypeName(ctr)
Case "TextBox"
If ctr.Tag = "" Then
ctr.Value = Empty
ElseIf ctr.Tag = "c" Then
ctr.Value = FORMA_CNPJ
ElseIf ctr.Tag = "t" Then
ctr.Value = FORMA_TELEFONE
End If
Case "CheckBox"
ctr.Value = False
End Select
Next
End Sub

' Habilitar e desabilitar campos


Public Sub HabilitarCampos(controles As Object, habilitado As Boolean)
Dim ctr As Object

For Each ctr In controles.Controls


Select Case TypeName(ctr)
Case "TextBox", "CheckBox"
ctr.Enabled = habilitado
End Select
Next
End Sub

' Preencher lista de dados


Public Sub PreencherLista(lista As Object, planilha As Worksheet)
Dim endereco As String
Dim linha As Long

linha = RetornaUltimaLinha(planilha)

' Definindo o endereço das células com dados


endereco = "'" & planilha.Name & "'!A2:D" & _
IIf(linha = 1, 2, linha)

With lista
.ColumnCount = 4 ' Quantidade de colunas exibidas
.ColumnHeads = True ' Exibir cabeçalho da tabela
.RowSource = endereco ' Intervalo de dados
End With
End Sub

' Localizar linha do código

Fone: 4121-6166 Reprodução Proibida Pag.: 223


VBA para Excel

Public Function LocalizarCodigo(planilha As Worksheet, _


codigo As Long) As Long

Dim linha As Long


On Error Resume Next

linha = WorksheetFunction.Match(codigo, planilha.Range("A:A"), 0)

If Err.Number > 0 Then linha = 0

LocalizarCodigo = linha
End Function

Eventos do Formulário
Agora que já temos os métodos que serão utilizados pelo formulário, vamos começar a codificar os
Eventos dos controles.
Também iremos criar uma documentação comentando o cabeçalho do Code-Behind (código por trás) do
Formulário.

O formulário também irá precisar de algumas variáveis exclusivas dele, então dentro do Code-Behind do
formulário iremos criar as variáveis.

Como essas variáveis são exclusivas do formulário, elas serão Private.


A variável estaEditando, é do tipo Boolean e será utilizada para desabilitar algumas funções quando
estiver realizando um novo cadastro ou editando algum registro, para não dar problemas de modificar
dados de outro cliente.
A variável linha, do tipo Long, irá representar as linhas de registro da planilha de base de dados.
Pag.: 224 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

E a variável planilha, será para representar a planilha que iremos trabalhar, nesse caso a PlCadClientes
(Cadastro de Clientes).
Antes de iniciar a codificar os Eventos do botões, vamos inserir os eventos que definem os
comportamentos dos controles TxtCnpj e TxtTelefone.
Começando com o TxtCnpj, primeiro vamos trabalhar com a máscara do controle. O comportamento
será, ele sempre irá iniciar com o formato do CNPJ, e quando ele receber o foco, ou seja, o cursos
posicionar entro do controle, se estiver apenas com o formato do CNPJ, ele deverá ficar vazio, para que
possa receber algum valor digitado. Para isso utilizamos o Evento Enter.

Em seguinda, quando o controle perder o foco, ou seja, o cursor sair do controle, será analisado se ele
está vazio ou tem algum valor. Caso esteja vazio, ele irá retornar com o formato do CNPJ, senão ele irá
formatar os números para que fiquem com a máscara do CNPJ. Esse comportamento será ativado no
Evento Exit.

E não podemos esquecer que esse controle só deverá receber números, então no evento KeyPress
devemos bloquear outro tipo de caracter.

E para que, assim que digitarmos os valores, já será preenchido automaticamente os pontos “.” e o
hífem “-“, devemos utilizar o seguinte procedimento no Evento KeyUp.

A propriedade SelStart, dos controles TextBox são propriedade que indicam qual a posição do cursor no
momento da digitação, e a propriedade SelText, é para inserir um texto exatamente na posição que o
cursor está no momento. Exemplo no método acima, quando o cursos está na posição 2 ou na posição
6, ele irá inserir um ponto “.” na posição atual, ou seja, após digitar 2 números, ele irá inserir um ponto
“22.”, depois quando digitar mais 3 números, juntando aos 2 primeiro e mais o ponto ele irá inserir mais
1 ponto na sétima posição “22.222.”.

Fone: 4121-6166 Reprodução Proibida Pag.: 225


VBA para Excel

Os mesmos Eventos utilizaremos no controle TxtTelefone.

No Evento KeyUp do controle TxtTelefone, vemos que tem uma pequena diferença no início, pois não
tem como ele analisar se é o primeiro digito pela propriedade SelStart, pois ele já está na posição. Nesse
caso utilizamos uma analise se o controle tem apenas 1 caracter e se esse caracter é um número, se der
verdadeiro, ele irá primeiro inserir um parêntese aberto, depois o valor que tem no TxtTelefone.
Exemplo, se inserido o número “1”, ele irá substituir para “(1”.
Porque também é analisado se o valor é um número, porque ele poderá ter apenas o parêntese como
caracter inicial, caso delete o número posterior a ele, nesse caso ele iria inserir mais 1 parêntese.
Agora iremos codificar os eventos do UserForm, que no projeto iremos utilizar o Initialize e o
QueryClose.

Pag.: 226 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Para inicializar o formulário, vamos começar iniciando a variável planilha referenciando qual planilha ela
deverá representar, nesse caso a PlCadClientes.
Em seguida iremos desabilitar todos os campos do Frame FrDados, utilizando o método
HabilitarCampos passando o parâmetro False.
Em seguida limpar os campos com o Método LimparCampos, isso também fará com que os campos
TxtTelefone e TxtCnpj fiquem com o formato correspondente a cada um.
Iniciamos a variável estaEditando como False, informando que o formulário não está sofrendo
alterações.
E para finalizar chamamos o método PreencherLista, para deixar o ListBox já formatado com o
cabeçalho e se tiver algum registro, será preenchido.
No evento QueryClose, será inserido a analise com a pergunta se realmente deseja fechar o formulário.

Caso clique em não, será cancelado o fechamento. Dessa forma a mensagem será solicitada tanto
quando clicar no botão Fechar quando ao clicar no “X” do formulário.
Pra finalizar os comportamentos referente ao formulário, vamos inserir o Evento do botão BtnFechar.

Simplesmente irá chamar o método Unload com o argumento Me, que significa que é o próprio
formulário.
Vamos começar a adicionar Eventos aos controles, e iremos começar com o botão Adicionar.

Esse controle irá chamar diversos métodos que já criamos. Vamos analisar linha a linha.

Fone: 4121-6166 Reprodução Proibida Pag.: 227


VBA para Excel

linha = RetornaProximaLinha(planilha) Variável linha recebe método RetornaPróximaLinha para


saber qual o número da próxima linha disponível na
planilha PlCadClientes.
estaEditando = True Passa a variável estaEditando para True, informando assim
que o formulário está sendo sofrendo alteração de dados.
LimparCampos FrDados O método LimparCampos com o paramentro o container
FrDados para limpar todos os campos do Frame.
HabilitarCampos FrDados, True O método HabilitarCampos, também informando o
container FrDados e o segundo argumento como True,
para assim habilitar todos os campos do Frame.
txtCodigo.Value = GerarCodigo(planilha) Atribuindo o resultado do método GerarCodigo para o
controle TxtCodigo.Value, assim recebendo o valor para o
próximo código.
txtNome.SetFocus Faz com que o cursor fique posicionado no controle Nome
do cliente, assim não será necessário selecioná-lo com o
mouse.

Após finalizar os códigos para o botão Adicionar, iremos adicionar o Evento do botão Salvar.

No Evento do botão Salvar, é adicionado cada a planilha em cada uma das colunas, o valor de cada um
dos controle correspondentes. Após inserir os valores será exibido uma mensagem informando que o
registro foi salvo, a variável estaEditando passará para False, pois nesse momento encerou-se as
alterações no formulário, o método HabilitarCampos irá desabilitar os campos, pois está com o
parâmetro False e é chamado o PreencherLista, para que a lista veja atualizada com o cadastro que
acabou de ser salvo.
Finalizando o botão Salvar, podemos ver o botão Desfazer, que seria uma função de cancelar as
alterações.

Pag.: 228 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

No desfazer, iremos simplemente falar que a variável estaEditando será False e chamar o método
HabilitarCampos para desabilitar os campos, pois quando cancelamos o formulário não estará mais em
estado de alteração.
Como já temos os arquivos salvos, precisamos de um método para Preencher os campos com os
registros que já temos na planilha.

Esse método é bem parecido com o Evento do botão Salvar, a diferença é que o salvar copia os valores
dos controle para a planilha e o método preencher copiamos da planilha para os controles.

Antes de chamar os Eventos dos botões Editar e Deletar, vamos inserir o Evento para o ListBox, pois
assim teremos registros selecionados para podermos Editar ou Deletar.

Esse evento atribui a variável linha o resultado da Função LocalizarCodigo, que busca em qual linha está
determinado código. Depois ele chama o método PreencherCampos mas somente se linha for maior
que 0.
Podemos ver que ele somente executa o procedimento se a variável estaEditando estiver como False,
pois se estiver como True, significa que o formulário está em estado de alteração então não poderá ser
alterado os registros até que seja finalizado.
Agora vamos para o Botão Editar. Ele será muito simple, o objetivo principal será debloquear os campos
preenchidos para que possa editá-lo.

Fone: 4121-6166 Reprodução Proibida Pag.: 229


VBA para Excel

O botão Editar simplemente informa que o formulário está em estado de alteração e habilita os campos
para poder alterá-los.
E para finalizar os eventos de botões, vamos criar o Evento para o botão Deletar.

O método primeiro pergunta se realmente deseja deletar o registro, caso positivo ele remove a linha
inteira da planilha referente ao registro, depois mostra uma mensagem informando que o registro foi
deletado.

Para finalizar os comportamentos do formulário, vamos criar a tarefa de busca. Esse processo será em 2
etapas.
Primeiro clicamos no botão Localizar, ele irá debloquear o campo Código e permitirá sua edição.

O segundo passo será após o campo Código perder o foco depois de ter digitado algum código que
deseja procurar, através de um Tab ou Enter.
Primeiro o campo Código só poderá aceiar números, portanto vamos utilizar o método
SomenteNumeros

Primeiro vamos criar o Evento do botão Localizar

Pag.: 230 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Ele simplemente limpar os campos, habilita o campo Código, desbloqueia para digitação e altera a cor,
depois recebe o Foco do cursor.

Agora no Evento Exit, vamos codificar a busca dos registros

Primeiro temos algumas codições, para ele realizar a busca o campo deve ter um número e ser diferente
de vazio.
Depois ele irá atribuir à variável linha o resultado da função LocalizarCodigo.
Agora irá confirmar se restornou algum valor maior que 0, o que significa que encontrou um registro,
dai irá preencher os campos. Senão irá limpar os campos e exibir uma mensagem informando que não
localizou o código.
Pra finalizar ele volta a bloquear o campo, desabilita e volta a cor original.

Fone: 4121-6166 Reprodução Proibida Pag.: 231


VBA para Excel

Pag.: 232 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Assim finalizamos o formulário de Cadastro de Clientes.

Cadastro de Fornecedores

Para o formulário de cadastro de fornecedores, vamos simplemente copiar e colar tudo.


Vamos criar um formulário em branco, com as propriedade de formulário iguais a do Cadastro de
Cliente, alterando apenas a propriedade Caption para “Cadastro de Fornecedores”.

O formulário poderá até ser maior no início, depois ajustamos o tamanho.


No Formulário de Cadastro de Clientes, iremos clicar com o botão direito do Mouse no Formulário e
escolher a opção Selecionar Tudo.

Fone: 4121-6166 Reprodução Proibida Pag.: 233


VBA para Excel

Os controles do formulário serão selecionado, então vão copiar com um Ctrl+c, ir até o formulário de
Cadastro de Fornecedores e colar Ctrl+v.

Agora iremos ajustar o tamanho do formulário com os controles, alterar as propriedades BackColor e
Caption do Label do cabeçalho do formulário. Ele ficará como a imagem abaixo.

Pag.: 234 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Agora precisamos codificar, para isso vamos continuar com o Copiar e Colar.
No Code-Behind do formulário de Cadastro de Clientes, vamos pressionar Ctrl+t para selecionar todos
os registros, depois Ctrl+c para copiar.
Agora no Code-Behind do formulário de Cadastro de Fornecedores, vamos pressionar Ctrl+v.
Agora para que o formulário funcione corretamente, basta ir até o Evento Initialize do UserForm e
alterar a inicialização da variável planilha de PlCadClientes para PlCadFornecedores.
Pronto, mais um formulário funcionando.

Fone: 4121-6166 Reprodução Proibida Pag.: 235


VBA para Excel

Código completo
Como os 2 formulários tem o código praticamente idênticos, vou deixar somente o código do formulário
de Cadastro de Clientes, mas no projeto que estará disponível no material do aluna, tem todo o código
funcionando para futuros estudos.

Option Explicit

' #########################################################
'
' Projeto de conclusão do curso
' Excel com VBA
'
' Descrição: Cadastro de clientes e fornecedores
' Desenvolvedor: Claudio Fernando Scatolin
' Data: 01/02/2020
'
' #########################################################
Pag.: 236 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

' Variaveis locais


Private estaEditando As Boolean
Private linha As Long
Private planilha As Worksheet

' *****************************
' EVENTOS
' *****************************

' BOTÕES

' Adicionar novo registro


Private Sub BtnAdicionar_Click()

' Retorna a linha para o próximo registro


linha = RetornaProximaLinha(planilha)

' Cadastro está sendo editado


estaEditando = True

' Limpar os campos de cadastro


LimparCampos FrDados

' Habilitar os campos de cadastro


HabilitarCampos FrDados, True

' Gerar código automático


TxtCodigo.Value = GerarCodigo(planilha)

' Posicionar o cursos no campo Nome do formulário


TxtNome.SetFocus

End Sub

' Deletar registro selecionado


Private Sub BtnDeletar_Click()
If MsgBox("Deseja deletar o registro?", vbYesNo, "Deletar") = vbYes Then
planilha.Range("A" & linha).EntireRow.Delete
MsgBox "Registro deletado com sucesso", 0, "Projeto VBA"
End If
End Sub

' Desfazer edição


Private Sub BtnDesfazer_Click()
estaEditando = False ' Cadastro não está sendo editado
HabilitarCampos FrDados, False ' Desabilitar os campos de cadastro
End Sub

' Editar registro selecionado


Private Sub btnEditar_Click()
estaEditando = True ' Cadastro está sendo editado
HabilitarCampos FrDados, True ' Habilitar os campos de cadastro

End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 237


VBA para Excel

' Fechar o formulário


Private Sub BtnFechar_Click()
Unload Me
End Sub

Private Sub BtnPesquisar_Click()


LimparCampos FrDados
With TxtCodigo
.Enabled = True
.Locked = False
.BackColor = &H80000004
.SetFocus
End With
End Sub

Private Sub BtnSalvar_Click()

' Salvando registro dos campos para a planilha


With planilha
.Range("A" & linha).Value = TxtCodigo.Value
.Range("B" & linha).Value = TxtNome.Value
.Range("C" & linha).Value = TxtCnpj.Value
.Range("D" & linha).Value = TxtResponsavel.Value
.Range("E" & linha).Value = TxtTelefone.Value
.Range("F" & linha).Value = CkbAtivo.Value
End With

MsgBox "Registro salvo com sucesso", 0, "Projeto VBA"

' Cadastro não está sendo editado


estaEditando = False

' Desabilitar os campos de cadastro


HabilitarCampos FrDados, False

' Preencher tabela de registros


PreencherLista LbxRegistro, planilha

End Sub

Private Sub LbxRegistro_Click()


If estaEditando = False Then
linha = LocalizarCodigo(planilha, LbxRegistro.Value)

If linha > 0 Then PreencherCampos


End If
End Sub

Private Sub TxtCnpj_Enter()


With TxtCnpj
If .Text = FORMA_CNPJ Then .Text = Empty
End With
End Sub

Private Sub TxtCnpj_Exit(ByVal Cancel As MSForms.ReturnBoolean)


With TxtCnpj
If .Text = Empty Then .Text = FORMA_CNPJ
End With
End Sub

Pag.: 238 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Private Sub TxtCnpj_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)


SomenteNumeros KeyAscii
End Sub

Private Sub TxtCnpj_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, _


ByVal Shift As Integer)

With TxtCnpj
If .SelStart = 2 Or .SelStart = 6 Then .SelText = "."
If .SelStart = 10 Then .SelText = "/"
If .SelStart = 15 Then .SelText = "-"
End With
End Sub

Private Sub TxtCodigo_Exit(ByVal Cancel As MSForms.ReturnBoolean)


With TxtCodigo
If IsNumeric(.Value) And .Value <> Empty Then
linha = LocalizarCodigo(planilha, TxtCodigo.Value)

If linha > 0 Then


PreencherCampos
Else
LimparCampos FrDados
MsgBox "Código não localizado", vbInformation, "Aviso"
End If
End If

.Enabled = False
.Locked = True
.BackColor = &H80000005
End With
End Sub

Private Sub TxtCodigo_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)


SomenteNumeros KeyAscii
End Sub

Private Sub TxtTelefone_Enter()


With TxtTelefone
If .Text = FORMA_TELEFONE Then .Text = Empty
End With
End Sub

Private Sub TxtTelefone_Exit(ByVal Cancel As MSForms.ReturnBoolean)


With TxtTelefone
If .Text = Empty Then .Text = FORMA_TELEFONE
End With
End Sub

Private Sub TxtTelefone_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)


SomenteNumeros KeyAscii
End Sub

Private Sub TxtTelefone_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, _


ByVal Shift As Integer)

Fone: 4121-6166 Reprodução Proibida Pag.: 239


VBA para Excel

With TxtTelefone
If Len(.Text) = 1 And IsNumeric(.Text) Then
.Text = "(" & .Text
End If

If .SelStart = 3 Then .SelText = ") "


If .SelStart = 6 Then .SelText = " "
If .SelStart = 11 Then .SelText = "-"
End With
End Sub

' Iniciando formulário


Private Sub UserForm_Initialize()

' Iniciando o objeto referenciando a planilha


Set planilha = PlCadClientes

' Desabilitar os campos de cadastro


HabilitarCampos FrDados, False

' Limpar os campos de cadastro


LimparCampos FrDados

' Cadastro não está sendo editado


estaEditando = False

' Preencher tabela de registros


PreencherLista LbxRegistro, planilha

End Sub

' Ações antes de fechar o formulário


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If MsgBox("Deseja fechar o formulário?", vbYesNo, "Projeto VBA") _
= vbNo Then
Cancel = True
End If
End Sub

' Preencher campos


Private Sub PreencherCampos()

' Preencher os campos da planilha para os controles


With planilha
TxtCodigo.Value = .Range("A" & linha).Value
TxtNome.Value = .Range("B" & linha).Value
TxtCnpj.Value = .Range("C" & linha).Value
TxtResponsavel.Value = .Range("D" & linha).Value
TxtTelefone.Value = .Range("E" & linha).Value
CkbAtivo.Value = .Range("F" & linha).Value
End With
End Sub

Pag.: 240 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Formulário de Login
O formulário de login terá um usuário e senha para liberar a entrada da planilha. O comportamento
deverá ocultar a planilha assim que for aberta e abrirá o formulário de Login, validando o usuário e
senha o formulário será fechado e a planilha aparecera liberada. Se for cancelado deverá fechar o
projeto.

Vamos criar um formulário parecido com o abaixo

Para criar o formulário vamos precisar dos seguintes controles com suas propriedades

CONTROLE PROPRIEDADE VALOR

UserForm (Name) FrmLogin

UserForm Caption Login

UserForm Picture Selecionar uma imagem

Frame Caption Deixar em branco

Label1 BackStyle 0 – fmBackStyleTransparent

Label1 Caption Usuário:

Label1 Font.Tamanho 12

Label1 Font.Estilo de fonte Negrito

Label1 ForeColor &H00FFFFFF&

Fone: 4121-6166 Reprodução Proibida Pag.: 241


VBA para Excel

Label2 BackStyle 0 – fmBackStyleTransparent

Label2 Caption Senha:

Label2 Font.Tamanho 12

Label2 Font.Estilo de fonte Negrito

Label2 ForeColor &H00FFFFFF&

TextBox1 (Name) TxtLogin

TextBox1 Font.Fonte Comic Sans MS

TextBox1 Font.Tamanho 14

TextBox1 ForeColor &H00808080&

TextBox1 Text User Name

TextBox2 (Name) TxtLogin

TextBox2 Font.Fonte Comic Sans MS

TextBox2 Font.Tamanho 14

TextBox2 ForeColor &H00808080&

TextBox2 PasswordChar *

TextBox2 Text ********

CommandButton1 (Name) BtnOk

CommandButton1 Caption OK

CommandButton1 Default True

CommandButton1 Font.Tamanho 12

CommandButton1 Picture Selecione uma imagem

CommandButton1 PicturePosition 1 – fmPicturePositionLeftCenter

CommandButton2 (Name) BtnCancelar

CommandButton2 Caption OK

CommandButton2 Font.Tamanho 12

CommandButton2 Picture Selecione uma imagem

CommandButton2 PicturePosition 1 – fmPicturePositionLeftCenter

Vamos começar com a documentação, comentando no início do code-behind

Pag.: 242 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Agora as constantes necessárias exclusivas da tela.

Será utilizado 2 constantes e 1 variável, que indica que o login foi cancelado.

Vamos criar os efeitos dos controles TxtLogin e TxtSenha, onde verão com os valores “User Name” e
“********”. Quando receber foco, caso tenham esses valores, o controle será limpo, ao sair se estiver
vazio, recebe de volta os valores padrão.

Inicando com o campo Login. Vamos utilizar os Eventos Enter e Exit.

Para o campo Senha terá o mesmo efeito.

Fone: 4121-6166 Reprodução Proibida Pag.: 243


VBA para Excel

O Evento cancelar irá informar que está cancelando o login e solicita o fechamento do formulário.

A regra utilizada ao fechar, será criada no evento QueryClose, pois também poderá ser fechado pelo
botão fechar “X”.

Quando for cancelado o login, deixará o Aplicativo (Excel) novamente visível e irá fechar o projeto.

A analise de estaCancelado é realizada, pois quando o login for valido também irá fechar o formulário, e
nesse caso não poderá aplicar a regra de quando for cancelado.

No Evento do botão Ok, irá validar se o usuário e a senha estão corretos.

Caso o usuário e senha estiverem corretos, o Aplicativo (Excel) será exibido, a planilha Painel será
selecionada e o formulário de login será fechado.

Caso a senha esteja errada, será exibido uma mensagem, o campo senha será limpo e receberá o foco.

Código completo

Option Explicit

Pag.: 244 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

'################################################
'
' LOGIN
'
' Será utilizado um usuário e senha padrão
' Usuário "Admin", com o "A" maiúsculo
' Senha "1234"
'
'#################################################

' CONSTANTES
Private Const USER_NAME As String = "User Name"
Private Const PASSWORD As String = "********"
Private estaCancelado As Boolean

Private Sub btnCancelar_Click()


estaCancelado = True ' Indica que está cancelando o login
Unload Me ' Fechar o formulário
End Sub

Private Sub btnOk_Click()


If txtUsuario.Value = "Admin" And txtSenha.Text = "1234" Then
Application.Visible = True ' Deixar o Excel visível
PlPainel.Select ' Selecionar a planilha painel
Unload Me ' Fechar o formulário
Else
MsgBox "Usuário ou senha inválido", 0, "Projeto VBA"
txtSenha.Value = Empty
txtSenha.SetFocus
End If
End Sub

Private Sub txtSenha_Enter()


With txtSenha
If .Value = PASSWORD Then .Value = Empty
End With
End Sub

Private Sub txtSenha_Exit(ByVal Cancel As MSForms.ReturnBoolean)


With txtSenha
If .Value = Empty Then .Value = PASSWORD
End With
End Sub

Private Sub txtUsuario_Enter()


With txtUsuario
If .Value = USER_NAME Then .Value = Empty
End With
End Sub

Private Sub txtUsuario_Exit(ByVal Cancel As MSForms.ReturnBoolean)


With txtUsuario
If .Value = Empty Then .Value = USER_NAME
End With
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)


Fone: 4121-6166 Reprodução Proibida Pag.: 245
VBA para Excel

If CloseMode = 0 Or estaCancelado Then


Application.Visible = True ' Deixar o Excel visível
ThisWorkbook.Close ' Fechar o arquivo projeto VBA
End If
End Sub

Faixa de Opções Personalizada

Para esse projeto não criaremos uma Faixa de Opções utilizando as ferramentas do Excel, iremos criar
um Faixa de Opções exclusiva para o Projeto. Para isso iremos utilizar o software Custom UI Editor for
Microsoft. Um software que permite customizar o arquivo utilizando a linguagem XML.

O instalador do sistema mais uma apostila simplificada de como utilizar com de uma forma mais
explicativa, estará disponível no material de apoio do aluno.

Após instalado, o primeiro passo é fechar nosso projeto, pois ele será aberto pelo UI Editor, e como irá
modificar a estrutura do arquivo, o mesmo deverá ficar fechado.

Ao finalizar a instalação será criado um ícone na área de trabalho, vamos abrir o UI Editor.

A janela dela é bem simples, com poucos botões, pois o objetivo é codificar utilizando o XML.

Vamos abrir nosso projeto, clicando no Menu File/Open ou pelo ícone da pasta na barra de ferramentas.

Após abrir o projeto, ele ficará em uma lista do lado esquerdo do aplicativo.

Pag.: 246 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Agora iremos atribuir um arquivo XML para nosso projeto, e nesse arquivo XML que iremos criar as TAGs
necessárias para criar nossa faixa de opções.

Para inserir o arquivo XML, no menu Insert existem 2 opções, Office 2010 Custom UI Part e Office 2007
Custom UI Part. Qualquer versão igual ou superior ao Office 2010 irá utilizar a primeira opção

Agora será criado um arquivo XML anexado ao projeto.

Não precisamos começar a criar as TAGs XML do zero, podemos utilizar algum modelo pronto e apenas
modifica-lo.

No Menu Insert/Sample XML/Excel – A Custom Tab, temos um modelo que atende nossa necessidade.

Fone: 4121-6166 Reprodução Proibida Pag.: 247


VBA para Excel

O código XML gerado de exemplo será o seguinte.

Um conselho seria utilizar uma outra aplicação para modificar o XML, pois o UI Editor não é um bom
editor de texto. Pode ser utilizado o Notepad++ ou o Visual Studio Code. Ambos são softwares Free.

Notepad++
Pag.: 248 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Visual Studio Code

Vamos entender o XML, ele tem uma hierarquia de TAGs,

customUI > ribbon > tabs > tab > group > button

A TAG customUI é a Tag raiz que contem o schema de validação das Tags, não iremos nos preocupar
com essa.

A TAG ribbon será para indicar que iremos trabalhar com a estrutura do ribbon, ou a Faixa de Opções.

A TAG tabs representa o conjunto de todas as guias da Faixa de Opções.

A TAG tab, já indica cada guia individualmente.

A TAG Group são os grupos dentro das Guias, Área de Transferencia, Fonte, etc.

A TAG button representa cada botão dentro do Grupo.

Importante, para diferenciar quando alguma TAG representa algum objeto já criado pelo próprio
aplicativo ou uma que TAG de algum componente que iremos criar, das propriedades das TAGs sempre
que o nome dessa propriedade terminar com Mso, exemplo idMso, quando o componente for de nossa
criação será utilizado somente id.

Mso significa que pertence à aplicação, seria de Microsoft Office.

Grupo Área de Transferência, pertence ao Excel.

Fone: 4121-6166 Reprodução Proibida Pag.: 249


VBA para Excel

Grupo de criação personalizada.

Para nosso projeto iremos trabalhar com as TAGs, tab, group e button.

Criaremos uma Guia personalizada com o nome de Projeto VBA, dentro ela terá 3 grupos Cadastro,
Navegação e Sistema.

O grupo Cadastro, terá 2 botões, Cadastro de Clientes e Cadastro de Fornecedores.

O grupo Navegação, terá 3 botões que serão para navegar entre as planilhas, os botão serão Ir Painel, Ir
Cadastro de Cliente, Ir Cadastro de Fornecedores.

O grupo Sistema terá 2 botão, Salvar que ira salvar o arquivo e Fechar que irá salvar e depois fechar o
arquivo.

Vamos entender um pouco sobre as propriedades das TAGs.

id O nome da TAG. Não pode haver espaços nem caracteres especiais

label O que aparecerá escrito no elemento. Exemplo das guias Página Inicial,
Inserir, Design.

insertAfterMso Essa propriedade informa em qual posição será inserida a guia, passamos o
nome de uma guia existente e a guia criada será inserida após essa guia.

insertBeforeMso Essa propriedade informa em qual posição será inserida a guia, passamos o
nome de uma guia existente e a guia criada será inserida antes essa guia.

size O tamanho do botão. O tipo large deixa o botões grandes e o tipo normal
deixa os botões pequenos.

onAction Aqui iremos inserir o nome do método que irá executar quando clicarmos
no botão

image Imagem que poderá ser atribuída ao botão.

Lembrando que todas as propriedades acima que terminarem com Mso, são exclusivas do Office.

Agora estamos prontos para alterar o XML de exemplo.

Primeiro iremos alterar a TAG tab

PROPRIEDADE VALOR

id TabProjetoVba

label Projeto VBA

insertBeforeMso TabHome

A propriedade insertBeforeMso="TabHome", infoma que nossa guia será exibida antes da guia Página
Inicial, ou seja, nossa guia será a primeira guia da Faixa de Opções.

Pag.: 250 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Dentro da tab, existem 6 group, onde 5 são do próprio Excel (idMso) e 1 é personalizado. Vamos excluir
todos os group que são do Excel (idMso) e deixar apenas o personalizado.

Agora vamos alterar o group existente com os seguintes valores

PROPRIEDADE VALOR

id GroupCadastro

label Cadastros

Agora iremos alterar os button. Dentro do group, existem 3 button, porém para esse group iremos
precisar apenas de 2, portanto vamos deletar 1 button.

Agora vamos alterar as propriedades dos buttons.

PROPRIEDADE VALOR

id BtnCadClientes

label Clientes

size large

onAction AbrirCadastroClientes

image addClient

id BtnCadFornecedores

label Fornecedores

size large

onAction AbrirCadastroFornecedores

image addSupplier

As propriedades de imageMso que vem por padrão deverá ser alterada para image, pois iremos inserir
uma imagem personalizada e não alguma imagem da biblioteca do Office. O nome da imagem deverá
ser exatamente igual ao nome da imagem que iremos inserir, inclusive caracteres maiúsculos e
minúsculos.

Agora vamos criar os outros 2 groups, para isso iremos copiar o group que já está criado e colar 2 cópias
abaixo do existente.

Seguem as propriedades do grupo Navegação.

PROPRIEDADE VALOR

id GroupNavegador

label Navegação

Fone: 4121-6166 Reprodução Proibida Pag.: 251


VBA para Excel

PROPRIEDADE VALOR

id BtnIrPainel

label Guia painel

size normal

onAction IrPainel

image goPanel

id BtnIrClientes

label Guia Cadastro de Clientes

size normal

onAction IrClientes

image goClient

id BtnIrFornecedores

label Guia Cadastro de Fornecedores

size normal

onAction IrFornecedores

image goSupplier

Agora o grupo Sistema.

PROPRIEDADE VALOR

id GroupSistema

label Sistema

PROPRIEDADE VALOR

id BtnSalvar

label Salvar

size large

onAction SalvarProjeto

image save

Pag.: 252 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

id BtnFechar

label Fechar

size large

onAction FecharProjeto

image close

Segue abaixo o código XML completo. Caso tenha escrito o código em outro Editor, Notepad++ ou
Visual Studio Code, basta copiar e substituir o que está no UI Editor.

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="TabProjetoVba" label="Projeto VBA" insertBeforeMso="TabHome">
<group id="GroupCadastro" label="Cadastros">
<button id="BtnCadClientes" label="Clientes" size="large"
onAction="AbrirCadastroCliente" image="addClient" />

<button id="BtnCadFornecedores" label="Fornecedores"


size="large" onAction="AbrirCadastroFornecedores" image="addSupplier" />

</group>

<group id="GroupNavegador" label="Navegação">


<button id="BtnIrPainel" label="Guia painel" size="normal"
onAction="IrPainel" image="goPanel" />

<button id="BtnIrClientes" label="Guia Cadastro de Clientes"


size="normal" onAction="IrClientes" image="goClient" />

<button id="BtnIrFornecedores" label="Guia Cadastro de


Fornecedores" size="normal" onAction="IrFornecedores" image="goSupplier" />
</group>

<group id="GroupSistema" label="Sistema">


<button id="BtnSalvar" label="Salvar" size="large"
onAction="SalvarProjeto" image="save" />

Fone: 4121-6166 Reprodução Proibida Pag.: 253


VBA para Excel

<button id="BtnFechar" label="Fechar" size="large"


onAction="FecharProjeto" image="close" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Depois do código pronto, precisamos de mais alguns processos.

Primeiro iremos inserir as imagens, para isso iremos clicar no botão Insert Icons que encontra-se na
barra de ferramentas.

Vamos selecionar as imagens, podem ser inseridas todas ao mesmo tempo. Lembrando que as imagens
devem ter o mesmo nome que está informado na propriedade image do XML, caso esteja diferente,
deverá altear o nome da imagem ou da propriedade.

As imagens serão anexadas ao arquivo XML.

Pag.: 254 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Agora iremos validar se o XML está OK, para isso vamos clicar no botão Validate que está na barra de
ferramentas.

Caso o XML esteja de acordo com o Schema de validação, será exibido uma mensagem informando que
o arquivo está bem formado.

Agora se existir alguma divergência, também será informado em uma mensagem com o erro
encontrado. Para simular o erro, iremos alterar alguma TAG deixando 2 ids com o mesmo nome.

Agora podemos salvar as alterações, no botão Salvar na barra de ferramentas.

Fone: 4121-6166 Reprodução Proibida Pag.: 255


VBA para Excel

Lembrando que nas propriedades onAction, nós informamos o nome dos métodos que devem ser
executados quando clicarmos nos botões, porém esses métodos ainda não existem em nosso projeto.

Para facilitar a sua criação, vamos clicar no botão Generate Callbacks, que está na barra de ferramentas.

Ele irá mostrar a estrutura dos métodos já pronto, precisando somente codigicar as ações. Então
irermos copiar esses estruturas pois iremos utilizar em nosso projeto.

Nas estruturas já vem com o argumento do tipo IRibbinControl, que o sistema utiliza para identificar
que está sendo chamado da Faixa de Opções.

Então agora que as alterações já estão salvas e já copiamos a estrutura dos métodos, podemos fechar o
UI Editor e abrir o Projeto Final VBA.xlsm.

Pag.: 256 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Ao abrir o projeto, podemos ver que nossa guia já está disponível com os controles, porém ainda não
está funcionando pois os módulos ainda não existem.

Então vamos abrir o VBE, e criar um novo Módulo no projeto, e iremos chama-lo de ModFaixaOpcoes.
Dentro desse módulo iremos colar as estruturas de métodos que copianos.

Vamos criar uma documentação, comentando na parte superior do módulo.

Fone: 4121-6166 Reprodução Proibida Pag.: 257


VBA para Excel

Agora vamos codificar os eventos de cada um dos botões.

Começando pelos controle para abrir os formulários de cadastro, vamos utilizar um tratamento de
erros, apenas para, se ocorrer algum erro durante a abertura, ele será ignorado.

Para abrir o formulário, basta apontar o formulário que deseja abrir, pelo nome, e adicionar o método
Show.

Agora os controle de navegação. Esse serão bem simples, basta selecionar a planilha que deseja exibir.

Pag.: 258 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Pra finalizar, os controle do sistema. As ações Salvar e Fechar, já são eventos disponível no objeto
Workbook, portanto podemos utilizar o objeto ThisWorkbook e chamar os métodos.

Código Completo

Option Explicit

' #########################################################
'
' MÓDULO FAIXA DE OPÇÕES
'
' Descrição: Módulo contendo métodos dos eventos
' dos controles da faixa de opções personalizada
' no projeto
' Desenvolvedor: Claudio Fernando Scatolin
' Data: 01/02/2020
'
' #########################################################

'Callback for BtnCadClientes onAction


Sub AbrirCadastroCliente(control As IRibbonControl)
On Error Resume Next
FrmCadClientes.Show
End Sub

'Callback for BtnCadFornecedores onAction


Sub AbrirCadastroFornecedores(control As IRibbonControl)
On Error Resume Next
FrmCadFornecedores.Show
End Sub

'Callback for BtnIrPainel onAction


Sub IrPainel(control As IRibbonControl)
PlPainel.Select
End Sub

'Callback for BtnIrClientes onAction


Sub IrClientes(control As IRibbonControl)
PlCadClientes.Select

Fone: 4121-6166 Reprodução Proibida Pag.: 259


VBA para Excel

End Sub

'Callback for BtnIrFornecedores onAction


Sub IrFornecedores(control As IRibbonControl)
PlCadFornecedores.Select
End Sub

'Callback for BtnSalvar onAction


Sub SalvarProjeto(control As IRibbonControl)
ThisWorkbook.Save
End Sub

'Callback for BtnFechar onAction


Sub FecharProjeto(control As IRibbonControl)
ThisWorkbook.Save
ThisWorkbook.Close
End Sub

Review
Pronto, nosso projeto está finalizado, vamos olhar as telas.

Pag.: 260 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Fone: 4121-6166 Reprodução Proibida Pag.: 261


VBA para Excel

Pag.: 262 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Assinatura Digital

No Windows Explorer, localize e clique duas vezes no arquivo SelfCert.exe em C:\Program Files
(x86)\Microsoft Office\OfficeXX.

No OfficeXX, seria a verão do office.

Observação: Caso você não encontre o item Ferramentas do Microsoft Office 2016 ou o Certificado
Digital para Projetos de VBA, é porque ele não foi instalado. Neste caso, é necessário refazer a
instalação do Office 2016 e, desta vez, ativar o Certificado Digital.

Execute o Programa de Instalação do Office novamente.

Na tela Selecionar recursos do programa de instalação, expanda Ferramentas do Office.

Selecione Assinatura digital para projetos do VBA, clique na seta ao lado da seleção e selecione Executar
a partir de Meu computador.

Fone: 4121-6166 Reprodução Proibida Pag.: 263


VBA para Excel

Criar um Certificado Digital

Após executar os passos acima, o Excel exibirá o seguinte Diálogo:

Digite seu nome ou suas iniciais e clique o botão OK para finalizar. O Excel emitirá uma mensagem
informando que o certificado foi criado com êxito.

Assinar digitalmente um projeto de macro

Certifique-se de que tenha no mínimo um certificado digital antes de tentar assinar um projeto de
macro
• Abra a pasta de trabalho ou o modelo que contém o projeto de macro que você deseja assinar.

• Na guia Desenvolvedor, clique no botão Visual Basic para exibir a janela do VBA.

• Na janela VBAProject, selecione o projeto que deseja assinar.

• No menu Ferramentas, clique em Assinatura digital.

• Já janela clique em Escolher.

Pag.: 264 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

• Selecione a Assinatura e clique em OK.

• Será exibido a assinatura escolhida, clique em OK novamente.

Observação: Como um certificado digital que você cria sozinho não é emitido por uma autoridade formal de
certificação, projetos de macros que são assinados usando esse certificado são denominados projetos de auto-
assinatura. Dependendo de como sua empresa usa os recursos de assinatura digital no Microsoft Office, talvez
você seja impedido de usar esse tipo de certificado e talvez outros usuários não consigam executar macros de
auto-assinatura por razões de segurança.

Usando um certificado digital em seu código

Arquivos que contem macros, trazem um certo transtorno ao usuário e uma preocupação extra ao
desenvolvedor. Ao usuário porque o mesmo sempre será questionado se deseja executar/habilitar as

Fone: 4121-6166 Reprodução Proibida Pag.: 265


VBA para Excel

macros do sistema. Ao desenvolvedor porque, se o usuário, não habilitar a execução das macros, o
sistema falhará. Pois nenhum código será executado.

Sendo assim, o ideal seria que as macros fossem executadas automaticamente sem questionar o
usuário. Independente do nível de segurança configurado. Janela do Excel, na guia DESENVOLVEDOR 
Código  Segurança de Macro.

Salve e feche o projeto.

Pag.: 266 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Adicionar um desenvolvedor de macros à lista de fontes confiáveis


Para executar este procedimento, você precisa ter o Microsoft Internet Explorer versão 4.0 ou posterior
instalado em seu computador e deve definir o nível de segurança como médio ou alto.

Abra a pasta de trabalho ou carregue o programa suplementar que contém macros da fonte que você
deseja adicionar à lista.

Na caixa de diálogo Aviso de segurança, marque a caixa de seleção Sempre confiar em macros dessa
fonte.

Observação Se a caixa de diálogo Aviso de segurança não exibir a caixa de seleção Sempre confiar em
macros dessa fonte, isso significa que as macros não são digitalmente assinadas. Sem uma assinatura
digital, você não pode adicionar esse desenvolvedor de macros à lista de fontes confiáveis.

Fone: 4121-6166 Reprodução Proibida Pag.: 267


VBA para Excel

Alterar o nível de segurança da proteção contra vírus de macro

No menu Ferramentas, aponte para Macro e clique em Segurança.

Clique na guia Nível de segurança e, em seguida, clique na opção desejada.

Aprenda sobre níveis de segurança.

Observação Você pode desabilitar apenas macros escritas em Visual Basic for Applications. As macros
do Microsoft Excel versão 4.0 não são afetadas pela configuração de nível de segurança.

Um bom desenvolvedor, deve aprender sobre como níveis de segurança e assinaturas digitais
funcionam em conjunto. No entanto, o assunto foge ao escopo deste curso.

Pag.: 268 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Códigos extras

O código abaixo, lista os AddIns contidos na caixa de diálogo Suplementos.


Sub ListaAddIns()
With Worksheets("Plan1")
.Rows(1).Font.Bold = True
.Range("a1:d1").Value = _
Array("Name", "Full Name", "Title", "Installed")
For i = 1 To AddIns.Count
.Cells(i + 1, 1) = AddIns(i).Name
.Cells(i + 1, 2) = AddIns(i).FullName
.Cells(i + 1, 3) = AddIns(i).Title
.Cells(i + 1, 4) = AddIns(i).Installed
Next
.Range("a1").CurrentRegion.Columns.AutoFit
End With
End Sub

ScreenShot gerado pelo procedimento ListaAddIns.

O código abaixo, aplica porcentagem a uma faixa selecionada.


Sub AplicaPorcentagem()
Dim C As Range, PERC As Single
PERC = InputBox("Digite a porcentagem desejada", "Porcentagem", 10)
PERC = 1 + PERC / 100
For Each C In Selection
C = C * PERC
Next C
End Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 269


VBA para Excel

A função abaixo pega o número de série de um drive qualquer.


Function NumSerie(Drive As String) As String
Dim FS, D, S, TIPO
TIPO = Array("Desconhecido", "Removível", "Fixo", "Rede", _
"CD-Rom", "Disco RAM")
Set FS = CreateObject("Scripting.FileSystemObject")
Set D = FS.GetDrive(FS.GetDriveName(FS.GetAbsolutePathName(Drive)))
S = "Unidade " & D.DriveLetter & ": - " & TIPO(D.DriveType)
S = S & vbCr & vbCr & "SN: " & D.SerialNumber
NumSerie = S
End Function

O procedimento abaixo usa a função NumSerie para exibir o número de série do drive C: da máquina
onde ele estiver sendo executado.

Sub MostrNumSerie()
MsgBox NumSerie("C:")
End Sub

O procedimento abaixo não permite a impressão do documento ativo.


Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
MsgBox "Impressão não permitida", vbInformation, "Aviso"
End Sub

O procedimento abaixo bloqueia o comando Salvar como.


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI Then
Cancel = True
MsgBox "Salvar como está desabilitado"
End If
End Sub

O procedimento abaixo salva o documento ativo com um nome contido na célula A1.
Sub SaveAsA1()
ActiveWorkbook.SaveAs Filename:=Range("A1").Value
End Sub

Pag.: 270 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

O procedimento abaixo lista o nome de todas as barras de ferramentas do aplicativo


Sub ListaNomeDasBarras()
Dim L As Integer, C As CommandBar, LIN As Integer
L = 2
With Worksheets("Plan2")
.Rows(1).Font.Bold = True
.Range("A1:C1").Value = _
Array("Index", "Nome em Inglês", "Nome em Português")
For Each C In CommandBars
.Cells(L, 1).Value = C.Index
.Cells(L, 2).Value = C.Name
.Cells(L, 3).Value = C.NameLocal
L = L + 1
Next C
.Range("A1").CurrentRegion.Columns.AutoFit
LIN = Range("A65536").End(xlUp).Row
.Range("A1:A" & LIN).HorizontalAlignment = xlCenter
End With
End Sub

Exemplo do ScreenShot gerado pelo código acima.

O procedimento abaixo oculta todas as planilhas da pasta ativa, exceto a Plan2.


Sub OcultarPlanilhas()
Dim WS As Worksheet
For Each WS In Worksheets
If WS.Name <> "Plan2" Then
WS.Visible = xlSheetVeryHidden
End If
Next WS
End Sub

O procedimento abaixo inibe a seleção de células em Plan2.


Sub NotSelectCel()
With Worksheets("Plan2")
.EnableSelection = xlNoSelection
.Protect Password:="123", Contents:=True, UserInterfaceOnly:=True
End With
End SubEnd Sub

Fone: 4121-6166 Reprodução Proibida Pag.: 271


VBA para Excel

O procedimento abaixo congela a faixa A1:A5. Ou seja, o usuário só terá acesso neste intervalo.
Sub CongelaArea()
With Worksheets("Plan3")
.Activate 'ativa a Plan3
.ScrollArea = "A1:E5" 'determina a área de scroll
End With
With Range("A1:E5")
.Interior.ColorIndex = 19 'define a cor marfim
.BorderAround xlContinuous, xlMedium 'define a borda externa
'define as bordas internas
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
.Borders(xlInsideVertical).LineStyle = xlContinuous
End With
[A1].Select 'seleciona a célula A1
End Sub

Os procedimentos abaixo removem todas as bordas de uma seleção.


'Este é o código gerado pela Gravador de Macros.
Sub RemoveBordas()
With Selection
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Borders(xlEdgeLeft).LineStyle = xlNone
.Borders(xlEdgeTop).LineStyle = xlNone
.Borders(xlEdgeBottom).LineStyle = xlNone
.Borders(xlEdgeRight).LineStyle = xlNone
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With
End Sub

'Porém, este procedimento é bem mais simples.


Sub LimpaBordas()
Selection.Borders.LineStyle = xlNone
End Sub

Pag.: 272 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Resposta dos desafios

' DESAFIO 1
Public Function nomeCompleto(nome As String, sobrenome As String) As String
Dim completo As String

completo = nome & " " & sobrenome

nomeCompleto = completo
End Function

' DESAFIO 2
Public Function MensagemNome(nome As String, sobrenome As String) As String
Dim nomeCompleto As String
Dim mensagem As String

nomeCompleto = nome & " " & sobrenome


mensagem = "Bom dia " & nomeCompleto & "!"

MensagemNome = mensagem
End Function

' DESAFIO 3
Public Sub TrocarNomes()
Dim nome1 As String
Dim nome2 As String
Dim nomeTemp As String

' Recebendo nomes


nome1 = InputBox("Informe o 1o Nome", "Nome")
nome2 = InputBox("Informe o 2o Nome", "Nome")

' Trocando os nomes


nomeTemp = nome1
nome1 = nome2
nome2 = nomeTemp

' Retornando
MsgBox "Primeiro nome: " & nome1 & Chr(10) & _
"Segundo nome: " & nome2

End Sub

' DESAFIO 4

Fone: 4121-6166 Reprodução Proibida Pag.: 273


VBA para Excel

Public Function ClassificacaoNome(idade As Integer) As String


Select Case idade
Case Is < 3
ClassificacaoNome = "Bebê"
Case 3 To 12
ClassificacaoNome = "Criança"
Case 13 To 17
ClassificacaoNome = "Adolescente"
Case 18 To 25
ClassificacaoNome = "Jovem"
Case 26 To 65
ClassificacaoNome = "Adulto"
Case Else
ClassificacaoNome = "Idoso"
End Select
End Function

' Desafio 5 - parte 1


Public Function Cumprimento1(tempo As Date) As String
Select Case Hour(tempo)
Case 6 To 11
Cumprimento1 = "Bom dia!"
Case 12 To 17
Cumprimento1 = "Boa tarde!"
Case Else
Cumprimento1 = "Boa noite"
End Select
End Function

' Desafio 5 - parte 2


Public Function Cumprimento2(tempo As Date) As String
Dim hora As Integer
Dim minuto As Integer
Dim segundo As Integer
Dim novoTempo As Date

hora = Hour(tempo)
minuto = Minute(tempo)
segundo = Second(tempo)

novoTempo = TimeSerial(hora, minuto, segundo)

Select Case novoTempo


Case TimeValue("06:00:01") To TimeValue("12:00:00")
Cumprimento2 = "Bom dia!"
Case TimeValue("12:00:01") To TimeValue("18:00:00")
Cumprimento2 = "Boa tarde!"
Case Else
Cumprimento2 = "Boa noite!"
End Select
End Function

Pag.: 274 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Apêndice 1

Glossário
Fone: 4121-6166 Reprodução Proibida Pag.: 275
VBA para Excel

Glossário

Aplicativo host

Qualquer aplicativo que dá suporte ao uso do Visual Basic for Applications; por exemplo, o Microsoft Excel, o
Microsoft Project e assim por diante.

Argumento

Uma constante, variável ou expressão passada a um procedimento.

Assinatura digital

Um carimbo digital de identificação em uma macro que confirma que a fonte da macro é o desenvolvedor que a
assinou e que a macro não foi alterada. Para assinar digitalmente projetos de macro e identificá-los como seus, é
necessário obter e instalar um certificado digital. Quando você abre um arquivo ou carrega um suplemento que
contém uma macro assinada digitalmente, é exibida uma assinatura digital no computador como um certificado
que identifica a fonte da macro, além de fornecer informações adicionais sobre a identidade e integridade dessa
fonte.

Classe

A definição formal de um objeto. A classe atua como o modelo a partir do qual uma ocorrência de um objeto é
criada durante o tempo de execução. A classe define as propriedades do objeto e os métodos utilizados para
controlar o comportamento do objeto.

Constante

Um item nomeado que mantém um valor constante por toda a execução de um programa. Uma constante pode
ser uma literal de sequência de caracteres ou numérica, uma outra constante ou qualquer combinação que inclua
operadores aritméticos ou lógicos, exceto Is e exponenciação. Cada aplicativo host pode definir seu próprio
conjunto de constantes. Constantes adicionais podem ser definidas pelo usuário com a instrução Const. Você pode
utilizar constantes em qualquer lugar do seu código em vez de valores reais.

Dynamic-link library (DLL, biblioteca de vínculo dinâmico)

Uma biblioteca de rotinas carregada e vinculada em aplicativos durante o tempo de execução. As DLLs são criadas
com outras linguagens de programação como o C, MASM ou FORTRAN.

Erro em tempo de execução

Um erro que ocorre quando o código está sendo executado. Ocorre um erro em tempo de execução quando uma
instrução tenta uma operação inválida.

Escopo

Pag.: 276 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Define a visibilidade de uma variável, um procedimento ou objeto. Por exemplo, uma variável declarada como
Public é visível a todos os procedimentos de todos os módulos em um projeto de referência direta, a menos que o
Option Private Module esteja ativo. Quando Option Private Module está ativo, o próprio módulo é privado e
portanto não está visível a projetos de referência. As variáveis declaradas em um procedimento são visíveis
somente dentro do procedimento e perdem seu valor entre chamadas, a menos que sejam declaradas Static.

Fórmula matricial

Executa cálculos múltiplos e, em seguida, produz um único resultado ou resultados múltiplos. Fórmulas matriciais
agem sobre um ou mais conjuntos de valores conhecidos como argumentos de matriz. Cada argumento de matriz
deve ser retangular e cada argumento precisa ter o mesmo número de linhas e/ou o mesmo número de colunas
que os outros argumentos. Para produzir resultados múltiplos, a fórmula deve ser inserida em células múltiplas.

Para inserir uma fórmula matricial, pressione CTRL+SHIFT+ENTER. O Microsoft Excel coloca fórmulas matriciais
entre chaves ( { } ).

Fone: 4121-6166 Reprodução Proibida Pag.: 277


VBA para Excel

Instrução

Uma unidade sintaticamente completa que expressa um tipo de ação, declaração ou definição. Uma instrução
geralmente ocupa uma única linha, ainda que você possa utilizar dois-pontos (:) para incluir mais de uma instrução
em uma linha. Você também pode utilizar um caractere de continuação de linha (_) para continuar uma única linha
lógica em uma segunda linha física.

Método

Um procedimento que atua sobre um objeto.

Código de programa que fica incorporado à definição de um objeto, o qual define de que modo o objeto irá atuar
sobre as informações e responder a certos eventos. Por exemplo, os objetos bancos de dados têm métodos que
abrem recordsets e deslocam itens de registro para outro.

Módulo

Um conjunto de declarações seguidas de procedimentos.

módulo de classe

Um módulo que contém a definição de uma classe, incluindo suas definições de propriedade e método.

Número de linha

Utilizado para identificar uma única linha de código. Um número de linha pode ser qualquer combinação de dígitos
que seja exclusiva dentro do módulo no qual é utilizado. Os números de linha devem iniciar na primeira coluna.

Módulo de formulário

Um arquivo de um projeto do Visual Basic, com extensão de nome de arquivo .frm, que pode conter descrições
gráficas de um formulário, seus controles e suas definições de propriedade; declarações ao nível de formulário de
constantes, variáveis e procedimentos externos, e procedimentos gerais e de evento.

Módulo Padrão

Um módulo que contém somente declarações e definições de procedimento, tipo e dados. As declarações e
definições em nível de módulo em um módulo padrão são Public por padrão. Um módulo padrão é chamado de
módulo de código em versões anteriores do Visual Basic.

Objeto

Uma combinação de código e dados que podem ser tratados como uma unidade; por exemplo, um controle,
formulário ou componente de aplicativo. Cada objeto é definido por uma classe.

Um elemento básico de um programa, que contém propriedades para descrever suas características e métodos
para definir suas tarefas, e que é capaz de reconhecer eventos aos quais pode responder. Os controles e os
formulários são exemplos de objetos usados no VBA.

Pag.: 278 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Procedimento

Uma sequência nomeada de instruções executadas como uma unidade. Por exemplo, Function, Property e Sub
são tipos de procedimentos. Um nome de procedimento é sempre definido ao nível de módulo. Todo código
executável deve estar contido em um procedimento. Procedimentos não podem ser aninhados dentro de outros
procedimentos.

Procedimento Function

Um procedimento que executa uma tarefa específica dentro de um programa e retorna um valor. Um
procedimento Function começa com uma instrução Function e termina com uma instrução End Function.

Procedimento Sub

Um procedimento que executa uma tarefa específica dentro de um programa, mas não retorna um valor explícito.
Um procedimento Sub começa com uma instrução Sub e termina com uma instrução End Sub.

Projeto

Um conjunto de módulos.

projeto de macro

Um conjunto de componentes, que inclui formas, código e módulos de classe que constituem uma macro. Os
projetos de macro criados no Microsoft Visual Basic for Applications podem ser incluídos em suplementos,
documentos e modelos do Microsoft Word, apresentações e modelos de apresentação do Microsoft PowerPoint,
pastas de trabalho e modelos do Microsoft Excel e bancos de dados do Microsoft Access.

Propriedades

São as características de um objeto, tais como o tamanho, a posição, a cor ou a fonte do texto. As propriedades
determinam a aparência e, algumas vezes, o comportamento de um objeto. As propriedades também são usadas
para fornecer dados a um objeto e obter informações do objeto.

Rótulo de linha

Utilizado para identificar uma única linha de código. Um rótulo de linha pode ser qualquer combinação de
caracteres que inicie com uma letra e termine com dois-pontos (:). Os rótulos de linha não diferenciam maiúsculas
de minúsculas e devem iniciar na primeira coluna.

Tempo de compilação

O período durante o qual o código-fonte é traduzido em código executável.

Fone: 4121-6166 Reprodução Proibida Pag.: 279


VBA para Excel

Tipo definido pelo usuário

Qualquer tipo de dados definido utilizando-se a instrução Type. Os tipos de dados definidos pelo usuário podem
conter um ou mais elementos de qualquer tipo de dados. As matrizes de tipos de dados definidos pelo usuário e
de outros tipos de dados são criadas utilizando-se a instrução Dim. Matrizes de qualquer tipo podem ser incluídas
nos tipos definidos pelo usuário.

Variável

Um local de armazenamento nomeado que pode conter dados, os quais podem ser modificados durante a
execução do programa. Cada variável possui um nome que a identifica com exclusividade dentro de seu escopo.
Um tipo de dados pode ser ou não especificado.
Os nomes de variável devem começar com um caractere alfabético, devem ser exclusivos dentro do mesmo
escopo, não podem ter mais de 255 caracteres e também não podem conter um ponto ou caractere de declaração
de tipo incorporado.

Pag.: 280 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Apêndice 2

Propriedades do
Objeto
Application

Fone: 4121-6166 Reprodução Proibida Pag.: 281


VBA para Excel

Principais Propriedades do Objeto Application.

Application Representa todo o aplicativo Microsoft Excel. O objeto Application contém:

Definições e opções para o aplicativo como um todo (muitas das opções da caixa de diálogo Opções
(menu Ferramentas), por exemplo).

Métodos que retornem objetos do nível mais alto, como ActiveCell, ActiveSheet e assim por diante.

Usar o objeto Application

Use a propriedade Application para retornar o objeto Application. O exemplo seguinte aplica a
propriedade Windows ao objeto Application.
Application.Windows("book1.xls").Activate

O exemplo a seguir cria um objeto de pasta de trabalho do Microsoft Excel em um outro aplicativo e, em
seguida, abre a pasta de trabalho no Microsoft Excel.
Set xl = CreateObject("Excel.Sheet")

xl.Application.Workbooks.Open "newbook.xls"

Comentários

Muitas das propriedades e métodos que retornam os objetos mais comuns da interface do usuário,
como a célula ativa (propriedade ActiveCell), podem ser usados sem o qualificador de objeto
Application. Por exemplo, em vez de escrever:
Application.ActiveCell.Font.Bold = True

você pode escrever

ActiveCell.Font.Bold = True.

Propriedade ActiveCell

Retorna um objeto Range que representa a célula ativa na janela ativa (a janela visível) ou na janela
especificada. Se a janela não estiver exibindo uma planilha, esta propriedade falhará. Somente leitura.

Sintaxe: expressão.ActiveCell

expressão Uma variável que representa um objeto Application.

Pag.: 282 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Comentários

Quando você não especifica um qualificador de objeto, essa propriedade retorna a célula ativa na janela
ativa. Tenha cuidado ao distinguir entre célula ativa e seleção. A célula ativa é uma única célula dentro
da seleção atual. A seleção pode conter mais de uma célula, mas somente uma é a célula ativa.

Todas as expressões a seguir retornam a célula ativa e são equivalentes.

Visual Basic for Applications


ActiveCell

Application.ActiveCell

ActiveWindow.ActiveCell

Application.ActiveWindow.ActiveCell

Exemplo

Este exemplo usa uma caixa de mensagem para exibir o valor da célula ativa. Como a propriedade
ActiveCell falha se a planilha ativa não for uma planilha de trabalho, o exemplo ativa Sheet1 antes de
usar a propriedade ActiveCell.

Worksheets("Plan1").Activate

MsgBox ActiveCell.Value

'Este exemplo altera a formatação da fonte da célula ativa.

With ActiveCell.Font

.Bold = True

.Italic = True

End With

Propriedade ActiveWindow

Retorna um objeto Window representando a janela ativa (a janela visível). Somente leitura. Retorna
Nothing se nenhuma janela estiver aberta.

Sintaxe expressão.ActiveWindow

expressão Uma variável que representa um objeto Application.

Fone: 4121-6166 Reprodução Proibida Pag.: 283


VBA para Excel

Exemplo

Este exemplo exibe o nome (propriedade Caption) da janela ativa.

MsgBox "The name of the active window is " & ActiveWindow.Caption

Propriedade Caption

Retorna ou define um valor String que representa o nome que aparece na barra de título da janela
principal do Microsoft Excel.

Sintaxe expressão.Caption

expressão Uma variável que representa um objeto Application.

Comentários

Se você não definir um nome ou se definir o nome como Empty, esta propriedade retornará "Microsoft
Excel".

Exemplo

Este exemplo define um nome personalizado para aparecer na barra de título da janela principal do
Microsoft Excel.

Application.Caption = "Blue Sky Airlines Reservation System"

Propriedade CutCopyMode

Retorna ou define o status do modo Recortar ou Copiar. Pode ser True, False ou uma constante
XLCutCopyMode, conforme exibido nas seguintes tabelas. Long de leitura/gravação

Sintaxe expressão.CutCopyMode

expressão Uma variável que representa um objeto Application.

Valor retornado Descrição

Pag.: 284 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

False Não no modo Cortar ou Copiar.

xlCopy No modo Copiar.

xlCut No modo Cortar.

Exemplo

Este exemplo usa uma caixa de mensagem para exibir o status do modo Recortar ou Copiar.
Select Case Application.CutCopyMode

Case Is = False

MsgBox "Not in Cut or Copy mode"

Case Is = xlCopy

MsgBox "In Copy mode"

Case Is = xlCut

MsgBox "In Cut mode"

End Select

Propriedade DataEntryMode

Retorna ou define o modo Entrada de Dados, como mostrado na tabela seguinte. Quando em modo
Entrada de Dados, você só pode inserir dados nas células não protegidas do intervalo atualmente
selecionado.

Valor Significado

xlOn Modo Entrada de Dados ativado. ESC desativa.

xlOff Modo Entrada de Dados desativado.

xlStrict Modo Entrada de Dados ativado; o pressionamento de ESC não o desativa.


'Este exemplo desativa o modo Entrada de Dados

'se ele estiver ativado.

If (Application.DataEntryMode = xlOn) Or _

(Application.DataEntryMode = xlStrict) Then

Application.DataEntryMode = xlOff

End If

Fone: 4121-6166 Reprodução Proibida Pag.: 285


VBA para Excel

Propriedade Dialogs

Retorna uma coleção Dialogs representando todas as caixas de diálogo internas. Somente leitura.

Sintaxe expressão.Dialogs

expressão Uma variável que representa um objeto Application.

Exemplo

Este exemplo exibe a caixa de diálogo Abrir (menu Arquivo).


Application.Dialogs(xlDialogOpen).Show

Propriedade DisplayAlerts

True se o Microsoft Excel exibir determinados alertas e mensagens enquanto uma macro está em
execução. Boolean de leitura/gravação

Sintaxe expressão.DisplayAlerts

expressão Uma variável que representa um objeto Application.

Comentários

O valor padrão é True. Defina essa propriedade como False para suprimir solicitações e mensagens de
alertas enquanto uma macro está em execução; quando uma mensagem exige uma resposta, o
Microsoft Excel escolhe a reposta padrão.

Se você definir essa propriedade como False, o Microsoft Excel a definirá como True quando o código
for concluído, a menos que você esteja executando código de processo cruzado.

Observação: Ao usar o método SaveAs de pastas de trabalho para substituir um arquivo existente, a
caixa de diálogo Confirmar salvar como terá como padrão Não, enquanto a resposta Sim é selecionada
pelo Excel quando a propriedade DisplayAlerts está definida como False. A resposta Sim substitui o
arquivo existente.
Ao usar o método SaveAs de pastas de trabalho para salvar uma pasta de trabalho contendo um projeto
do Visual Basic for Applications (VBA) no formato de arquivo do Excel 5.0/95, a caixa de diálogo

Pag.: 286 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Microsoft Excel terá como padrão Sim, enquanto a resposta Cancelar é selecionada pelo Excel quando a
propriedade DisplayAlerts está definida como False. Você não pode salvar uma pasta de trabalho que
contenha um projeto do VBA usando o formato de arquivo do Excel 5.0/95.

Exemplo

Esse exemplo fecha a pasta de trabalho Book1.xls e não solicita ao usuário que salve alterações. As
alterações feitas em Book1.xls não são salvas.
Application.DisplayAlerts = False

Workbooks("BOOK1.XLS").Close

Application.DisplayAlerts = True

Esse exemplo suprime a mensagem que, de outra forma, aparece quando você inicia um canal DDE para
um aplicativo que não está sendo executado.
Application.DisplayAlerts = False

channelNumber = Application.DDEInitiate( _

app:="WinWord", _

topic:="C:\WINWORD\FORMLETR.DOC")

Application.DisplayAlerts = True

Application.DDEExecute channelNumber, "[FILEPRINT]"

Application.DDETerminate channelNumber

Application.DisplayAlerts = True

Propriedade DisplayStatusBar

True se a barra de status for exibida. Boolean de leitura/gravação

Sintaxe expressão.DisplayStatusBar

expressão Uma variável que representa um objeto Application.

Exemplo

Este exemplo salva o estado atual da propriedade DisplayStatusBar e define a propriedade como True
de modo que a barra de status fique visível.
saveStatusBar = Application.DisplayStatusBar

Fone: 4121-6166 Reprodução Proibida Pag.: 287


VBA para Excel

Application.DisplayStatusBar = True

Propriedade EnableCancelKey

Controla como o Microsoft Excel trata interrupções do usuário causadas por CTRL+BREAK (ou ESC ou
COMANDO+PONTO) no procedimento sendo executado. Leitura/gravação XlEnableCancelKey.

Sintaxe expressão.EnableCancelKey

expressão Uma variável que representa um objeto Application.

Comentários

XlEnableCancelKey pode ser uma destas constantes XlEnableCancelKey.

xlDisabled Interceptação das teclas de cancelamento completamente desativada.

xlErrorHandler A interrupção é enviada para o procedimento em execução como um erro,


podendo ser interceptado por um tratamento de erros configurado com uma
instrução On Error GoTo. O código de erro interceptável é 18.

xlInterrupt O procedimento atual é interrompido e o usuário pode depurá-lo ou finalizá-


lo.

Use essa propriedade com muito cuidado. Se você usar xlDisabled, não haverá maneira de interromper
um loop de fuga ou outro código que não para automaticamente. Da mesma forma, se você usar
xlErrorHandler, mas seu manipulador de erros sempre voltar a usar a declaração Resume, não haverá
uma maneira de parar o código de fuga.

A propriedade EnableCancelKey é sempre redefinida como xlInterrupt quando o Microsoft Excel


retorna ao estado ocioso e não existe um código em execução. Para interceptar ou desativar o
cancelamento em seu procedimento, você precisa alterar explicitamente a propriedade
EnableCancelKey toda vez que o procedimento for chamado.

Exemplo

Este exemplo mostra como você pode usar a propriedade EnableCancelKey para configurar um
tratamento personalizado de cancelamento.

On Error GoTo handleCancel


Application.EnableCancelKey = xlErrorHandler
MsgBox "This may take a long time: press ESC to cancel"
For x = 1 To 1000000 ' Do something 1,000,000 times (long!)
' do something here
Next x

Pag.: 288 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

handleCancel:
If Err = 18 Then
MsgBox "You cancelled"
End If

Propriedade EnableEvents

True se eventos forem ativados para o objeto especificado. Boolean de leitura/gravação

Sintaxe expressão.EnableEvents

expressão Uma variável que representa um objeto Application.

Exemplo

Este exemplo desativa eventos antes de um arquivo ser salvo de forma que o evento BeforeSave não
ocorre.
Application.EnableEvents = False
ActiveWorkbook.Save

Application.EnableEvents = True

Propriedade OnWindow

Retorna ou define o nome do procedimento executado sempre que você ativa uma janela. String de
leitura/gravação.

Sintaxe expressão.OnWindow

expressão Uma variável que representa um objeto Application.

Comentários

O procedimento especificado por esta propriedade não é executado quando outros procedimentos
alternam para a janela ou quando um comando para alternar para uma janela é recebido através de um
canal DDE. Em vez disso, o procedimento responde às ações do usuário, como clicar em uma janela com
o mouse.

Se uma planilha ou uma folha de macro tiver uma macro Ativar_auto ou Desativar_auto definida, essas
macros serão executadas após o procedimento especificado pela propriedade OnWindow.

Fone: 4121-6166 Reprodução Proibida Pag.: 289


VBA para Excel

Propriedade Path

Retorna um valor String que representa o caminho completo para o aplicativo, excluindo o separador
final e o nome do aplicativo.

Sintaxe expressão.Path

expressão Uma variável que representa um objeto Application.

Exemplo

Este exemplo exibe o caminho completo do Microsoft Excel.


Sub TotalPath()

MsgBox "The path is " & Application.Path

End Sub

Propriedade ScreenUpdating

True se a atualização da tela estiver ativada. Boolean de leitura/gravação.

Sintaxe expressão.ScreenUpdating

expressão Uma variável que representa um objeto Application.

Comentários

Desative a atualização da tela para acelerar o código da macro. Você não poderá ver o que a macro está
fazendo, mas ela será executada mais rapidamente.

Não se esqueça de definir a propriedade ScreenUpdating novamente como True quando a macro
terminar.

Pag.: 290 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Exemplo

Este exemplo demonstra como a desativação da atualização da tela pode acelerar a execução do código.
O exemplo oculta as colunas de Sheet1 alternativamente enquanto mantém registro do tempo que leva
para isso. Na primeira vez em que o exemplo oculta as colunas, a atualização da tela está ativada; na
segunda vez, a atualização da tela está desativada. Ao executar este exemplo, você pode comparar os
respectivos tempos de execução, que são exibidos na caixa de mensagem.
Dim elapsedTime(2)

Application.ScreenUpdating = True

For i = 1 To 2

If i = 2 Then Application.ScreenUpdating = False

startTime = Time

Worksheets("Sheet1").Activate

For Each c In ActiveSheet.Columns

If c.Column Mod 2 = 0 Then

c.Hidden = True

End If

Next c

stopTime = Time

elapsedTime(i) = (stopTime - startTime) * 24 * 60 * 60

Next i

Application.ScreenUpdating = True

MsgBox "Elapsed time, screen updating on: " & elapsedTime(1) & _

" sec." & Chr(13) & "Elapsed time, screen updating off: " & _
elapsedTime(2) & " sec."

Propriedade ThisWorkbook
Retorna um objeto Workbook que representa a pasta de trabalho na qual o código da macro atual está
em execução. Somente leitura.

Sintaxe expressão.ThisWorkbook

expressão Uma variável que representa um objeto Application.

Comentários

Use essa propriedade para se referir à pasta de trabalho que contém o código da macro.

Fone: 4121-6166 Reprodução Proibida Pag.: 291


VBA para Excel

ThisWorkbook é a única maneira de se referir a uma pasta de trabalho de suplemento de dentro do


próprio suplemento. A propriedade ActiveWorkbook não retorna a pasta de trabalho do suplemento;
ela retorna a pasta de trabalho que está chamando o suplemento.

A propriedade Workbooks pode falhar, pois é provável que o nome da pasta de trabalho tenha sido
alterado quando você criou o suplemento. ThisWorkbook sempre retorna a pasta de trabalho na qual o
código está em execução.

Por exemplo, use um código como o seguinte para ativar uma folha de caixa de diálogo armazenada na
sua pasta de trabalho do suplemento:
ThisWorkbook.DialogSheets(1).Show

Essa propriedade só pode ser usada de dentro do Microsoft Excel. Você não pode usá-la para acessar
uma pasta de trabalho a partir de um outro aplicativo.

Exemplo

Este exemplo fecha a pasta de trabalho que contém o código de exemplo. As alterações na pasta de
trabalho, caso existam, não são salvas.

ThisWorkbook.Close SaveChanges:=False

Propriedade WindowState

Retorna ou define o estado da janela. XlWindowState de leitura/gravação.

Sintaxe expressão.WindowState

expressão Uma variável que representa um objeto Application.

Exemplo

Este exemplo maximiza a janela do aplicativo no Microsoft Excel.


Application.WindowState = xlMaximized

Este exemplo expande a janela ativa até o tamanho máximo disponível (supondo que a janela não esteja
maximizada).

Pag.: 292 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

With ActiveWindow

.WindowState = xlNormal

.Top = 1

.Left = 1

.Height = Application.UsableHeight

.Width = Application.UsableWidth

End With

Fone: 4121-6166 Reprodução Proibida Pag.: 293


VBA para Excel

Apêndice 3

Métodos
do Objeto
Application

Pag.: 294 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Principais Métodos do Objeto Application

Um método é uma ação que um objeto pode executar.

Por exemplo, Add é um método do objeto Workbooks, pois adiciona uma nova pasta.

Método Calculate

Calcula todas as pastas de trabalho abertas, uma planilha específica em uma pasta de trabalho ou um
intervalo especificado de células em uma planilha, como mostra a tabela a seguir.

Sintaxe expressão.Calculate

expressão Uma variável que representa um objeto Application.

Comentários

Para calcular Siga este exemplo

Todas as pastas de trabalho abertas Application.Calculate (ou apenas Calculate)

Uma planilha específica Worksheets(1).Calculate

Um intervalo especificado Worksheets(1).Rows(2).Calculate

Exemplo

Este exemplo calcula as fórmulas das colunas A, B e C no intervalo utilizado em Sheet1.


Worksheets("Sheet1").UsedRange.Columns("A:C").Calculate

Método GetOpenFilename

Exibe a caixa de diálogo Abrir padrão e obtém um nome de arquivo do usuário sem realmente abrir
nenhum arquivo.

Sintaxe

expressão.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

expressão Uma variável que representa um objeto Application.

Fone: 4121-6166 Reprodução Proibida Pag.: 295


VBA para Excel

Parâmetros

Obrigatório Tipo de
Nome Descrição
Opcional dados

Uma sequência de caracteres que especifica os critérios de filtragem de


FileFilter Opcional Variant
arquivos.

Especifica os números de índice dos critérios padrão de filtragem de


arquivo, de 1 até o número de filtros especificado em FileFilter. Se este
FilterIndex Opcional Variant
argumento for omitido ou maior do que o número de filtros presentes,
o primeiro filtro de arquivo é usado.

Especifica o título da caixa de diálogo. Se esse argumento for omitido, o


Título Opcional Variant
título será "Abrir".

ButtonText Opcional Variant Apenas para Macintosh.

True para permitir que diversos nomes de arquivos sejam selecionados.


MultiSelect Opcional Variant False pra permitir a seleção de apenas um nome de arquivo. O valor
padrão é False.

Valor de retorno Variant

Comentários

Esta sequência passou no argumento FileFilter que consiste de pares de sequências de filtros de arquivo
seguidos pela especificação de filtro de arquivo curinga do MS-DOS, com cada parte e cada par separado
por vírgulas. Cada par separado está listado na caixa de listagem suspensa

Arquivos do tipo.

Por exemplo, a seguinte sequência especifica dois filtros de arquivo — texto e suplemento: "Arquivos de
texto (*.txt),*.txt,Arquivos de suplemento (*.xla),*.xla".

Para usar múltiplas expressões curinga do MS-DOS para um tipo de filtro de arquivo simples, separe as
expressões curinga com ponto-e-vírgula; por exemplo, "Arquivos do Visual Basic (*.bas;
*.txt),*.bas;*.txt".

Se FileFilter for omitido, este argumento ficará padrão como "Todos os arquivos (*.*),*.*".

Este método retorna o nome do arquivo selecionado ou o nome inserido pelo usuário. O nome
retornado pode incluir uma especificação de caminho. Se MultiSelect for True, o valor de retorno será
uma matriz dos nomes de arquivo selecionados (mesmo se apenas um nome de arquivo for
selecionado). Retorna False se o usuário cancelar a caixa de diálogo.

Este método pode alterar a unidade atual ou a pasta.

Exemplo

Pag.: 296 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Este exemplo exibe a caixa de diálogo Open, com o filtro de arquivo definido para arquivos de texto. Se
o usuário escolher um nome de arquivo, o código exibirá esse nome de arquivo em uma caixa de
mensagens.
fileToOpen = Application _

.GetOpenFilename("Text Files (*.txt), *.txt")

If fileToOpen <> False Then

MsgBox "Open " & fileToOpen

End If

Método MacroOptions

Corresponde às opções da caixa de diálogo Opções de Macro. Você também pode usar esse método
para exibir uma função definida pelo usuário em uma categoria nova ou interna na caixa de diálogo
Inserir Função.

Sintaxe

expressão.MacroOptions(Macro, Description, HasMenu, MenuText, HasShortcutKey, ShortcutKey,


Category, StatusBar, HelpContextID, HelpFile, ArgumentDescriptions)

expressão Uma variável que representa um objeto Application.

Parâmetros

Todos os Tipo de dados dos argumentos, são Variant e Opcionais.

Nome Descrição

Macro O nome da macro ou o nome de uma função definida pelo usuário.

Description A descrição da macro.

HasMenu Este argumento é ignorado.

MenuText Este argumento é ignorado.

True para atribuir uma tecla de atalho à macro (ShortcutKey também deve ser especificado). Se esse
argumento for False, nenhuma tecla de atalho será atribuída à macro. Se a macro já possuir uma
HasShortcutKey
tecla de atalho, a configuração desse argumento como False removerá a tecla de atalho. O valor
padrão é False.

ShortcutKey Necessário se HasShortcutKey for True e ignorado caso contrário. A tecla de atalho.

Um inteiro que especifica a categoria da função de uma macro existente (Financeira, Data & Hora ou
Definida pelo Usuário, por exemplo). Consulte a seção Comentários para determinar quais inteiros
Category são mapeados para as categorias internas. Você também pode especificar uma cadeia de caracteres
para uma categoria personalizada. Se você fornecer uma cadeia de caracteres, ela será tratada como
o nome da categoria exibida na caixa de diálogo Inserir Função. Se o nome da categoria nunca foi

Fone: 4121-6166 Reprodução Proibida Pag.: 297


VBA para Excel

usado, será definida uma nova categoria com esse nome. Se você usar um nome de categoria que
seja o mesmo do nome interno (consulte a lista na seção Comentários), o Microsoft Excel mapeará a
função definida pelo usuário para essa categoria interna.

StatusBar O texto de barra de status para a macro.

HelpContextID Um número inteiro especificando a identificação de contexto do tópico da Ajuda atribuído à macro.

HelpFile O nome do arquivo de ajuda que contém o tópico da Ajuda definido por HelpContextId.

As descrições dos argumentos de um UDF que são exibidas na caixa de diálogo Argumentos da
ArgumentDescriptions
Função.

Comentários

A tabela a seguir lista os inteiros mapeados para as categorias internas que podem ser usados no
parâmetro Category.

Inteiro Categoria Inteiro Categoria

1 Financeira 9 Informação

2 Data & Hora 10 Comandos

3 Matemática e Trigonométrica 11 Personalização

4 Estatística 12 Controle de Macro

5 Procura e Referência 13 DDE/Externa

6 Banco de Dados 14 Definida pelo Usuário

7 Texto 15 Até 32 Categorias personalizadas

8 Lógica

Exemplo

Este exemplo adiciona uma macro definida pelo usuário, denominada "TestMacro", a uma categoria
personalizada, denominada "My Custom Category". Após executar este exemplo, você deverá ver "My
Custom Category", que contém a função "TestMacro" definida pelo usuário, na lista suspensa Ou
selecione uma categoria da caixa de diálogo Inserir Função.

Function TestMacro()

MsgBox ActiveWorkbook.Name

End Function

Sub AddUDFToCustomCategory()
Application.MacroOptions Macro:="TestMacro", Category:="My Custom Category"

End Sub
Pag.: 298 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Método OnKey

Executa um procedimento especificado quando uma determinada tecla ou combinação de teclas é


pressionada.

Sintaxe expressão.OnKey(Key, Procedure)

expressão Uma variável que representa um objeto Application.

Parâmetros

Obrigatório Tipo de
Nome Descrição
Opcional dados

Tecla Obrigatório Sequência Uma sequência de caracteres indicando a tecla a ser pressionada.

Uma cadeia de caracteres indicando o nome do procedimento a ser


executado. Se Procedure for "" (texto vazio), nada acontecerá
quando Key for pressionada. Essa forma de OnKey altera o resultado
Procedure Opcional Variant normal dos pressionamentos de teclas no Microsoft Excel. Se
Procedure for omitido, Key reverterá seu resultado normal no
Microsoft Excel, e quaisquer atribuições de teclas especiais feitas
com métodos OnKey anteriores serão limpas.

Comentários

O argumento Key pode especificar qualquer tecla combinada com ALT, CTRL ou SHIFT, ou qualquer
combinação dessas teclas. Cada tecla é representada por um ou mais caracteres, tais como "a" para o
caractere a, ou "{ENTER}" para a tecla ENTER.

Para especificar caracteres que não são exibidos quando você pressiona a tecla correspondente (ENTER
ou TAB, por exemplo), use os códigos listados na tabela seguinte. Cada código da tabela representa uma
tecla no teclado.

Tecla Código Tecla Código

BACKSPACE {BACKSPACE} ou {BS} INS {INSERT}

BREAK {BREAK} SETA PARA A ESQUERDA {LEFT}

Fone: 4121-6166 Reprodução Proibida Pag.: 299


VBA para Excel

CAPS LOCK {CAPSLOCK} NUM LOCK {NUMLOCK}

CLEAR {CLEAR} PAGE DOWN {PGDN}

DELETE ou DEL {DELETE} ou {DEL} PAGE UP {PGUP}

SETA PARA BAIXO {DOWN} RETURN {RETURN}

END {END} SETA PARA A DIREITA {RIGHT}

ENTER (teclado numérico) {ENTER} SCROLL LOCK {SCROLLLOCK}

ENTER ~ (til) TAB {TAB}

ESC {ESCAPE} ou {ESC} SETA PARA CIMA {UP}

HELP {HELP} F1 a F15 {F1} a {F15}

HOME {HOME}

Você também pode especificar teclas combinadas com SHIFT e/ou CTRL e/ou ALT. Para especificar uma
tecla combinada com uma outra tecla ou teclas, use a tabela seguinte.

Para combinar teclas com Preceda o código da tecla com

SHIFT + (sinal de mais)

CTRL ^ (circunflexo)

ALT % (sinal de porcentagem)

Para atribuir um procedimento a um dos caracteres especiais (+, ^, % e assim por diante), coloque o
caractere entre chaves. Para obter detalhes, consulte o exemplo.

Exemplo

Este exemplo atribui "InsertProc" à sequência de teclas CTRL+SINAL DE ADIÇÃO e atribui


"SpecialPrintProc" à sequência de teclas SHIFT+CTRL+SETA À DIREITA.
Application.OnKey "^{+}", "InsertProc"
Application.OnKey "+^{RIGHT}", "SpecialPrintProc"

Este exemplo retorna SHIFT+CTRL+SETA À DIREITA ao seu significa normal.


Application.OnKey "+^{RIGHT}"

Este exemplo desativa a sequência de teclas SHIFT+CTRL+SETA À DIREITA.

Pag.: 300 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Application.OnKey "+^{RIGHT}", ""

Método Quit

Encerra o Microsoft Excel.

Sintaxe expressão.Quit

expressão Uma variável que representa um objeto Application.

Comentários

Se houver pastas de trabalho abertas que não tenham sido salvas quando você usar esse método, o
Microsoft Excel exibirá uma caixa de diálogo perguntando se você deseja salvar as alterações. É possível
impedir isso salvando todas as pastas de trabalho antes de usar o método Quit ou configurando a
propriedade DisplayAlerts como False. Quando essa propriedade é False, o Microsoft Excel não exibe a
caixa de diálogo ao sair das pastas de trabalho não salvas; ele as fecha sem salvá-las.

Se você definir a propriedade Saved para uma pasta de trabalho como True sem salvá-la no disco, o
Microsoft Excel irá sair sem pedir que você salve a pasta de trabalho.

Exemplo

Este exemplo salva todas as pastas de trabalho abertas e encerra o Microsoft Excel.

For Each w In Application.Workbooks

w.Save

Next w

Application.Quit

Fone: 4121-6166 Reprodução Proibida Pag.: 301


VBA para Excel

Método SendKeys

Envia pressionamentos de teclas para o aplicativo ativo.

Sintaxe expressão.SendKeys(Keys, Wait)

expressão Uma variável que representa um objeto Application.

Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados

A tecla ou combinação de teclas que você deseja enviar para o


Keys Obrigatório Variant
aplicativo, na forma de texto.

True para fazer com que o Microsoft Excel espere pelo


processamento das chaves antes de retornar o controle para a macro.
Wait Opcional Variant
False (ou omitido) para continuar executando a macro sem esperar o
processamento das chaves.

Comentários

Este método coloca os pressionamentos de teclas em uma memória intermediária de teclas. Em alguns
casos, você precisa chamar esse método antes de chamar o método que irá usar os pressionamentos de
teclas. Por exemplo, para enviar uma senha para uma caixa de diálogo você precisa chamar o método
SendKeys antes de exibir a caixa de diálogo.

O argumento Keys pode especificar qualquer tecla única ou qualquer tecla combinada com ALT, CTRL ou
SHIFT (ou qualquer combinação dessas teclas). Cada tecla é representada por um ou mais caracteres,
tais como "a" para o caractere a, ou "{ENTER}" para a tecla ENTER.

Para especificar caracteres que não são exibidos quando você pressiona a tecla correspondente (por
exemplo, ENTER ou TAB), use os códigos listados na tabela seguinte. Cada código da tabela representa
uma tecla no teclado.

Tecla Código Tecla Código

BACKSPACE {BACKSPACE} ou {BS} INS {INSERT}

BREAK {BREAK} SETA PARA A ESQUERDA {LEFT}

CAPS LOCK {CAPSLOCK} NUM LOCK {NUMLOCK}

CLEAR {CLEAR} PAGE DOWN {PGDN}

DELETE ou DEL {DELETE} ou {DEL} PAGE UP {PGUP}

Pag.: 302 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

SETA PARA BAIXO {DOWN} RETURN {RETURN}

END {END} SETA PARA A DIREITA {RIGHT}

ENTER (teclado numérico) {ENTER} SCROLL LOCK {SCROLLLOCK}

ENTER ~ (til) TAB {TAB}

ESC {ESCAPE} ou {ESC} SETA PARA CIMA {UP}

HELP {HELP} F1 a F15 {F1} a {F15}

HOME {HOME}

Você também pode especificar teclas combinadas com SHIFT e/ou CTRL e/ou ALT. Para especificar uma
tecla combinada com uma outra tecla ou teclas, use a tabela seguinte.

Para combinar uma tecla com Preceda o código da tecla com

SHIFT + (sinal de mais)

CTRL ^ (circunflexo)

ALT % (sinal de porcentagem)

Exemplo

Este exemplo usa o método SendKeys para encerrar o Microsoft Excel.


Application.SendKeys("%fx")

Método Volatile

Marca uma função definida pelo usuário como volátil. Uma função volátil precisa ser recalculada sempre
que ocorrem cálculos em qualquer célula da planilha. Um função não volátil só é recalculada quando as
variáveis de entrada são alteradas. Este método não tem efeito quando não está dentro de uma função
definida pelo usuário usada para calcular uma célula de pasta de trabalho.

Sintaxe expressão.Volatile(Volatile)

expressão Uma variável que representa um objeto Application.

Parâmetros

Obrigatório Tipo de
Nome Descrição
Opcional dados

Fone: 4121-6166 Reprodução Proibida Pag.: 303


VBA para Excel

True para marcar a função como volátil. False para marcar a


Volatile Opcional Variant
função com não volátil. o valor padrão é True

Exemplo

Este exemplo marca como volátil a função definida pelo usuário "My_Func". A função será recalculada
sempre que ocorrer um cálculo em quaisquer células da planilha nas quais a função apareça.
Function My_Func()

Application.Volatile

'

' Seu código aqui

'

End Function

Pag.: 304 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Método Wait

Pausa uma macro em execução até um momento especificado. Retorna True se o momento
especificado chegou.

Sintaxe expressão.Wait(Time)

expressão Uma variável que representa um objeto Application.

Parâmetros
Obrigatório Tipo de
Nome Descrição
Opcional dados

O momento no qual você deseja que a macro reinicie sua


Time Obrigatório Variant
execução, no formato de data do Microsoft Excel.

Valor de retorno Booleano

Comentários

O método Wait suspende toda a atividade do Microsoft Excel, podendo evitar que você efetue outras
operações em seu computador enquanto Wait está em efeito. Entretanto, os processos em segundo
plano, como impressão e recálculo, continuam.

Exemplo

Este exemplo pausa uma macro em execução até as 18:23 de hoje.


Application.Wait "18:23:00"

Este exemplo pausa a macro em execução por aproximadamente 10 segundos.


newHour = Hour(Now())

newMinute = Minute(Now())

newSecond = Second(Now()) + 10

waitTime = TimeSerial(newHour, newMinute, newSecond)

Application.Wait waitTime

O código acima pode ser substituído por:


Fone: 4121-6166 Reprodução Proibida Pag.: 305
VBA para Excel

Application.Wait Now + TimeValue("0:00:10")

Este exemplo exibe uma mensagem indicando se já se passaram 10 segundos.


If Application.Wait(Now + TimeValue("0:00:10")) Then

MsgBox "Time expired"

End If

Pag.: 306 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Apêndice 4

Propriedades do
Objeto
Workbooks

Fone: 4121-6166 Reprodução Proibida Pag.: 307


VBA para Excel

Principais propriedades do Objeto Workbooks


Uma propriedade é um atributo de um objeto que define uma das características do objeto (assim como
tamanho, cor ou localização na tela) ou um aspecto do seu comportamento (assim como se ela está
ativada ou visível). Para alterar as características de um objeto, você pode alterar os valores das suas
propriedades.

Para definir o valor de uma propriedade, coloque, após a referência a um objeto, um ponto, o nome da
propriedade, um sinal de igualdade (=) e o novo valor da propriedade.

Propriedade FullName

Retorna o nome do objeto, incluindo seu caminho no disco, na forma de uma sequência. Essa
propriedade é equivalente à propriedade Path, seguida pelo atual separador do sistema de arquivos, e
seguida pela propriedade Name.
'Exibe o caminho e o nome de arquivo de cada suplemento.

For Each a In AddIns

MsgBox a.FullName

Next a

'Exibe o caminho e o nome de arquivo da pasta de trabalho ativa

'(desde que a pasta de trabalho tenha sido salva).

MsgBox Workbooks(1).FullName

'ActiveWorkbook.FullName ou Workbooks("Lixo.xls").FullName

Propriedade Name

Retorna o nome do arquivo. Esta propriedade é somente leitura.


'Insere o nome do arquivo na célula ativa

ActiveCell = Workbook(1).Name

'ou ActiveCell = ActiveWorkbook.Name

Propriedade ProtectStructure

True se a ordem das planilhas na pasta de trabalho estiver protegida. Boolean de somente leitura.
Pag.: 308 Reprodução
Proibida Fone: 4121-6166
VBA para Excel

Sintaxe expressão.ProtectStructure

expressão Uma variável que representa um objeto Workbook.

Exemplo

Este exemplo exibirá uma mensagem se a ordem das planilhas na pasta de trabalho ativa estiver
protegida.
If ActiveWorkbook.ProtectStructure = True Then

MsgBox "Remember, you cannot delete, add, or change " & _

Chr(13) & _

"the location of any sheets in this workbook."

End If

Propriedade Saved

True se nenhuma alteração tiver sido feita à pasta de trabalho especificada desde a última vez em que
foi salva. Boolean de leitura e gravação.

Você pode definir essa propriedade como True se desejar fechar uma pasta de trabalho modificada sem
ter que salvá-la ou ser avisado para salvá-la.
'Exibe uma mensagem se a pasta de trabalho ativa

'contiver alterações não salvas.

If Not ActiveWorkbook.Saved Then 'Workbooks(Index ou Nome).Saved

MsgBox "As alterações desta Pasta de trabalho não foram salvas."

End If

'Fecha a pasta de trabalho que contém o código de exemplo e

'descarta quaisquer alterações feitas na pasta de trabalho

'definindo a propriedade Saved como True.

ThisWorkbook.Saved = True 'Workbooks(Index ou Nome).Saved = True

ThisWorkbook.Close 'Workbooks(Index ou Nome).Close

Propriedade Sheets

Fone: 4121-6166 Reprodução Proibida Pag.: 309


VBA para Excel

Objeto Application: Retorna uma coleção Sheets representando todas as planilhas na pasta de trabalho
ativa. Somente leitura.

Objeto Workbook: Retorna uma coleção Sheets representando todas as planilhas na pasta de trabalho
especificada. Somente leitura.

O uso dessa propriedade sem um qualificador de objeto equivale a usar ActiveWorkbook.Sheets.


'cria uma nova planilha e, em seguida, coloca,

'na coluna A, uma lista com os nomes das planilhas

'da pasta de trabalho ativa.

Set newSheet = Sheets.Add(Type:=xlWorksheet)

For i = 1 To Sheets.Count

newSheet.Cells(i, 1).Value = Sheets(i).Name

Next i

Pag.: 310 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Apêndice 5

Métodos do
Objeto Workbook

Fone: 4121-6166 Reprodução Proibida Pag.: 311


VBA para Excel

Principais métodos do Objeto Workbook

O objeto Workbook é um membro da coleção Workbooks. A coleção Workbooks contém todos os


objetos Workbook atualmente abertos no Microsoft Excel.

Método Activate

Ativa a primeira janela associada à pasta de trabalho. Isso não causa a execução de nenhuma macro
Ativar_auto ou Desativar_auto que possa estar anexada à pasta de trabalho (use o método
RunAutoMacros para executar essas macros).
Worksheets("Plan1").Activate 'ativa Plan1.

'seleciona as células A1:C3 de Plan1 e, em seguida, faz de B2 a célula ativa.

Worksheets("Plan1").Activate

Range("A1:C3").Select

Range("B2").Activate

'ativa Pasta4.xls. Se Pasta4.xls tiver várias janelas,

'o exemplo ativará a primeira janela, Pasta4.xls:1.

Workbooks("Pasta4.XLS").Activate

Método Add

Cria uma nova pasta de trabalho, que se tornará a pasta de trabalho ativa.

Sintaxe expressão.Add(Template)

expressão Uma variável que representa um objeto Workbooks.

Pag.: 312 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Parâmetros

Obrigatório Tipo de
Nome Descrição
Opcional dados

Determina como a nova pasta de trabalho será criada. Se este argumento for
uma cadeia de caracteres especificando o nome de um arquivo do Microsoft
Excel existente, a nova pasta de trabalho será criada com o arquivo
especificado como modelo. Se esse argumento for uma constante, a nova
pasta de trabalho conterá uma única planilha do tipo especificado. Pode ser
Template Opcional Variant
uma destas constantes XlWBATemplate: xlWBATChart,
xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet ou
xlWBATWorksheet. Se esse argumento for omitido, o Microsoft Excel criará
uma nova pasta de trabalho com algumas planilhas em branco (o número de
planilhas é definido pela propriedade SheetsInNewWorkbook).

Valor de retorno: Um objeto Workbook que representa a nova pasta de trabalho.

Comentários: Quando o argumento Template especifica um arquivo, o nome do arquivo pode incluir
um caminho.
'cria uma nova pasta de trabalho.

Workbooks.Add

Método Close

Fecha o objeto.

A coleção Workbooks usa a Sintaxe 1.

Os objetos Window e Workbook usam a Sintaxe 2.

Sintaxe 1 expressão.Close

Sintaxe 2 expressão.Close(SaveChanges, FileName, RouteWorkbook)

expressão Obrigatória.

Uma expressão que retorne um objeto da lista Relativo a Workbooks.

SaveChanges Variant opcional.

Se não houver alterações na pasta de trabalho, esse argumento será ignorado. Se


houver alterações na pasta de trabalho e ela aparecer em outras janelas abertas,
esse argumento será ignorado. Se houver alterações na pasta de trabalho, mas ela
não aparecer em qualquer outra janela aberta, esse argumento especificará se as
alterações devem ser salvas, como mostrado na tabela seguinte.

Fone: 4121-6166 Reprodução Proibida Pag.: 313


VBA para Excel

Valor Ação

True Salva as alterações na pasta de trabalho. Se ainda não houver um nome de arquivo
associado à pasta de trabalho, FileName será usado. Se FileName for omitido, o usuário
será solicitado a fornecer um nome de arquivo.

False Não salva as alterações nesse arquivo.

Omitido Exibe uma caixa de diálogo perguntando ao usuário se as alterações devem ser salvas.

FileName Variant opcional. As alterações são salvas sob este nome de arquivo.

RouteWorkbook Variant opcional. Se a pasta de trabalho não precisar ser encaminhada para o próximo
destinatário (se não tiver lista de circulação ou se já tiver sido encaminhada), este argumento será
ignorado. Caso contrário, o Microsoft Excel encaminhará a pasta de trabalho como mostrado na tabela
seguinte.

Valor Significado

True Envia a pasta de trabalho para o próximo destinatário.

False Não envia a pasta de trabalho.

Omitido Exibe uma caixa de diálogo perguntando ao usuário se a pasta de trabalho deve ser
enviada.

O fechamento de uma pasta de trabalho a partir do Visual Basic não causa a execução de macros
Auto_Fechar da pasta de trabalho. Use o método RunAutoMacros para executar as macros de
fechamento automático.
'Fecha Pasta1.xls e descarta quaisquer alterações

'que tenham sido feitas nela.

Workbooks("Pasta1.XLS").Close SaveChanges:=False

Fecha todas as pastas de trabalho abertas. Se houver alterações em alguma pasta de trabalho aberta, o
Microsoft Excel exibirá os avisos e caixas de diálogo apropriadas para salvamento das alterações.
Workbooks.Close

'Salva e fecha o arquivo Dados.xls com o nome: Produtos.xls

Workbooks("Dados.xls").Close True, "C:\Vendas\Produtos.xls"

Método Open

Pag.: 314 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Abre uma pasta de trabalho. Se a pasta de trabalho sendo aberta tiver quaisquer macros Auto_Open,
estas não serão executadas quando você abrir o arquivo a partir do Visual Basic. Se você desejar
executar a macro Auto_Open, você deverá usar o método RunAutoMacros.

Sintaxe expressão.Open(FileName, UpdateLinks, ReadOnly, Format, Password,


WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify,
Converter, AddToMru, Local, CorruptLoad)

Expressão Uma variável que representa um objeto Workbooks.

Parâmetros

Todos os argumentos são do tipo Variant e Opcionais. Com exceção do nome CorruptLoad cujo tipo de
dado é XlCorruptLoad.
Nome Descrição

FileName String. O nome de arquivo da pasta de trabalho a ser aberta.

Especifica o modo pelo qual são atualizadas as referências externas (vínculos) no arquivo,
como a referência a um intervalo na pasta de trabalho Orçamento.xls nesta fórmula:
=SOMA([Orçamento.xls]Anual!C10:C25). Se esse argumento for omitido, o usuário será
solicitado a especificar como será feita a atualização dos vínculos. Para obter mais
UpdateLinks
informações sobre os valores usados por este parâmetro, consulte a seção Comentários.
Se o Microsoft Excel estiver abrindo um arquivo no formato WKS, WK1 ou WK3 e o
argumento UpdateLinks for 0, nenhum gráfico será criado; caso contrário, o Microsoft
Excel gerará gráficos a partir dos gráficos anexados ao arquivo.

ReadOnly True para abrir a pasta de trabalho em modo somente leitura.

Se o Microsoft Excel estiver abrindo um arquivo de texto, este argumento especificará o


caractere delimitador. Se esse argumento for omitido, o delimitador atual será usado.
Format
Para obter mais informações sobre os valores usados por este parâmetro, consulte a
seção Comentários.

Uma cadeia de caracteres que contém a senha Obrigatória para abrir uma pasta de
Password trabalho protegida. Se este argumento for omitido e a pasta de trabalho exigir uma
senha, o usuário será solicitado a fornecê-la.

Uma cadeia de caracteres que contém a senha Obrigatória para gravar em uma pasta de
WriteResPassword trabalho de gravação reservada. Se este argumento for omitido e a pasta de trabalho
exigir uma senha, o usuário será solicitado a fornecê-la.

True para que o Microsoft Excel não exiba a mensagem de recomendação somente
IgnoreReadOnlyRecommended leitura (se a pasta de trabalho tiver sido salva com a opção Recomendável Somente
Leitura).

Se o arquivo for um arquivo de texto, este argumento indicará qual a sua origem (para
que as páginas de código e o retorno de carro/alimentação de linha (CR/LF) possam ser
Origin mapeados corretamente). Pode ser uma destas constantes XlPlatform: xlMacintosh,
xlWindows ou xlMSDOS. Se esse argumento for omitido, o sistema operacional atual será
usado.

Fone: 4121-6166 Reprodução Proibida Pag.: 315


VBA para Excel

Nome Descrição

Se o arquivo for um arquivo de texto e o argumento Format for 6, este argumento será
uma cadeia de caracteres que especificará o caractere a ser usado como delimitador. Por
Delimiter
exemplo, use Chr(9) para tabulações, use "," para vírgulas, use ";" para ponto-e-vírgulas
ou use um caractere personalizado. Somente o primeiro caractere da cadeia é usado.

Se o arquivo for um suplemento do Microsoft Excel 4.0, este argumento será True para
abrir o suplemento como uma janela visível. Se esse argumento for False ou omitido, o
suplemento será aberto como oculto e não poderá deixar de ser oculto. Esta opção não
Editable
se aplica a suplementos criados no Microsoft Excel 5.0 ou posterior. Se o arquivo for um
modelo do Excel, True abrirá o modelo especificado para edição e False abrirá uma nova
pasta de trabalho baseada no modelo especificado. O valor padrão é False.

Se o arquivo não puder ser aberto em modo de leitura/gravação, este argumento será
True para adicionar o arquivo à lista de notificação de arquivos. O Microsoft Excel abrirá o
arquivo como somente leitura, pesquisará a lista de notificação de arquivos e avisará o
Notify
usuário quando o arquivo ficar disponível. Se esse argumento for False ou omitido,
nenhuma notificação será solicitada e qualquer tentativa de abrir um arquivo não
disponível falhará.

O índice do primeiro conversor de arquivo a tentar abrir o arquivo. O conversor de


arquivo especificado é experimentado primeiro; se ele não reconhecer o arquivo, os
Converter
outros conversores serão usados. O índice do conversor compreende os números de
linha dos conversores retornados pela propriedade FileConverters.

True para adicionar esta pasta de trabalho à lista de arquivos utilizados recentemente. O
AddToMru
valor padrão é False.

True salva os arquivos no idioma do Microsoft Excel (incluindo as configurações do painel


de controle). False (padrão) salva os arquivos no idioma do Visual Basic for Applications
Local (VBA), que geralmente é o inglês (EUA), a menos que o projeto VBA em que
Workbooks.Open está sendo executado seja um projeto VBA XL5/95 antigo
internacionalizado.

Pode ser uma destas constantes: xlNormalLoad, xlRepairFile e xlExtractData. O


CorruptLoad comportamento padrão se nenhum valor for especificado será xlNormalLoad e não
tentará recuperação quando iniciado com o OM.

Valor de retorno: Um objeto Workbook que representa a pasta de trabalho aberta.

Comentários

Por padrão, as macros são habilitadas durante a abertura de arquivos por programação. Use a
propriedade AutomationSecurity para definir o modo de segurança de macro usado ao abrir arquivos
por programação.
Você pode especificar um destes valores no parâmetro UpdateLinks para determinar se as referências
externas (vínculos) serão atualizadas quando a pasta de trabalho for aberta:

Valor Significado

0 As referências externas (vínculos) não serão atualizadas quando a pasta de trabalho for aberta.

3 As referências externas (vínculos) serão atualizadas quando a pasta de trabalho for aberta.

Pag.: 316 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Você pode especificar um destes valores no parâmetro Format para determinar o caractere delimitador
do arquivo:
Valor Delimitador

1 Tabulações

2 Vírgulas

3 Espaços

4 Ponto-e-vírgulas

5 Nada

6 Caractere personalizado (consulte o argumento Delimiter)

Exemplo

Este exemplo abre a pasta de trabalho Analysis.xls e executa sua macro Auto_Open.
'Abre a pasta de trabalho Analysis.xls e,

'em seguida, executa sua macro Auto_Open.

Workbooks.Open "ANALYSIS.XLS"

ActiveWorkbook.RunAutoMacros xlAutoOpen

'Abre um arquivo de um certo caminho e com senha.

Workbooks.OpenFilename:="C:\Caminho\NomeDoArquivo.xls", password:="Senha"

Método Protect

Protege uma pasta de trabalho para que não possa ser modificada.

Sintaxe expressão.Protect(Password, Structure, Windows)


'Protege a pasta de trabalho ativa.

ActiveWorkbook.Protect Password:="Senha"

'Protege, com senha, a estrutura e a janela pasta de trabalho NomeDoArquivo.

Workbooks("NomeDoArquivo.xls").Protect "Senha", True, True

Método RunAutoMacros

Fone: 4121-6166 Reprodução Proibida Pag.: 317


VBA para Excel

Executa a macro Auto_Open, Auto_Close, Auto_Activate ou Auto_Deactivate anexada à pasta de


trabalho. Esse método é incluído para compatibilidade com versões anteriores.

Para código novo do Visual Basic, você deve usar os eventos Open, Close, Activate e Deactivate em vez
dessas macros.

Sintaxe expressão.RunAutoMacros(Which)

expressão Obrigatória. Uma expressão que retorne um objeto Workbook.

Which Obrigatório. As macros a serem executadas. Pode ser uma das seguintes constantes
XlRunAutoMacro:

Constante Descrição

xlAutoOpen Macros Auto_Open

xlAutoClose Macros Auto_Close

xlAutoActivate Macros Auto_Activate

xlAutoDeactivate Macros Auto_Deactivate

'Abre a pasta de trabalho Analysis.xls e, executa sua macro Auto_Open.

Workbooks.Open "ANALYSIS.XLS"

ActiveWorkbook.RunAutoMacros xlAutoOpen

'Executa a macro Auto_Close da pasta de trabalho ativa e,

'fecha a pasta de trabalho.

With ActiveWorkbook

.RunAutoMacros xlAutoClose

.Close

End With

Pag.: 318 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Método Save
Salva alterações na pasta de trabalho especificada.

Este exemplo salva a pasta de trabalho ativa.


ActiveWorkbook.Save

Este exemplo salva todas as pastas de trabalho ativas e então fecha o Microsoft Excel.
For Each w In Application.Workbooks

w.Save

Next w

Application.Quit

Método SaveAs
Salva as alterações da pasta de trabalho em um arquivo diferente.

Este exemplo cria uma nova pasta de trabalho, solicita um nome de arquivo ao usuário e, em seguida,
salva a pasta de trabalho.
Set NewBook = Workbooks.Add

Do

fName = Application.GetSaveAsFilename

Loop Until fName <> False

NewBook.SaveAs Filename:=fName

Método SaveCopyAs

Salva uma cópia da pasta de trabalho em um arquivo mas não modifica a pasta de trabalho aberta na
memória.

Este exemplo salva uma cópia da pasta de trabalho ativa.


ActiveWorkbook.SaveCopyAs "C:\Caminho\NomeDaPasta.XLS"

Fone: 4121-6166 Reprodução Proibida Pag.: 319


VBA para Excel

Método SendMail

Envia a pasta de trabalho usando o sistema de correio eletrônico instalado.

Sintaxe expressão.SendMail(Recipients, Subject, ReturnReceipt)

expressão Obrigatória.

Uma expressão que retorna um objeto Workbook.

Recipients Variant obrigatória.

Especifica o nome do destinatário como texto ou como uma matriz de sequências de


texto, se houver vários destinatários. Pelo menos um destina-tário deve ser
especificado e todos são adicionados como destinatários Para.

Subject Variant opcional. Especifica o assunto da mensagem. Se este argumento for omitido,
o nome do documento será usado.

ReturnReceipt Variant opcional. True para solicitar uma confirmação de recebimento. False para
não solicitar um recibo de retorno. O valor padrão é False.
'Envia a pasta de trabalho ativa para um único destinatário.

ActiveWorkbook.SendMail recipients:="Jean Selva"

Método Unprotect

Remove a proteção de uma planilha ou pasta de trabalho. Este método não tem efeito se a planilha ou
pasta de trabalho não estiver protegida.

Sintaxe expressão.Unprotect(Password)

expressão Obrigatória.

Uma expressão que retorne um objeto Chart, Workbook ou Worksheet.

Password Variant opcional.

Uma sequência que denote a senha (que pode usar maiúsculas e minúsculas) a ser
usada para desproteger a planilha ou pasta de trabalho. Se a planilha ou pasta de
trabalho não estiver protegida com uma senha, esse argumento será ignorado. Se
você omitir esse argumento para uma planilha que esteja prote-gida com uma senha,
você será solicitado a digitar a senha.

Pag.: 320 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Se você omitir esse argumento para uma pasta de trabalho que esteja protegida com
uma senha, o método falhará.

Comentários

Se você esquecer a senha, você não poderá desproteger a planilha ou pasta de trabalho. É uma boa
ideia guardar em lugar seguro uma lista de suas senhas e dos nomes dos documentos correspondentes.
'remove a proteção da pasta de trabalho ativa.

ActiveWorkbook.Unprotect

Fone: 4121-6166 Reprodução Proibida Pag.: 321


VBA para Excel

Apêndice 6

Métodos
do Objeto
Worksheet

Pag.: 322 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Principais Métodos do objeto Worksheet

Um método é uma ação que um objeto pode executar. Por exemplo, Add é um método do objeto
Worksheet, pois adiciona uma nova planilha a uma pasta de trabalho.

Método Add

Cria uma nova planilha.

A nova planilha se torna a planilha ativa.

Retorna um objeto Worksheet.

Sintaxe expressão.Add(Before, After, Count, Type)

expressão Obrigatória. Uma expressão que retorne um objeto Worksheets.

Before Variant opcional. Um objeto que especifica a planilha antes da qual a nova planilha será
adicionada.

After Variant opcional. Um objeto que especifica a planilha após a qual a nova planilha é
adicionada.

Count Variant opcional. O número de planilhas a serem adicionadas. O valor padrão é 1

Type Variant opcional. O tipo da planilha. Pode ser uma das seguintes constantes
XlSheetType: xlWorksheet, xlExcel4MacroSheet ou xlExcel4IntlMacroSheet. O valor
padrão é xlWorksheet.

Comentários

Se Before e After forem omitidos, a nova planilha será inserida antes da planilha ativa.
'cria uma nova planilha e a insere antes da planilha ativa.

ActiveWorkbook.Worksheets.Add

'adiciona uma nova planilha após a última planilha da pasta ativa.

Worksheets.Add.Move after:=Worksheets(Worksheets.Count)

Fone: 4121-6166 Reprodução Proibida Pag.: 323


VBA para Excel

Método Copy

Sintaxe 1: Copia o objeto para a Área de transferência. Copia uma figura do ponto ou sequência
para a Área de transferência.
expressão.Copy

Sintaxe 2: Copia o Range para o intervalo especificado ou para a Área de transferência.


expressão.Copy(Destination)

Sintaxe 3: Copia a planilha para um outro lugar na pasta de trabalho.


expressão.Copy(Before, After)

expressão Obrigatória. Uma expressão que retorne um objeto da lista Relativo a. Para copiar uma
folha de gráfico inteira, use a Sintaxe 3 com o objeto Chart. Para copiar somente a área
do gráfico, use a Sintaxe 1 com o objeto ChartArea.

Destination Variant opcional. Especifica o novo intervalo para o qual o intervalo especificado será
copiado. Se esse argumento for omitido, o Microsoft Excel copiará o intervalo para a
Área de transferência.

Before Sintaxe 3: Variant opcional. A planilha antes da qual a planilha copiada será colocada.

After Variant opcional. A planilha após a qual a planilha copiada será colocada.

Comentários

Se você não especificar Before ou After, o Microsoft Excel criará uma nova pasta de trabalho contendo a
planilha copiada.

Exemplos:
'copia Plan1, colocando a cópia depois de Plan3.

Worksheets("Plan1").Copy after:=Worksheets("Plan3")

'copia o intervalo usado em Plan1, cria uma nova planilha e, em seguida,

'cola os valores do intervalo copiado na nova planilha.

Worksheets("Plan1").UsedRange.Copy

Set newSheet = Worksheets.Add

newSheet.Range("A1").PasteSpecial Paste:=xlValues

'copia as fórmulas das células A1:D4 de Plan1 nas células E5:H8 de Plan2.

Pag.: 324 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Worksheets("Plan1").Range("A1:D4").Copy _

destination:=Worksheets("Plan2").Range("E5")

Método Delete

Exclui o objeto

A Sintaxe 2 só se aplica a objetos Range.

Sintaxe 1 expressão.Delete

Sintaxe 2 expressão.Delete(Shift)

expressão Obrigatória. Uma expressão que retorne um objeto da lista Relativo a.

Shift Variant opcional. Usado somente com objetos Range. Especifica como deslocar células
para substituir as células excluídas. Pode ser uma das seguintes constan-tes
XlDeleteShiftDirection: xlShiftToLeft ou xlShiftUp. Se esse argumento for omitido, o
Microsoft Excel decidirá com base na forma do intervalo.

Comentários

A exclusão de um objeto Point ou LegendKey acarreta a exclusão de toda a sequência.

Você pode excluir propriedades de documento personalizadas, mas não pode excluir uma propriedade
interna do documento.

Exemplos:
'exclui as células A1:D10 de Plan1 e desloca as células

'restantes para a esquerda.

Worksheets("Plan1").Range("A1:D10").Delete Shift:=xlShiftToLeft

'exclui a Plan3 da pasta de trabalho ativa sem exibir

'a caixa de diálogo de confirmação.

Application.DisplayAlerts = False

Worksheets("Plan3").Delete

Application.DisplayAlerts = True

Fone: 4121-6166 Reprodução Proibida Pag.: 325


VBA para Excel

'classifica os dados da primeira coluna da Plan1 e, em seguida,

'exclui as linhas que contêm dados duplicados.

Worksheets("Plan1").Range("A1").Sort key1:=Worksheets("Plan1").Range("A1")

Set currentCell = Worksheets("Plan1").Range("A1")

Do While Not IsEmpty(currentCell)

Set nextCell = currentCell.Offset(1, 0)

If nextCell.Value = currentCell.Value Then

currentCell.EntireRow.Delete

End If

Set currentCell = nextCell

Loop

Método Move

Move a planilha para um outro lugar na pasta de trabalho.

Sintaxe expressão.Move(Before, After)

expressão Obrigatória. Uma expressão que retorne um objeto da lista Relativo a.

Before Variant opcional. A planilha antes da qual a planilha movida será colocada.

After Variant opcional. A planilha após a qual a planilha movida será colocada.

Comentários

Se você não especificar Before ou After, o Microsoft Excel criará uma nova pasta de trabalho contendo a
planilha movida.
'move Sheet1 para depois de Sheet3 na pasta de trabalho ativa.

Worksheets("Sheet1").Move after:=Worksheets("Sheet3")

Método Select

Seleciona o objeto.

Sintaxe expressão.Select(Replace)

Pag.: 326 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

expressão Obrigatória. Uma expressão que retorne um objeto da lista Relativo a.

Replace Variant opcional (usado somente com planilhas). True para substituir a seleção atual
pelo objeto especificado. False para estender a seleção atual para incluir qualquer
objeto anteriormente selecionado e o objeto especificado.

Comentários

Para selecionar uma célula ou um intervalo de células, use o método Select. Para tornar uma única
célula a célula ativa, use o método Activate.
'seleciona as células A1:B3 de Plan1.

Worksheets("Plan1").Activate

Range("A1:B3").Select

Fone: 4121-6166 Reprodução Proibida Pag.: 327


VBA para Excel

Apêndice 7

Propriedades do
objeto Worksheet

Pag.: 328 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Principais Propriedades do objeto Worksheet


Uma propriedade é um atributo de um objeto que define uma das características do objeto (assim como
tamanho, cor ou localização na tela) ou um aspecto do seu comportamento (assim como se ela está
ativada ou visível). Para alterar as características de um objeto, você pode alterar os valores das suas
propriedades.

Para definir o valor de uma propriedade, coloque, após a referência a um objeto, um ponto, o nome da
propriedade, um sinal de igualdade (=) e o novo valor da propriedade.

Propriedade Count
Retorna o número de objetos da coleção.
'exibe o número de colunas na seleção em Plan1.

'O código também testa se a seleção é de área múltipla;

'se for o caso, o código fará um loop pelas áreas da seleção

'de múltiplas áreas.

Worksheets("Plan1").Activate

areaCount = Selection.Areas.Count

If areaCount <= 1 Then

MsgBox "The selection contains " & _

Selection.Columns.Count & " columns."

Else

For i = 1 To areaCount

MsgBox "Area " & i & " of the selection contains " & _

Selection.Areas(i).Columns.Count & " columns."

Next i

End If

'faz do último caractere da célula A1 um caractere sobrescrito.

n = Worksheets("Plan1").Range("A1").Characters.Count

Worksheets("Plan1").Range("A1").Characters(n, 1).Font.Superscript = True

Fone: 4121-6166 Reprodução Proibida Pag.: 329


VBA para Excel

Propriedade HPageBreaks

Retorna uma coleção HPageBreaks que representa as quebras de página horizontais da planilha.
Somente leitura.

Sintaxe expressão.HPageBreaks

expressão Uma variável que representa um objeto Worksheets.

Comentários Há um limite de 1026 quebras de página horizontais por planilha.

Exemplo

Este exemplo exibe o número de quebras de página horizontais de área de impressão e de tela inteira.

For Each pb in Worksheets(1).HPageBreaks


If pb.Extent = xlPageBreakFull Then
cFull = cFull + 1
Else
cPartial = cPartial + 1
End If
Next
MsgBox cFull & " full-screen page breaks, " & cPartial & _
" print-area page breaks"

Retorna uma coleção HPageBreaks representando as quebras de página horizontais da planilha.


'exibe o número de quebras de página horizontais de área de

'impressão e de tela inteira.

For Each pb in Worksheets(1).HPageBreaks

If pb.Extent = xlPageBreakFull Then

cFull = cFull + 1

Else

cPartial = cPartial + 1

End If

Next

Pag.: 330 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

MsgBox cFull & " full-screen page breaks, " & cPartial & _

" print-area page breaks"

Propriedade Item

Retorna um único objeto Worksheet de uma coleção Worksheets.

Sintaxe expressão.Item(Index)

expressão Obrigatória. Uma expressão que retorne um objeto Worksheets.

Index Variant obrigatória. O nome ou número de índice da planilha.


'altera o local da quebra de página vertical um.
Worksheets.Item(1).VPageBreaks(1).Location = .Range("e5")

Propriedade Visible
True se o objeto está visível. Para um gráfico ou planilha, essa propriedade pode ser definida como
xlVeryHidden. Isso oculta o objeto para que a única maneira de você torná-lo novamente visível seja
definindo essa propriedade como True (o usuário não pode tornar o objeto visível). Boolean ou Long de
leitura e gravação.

Comentários

A propriedade Visible para um item de tabela dinâmica é True quando o item está atualmente visível na
tabela.

Se você definir a propriedade Visible de um nome como False, o nome não aparecerá na caixa de
diálogo Definir nome.
'oculta Plan1.

Worksheets("Plan1").Visible = False

'torna Plan1 visível.

Worksheets("Plan1").Visible = True

'torna visível todas as planilhas da pasta de trabalho ativa.

For Each sh In Sheets

sh.Visible = True

Next sh

'cria uma nova planilha e, em seguida, define sua propriedade Visible como

Fone: 4121-6166 Reprodução Proibida Pag.: 331


VBA para Excel

'xlVeryHidden. Para referir-se à planilha, use sua variável de objeto,

'newSheet, como mostrado na última linha do exemplo. Para usar a variável

'de objeto newSheetem um outro procedimento, você precisa declará-la como

'uma variável pública (Public newSheet As Object) na primeira linha do

'módulo antes de qualquer procedimento Sub ou Function.

Set newSheet = Worksheets.Add

newSheet.Visible = xlVeryHidden

newSheet.Range("A1:D4").Formula = "=RAND()"

Propriedade VPageBreaks

Retorna uma coleção VPageBreaks representando as quebras de página verticais da planilha.


'exibe o número total de quebras de página verticais de área de

'impressão e de tela inteira.

For Each pb in Worksheets(1).VPageBreaks

If pb.Extent = xlPageBreakFull Then

cFull = cFull + 1

Else

cPartial = cPartial + 1

End If

Next

MsgBox cFull & " full-screen page breaks, " & cPartial & _

" print-area page breaks"

Propriedade EnableSelection

Retorna ou define o que pode ser selecionado na planilha.

Pode ser uma das seguintes constantes XlEnableSelection: xlNoRestrictions, xlNoSelection ou


xlUnlockedCells. Long de leitura e gravação.

Comentários

Pag.: 332 Reprodução


Proibida Fone: 4121-6166
VBA para Excel

Essa propriedade só funciona quando a planilha está protegida: xlNoSelection impede qualquer seleção
na planilha, xlUnlockedCells permite que apenas as células cuja propriedade Locked seja False sejam
selecionadas e xlNoRestrictions permite que qualquer célula seja selecionada.

'define a planilha um de modo que nada possa ser selecionado nela.

With Worksheets(1)

.EnableSelection = xlNoSelection

.Protect Contents:=True, UserInterfaceOnly:=True

End With

Propriedade ScrollArea

Retorna ou define o intervalo onde se permite rolagem, como uma referência de intervalo em estilo A1.
As células fora da área de rolagem não podem ser selecionadas. String de leitura e gravação.

Comentários

Defina essa propriedade com uma cadeia de caracteres vazia ("") para permitir seleção de células para
toda a planilha.
'define a área de rolagem para a planilha um.

Worksheets(1).ScrollArea = "a1:f10"

Propriedade ProtectContents

True se o conteúdo da planilha está protegido. Em um gráfico, isso protege o gráfico inteiro. Em uma
planilha, isso protege as células individuais. Boolean somente leitura.

Este exemplo exibe uma caixa de mensagem se o conteúdo de Sheet1 estiver protegido.
If Worksheets("Sheet1").ProtectContents = True Then

MsgBox "The contents of Sheet1 are protected."

End If

Fone: 4121-6166 Reprodução Proibida Pag.: 333

Você também pode gostar