Anda di halaman 1dari 295

Abra este livro e

descubra como:
Trabalhar no Visual Basic
Editor
Dicas para lidar com erros e
exterminao de bugs
Maneiras de montar
procedimentos e eventos
automticos
Como usar o gravador de
macro Excel
Tcnicas e armadilhas de
UserForm
Instrues para projetar
macros VBA
Etapas para acessar suas
macros atravs da interface
de usurio
Segredos para criar
add-ins Excel
www.altabooks.com.br
P
r
o
g
r
a
m
a
n
d
o
E
x
c
e
l

V
B
A
JOHN WALKENBACH
Autor do best-seller
Programando Excel 2007 VBA Para Leigos
Aprenda a:
Usar as ferramentas essenciais e as
operaes em VBA
Trabalhar com objetos Range e
fluxo de controle de programa
Lidar com erros e eliminar
bugs em seu cdigo
Desenvolver interfaces de usurio
personalizadas para os seus aplicativos,
incluindo caixas de dilogo
P
r

o
g
r
a
m
a
n
d
o
E
x
c
e
l

V
B
A
Voc est pronto para fazer o Excel pular
entre argolas? As suas planilhas funcionam
exatamente da maneira desejada? Com este
livro, voc pode dizer sim! Em seu interior,
voc encontrar instrues passo a passo sobre
como aperfeioar significativamente a potncia
do Excel, usando a linguagem VBA. Logo ser
possvel montar os seus prprios aplicativos
Excel para conseguir o mximo de seus dados.
Mergulhe em VBA veja como VBA
implementado em Excel, aplique tcnicas avanadas
e use VBA com outros aplicativos Ofce
Entre nele explore os conceitos de programao
a partir de objetos Range e funes de planilhas
para eventos e manuseio de erros
Comunicao a chave aprenda como montar
caixas de dilogo que parecem ter vindo
diretamente do laboratrio de software da Microsoft
Segurana em primeiro lugar use macros Excel
para tornar as suas planilhas mais seguras e
bloquear vrus
Torne-o seu desenvolva funes personalizadas,
crie add-ins, projete aplicativos orientados por
usurio e incremente suas opes de carreira
Acesse o site
www.paraleigos.com.br
e conhea outros ttulos!
Acelere na faixa de
alta velocidade do
Excel e dispare pelas
personalizaes de
planilhas
John Walkenbach tambm conhecido como Mr.
Planilha a maior autoridade em Excel. Criador do
premiado Power Utility Pack, Walkenbach escreveu
mais de 50 livros e 300 artigos para publicaes,
incluindo PC World, InfoWorld e Windows.
ISBN 978-85-7608-680-2
Computadores/Spreadsheets
Tornando tudo m

ais fcil!
Traduo da 2 Edio
Walkenbach
VBA Excel.indd 1 15/02/2013 14:17:41
Abs Retorna a um valor de um nmero absoluto
Array Retorna uma variante que esta em ordem
Asc Converte um caractere para um valor ASCII
Atn Retorna o nmero inicial
CallByName Invoca ou prepara um mtodo de propriedade
CBool Converte uma expresso para boolean
CByte Converte uma expresso para um tipo de dados
CCur Converte uma expresso de um tipo de dados para a moeda
CDate Converte uma expresso de um tipo de dados para o dia
CDbl Converte uma expresso de um tipo de dados em dupla
CDec Converte uma expresso de um tipo de dados em
Choose Seleciona e retorna um valor da lista
Chr Converte um valor ANSI da la
CInt Converte um tipo de dados em uma expresso inteira
CLng Converte uma expresso longa de um tipo de dados
Cos Retorna o co-seno de um nmero
CreateObject
Cria um automaticamente um objeto OLE
CSng Converte um tipo de dados em uma nica expresso
CStr Converte uma la de expresso de um tipo de dados
CurDir Retorna par o caminho atual
CVar Converte um tipo de dados em uma varivel
CVDate Converte um tipo de dados um uma expresso
CVErr Retorna at um nmero de nido como errado
Date Retorna at o sistema de dados atual
DateAdd Retorna a uma data especi ca acrescentando intervalos
sequenciais
DateDiff Retorna a uma data especi ca subtraindo intervalos
DatePart Retorna a uma parte da data que contm algo especi co
DateSerial Converte uma data em uma serie de nmero
DateValue Converte um la de dados
Day Retorna o dia do ms de um dado
DDB Retorna um ativo para um perodo especi co usando um mtodo
decrescente
Dir Retorna o nome de um arquivo ou diretrio correspondente a
um padro
DoEvents Submete a execuo, para que o sistema possa processar outros
eventos
Environ Retorna uma la associada com o sistema de operao varivel
EOF Retorna True se o texto do arquivo tiver chego no nal
Error Retorna a mensagem de erro correspondente a um nmero
incorreto
Exp Retorna a base natural do logartimo aumentando a fora
FileAttr Retorna o modo de arquivo para texto
Exp Retorna para o dia e a hora que o arquivo foi modi cado pela
ultima vez
FileLen Retorna para o nmero de bytes de um arquivo
Filter Retorna um subconjunto de grande variedade que ltra base de
critrios
Fix Retorna a poro inteira de um nmero
Format Mostra uma expresso particularmente formatada
Format
Currency
Retorna um nmero como uma linha formatada como moeda
FormatDate
Time

Retorna um nmero como uma linha formatada no dia e hora


Format
Number
Retorna um nmero formatado como linha
Format
Percent
Retorna um nmero como uma linha, formatado com
porcentagem
FreeFile Retorna para o prximo arquivo disponvel para usar a
declarao Open
FV Retorna o futuro valor baseado no perodo de anuidade xa,
pagamentos e taxa de juros xa
GetAll Retorna uma lista de con guraes e valores (con gurao original
criada com SaveSetting) de uma aplicao registrada pelo Windows
GetAttr Retorna um cdigo atribudo que representa um arquivo
GetObject Recupera um objeto OLE de um arquivo
GetSetting a Retorna um valor de uma chave de con gurao registrada
pelo Windows
Hex Converte decimal em hexadecimal
Hour Retorna o tempo e hora
IIf Retorna um em duas partes, dependendo da avaliao de uma
expresso
Input Retorna um nmero espec co de nmeros de caracteres para
um arquivo de texto
InputB Retorna um nmero especi co de bytes para um arquivo de
texto
InputBox Mostra uma caixa de entrada do prompt para o usurio
InStr Retorna a posio de uma linha para dentro de uma outra linha
InStrB Retorna a posio do byte de uma linha para dentro de uma outra
linha
InStrRev Retorna a posio de uma linha dentro de uma outra , comeando do nal da linha
Int Retorna a parte inteira de um nmero
IPmt Retorna o pagamento de juros dando o perodo de anuidade xado
IRR Retorna taxa interna para um perodo de uxo de dinheiro
IsArray Retorna True se a varivel estiver em ordem
IsDate Retorna True se a varivel for data
IsEmpty Retorna True se a varivel for iniciada
IsError Retorna True se uma expresso para um valor incorreto
IsMissing Retorna True se um argumento opcional no foi
Funes
Programando Excel

VBA,
Traduo da 2 Edio
F
o
l
h
a
d
e
C
o
l
a
Para Leigos: a srie de livros para iniciantes que mais vende no mundo.
ExcelVBABokks.indb 1 15/02/2013 13:59:14
IsNumeric Retorna True se uma expresso pode ser avaliada como um

nmero
IsObject Retorna True se uma expresso referir um objeto automtico
OLE
Join Retorna uma linha criada por um nmero ligado a uma sublinha
contida em uma ordem
LBound Retorna uma ordem de um nvel inferior
LCase Retorna uma linha convertida em minscula
Left Retorna um especi co caractere de nmero do lado esquerdo
da linha
LeftB Retorna um especi co nmero de bytes do lado esquerdo da
linha
Len Retorna quantidade de uma linha em caracteres
LenB Retorna a quantidade de uma linha em bytes
Loc Retorna a atual posio de leitura ou escrita do texto
LOF Retorna um nmero de bytes em arquivo de texto
Log Retorna o logaritmo natural de um nmero
LTrim Retorna a cpia de uma linha sem espao principal
Mid Retorna um nmero especi co de um caractere de uma linha
MidB Retorna um nmero especi co de bytes de uma linha
Minute Retorna o minuto de uma hora desejada
MIRR Retorna a taxa interna para um perodo de uxo de dinheiro
(usando diferentes taxas)
Month Retorna para o ms de um dia desejado
MonthName
Retorna uma linha indicando o especi co ms
MsgBox Mostra a forma de caixa de mensagens
Now Retorna ao sistema atual de data e hora
NPer Retorna a um nmero de anuidade baseada no perodo xo de
pagamentos e taxa de juros
NPV Retorna o valor lquido atual de um investimento baseado no
perodo de uxo de dinheiro e desconto de taxa
Oct Converte decimal em octal
Partition Retorna uma variante de linha indicando onde ocorre o nmero
calculado em uma serie de colunas
Pmt Retorna o pagamento para a anuidade baseada em um perodo,
xo e taxa de juros xa
PPmt Retorna o principal pagamento para dar um perodo de anuidade
baseado na taxa de juros xa
PV Retorna o presente valor de uma anuidade baseado no perodo
xo de pagamento, para ser pago no futuro e xado a taxa de
juros
QBColor Retorna o RGB correspondente cor de um nmero espec co
(compativelmente usado no Quick Basic)
Rate Retorna a taxa de juros por perodo de anuidade
Replace Retorna uma linha onde uma sublinha foi reposta
RGB Retorna um nmero representando um valor colorido RGB
Space Retorna uma linha com um especi co nmero de espaos
Spc Posiciona o output em um uxo output
Split Retorna uma ordem constante de nmeros de uma sublinha
Sqr Retorna raiz quadrada de um nmero
Str Retorna uma linha representada por um nmero
Right Retorna um nmero espec co de caracteres do lado direito
de uma linha
RightB Retorna um nmero especi co de bytes do lado direito de uma
linha
Rnd Retorna um nmero aleatrio entre 0 e 1
Round Rodeia um nmero para um especi co espao de nmero
decimal
RTrim Retorna uma copia de uma linha sem espaos rasteiros

Second Retorna o segundo


Seek Retorna a atual posio do arquivo de texto
Sgn Retorna um inteiro que indica o sinal de um nmero
Shell Roda um programa executvel
Sin Retorna a um nmero determinado
StrComp Retorna um valor indicado, resultado de uma comparao
StrConv Retorna a variante de uma linha
String Retorna a uma linha ou caractere repetidos
StrReverse
Reverte a ordem de uma sequncia de caracteres
Switch Avalia uma lista de expresses e retorna o valor associado com
a primeira expresso da lista que True
SYD Retorna a soma de anos depreciada em um determinado
perodo
Tab Posiciona o output em um uxo output
Tan Retorna a tangente de um nmero
Time Retorna ao tempo atual do sistema
Timer Retorna o nmero de um Segundo desde a meia-noite
TimeSerial
Retorna o tempo especi cando a hora minuto e segundo
TimeValue
Converte uma linha para uma serie de nmeros
Trim Retorna a linha contendo uma copia da linha especi cada sem
limite de espaos
TypeName
Retorna uma linha que descreve o tipo de dado da varivel
UBound Retorna uma ordem superior
UCase Converte uma linha em uppercase
Val Retorna os nmeros contidos em uma linha
VarType Retorna o valor indicando o subtipo de varivel
Weekday Retorna um nmero representando o dia da semana
Weekday Retorna uma linha indicando o dia da semana especi co
Year Retorna o ano da data
F
o
l
h
a
d
e
C
o
l
a
Programando Excel

VBA,
Traduo da 2 Edio
Para Leigos: a srie de Livros para iniciantes que mais vende no mundo.
ExcelVBABokks.indb 2 04/02/2013 14:01:35
John Walkenbach
Programando
Excel VBA
Traduo da 2
a

Edio
Rio de Janeiro, 2013
ExcelVBABokks.indb 1 15/02/2013 13:59:15
Rua Viva Cludio, 291 Bairro Industrial do Jacar
CEP: 20970-031 Rio de Janeiro Tels.: 21 3278-8069/8419 Fax: 21 3277-1253
www.altabooks.com.br e-mail: altabooks@altabooks.com.br
www.facebook.com/altabooks www.twitter.com/alta_books
Translated From Original: Excel VBA Programming For Dummies ISBN: 978-0-470-5036
9-0. Original English language edition Copyright 2007 by Wiley Publishing, Inc. All rights reserved including the right o
f reproduction in whole or in part in any form. Tis
translation published by arrangement with Wiley Publishing, Inc. Portuguese lang
uage edition Copyright 2013 by Starlin Alta Editora
e Consultoria Eireli. All rights reserved including the right of reproduction in
whole or in part in any form.
Willey, the Wiley Publishing Logo, for Dummies, the Dummies Man and related trad
dress are trademarks or registered trademarks of John
Wiley and Sons, Inc. and/or its afliates in the United States and/or other count
ries. Used under license.
Todos os direitos reservados e protegidos por Lei. Nenhuma parte deste livro, se
m autorizao prvia por escrito da editora, poder ser reproduzida ou transmitida.
Erratas: No site da editora relatamos, com a devida correo, qualquer erro encontra
do em nossos livros.
Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Regist
rada e/ou Comercial so de responsabilidade de
seus proprietrios. A Editora informa no estar associada a nenhum produto e/ou forn
ecedor apresentado no livro.
Impresso no Brasil
Vedada, nos termos da lei, a reproduo total ou parcial deste livro.
Programando Excel

VBA Para Leigos, Traduo da 2 Edio Copyright 2013 da Starlin Alta Editora e Consulto
ria Eireli.
ISBN: 978-85-7608-680-2
Produo Editorial
Editora Alta Books
Gerncia Editorial
Anderson Vieira
Superviso Grfca
e Editorial
Angel Cabeza
Superviso de
Qualidade Editorial
Sergio Luiz de Souza
Conselho de
Qualidade Editorial
Adalberto Taconi
Anderson Vieira
Angel Cabeza
Pedro S
Sergio Luiz de Souza
Editoria Atualizao
Augusto Coutinho
Cristiane Santos
Marcelo Vieira
Vanessa Gomes
Equipe de Design
Adalberto Taconi
Bruna Serrano

Iuri Santos
Marco Aurlio Silva
Equipe Editorial
Ana Lucia Silva
Brenda Ramalho
Camila Werhahn
Claudia Braga
Daniel Siqueira
Evellyn Pacheco
Jaciara Lima
Juliana de Paulo
Licia Oliveira
Milena Souza
Natlia Gonalves
Paulo Camerino
Rafael Surgek
Ti Alves
Vinicius Damasceno
Traduo
Juliana Morais Missina
Copidesque
Savannah Hartman
Reviso Gramatical
Equipe Alta Books
Reviso Gramatical
Jeferson Santos
Diagramao
Francisca Santos
Marketing e Promoo
Daniel Schilklaper
marketing@altabooks.com.br
1 reimpresso, outubro de 2013
Dados Internacionais de Catalogao na Publicao (CIP)
W177p
Walkenbach, John.
Programando Excel VBA para leigos / John Walkenbach. Ri
o de Janeiro, RJ : Alta Books, 2012.
408 p. : il. ; 24 cm. (Para leigos)
Inclui ndice.
Traduo de: Excel VBA programming for dummies (2. ed.).
ISBN 978-85-7608-680-2
1
1. Excel (Programa de computador). 2. Visual Basic for applic
ations (Linguagem de programao de
computador). 3. Planilhas eletrnicas. 4. Negcios - Programas d
e computador. I. Ttulo. II. Srie.
CDU 004.4:004.438
CDD 005.3
ndice para catlogo sistemtico:
1. Excel (Programa de computador) : Visual Basic for applications
004.4:004.4
38
2. Visual Basic for applications : Excel (Programa de computador)
004.4:004.
438
(Bibliotecria responsvel: Sabrina Leal Araujo CRB 10/1507)
ExcelVBABokks.indb 2 15/02/2013 13:59:15
Sobre o Autor
John Malkenbach o autor best-seller de mais de 50 livros de planilhas
e mora no sul do Arizona. Quando ele no est usando Excel, provavelmente est tocando banjo, trajando casaca.
ExcelVBABokks.indb 3 15/02/2013 13:59:15

Dedicatria
Este livro dedicado ao Toad e Sra. Toad porque estou cando sem
pessoas para dedicatrias em livro.
Agradecimentos do Autor
Eu sou grato a todas as pessoas da Wiley Publishing por me dar a oportunidade de escrever livros sobre Excel. Agradecimentos especiais a
Colleen Totz Diamond (editor de projeto) e a Jan Karel Pieterse (editor
tcnico). Com certeza eles tornaram o meu trabalho muito mais fcil.
ExcelVBABokks.indb 4 15/02/2013 13:59:15
Sumrio Resumido
Introduo .........................................................................
...1
Parte I: Introduo ao VBA ..................................................... 11
Captulo 1: O Que VBA ? ..........................................................
............................................. 13
Captulo 2: Saltando Para o Lugar Certo ..........................................
................................ 23
Parte II: Como o VBA Trabalha com o Excel .............................35
Captulo 3: Trabalhando no Visual Basic Editor ...................................
............................... 37
Captulo 4: Introduo ao Modelo de Objeto do Excel...................................
.................... 55
Captulo 5: Procedimentos Function e Sub no VBA ..................................
..................... 69
Captulo 6: Usando o Gravador de Macro do Excel ..................................
...................... 81
Parte III: Conceitos de Programao ..................................... 93
Captulo 7: Elementos Essenciais da Linguagem VBA ................................
................... 95
Captulo 8: Trabalhando com Objetos Range ........................................
....................... 115
Captulo 9: Usando VBA e Funes de Planilha .........................................
...................... 129
Captulo 10: Controlando o Fluxo de Programa e Tomando Decises ....................
... 141
Captulo 11: Procedimentos e Eventos Automticos ...................................
................ 161
Captulo 12: Tcnicas de Tratamento de Erros .......................................
.......................... 183
Captulo 13: Tcnicas de Extermnio de Bugs ..........................................
......................... 197
Captulo 14: Exemplos de Programao em VBA ..........................................
.................... 211
Parte IV: Como se Comunicar com Seus Usurios ................. 233
Captulo 15: Caixas de Dilogo Simples .............................................
................................. 235
Captulo 16: Princpios Bsicos de UserForm ..........................................
.......................... 253
Captulo 17: Usando os Controles de UserForm .....................................
.......................... 269
Captulo 18: Tcnicas e Truques do UserForm ........................................
......................... 289
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio ................
... 313
ExcelVBABokks.indb 5 15/02/2013 13:59:15
Parte V: Juntando Tudo ..................................................... 331
Captulo 20: Como Criar Funes de Planilha e Viver para Contar ......................
..... 333
Captulo 21:Criando Add-Ins do Excel..............................................
................................... 349

Parte VI: A Parte dos Dez .................................................. 361


Captulo 22: Dez Perguntas de VBA (E Respostas) ..................................
......................... 363
Captulo 23: (Quase) Dez Recursos do Excel .......................................
.............................. 367
ndice ...........................................................................
......371
vi
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 6 15/02/2013 13:59:15
Sumrio
Introduo .........................................................................
...... 1
Este o Livro Certo? ............................................................
........................................... 1
Ento, Voc Quer Ser um Programador .................................................
.................. 2
Por Que se Preocupar? ..........................................................
......................................... 3
O Que Presumo Sobre Voc .........................................................
.................................. 3
Seo Obrigatria das Convenes Tipogrficas...............................................
........ 4
Verifique Suas Configuraes de Segurana ............................................
................... 5
Como Este Livro Est Organizado ..................................................
.............................. 6
Parte I: Introduo ao VBA .........................................................
............................. 6
Parte II: Como VBA Funciona com Excel ..........................................
..................... 6
Parte III: Conceitos de Programao ................................................
...................... 7
Parte IV: Comunicao com Seus Usurios...............................................
............ 7
Parte V: Juntando Tudo .........................................................
................................... 7
Parte VI: A Parte dos Dez ......................................................
................................... 7
Espere, H Mais! .................................................................
....................................... 7
cones Usados Neste Livro ........................................................
..................................... 7
Como Obter os Arquivos de Exemplos .............................................
........................... 8
E Agora? .......................................................................
..................................................... 9
Parte I: Introduo ao VBA ..................................................... 11
Captulo 1: O Que VBA ? ..........................................................
........................................................13
Tudo Bem, Ento o Que VBA? .......................................................
........................... 13
O Que Voc Pode Fazer com VBA? ...................................................
.......................... 14
Inserir um grupo de texto ......................................................
................................ 15
Automatizar tarefas executadas com frequncia ...................................
.............. 15
Automatizar operaes repetitivas ..................................................
.................... 15

Criar um comando personalizado .................................................


....................... 15
Criar um boto personalizado .....................................................
......................... 16
Desenvolver novas funes de planilhas .............................................
............... 16
Criar aplicativos completos, guiados por macro .................................
.............. 16
Criar suplementos (add-ins) personalizados para o Excel ........................
....... 16
Vantagens e Desvantagens do VBA ................................................
............................ 16
ExcelVBABokks.indb 7 15/02/2013 13:59:15
Vantagens do VBA ...............................................................
.................................... 17
Desvantagens do VBA ............................................................
................................. 17
VBA Resumidamente ..............................................................
...................................... 18
Uma Excurso pelas Verses Anteriores ..............................................
..................... 20
Captulo 2: Saltando Para o Lugar Certo ..........................................
...............................................23
Primeiros Passos ...............................................................
............................................ 23
Usurios de Excel 2010 ...........................................................
................................ 24
Usurios de Excel 2007 ...........................................................
................................ 24
O Que Voc Far ....................................................................
........................................ 25
Dando os Primeiros Passos ......................................................
................................... 25
Gravando a Macro ...............................................................
.......................................... 26
Testando a Macro ...............................................................
........................................... 27
Examinando a Macro .............................................................
....................................... 27
Modificando a Macro ............................................................
........................................ 30
Salvando Planilhas que Contm Macros .............................................
...................... 30
Entendendo a Segurana de Macro ..................................................
.......................... 31
Mais sobre a Macro NameAndTime .................................................
.......................... 33
Parte II: Como o VBA Trabalha com o Excel ............................. 35
Captulo 3: Trabalhando no Visual Basic Editor ...................................
.........................................37
O Que o Visual Basic Editor? ...................................................
................................. 37
Ativando o VBE .................................................................
....................................... 37
Entendendo os componentes do VBE ...............................................
................... 38
Como Trabalhar com a Janela de Projeto .........................................
........................ 40
Adicionando um novo mdulo VBA ...................................................
.................. 41

Removendo um mdulo VBA ..........................................................


...................... 41
Exportando e importando objetos ................................................
....................... 42
Trabalhando com a Janela de Cdigo ...............................................
......................... 42
Minimizando e maximizando janelas ..............................................
..................... 42
Criando um mdulo ................................................................
................................ 44
Como inserir cdigo VBA em um mdulo ...............................................
............ 44
Inserindo o cdigo diretamente ...................................................
......................... 45
Usando o gravador de macro .....................................................
........................... 47
Copiando o cdigo VBA ............................................................
............................. 49
Personalizando o Ambiente VBA ..................................................
.............................. 49
Usando a guia Editor ...........................................................
.................................... 50
Usando a guia Formato do editor ................................................
......................... 52
viii
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 8 15/02/2013 13:59:15
Usando a guia Geral ............................................................
.................................... 53
Usando a guia Encaixe ..........................................................
.................................. 54
Captulo 4: Introduo ao Modelo de Objeto do Excel ..................................
..............................55
Excel um Objeto? ...............................................................
........................................ 56
Escalando a Hierarquia de Objetos ..............................................
.............................. 56
Enchendo Sua Cabea com Colees .....................................................
................... 58
Como Fazer Referncia aos Objetos ................................................
.......................... 58
Como navegar pela hierarquia ...................................................
........................... 59
Simplificando referncias a objetos ..............................................
....................... 60
Mergulhando nas Propriedades e nos Mtodos do Objeto .............................
....... 60
Propriedades do objeto .........................................................
................................. 62
Mtodos de Objeto.................................................................
................................. 63
Eventos de objeto...............................................................
..................................... 64
Descobrindo Mais ...............................................................
.......................................... 64
Usando o sistema de Ajuda de VBA ...............................................
...................... 65
Como usar o Pesquisador de Objeto ..............................................
..................... 66
Como relacionar automaticamente propriedades e mtodos ......................... 6

6
Captulo 5: Procedimentos Function e Sub no VBA ..................................
...................................69
Subs versus Funes ................................................................
.................................... 69
Observando os procedimentos Sub ................................................
..................... 70
Observando os procedimentos Function ...........................................
................. 70
Nomeando Subs e Functions ......................................................
........................... 71
Executando Procedimentos Sub ...................................................
.............................. 71
Executando diretamente o procedimento Sub ......................................
............. 73
Executando um procedimento a partir da caixa de dilogo Macro ................ 74
Executando uma macro usando uma tecla atalho ...................................
.......... 75
Executando um procedimento a partir de um boto ou forma ....................... 7
6
Executando um procedimento a partir de outro procedimento .....................
78
Executando Procedimentos Function ..............................................
.......................... 78
Chamando uma funo a partir de um procedimento Sub .............................. 7
9
Chamando uma funo a partir de uma frmula de planilha ........................... 79
Captulo 6: Usando o Gravador de Macro do Excel ..................................
...................................81
Isto Est Vivo ou VBA? ...........................................................
................................... 81
O Bsico sobre Gravao ..............................................................
............................... 82
Preparao para Gravar .............................................................
.................................. 84
Relativo ou Absoluto? ..........................................................
......................................... 84
Sumrio ix
ExcelVBABokks.indb 9 15/02/2013 13:59:15
Gravando no modo absoluto ......................................................
........................... 84
Gravando no modo relativo ......................................................
............................. 85
O Que Gravado? .................................................................
........................................ 87
Opes da Gravao .....................................................................
................................ 88
Nome da Macro ..................................................................
..................................... 88
Tecla de Atalho ................................................................
........................................ 89
Armazenar Macro Em .............................................................
................................ 89
Descrio ..........................................................................
........................................ 89
Essa Coisa Eficiente? ..........................................................
....................................... 90
Parte III: Conceitos de Programao ....................................... 93
Captulo 7: Elementos Essenciais da Linguagem VBA ................................
................................95

Usando Comentrios em Seu Cdigo VBA ...............................................


................. 95
Usando Variveis, Constantes e Tipos de Dados ....................................
................. 97
Entendendo variveis .............................................................
................................ 97
O que so tipos de dados do VBA? .................................................
..................... 98
Declarando e estendendo variveis ................................................
..................... 99
Trabalhando com constantes......................................................
........................ 105
Constantes pr-fabricadas ........................................................
........................... 106
Trabalhando com strings ........................................................
............................. 107
Trabalhando com datas ..........................................................
............................. 108
Usando Declaraes de Atribuio .......................................................
................... 109
Exemplos de declarao de atribuio ...................................................
........... 109
Sobre aquele sinal de igual ....................................................
.............................. 109
Operadores regulares ...........................................................
................................ 110
Trabalhando com Arrays .........................................................
.................................. 112
Declarando arrays ..............................................................
................................... 112
Arrays multidimensionais .......................................................
............................. 113
Arrays dinmicos .................................................................
................................. 113
Usando Labels (Etiquetas) ......................................................
................................... 114
Captulo 8: Trabalhando com Objetos Range ........................................
...................................... 115
Uma Reviso Rpida .................................................................
.................................. 115
Outras Maneiras de Fazer Referncia a uma Faixa ..................................
.............. 117
A propriedade Cells ............................................................
.................................. 117
A propriedade Offset ...........................................................
................................. 118
Fazendo referncia a colunas e linhas inteiras ...................................
.............. 119
Algumas Propriedades teis do Objeto Range .......................................
................ 119
x
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 10 15/02/2013 13:59:15
A propriedade Value ............................................................
................................. 120
A propriedade Text .............................................................
.................................. 121
A propriedade Count ............................................................
................................ 121
As propriedades Column e Row ...................................................

...................... 121
A propriedade Address ..........................................................
.............................. 122
A propriedade HasFormula........................................................
.......................... 122
A propriedade Font .............................................................
.................................. 123
A propriedade Interior .........................................................
................................ 123
A propriedade Formula ..........................................................
.............................. 124
A propriedade NumberFormat .....................................................
....................... 125
Alguns Mtodos teis do Objeto Range ...............................................
................... 126
O mtodo Select ..................................................................
.................................. 126
Os mtodos Copy e Paste ..........................................................
.......................... 127
O mtodo Clear ...................................................................
................................... 127
O mtodo Delete ..................................................................
.................................. 128
Captulo 9: Usando VBA e Funes de Planilha .........................................
................................ 129
O Que uma Funo? ..................................................................
............................... 129
Usando Funes VBA Integradas ......................................................
........................ 130
Exemplo de funo VBA ..............................................................
......................... 130
Funes VBA que fazem mais do que retornar um valor ...............................
132
Descobrindo funes VBA ............................................................
....................... 133
Usando Funes de Planilha no VBA ..................................................
..................... 135
Exemplos de funes e planilhas ....................................................
.................... 136
Introduzindo funes de planilha ...................................................
.................... 138
Mais Sobre o Uso de Funes de Planilha ............................................
................... 139
Usando Funes Personalizadas ......................................................
........................ 139
Captulo 10: Controlando o Fluxo de Programa e Tomando Decises ....................
.............. 141
Seguindo o Fluxo, Cara .........................................................
...................................... 141
A Declarao GoTo ..................................................................
.................................... 142
Decises, decises .................................................................
............................... 143
A estrutura If-Then ............................................................
.................................... 143
A estrutura Select Case ........................................................
................................ 148
Fazendo Seu Cdigo Dar um Loop ...................................................
......................... 151
Loop For-Next ..................................................................

...................................... 152
Loop Do-While ..................................................................
..................................... 156
Loop Do-Until ..................................................................
....................................... 157
Fazendo Loop atravs de uma Collection ...........................................
.................... 158
Sumrio xi
ExcelVBABokks.indb 11 15/02/2013 13:59:16
Captulo 11: Procedimentos e Eventos Automticos ...................................
............................. 161
Preparao para o Grande Evento ....................................................
....................... 161
Os eventos so teis? ..............................................................
............................. 163
Programando procedimentos que lidam com eventos ................................
... 164
Aonde Vai o Cdigo VBA? ..........................................................
................................ 164
Escrevendo um Procedimento Que Lida com Evento .................................
.......... 165
Exemplos Introdutrios ...........................................................
.................................. 167
O evento Open para uma pasta de trabalho .......................................
.............. 167
O evento BeforeClose para uma pasta de trabalho ................................
......... 169
O evento BeforeSave para uma pasta de trabalho .................................
.......... 169
Exemplos de Ativao de Eventos ....................................................
........................ 170
Ativar e desativar eventos em uma planilha .....................................
................ 170
Ativar e desativar eventos em uma pasta de trabalho ............................
........ 171
Eventos de ativao de pasta de trabalho ...........................................
............. 173
Outros Eventos Relacionados Worksheet (Planilha) ...............................
........... 174
O evento BeforeDoubleClick .....................................................
.......................... 174
O evento BeforeRightClick ......................................................
............................. 174
O evento Change ................................................................
................................... 175
Eventos No Associados a Objetos .................................................
......................... 177
O evento OnTime ................................................................
.................................. 178
Eventos de pressionamento de teclas ............................................
................... 180
Captulo 12: Tcnicas de Tratamento de Erros .......................................
.................................... 183
Tipos de Erros..................................................................
............................................ 183
Um Exemplo Errneo ...............................................................
................................... 184
A imperfeio da macro .............................................................
.......................... 185
A macro ainda no perfeita........................................................

....................... 186
A macro j est perfeita? ..........................................................
............................ 186
Desistindo da perfeio ............................................................
............................ 187
Como Lidar com Erros de Outra Maneira ..........................................
..................... 188
Revendo o procedimento EnterSquareRoot .........................................
............ 188
Sobre a declarao On Error ........................................................
....................... 189
Como Lidar com Erros: Os Detalhes ..............................................
.......................... 190
Recuperao depois de um erro ......................................................
................... 190
Lidando com erros resumidamente ................................................
................... 192
Como saber quando ignorar erros ................................................
..................... 192
Como identificar erros especficos ...............................................
...................... 193
Um Erro Intencional ............................................................
........................................ 194
xii
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 12 15/02/2013 13:59:16
Captulo 13: Tcnicas de Extermnio de Bugs ..........................................
.................................. 197
Espcies de Bugs .................................................................
........................................ 197
Como Identificar Bugs ..........................................................
...................................... 198
Tcnicas de Depurao ................................................................
.............................. 199
Como examinar o seu cdigo .......................................................
....................... 199
Usando a funo MsgBox .............................................................
........................ 200
Inserindo declaraes Debug.Print ..................................................
.................. 201
Usando o depurador VBA .........................................................
........................... 202
Sobre o Depurador ..............................................................
........................................ 202
Configurando pontos de interrupo em seu cdigo .....................................
. 202
Usando a janela Inspeo de Variveis ................................................
.............. 206
Usando a janela de Variveis locais ..............................................
...................... 207
Dicas para Reduo de Bugs .........................................................
............................ 208
Captulo 14: Exemplos de Programao em VBA ..........................................
............................ 211
Como Trabalhar com Ranges (faixas) .............................................
......................... 211
Copiando uma faixa .............................................................
................................. 212
Copiando uma faixa de tamanho varivel ...........................................
.............. 213

Selecionando ao final de uma linha ou coluna ...................................


.............. 214
Selecionando uma linha ou coluna ...............................................
...................... 215
Movendo uma faixa ..............................................................
................................. 215
Como fazer loop eficientemente atravs de uma faixa ..............................
..... 216
Como fazer loop eficientemente atravs de uma faixa (Parte II) ...................
217
Solicitando o valor de uma clula ................................................
....................... 218
Determinando o tipo de seleo .....................................................
.................... 219
Identificando uma seleo mltipla ...................................................
................ 219
Mudando as Configuraes do Excel ..................................................
..................... 220
Mudando configuraes Booleanas ....................................................
............... 221
Mudando configuraes no Booleanas...................................................
......... 221
Trabalhando com Grficos .........................................................
............................... 222
Modificando o tipo de grfico ....................................................
......................... 224
Fazendo Looping atravs da coleo ChartObjects ......................................
.. 224
Modificando propriedades Chart .................................................
...................... 225
Aplicando formatao de grfico.......................................................
................. 225
Dicas de Velocidade do VBA .....................................................
................................. 227
Desativando a atualizao de tela ..................................................
.................... 227
Desativando o clculo automtico ...................................................
.................. 228
Eliminando aquelas inoportunas mensagens de alerta .............................
..... 228
Sumrio xiii
ExcelVBABokks.indb 13 15/02/2013 13:59:16
Simplificando referncias de objeto ..............................................
..................... 229
Declarando tipos de variveis ....................................................
......................... 230
Como usar a estrutura With-End With ............................................
................... 231
Parte IV: Como se Comunicar com Seus Usurios ................... 233
Captulo 15: Caixas de Dilogo Simples .............................................
......................................... 235
Alternativas a UserForm ........................................................
.................................... 235
A Funo MsgBox ....................................................................
.................................... 236
Obtendo uma resposta de uma caixa de mensagem ..................................
..... 237
Personalizando caixas de mensagem ..............................................
.................. 238
A Funo InputBox ..................................................................

.................................... 241
Sintaxe InputBox ...............................................................
.................................... 241
Um exemplo de InputBox .........................................................
............................ 242
O Mtodo GetOpenFilename .........................................................
............................ 244
A sintaxe para o mtodo GetOpenFilename ..........................................
........... 244
Um exemplo de GetOpenFilename ..................................................
................... 245
Selecionando mltiplos arquivos ..................................................
..................... 247
O Mtodo GetSaveAsFileName .......................................................
........................... 248
Como Obter um Nome de Pasta ....................................................
........................... 249
Exibindo as Caixas de Dilogo Integradas do Excel.................................
.............. 250
Captulo 16: Princpios Bsicos de UserForm ..........................................
.................................. 253
Como Saber Quando Usar um UserForm .............................................
................... 253
Criando UserForms: Uma Viso Geral ...............................................
....................... 254
Trabalhando com UserForms.......................................................
............................. 255
Inserindo um novo UserForm .....................................................
........................ 255
Adicionando controles a um UserForm ............................................
................. 256
Mudando propriedades em um controle UserForm ...................................
..... 257
Observando a janela de Cdigo de UserForm ........................................
.......... 258
Exibindo um UserForm ...........................................................
.............................. 259
Usando informaes de um UserForm ..................................................
............ 259
Um Exemplo de UserForm .........................................................
................................ 260
Criando o UserForm .............................................................
................................. 260
Adicionando os botes de comando .................................................
................ 261
Adicionando os botes de opo .......................................................
................ 262
Adicionando procedimentos que lidam com eventos ................................
..... 263
Criando uma macro para exibir a caixa de dilogo .................................
........ 265
Como disponibilizar a macro ....................................................
.......................... 266
Testando a macro ...............................................................
................................... 267
xiv
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 14 15/02/2013 13:59:16
Captulo 17: Usando os Controles de UserForm .....................................
.................................... 269

Comeando com os Controles da Caixa de Dilogo .....................................


......... 269
Adicionando controles ..........................................................
............................... 269
Introduzindo propriedades de controle ..........................................
.................. 270
Controles de Caixa de Dilogo: Os Detalhes .......................................
.................... 273
Controle Caixa de Seleo...........................................................
......................... 274
Controle Caixa de Combinao .......................................................
.................... 274
Controle Boto de comando ........................................................
........................ 275
Controle Quadro ................................................................
.................................... 276
Controle Imagem ................................................................
................................... 276
Controle Rtulo ..................................................................
................................... 277
Controle Caixa de Listagem .....................................................
............................ 278
Controle Multi-pgina ............................................................
............................... 279
Controle Boto de Opo ..............................................................
....................... 279
Controle RefEdit ...............................................................
..................................... 280
Controle Barra de Rolagem ......................................................
............................ 281
Controle Boto de Rotao ............................................................
...................... 282
Controle TabStrip ..............................................................
.................................... 282
Controle Caixa de Texto ........................................................
............................... 282
Controle ToggleButton ..........................................................
............................... 283
Trabalhando com Controles de Caixa de Dilogo ....................................
.............. 284
Movendo e redimensionando controles ............................................
................ 284
Alinhando e espaando controles ..................................................
.................... 284
Acomodando teclado de usurios ...................................................
................... 285
Testando um UserForm ...........................................................
............................. 287
Esttica de Caixa de Dilogo .......................................................
.............................. 287
Captulo 18: Tcnicas e Truques do UserForm ........................................
................................... 289
Como Usar Caixas de Dilogo ......................................................
............................. 289
Um Exemplo de UserForm .........................................................
................................ 289
Criando a caixa de dilogo .......................................................
............................ 290
Escrevendo cdigo para exibir a caixa de dilogo....................................
....... 292

Disponibilizando a macro .......................................................


............................. 292
Testando a sua caixa de dilogo ..................................................
....................... 293
Adicionando procedimentos que lidam com eventos ................................
..... 294
Validando os dados .............................................................
.................................. 295
Agora a caixa de dilogo funciona ................................................
...................... 296
Mais Exemplos do UserForm ......................................................
............................... 296
Um exemplo de Caixa de Listagem ................................................
..................... 296
Sumrio xv
ExcelVBABokks.indb 15 15/02/2013 13:59:16
Preenchendo uma Caixa de Listagem ..............................................
.................. 297
Selecionando uma faixa .........................................................
............................... 301
Usando mltiplos conjuntos de Botes de opo ..........................................
. 302
Utilizando um Boto de Rotao e uma Caixa de Texto .................................
303
Usando um UserForm como um indicador de progresso ..............................
. 305
Criao de uma caixa de dilogo Multi-pgina ...........................................
...... 308
Exibindo um grfico em um UserForm ...............................................
............... 310
Uma Lista de Verificao de Caixa de Dilogo .........................................
............... 311
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio ................
......... 313
O Que Aconteceu com CommandBars? ...............................................
.................... 313
Personalizao da Faixa de Opes ......................................................
................... 314
Como personalizar manualmente a Faixa de Opes ....................................
. 314
Personalizando a Faixa de Opes com XML ...........................................
........ 316
Personalizando Menus de Atalho .................................................
............................ 321
Comandando a coleo de CommandBars ................................................
....... 321
Listando todos os menus de atalho ..............................................
..................... 321
Referncia a CommandBars .........................................................
....................... 322
Referncia a controles em um CommandBar ..........................................
......... 323
Propriedades de controles CommandBar ...........................................
.............. 324
Exemplos de Menu de Atalho VBA .................................................
.......................... 326
Adicionando um novo item ao menu de atalho Cell ................................
........ 326
Desativando um menu de atalho ..................................................
...................... 328

Criando uma Barra de Ferramentas Personalizadas ................................


............. 329
Parte V: Juntando Tudo ........................................................
331
Captulo 20: Como Criar Funes de Planilha e Viver para Contar ......................
............ 333
Por Que Criar Funes Personalizadas? ..............................................
.................... 333
Como Entender os Princpios Bsicos de Funo VBA ......................................
... 334
Escrevendo Funes .................................................................
.................................. 335
Trabalhando com Argumentos de Funo ...............................................
............... 335
Exemplos de Funo .................................................................
.................................. 336
Uma funo sem argumento ...........................................................
..................... 336
Uma funo com um argumento ........................................................
................. 336
Uma funo com dois argumentos .....................................................
................ 338
Uma funo com um argumento faixa ..................................................
............. 339
Uma funo com um argumento opcional ...............................................
......... 340
Uma funo com um nmero indefinido de argumentos ................................ 342
xvi
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 16 15/02/2013 13:59:16
Funes Que Retornam um Array ......................................................
...................... 343
Retornando um array de nomes de meses ..........................................
............. 343
Retornando uma lista classificada ..............................................
........................ 344
Como Usar a Caixa de Dilogo Inserir Funo ..........................................
.............. 345
Exibindo a descrio da funo .........................................................
................. 346
Descries de argumento ............................................................
........................ 347
Captulo 21: Criando Add-Ins do Excel ............................................
............................................. 349
Certo Ento, o Que um Add-In? ....................................................
..................... 349
Por Que Criar Add-Ins? .........................................................
...................................... 350
Trabalhando com Add-Ins ........................................................
................................. 351
Princpios Bsicos do Add-In .......................................................
............................. 352
Um Exemplo de Add-In ...........................................................
.................................... 353
Configurando a pasta de trabalho ...............................................
....................... 353
Testando a pasta de trabalho ...................................................
........................... 355
Como adicionar informaes descritivas .............................................
............. 356

Protegendo o cdigo VBA ..........................................................


.......................... 357
Criando o add-in ...............................................................
..................................... 357
Abrindo o add-in ..............................................................
..................................... 357
Distribuindo o add-in ..........................................................
.................................. 358
Como modificar o add-in ........................................................
.............................. 359
Parte VI: A Parte dos Dez .....................................................
361
Captulo 22: Dez Perguntas de VBA (E Respostas) ..................................
.................................. 363
Captulo 23: (Quase) Dez Recursos do Excel .......................................
....................................... 367
O Sistema de Ajuda do VBA ......................................................
................................. 367
Suporte de Produtos Microsoft ..................................................
............................... 367
Grupos de Notcias da Internet ...................................................
.............................. 368
Sites da Internet ..............................................................
............................................. 369
Blogs do Excel .................................................................
............................................. 369
Google .........................................................................
.................................................. 369
Bing ...........................................................................
..................................................... 369
Grupos e Usurios Locais .........................................................
................................. 370
Meus Outros Livros .............................................................
........................................ 370
ndice ...........................................................................
...... 371
Sumrio xvii
ExcelVBABokks.indb 17 15/02/2013 13:59:16
xviii
Programando Excel VBA Para Leigos, Traduo da 2 Edio
ExcelVBABokks.indb 18 15/02/2013 13:59:16

Introduo
S
audaes, futuro programador de Excel...
Obrigado por comprar este livro. Creio que voc descobrir que ele
oferece uma maneira rpida e agradvel de encontrar os prs e os
contras de programao em Microsoft Excel. Ainda que voc no tenha
a mais vaga ideia do que se trata programao, este livro pode ajud-lo
a fazer o Excel pular atravs de argolas rapidamente (bem, talvez
demore algum tempo).
Diferentemente de outros livros de programao, este foi escrito em
linguagem simples, para que pessoas normais pudessem entender.
Melhor ainda, ele est cheio de informaes do tipo s os fatos e
no do tipo que voc poderia precisar uma vez a cada trs geraes.
Este o Livro Certo?
V at qualquer grande livraria e voc descobrir muitos livros sobre
Excel (livros demais, na minha opinio). Uma rpida olhada pode
ajud-lo a decidir se este livro realmente o certo para voc. Este livro:
5 Foi desenvolvido para aqueles que pretendem se adaptar

rapidamente programao de Aplicativos Visual Basic (VBA).


5 No requer experincia anterior com programao.
5 Cobre os comandos mais comuns.
5 adequado para o Excel 2007 ou para o Excel 2010.
5 Voc poder at dar um sorriso ocasionalmente ele tem at
desenhos animados.
Se voc est usando Excel 2000, XP, ou 2003, este livro no para voc.
O Excel 2007 e o Excel 2010 so muito diferentes das verses anteriores.
Caso ainda esteja usando uma verso de Excel anterior de 2007,
procure um livro que seja especfico para aquela verso.
ExcelVBABokks.indb 1 15/02/2013 13:59:16
2 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
A propsito, este no um livro de introduo ao Excel. Se voc estiver
procurando por um livro de Excel de objetivos gerais, verifique quaisquer
outros livros publicados pela Alta Books, no site www.altabooks.com.br.
Note que o ttulo deste livro no O Guia Completo de Programao
VBA em Excel Para Leigos. Eu no abordo todos os aspectos de programao em Excel e, novamente, provvel que voc no queira saber
tudo sobre esse assunto. No caso, improvvel, de querer um livro de
programao de Excel mais compreensvel, poderia experimentar o
Microsoft Excel 2010 Power Programming com VBA, de John Walkenbach
(esse camarada prolfico ou o qu?), publicado pela Wiley. E sim,
tambm est disponvel uma edio para Excel 2007.
Ento, Voc Quer Ser um
Programador
Alm de ganhar dinheiro para pagar minhas contas, meu objetivo principal
mostrar para usurios de Excel como usar a linguagem VBA uma
ferramenta que ajuda a ampliar significativamente o poder da planilha
mais popular do mundo. No entanto, usar VBA envolve programao.
Se voc como a maioria dos usurios de computador, a palavra
programador cria uma imagem de algum que se parece e se comporta
de um modo totalmente diferente de voc. Talvez palavras como nerd,
geek e dweeb apaream na memria.
Os tempos mudaram. Programar computadores se tornou mais fcil, e at
as pessoas chamadas normais fazem isso e at admitem isso aos amigos
e familiares. Programar significa apenas desenvolver instrues que o
computador executa automaticamente. Programar em Excel refere-se ao
fato de que possvel orientar o Excel a executar automaticamente tarefas
que em geral voc faz manualmente poupando muito do seu tempo (voc
espera) e reduzindo erros. Eu poderia continuar, mas preciso guardar
alguma coisa boa para o Captulo 1.
Se voc leu at aqui, seguro apostar que voc precisa se tornar um
programador de Excel. Isto pode ser algo que voc decidiu por si
mesmo, ou (mais provavelmente) algo que seu chefe imps. Neste livro,
eu lhe digo o suficiente sobre programao em Excel de modo que voc
no se sentir um idiota na prxima vez que ficar preso em uma sala
com um grupo de aficionados em Excel. E quando terminar este livro,
voc poder dizer, honestamente, Sim, eu programo em Excel.
ExcelVBABokks.indb 2 15/02/2013 13:59:16
3 Introduo
Por Que se Preocupar?
A maioria dos usurios de Excel nunca se importa em explorar a programao VBA. O seu interesse neste tpico o coloca, definitivamente, em
uma tropa de elite. Bem-vindo ao grupo! Se voc ainda no est convencido de que se tornar um mestre em programao no Excel uma boa
ideia, tenho alguns bons motivos pelos quais voc poderia querer
dedicar algum tempo para aprender a programar VBA.
5 Isso o tornar mais competitivo no mercado de trabalho.

Gostando ou no, os aplicativos da Microsoft so extremamente


populares. Voc j deve saber que todas as aplicaes da
Microsoft suportam VBA. Quanto mais voc sabe sobre VBA,
melhores so as suas chances para progredir em seu trabalho.
5 Permitir que voc explore o mximo do seu investimento em
software (ou, mais provavelmente o investimento do seu
empregador). Usar Excel sem saber VBA como comprar uma
TV e assistir a apenas os canais mpares.
5 Aumentar sua produtividade (eventualmente).
Definitivamente, demora algum tempo para conhecer VBA, mas
esse tempo ser compensado quando voc for mais produtivo.
como o que lhe disseram sobre ir para a faculdade.
5 divertido (bem, algumas vezes). Algumas pessoas gostam, de
fato, de fazer certas coisas com Excel que seriam impossveis
de outra forma. Quando voc terminar este livro, poder ser
uma dessas pessoas.
Est convencido agora?
Penso que...
Normalmente, pessoas que escrevem livros tm em mente um leitor
alvo. Neste livro, o meu leitor alvo um conglomerado de dzias de
usurios de Excel que conheci atravs dos anos (tanto pessoalmente
como no ciberespao). Os seguintes pontos descrevem bem o meu
hipottico leitor alvo:
5 Voc tem acesso a um PC no trabalho e provavelmente em casa.
5 Voc usa Excel 2007 ou Excel 2010.
5 Voc vem usando computadores h muitos anos.
5 Voc usa Excel frequentemente no trabalho, e considera ser
mais capaz no uso da ferramenta do que o pblico geral.
5 Voc precisa que o Excel faa algumas coisas que atualmente
no consegue que ele faa.
5 Voc tem pouca ou nenhuma experincia em programao.
ExcelVBABokks.indb 3 15/02/2013 13:59:16
4 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
5 Voc compreende que o sistema de Help do Excel pode
realmente ser til. Encare os fatos, este livro no cobre tudo. Se
voc conseguir se entender com o sistema de Help, voc
conseguir achar as peas que faltam.
5 Voc precisa concluir algum trabalho e possui pouca tolerncia
livros grossos e chatos sobre computao.
Seo Obrigatria das
Convenes Tipogrfcas
Todos os livros de computao possuem uma seo sobre isto. Eu acho
que existe alguma lei federal exigindo isso. Leia ou simplesmente pule
esta etapa.
Algumas vezes, eu me refiro a combinaes de teclas, o que significa que
voc pressionar uma tecla enquanto aperta outra, por exemplo, Ctrl+Z
significa que voc pressiona a tecla Ctrl e a tecla Z ao mesmo tempo.
Nos comandos de menu, uso um caractere distinto para separar itens
do menu. Por exemplo, para abrir um arquivo do livro-texto, voc usa o
seguinte comando:
Arquivo Abrir
Observe que no Excel 2007, no h algo como um menu File (Arquivo)
visvel em sua tela. No Excel 2007, o menu Arquivo foi substitudo pelo
Office Button (Boto Office), uma pequena engenhoca redonda que
aparece do lado superior esquerdo de qualquer aplicativo do Office 2007,
que implementou o que chamado de Ribbon (Barra). A certa altura, a
Microsoft resolveu que o Office Button no era uma ideia to boa e o Excel
2010 descartou aquele Office Button redondo e o substituiu por uma guia

de Boto chamada Arquivo. Neste livro, eu o chamo de Arquivo, portanto, se voc usar Excel 2007, lembre-se apenas de que Arquivo significa
pequena engenhoca redonda do lado superior esquerdo.
Qualquer texto que voc precisar inserir aparece em negrito. Por
exemplo, eu poderia dizer, entre com =SUM(B:B) na clula A1.
A programao em Excel envolve desenvolver cdigo isto , as
instrues que o Excel segue. Todo o cdigo neste livro apresentado
com uma fonte como:
Range(A1:A12).Select
Alguns cdigos de linhas longas no cabem nas margens deste livro. Em
tais casos, eu uso a sequncia de caracteres padro VBA de continuao de linha: um espao seguido por um caractere de sublinhado. Eis
um exemplo:
ExcelVBABokks.indb 4 15/02/2013 13:59:16
5 Introduo
Selection.PasteSpecial Paste:=xlValues, _
Operation:=xlNone, SkipBlanks:=False, _
Transpose:=False
Quando inserir este cdigo, voc poder digit-lo como est ou coloc-lo em uma linha nica (retirando os espaos e os sublinhados).
Verifque Suas
Confguraes de Segurana
Vivemos em um mundo cruel. Parece que h sempre um estrategista
tentando obter vantagem de voc ou causando algum tipo de problema.
O mundo da computao igualmente cruel. Provavelmente, voc sabe
a respeito de vrus de computador, os quais podem causar coisas
desagradveis em seu sistema. Mas, voc sabe que os vrus de computador tambm podem estar em um arquivo Excel? verdade. De fato,
relativamente fcil escrever um vrus de computador usando VBA.
Inocentemente, um usurio pode abrir um arquivo Excel e espalhar o
vrus para outros arquivos Excel, e para outros sistemas.
Com o passar dos anos, a Microsoft se tornou cada vez mais preocupada com problemas de segurana. Isto uma coisa boa, mas tambm
significa que usurios do Excel precisam entender como as coisas
funcionam. Voc pode checar as configuraes de segurana do Excel
clicando em Arquivo < Opes < Central de confiabilidade < Configuraes da Central de Confiabilidade. Existe uma mirade de opes l
dentro, e corre o boato que nunca mais se ouviu falar das pessoas que
abriram tal caixa de dilogo.
Se voc clicar na guia Configuraes de Macro ( esquerda da caixa de
dilogo [Central de Confiabilidade]), as suas opes sero como a
seguir:
5 Desabilitar todas as macros sem notificao: As macros no
funcionaro, no importa o que voc fizer.
5 Desabilitar todas as macros com notificao: Quando voc
abre um arquivo Excel com macros, voc ver uma Barra de
Mensagem aberta com uma opo para voc clicar e habilitar
as macros, ou (se o VBE estiver aberto), voc receber uma
mensagem perguntando se quer habilitar as macros.
5 Desabilitar todas as macros, exceto as digitalmente assinadas:
Apenas macros com uma assinatura digital podem rodar (porm,
at mesmo para aquelas assinaturas que no foram marcadas
como confiveis, voc receber o aviso de segurana).
5 Habilitar todas as macros (no recomendado; cdigos
possivelmente perigosos podem ser executados).
ExcelVBABokks.indb 5 15/02/2013 13:59:16
6 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
Imagine este cenrio: Voc passa uma semana escrevendo um programa

VBA matador, que revolucionar a sua empresa. Voc o testa cuidadosamente e depois envia ao seu chefe. Ele o chama ao seu escritrio e
reclama que a sua macro no faz absolutamente nada. O que est
acontecendo? Possivelmente, as configuraes de segurana do Excel
de seu chefe no permitem a execuo de macros. Ou talvez ele tenha
decidido aceitar a sugesto padro da Microsoft e desativar as macros
ao abrir o arquivo.
A questo toda? S porque uma planilha Excel contm uma macro, no
garante que a macro ser executada. Tudo depende da configurao de
segurana e se o usurio decide ativar ou desativar macros para aquele
arquivo.
Para trabalhar com este livro, ser preciso habilitar as macros para os
arquivos com os quais voc trabalha. Meu conselho usar o segundo
nvel de segurana. Ento, quando abrir o arquivo que criou, voc pode
simplesmente habilitar as macros. Se voc abrir um arquivo de algum
que no conhece, voc deve desabilitar as macros e verificar o cdigo
VBA para ter certeza de que no possui nada destrutivo ou malicioso.
Geralmente, muito fcil identificar um cdigo VBA suspeito.
Como Este Livro Est Organizado
Eu dividi este livro em seis partes importantes, cada qual contendo
vrios captulos. Embora eu tenha arrumado os captulos em uma
sequncia lgica, voc pode l-los em qualquer ordem que quiser. Eis
uma rpida viso geral do que est guardado para voc.
Parte I: Introduo ao VBA
A Parte I contm dois captulos. No primeiro captulo, apresento a linguagem VBA. No Captulo 2, fao-o suar, levando-o para um passeio guiado.
Parte II: Como o VBA Funciona com Excel
Ao escrever este livro, eu assumi que voc j sabe como usar Excel. Os
quatro captulos na Parte II mostram de forma mais clara como VBA
implementado no Excel. Todos esses captulos so importantes,
portanto, eu no recomendo que os pule, certo?
ExcelVBABokks.indb 6 15/02/2013 13:59:16
7 Introduo
Parte III: Conceitos de Programao
Os oito captulos na Parte III o levam ao que realmente a programao. Voc talvez no precise saber todas essas coisas, mas ficar grato
se estiverem l quando voc precisar.
Parte IV: Como se Comunicar com Seus Usurios
Uma das melhores partes de programar em Excel desenvolver caixas
de dilogo (bem, pelo menos, eu gosto). Os cinco captulos da Parte IV
lhe mostram como criar caixas de dilogo que parecem ter vindo
diretamente do laboratrio de software da Microsoft.
Parte V: Juntando Tudo
Os dois captulos da Parte V renem informaes dos captulos anteriores. Voc descobrir como incluir os seus prprios botes personalizados
na interface de usurio do Excel e aprender como desenvolver funes
personalizadas de planilhas, criar add-ins, projetar aplicativos orientados
por usurio e at mesmo trabalhar com outros aplicativos Office.
Parte VI: A Parte dos Dez
Tradicionalmente, livros da srie Para Leigos

possuem uma parte final


que consiste de pequenos captulos com listas prticas e informativas.
Porque eu sou um f de tradies, este livro contm dois de tais
captulos, os quais voc pode pesquisar quando de sua convenincia
(se voc for como a maioria dos leitores, ir para esta parte primeiro).
Espere, H Mais!
Eu me entusiasmei e escrevi dois outros captulos, que no caberiam
neste livro, pois ultrapassei o limite de pginas. Ento, eu os coloquei
no site do livro, juntamente com os exemplos de arquivos (veja Como

Obter os Arquivos de Exemplo mais adiante nesta Introduo). Os dois


captulos extras so Trabalhando com Cores e 10 Dicas Sobre o Que
Fazer e o Que No Fazer em VBA.
cones Usados Neste Livro
Em determinada ocasio, uma empresa de pesquisa de mercado deve
ter mostrado aos editores que poderiam vender mais cpias de seus
ExcelVBABokks.indb 7 15/02/2013 13:59:16
8 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
livros de computador se eles acrescentassem cones nas margens
daqueles livros. cones so aquelas pequenas figuras que supostamente
chamam sua ateno para vrios itens ou lhe ajudam a decidir se algo
digno de leitura.
No sei se essa pesquisa vlida, mas no quero arriscar. Portanto,
aqui esto os cones que voc encontrar em suas viagens da primeira
ltima capa.
Quando voc vir este cone, o cdigo sendo discutido est disponvel
na Web. Faa o download dele para evitar muita digitao. Para mais
informaes, veja Como Obter os Arquivos de Exemplos.
Este cone sinaliza material que pode ser considerado tcnico.
possvel que voc o julgue interessante, mas, se estiver com pressa,
pode pul-lo.
No pule informaes marcadas com este cone. Ele identifica um
atalho que pode poupar muito do seu tempo (e talvez at permita que
voc saia do trabalho mais cedo).
Este cone diz quando voc precisa armazenar informaes nos recessos de seu crebro para uso posterior.
Leia tudo o que estiver marcado com este cone. Caso contrrio, voc
pode perder seus dados, explodir seu computador, causar uma fuso
nuclear ou talvez at arruinar todo o seu dia.
Como Obter os Arquivos de Exemplos
Visite o site da Alta Books para acessar a pgina deste livro e fazer o
download dos arquivos de exemplos, bem como ver os Captulos Extras
(Bnus): www.altabooks.com.br (procure pelo nome do livro).
Com os arquivos de exemplos, voc poupar muita digitao. Melhor
ainda, ser possvel brincar com eles e tentar diversas alteraes. Na
verdade, eu recomendo enfaticamente que voc brinque com esses
arquivos. A melhor maneira de dominar VBA experimentando.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
D
I
C
A
L

E
M
B
R
E
-SE
C
U
I
D
A
D
O!
ExcelVBABokks.indb 8 15/02/2013 13:59:17
9 Introduo
E Agora?
Ler esta introduo foi o primeiro passo. Agora, hora de ir em frente e
se tornar um programador.
Se voc for um programador iniciante, sugiro que inicie pelo Captulo 1
e siga o livro at ter descoberto o suficiente para fazer o que deseja. O
Captulo 2 oferece alguma experincia prtica imediata, assim voc ter
a iluso de que est progredindo.
Mas este um pas livre (pelo menos na hora que escrevia estas
palavras). Por isso, eu no denunciarei voc caso resolva consult-lo
aleatoriamente e ler o que aguar o seu gosto.
Espero que voc se divirta muito lendo este livro, tanto quanto eu o fiz
ao escrev-lo.
ExcelVBABokks.indb 9 15/02/2013 13:59:17
10 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
ExcelVBABokks.indb 10 15/02/2013 13:59:17
Parte I
Introduo ao VBA
Por Rich Tennant A 5 Onda
Na ARCA*, geralmente os funcionrios usam Excel com
Programao VBA para criar frmulas para desastre.
*
A
g

n
c
i
a
R
e
g
u
l
a
d
o
r
a
d
e

C
a
o
s

A
l
h
e
i
o
ExcelVBABokks.indb 11 15/02/2013 13:59:18
Nesta parte...
C
ada livro precisa comear em algum lugar. Este
comea apresentando-o ao Visual Basic para
Aplicativos (e tenho certeza que vocs dois se
tornaro grandes amigos no decorrer de algumas
dzias de captulos). Depois de feitas as apresentaes, o Captulo 2 o levar atravs de uma seo de
programao da vida real do Excel.
ExcelVBABokks.indb 12 15/02/2013 13:59:18
Captulo 1

Neste Captulo
Como conseguir uma viso geral dos conceitos do VBA
Descubra o que se pode fazer com o VBA
Descubra as vantagens e desvantagens de usar o VBA
Uma pequena aula de histria sobre o Excel

O Que VBA ?
S
e voc est ansioso para pular na programao de VBA, segure-se
um pouco. Este captulo totalmente desprovido de qualquer material de treinamento prtico. No entanto, ele contm algumas informaes essenciais de apoio que o ajudam a se tornar um programador de
Excel. Em outras palavras, este captulo prepara o caminho para tudo
que vem pela frente e d a voc um sentido de como a programao de
Excel se ajusta no esquema geral do universo. No aborrece tanto como
voc poderia imaginar.
Tudo Bem, Ento o Que VBA?
VBA, que significa Visual Basic for Applications (Visual Basic para
aplicativos), uma linguagem de programao desenvolvida pela
Microsoft voc sabe, a empresa que tenta faz-lo comprar uma nova
verso do Windows a cada ano. Excel, juntamente com outros membros
do Microsoft Office, inclui a linguagem VBA (sem custos extras).
Resumidamente, VBA uma ferramenta que pessoas como voc e eu
usam para desenvolver programas que controlam o Excel.
Imagine um rob inteligente que saiba tudo sobre o Excel. Esse rob
pode ler instrues e pode tambm operar o Excel com muita rapidez e
preciso. Quando voc quiser que o rob faa algo no Excel, voc
programa as instrues dele, usando cdigos especiais. Diga ao rob
para seguir suas instrues, enquanto voc se senta e relaxa, tomando
um copo de limonada. Isso que VBA, uma linguagem de cdigo para
os robs. Mas, veja, o Excel no vem com um rob e nem faz limonada.
ExcelVBABokks.indb 13 15/02/2013 13:59:18
14 Parte I: Introduo ao VBA
A terminologia de programao em Excel
pode ser um pouco confusa. Por exemplo,

VBA uma linguagem de programao,


mas tambm serve como uma linguagem
de macro. Como voc domina algo escrito
em VBA e executado em Excel? uma macro ou um programa? Normalmente, o sistema Help (Ajuda) do Excel se refere aos
procedimentos VBA como macros, assim,
eu uso essa terminologia.
Uso o termo automatizar neste livro. Esse
termo significa que uma srie de etapas so
completadas automaticamente. Por exemplo, se voc escrever uma macro que acrescenta cor a algumas clulas, imprime a planilha e depois remove a cor, essas trs
etapas foram automatizadas.
A propsito, macro no um acrnimo de
Messy And Confusing Repeated Operation
(Operao Repetida Confusa e Desordenada). Ao invs disso, ela vem da palavra grega makros, que significa grande que tambm descreve o seu contracheque depois
de se tornar um programador especialista
em macro.
Algumas palavras sobre terminologia
O Que Voc Pode Fazer com VBA?
Voc, provavelmente, est ciente que os usurios do Excel usam o
programa para milhares de diferentes tarefas. Seguem alguns exemplos:
5 Anlise de dados cientficos
5 Preparao de oramentos e previses financeiras
5 Criao de faturas e outros formulrios
5 Desenvolvimento de grficos de dados
5 Manuteno de listagens de assuntos como nomes dos clientes,
notas dos alunos ou ideias para presentes (um lindo bolo de
frutas seria adorvel)
5 Etc., etc., etc.
Os exemplos so muitos, mas acredito que voc j entendeu. O que quero
dizer que o Excel usado para coisas variadas, e qualquer um que ler
este livro tem diferentes necessidades e expectativas considerveis. Uma
coisa que todos os leitores tm em comum a necessidade de automatizar
algum aspecto do Excel. Isso, meu caro leitor, o que VBA significa.
Por exemplo, seria possvel criar um programa VBA para importar
alguns nmeros e depois, formatar e imprimir o seu relatrio de
vendas ao final do ms. Depois de desenvolver e testar o programa,
voc pode executar a macro com um nico comando, levando o Excel
a executar automaticamente muitos procedimentos demorados. Ao
invs de lutar atravs de uma cansativa sequncia de comandos, voc
pode pegar uma caneca de suco e deixar o seu computador fazer o
trabalho exatamente o que ele deveria fazer, certo?
P
A
P
O
D
E
E
S
P
E

C
IALIS
T
A
ExcelVBABokks.indb 14 15/02/2013 13:59:18
15 Captulo 1: O Que VBA ?
Nas sees seguintes, descreverei, em poucas palavras, alguns usos
comuns para as macros VBA. Um ou dois destes far que voc se ligue.
Inserir um grupo de texto
Se com frequncia voc precisa entrar com o nome da empresa,
endereo e nmero de telefone em sua planilha de trabalho, possvel
criar uma macro para digitar essas informaes, desde que seja o que
voc quer. Por exemplo, voc pode desenvolver uma macro que digite
automaticamente uma lista de todas as pessoas de vendas que trabalham para a sua empresa.
Automatizar tarefas executadas com frequncia
Suponhamos que voc o gerente de vendas e precisa preparar o
relatrio de vendas do fim do ms para satisfazer seu chefe. Se for uma
tarefa direta, voc pode desenvolver um programa VBA para execut-la.
O seu chefe ficar impressionado com a qualidade e consistncia dos
seus relatrios e voc pode ser promovido a um novo cargo para o qual
voc est altamente desqualificado.
Automatizar operaes repetitivas
Se voc precisa executar 12 vezes uma mesma ao em, digamos, 12
diferentes planilhas do Excel, enquanto executa a primeira planilha,
voc pode gravar uma macro e deixar que a macro repita a sua ao
nas outras planilhas. O melhor disso que o Excel nunca reclama que
est aborrecido. A gravao de uma macro no Excel similar gravao de uma ao ao vivo com um gravador de vdeo. A diferena que
ele no requer uma cmera e a bateria nunca precisa ser recarregada.
Criar um comando personalizado
Geralmente, voc usa a mesma sequncia de comandos no Excel? Se
afirmativo, possvel poupar alguns segundos, desenvolvendo uma
macro que combine esses comandos em um nico comando personalizado, que voc executa com um nico toque de teclado ou clique de boto.
Provavelmente, voc no poupa tanto tempo, mas certamente ser mais
exato. E o cara do cubculo ao lado ficar realmente impressionado.
ExcelVBABokks.indb 15 15/02/2013 13:59:18
16 Parte I: Introduo ao VBA
Criar um boto personalizado
Voc pode personalizar sua barra de ferramentas Pgina Inicial com os
seus prprios botes, que executam as macros escritas por voc. Os
outros funcionrios do escritrio costumam ficar muito impressionados
com botes que fazem mgica.
Se voc estiver usando o Excel 2010, pode adicionar botes barra
superior, algo que no possvel no Excel 2007.
Desenvolver novas funes de planilhas
Embora o Excel inclua diversas funes (tais como SOMA e MDIA),
possvel criar funes de planilha de trabalho personalizadas, que
podem simplificar muito as suas frmulas. Eu garanto que voc ficar
surpreso com quo fcil . Mostro como fazer isso no Captulo 20. E
melhor ainda, a caixa de dilogo Insert Function (Inserir Funo) exibe
as suas funes personalizadas, fazendo com que elas paream internas. Coisa muito boa.
Criar aplicativos completos,
guiados por macro
Se voc estiver disposto a gastar algum tempo, pode usar VBA para
aplicativos completos em larga escala, com uma guia Ribbon, caixas de
dilogo, ajuda na tela e muitas outras benesses. Este livro no vai to
longe, mas estou falando sobre isso para incentiv-lo quanto a quo

poderoso o VBA realmente.


Criar suplementos (add-ins)
personalizados para o Excel
Voc provavelmente est familiarizado com os suplementos (add-ins)
do Excel. Por exemplo, Analysis ToolPak (Pacote de Ferramentas de
Anlise) um suplemento popular. Voc pode usar o VBA para desenvolver os seus prprios add-ins de objetivo especial. Desenvolvi a
minha Caixa de Utilidades usando apenas VBA e as pessoas do mundo
todo me pagam um bom dinheiro para poderem us-la.
Vantagens e Desvantagens do VBA
Nesta parte, descrevo resumidamente as boas coisas sobre VBA e
tambm exploro o seu lado mais escuro.
ExcelVBABokks.indb 16 15/02/2013 13:59:18
17 Captulo 1: O Que VBA ?
Vantagens do VBA
possvel automatizar quase tudo o que voc faz em Excel. Para faz-lo,
basta escrever instrues que o Excel as executa. Automatizar uma
tarefa usando VBA oferece vrias vantagens:
5 O Excel sempre executa tarefas exatamente do mesmo jeito (na
maioria dos casos, consistncia uma coisa boa).
5 O Excel executa a tarefa muito mais depressa do que voc
pode fazer manualmente (a menos, claro, que voc seja o
Super-Homem).
5 Se voc for um bom programador de macros, o Excel sempre
executa tarefas sem erros (j no podemos dizer isso sobre
eu e voc).
5 Se voc configurar as coisas corretamente, qualquer um sem
conhecimento do Excel pode executar a tarefa.
5 possvel fazer coisas em Excel que poderiam parecer impossveis
o que pode torn-lo uma pessoa muito popular no escritrio.
5 Para tarefas longas e demoradas, voc no precisa ficar sentado
diante de seu computador e se aborrecer. O Excel faz o
trabalho, enquanto voc fica toa.
Desvantagens do VBA
justo que eu use o mesmo tempo para relacionar as desvantagens (ou
possveis desvantagens) do VBA:
5 Voc tem que saber como escrever programas em VBA (mas foi
para isso que voc comprou este livro, certo?). Felizmente, no
to complicado quanto voc poderia prever.
5 Outras pessoas que precisem usar os seus programas VBA
devem ter suas prprias cpias do Excel. Seria muito bom se
voc pressionasse um boto e o aplicativo Excel/VBA se
convertesse em um programa autnomo, mas isso no
possvel (e provavelmente nunca ser).
5 s vezes, as coisas saem erradas. Em outras palavras, no
possvel supor, cegamente, que o seu programa VBA sempre
funcionar corretamente em todas as circunstncias. Bem-vindo
ao mundo da depurao e, se outros estiverem usando as suas
macros, ao suporte tcnico.
5 VBA como um alvo em movimento. Como voc sabe, a
Microsoft continuamente atualiza o Excel. Mesmo a Microsoft se
esforando para que haja uma compatibilidade entre as
verses, voc pode descobrir que o cdigo VBA que escreveu
no funciona adequadamente com verses mais antigas ou com
uma verso futura de Excel.
ExcelVBABokks.indb 17 15/02/2013 13:59:18
18 Parte I: Introduo ao VBA
VBA Resumidamente
S para saber onde voc est se metendo, preparei um rpido resumo
sobre VBA. E claro, descrevi tambm todas as coisas dolorosas que

detalharei neste livro.


5 Aes so executadas em VBA escrevendo (ou gravando) cdigo
em um mdulo VBA. Voc v e edita mdulos VBA, usando o
Visual Basic Editor (VBE).
5 Um mdulo VBA consiste de Sub procedimentos (secundrios). Um
procedimento secundrio nada tem a ver com submarinos ou
sanduches saborosos. Ao contrrio, trata-se de um grupo de cdigo
de computador que realiza alguma ao em ou com objetos (a ser
discutido em breve). O exemplo a seguir mostra um simples
procedimento de Sub, chamado AddEmUp. Esse incrvel programa
exibe o resultado de 1 mais 1.
Sub AddEmUp()
Sum = 1 + 1
MsgBox The answer is & Sum
End Sub
Um procedimento Sub que no executa adequadamente chamado
de substandard (um secundrio padro).
5 Um mdulo VBA tambm pode ter procedimentos de Function.
Um procedimento de Function retorna um nico valor. possvel
cham-lo a partir de outro procedimento VBA ou at us-lo como
uma funo em uma frmula de planilha. A seguir, est um exemplo
de um procedimento Function (chamado de AddTwo). Essa Function
aceita dois nmeros (chamados de argumentos) e retorna a soma
daqueles valores.
Function AddTwo(arg1, arg2)
AddTwo = arg1 + arg2
End Function
Um procedimento de Function que no funciona corretamente
dito disfuncional.
5 Objetos manipulados VBA. O Excel oferece dzias e dzias de
objetos que podem ser manipulados. Exemplos de objetos incluem
um livro de registro, uma planilha, uma faixa de clula, um grfico e
uma pasta de trabalho. H muitos outros objetos sua disposio,
e voc pode manipul-los usando cdigo VBA.
5 Objetos VBA so organizados em uma hierarquia. Os objetos
podem agir como contineres para outros objetos. O Excel est no
alto da hierarquia de objetos. O prprio Excel um objeto chamado
Application (Aplicativo). O objeto Application contm outros
objetos, tais como objetos Workbook e objetos Add-Ins. O objeto
Workbook pode conter outros objetos, tais como objetos Worksheet
e objetos Chart. Um objeto Worksheet pode conter objetos como
ExcelVBABokks.indb 18 15/02/2013 13:59:18
19 Captulo 1: O Que VBA ?
objeto Range e objeto PivotTable. O termo modelo de objeto refere-se
organizao desses objetos (mais detalhes sobre modelo de objeto
podem ser encontrados no Captulo 4).
5 Objetos do mesmo tipo formam uma coleo. Por exemplo, a coleo
Worksheets consiste de todas as planilhas de uma pasta de trabalho
especfico. A coleo Charts consiste de todos os objetos Chart de
uma pasta de trabalho. As prprias colees so objetos.
5 Voc se refere a um objeto, especificando a sua posio na hierarquia
de objeto, usando um ponto como um separador. Por exemplo,
possvel fazer referncia ao livro de trabalho Book1.xlsx. assim:
Application.Workbooks(Book1.xlsx)
Isso se refere pasta de trabalho Book1.xlsx na coleo Workbooks.
Essa coleo est contida no objeto Application (ou seja, Excel).
Levando isso a outro nvel, voc pode se referir a Sheet1 em Book1.xlsx
Application.Workbooks(Book1.xlsx). _
Worksheets(Sheet1)
Conforme mostrado no exemplo a seguir, ainda possvel levar isso

a um outro nvel e fazer referncia a uma clula especfica (neste


caso, clula A1):
Application.Workbooks(Book1.xlsx).
Worksheets(Sheet1).Range(A1)
5 Se voc omitir referncias especficas, o Excel usa objetos ativos.
Se Bookl.xlsx for a pasta de trabalho ativa, possvel simplificar a
referncia anterior como a seguir:
Worksheets(Sheet1).Range(A1)
Se voc souber que Sheet1 a planilha ativa, pode simplificar ainda
mais a referncia:
Range(A1)
5 Os objetos tm propriedades. possvel pensar sobre uma
propriedade como a configurao de um objeto. Por exemplo, um
objeto Range tem propriedades como Value e Address. Um objeto
Chart tem propriedades como HasTitle e Type. Voc pode usar
VBA para determinar propriedades do objeto e tambm alterar
suas propriedades.
5 Uma propriedade referenciada a um objeto combinando o
nome do objeto com o nome da propriedade, separados por um
ponto. Por exemplo, voc pode referenciar a propriedade Value na
clula A1 em Sheet1 assim:
Worksheets(Sheet1).Range(A1).Value
ExcelVBABokks.indb 19 15/02/2013 13:59:18
20 Parte I: Introduo ao VBA
5 Voc pode atribuir valores a variveis. Uma varivel um
elemento nomeado que armazena informaes. possvel usar
variveis em seu cdigo VBA para armazenar coisas como
valores, texto ou configuraes de propriedade. Para atribuir
um valor na clula A1 em Sheet1 a uma varivel chamada
Interest, use a seguinte declarao VBA:
Interest = Worksheets(Sheet1).Range(A1). Value
5 Objetos tm mtodos. Um mtodo uma ao que Excel
executa com um objeto. Por exemplo, um dos mtodos em um
objeto Range ClearContents. Esse mtodo nomeado
adequadamente, limpa o contedo de uma faixa de clulas.
5 Voc especifica um mtodo combinando o objeto com o
mtodo, separados por um ponto. Por exemplo, a seguinte
declarao limpa o contedo da clula A1:
Worksheets(Sheet1).Range(A1).ClearContents
5 VBA inclui todas as construes de linguagens modernas de
programao, inclusive arrays e loops. Em outras palavras, se
voc estiver disposto a gastar um pouco de tempo
administrando o assunto, pode escrever cdigos que fazem
algumas coisas incrveis.
Acredite ou no, a lista anterior descreve bem o VBA resumidamente.
Agora, voc s precisa encontrar os detalhes. Por isso que este livro
tem mais pginas.
Uma Excurso pelas Verses Anteriores
Se voc pretende desenvolver macros VBA, deve ter algum conhecimento sobre a histria do Excel. Eu sei que voc no estava esperando
ter uma aula de histria ao escolher este livro, mas acredite em mim,
isso uma coisa importante que pode lev-lo a fazer sucesso na
prxima festa de nerds.
Aqui esto todas as principais verses de Excel que surgiram para Windows,
bem como algumas palavras sobre como elas lidam com macros:
5 Excel 2: A verso original de Excel para Windows foi chamada
de Verso 2 (ao invs de 1), para que ela pudesse ser
correspondente verso Macintosh. O Excel 2 apareceu pela
primeira vez em 1987, porm ningum a usa mais, portanto,
voc pode muito bem esquecer que ela existiu.

5 Excel 3: Lanada em fins de 1990, essa verso apresenta a


linguagem macro XLM. Tambm, ningum mais usa essa verso.
ExcelVBABokks.indb 20 15/02/2013 13:59:18
21 Captulo 1: O Que VBA ?
5 Excel 4: Essa verso chegou s ruas no incio de 1992. Ela
tambm usa a linguagem macro XLM. Uma pequena quantidade
de pessoas ainda usa essa verso (elas so associadas
filosofia, se ainda no quebrou, por que trocar?).
5 Excel 5: Esta surgiu no incio de 1994. Foi a primeira verso a
usar VBA (mas tambm suporta XLM). Usurios de Excel 5
esto se tornando incrivelmente raros).
5 Excel 95: Tecnicamente conhecida como Excel 7 (no h Excel
6), essa verso comeou a surgir no vero de 1995. Ela uma
verso de 32-bits e exige Windows 95 ou Windows NT. Ela tem
alguns aperfeioamentos VBA e suporta a linguagem XLM.
5 Excel 97: Esta verso (tambm conhecida como Excel 8), nasceu
em Janeiro de 1997. Ela tem muitos aperfeioamentos e
apresenta uma interface totalmente nova para programar macros
VBA.O Excel 97 tambm usa um novo formato de arquivo (que
verses anteriores de Excel no podiam abrir). Eventualmente,
eu me deparo com algum que ainda usa essa verso.
5 Excel 2000: O esquema de numerao dessa verso pulou para
quatro dgitos. O Excel 2000 (tambm conhecido como Excel 9),
fez sua primeira apario em junho de 1999. Ela inclui apenas
alguns aperfeioamentos sob a perspectiva de um programador,
com a maioria deles sendo para usurio especialmente,
usurios online. Com o Excel 2000, veio a opo de assinar
macros digitalmente, permitindo assim a voc a garantia de que
o cdigo entregue aos seus usurios so seus, de fato. O Excel
2000 ainda tem uma quantidade modesta de usurios.
5 Excel 2002: Essa verso (tambm conhecida como Excel 10 ou
Excel XP) apareceu ao final de 2001. Talvez o recurso mais
significativo dessa verso seja a habilidade de recuperar o seu
trabalho quando o Excel falha. Essa tambm a primeira verso
a usar proteo de cpia (conhecido como product activation
ativao de produto).
5 Excel 2003: De todas as atualizaes do Excel que eu j vi (e as
vi todas), o Excel 2003 tem a menor quantidade de recursos
novos. Em outras palavras, a maioria dos usurios cativos do
Excel ficaram muito desapontados com o Excel 2003. Ainda
assim, as pessoas o compravam. Creio que foram esses
camaradas que vieram de uma verso pr Excel 2002. Enquanto
escrevo isto, provavelmente o Excel 2003 a verso mais usada.
5 Excel 2007: O Excel 2007 marcou o incio de uma nova era.
Excel 2007 se desfez do antigo menu e da barra de ferramentas
da interface e apresentou a Faixa de Opes. Ele tambm
possibilita planilhas de trabalho muito maiores mais de um
milho de linhas.
5 Excel 2010: O mais recente e, sem dvida, o melhor. A Microsoft se
superou com esta verso. Esta verso tem alguns novos recursos
engenhosos (tais como grficos sparkline), e tambm executa um
pouco melhor em alguns aspectos. E se voc precisar realmente de
pastas de trabalho enormes, pode instalar a verso de 64-bits.
ExcelVBABokks.indb 21 15/02/2013 13:59:18
22 Parte I: Introduo ao VBA
Este livro escrito para Excel 2007 e Excel 2010, portanto, se voc no
tiver uma dessas verses, corre o risco de ficar confuso em alguns casos.
Ento, qual a finalidade dessa pequena aula de histria? Se voc
pretende distribuir seus arquivos Excel/VBA a outros usurios, de suma
importncia entender qual verso do Excel eles usam. Pessoas usando

uma verso mais antiga podem no ser capazes de usufruir a vantagem


de recursos introduzidos nas verses mais recentes. Por exemplo, se
voc escrever cdigo VBA que faz referncias clula XFD1048576 (a
ltima clula em uma planilha) aqueles que usam uma verso anterior ao
Excel 2007 recebero um erro, pois verses anteriores ao Excel 2007 s
tinham 65.536 linhas e 255 colunas (a ltima clula IV65536).
O Excel 2007 e o Excel 2010 tambm tm alguns novos objetos, mtodos
e propriedades. Se voc os usa em seu cdigo, usurios com uma verso
mais antiga do Excel recebero um erro quando rodarem sua macro e
voc ser responsabilizado. No entanto, a Microsoft disponibilizou um
Pacote Office de Compatibilidade, o qual permite aos usurios de Excel
2003 e Excel XP abrir e salvar pastas de trabalho no novo formato de
arquivo. Esse produto (que, a propsito, gratuito) no tem os novos
recursos dessas verses. Ele simplesmente permite que eles abram e
salvem arquivos no formato de arquivo Excel 2007/2010.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 22 15/02/2013 13:59:18


Neste Captulo
Como desenvolver uma macro VBA til? Um exemplo prtico, passo a passo
Grave suas aes com o gravador de macros do Excel
Como examinar e testar o cdigo gravado
Como lidar com questes de segurana de macro
Mude uma macro gravada
Saltando Para o
Lugar Certo
Captulo 2
E
u no sou bem um nadador, mas descobri que a melhor maneira de
um corpo frio entrar na gua pular direto no faz sentido prolongar a agonia. Percorrendo este captulo, voc molha os ps imediatamente, mas evita mergulhar de cabea.
Quando chegar ao final deste captulo, voc pode comear a se sentir
melhor quanto questo dessa programao em Excel, e ficar satisfeito de ter dado o mergulho. Este captulo oferece uma demonstrao
passo a passo de como desenvolver uma macro VBA simples, mas til.
Primeiros Passos
Antes de se autoproclamar programador do Excel, voc deve passar
pelos rituais de iniciao. Isso significa que voc precisa fazer uma
pequena mudana, para que o Excel exiba uma nova guia no alto da
tela: Desenvolvedor.
Ao clicar na guia Desenvolvedor, so exibidas informaes do interesse
dos programadores (este voc!). A Figura 2-1 mostra como a Faixa de
Opes se parece quando a guia Desenvolvedor selecionada.
ExcelVBABokks.indb 23 15/02/2013 13:59:18
Parte I: Introduo ao VBA 24
A guia Desenvolvedor no visvel quando voc abre o Excel, preciso
dizer a ele para mostr-la. Fazer com que Excel exiba a guia Desenvolvedor fcil (e voc s precisa faz-lo uma vez). Mas, o procedimento
varia, dependendo de qual verso voc usa.
Usurios de Excel 2010
Siga estas etapas:
1. Clique com o boto direito em qualquer parte da Faixa de Opes e

escolha Personalizar a Faixa de Opes.


2. Na guia Personalizar a Faixa de Opes da caixa de dilogo Opes
do Excel, localize Desenvolvedor na segunda coluna.
3. Coloque uma marca de verificao em Desenvolvedor.
4. Clique OK e voc volta para o Excel com uma guia nova:
Desenvolvedor.
Usurios de Excel 2007
Siga estas etapas:
1. Escolha Arquivo Opes do Excel.
Lembre-se de que no Excel 2007, o comando Arquivo signi ca
clicar o boto redondo no canto superior esquerdo.
2. Na caixa de dilogo Opes, selecione Personalizar.
3. Coloque uma marca de verificao na caixa de seleo Mostrar
guia Desenvolvedor na Faixa de Opes.
4. Clique OK para ver a nova guia Desenvolvedor ser exibida na
Faixa de Opes.
Figura 2-1:
Normalmente, a guia
Desenvolvedor est
oculta, mas
fcil
exibi-la.
ExcelVBABokks.indb 24 15/02/2013 13:59:18
25 Captulo 2: Saltando Para o Lugar Certo
O Que Voc Far
Nesta seo, descrevo como criar a sua primeira macro. A macro que
voc est prestes a criar far isto:
5 Digite seu nome em uma clula.
5 Fornea a data e hora atuais na clula abaixo.
5 Formate as duas clulas para exibir em negrito.
5 Mude o tamanho da fonte de ambas as clulas para 16 pontos.
Esta macro no ganhar quaisquer prmios na Competio Anual dos
Programadores de VBA, mas todas as pessoas tm que comear em
algum lugar. A macro executa todas essas etapas em uma nica ao.
Como descrevo nas prximas sees, voc comea gravando as suas
aes na medida em que percorre essas etapas. Depois, voc testa a
macro, para ver se ela funciona. Por fim, voc edita a macro para
acrescentar alguns toques finais. Pronto?
Dando os Primeiros Passos
Esta seo descreve as etapas que voc percorre antes de gravar a
macro. Em outras palavras, voc precisa de alguns preparativos antes
do bom da festa comear.
1. Inicie o Excel, se ele ainda no estiver sendo executado.
2. Se for necessrio, crie uma nova planilha (Ctrl+N a minha
maneira preferida de fazer isso).
3. Clique a guia Desenvolvedor e d uma olhada no boto (Usar
Referncias Relativas), no grupo Cdigo.
Se a cor desse boto for diferente da dos outros, quer dizer que
voc est bem. Se o boto Usar Referncias Relativas for da
mesma cor dos outros botes, ento ser preciso clic-lo.
Explicarei mais sobre o boto Usar Referncias Relativas no Captulo 6.
Por ora, vamos garantir que a opo esteja ativada. Quando ela estiver
ativada, ter uma cor diferente.
ExcelVBABokks.indb 25 15/02/2013 13:59:18
Parte I: Introduo ao VBA 26
Gravando a Macro
Aqui est a parte prtica. Siga as seguintes instrues cuidadosamente:
1. Selecione uma clula qualquer clula que queira

2. Escolha Desenvolvedor Cdigo Gravar Macro ou clique o


boto de gravao de macro na barra de status.
A caixa de dilogo Gravar Macro aparece, conforme mostrado na
Figura 2-2.
3. Entre com um nome para a macro.
O Excel oferece um nome padro, mas melhor usar um nome
mais descritivo. NameAndTime (sem espaos) um bom nome
para essa macro.
4. Clique na caixa Tecla de Atalho e entre com Shift+N (para um N
em maiscula), como a tecla de atalho.
Especificar uma tecla de atalho opcional. Se voc especificar um,
ento pode executar a macro pressionando a combinao, no
caso, Ctrl+Shift+N.
5. Assegure-se de que a configurao de Armazenar macro seja
esta pasta de trabalho.
6. Se quiser, voc pode entrar com algum texto na caixa Descrio.
Isso opcional. Algumas pessoas gostam de descrever o que a
macro faz (ou o que supostamente faz).
7. Clique OK.
A caixa de dilogo fecha e o gravador de macro do Excel ativado.
A partir deste ponto, o Excel monitora tudo o que voc faz e
converte para cdigo VBA.
8. Digite seu nome em uma clula ativa.
9. Mova o indicador da clula para a clula abaixo e entre com a
frmula:
=AGORA()
A frmula exibe a data e hora atuais.
Figura 2-2:
A caixa de
dilogo
Gravar
Macro
aparece
quando
voc for
gravar
uma macro
ExcelVBABokks.indb 26 15/02/2013 13:59:18
27 Captulo 2: Saltando Para o Lugar Certo
10. Selecione a frmula da clula e pressione Ctrl+C para copiar a
clula na rea de Transferncia.
11. Escolha Pgina Inicial rea de Transferncia Colar Colar
Valores.
Este comando converte a frmula aos seus valores.
12. Com a clula de data selecionada, pressione Shift+up para selecionar aquela clula e uma acima dele (a qual contm o seu nome).
13. Use os controles no grupo Pgina Inicial Fonte para mudar a
formatao para Negrito e mudar o tamanho da fonte para 16
pontos.
14. Escolha Desenvolvedor Cdigo Parar Gravao.
O gravador de macro desativado.
Parabns! Voc acabou de criar a primeira macro VBA no Excel. Talvez
queira ligar para sua me e amigos e contar a boa notcia.
Testando a Macro
Agora, voc pode testar a macro e ver se ela funciona corretamente.
Para testar sua macro, mova para uma clula vazia e pressione
Ctrl+Shift+N.
Em um piscar de olhos, o Excel executar a macro. Seu nome e a data
atual aparecero em negrito e em letras grandes.
Outra maneira de executar a macro selecionar

Desenvolvedor Cdigo Macros (ou pressionar Alt+F8) para exibir a


caixa de dilogo Macros. Selecione a macro da lista (neste caso,
NameAndTime) e clique em Executar. Assegure-se de selecionar a clula
que contenha o seu nome antes de executar a macro.
Examinando a Macro
At agora, voc gravou uma macro e a testou. Se for do tipo curioso,
provavelmente voc est imaginando como essa macro se parece. E
pode at pensar onde ela est armazenada.
Lembra quando voc comeou a gravar a macro? Voc indicou que o
Excel deveria armazenar a macro na Pasta de Trabalho. A macro
armazenada na planilha, mas voc precisa ativar o Visual Basic Editor
(VBE) para v-la.
D
I
C
A
ExcelVBABokks.indb 27 15/02/2013 13:59:18
Parte I: Introduo ao VBA 28
Siga os seguintes passos para ver a macro:
1. Escolha Desenvolvedor Cdigo Visual Basic (ou pressione
Alt+F11).
A janela do programa Visual Basic Editor aparece, conforme
mostrado na Figura 2-3. Essa janela altamente personalizvel,
portanto, a sua janela VBE pode parecer um pouco diferente. A
janela do programa VBE contm vrias outras janelas e isso,
provavelmente, muito intimidador. No se aflija: voc se acostumar com isso.
2. Na janela VBE, localize a janela chamada de Projeto.
A janela Projeto (tambm conhecida como janela Project Explorer)
contm uma lista de todas a planilhas e add-ins que esto abertas
no momento. Cada projeto colocado como uma rvore e pode
ser expandido (para mostrar mais informaes) ou ser contrado
(para mostrar menos informaes).
O VBE usa algumas janelas bem diferentes, qualquer delas podendo ser aberta ou fechada. Se uma janela no estiver imediatamente
visvel no VBE, voc pode escolher uma opo a partir do menu
Exibir para exibi-la. Por exemplo, se a janela Projeto no estiver
visvel, possvel escolher Exibir Project Explorer (ou pressionar
Ctrl+R) para exibi-la. Voc pode exibir qualquer outra janela do
VBE da mesma forma. Explico mais sobre os componentes do
Visual Basic Editor no Captulo 3.
3. Selecione o projeto que corresponde planilha onde voc gravou a macro.
Se voc no salvou a planilha, o projeto provavelmente est com o
nome VBAProject (pasta1).
4. Clique no sinal de adio (+) esquerda da pasta chamada
Mdulos.
Figura 2-3:
no Visual
Basic Editor
que voc v
e edita o
cdigo VBA.
D
I
C
A
ExcelVBABokks.indb 28 15/02/2013 13:59:19
29 Captulo 2: Saltando Para o Lugar Certo
A rvore se expande para mostrar Mdulo1, que o nico mdulo

no projeto.
5. Clique duas vezes em Mdulo1.
O cdigo VBA nesse mdulo exibido na janela Cdigo. A Figura2-4 mostra como ela se parece na minha tela. A sua tela pode
no ser exatamente igual.
Nessa altura, provavelmente a macro parece com grego para voc. No
se preocupe. Viaje por alguns captulos e tudo ficar to claro como a
vista a partir do Olimpo.
A macro NameAndTime (tambm conhecida como uma Sub procedure)
consiste de vrias declaraes. O Excel executa as declaraes uma por
uma, de cima para baixo. Uma declarao precedida por um apstrofo
() um comentrio. Comentrios esto includos apenas para sua informao e so essencialmente ignorados. Em outras palavras, o Excel
passa direto pelos comentrios ().
A primeira declarao VBA (que comea com a palavra Sub) identifica a
macro como um procedimento Sub e d o seu nome voc forneceu
esse nome antes de comear a gravar a macro. Se ler cuidadosamente
atravs do cdigo, voc ser capaz de entender um pouco dele. Voc
ver o seu nome, a frmula que forneceu e cdigo adicional que altera a
fonte. O procedimento Sub termina com a declarao End Sub.
Figura 2-4: O
VBE mostra
o cdigo
VBA no
Mdulo1 da
planilha.
ExcelVBABokks.indb 29 15/02/2013 13:59:19
Parte I: Introduo ao VBA 30
Eu j comentei neste captulo que gravar
uma macro como gravar som em um
gravador de fita. Quando voc coloca
para tocar e escuta sua prpria voz no
gravador, invariavelmente diz: Minha voz
no essa. E quando voc olhara sua
gravao de macro, talvez veja algumas
aes que no gravou.
Ao gravar o exemplo NameAndTime, voc
mudou apenas o tamanho da fonte, ainda
que o cdigo gravado exiba todos os tipos
de declaraes de mudana de fonte
(Strikethrough, Superscript, Shadow e
assim por diante). No se preocupe, isso
acontece o tempo todo. Frequentemente,
o Excel grava muitos cdigos que parecem
inteis. Em captulos posteriores, voc
ver como remover o cdigo extra de uma
macro gravada.
Ei, eu no gravei isso!
Modifcando a Macro
Como seria esperado, voc pode no apenas ver a sua macro em VBE,
como tambm alter-la. Se olhar para o cdigo, alguma coisa dele far,
de fato, algum sentido. Mesmo que a essa altura voc no tenha ideia
do que est fazendo, aposto que pode fazer estas mudanas no cdigo:
5 Mudar o nome fornecido na clula ativa. Se voc tiver um
cachorro, use o nome dele.
5 Mudar o nome da fonte ou do tamanho.
5 Veja se voc descobre um lugar adequado para uma nova
declarao:
Selection.Font.Bold = True
Trabalhar com um mdulo de cdigo VBA quase como trabalhar em

um documento em um processador de textos (exceto que no h


palavra envolvida e no possvel formatar o texto). Pensando melhor,
acho que mais como trabalhar em Windows Notepad. Voc pode
pressionar Enter para iniciar uma nova linha e as teclas de edio
conhecidas funcionam conforme esperado.
Depois de ter feito as suas alteraes, volte para o Excel e experimente
a macro revisada, para ver como ela funciona. Exatamente como voc
pressiona Alt+F11 em Excel para exibir o VBE, pode pressionar Alt+F11
no VBE para voltar ao Excel.
Salvando Planilhas que Contm Macros
Se voc armazenar uma ou mais macros na planilha, o arquivo deve ser
salvo com macros habilitadas. Em outras palavras, o arquivo deve ser
salvo com uma extenso XLSM em lugar da extenso XLSX normal.
D
I
C
A
ExcelVBABokks.indb 30 15/02/2013 13:59:19
31 Captulo 2: Saltando Para o Lugar Certo
Por exemplo, quando voc salva a planilha que contm a sua macro
NameAndTime, o formato de arquivo na caixa de dilogo Salvar Como
padroniza para XLSX (um formato que no pode conter macros!). A
menos que voc mude o formato de arquivo para XLSM, o Excel exibe o
aviso mostrado na Figura 2-5. Voc precisa clicar em No e depois, escolher Modelo Habilitado para Macro do Excel (*.xlsm) a partir da lista de
seleo do tipo de arquivo do Salvar Como.
Entendendo a Segurana de Macro
Em Excel, a segurana de macro um recurso importante. Pelo fato de
VBA ser uma linguagem poderosa to poderosa que at mesmo uma
simples macro pode causar srios danos ao seu computador. Uma
macro pode apagar arquivos, enviar informaes a outros computadores e at destruir o Windows, de modo que voc no pode sequer
iniciar o seu sistema.
Os recursos de segurana de macro em Excel 2007 e Excel 2010 foram
criados para ajudar a evitar tais tipos de problemas
A Figura 2-6 mostra a seo Configuraes de Macro da caixa de
dilogo Central de Confiabilidade. Para exibir essa caixa de dilogo,
escolha Desenvolvedor Cdigo Configuraes de Macro.
Por padro, o Excel usa Desabilitar Todas as Macros com Notificao.
Com essa configurao ativa, se voc abrir uma planilha que contenha
macros (e o arquivo no esteja digitalmente assinado ou armazenado
em um lugar confivel), o Excel exibe um aviso como o da Figura 2-7.
Caso voc tenha certeza de que a planilha vem de uma fonte confivel,
clique Habilitar Macros, e as macros sero habilitadas.
Voc s v a caixa pop-up (que surge) da Figura 2-7 se o VBE estiver
aberto. Caso contrrio, o Excel exibe uma vista de aviso de segurana
(Security Warning) acima da barra Frmula. possvel clicar o boto
para habilitar as macros.
Figura 2-5:
Se sua
planilha
contiver
macros e
voc tentar
salv-la em
um formato
de arquivo
sem macro,
o Excel o
avisar.

L
E
M
B
R
E
-SE
ExcelVBABokks.indb 31 15/02/2013 13:59:19
Parte I: Introduo ao VBA 32
Se voc usa Excel 2010, ele lembrar se voc designou uma planilha
para ser protegida. Portanto, na prxima vez que abri-lo, no ver o
Aviso de Segurana. Porm, esse no o caso com Excel 2007. Voc
receber um aviso a cada vez a menos que armazene aquela planilha
em um lugar protegido.
Talvez a melhor maneira para lidar com a segurana da macro
designar uma ou mais pastas como locais confiveis. Todas as planilhas
em um local confivel so abertas sem um aviso da macro. As pastas
confiveis so designadas na seo Locais Confiveis, na caixa de
dilogo Central de Confiabilidade.
Querendo descobrir o que significam as outras configuraes de
segurana, pressione F1 enquanto a seo Configuraes de Macro da
caixa de dilogo Central de Confiabilidade estiver vista. A tela Ajuda
do Excel aparece e o tpico Habilitar ou Desabilitar Macros em Arquivos do Office exibido na janela Ajuda do Excel.
Figura 2-6:
A Seo
Configuraes de
Macro da
caixa de
dilogo
Central de
confiabilidade.
Figura 2-7:
O Excel
avisa que
o arquivo
aberto
contm
macros.
ExcelVBABokks.indb 32 15/02/2013 13:59:19
33 Captulo 2: Saltando Para o Lugar Certo
Mais sobre a Macro NameAndTime
Quando voc terminar este livro, entender completamente como a macro
NameAndTime funciona e estar preparado para desenvolver macros. Por
ora, mostro o exemplo com alguns pontos adicionais sobre a macro:
5 Para esta macro funcionar, a planilha deve estar aberta. Se voc
fechar a planilha, a macro no funciona (e o atalho Ctrl+Shift+N
no ter efeito).
5 Desde que a planilha contendo a macro esteja aberta, voc
pode rodar a macro enquanto qualquer planilha estiver ativa.
Em outras palavras, a planilha da prpria macro no precisa
estar ativa.
5 A macro no cdigo pr qualidade. Ela sobrescrever texto
existente sem aviso e os seus efeitos no podem ser desfeitos.
5 Antes de comear a gravar a macro, voc designou a ela uma
nova tecla de atalho. Essa apenas uma de vrias maneiras de
executar a macro.
5 Voc pode entrar manualmente com essa macro, ao invs de

grav-la. Para faz-lo, necessrio um bom entendimento de


VBA (tenha pacincia, voc chegar l).
5 possvel armazenar essa macro em sua Pasta de trabalho de
macros pessoais. Se o fizer, a macro estar automaticamente
disponvel sempre que voc iniciar o Excel. Para detalhes sobre
isso, veja o Captulo 6.
5 Tambm possvel converter a planilha a um arquivo add-in
(mais sobre isso no Captulo 21).
Voc foi iniciado no mundo de programao do Excel. Lamento, no h
um aperto de mo ou anel decodificador. Espero que este captulo o
ajude a perceber que programao em Excel algo que voc realmente
pode fazer e at viver para contar. Quase que com certeza, os
prximos captulos respondem s suas perguntas, e logo voc entender exatamente o que fez nesta seo prtica.
ExcelVBABokks.indb 33 15/02/2013 13:59:19
Parte I: Introduo ao VBA 34
ExcelVBABokks.indb 34 15/02/2013 13:59:19
Parte II
Como o VBA Trabalha
com o Excel
A 5 Onda Por Rich Tennant
Veja e se apenas aumentssemos o
tamanho dos gr cos?
ESTRATGIA PARA
AUMENTO DE
LUCRO
ExcelVBABokks.indb 35 15/02/2013 13:59:19
Nesta parte...
O
s prximos quatro captulos oferecem uma base
importante para descobrir os prs e os contras
do VBA. Voc aprender sobre mdulos (as planilhas
que armazenam o seu cdigo VBA) e ser apresentado ao modelo objeto Excel (algo que voc no quer
perder). Voc tambm descobrir a diferena entre
sub-rotinas e funes, e ter um curso relmpago
sobre o gravador de macro do Excel.
ExcelVBABokks.indb 36 15/02/2013 13:59:19

Neste Captulo
Entenda o Visual Basic Editor
Descubra as partes do Visual Basic Editor
Saiba o que acontece em um mdulo VBA
Entenda as trs maneiras de ter cdigo VBA em um mdulo
Personalize o ambiente VBA

Captulo 3
Trabalhando no Visual
Basic Editor
C
omo um usurio mais experiente do que a mdia em Excel, provavelmente voc tem uma boa ideia sobre pastas de trabalhos, frmulas, tabelas e outras benesses do Excel. Agora, hora de expandir seus
horizontes e explorar um aspecto totalmente novo de Excel: o Visual Basic
Editor. Neste captulo, voc descobrir como trabalhar com ele e vai direto
ao que interessa quanto a escrever algum cdigo VBA.
O Que o Visual Basic Editor?
Eu vou poupar meus dedos do prembulo e me referir ao Visual Basic
Editor como o VBE. O VBE um aplicativo separado, onde voc escreve
e edita suas macros VBA. Ele funciona sem emendas com o Excel. Por

sem emendas quero dizer que o Excel cuida de abrir o VBE quando voc
precisa dele.
No possvel rodar VBE separadamente; o Excel precisa estar rodando
para que o VBE seja executado.
Ativando o VBE
O modo mais rpido de ativar o VBE pressionando Alt+F11 quando o
Excel est ativo. Para retornar ao Excel, pressione Alt+F11 de novo.
Voc tambm pode ativar o VBE usando o comando
Desenvolvedor Cdigo Visual Basic. Se voc no tem uma faixa de
opes Desenvolvedor na parte superior da sua janela Excel, volte ao
Captulo 2, onde explico como obt-la .
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 37 15/02/2013 13:59:19
38 Parte II: Como o VBA Trabalha com o Excel
Entendendo os componentes do VBE
A Figura 3-1 mostra o programa, com algumas das partes chave identificadas. Pelo fato de haver tantas coisas em andamento no VBE, eu gosto
de maximizar a janela para ver tanto quanto possvel.
possvel que a sua janela de programa VBE no se parea exatamente
com o que visto na Figura 3-1. O VBE contm vrias janelas e
altamente personalizvel. Voc pode ocultar, reorganizar, acoplar
janelas e assim por diante.
Na verdade, o VBE possui ainda mais partes do que as mostradas na
Figura 3-1. Eu discutirei esses componentes adicionais no decorrer do
livro, quando eles se tornarem relevantes.
Barra de Menu
A barra de menu do VBE funciona como qualquer outra barra de menu
que voc j tenha encontrado. Ela contm comandos que so usados
para realizar tarefas com os diversos componentes no VBE. Voc
descobre ainda que muitos dos comandos de menu tm teclas de
atalho associadas.
D
I
C
A
Figura 3-1:
O VBE
seu amigo
personalizvel.
ExcelVBABokks.indb 38 15/02/2013 13:59:20
39 Captulo 3: Trabalhando no Visual Basic Editor
O VBE tambm tem menus de atalho. Voc pode clicar com o boto
direito em praticamente qualquer coisa no VBE e obter um menu de
atalho de comandos comuns.
Barra de Ferramentas
A barra de ferramentas Padro, que est abaixo da barra de menu (veja
a Figura 3-1), uma das quatro barras de ferramentas de VBE disponvel. Voc pode personalizar as barras de ferramentas, mov-las, mostrar outras barras de ferramentas e assim por diante. Se voc quiser,
Barras de Ferramentas para trabalhar com as
use o comando Exibir
barras de ferramentas de VBE. A maioria das pessoas (inclusive eu)
apenas as deixa como so.
Janela Projeto

A janela Projeto exibe um diagrama em rvore que apresenta toda a


planilha aberta em Excel no momento (inclusive add-ins e planilhas
ocultas). Clique duas vezes nos itens para expandi-los ou recolh-los.
Eu forneo mais detalhes sobre essa janela na prxima seo Como
trabalhar com a Janela Projeto.
Se a janela Projeto no estiver visvel, pressione Ctrl+R ou use o comando Exibir Project Explorer. Para ocultar a janela Projeto, clique com
boto Fechar em sua barra de ttulo. Ou clique com o boto direito em
qualquer lugar na janela Projeto e selecione Ocultar a partir do menu
de atalho.
Janela de Cdigo
Uma janela de Cdigo contm o cdigo VBA. Cada objeto em um projeto
tem uma janela de Cdigo associada. Para ver a janela de Cdigo de um
objeto, clique duas vezes no objeto na janela Projeto. Por exemplo, para
ver a janela de Cdigo do objeto Plan1, clique duas vezes Plan1 na janela
Projeto. A menos que voc tenha acrescentado algum cdigo VBA, a
janela de Cdigo estar vazia.
Voc encontrar mais sobre janelas de Cdigo mais adiante neste
captulo, na seo Trabalhando com a janela de Cdigo.
Janela Verificao Imediata
A janela Verificao Imediata pode ou no estar visvel. Se no estiver
visvel, pressione Ctrl+G ou use o comando Exibir Janela Verificao
Imediata. Para fechar a janela Verificao Imediata, clique o boto Fechar
na barra de ttulo (ou clique com o boto direito em qualquer lugar na
janela Verificao Imediata e selecione Ocultar do menu de atalho).
A janela Verificao Imediata mais til para executar diretamente
declaraes VBA e para depurar o seu cdigo. Se voc estiver apenas
comeando em VBA, essa janela no ser to til, portanto, fique
vontade para ocult-la e liberar algum espao na tela para outras coisas.
No Captulo 13, discuto em detalhes a janela Verificao Imediata. Ela
pode se tornar sua boa amiga!
D
I
C
A
ExcelVBABokks.indb 39 15/02/2013 13:59:20
40 Parte II: Como o VBA Trabalha com o Excel
O Excel 2007 apresentou uma nova interface
de usurio. Menus e barras de ferramentas
sumiram e foram substitudas pelas novas
guias. Se voc j usou o Visual Basic Editor
em uma verso anterior do Excel, estar em
territrio familiar. No Office 2007, a Microsoft deixou o VBE essencialmente intacto. E
manteve a tradio no Excel 2010.
A linguagem de programao VBA foi atualizada para acomodar os novos recursos
do Excel, mas o VBE no tem novos recursos e as barras de ferramentas e menus do
estilo antigo funcionam exatamente como
sempre funcionaram. Talvez eles resolvam
atualizar o VBE, mas no estou prendendo
a respirao.
O que h de novo no Visual Basic Editor?
Como Trabalhar com a Janela de Projeto
Quando voc trabalha no VBE, cada pasta de trabalho do Excel e add-in
que est aberta um projeto. possvel pensar em projeto como uma
coleo de objetos dispostos como um esboo. Voc pode expandir um
projeto clicando no sinal de adio (+) esquerda do nome do projeto
na janela Projeto. Contraia um projeto clicando no sinal de subtrao (-)

esquerda do nome do projeto. Ou voc pode dar dois cliques nos


itens para expandir e contra-los.
A Figura 3-2 mostra uma janela Project com trs projetos relacionados:
um add-in chamado pup7.xlam, uma pasta de trabalho chamada
investments.xlsm e a Pasta de Trabalho Pessoal de Macros (que
sempre chamada de PERSONAL.XLSB).
Cada projeto expande para mostrar no mnimo um n chamado
Microsoft Excel Objects. Este n expande para mostrar um item para
cada planilha na pasta de trabalho (cada planilha considerada um
objeto), e outro objeto chamado ThisWorkbook (que representa o
objeto Workbook). Se o projeto tiver quaisquer mdulos VBA, a
listagem de projeto tambm exibe os ns referentes a esses mdulos. E,
Figura 3-2:
Esta janela
do Projeto
relaciona
trs projetos.
Um deles
expandido
para exibir
seus objetos.
ExcelVBABokks.indb 40 15/02/2013 13:59:20
41 Captulo 3: Trabalhando no Visual Basic Editor
como pode ser visto na Parte IV, um projeto tambm pode conter um
n chamado Forms (formulrios), o qual contm objetos UserForm
(que mantm caixas de dilogo personalizadas).
O conceito de objetos pode estar um pouco vago para voc. Entretanto,
garanto que as coisas ficaro mais claras nos captulos seguintes. No se
preocupe muito se no entender o que est acontecendo neste ponto.
Adicionando um novo mdulo VBA
Siga esses passos para adicionar um novo mdulo VBA ao projeto:
1. Selecione o nome do projeto na janela de Projeto
2. Escolha Inserir Mdulo
Ou
1. Clique com o boto direito no nome do projeto
2. Escolha Inserir Mdulo do menu de atalho
Quando voc grava uma macro, automaticamente o Excel insere um mdulo VBA para conter o cdigo gravado. Qual pasta de trabalho contm
o mdulo da macro gravada depende de onde voc decide armazenar a
macro gravada, pouco antes de comear a gravar.
Removendo um mdulo VBA
Precisa remover um mdulo VBA de um projeto?
1. Selecione o nome do mdulo na janela Projeto
2. Escolha Arquivo Remover xxx, onde xxx o nome do mdulo
Ou
1. Clique com o boto direito no nome do mdulo
2. Escolha Remover xxx do menu de atalho
O Excel, sempre tentando evitar que voc faa alguma coisa da
qual se arrepender, perguntar se voc quer exportar o cdigo
do mdulo antes de apag-lo. Quase sempre, no (se quer exportar o mdulo, veja a prxima seo).
D
I
C
A
ExcelVBABokks.indb 41 15/02/2013 13:59:20
42 Parte II: Como o VBA Trabalha com o Excel
Voc pode remover mdulos VBA, mas no tem jeito de remover os outros
mdulos de cdigo aqueles para os objetos Sheet ou ThisWorkbook.
Exportando e importando objetos

Todo objeto em um projeto VBA pode ser salvo em um arquivo separado. Salvar um objeto individual de um projeto conhecido como
exportao. lgico que voc tambm pode importar objetos para um
projeto. Exportar e importar objetos pode ser til se quiser usar um
objeto em especial (tal como um mdulo VBA ou um UserForm) em um
projeto diferente.
Siga os seguintes passos para exportar um objeto:
1. Selecione um objeto na janela Projeto
2. Escolha Arquivo Exportar Arquivo ou pressione Ctrl+E
Voc obtm uma caixa de dilogo que pede um nome de arquivo.
Observe que o objeto permanece no projeto; apenas uma cpia
dele exportada.
Importar um arquivo para um projeto assim:
1. Selecione o nome do projeto na janela Projeto.
2. Escolha Arquivo Importar Arquivo ou pressione Ctrl+M.
Voc obtm uma caixa de dilogo que pede um arquivo. Localize o arquivo e clique em Abrir. Voc s deve importar um
arquivo se o arquivo foi exportado usando o comando Arquivo
Exportar de Cdigo.
Trabalhando com a Janela de Cdigo
Enquanto voc se transforma num especialista em VBA, passa muito
tempo trabalhando nas janelas Cdigo. As macros que voc grava esto
armazenados em um mdulo e voc pode digitar o cdigo VBA diretamente em um mdulo VBA.
Minimizando e maximizando janelas
Se voc tem vrios projetos abertos, o VBE deve ter muitas janelas de
cdigo abertas em determinada ocasio. A Figura 3-3 mostra um
exemplo do que eu quis dizer.
L
E
M
B
R
E
-SE
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 42 15/02/2013 13:59:20
43 Captulo 3: Trabalhando no Visual Basic Editor
As janelas de cdigo so muito parecidas com as janelas da pasta de
trabalho no Excel. Voc pode minimiz-las, maximiz-las, ocult-las,
reajust-las e assim por diante. A maioria das pessoas acha muito mais
fcil maximizar a janela de cdigo na qual esto trabalhando. Fazer isto
permite ver mais cdigo e impede que voc se distraia.
Para maximizar uma janela de cdigo, clique no boto Maximizar na sua
barra de ttulo (perto do X). Ou apenas clique duas vezes a sua barra de
ttulo para maximiz-la. Para recuperar uma janela de cdigo ao seu
tamanho original, clique no boto Restaurar. Quando uma janela maximizada, a sua barra de ttulo no visvel, portanto, voc encontrar o boto
Restaurar abaixo da barra de ttulo de VBE.
s vezes, voc pode querer ter duas ou mais janelas de cdigo visveis.
Por exemplo, voc quer comparar o cdigo de dois mdulos ou copiar
o cdigo de um mdulo para outro. possvel organizar as janelas
manualmente, usar os comandos Janela Lado a lado Horizontal ou
Janela Lado a lado Vertical para organiz-las automaticamente.

Voc pode alternar rapidamente para trs e para frente entre as janelas
de cdigo, pressionando Ctrl+Tab. Se repetir essa combinao de
teclas, manter um ciclo por todas as janelas de cdigo abertas.
Pressionar Ctrl+Shift+Tab permite voltar na ordem inversa.
Figura 3-3:
A janela
de Cdigo
sobrecarregada
no
bonita.
ExcelVBABokks.indb 43 15/02/2013 13:59:20
44 Parte II: Como o VBA Trabalha com o Excel
Minimizar uma janela de Cdigo fica fora de mo. Voc tambm pode
clicar o boto Fechar da janela (que exibe X) em uma barra de ttulo da
janela de Cdigo, para fech-la completamente (fechar a janela apenas a
oculta; voc no perde nada). Para abri-la de novo, apenas d dois cliques
no objeto apropriado na janela Projeto. Trabalhar com essas janelas de
cdigo parece mais difcil do que realmente.
Criando um mdulo
Em geral, um mdulo pode manter trs tipos de cdigo:
5 Declaraes: Uma ou mais declaraes de informao que voc
fornece para o VBA. Por exemplo, possvel declarar o tipo de
dados para variveis que voc pretende usar ou configurar
outras opes relacionadas ao mdulo.
5 Procedimentos Sub: Um conjunto de instrues de
programao que executa alguma ao.
5 Procedimento Function: Um conjunto de instrues de
programao que retorna um valor nico (similar ao conceito
de uma funo de planilha, como SOMA.
Um nico mdulo VBA pode armazenar qualquer quantidade de
procedimentos Sub, procedimentos Function e declaraes. Bem, h
um limite cerca de 64.000 caracteres por mdulo. Como forma de
comparao, este captulo em especial tem aproximadamente a metade
de tal quantidade de caracteres. Depois de mais de 15 anos de programao VBA, eu nem ao menos cheguei perto de atingir aquele limite. E
se eu o fiz, a soluo simples: apenas insira um novo mdulo.
A organizao de um mdulo VBA s depende de voc. Algumas
pessoas preferem manter todo o cdigo VBA para um aplicativo em um
nico mdulo VBA, outras gostam de separar o cdigo em vrios
mdulos diferentes. uma escolha pessoal, como arrumar os mveis.
Como inserir cdigo VBA em um mdulo
Um mdulo VBA vazio como a comida falsa que voc v nas janelas
de alguns restaurantes chineses; parece boa, mas na verdade no faz
muito por voc. Antes de poder fazer algo significativo, voc deve ter
algum cdigo VBA no mdulo. possvel inserir o cdigo VBA em um
mdulo de trs formas:
5 Inserir o cdigo diretamente.
5 Usar o gravador de macro do Excel para gravar suas aes e
convert-las em cdigo VBA (veja o Captulo 6).
5 Copiar o cdigo de um mdulo e colar em outro.
D
I
C
A
ExcelVBABokks.indb 44 15/02/2013 13:59:20
45 Captulo 3: Trabalhando no Visual Basic Editor
Preciso desviar o assunto por um momento
para discutir terminologia. Neste livro, uso
os termos procedimentos Sub, rotina, pro-

cedimento e macro. Esses termos so um


pouco confusos. Colegas de programao
geralmente usam a palavra procedimento
para descrever uma tarefa automatizada.
Tecnicamente, um procedimento pode se
referir a um Sub ou a um procedimento
Function sendo que, s vezes, ambos so
chamados de rotinas. Uso todos esses termos de modo permutvel. No entanto, como
ser detalhado nos captulos seguintes, h
uma diferena importante entre os procedimentos Sub e Function. Por ora, no se preocupe com a terminologia. Apenas tente entender os conceitos.
Pausa para um intervalo de terminologia
Inserindo o cdigo diretamente
s vezes, o melhor caminho o mais direto. Inserir o cdigo diretamente implica em bem, inserir o cdigo diretamente. Em outras palavras,
voc digita o cdigo pelo seu teclado. Insere e edita o texto em um
mdulo VBA que funciona como deveria. Voc pode selecionar, copiar,
cortar, colar e fazer outras coisas com o texto.
Use a tecla Tab para alinhar algumas das linhas para tornar seu cdigo
mais fcil de ler. Isto no necessrio, mas um bom hbito. Conforme
estuda o cdigo que apresento neste livro, voc entender porque til
alinhar linhas de cdigo do pargrafo.
Uma nica linha do cdigo de VBA pode ser do tamanho que voc
quiser. Entretanto, voc pode querer usar o caractere de continuao
de linha para fragmentar linhas longas de cdigo. Para continuar uma
nica linha de cdigo (tambm conhecida como uma declarao) de
uma linha para a prxima, termine a primeira linha com um espao
seguido de um underline (_). Ento, continue a declarao na prxima
linha. Eis um exemplo de sentena nica, separada em trs linhas:
Selection.Sort Key1:=Range(A1), _
Order1:=xlAscending, Header:=xlGuess, _
Orientation:=xlTopToBottom
Esta declarao executaria da mesma maneira, como se voc tivesse
inserido em uma nica linha (sem caracteres de continuao da linha).
Veja que eu alinhei a segunda e a terceira linhas dessa declarao. O
alinhamento opcional, mas deixa claro que essas linhas no so
declaraes separadas.
Os engenheiros de colarinho branco que projetaram o VBE perceberam
que pessoas como ns cometeriam erros. Portanto, o VBE tem mltiplos nveis de desfazer e refazer. Se voc apagou uma declarao que
no deveria, use o boto Desfazer da barra de ferramentas (ou pressione Ctrl+Z) at que a declarao reaparea. Depois de desfazer, voc
P
A
P
O
D
E
E
S
P
E
C
IALIS
T

A
L
E
M
B
R
E
-SE
D
I
C
A
ExcelVBABokks.indb 45 15/02/2013 13:59:20
46 Parte II: Como o VBA Trabalha com o Excel
pode usar o boto Refazer para retomar as mudanas que tinha desfeito. Esse negcio de desfazer/refazer mais complicado para descrever
do que para usar. Recomendo brincar um pouco com esse recurso at
entender como ele funciona.
Pronto para inserir algum cdigo de verdade? Tente os seguintes passos:
1. Crie uma nova pasta de trabalho no Excel
2. Pressione Alt+F11 para ativar o VBE
3. Clique o nome da pasta de trabalho na janela Projeto
4. Escolha Inserir Mdulo para inserir um mdulo VBA no projeto
5. Digite o seguinte cdigo no mdulo:
Sub GuessName()
Msg = Seu nome John Walkenbach? & Application.UserName & ?
Ans = MsgBox(Msg, vbYesNo)
If Ans = vbNo Then MsgBox Nao se preocupe.
If Ans = vbYes Then MsgBox Eu devo ser
adivinho!
End Sub
6. Verifique se o cursor est em qualquer lugar no texto que voc
digitou e pressione F5 para executar o procedimento.
F5 um atalho para o comando Executar Executar Sub/
UserForm. Se voc inseriu o cdigo corretamente, o Excel executa
o procedimento e voc pode responder a caixa de dilogo
mostrada na Figura 3-4. A menos que o seu nome seja igual ao
meu, a caixa de dilogo ser diferente daquela que aparece na
figura.
Quando voc entra com o cdigo listado no Passo 5, deve perceber que
o VBE faz alguns ajustes no texto que foi inserido. Por exemplo, depois
de voc digitar a declarao Sub, automaticamente o VBE insere a
declarao End Sub. E se voc omitir o espao antes ou depois um sinal
de igual, o VBE insere o espao para voc. Alm disso, ele altera a cor e
as letras maisculas de algum texto. Isto tudo perfeitamente normal.
apenas a maneira pela qual o VBE mantm as coisas claras e legveis.
Se voc acompanhou os passos anteriores, j escreveu um procedimento Sub do VBA, tambm conhecido como macro. Quando voc pressiona F5, o Excel executa o cdigo e segue as instrues. Em outras
palavras, o Excel avalia cada sentena e faz o que foi pedido para fazer
(no deixe que este poder recm descoberto suba sua cabea).Voc
Figura 3-4: O
procedimento
GuessName
aparece
nessa caixa
de dilogo.
ExcelVBABokks.indb 46 15/02/2013 13:59:20
47 Captulo 3: Trabalhando no Visual Basic Editor
pode executar essa macro quantas vezes quiser, embora ela tenda a

perder o seu encanto depois de usada algumas dezenas de vezes.


S para ficar registrado, essa simples macro usa os seguintes conceitos,
sendo todos eles abordados neste livro:
5 Definir um procedimento Sub (a primeira linha)
5 Designar valores para variveis (Msg e Ans)
5 Concatenar (juntar) uma string (usando o operador &)
5 Usar uma funo VBA integrada (MsgBox)
5 Usar constantes VBA integradas (vbYesNo, vbNo e vbYes)
5 Usar uma construo If-Then (duas vezes)
5 Finalizar um procedimento Sub (a ltima linha)
Nada mal para um iniciante, no ?
Usando o gravador de macro
Outra maneira de voc colocar o cdigo em um mdulo VBA gravar
suas aes, usando o gravador de macro do Excel. Se voc trabalhou
com todo o exerccio prtico do Captulo 2, j deve ter alguma experincia com essa tcnica.
A propsito, no h como poder gravar o procedimento GuessName
mostrado na seo anterior. S possvel gravar o que pode ser feito
diretamente no Excel. Exibir a caixa de mensagem no um repertrio
normal do Excel (isso uma coisa VBA). O gravador de macro til,
mas, em muitos casos, provavelmente voc precisar inserir manualmente no mnimo algum cdigo.
Eis um exemplo, passo a passo, que mostra como gravar uma macro que
desativa as grades de linha da clula em uma planilha. Se quiser tentar
este exemplo, abra uma nova pasta de trabalho, e siga estes passos:
1. Ative uma planilha na pasta de trabalho
Qualquer planilha servir. Se a planilha no est mostrando as
linhas de grades, adicione uma nova planilha que o faa. Voc
precisa comear com uma planilha que tenha linhas de grades.
2. Selecione Desenvolvedor Cdigo Gravar Macro. Ou voc pode
clicar no cone com um pequeno ponto vermelho no lado
esquerdo da barra de status.
O Excel exibe sua caixa de dilogo Gravar Macro.
3. Na caixa de dilogo Gravar Macro, nomeie a macro como
Gridlines e use Ctrl+Shift+F como a tecla de atalho.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 47 15/02/2013 13:59:20
48 Parte II: Como o VBA Trabalha com o Excel
4. Clique em OK para comear a gravar.
O Excel insere automaticamente um novo mdulo VBA no projeto
que corresponde pasta de trabalho ativa. A partir deste ponto, o
Excel converte suas aes em cdigo VBA. Enquanto grava, o
cone na barra de status se transforma em um pequeno quadrado
azul. Isto um lembrete de que o gravador de macro est rodando. Voc tambm pode clicar naquele quadrado azul para parar a
gravao da macro.
5. Selecione Exibio Mostrar Linhas de Grade.
As linhas de grades na planilha desaparecem.
6. Selecione Desenvolvedor Cdigo Parar Gravao. Ou clique
no boto Parar Gravao na barra de status (o quadrado azul).
O Excel interrompe a gravao de suas aes.
Para visualizar esta macro, gravada recentemente, pressione Alt+F11
para ativar o editor VB. Localize o nome da pasta de trabalho na janela
do Project Explorer. Veja que o projeto tem um novo mdulo listado. O

nome do mdulo depende se voc tinha outros mdulos na pasta de


trabalho quando iniciou a gravao do macro. Se no, o mdulo ser
nomeado como Mdulo1. Voc pode dar dois cliques no mdulo para
visualizar a sua janela de cdigo.
Aqui est o cdigo gerado pelas suas aes:
Sub Gridlines()

Gridlines Macro

Keyboard Shortcut: Ctrl+Shift+G

ActiveWindow.DisplayGridlines = False
End Sub
Para testar essa macro, ative uma planilha que exiba linhas de grades e
depois pressione a tecla de atalho que voc designou no Passo 3:
Ctrl+Shift+F.
Se no designou uma tecla de atalho para a macro, no se preocupe. Aqui
est como mostrar uma lista de todas as macros e rodar aquela que quiser.
1. Selecione Desenvolvedor Cdigo Macros.
Os fs do teclado podem pressionar Alt+F8. Qualquer desses
mtodos exibe uma caixa de dilogo que relaciona todas as
macros disponveis.
2. Selecione a macro na lista (neste caso, Gridlines).
3. Clique no boto Executar.
O Excel executa a macro e, magicamente, as linhas de grade
desaparecem.
ExcelVBABokks.indb 48 15/02/2013 13:59:20
49 Captulo 3: Trabalhando no Visual Basic Editor
Lgico que voc pode executar qualquer quantidade de comandos e
aes enquanto o gravador de macro estiver rodando. O Excel traduz
fielmente as suas aes do mouse e toques de teclado para o cdigo
VBA. Isso funciona como um gravador de fita, exceto pelo Excel nunca
ficar sem fita.
Na verdade, essa macro no to til. Afinal, bem fcil desabilitar as
linhas de grade sem uma macro. Seria mais til se ela pudesse alternar,
ativando e desativando, as linhas de grades. Para mudar isso, ative o
mdulo e troque a declarao para:
ActiveWindow.DisplayGridlines = _
Not ActiveWindow.DisplayGridlines
Essa modificao faz com que a macro funcione como um alternador. Se
as linhas de grades so exibidas, a macro as desativa. Ops, estou
exagerando desculpe, mas no pude impedir esse exagero. A propsito, esse outro exemplo de macro que no pode ser gravado. Voc
pode gravar uma que ative ou desative as linhas de grade, mas no
pode gravar uma que ir alter-las.
Copiando o cdigo VBA
O mtodo final para obter o cdigo no mdulo VBA copi-lo de outro
mdulo. Ou de algum outro lugar (tal como um site). Por exemplo, um
procedimento Sub ou funo que voc escreve para um projeto tambm
pode ser til em outro projeto. Ao invs de perder tempo inserindo de
novo o cdigo, pode-se ativar o mdulo e usar os procedimentos de
copiar e colar da rea de Transferncia (eu prefiro mais os atalhos de
teclado, Ctrl+C para copiar e Ctrl+V para colar). Depois de colar no
mdulo VBA, voc pode modificar o cdigo se necessrio.
Tambm possvel encontrar muitos exemplos de cdigo VBA na Web.
Se voc quiser experiment-los, selecione o cdigo em seu browser e
pressione Ctrl+C para copi-lo. Depois, ative um mdulo e pressione
Ctrl+V para col-lo.
Personalizando o Ambiente VBA
Se est pensando em ser um programador de Excel, gastar muito tem-

po com os mdulos VBA na sua tela. Para ajudar a tornar as coisas to


confortveis quanto possvel (no, por favor, coloque seus ps no
cho), o editor VB fornece algumas poucas opes de personalizao.
Quando o editor VBE estiver ativado, selecione Ferramentas
Opes.
Voc ver uma caixa de dilogo com quatro tabulaes: Editor, Formato
do Editor, Geral e Encaixe. Discuto algumas das opes mais teis, nas
sees que seguem.
ExcelVBABokks.indb 49 15/02/2013 13:59:21
50 Parte II: Como o VBA Trabalha com o Excel
Usando a guia Editor
A Figura 3-5 mostra as opes disponveis na guia Editor da caixa de
dilogo Opes. Use as opes dessa guia para controlar como certas
coisas funcionam no VBE.
Opo de Autoverificar sintaxe
A opo Autoverificar Sintaxe determina se o VBE exibe uma caixa de
dilogo ou se ele encontra um erro de sintaxe enquanto voc est
inserindo o seu cdigo VBA. A caixa de dilogo informa mais ou menos
qual o problema. Se voc no escolher essa opo, o VBE assinala os
erros de sintaxe exibindo-os com uma cor diferente em relao ao resto
do cdigo, e voc no precisa lidar com quaisquer caixas de dilogo
aparecendo em sua tela.
Geralmente, mantenho essa configurao desativada porque acho as
caixas de dilogo irritantes e geralmente posso descobrir o que est
errado com a declarao. Antes de ser um veterano de VBA, achei esse
auxlio muito til.
Opo Requerer declarao de varivel
Se a opo Requerer declarao de varivel estiver configurada, o VBE
insere a seguinte sentena no incio de cada novo mdulo VBA que
voc insere:
Option Explicit
Mudar essa configurao afeta apenas novos mdulos, mdulos no
existentes. Se essa sentena aparece no seu mdulo, voc deve definir
explicitamente cada varivel que usa. No Captulo 7, explico porque
voc deve desenvolver esse hbito.
Figura 3-5:
Esta a
guia Editor
na caixa
de dilogo
Opes.
ExcelVBABokks.indb 50 15/02/2013 13:59:21
51 Captulo 3: Trabalhando no Visual Basic Editor
Opo Autolistar membros
Se a opo Autolistar membros estiver configurada, o VBE fornece
algum auxlio quando estiver inserindo o seu cdigo VBA. Ela exibe uma
lista que completaria logicamente a sentena que voc est digitando.
Esse pedao de mgica algo chamado de IntelliSense (sentido de
inteligncia).
Esse o melhor dos recursos do VBE e eu o deixo sempre ativado. A
Figura 3-6 mostra um exemplo (que far muito mais sentido quando
voc comear a escrever o cdigo VBA).
Opo Informaes rpidas automticas
Se a opo Informaes Rpidas Automticas estiver configurada, o VBE
exibe informaes sobre funes e seus argumentos quando voc
digitar. Isso pode ser muito til. A Figura 3-7 mostra esse recurso em
ao, informando sobre os argumentos para a funo MsgBox.
Opo Dicas automticas de dados
Se a opo Dicas Automticas de Dados estiver configurada, o VBE exibe
o valor da varivel sobre a qual o seu cursor est colocado quando voc
estiver depurando o cdigo. Ao entrar no maravilhoso mundo da depura-

o, conforme descrevo no Captulo 13, voc gostar dessa opo.


Figura 3-7:
A opo
Informaes
rpidas
automticas
oferece
ajuda sobre
a funo
MsgBox.
Figura 3-6:
Um exemplo
de listagem
automtica
de membros
ExcelVBABokks.indb 51 15/02/2013 13:59:21
52 Parte II: Como o VBA Trabalha com o Excel
Configurao Auto-recuar
A configurao de Auto-recuar determina se o VBE faz automaticamente
um recuo em cada linha nova do cdigo como na linha anterior. Eu sou
timo usando recuos em meu cdigo, ento mantenho essa opo
ativada.
Use a tecla Tab para recuar seu cdigo, no a barra de espao. Alm
disso, voc pode usar Shift+Tab para desfazer o recuo de uma linha
de cdigo. Se quiser fazer recuo em mais de uma linha, selecione todas
as linhas que voc deseja recuar. Depois, pressione a tecla Tab.
A barra de ferramentas Editar do VBE (que por padro est oculta)
contm dois botes teis: Recuo e Recuo deslocado. Esses botes
possibilitam fazer ou desfazer, rapidamente, recuos de um bloco de
cdigo. Selecione o cdigo e clique em um desses botes para mudar o
recuo do bloco.
Opo Recurso de edio arrastar e soltar
A opo Recurso de Edio arrastar e soltar, quando habilitada, permite
que voc copie e mova o texto arrastando e soltando com o seu mouse.
Mantenho esta opo ativada, mas nunca uso. Prefiro copiar e mover
usando o teclado.
Opo Padro para modo de exibio de mdulo completo
A opo Padro para modo de exibio de mdulo completo configura
a posio padro para novos mdulos (isso no afeta os mdulos
existentes). Quando habilitada, os procedimentos na janela de cdigo
aparecem como uma nica lista rolvel. Se desabilitada, voc pode ver
apenas um procedimento por vez. Mantenho essa opo habilitada.
Opo separador de procedimento
Quando a opo Separador de Procedimento est ativada, a barra de
separao aparece no final de cada procedimento em uma janela de
cdigo. Gosto da ideia de barras de separao, ento mantenho essa
opo ativada.
Usando a guia Formato do editor
A Figura 3-8 mostra a guia de Formato do Editor da caixa de dilogo
Opes. Com essa guia, voc pode personalizar a aparncia do VBE.
Opo Cores de cdigo
A opo Cores de Cdigo permite que voc configure a cor de texto e a
cor de fundo exibida em vrios elementos do cdigo VBA. Isso
grandemente uma questo de preferncia pessoal. Eu, particularmente,
acho o padro de cores bom. Mas, para uma mudana de cenrio,
ocasionalmente brinco com essas configuraes.
D
I
C

A
D
I
C
A
ExcelVBABokks.indb 52 15/02/2013 13:59:21
53 Captulo 3: Trabalhando no Visual Basic Editor
Opo Fonte
A opo Fonte permite que voc selecione a fonte que usada nos seus
mdulos VBA. Para melhores resultados, mantenha uma fonte de
largura fixa, como Courier New. Em uma fonte de largura fixa, todos os
caracteres tm exatamente a mesma largura. Isso torna seu cdigo mais
legvel porque os caracteres esto verticalmente alinhados e voc pode
distinguir facilmente espaos mltiplos (o que, s vezes, til).
Configurao de tamanho
A configurao de tamanho especifica a medida do tamanho da fonte
nos mdulos do VBA. Essa configurao uma questo de preferncia
pessoal determinada pela resoluo de exibio e de quantas cenouras
voc tem comido.
Opo de Barra Indicadora de margem
Esta opo controla a exibio da Barra indicadora de margem vertical
de seus mdulos. Voc deve mant-la ativada; caso contrrio, no ser
capaz de ver os indicadores teis quando estiver depurando o seu
cdigo.
Usando a guia Geral
A Figura 3-9 mostra as opes disponveis na guia Geral, na caixa de
dilogo Opes. Na maioria dos casos, as configuraes padro so boas.
A configurao mais importante Interceptao de erros. Sugiro com
veemncia que voc habilite a opo Interromper em erros no tratados, que o padro. Se usar uma configurao diferente, o tratamento
contra erro no cdigo no funciona. Voc pode ler mais sobre isso no
Captulo 12.
Figura 3-8:
Mude a
aparncia
do VBE
com a guia
do editor
Formato.
ExcelVBABokks.indb 53 15/02/2013 13:59:21
54 Parte II: Como o VBA Trabalha com o Excel
Se estiver de fato interessado nestas opes, para detalhes, clique o
boto Ajuda.
Usando a guia Encaixe
A Figura 3-10 mostra a guia Encaixe. Essas opes determinam como
as diversas janelas no VBE atuam. Quando a janela est encaixada,
ela fixada em um lugar prximo a uma das margens da janela de
programa do VBE. Isso facilita identificar e localizar uma janela em
especial. Se desativar todos os encaixes, voc vai gerar uma grande
e confusa baguna de janelas. Geralmente, as configuraes padro
funcionam bem.
Figura 3-10:
A guia
Encaixe da
caixa de
dilogo
Opes.
Figura 3-9:
A guia Geral
da caixa de

dilogo
Opes.
ExcelVBABokks.indb 54 15/02/2013 13:59:21

Neste Captulo
Introduo ao conceito de objetos
Descobrindo sobre a hierarquia do objeto Excel
Entenda as colees de objeto
Como fazer referncia a objetos espec cos no seu cdigo VBA
Como acessar ou mudar as propriedades de um objeto
Desempenhando aes com mtodos de um objeto

Introduo ao Modelo de
Objeto do Excel
Captulo 4
T
odos j esto familiarizados com a palavra objeto. Bem, pessoal,
esquea a de nio que acha que sabe. No mundo da programao, objeto tem um signi cado diferente. Geralmente, voc a v sendo
usada como parte da expresso programao orientada a objeto, ou
resumida como POO. A POO baseia-se na ideia de que software consiste
de objetos distintos que tm atributos (ou propriedades) e podem ser
manipulados. Esses objetos no so coisas materiais. Ao contrrio, eles
existem em forma de bits e bytes.
Neste captulo, eu o apresento ao modelo de objeto do Excel, que uma
hierarquia de objetos contidos no Excel. Quando terminar este captulo,
ter um entendimento bem razovel do que POO e porque precisa
entender esse conceito para se tornar um programador VBA. Afinal, a
programao do Excel, na verdade, se resume em manipular objetos do
Excel. simples assim.
O material deste captulo pode ser um pouco esmagador. Mas, por
favor, acate o meu conselho, mesmo se no compreender plenamente
na primeira vez. Os conceitos importantes apresentados aqui faro
mais sentido medida que voc avanar no livro.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 55 15/02/2013 13:59:21
56 Parte II: Como o VBA Trabalha com o Excel
Excel um Objeto?
Voc j usou um pouco o Excel, mas provavelmente nunca pensou nele
como um objeto. Quanto mais voc trabalha com VBA, mais v o Excel
nesses termos. Voc entender que o Excel um objeto e que ele
contm outros objetos. Esses objetos, por sua vez, contm ainda mais
objetos. Em outras palavras, a programao VBA envolve trabalhar com
uma hierarquia de objetos.
No alto desta hierarquia est o objeto Application (Aplicativo) neste
caso, o prprio Excel (a me de todos os objetos).
Escalando a Hierarquia de Objetos
O objeto Application contm outros objetos. A seguir, apresentada
uma lista de alguns dos objetos mais teis contidos no Aplicativo Excel:
5 Add-in (suplementos)
5 Window (janela)
5 Workbook (pasta de trabalho)
5 WorksheetFunction (Funes das planilhas)
Cada objeto inserido no objeto Application pode conter outros objetos.

Por exemplo, a seguir est uma lista de objetos que pode estar contida
em um objeto Workbook (pasta de trabalho):
5 Chart (Tabela)
5 Name (Nome)
5 VBProject
5 Window (Janela)
5 Worksheet (Planilha)
Por sua vez, cada um desses objetos ainda pode conter mais objetos.
Considere um objeto Worksheet, que est inserido no objeto Workbook,
que est inserido no objeto Application. Alguns objetos que podem
estar contidos em um objeto Worksheet so:
5 Comment (Comentrio)
5 Hiperlink
5 Name (Nome)
5 PageSetup (configurao de pgina)
ExcelVBABokks.indb 56 15/02/2013 13:59:21
57 Captulo 4: Introduo ao Modelo de Objeto Excel
5 PivotTable (Tabela Principal)
5 Range (Intervalo de Clulas)
Falando de outra forma, se voc quiser fazer algo com um intervalo de
clulas em uma determinada planilha, pode visualizar aquele intervalo
da seguinte maneira:
Range contida em Worksheet contida em Workbook contida
no Excel
Est comeando a fazer sentido?
A Figura 4-1 mostra parte do Mapa de modelo de objeto do Excel. Se
voc deseja realmente ficar admirado, exiba o sistema de Ajuda VBA e
busque pelo mapa de modelo de objeto. Trata-se de um enorme
diagrama que relaciona todos os objetos, e cada um clicvel, portanto, voc pode ler tudo sobre ele.
isso, companheiros, o Excel tem mais objetos do que voc pode
supor e, mesmo sujeitos antigos como eu podem ficar admirados. A
boa notcia que voc nunca ter que lidar, de fato, com a maioria
desses objetos. Quando estiver trabalhando em um problema, basta
focalizar alguns objetos relevantes os quais voc geralmente pode
descobrir gravando uma macro.
Figura 4-1:
Visualizando uma
parte do
modelo
objeto
Excel.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 57 15/02/2013 13:59:22
58 Parte II: Como o VBA Trabalha com o Excel
Enchendo Sua Cabea com Colees
As colees so um outro tipo de conceito-chave em programao VBA.
Uma coleo um grupo de objetos do mesmo tipo. E, para aumentar a
confuso, uma coleo , ela prpria, um objeto.
Aqui esto alguns exemplos das colees comumente usadas:
5 Pastas de Trabalho: Uma coleo de todos os objetos
Workbook abertos no momento.
5 Planilhas: Uma coleo de todos os objetos de Planilha em um

objeto Workbook em especial.


5 Grficos: Uma coleo de todos os objetos Chart (grficos)
contidos em um objeto Workbook em especial.
5 Planilhas: Uma coleo de todas as planilhas (independente do
seu tipo) contidas em um objeto Workbook em especial.
Voc deve perceber que aqueles nomes de coleo esto todos no
plural, o que faz sentido (pelo menos eu espero).
Para que servem as colees? voc deve estar se perguntando. Bem,
elas so muito teis, por exemplo, quando voc deseja fazer algo no
apenas com uma planilha, mas com vrias. Como voc ver, o seu
cdigo VBA pode fazer loop atravs de todos os membros de uma
coleo, e fazer alguma coisa em cada um deles.
Como Fazer Referncia aos Objetos
Apresentei as informaes nas sees anteriores para prepar-lo para o
prximo conceito: fazer referncia aos objetos no seu cdigo VBA. Fazer
referncia a um objeto importante porque voc deve identificar o objeto
com o qual quer trabalhar. Afinal, o VBA no pode ler sua mente ainda.
Eu creio que o objeto de leitura de mente ser introduzido no Excel 2013.
Voc pode trabalhar com uma coleo inteira de objetos de uma s vez.
No entanto, com mais frequncia, preciso trabalhar com um objeto
especfico em uma coleo (como uma planilha em especial em uma
pasta de trabalho). Para fazer referncia a um nico objeto de uma
coleo, voc coloca o nome do objeto ou o nmero do ndice entre
parnteses depois do nome da coleo, assim:
Worksheets(Plan1)
Note que o nome da planilha est entre aspas. Se omitir as aspas, o
Excel no conseguir identificar o objeto (o Excel pensar que um
nome de varivel).
Se a Plan1 a primeira (ou a nica) planilha na coleo, voc tambm
pode usar a seguinte referncia:
ExcelVBABokks.indb 58 15/02/2013 13:59:22
59 Captulo 4: Introduo ao Modelo de Objeto Excel
Worksheets(1)
Neste caso, o nmero no est entre aspas. Qual a questo? Se voc
faz referncia a um objeto usando seu nome, use as aspas. Se referenciar um objeto usando seu nmero de ndice, use um nmero inteiro
sem aspas.
Outra coleo, chamada Sheets (Planilhas), contm todas as planilhas
(planilhas e grficos) em uma pasta de trabalho. Se a Plan1 for a
primeira planilha na pasta de trabalho, voc pode referenci-la como
Sheet(1)
Como navegar pela hierarquia
Se voc quer trabalhar com o objeto Application, fcil: comece
digitando Application.
Todos os outros objetos no modelo objeto do Excel esto sob o objeto
Application.Voc obtm esses objetos descendo na hierarquia e
conectando cada objeto sua maneira, com o operador ponto (.). Para
ter o objeto Workbook chamado Pasta1.xlsx.comece com o objeto
Application e navegue para o objeto da coleo Workbooks.
Application.Workbooks(Pasta1.xlsx)
Para navegar alm de uma planilha especfica, adicione um operador
ponto e acesse o objeto da coleo Worksheets.
Application.Workbooks(Pasta1.xlsx).Worksheets(1)
Ainda no suficiente? Se quiser obter o valor da clula A1 na primeira
planilha da pasta de trabalho chamada Pasta1.xlsx, preciso passar
para o nvel do objeto Range.
Application.Workbooks(Book1.xlsx). _
Worksheets(1).Range(A1).Value
Ao fazer referncia a um objeto Range dessa forma, isso chamado de
referncia totalmente qualificada. Voc informou ao Excel exatamente

qual intervalo deseja, em qual planilha e pasta de trabalho, e no


deixou qualquer coisa imaginao. A imaginao boa nas pessoas,
mas no em programas de computador.
A propsito, nomes de pasta de trabalho tambm tm um ponto para
separar o nome de arquivo da extenso (por exemplo, Pasta1.xlsx). Isso
apenas uma coincidncia. O ponto em um nome de arquivo nada tem
a ver com o operador ponto ao qual me referi h alguns pargrafos.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 59 15/02/2013 13:59:22
60 Parte II: Como o VBA Trabalha com o Excel
Simplifcando referncias a objetos
Se voc teve que qualificar toda referncia ao objeto que fez, seu cdigo
deve estar um pouco longo e deve estar mais difcil de ler. Felizmente, o
Excel fornece alguns atalhos que podem melhorar a legibilidade (e poup-lo
de alguma digitao). Para os iniciantes, o objeto Application sempre
hipottico. Existem apenas alguns casos em que faz sentido digit-lo. Omitir
a referncia ao objeto Application encurta o exemplo da seo anterior para:
Workbooks(Pasta1.xlsx).Worksheets(1).Range(A1).Value
Este um bom aperfeioamento. Mas, espere, tem mais. Se voc tiver
certeza de que Pasta1.xlsx a pasta de trabalho ativa, tambm pode
omitir tal referncia. Agora, ficamos com
Worksheets(1).Range(A1).Value
Agora estamos chegando em algum lugar. Voc adivinhou o prximo
atalho? Est certo, se a primeira planilha a planilha ativa atualmente,
ento o Excel aceitar aquela referncia e nos permitir apenas digitar:
Range(A1).Value
Ao contrrio do que muitas pessoas pensam, o Excel no tem um objeto
Cell (clula). Uma clula simplesmente um objeto Range (faixa) que
consiste apenas de um elemento.
Os atalhos descritos aqui so bons, mas tambm podem ser perigosos.
E se voc apenas pensar que o Pasta1.xlsx a pasta de trabalho ativa?
Voc pode obter um erro, ou pior, o valor errado e nem perceber que
est errado. Por essa razo, muitas vezes melhor qualificar totalmente
suas referncias aos objetos.
No Captulo 14, discuto a estrutura With-End With, que ajuda a qualificar totalmente suas referncias, mas tambm ajuda a tornar o cdigo
mais legvel e diminui a digitao. O melhor dos dois mundos!
Mergulhando nas Propriedades e nos
Mtodos do Objeto
Embora saber como referir aos objetos seja importante, voc no pode
fazer nada de til simplesmente referindo a um objeto (como nos
exemplos das sees anteriores). Para realizar algo significativo, voc
deve fazer uma dessas duas coisas:
5 Ler ou modificar as propriedades de um objeto.
5 Especificar um mtodo de ao para ser usado com um objeto.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 60 15/02/2013 13:59:22
61 Captulo 4: Introduo ao Modelo de Objeto Excel

Com milhares de propriedades e mtodos disponveis, literalmente,


possvel ficar confuso com facilidade. Eu tenho trabalhado h anos com
essa coisa e ainda estou confuso. Mas, como eu disse antes e repito: voc
nunca precisar usar a maioria das propriedades e mtodos disponveis.
Eis uma analogia que pode ajud-lo a entender o
relacionamento entre objetos, propriedades e
mtodos em VBA. Nessa analogia, eu comparo
Excel a uma cadeia de lanchonetes.
A unidade bsica de Excel um objeto
Workbook (pasta de trabalho). Em uma cadeia
de lanchonetes, a unidade bsica est em um
restaurante individual. Com o Excel, voc pode
acrescentar uma pasta de trabalho e fech-la,
e todas as pastas de trabalho abertas so
conhecidas como Workbook (uma coleo de
objetos Workbook). Da mesma forma, a
administrao de uma cadeia de lanchonetes
pode acrescentar um restaurante e fechar um
restaurante, e todos os restaurantes da cadeia
podem ser vistos como a coleo Restaurantes
(uma coleo de objetos Restaurante).
Uma pasta de trabalho do Excel um objeto,
mas tambm contm outros objetos, tais como
planilhas, grficos, mdulos VBA e assim por
diante. Alm do mais, cada objeto em uma
pasta de trabalho pode conter seus prprios
objetos. Por exemplo, um objeto Worksheet
(planilha) pode conter objetos Range (faixa),
objetos PivotTable (tabela principal), objetos
Shape e assim por diante.
Continuando com a analogia, uma lanchonete
(como uma pasta de trabalho) contm objetos
tais como a Cozinha, a rea de Refeies e Mesas (uma coleo). Alm disso, a administrao
pode acrescentar ou remover objetos do objeto
Restaurante. Por exemplo, a administrao pode
adicionar mais mesas coleo Mesas. Cada
um desses objetos pode conter outros objetos.
Por exemplo, o objeto Cozinha tem um objeto Fogo, um objeto Ventilador, um objeto Chefe de
cozinha, um objeto Pia) e da por diante.
At agora, tudo bem. Essa analogia parece funcionar. Vejamos se posso lev-la adiante.
Os objetos do Excel tm propriedades. Por
exemplo, um objeto Range tem propriedades
tais como Value (valor) e Name (nome) e um objeto Shape (forma) tem propriedades como Width (largura), Height (altura) e assim por diante.
Sem surpresas, os objetos em uma lanchonete
tambm tm propriedades. O objeto Fogo, por
exemplo, tem propriedades como Temperatura
e Nmeros de Bocas. O Ventilador tem o seu
prprio conjunto de propriedades (Ligado, Rotao Por Minuto etc.).
Alm das propriedades, os objetos do Excel
tambm tm mtodos, os quais executam uma
operao em um objeto. Por exemplo, o mtodo ClearContents (limpar contedo) apaga o
contedo de um objeto Range. Um objeto em
uma lanchonete tambm tem mtodos. pos-

svel prever com facilidade um mtodo Termostato em um objeto Fogo ou um mtodo


Ligar em um objeto Ventilador.
s vezes, em Excel, os mtodos mudam as propriedades de um objeto. O mtodo ClearContents
em uma Range muda a propriedade Valor da
Range. Da mesma forma, o mtodo Termostato
em um objeto Fogo afeta a sua propriedade
Temperatura. Com VBA, voc pode escrever procedimentos para manipular objetos do Excel. Em
uma lanchonete, a administrao pode dar ordens para manipular os objetos nos restaurantes. (Acenda o fogo e acelere o ventilador).
Da prxima vez em que voc visitar a sua lanchonete preferida, diga apenas Eu quero um
objeto Burger com a propriedade Cebola configurada para Falso.
Uma outra perspectiva sobre
McObjects, McProperties e McMethods
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 61 15/02/2013 13:59:22
62 Parte II: Como o VBA Trabalha com o Excel
Propriedades do objeto
Todo objeto tem propriedades. Voc pode pensar em propriedades
como atributos que descrevem o objeto. A propriedade de um objeto
determina sua aparncia, como ele age e at se ele visvel. Usando o
VBA, voc pode fazer duas coisas com as propriedades de um objeto:
5 Examinar a configurao atual de uma propriedade.
5 Mudar a configurao da propriedade.
Por exemplo, um objeto Range de uma nica clula tem uma propriedade
chamada Value. A propriedade Value armazena o valor contido na clula.
Voc pode escrever o cdigo VBA para exibir a propriedade Value, ou
pode escrever o cdigo VBA para configurar um valor especfico
propriedade Value. A macro a seguir usa a funo MsgBox integrada em
VBA para apresentar uma caixa que exibe o valor na clula A1 na Planilha1 da pasta de trabalho ativa. Veja a Figura 4-2.
Sub ShowValue()
Contents = Worksheets(Plan1).Range(A1).Value
MsgBox Contents
End Sub
A propsito, a MsgBox uma funo til. Voc pode us-la para exibir
resultados enquanto o Excel executa o seu cdigo VBA. Direi mais sobre
essas funes no Captulo 15, portanto, tenha pacincia (ou simplesmente pule e leia tudo sobre ela).
O cdigo no exemplo anterior mostra a configurao atual da proprie-

dade Valor de uma clula. E se voc quiser mudar a configurao para


aquela propriedade? A macro seguinte muda o valor exibido na clula
A1 alterando a propriedade Value da clula:
Sub ChangeValue()
Worksheets(Plan1).Range(A1).Value = 94,92
End Sub
Figura 4-2:
Esta caixa de
mensagem
mostra a
propriedade
Value de um
objeto Range.
ExcelVBABokks.indb 62 15/02/2013 13:59:22
63 Captulo 4: Introduo ao Modelo de Objeto Excel
Depois que o Excel executa esse procedimento, a clula A1 na Planilha1
da pasta de trabalho ativa passa a conter o valor de 94,92. Se a pasta de
trabalho ativa no tiver uma planilha nomeada Plan1, ao executar a
macro ser exibida uma mensagem de erro.O VBA apenas segue
instrues e no pode trabalhar com uma planilha que no existe.
Cada objeto tem seu prprio conjunto de propriedades, embora
algumas propriedades sejam comuns a todos os objetos. Por exemplo,
muitos (mas no todos) objetos tm uma propriedade Visible (visvel).
A maioria dos objetos tambm tem uma propriedade Name.
Algumas propriedades de objeto so apenas para leitura, o que significa
que voc pode ver o valor da propriedade, mas no pode mud-lo.
Como mencionei anteriormente neste captulo, uma coleo tambm
um objeto. Isto significa que uma coleo tambm tem propriedades. Por
exemplo, voc pode determinar como vrias pastas de trabalho so
abertas acessando a propriedade Count da coleo Workbooks. O
seguinte procedimento VBA exibe uma caixa de mensagem informando
quantas pastas de trabalho esto abertas:
Sub CountBooks()
MsgBox Workbooks.Count
End Sub
Mtodos de Objeto
Alm das propriedades, os objetos tm mtodos. Um mtodo uma ao
que voc executa com um objeto. Um mtodo pode mudar propriedades
de um objeto ou fazer com que o objeto faa alguma coisa.
Este simples exemplo usa o mtodo ClearContents em um objeto Range
para apagar o contedo da clula A1 na planilha ativa:
Sub ClearRange()
Range(A1).ClearContents
End Sub
Alguns mtodos tomam um ou mais argumentos. Um argumento um
valor que especifica mais a ao a ser executada.Voc coloca os
argumentos para um mtodo depois dele, separado por um espao.
Argumentos mltiplos so separados por vrgula.
O exemplo a seguir ativa Plan1 (na pasta de trabalho ativa) e depois
copia o contedo da clula A1 para a clula B1 usando o mtodo Copiar
do objeto Range. Nesse exemplo, o mtodo Copy tem um argumento, o
intervalo (range) destinado operao de cpia:
Sub CopyOne()
Worksheets(Plan1).Activate
Range(A1).Copy Range(B1)
End Sub
L
E
M
B

R
E
-SE
ExcelVBABokks.indb 63 15/02/2013 13:59:22
64 Parte II: Como o VBA Trabalha com o Excel
Perceba que omiti a referncia planilha quando refiro aos objetos
Range. Eu posso fazer isso com segurana, pois usei uma declarao
para ativar Plan1 (usando o mtodo Activate).
Por uma coleo tambm ser um objeto, as colees tm mtodos. A
seguinte macro usa o mtodo Add para a coleo Workbooks:
Sub AddAWorkbook()
Workbooks.Add
End Sub
Conforme esperado, esta declarao cria uma nova pasta de trabalho.
Em outras palavras, ela acrescenta uma nova pasta de trabalho
coleo Workbooks.
Eventos de objeto
Nesta seo, citei rapidamente em mais de um tpico que voc precisa
saber a respeito de eventos. Objetos respondem a vrios eventos que
ocorrem. Por exemplo, quando voc estiver trabalhando no Excel e
ativar uma pasta de trabalho diferente, acontece um evento Activate.
Voc poderia, por exemplo, designar uma macro VBA para ser executada sempre que houver um evento Activate de um objeto Workbook, em
especial.
O Excel suporta vrios eventos, mas nem todos os objetos podem
responder a todos os eventos. E alguns objetos no respondem a
nenhum evento. Os nicos eventos que voc pode usar so aqueles
disponibilizados pelos programadores da Microsoft Excel. O conceito
de um evento se torna claro no Captulo 11 e tambm na parte IV.
Descobrindo Mais
Pense em si mesmo como um iniciado no maravilhoso mundo de
objetos, propriedades, mtodos e eventos. Voc descobre mais sobre
esses conceitos nos prximos captulos. Se no foi o suficiente, voc
tambm pode se interessar por trs outras excelentes ferramentas:
5 Sistema de ajuda do VBA
5 O navegador do objeto
5 Lista automtica de membros
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 64 15/02/2013 13:59:22
65 Captulo 4: Introduo ao Modelo de Objeto Excel
Usando o sistema de Ajuda de VBA
O sistema de ajuda do VBA descreve cada objeto, propriedade e
mtodo disponvel para voc. Este um excelente recurso para
descobrir mais sobre VBA e mais compreensvel que qualquer livro
no mercado.
Se voc estiver trabalhando em um mdulo VBA e quiser informaes
sobre um objeto, mtodo ou propriedade especial, mova o cursor para
a palavra na qual est interessado e pressione F1. Em alguns segundos,
voc ver o tpico apropriado, completo com referncias cruzadas e
talvez at um ou dois exemplos.
A Figura 4-3 mostra uma tela do sistema de Ajuda online neste caso,
para um objeto Planilha.
5 Clique em Propriedades para obter uma lista completa de
propriedades deste objeto.

5 Clique em Mtodos para obter a listagem dos seus mtodos.


5 Clique em Eventos para obter uma listagem dos eventos aos
quais ele responde.
D
I
C
A
Figura 4-3:
Um exemplo
do sistema
de Ajuda do
VBA.
ExcelVBABokks.indb 65 15/02/2013 13:59:22
66 Parte II: Como o VBA Trabalha com o Excel
Como usar o Pesquisador de Objeto
O VBE possui outra ferramenta, conhecida como Pesquisador de
Objeto. Como o nome sugere, essa ferramenta permite pesquisar os
objetos disponveis. Para acessar o Pesquisador de Objeto, pressione
F2 quando o VBE estiver ativo (ou selecione Exibir Pesquisador de
objeto). Voc ver uma janela como a mostrada na Figura 4-4.
A lista drop-down no alto da janela apresenta uma relao de todas as
bibliotecas de objeto disponveis no momento. A Figura 4-4 mostra a
opo Todas as Bibliotecas. Se voc quiser navegar pelos objetos do
Excel, selecione Excel na lista drop-down.
A segunda lista drop-down onde voc insere uma busca de string. Por
exemplo, se quiser ver todos os objetos do Excel que lidam com comentrios, digite comment no segundo campo e clique no boto Pesquisar
(ele um binculo). A janela com os resultados da pesquisa mostra tudo
que estiver no objeto biblioteca contendo o texto comentrio. Se voc
ver algo parecido que deve ser interessante, selecione e pressione F1
para mais informaes.
Como relacionar automaticamente
propriedades e mtodos
No Captulo 3, mencionei um punhado de itens chamados de Membros
de autolistagem (conhecidos como IntelliSense). Esse recurso oferece
uma lista de propriedades e mtodos enquanto voc digita. A Figura 4-5
mostra um exemplo da coleo Workbooks.
Figura 4-4:
Navegando pelos
objetos
com o
Navegador
de Objeto.
ExcelVBABokks.indb 66 15/02/2013 13:59:22
67 Captulo 4: Introduo ao Modelo de Objeto Excel
Depois que eu digitei o ponto, aps Workbooks, o VBE se ofereceu para
ajudar a exibir uma lista de propriedades e mtodos para aquela
coleo. Depois que digitei o c, a listagem se restringiu aos itens que
comeam com essa letra. Selecione o item que voc precisa, pressione
Tab e pronto! Voc poupou um pouco de digitao e ainda garantiu
que a propriedade ou o mtodo foram corretamente digitados.
Figura 4-5: O
recurso
Autolistar
Membros o
ajuda a
identificar
propriedades
e mtodos

para um
objeto.
ExcelVBABokks.indb 67 15/02/2013 13:59:23
68 Parte II: Como o VBA Trabalha com o Excel
ExcelVBABokks.indb 68 15/02/2013 13:59:23


Neste Captulo
Entendendo a diferena entre procedimentos Sub e procedimentos Function
Executando procedimentos Sub (vrias formas)
Executando procedimentos Function (duas formas)
Procedimentos Function e
Sub no VBA
Captulo 5
D
iversas vezes nos captulos anteriores, mencionei os procedimentos Sub e me referi ao fato de que procedimentos Function
tambm tm uma funo em VBA. Neste captulo, esclareo a confuso desses conceitos.
Subs versus Funes
O cdigo VBA que voc escreve no VBE conhecido como um procedimento. Os dois tipos de procedimentos mais comuns so Sub e Function.
5 Um procedimento Sub um grupo de declaraes de VBA que
executam uma ao (ou vrias aes) no Excel.
5 Um procedimento Function um grupo de declaraes que
executa um clculo e retorna um nico valor.
A maioria das macros que voc escreve no VBA so procedimentos Sub.
Voc pode pensar que um procedimento Sub como um comando:
Execute o procedimento Sub e algo acontece ( claro, o que acontece
exatamente depende do cdigo VBA do procedimento Sub).
Uma funo tambm um procedimento, mas bem diferente de um
Sub. O conceito de uma funo j familiar para voc. O Excel envolve
muitas funes de planilha que voc usa diariamente (bem, pelo menos
durante a semana). Exemplos incluem SUM, PMT e VLOOKUP. Voc usa
essas funes de planilhas em frmulas. Cada funo tem um ou mais
argumentos (embora algumas funes no usem argumento algum). A
funo faz alguns clculos ocultos e retorna um valor nico. O mesmo
serve para os procedimentos Function que voc desenvolve com VBA.
ExcelVBABokks.indb 69 15/02/2013 13:59:23
70 Parte II: Como o VBA Trabalha com o Excel
Observando os procedimentos Sub
Todo procedimento Sub inicia com a palavra-chave Sub e termina com
uma declarao End Sub. Eis um exemplo:
Sub ShowMessage()
MsgBox Thats all folks!
End Sub
Esse exemplo mostra um procedimento chamado ShowMessage. O
nome do procedimento antes dos parnteses. Na maioria dos casos,
esses parnteses esto vazios. Entretanto, voc pode passar argumentos aos procedimentos Sub a partir de outros procedimentos. Se o seu
Sub usa argumentos, liste-os entre parnteses.
Quando voc grava uma macro no Excel, o resultado sempre um
procedimento Sub.
Como ser visto mais adiante neste captulo, o Excel fornece vrias
maneiras para executar um procedimento Sub do VBA.
Observando os procedimentos Function
Todo procedimento Function comea com a palavra-chave Function e
termina com uma declarao End Function. Aqui est um simples exemplo:
Function CubeRoot(number)
CubeRoot = number ^ (1 / 3)

End Function
Essa funo, chamada CubeRoot (raiz cbica), tem um argumento
(chamado number), que est entre parnteses. As funes podem ter
qualquer quantidade de argumentos ou nenhum. Quando voc executa
a Function, ela retorna um valor nico a raiz cbica do argumento
passado para a funo.
O VBA permite que voc especifique qual tipo de informao (tambm
conhecido como tipo de dados) retornado por um procedimento
Function. O Captulo 7 contm mais informaes sobre a especificao
de tipos de dados.
S possvel executar um procedimento Function de duas maneiras.
Voc pode execut-lo de outro procedimento (um Sub ou outro procedimento Function) ou us-lo em uma frmula de planilha.
Independente de quanto voc tente, no possvel usar o gravador de
macro do Excel para gravar um procedimento Function. Voc precisa
inserir manualmente todo procedimento Function que criar.
L
E
M
B
R
E
-SE
D
I
C
A
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 70 15/02/2013 13:59:23
71 Captulo 5: Procedimentos Function e Sub no VBA
Nomeando Subs e Functions
Como os humanos, os animais de estimao e os furaces, todo procedimento Sub e Function deve ter um nome. Embora seja perfeitamente
aceitvel nomear seu cachorro de Hairball Harris, geralmente essa no
uma boa ideia para nomear procedimentos. Quando nomear procedimentos, voc deve seguir algumas regras:
5 Voc pode usar letras, nmeros e alguns caracteres de
pontuao, mas o primeiro caractere precisa ser uma letra.
5 Voc no pode usar quaisquer espaos ou pontos no nome.
5 O VBA no distingue entre letras maisculas e letras
minsculas.
5 Voc no pode colocar nenhum dos caracteres a seguir em um
nome: #, $, %, @, ^,* ou !.
5 Se voc escrever um procedimento de Function para usar em
uma frmula, no use um nome que se parea com um endereo
de clula (por exemplo, AK47). Na verdade, o Excel permite tais
nomes de funo, mas por que tornar as coisas mais confusas
do que j so?
5 Os nomes de procedimentos no podem ser maiores que 255
caracteres ( claro, voc nunca faria um nome de procedimento
to longo).
De maneira ideal, o nome de um procedimento descreve o objetivo de
uma rotina. Um bom exerccio criar um nome associando a um verbo
e a um substantivo por exemplo, ProcessarDados, ImprimirRelatrio,

Classificar_Array ou VerificarNomedeArquivo.
Alguns programadores preferem usar nomes como sentena que
oferecem uma descrio completa do procedimento. Alguns exemplos
incluem EscreverRelatrioParaArquivodeTexto e Imprimir_Opes_e_
Imprimir_Relatrio. O uso de nomes to longos tem prs e contras. Por
um lado, tais nomes so descritivos e, normalmente, sem ambiguidade.
Por outro lado, demoram mais tempo para digitar. Cada pessoa desenvolve um estilo de nomeao, mas os principais objetivos so aqueles
de fazer nomes descritivos e evitar nomes sem sentido, como Pateta,
Atualizar, Corrigir e Macro1.
Executando Procedimentos Sub
Embora voc possa no saber muito sobre desenvolvimento de procedimentos Sub nesse momento, vou me adiantar um pouco e discutir
como executar esses procedimentos. Isso importante, porque um
procedimento Sub intil a menos que voc saiba como execut-lo.
ExcelVBABokks.indb 71 15/02/2013 13:59:23
72 Parte II: Como o VBA Trabalha com o Excel
A propsito, executar um procedimento Sub significa a mesma coisa
que fazer funcionar ou chamar um procedimento Sub. possvel usar
qualquer terminologia que voc queira.
Como eu o executo? Deixe-me contar as maneiras. Voc pode executar
um VBA Sub de muitas formas essa uma razo pela qual voc pode
fazer tantas coisas teis com procedimentos Sub. Eis uma lista exaustiva das maneiras (bem, pelo menos todas as maneiras que pude lembrar) para executar um procedimento Sub:
5 Com o comando Executar Executar Sub/UserForm (no VBE). O
Excel executa o procedimento Sub no qual o cursor est
localizado. Este comando de menu tem duas alternativas: a
tecla F5 e o boto Executar/UserForm na barra de ferramentas
Padro o VBE. Esses mtodos no funcionam se o procedimento
exigir um ou mais argumentos.
5 Da caixa de dilogo Macro do Excel. Voc abre essa caixa
selecionando Desenvolverdor Cdigo Macros ou escolhendo
Exibio Macros Exibir Macros. Ou deixar de lado as guias e
simplesmente pressionar a tecla de atalho Alt+F8. Quando a
caixa de dilogo Macro aparecer, selecione o procedimento Sub
que deseja e clique Executar. Essa caixa de dilogo lista apenas
os procedimentos que no exigem um argumento.
5 Usando a tecla de atalho Ctrl+Tecla designada ao procedimento
Sub (supondo que voc designou uma).
5 Clicando em um boto ou em uma forma na planilha. O boto
ou a forma devem ter um procedimento Sub designado a ele.
5 A partir de outro procedimento Sub que voc escreve.
5 De um boto que voc acrescentou barra de ferramentas de
Acesso Rpido (veja o Captulo 19).
5 A partir de um item personalizado na lista que voc
desenvolveu (veja o Captulo 19).
5 Automaticamente, quando voc abrir ou fechar uma pasta de
trabalho (veja o Captulo 11).
5 Quando ocorrer um evento. Como explico no Captulo 11, esses
eventos incluem salvar a pasta de trabalho, fazer uma alterao
em uma clula, ativar uma planilha e outras coisas.
5 Da janela Verificao Imediata no VBE. Apenas digite o nome do
procedimento Sub e pressione Enter.
Demonstrei algumas dessas tcnicas nas sees seguintes. Antes de
continuar, voc precisa inserir um procedimento Sub em um mdulo VBA.
1. Comece com uma nova pasta de trabalho.
2. Pressione Alt+F11 para ativar o VBE.
3. Selecione a pasta de trabalho na janela de Projeto.
ExcelVBABokks.indb 72 15/02/2013 13:59:23

73 Captulo 5: Procedimentos Function e Sub no VBA


4. Selecione Inserir Mdulo para inserir um novo mdulo.
5. Insira o seguinte no mdulo:
Sub Raiz Cbica()
Num = InputBox("Entre com um nmero positivo")
MsgBox Num ^ (1/3) & " a raiz cbica."
End Sub
Este procedimento pede ao usurio por um nmero e depois exibe a
raiz cbica daquele nmero em uma caixa de mensagem. As Figuras 5-1
e 5-2 mostram o que acontece quando voc executa este procedimento.
A propsito, RaizCbica no um exemplo de uma boa macro. Ela no
verifica erros, ento falha facilmente. Para ver o que quero dizer, tente
clicar no boto Cancel (Cancelar) na caixa de entrada ou insira um
nmero negativo.
Executando diretamente o procedimento Sub
A maneira mais rpida de executar esse procedimento ir diretamente
ao mdulo VBA no qual voc o definiu. Siga esses passos:
1. Ative o VBE e selecione o mdulo VBA que contm o procedimento.
Figura 5-1:
Usando a
funo
interna do
VBA
InputBox
para obter
um nmero.
Figura 5-2:
Exibindo a
raiz cbica
de um
nmero
atravs da
funo
MsgBox
ExcelVBABokks.indb 73 15/02/2013 13:59:23
74 Parte II: Como o VBA Trabalha com o Excel
2. Mova o cursor para qualquer lugar no cdigo do procedimento.
3. Pressione F5 (ou selecione Executar Executar Sub/UserForm).
4. Responda caixa de entrada e clique OK.
O procedimento exibe a raiz cbica do nmero inserido.
Voc no pode usar o comando Executar Executar Sub/UserForm para
executar um procedimento Sub que usa argumentos, pois no h como
passar os argumentos para o procedimento. Se o procedimento contiver um ou mais argumentos, a nica forma de execut-lo cham-lo a
partir de outro procedimento o qual deve fornecer o(s) argumento(s).
Executando um procedimento a partir da
caixa de dilogo Macro
Na maior parte do tempo, voc executa os procedimentos Sub do Excel,
no do VBE. Os passos a seguir descrevem como executar uma macro,
usando a caixa de dilogo Macro do Excel:
1. Ative o Excel.
Alt+F11 a estrada expressa.
2. Selecione Desenvolvedor Cdigo Macros (ou pressione
Alt+F8).
O Excel exibe a caixa de dilogo mostrada na Figura 5-3.
3. Selecione a macro.
4. Clique em Executar (ou clique duas vezes no nome da macro na
caixa de lista).
L
E

M
B
R
E
-SE
Figura 5-3: A
caixa de
dilogo
Macro
relaciona
todos os
procedimentos Sub
disponveis.
ExcelVBABokks.indb 74 15/02/2013 13:59:23
75 Captulo 5: Procedimentos Function e Sub no VBA
Executando uma macro usando
uma tecla atalho
Uma outra forma de executar uma macro pressionar a sua tecla de
atalho. Mas, antes de poder usar esse mtodo, voc precisa atribuir
uma tecla de atalho para a macro.
Voc tem a oportunidade de atribuir uma tecla de atalho na caixa de
dilogo Gravar Macro quando comear a gravar uma macro. Se voc
criar o procedimento sem usar o gravador de macro, pode atribuir uma
tecla de atalho (ou mudar uma tecla de atalho existente) usando o
seguinte procedimento:
1. Selecione Desenvolvedor Cdigo Macros.
2. Selecione o nome do procedimento Sub na caixa de listagem.
Nesse exemplo, o nome do procedimento RaizCbica.
3. Clique no boto Opes.
O Excel exibe a caixa de dilogo mostrada na Figura 5-4.
4. Clique a opo Tecla de Atalho e insira uma letra na caixa
rotulada Ctrl.
A letra inserida corresponde combinao de teclas que voc
quer usar para executar a macro. Por exemplo, se inserir a letra
minscula c, voc pode executar a macro pressionando Ctrl+C. Se
voc entrar com uma letra maiscula, ser preciso adicionar a
tecla Shift combinao de teclas. Por exemplo, se entrar com C,
voc pode executar a macro pressionando Ctrl+Shift+C.
5. Clique OK ou Cancelar para fechar a caixa de dilogo
Opes de Macro.
Depois der ter atribudo uma tecla de atalho, voc pode pressionar
aquela combinao de teclas que definiu para executar a macro.
Figura 5-4:
A caixa de
dilogo
Macro
Options
permite que
voc
configure
opes s
suas macros.
ExcelVBABokks.indb 75 15/02/2013 13:59:23
76 Parte II: Como o VBA Trabalha com o Excel
As teclas de atalho que voc atribuiu s macros sobrescrevem as teclas
de atalho internas do Excel. Por exemplo, se atribuir Ctrl+C a uma
macro, voc no pode usar essa tecla de atalho para copiar dados na
sua pasta de trabalho. Normalmente, este no um grande problema,
porque o Excel sempre fornece outras maneiras de executar comandos.

Executando um procedimento a partir


de um boto ou forma
Talvez voc possa gostar da ideia de executar a macro a partir de um
boto (ou qualquer outra forma) em uma planilha. Para designar a
macro a um boto, siga esses passos:
1. Ative uma planilha.
2. Adicione um boto a partir do grupo.Controles de Forma.
Para isso escolha Desenvolvedor Controles Inserir (veja a
Figura 5-5).
3. Clique na ferramenta Boto no grupo Controle de Formulrio.
4. Arraste na planilha para criar o boto.
Depois de adicionar o boto sua planilha, o Excel exibe a caixa
de dilogo Atribuir Macro, mostrada na Figura 5-6.
5. Selecione a macro que deseja atribuir ao boto.
6. Clique OK.
C
U
I
D
A
D
O!
Figura 5-5:
Controles
disponveis
quando voc
clica Inserir
na guia
Desenvolvedor
ExcelVBABokks.indb 76 15/02/2013 13:59:24
77 Captulo 5: Procedimentos Function e Sub no VBA
Depois de ter feito a atribuio, clicar no boto executar a macro
exatamente como uma mgica.
Observe que a caixa de dilogo Atribuir Macro tambm oferece a
oportunidade para gravar uma macro (clicando o boto Gravar). Ou,
clique o boto Novo e o Excel inserir um procedimento Sub vazio, com
o nome que voc especificar. Mas, na maior parte do tempo, voc
designar uma macro existente a um boto.
Quando voc acrescenta um boto, veja que a caixa de opes disponibiliza dois conjuntos de controles: Controles de Formulrio e Controles
ActiveX. Esses dois grupos de controles so bem parecidos, mas na
verdade so bem diferentes. Na prtica, os Controles de Formulrio so
mais fceis de usar.
Tambm possvel atribuir uma macro a qualquer outra forma ou
objeto. Por exemplo, suponha que voc gostaria de executar uma
macro quando o usurio clicar em um objeto Retngulo.
1. Adicione o Retngulo planilha.
Insira um retngulo usando o comando Inserir Ilustraes Formas.
2. Clique no retngulo com o boto direito.
3. Escolha Atribuir Macro em seu menu de atalho.
4. Selecione a macro na caixa de dilogo Atribuir Macro.
5. Clique OK.
Depois de executar essas etapas, ao clicar no retngulo, a
macro atribuda ser executada.
Figura 5-6:
Quando voc
acrescentar
um boto a
uma planilha,

automaticamente o Excel
exibe a caixa
de dilogo
Atribuir
Macro.
ExcelVBABokks.indb 77 15/02/2013 13:59:24
78 Parte II: Como o VBA Trabalha com o Excel
Executando um procedimento a partir de
outro procedimento
Voc tambm pode executar um procedimento a partir de outro
procedimento. Se quiser experimentar, acompanhe essas etapas:
1. Ative o mdulo VBA que contm a rotina RaizCbica.
2. Entre este novo procedimento (acima ou abaixo do cdigo
CubeRoot no faz diferena):
Sub NewSub()
Call RaizCbica
End Sub
3. Execute a macro NewSub.
A maneira mais fcil de fazer isso movendo o cursor em qualquer lugar dentro do cdigo NewSub e pressionar F5. Observe que
esse procedimento apenas executa o procedimento RaizCbica.
A propsito, a palavra-chave Call opcional. A declarao pode consistir apenas do nome do procedimento Sub. Entretanto, eu creio que usar
a palavra-chave Call deixa perfeitamente claro que o procedimento est
sendo chamado.
Executando Procedimentos Function
Funes, diferentemente de procedimentos Sub, podem ser executadas
apenas de duas maneiras:
5 Chamando a funo a partir de outro procedimento Sub ou
Function.
5 Usando a funo em uma frmula de planilha.
Tente essa simples funo. Entre com ela em um mdulo VBA:
Function RaizCbica(numero)
RaizCbica = numero ^ (1/3)
End Function
Essa funo bem fraca ela apenas calcula a raiz cbica do nmero
passado como seu argumento. Entretanto, ela fornece um ponto de
partida para entender funes. Ela tambm ilustra um conceito importante sobre funes: como retornar o valor (voc lembra que as
funes retornam um valor, certo?).
ExcelVBABokks.indb 78 15/02/2013 13:59:24
79 Captulo 5: Procedimentos Function e Sub no VBA
Perceba que a nica linha do cdigo que cria esse procedimento
Function executa um clculo. O resultado matemtico (nmero para a
potncia de 1 3 ) designado varivel RaizCbica. No por coincidncia, RaizCbica tambm o nome da funo. Para dizer funo qual
valor retornar, voc designa aquele valor ao nome da funo.
Chamando uma funo a partir de um
procedimento Sub
Por no ser possvel executar essa funo diretamente, voc deve cham-la
a partir de outro procedimento. Entre com o seguinte procedimento no
mesmo mdulo VBA que contm a funo RaizCbica.
Sub ChamaFuno()
Ans = RaizCbica(125)
MsgBox Ans
End Sub
Quando voc executa o procedimento ChamarFuno (usando qualquer
dos mtodos descritos anteriormente neste captulo), o Excel exibe
uma caixa de mensagem que contm o valor da varivel Ans, que 5.

O que est acontecendo : a funo RaizCbica executada e recebe


um argumento de 125. O clculo realizado pelo cdigo da funo e o
valor retornado da funo designado varivel Ans. Ento, a funo
MsgBox exibe o valor da varivel Ans.
Tente mudar o argumento que passado para a funo RaizCbica e
rode novamente a macro ChamarFuno. Isto funciona como deveria
supondo que voc deu funo um argumento vlido (um nmero
positivo).
A propsito, o procedimento ChamarFuno pode ser um pouco
simplificado. A varivel Ans no realmente exigida.Voc poderia usar
esta nica declarao para obter o mesmo resultado:
MsgBox RaizCbica(125)
Chamando uma funo a partir de
uma frmula de planilha
Agora, hora de chamar esse procedimento Function do VBA a partir
de uma frmula. Ative uma planilha na mesma pasta de trabalho que
contm a definio da funo RaizCbica. Depois entre com a seguinte
frmula em qualquer clula:
=RaizCbica(1728)
A clula Exibir o nmero 12, que realmente a raiz cbica de 1.728.
ExcelVBABokks.indb 79 15/02/2013 13:59:24
80 Parte II: Como o VBA Trabalha com o Excel
Como voc deveria esperar, possvel usar uma referncia de clula
como argumento para a funo RaizCbica. Por exemplo, se a clula A1
contiver um valor, voc pode entrar com =RaizCbica(A1). Nesse caso, a
funo retorna o nmero obtido calculando a raiz cbica do valor em A1.
Voc pode usar essa funo na planilha quantas vezes quiser. Tal como
acontece nas funes internas do Excel, suas funes personalizadas
tambm aparecem na caixa de dilogo Inserir Funo. Clique o boto da
barra de ferramentas Inserir Funo e escolha a categoria User Definido
pelo Usurio. Como mostrado na Figura 5-7, a caixa de dilogo Inserir
Funo relaciona a sua prpria funo.
Se voc quiser que a caixa de dilogo Insert Function (Inserir Funo)
exiba uma descrio da funo, siga esses passos:
1. Selecione Desenvolvedor Cdigo Macros.
O Excel exibe a caixa de dilogo Macro, mas RaizCbica no
aparece na lista (RaizCbica uma procedimento Function e essa
lista mostra apenas procedimentos Sub). No se aflija.
2. Digite a palavra RaizCbica na caixa Nome da Macro.
3. Clique no boto Opes.
4. Entre com uma descrio da funo na caixa Descrio.
5. Feche a caixa de dilogo Opes de Macro.
6. Feche a caixa de dilogo Macro clicando o boto Cancelar.
Agora, esse texto descritivo aparece na caixa de dilogo
Inserir Funo.
Por agora, as coisas devem estar comeando a fazer sentido para voc
(gostaria de ter tido este livro quando eu comecei). Voc descobriu
muito sobre procedimentos Function e Sub. No Captulo 6, voc comear a criar macros. Nele, discute-se os prs e os contras de desenvolver macros usando o gravador de macro do Excel.
Figura 5-7: A
funo
RaizCbica
aparece na
categoria
Definido pelo
Usurio da
caixa de
dilogo
Inserir

Funo.
D
I
C
A
ExcelVBABokks.indb 80 15/02/2013 13:59:24


Neste Captulo
Gravando suas aes usando o gravador de Macro do Excel
Entendendo os tipos de macros que voc pode gravar
Con gurando as opes apropriadas para gravar macro
Usando o Gravador de
Macro do Excel
Captulo 6
V
oc pode usar dois mtodos para criar uma macro no Excel:
5 Grav-la usando o gravador de macro do Excel.
5 Escrev-la manualmente.
Este captulo trata especificamente dos prs e contras de usar o
gravador de macro do Excel. Gravar uma macro nem sempre a melhor
abordagem, e algumas macros simplesmente no podem ser gravadas,
no importa o quanto voc tente. Porm, voc ver que o gravador de
macro do Excel muito til. Mesmo que o seu gravador de macro no
seja o que voc quer, quase sempre ele pode lev-lo na direo certa.
Isto Est Vivo ou VBA?
Nas edies anteriores deste livro, comparei a gravao de uma macro
usando um gravador de fita. No entanto, me ocorreu que os gravadores
de fita esto indo rapidamente pelo caminho dos dinossauros. Portanto,
modernizei esta seo e agora, a gravao de macro comparada a fazer
um vdeo digital. Essa analogia, como a anterior, no vai muito longe. A
Tabela 6-1 compara a gravao de macro com a feitura de um vdeo.
ExcelVBABokks.indb 81 15/02/2013 13:59:24
82 Parte II: Como o VBA Trabalha com o Excel
Tabela 6-1: Gravador de vdeo versus gravador de macro
Gravador de vdeo Gravador de macro Excel
Qual equipamento Uma cmera de vdeo. Um computador e uma
necessrio?
cpia do Excel.
O que gravado? Vdeo e udio. Aes tomadas em Excel.
Onde a gravao Em um carto de Em um mdulo VBA.
armazenada? memria.
Como voc a exibe? Localiza-se o arquivo e Localiza-se a macro na caixa
pressiona-se Play. de dilogo Macros e
clica-se em Executa ou
usa-se
outros mtodos.
Voc pode editar a Sim, se tiver o software Sim, se voc souber o que
gravao? adequado. est fazendo.
Voc pode copiar a Sim, exatamente como co- Sim (nenhum equipamento
gravao? piar qualquer outro arquivo. adicional exigido).
A gravao exata? Depende da situao e da Depende de como voc
qualidade do equipamento. configura as coisas ao
gravar a macro.
E se voc cometer Regrave o vdeo (ou, se Regrave a macro (ou
um erro? possvel, edite-o). edite-a, se possvel).
Voc pode ver a Sim, abrindo o arquivo com Sim, abrindo um mdulo no
gravao? o software adequado. VBE.
Voc pode comparti- Sim, YouTube uma boa Sim, coloque-a em seu site
lh-la com o mundo? opo. ou blog.
Voc pode ganhar Sim, se ela for realmente Sim, mas voc precisa

dinheiro com a boa (geralmente, preciso fazer um bocado de edio


gravao? editar). antes.
O Bsico sobre Gravao
Siga os seguintes passos bsicos quando gravar uma macro. Mais
adiante neste captulo, eu descrevo esses passos em mais detalhes
1. Determine o que voc quer que a macro faa.
2. Configure adequadamente as coisas.
Essa etapa determina quo bem as suas macros funcionam.
3. Determine se voc quer que as referncias em sua macro sejam
relativas ou absolutas.
ExcelVBABokks.indb 82 15/02/2013 13:59:24
83 Captulo 6: Usando o Gravador de Macro do Excel
4. Clique no boto Gravar Macro do lado esquerdo da barra de
status (ou escolha Desenvolvedor Cdigo Gravar Macro).
O Excel exibe a caixa de dilogo Gravar Macro.
5. Entre com um nome, tecla de atalho, local de macro e descrio.
Cada um desses itens exceo do nome opcional.
6. Clique OK na caixa de dilogo Gravar Macro.
Automaticamente, o Excel insere um mdulo de VBA. Desse ponto
em diante, o Excel converte suas aes em cdigo de VBA. Ele
tambm exibe um boto Parar Gravao em sua barra de status
(um quadrado azul).
7. Execute as aes que voc quer gravar usando o mouse ou
o teclado.
8. Quando tiver terminado, clique no boto Parar Gravao na barra
de status (ou escolha Desenvolvedor Cdigo Parar Gravao).
O Excel para de gravar as suas aes.
9. Teste a macro para garantir que ela funciona corretamente
10. Opcionalmente, voc pode limpar o cdigo, removendo declaraes estranhas.
O gravador de macro mais adequado para macros simples, diretas.
Por exemplo, voc pode criar uma macro que aplique uma formatao a
um intervalo de clulas ou que configure cabealhos de linhas e coluna
em uma nova planilha.
O gravador de macro s usado para procedimentos Sub. No
possvel us-lo para criar procedimentos Function.
Voc tambm pode considerar o gravador de macro til para desenvolver macros mais complexas. Frequentemente, gravo algumas aes e
depois copio o cdigo gravado em outro, uma macro mais complexa. Na
maioria dos casos, preciso editar o cdigo gravado e adicionar
algumas declaraes VBA novas.
O gravador de macro no pode gerar cdigo para qualquer uma das
seguintes tarefas, que descrevo mais adiante no livro:
5 Executar quaisquer tipos de loops de repetio
5 Executar quaisquer tipos de aes condicionais (usando uma
declarao If-Then)
5 Atribuir valores a variveis
5 Especificar tipos de dados
5 Exibir mensagens pop-up
5 Exibir caixas de dilogo personalizadas
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 83 15/02/2013 13:59:24
84 Parte II: Como o VBA Trabalha com o Excel
A capacidade limitada do gravador de macro certamente no diminui a

sua importncia. Ao longo do livro, eu afirmo isso: Gravar as suas aes,


talvez seja a melhor maneira de administrar VBA. Quando estiver em
dvida, tente gravar. Ainda que o resultado possa no ser exatamente o
desejado, ver o cdigo gravado pode encaminh-lo para a direo certa.
Preparao para Gravar
Antes que voc d um grande passo e ligue o gravador de macro, perca
um minuto ou dois pensando no que vai fazer. Voc grava uma macro
para que o Excel possa repetir automaticamente as aes gravadas.
Finalmente, o sucesso de uma macro gravada depende de cinco fatores:
5 Como a pasta de trabalho est configurada enquanto voc
grava a macro
5 O que est selecionado quando voc comea a gravar
5 Se voc usa o modo de gravao absoluto ou relativo
5 A exatido de suas aes gravadas
5 O contexto no qual voc exibe a macro gravada
A importncia desses fatores ficar clara quando eu o encaminho
atravs de um exemplo.
Relativo ou Absoluto?
Ao gravar suas aes, normalmente o Excel grava as referncias
absolutas das clulas (essa a modalidade padro de gravao). Com
frequncia, esse o modo errado de gravao. Se voc usar a gravao
relativa, o Excel grava as referncias relativas das clulas. A distino
explicada nesta seo.
Gravando no modo absoluto
Siga estas etapas para gravar uma macro simples, no modo absoluto.
Essa macro fornece apenas trs nomes de ms em uma planilha:
1. Escolha Desenvolvedor Cdigo Gravar Macro.
2. Digite Absolute como o nome para esta macro.
3. Clique OK para comear a gravar.
L
E
M
B
R
E
-SE
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 84 15/02/2013 13:59:24
85 Captulo 6: Usando o Gravador de Macro do Excel
4. Ative clula B1 e digite Jan nesta clula.
5. Mova para a clula C1 e digite Fev.
6. Mova para a clula D1 e digite Mar.
7. Clique a clula B1 para ativar o VBE.
8. Pare o gravador de macro.
9. Pressione Alt+F11 para ativar o VBE.
10. Examine o mdulo Module1.
O Excel gera o seguinte cdigo:
Sub Absolute()

Absolute Macro

Range(B1).Select
ActiveCell.FormulaR1C1 = Jan
Range(C1).Select

ActiveCell.FormulaR1C1 = Fev
Range(D1).Select
ActiveCell.FormulaR1C1 = Mar
Range(B1).Select
End Sub
Quando executada, esta macro seleciona a clula B1 e introduz os
nomes dos trs meses nos intervalos B1: D1. Ento a macro reativa
a clula B1.
Essas mesmas aes ocorrem independente da clula estar ativa
quando voc executa a macro. Uma macro gravada usando referncias
absolutas produz sempre os mesmos resultados quando executada.
Nesse caso, a macro entra sempre os nomes dos primeiros trs meses
na faixa B1: D1.
Gravando no modo relativo
Em alguns casos, voc prefere que a sua macro gravada trabalhe com
locais de clula de uma maneira relativa. Voc pode querer que a macro
comece a entrar com os nomes de ms na clula ativa. Em tal caso,
preciso usar a gravao relativa.
Voc pode mudar a forma pela qual o Excel grava suas aes, clicando
o boto Usar Referncias Relativas no grupo Cdigo, na guia Desenvolvedor. Esse boto de alternncia (liga e desliga). Normalmente,
quando o boto aparece, com uma cor diferente, voc est gravando no
modo relativo. Quando aparece de forma normal, a gravao absoluta.
possvel mudar o mtodo de gravao a qualquer momento, mesmo
no meio da gravao.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 85 15/02/2013 13:59:25
86 Parte II: Como o VBA Trabalha com o Excel
Para ver como funciona o modo relativo de gravao, limpe as clulas
do intervalo B1: D1 e depois execute as seguintes etapas:
1. Ative a clula B1.
2. Escolha Desenvolvedor Cdigo Gravar Macro.
3. Nomeie essa macro Relativa.
4. Clique Ok para comear a gravar.
5. Clique o boto Usar Referncias Relativas para mudar o modo
de gravao para relativo.
Ao clicar esse boto, ele muda para uma cor diferente em relao
aos outros botes da faixa de opes.
6. Ative a clula B1 e digite Jan nessa clula.
7. Digite Fev na clula C1.
8. Digite Mar na clula D1.
9. Selecione a clula B1.
10. Pare o gravador da macro.
Observe que esse procedimento difere ligeiramente do exemplo
anterior. Nesse exemplo, voc ativa a clula antes de comear a gravar.
Essa uma etapa importante quando voc grava macros que usam a
clula ativa como base.
Essa macro sempre inicia entrando com texto na clula ativa. Experimente. Mova o ponteiro para qualquer clula e execute a macro Relativa. Os
nomes dos meses so sempre fornecidos no incio, na clula ativa.
Com o modo de gravao configurado para relativo, o cdigo que o
Excel gera bem diferente do cdigo gerado no modo absoluto:
Sub Relative()

Relative Macro

ActiveCell.FormulaR1C1 = Jan
ActiveCell.Offset(0, 1).Range(A1).Select
ActiveCell.FormulaR1C1 = Fev
ActiveCell.Offset(0, 1).Range(A1).Select
ActiveCell.FormulaR1C1 = Mar
ActiveCell.Offset(0, -2).Range(A1).Select
End Sub
Para testar essa macro, ative qualquer clula, exceto B1. Os nomes
dos meses so inseridos em trs clulas, comeando com a clula que
voc ativou.
ExcelVBABokks.indb 86 15/02/2013 13:59:25
87 Captulo 6: Usando o Gravador de Macro do Excel
Observe que o cdigo gerado pelo gravador de macro refere-se clula
A1. Isso pode parecer estranho porque voc nunca usou a clula A1
durante a gravao da macro. Este simplesmente um subproduto de
como o gravador de macro funciona (isso discutido em mais detalhes
no Captulo 8, onde falo sobre o mtodo Offset).
O Que Gravado?
Quando voc liga o gravador de macro, o Excel converte as aes do
mouse e do teclado em cdigo vlido de VBA. Provavelmente, eu
poderia escrever vrias pginas descrevendo como o Excel faz isso,
mas a melhor maneira de compreender o processo observando o
gravador de macro em ao (a Figura 6-1 mostra como se parecia a
minha tela, enquanto o meu gravador de macro estava ligado).
Siga estas etapas:
1. Comece com uma pasta de trabalho em branco.
2. Certifique-se de que a janela do Excel no esteja maximizada.
3. Pressione Alt+F11 para ativar o VBE (e para garantir que a
janela desse programa no est maximizada).
4. Redimensione e organize a janela do Excel e a janela do VBE de
modo que ambas estejam visveis.
Para melhores resultados, posicione a janela do Excel acima da
janela do VBE e minimize todas os outros aplicativos que estiverem rodando.
5. Ative o Excel e escolha Desenvolvedor Cdigo Gravar Macro.
6. Clique Ok para iniciar o gravador de macro.
O Excel insere um mdulo novo (nomeado como Mdulo1) e
comea a gravar nesse mdulo.
7. Ative a janela do programa VBE.
8. Na janela Project Explorer, clique duas vezes Mdulo1 para
exibir o mdulo na janela de Cdigo.
Retorne ao Excel e brinque um pouco. Escolha vrios comandos do
Excel e veja o cdigo ser gerado na janela VBE. Selecione clulas, entre
com dados, formate clulas, use os comandos da Faixa de Opes, crie
um grfico, altera as larguras de colunas, manipule objetos grficos e
assim por diante enlouquea! Eu garanto que voc ser iluminado
enquanto observar o Excel cuspir cdigo VBA diante dos seus olhos.
P
A
P
O
D
E
E
S
P

E
C
IALIS
T
A
ExcelVBABokks.indb 87 15/02/2013 13:59:25
88 Parte II: Como o VBA Trabalha com o Excel
Opes da Gravao
Ao gravar suas aes para criar o cdigo VBA, voc tem diversas
opes. Lembre-se que o comando Desenvolvedor Cdigo Gravar
Macro indica a caixa de dilogo Gravar Macro antes que a gravao
comece, como mostrado na Figura 6-2.
A caixa de dilogo Gravar Macro, mostrada na Figura 6-2, permite que
voc especifique alguns aspectos de sua macro. Nas prximas sees,
descrevo estas opes.
Nome da Macro
Voc pode entrar com um nome para o procedimento Sub que voc est
gravando. Por padro, o Excel usa os nomes Macro1, Macro2, e assim
por diante, para cada macro que voc grava. Aceito, geralmente, apenas
o nome padro. Se a macro funciona corretamente e quero salv-la,
mais tarde crio um nome apropriado. Porm, voc pode preferir
nomear a macro logo no incio, a escolha sua.
Figura 6-1:
Um arranjo
conveniente de
janela,
para
observar o
gravador
de macro
fazer suas
coisas.
ExcelVBABokks.indb 88 15/02/2013 13:59:25
89 Captulo 6: Usando o Gravador de Macro do Excel
Tecla de Atalho
A opo Tecla de Atalho permite que voc execute a macro pressionando uma combinao de teclas. Por exemplo, se voc incorporar w
(minscula), pode executar a macro pressionando Ctrl+W. Se entrar
com W (maiscula), a macro ativada quando voc pressionar
Ctrl+Shift+W.
Voc pode adicionar ou mudar uma tecla de atalho a qualquer momento, assim no preciso definir essa opo ao gravar uma macro.Veja, no
Captulo 5, instrues sobre a atribuio de uma tecla de atalho a uma
macro existente.
Armazenar Macro Em
A opo Armazenar Macro Em informa ao Excel onde armazenar a
macro que ele est gravando. Por padro, Excel coloca a macro gravada
em um mdulo na pasta de trabalho ativa. Se preferir, voc pode
grav-la em um uma nova pasta de trabalho (o Excel abre uma pasta de
trabalho em branco) ou em sua Pasta de Trabalho Pessoal de Macros.
A sua Pasta de Trabalho Pessoal de Macros uma pasta de trabalho
oculta que se abre, automaticamente, quando o Excel inicia. Esse um
lugar bom para armazenar as macros que voc usar com mltiplas
pastas de trabalho. A Pasta de Trabalho Pessoal de Macros nomeada
como PERSONAL.XLSB. Este arquivo no existe at que voc o especifique como o lugar para uma macro gravada. Se tiver feito quaisquer
alteraes nesse arquivo, o Excel solicita que voc o salve ao sair.
Descrio
Se voc quiser acrescentar alguns comentrios descritivos sua

macro, use a caixa Descrio. possvel colocar qualquer coisa que


voc queira aqui, ou ento, nada. Quanto a mim, a opo Descrio
uma perda de tempo, pois muito fcil acrescentar comentrios
macro gravada.
L
E
M
B
R
E
-SE
Figura 6-2:
A caixa de
dilogo
Gravar
Macro
oferece
vrias
opes.
ExcelVBABokks.indb 89 15/02/2013 13:59:25
90 Parte II: Como o VBA Trabalha com o Excel
Essa Coisa Efciente?
Voc pode pensar que gravar uma macro renderia alguma premiao
por cdigo VBA melhor do que voc poderia se escrevesse mo.
Pense de novo. Em muitos casos, o gravador cospe muito lixo e,
geralmente, gera cdigo que menos eficiente.
No me entenda mal. Sou um leal partidrio do gravador de macro.
Trata-se de uma tima ferramenta para voc administrar VBA. Entretanto, diferente de simples macros, eu nunca usei um gravador de macro
sem corrigir o cdigo um pouco (geralmente um pouco).
S para demonstrar o quo ineficiente um cdigo gerado pelo gravador
de macro pode ser, tente isso:
1. Ligue o gravador de macro.
2. Escolha o comando Layout da Pgina Configurar
Pgina Orientao Paisagem.
3. Desligue o gravador de macro.
Para dar uma olhada na macro, ative a folha Mdulo 1. Apenas esse
comando e bem simples gera o seguinte cdigo:
Sub Macro1()
With ActiveSheet.PageSetup
.PrintTitleRows =
.PrintTitleColumns =
End With
ActiveSheet.PageSetup.PrintArea =
With ActiveSheet.PageSetup
.LeftHeader =
.CenterHeader =
.RightHeader =
.LeftFooter =
.CenterFooter =
.RightFooter =
.LeftMargin = Application.
InchesToPoints(0.708661417322835)
.RightMargin = Application.
InchesToPoints(0.708661417322835)
.TopMargin = Application.
InchesToPoints(0.748031496062992)
.BottomMargin = Application.
InchesToPoints(0.748031496062992)
ExcelVBABokks.indb 90 15/02/2013 13:59:25

91 Captulo 6: Usando o Gravador de Macro do Excel


.HeaderMargin = Application.
InchesToPoints(0.31496062992126)
.FooterMargin = Application.
InchesToPoints(0.31496062992126)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 300
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlLandscape
.Draft = False
.PaperSize = xlPaperLetter
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.ScaleWithDocHeaderFooter = True
.AlignMarginsHeaderFooter = True
.EvenPage.LeftHeader.Text =
.EvenPage.CenterHeader.Text =
.EvenPage.RightHeader.Text =
.EvenPage.LeftFooter.Text =
.EvenPage.CenterFooter.Text =
.EvenPage.RightFooter.Text =
.FirstPage.LeftHeader.Text =
.FirstPage.CenterHeader.Text =
.FirstPage.RightHeader.Text =
.FirstPage.LeftFooter.Text =
.FirstPage.CenterFooter.Text =
.FirstPage.RightFooter.Text =
End With
End Sub
Voc deve ter ficado surpreso com a quantidade de cdigo gerado por
esse nico comando (eu fiquei, na primeira vez em que tentei algo
assim). Ainda que voc s tenha alterado uma configurao de impresso, o Excel gerou um cdigo que configura muitas outras propriedades
relacionadas impresso.
Esse um exemplo de gravao de macro exagerada. Se voc quiser
que uma macro apenas troque a configurao de pgina para o modo
de paisagem, pode simplificar consideravelmente essa macro, apagando o cdigo estranho. Isso torna a macro mais rpida e mais fcil de ler.
Eis como a macro se parece depois que apaguei as linhas irrelevantes:
ExcelVBABokks.indb 91 15/02/2013 13:59:26
92 Parte II: Como o VBA Trabalha com o Excel
Sub Macro1()
With ActiveSheet.PageSetup
.Orientation = xlLandscape
End With
End Sub
Eu apaguei todo o cdigo, exceto a linha que configura a propriedade
Orientao. Na verdade, voc pode simplificar ainda mais essa macro,
porque de fato voc no precisa da declarao With.End (eu explico
mais sobre isso no Captulo 14):
Sub Macro1()
ActiveSheet.PageSetup.Orientation = xlLandscape

End Sub
Nesse caso, a macro muda a propriedade Orientao do objeto Configurao de Pgina na folha ativa. Todas as outras propriedades permanecem inalteradas. A propsito, xlLandscape uma constante interna que
torna o seu cdigo mais fcil de ler. Essa constante tem um valor de 2,
portanto, a seguinte declarao funciona exatamente da mesma forma
(mas, no to fcil de ler):
ActiveSheet.PageSetup.Orientation = 2
Fique atento. Eu discuto constantes internas no Captulo 7.
Ao invs de gravar essa macro, voc pode entrar diretamente com ela em
um mdulo VBA. Para isso, voc tem que saber quais objetos, propriedades e mtodos usar. Embora a macro gravada no seja to boa, gravando-a voc percebe que o objeto Configurao de Pgina tem uma propriedade Orientao. Munido com esse conhecimento (e provavelmente,
algumas tentativas) voc pode escrever manualmente a macro.
Este captulo quase um resumo de como usar o gravador de macro. A
nica coisa que falta experincia. Ocasionalmente, voc descobre
quais declaraes gravadas voc pode apagar com segurana. Melhor
ainda, voc descobre como modificar uma macro gravada para torn-la
mais til.
ExcelVBABokks.indb 92 15/02/2013 13:59:26
Por Rich Tennant A 5 Onda
Conceitos de
Programao
Parte III
Eu comecei pensando em cenas do tipo e se
na minha planilha, E se eu casse enjoado,
desse meu trabalho com dinheiro sujo e
encaminhasse um pouco do dinheiro da
empresa para uma conta em
um paraso scal?
ExcelVBABokks.indb 93 15/02/2013 13:59:26
Nesta parte...
E
sta a parte do livro que voc tem esperado.
Nos prximos oito captulos, voc descobrir
tudo sobre os elementos essenciais de programao
do Excel. E, no decorrer do processo, ver alguns
exemplos esclarecedores que pode adaptar s suas
prprias necessidades.
ExcelVBABokks.indb 94 15/02/2013 13:59:26


Neste Captulo
Saber quando, por que e como usar comentrios em seu cdigo
Usar variveis e constantes
Informar ao VBA qual tipo de dados voc est usando
Saber porque voc precisa usar rtulos em seus procedimentos
Elementos Essenciais da
Linguagem VBA
Captulo 7
P
elo fato do VBA ser uma linguagem de programao real e viva, ele
usa muitos elementos comuns a todas as linguagens de programao. Neste captulo, eu o apresento a vrios desses elementos: comentrios, variveis, constantes, tipos de dados, arrays e algumas outras
benesses. Se voc tiver programado com outras linguagens, um pouco
desse material ser familiar. Se voc for um programador iniciante,
hora de arregaar as mangas e car ocupado.
Usando Comentrios em Seu Cdigo VBA

Um comentrio o tipo mais simples de declarao VBA. Porque o VBA


ignora essas declaraes, elas podem no conter nada do que voc
quer. possvel inserir um comentrio para se lembrar do motivo pelo
qual fez algo ou para esclarecer algum cdigo especialmente elegante
que escreveu. Use comentrios generosa e extensamente para descrever o que o cdigo faz (o que ele no faz sempre bvio pela leitura do
prprio cdigo). Frequentemente, um cdigo que faz todo o sentido nos
dias de hoje o mistifica amanh. Esteja l. Faa isso.
Um comentrio iniciado com um apstrofo (). O VBA ignora qualquer
texto que siga um apstrofo em uma linha de cdigo. Voc pode usar
uma linha inteira para o seu comentrio ou inserir o seu comentrio ao
final de uma linha de cdigo. O exemplo a seguir mostra um procedimento VBA com trs comentrios, ainda que eles no sejam, necessariamente, bons comentrios.
ExcelVBABokks.indb 95 15/02/2013 13:59:26
96 Parte III: Conceitos de Programao
Sub CommentsDemo()
Esse procedimento no faz nada de valor
x = 0 x no representa nada
mostra o resultado
MsgBox x
End Sub
A regra o apstrofo indica um comentrio tem uma exceo. VBA no
interpreta um apstrofo entre aspas como uma indicao de comentrio. Por exemplo, a seguinte declarao no contm um comentrio,
ainda que ela tenha um apstrofo:
Msg = Cant continue
Quando estiver escrevendo cdigo, voc pode querer testar um procedimento excluindo uma declarao em especial, ou grupo de declaraes.
Voc poderia apagar as declaraes e, mais tarde, digit-las novamente.
Mas isso uma perda de tempo. Uma soluo melhor apenas transformar aquelas declaraes em comentrios, inserindo apstrofos. VBA
ignora declaraes iniciadas com apstrofos ao executar uma rotina. Para
reativar aquelas declaraes comentadas, basta remover os apstrofos.
Eis uma maneira rpida de converter um bloco de declaraes a comentrios. No VBE, escolha Exibir Barras de ferramentas Editar para
exibir a barra de ferramentas Editar. Para converter um bloco de
declaraes a comentrios, selecione a declarao e clique o boto
Comentar Bloco. Para remover os apstrofos, selecione as declaraes
e clique o boto Remover Comentrio do Bloco.
Embora comentrios possam ser teis, nem todos os comentrios so
criados da mesma forma. Por exemplo, o seguinte procedimento usa
muitos comentrios, porm, eles no acrescentam nada til. Neste
caso, o cdigo claro o bastante sem os comentrios.
Sub BadComments()
Declara variveis
Dim x As Integer
Dim y As Integer
Dim z As Integer
Inicia a rotina
x = 100 Assign 100 to x
y = 200 Assign 200 to y
Adiciona x e y e os coloca em z
z = x + y
Mostra o resultado
MsgBox z
End Sub
Cada pessoa desenvolve o seu prprio estilo de comentar. No entanto, para
ser til, os comentrios devem apresentar as informaes que no so bvias
a partir da leitura do cdigo. Caso contrrio, os comentrios s mastigam

bytes e tornam os arquivos maiores do que o necessrio.


L
E
M
B
R
E
-SE
D
I
C
A
ExcelVBABokks.indb 96 15/02/2013 13:59:26
97 Captulo 7: Elementos Essenciais da Linguagem VBA
As seguintes dicas podem ajud-lo a usar comentrios com eficincia:
5 Descreva resumidamente cada procedimento Sub ou Function
que escrever.
5 Use comentrios para controlar as mudanas que voc fez em
um procedimento.
5 Use um comentrio para indicar que voc est usando uma funo
ou uma declarao de maneira incomum ou fora do padro.
5 Use comentrios para descrever as variveis que usar, especialmente
se voc no usar nomes significativos para as variveis.
5 Use um comentrio para descrever quaisquer solues que
voc desenvolva para superar bugs no Excel.
5 Escreva comentrios enquanto desenvolve cdigo ao invs de
guardar a tarefa para uma etapa final.
5 Dependendo do seu ambiente de trabalho, considere adicionar
uma ou duas piadas como um comentrio. As pessoas que
assumir em seu trabalho quando voc for promovido podem
apreciar o humor.
Usando Variveis, Constantes e
Tipos de Dados
O principal objetivo do VBA manipular dados. O VBA armazena os
dados na memria do seu computador: eles podem ou no terminar em
um disco. Alguns dados, tais como listagens em planilhas, ficam em
objetos. Outros dados so armazenados nas variveis que voc cria.
Entendendo variveis
Uma varivel apenas um local de armazenagem, nomeado, na memria do seu computador. Voc tem muita flexibilidade na nomeao de
suas variveis, portanto, torne os nomes de variveis to descritivos
quanto possvel. Voc atribui um valor a uma varivel usando o sinal de
operador de igual (mais sobre isso, mais adiante, na seo Usando
Declaraes de Atribuio).
Os nomes de variveis nesses exemplos aparecem em ambos os lados,
esquerdo e direito, dos sinais de igual. Observe que o ltimo exemplo
usa duas variveis:
x = 1
InterestRate = 0.075
LoanPayoffAmount = 243089
DataEntered = False
x = x + 1
UserName = Bob Johnson
DataStarted = #3/14/2010#
MyNum = YourNum * 1.25
D
I
C
A
ExcelVBABokks.indb 97 15/02/2013 13:59:26

98 Parte III: Conceitos de Programao


O VBA impe algumas regras com relao aos nomes de variveis:
5 Voc pode usar letras, nmeros e alguns caracteres de
pontuao, mas o primeiro caractere deve ser uma letra.
5 No possvel usar quaisquer espaos ou pontos no nome de
uma varivel.
5 O VBA no distingue entre letras maisculas e minsculas.
5 Voc no pode usar os seguintes caracteres no nome de uma
varivel: #, $, %, & ou !.
5 Os nomes de variveis no podem ter mais de 255 caracteres.
claro que voc est procurando problemas se usar nomes de
variveis com 255 caracteres de extenso.
Para tornar os nomes de variveis mais legveis, frequentemente os
programadores misturam letras maisculas com minsculas (por
exemplo, InterestRate) ou usam o caractere underline (interest_rate).
O VBA tem muitas palavras reservadas que voc no pode usar em
nomes de variveis ou nomes de procedimento. Essas incluem palavras
tais como Sub, Dim, With, End, Next e For. Se voc tentar usar uma
dessas palavras como uma varivel, pode receber um erro de compilao
(significando que o seu cdigo no vai rodar). Portanto, se ao declarar
uma atribuio voc obtiver uma mensagem de erro, confira se o nome
da varivel no uma palavra reservada.
O VBA permite que voc crie variveis cujos nomes correspondem aos
nomes usados no modelo de objeto do Excel, tais como Workbook e
Range. Mas, claro, usar nomes como esses s aumenta a possibilidade
de tornar as coisas confusas. Assim, resista tentao de nomear a sua
varivel como Workbook e, ao invs, use algo como MyWorkbook.
O que so tipos de dados do VBA?
Quando falo sobre tipos de dados, estou me referindo forma pela qual
um programa armazena dados na memria por exemplo, como
nmeros inteiros, nmeros reais ou strings. Ainda que o VBA possa
cuidar automaticamente desses detalhes, ele impe um custo (no
existe almoo grtis). Permitir que o VBA cuide dos dados que voc vai
digitar resulta em execuo mais lenta e uso ineficiente de memria. Em
pequenos aplicativos, normalmente isso no representa um grande
problema. Porm, em aplicativos grandes ou complexos, os quais
podem ficar lentos ou precisar de proteo a cada byte de memria,
voc precisa estar familiarizado com os tipos de dados.
Automaticamente, VBA lida com todos os detalhes quanto aos dados, o
que facilita a vida para os programadores. Nem todas as linguagens de
programao oferecem esse luxo. Por exemplo, algumas linguagens so
digitadas estritamente, significando que o programador deve definir
explicitamente o tipo de dados em cada varivel usada.
VBA no exige que voc declare as variveis que voc usa, mas, definitivamente, essa uma boa prtica. Mais adiante, neste captulo, voc
ver o motivo.
ExcelVBABokks.indb 98 15/02/2013 13:59:27
99 Captulo 7: Elementos Essenciais da Linguagem VBA
O VBA tem uma variedade de tipos de dados integrados. A Tabela 7-1
relaciona os tipos mais comuns de dados com os quais o VBA pode lidar.
Tabela 7-1 Tipos de Dados Integrados do VBA
Tipo de Dados Bytes Usados Faixa de Valores
Boolean 2 Verdadeiro ou Falso
Integer 2 -32.768 a 32.767
Long 4 -2.147.483.648 a 2.147.483.647
Single 4 -3.402823E38 a 1.401298E45
Double (negativo) 8 -1.79769313486232E308 a -4.94065645841247E-324
Double (positivo) 8 4.94065645841247E-324 a 1.79769313486232E308
Currency (Moeda) 8 -922.337.203.685.477.5808 a 922.337.203.685.477.5807
Date 8 1/1/100 a 12/31/9999

String 1 por caractere Varia


Object 4 Qualquer objeto definido
Variant Varia Qualquer tipo de dados
User Defined Varia Varia
Em geral, escolha o tipo de dados que usa a menor quantidade de
bytes, mas que ainda pode lidar com todos os dados que voc deseja
armazenar na varivel.
Geralmente, os contadores de loop so declarados como inteiros. Se
voc usar um contador de loop para contar as linhas de uma planilha, o
seu programa pode simplesmente acusar erro! Por qu? Integers no
podem ser maiores que 32.767. A partir do Excel 2007, as planilhas tm
muito mais linhas (1.048.576, para ser exato). Em lugar disso, declare
esses contadores de loop como Long.
Declarando e estendendo variveis
Se voc leu as sees anteriores, agora sabe um pouco sobre variveis
e tipos de dados. Nesta seo, voc descobre como declarar uma
varivel como determinado tipo de dados.
Se voc no declarar o tipo de dados em uma varivel que usar em uma
rotina VBA, o VBA usa o tipo de dados padro: Variant. Dados armazenados como uma variante agem como um camaleo: eles mudam
dependendo do que voc fizer com eles. Por exemplo, se uma varivel
for um tipo de dados Variant e contiver uma string de texto que se
C
U
I
D
A
D
O!
ExcelVBABokks.indb 99 15/02/2013 13:59:27
100 Parte III: Conceitos de Programao
parece com um nmero (tal como 143), voc pode usar essa varivel
tanto como uma string quanto como um nmero calculvel. Automaticamente, o VBA lida com a converso. Deixar que o VBA lide com os
tipos de dados pode parecer uma sada fcil mas lembre-se de que
voc sacrifica a velocidade e a memria.
Antes de usar variveis em um procedimento, uma excelente ideia
declarar as suas variveis isto , informar ao VBA o tipo de dados de
cada varivel. Declarar as suas variveis faz o seu programa rodar mais
depressa e usar a memria com mais eficincia. O tipo de dados padro,
Variant, leva o VBA a executar repetidamente verificaes demoradas e
reserva mais memria do que necessrio. Se o VBA conhecer o tipo de
dados de uma varivel, ele no precisa investigar nada e pode reservar
memria suficiente apenas para armazenar os dados.
Para impor a si mesmo a tarefa de declarar todas as variveis que usa,
inclua o seguinte como a primeira declarao em seu mdulo VBA:
Option Explicit
preciso usar Option Explicit apenas uma vez: no incio de seu mdulo,
antes da declarao de quaisquer procedimentos no mdulo. Tenha em
mente que a declarao Option Explicit s se aplica ao mdulo no qual
ela reside. Se voc tiver mais que um mdulo VBA em um projeto,
precisa incluir essa declarao em cada mdulo.
Imagine que voc usa uma varivel no declarada (isto , uma Variant)
chamada CurrentRate. Em algum lugar em sua rotina, voc insere a
seguinte declarao:
CurentRate = .075
Esta varivel possui um erro ortogrfico, e provavelmente levar a sua
rotina a resultados incorretos. Se voc usar Option Explicit no incio do
seu mdulo (forando voc a declarar a varivel Current Rate), o Excel
gera um erro se ele encontrar algum erro de grafia naquela varivel.

Para garantir que a declarao Option Explicit entre automaticamente


quando voc inserir um novo mdulo VBA, ative a opo Requerer
Definio de Varivel. Voc a encontrar na guia Editor da caixa de
dilogo Opes (no VBE, escolha FerramentasOpes. Enfaticamente
eu recomendo fazer isso.
Declarar as suas variveis tambm permite que voc usufrua vantagens de
um atalho que pode poupar alguma digitao. Digite apenas os dois ou trs
primeiros caracteres do nome da varivel e depois pressione Ctrl+Space. O
VBE ou completar a entrada para voc ou se a escolha for ambgua
exibir uma lista de palavras para seleo. Na verdade, essa dica
tambm funciona com palavras reservadas e com funes.
L
E
M
B
R
E
-SE
D
I
C
A
D
I
C
A
ExcelVBABokks.indb 100 15/02/2013 13:59:27
101 Captulo 7: Elementos Essenciais da Linguagem VBA
Agora voc conhece as vantagens de declarar variveis, mas como fazer
isso? A maneira mais comum usar uma declarao Dim. Eis alguns
exemplos de variveis sendo declaradas:
Dim YourName As String
Dim AmountDue As Double
Dim RowNumber As Long
Dim X
As primeiras trs variveis so declaradas como tipo especfico de
dados. A ltima, X, no declarada como um tipo especfico de dados,
portanto, ela tratada como uma Variant (ela pode ser qualquer coisa).
Alm de Dim, o VBA tem trs outras palavras chave que so usadas
para declarar variveis:
5 Static
5 Public
5 Private
Eu explico mais sobre as palavras chave Dim, Static, Public e Private
mais adiante. Primeiro, preciso abordar dois tpicos que so relevantes
agora: o escopo de uma varivel e a vida de uma varivel.
Lembre-se de que uma pasta de trabalho pode ter qualquer quantidade
de mdulos VBA. E um mdulo VBA pode ter qualquer quantidade de
procedimentos Sub e Function. O escopo de uma varivel determina
quais mdulos e procedimentos podem usar a varivel. A Tabela 7-2
descreve os escopos em detalhes.
Confuso? Continue virando as pginas e voc ver alguns exemplos que
tornaro essa coisa clara como um cristal.
Tabela 7-2 Escopo da Varivel
Escopo Como a Varivel Declarada
Apenas procedimento Usando uma declarao Dim ou Static no procedimento que usar a varivel
Apenas mdulo Usando uma declarao Dim ou Private antes da primeira declarao Sub ou Function no mdulo
Todos os procedimentos Usando uma declarao Public antes da primeira

em todos os mdulos declarao Sub ou Function em um mdulo


ExcelVBABokks.indb 101 15/02/2013 13:59:27
102 Parte III: Conceitos de Programao
Tpicos como variveis, tipos de dados, declaraes e escopo podem ser bem montonos.
Assim, eu reuni algumas declaraes meio humorsticas para a sua diverso. Estas so todas declaraes vlidas:
Dim King As String, Kong As Long
Dim Mouthful as Byte
Dim Julian As Boolean
Dim Unmarried As Single
Dim Trouble As Double
Dim WindingRoad As Long
Dim Blind As Date
Public Nuisance
Private FirstClass
Static Cling, Electricity
Dim BaseballCards As New Collection
Dim DentalFloss As String
Provavelmente, voc pode encontrar algumas outras.
Declaraes humorsticas
Variveis apenas de procedimento
O nvel mais baixo de escopo de uma varivel est no nvel de procedimento (um procedimento Sub ou Function). Variveis declaradas com
esse escopo s podem ser usadas no procedimento em que elas so
declaradas. Quando o procedimento terminar, a varivel no existe
mais (ela vai para o grande buqu no cu), e o Excel libera a sua
memria. Se voc executar novamente o procedimento, a varivel
revive, mas o seu valor anterior perdido.
Uma maneira mais comum de declarar uma varivel apenas de procedimento com uma declarao Dim. Dim no se refere capacidade
mental dos designers de VBA. Ao contrrio, trata-se de um antigo termo
de programao que o diminuitivo de dimenso, significando apenas
que voc est alocando memria para uma varivel em especial.
Geralmente, voc coloca declaraes Dim logo depois da declarao
Sub ou Function e antes do cdigo do procedimento.
O seguinte exemplo mostra algumas variveis apenas de procedimento,
declaradas usando declaraes Dim:
Sub MySub()
Dim x As Integer
Dim First As Long
Dim InterestRate As Single
Dim TodaysDate As Date
Dim UserName As String
Dim MyValue

... [O cdigo entra aqui] ...


End Sub
ExcelVBABokks.indb 102 15/02/2013 13:59:28
103 Captulo 7: Elementos Essenciais da Linguagem VBA
Observe que a ltima declarao Dim no exemplo anterior no declara
o tipo de dados; ela declara apenas a prpria varivel. O efeito que a
varivel MyValue uma Variant.
A propsito, tambm possvel declarar diversas variveis com uma
nica declarao Dim, como no exemplo a seguir:
Dim x As Integer, y As Integer, z As Integer
Dim First As Long, Last As Double
Diferente de algumas linguagens, VBA no permite que voc declare um
grupo de variveis para ser um tipo especial de dados, separando as
variveis com vrgulas. Por exemplo, ainda que vlida, a seguinte
declarao no declara todas as variveis como Integers (inteiros):
Dim i, j, k As Integer

Neste exemplo, apenas k declarado como um Inteiro; as outras


variveis so declaradas como Variant.
Se voc declara uma varivel com escopo apenas de procedimento,
outros procedimentos no mesmo mdulo podem usar o mesmo nome
da varivel, porm, cada cpia da varivel nica para o seu prprio
procedimento. Normalmente, as variveis declaradas ao nvel de
procedimento so as mais eficientes, pois VBA libera a memria que
elas usam quando o procedimento termina.
Variveis apenas para mdulo
s vezes, voc quer que uma varivel esteja disponvel a todos os
procedimentos em um mdulo. Sendo assim, declare apenas a varivel
(usando Dim ou Private) antes da primeira declarao Sub ou Funo
do mdulo fora de quaisquer procedimentos. Isso feito na seo
Declarao, no incio de seu mdulo ( tambm onde a declarao
Option Explicit est localizada). A Figura 7-1 mostra como voc sabe
quando est trabalhando com a seo Declarao.
C
U
I
D
A
D
O!
Figura 7-1:
Cada mdulo
VBA tem
uma seo
Declaraes, que
aparece
antes de
quaisquer
procedimentos Sub ou
Function.
ExcelVBABokks.indb 103 15/02/2013 13:59:28
104 Parte III: Conceitos de Programao
Como um exemplo, suponha que voc queira declarar a varivel
CurrentValue para que ela esteja disponvel a todos os procedimentos
em seu mdulo. Tudo o que preciso fazer usar a declarao Dim na
seo Declaraes:
Dim CurrentValue As Integer
Com essa declarao no lugar apropriado, a varivel CurrentValue pode
ser usada a partir de qualquer outro procedimento dentro do mdulo e
ela retm o seu valor de um procedimento para outro.
Variveis Pblicas
Se voc precisa tornar essa varivel disponvel para todos os procedimentos em todos os mdulos VBA de uma pasta de trabalho, declare
essa varivel no nvel do mdulo (na seo Declarao) usando a
palavra-chave Public. Aqui est um exemplo:
Public CurrentRate As Long
A palavra-chave Public disponibiliza a varivel CurrentRate a qualquer
procedimento na pasta de trabalho mesmo aqueles presentes em
outros mdulos VBA. preciso inserir essa declarao antes da primeira declarao Sub ou Function em um mdulo.
Se voc quiser que uma varivel esteja disponvel para mdulos em
outras pastas de trabalho, preciso declarar a varivel como pblica e
estabelecer uma referncia pasta de trabalho que contm a declarao de varivel. Configure uma referncia usando o comando do VBE
Ferramentas Referncias. Na prtica, dificilmente feito o comparti-

lhamento de uma varivel por pastas de trabalho. Na verdade, eu nunca


fiz isso em toda a minha carreira de programao em VBA. Mas imagino
que seja bom saber como isso pode ser feito, no caso de surgir uma
situao de risco.
Variveis Estticas
Geralmente, quando um procedimento termina, todas as variveis do
procedimento so restabelecidas. Static variables so um caso especial,
pois elas retm seus valores mesmo quando o procedimento termina. Voc
declara uma varivel esttica ao nvel de procedimento. Uma varivel
esttica pode ser til se voc precisar rastrear a quantidade de vezes que
executa um procedimento. possvel declarar uma varivel esttica e
aument-la cada vez que executar o procedimento.
Como mostrado no exemplo a seguir, variveis estticas so declaradas
usando a palavra chave Static:
Sub MySub()
Static Counter As Integer
Dim Msg As String
Counter = Counter + 1
Msg = Nmeros de execues: & Counter
MsgBox Msg
End Sub
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 104 15/02/2013 13:59:28
105 Captulo 7: Elementos Essenciais da Linguagem VBA
O cdigo controla a quantidade de vezes em que o procedimento foi
executado. O valor da varivel Counter (contador) no redefinido
quando o procedimento termina, mas quando voc fecha e reabre a
pasta de trabalho.
Ainda que o valor de uma varivel declarada como esttica seja retido
depois da varivel terminar, aquela varivel fica indisponvel a outros
procedimentos. No exemplo anterior de procedimento, MySub, a varivel
Counter e o seu valor s esto disponveis dentro do procedimento
MySub. Em outras palavras, ela uma varivel ao nvel de procedimento.
Durao das variveis
Nada dura para sempre, inclusive variveis. O escopo de uma varivel
no apenas determina onde aquela varivel pode ser usada, mas tambm
afeta em quais circunstncias a varivel removida da memria.
Voc pode remover todas as variveis da memria usando trs mtodos:
5 Clique o boto Redefinir na barra de ferramentas (o pequeno
boto quadrado azul na barra de ferramentas padro do VBE).
5 Clique Terminar quando aparecer uma caixa de dilogo com
uma mensagem de erro em tempo de execuo.
5 Inclua uma declarao End em qualquer lugar de seu cdigo. Isso
no o mesmo que uma declarao End Sub ou End Function.
Caso contrrio, apenas variveis ao nvel de procedimento sero removi-

das da memria quando o cdigo de macro tiver concludo a execuo.


Variveis estticas, variveis ao nvel de mdulo e variveis globais
(pblicas), todas retm seus valores durante a execuo de seu cdigo.
Se voc usa variveis ao nvel de mdulo ou ao nvel global, assegure-se
de que elas tenham o valor que voc espera que tenham. Nunca se sabe
se uma das situaes que acabei de mencionar pode ter levado as suas
variveis a perder seu contedo!
Trabalhando com constantes
O valor de uma varivel pode mudar (e normalmente muda) enquanto o
seu procedimento est em execuo. Por isso que ela chamada de
varivel. s vezes, voc precisa fazer referncia a um valor ou string
que nunca muda. Nesse caso, voc precisa de uma constante um
elemento nomeado cujo valor no muda.
Conforme mostrado nos seguintes exemplos, constantes so declaradas
usando a declarao Const. A declarao afirmativa tambm d
constante o seu valor.
Const NumQuarters As Integer = 4
Const Rate = .0725, Period = 12
Const ModName As String = Budget Macros
Public Const AppName As String = Budget Application
C
U
I
D
A
D
O!
C
U
I
D
A
D
O!
ExcelVBABokks.indb 105 15/02/2013 13:59:28
106 Parte III: Conceitos de Programao
Usar constantes no lugar de valores ou strings bem codificados uma
tima prtica de programao. Por exemplo, se o seu procedimento
precisar fazer referncia, repetidamente, a um valor especfico (tal
como uma taxa de juros), melhor declarar o valor como uma constante e fazer referncia ao seu nome, ao invs do valor. Isso torna o seu
cdigo mais legvel e mais fcil de alterar. Quando a taxa de juros
mudar, voc s precisar mudar uma declarao, ao invs de vrias.
Como as variveis, as constantes tm um escopo. Tenha o seguinte em mente:
5 Para disponibilizar uma constante apenas dentro de um nico
procedimento, declare a constante depois da declarao do
procedimento Sub ou Function.
5 Para tornar a constante disponvel a todos os procedimentos
em um mdulo, declare a constante na seo Declarao para o
mdulo.
5 Para tornar uma constante disponvel a todos os mdulos na
pasta de trabalho, use a palavra chave Public e declare a
constante na seo Declarao de qualquer mdulo.
Se voc tentar alterar o valor de uma constante em uma rotina VBA,
obter um erro. Isso no muito surpreendente, pois uma constante
uma constante. Diferente de uma varivel, o valor de uma constante no
varia. Se precisar alterar o valor de uma constante enquanto o seu cdigo
estiver rodando, o que voc precisa, realmente, de uma varivel.
Constantes pr-fabricadas
O Excel e o VBA contm muitas constantes pr-definidas, as quais podem

ser usadas sem que voc precise declar-las. Normalmente, o gravador


de macro usa constantes ao invs de valores atuais. Em geral, voc no
precisa saber o valor dessas constantes para us-las. O simples procedimento a seguir usa a constante integrada xlCalculationManual, para
mudar a propriedade Calculation do objeto Application (em outras
palavras, isso muda o modo de recalcular do Excel para manual).
Sub CalcManual()
Application.Calculation = xlCalculationManual
End Sub
Eu descobri a constante xlCalculationManual gravando uma macro
enquanto eu alterava o modo de clculo. Eu tambm poderia ter olhado
no sistema de Ajuda. A Figura 7-2 exibe a tela de Ajuda que relaciona as
constantes para a propriedade Clculo.
O valor atual da constante xlCalculationManual integrada -4135. Obviamente, mais fcil usar o nome da constante do que tentar lembrar um
nmero to estranho. A propsito, a constante para mudar para o modo
automtico de clculo xlCalculationAutomatic; o seu valor -4105. Como
possvel ver, muitas das constantes integradas so apenas nmeros
arbitrrios que tm significado especial no VBA.
D
I
C
A
L
E
M
B
R
E
-SE
Figura 7-2:
Constantes
que
determinam
o modo
Calculation.
ExcelVBABokks.indb 106 15/02/2013 13:59:29
107 Captulo 7: Elementos Essenciais da Linguagem VBA
Para encontrar o valor atual de uma constante integrada, use a janela
Verificao Imediata no VBE e execute uma declarao VBA, tal como a
seguinte:
? xlCalculationAutomatic
Se a janela de Verificao Imediata no estiver visvel, clique Ctrl+G. O
ponto de interrogao uma forma de abreviar a instruo Print.
Trabalhando com strings
O Excel pode trabalhar tanto com nmeros quanto com texto, portanto,
no de surpreender que o VBA tenha esse mesmo poder. Geralmente,
um texto referenciado como uma string (sequncia de caracteres).
Voc pode trabalhar em VBA com dois tipos de strings:
5 Strings de extenso fixa so declaradas com uma quantidade
especfica de caracteres. A extenso mxima de 65.526 caracteres.
Isso um monte de caracteres! Como comparao, este captulo
contm cerca da metade desses caracteres.
5 Strings de extenso varivel teoricamente podem conter dois
bilhes de caracteres. Se voc digitar cinco caracteres por
segundo, levaria 760 dias para atingir dois bilhes de caracteres
supondo que voc no faa pausa para comer ou dormir.
Ao declarar uma string varivel com uma declarao Dim, voc pode
especificar a extenso mxima, se conhec-la (ela uma string de
extenso fixa) ou deixar que o VBA cuide dela dinamicamente (uma

string de extenso varivel). O exemplo a seguir declara a varivel


MyString como uma string com um comprimento mximo de 50 caracteres (use um asterisco para especificar a quantidade de caracteres, at o
limite de 65.526 caracteres). YourString tambm declarada como uma
string, mas o seu comprimento no especificado:
Dim MyString As String * 50
Dim YourString As String
D
I
C
A
ExcelVBABokks.indb 107 15/02/2013 13:59:29
108 Parte III: Conceitos de Programao
Ao declarar uma string de extenso fixa, no use uma vrgula no nmero
que especifica o tamanho da string. Na verdade, nunca use vrgulas ao
entrar com um nmero de valor em VBA. O VBA no gosta disso.
Trabalhando com datas
Um outro tipo de dados que voc pode julgar til Date. possvel
usar uma string varivel para armazenar datas, mas, voc no pode
realizar clculos com datas. Usar esse tipo de dados lhe oferece rotinas
flexveis. Por exemplo, voc pode calcular o nmero de dias entre duas
datas, o que seria impossvel se voc usasse strings para conter as suas
datas.
Uma varivel definida como Date pode conter datas variando de 1 de
Janeiro de 0100 a 31 de Dezembro de 9999. Isso uma expanso de
quase 10.000 anos e mais do que o suficiente at mesmo para a previso
financeira mais agressiva. Voc tambm pode usar o tipo de dados Date
para trabalhar com dados de horrio (vendo como falta um tipo de
dados de horrio em VBA).
Estes exemplos declaram variveis e constantes como um tipo de
dados Date:
Dim Today As Date
Dim StartTime As Date
Const FirstDay As Date = #1/1/2010
Const Noon = #12:00:00#
No VBA, coloque datas e horrios entre duas marcas de cerquilha,
conforme mostrado nos exemplos anteriores.
Variveis Date exibem datas de acordo com o formato de data do seu
sistema e elas exibem os horrios conforme o formato de horrio do
sistema (seja formatao de 12 ou 24 horas). O Registro do Windows
armazena essas configuraes e voc pode modific-las atravs da
caixa de dilogo Opes Regionais e de Idioma no Painel de Controle do
Windows. Portanto, o formato de data ou horrio exibido pelo VBA
pode variar, dependendo das configuraes do sistema no qual o
aplicativo est rodando.
No entanto, ao escrever cdigo VBA, voc precisa usar um dos formatos de data norte-americano (tal como mm/dd/yyyy). Assim, a declarao a seguir designa um dia de outubro varivel MyDate (mesmo se o
seu sistema estiver configurado para usar dd/mm/aaaa para datas):
MyDate = #10/11/2009#
Quando voc exibe a varivel (com a funo MsgBox, por exemplo),
VBA mostra MyDate usando as suas configuraes de sistema. Portanto, se o seu sistema usar o formato de data dd/mm/aaaa, MyDate
exibir como 11/10/2009.
C
U
I
D
A
D

O!
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 108 15/02/2013 13:59:29
109 Captulo 7: Elementos Essenciais da Linguagem VBA
Usando Declaraes de Atribuio
Uma declarao de atribuio uma declarao VBA que atribui o
resultado de uma expresso a uma varivel ou a um objeto. O sistema
de Ajuda do Excel define o termo expresso como
uma combinao de palavras-chave, operadores, variveis e
constantes que produzem uma string, nmero ou objeto. Uma
expresso pode ser usada para executar um clculo, manipular
caracteres ou testar dados.
Eu no teria dito isso melhor, portanto nem ao menos tento.
Muito do seu trabalho em VBA envolve o desenvolvimento (ou depurao) de expresses. Se voc souber como criar frmulas em Excel, no
ter problemas para criar expresses. Com uma frmula da planilha, o
Excel exibe o resultado em uma clula. Por outro lado, uma expresso
VBA pode ser atribuda a uma varivel.
Exemplos de declarao de atribuio
Nos exemplos de declarao de atribuio a seguir, as expresses esto
direita do sinal de igual:
x = 1
x = x + 1
x = (y * 2) / (z * 2)
HouseCost = 375000
FileOpen = True
Range(TheYear).Value = 2012
Expresses podem ser to complexas quanto voc precisa que elas
sejam: Use o caractere de continuao de linha (um espao seguido por
um sublinhado) para facilitar a leitura de expresses mais longas.
Geralmente, expresses usam funes: funes integradas do VBA,
funes de planilha do Excel ou funes que voc desenvolve com VBA.
Eu discuto funes no Captulo 9.
Sobre aquele sinal de igual
Como pode ser visto no exemplo anterior, VBA usa o sinal de igual
como seu operador de atribuio. Provavelmente, voc est habituado
D
I
C
A
ExcelVBABokks.indb 109 15/02/2013 13:59:29
110 Parte III: Conceitos de Programao
a usar um sinal de igual como um smbolo matemtico de igualdade.
Portanto, uma atribuio de declarao como a seguinte pode lev-lo a
erguer suas sobrancelhas:
z = z + 1
Como a varivel z pode ser igual a si mesma mais 1? Resposta: No
pode. Nesse caso, a declarao de atribuio aumenta o valor de z por
1. Lembre-se apenas que uma atribuio usa o sinal de igual como um
operador, no um smbolo de igualdade.
Operadores regulares
Os operadores exercem uma importante funo em VBA. Alm do operador de sinal de igual (discutido na seo anterior), o VBA oferece vrios
outros operadores. A Tabela 7-3 relaciona esses operadores, com os quais

voc est familiarizado pela sua experincia em frmulas de planilha.


Tabela 7-3 Operadores do VBA
Funo Smbolo do Operador
Adio +
Multiplicao *
Diviso /
Subtrao Exponenciao ^
Concatenao de string &
Diviso de inteiro (o resultado sempre um inteiro) \
Mdulo aritmtico (retorna o resto de uma operao Mod
de diviso)
O termo concatenao conversa de programador para juntar. Assim,
se voc concatena strings, est combinando strings para formar uma
nova e aperfeioada string.
Conforme mostrado na Tabela 7-4, VBA tambm oferece um conjunto
completo de operadores lgicos. Para detalhes completos, consulte o
sistema de Ajuda.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 110 15/02/2013 13:59:30
111 Captulo 7: Elementos Essenciais da Linguagem VBA
Tabela 7-4 Operadores Lgicos do VBA
Operador O que ele faz
Not Executa uma negao lgica em uma expresso.
And Executa uma combinao lgica em duas expresses.
Or Executa uma separao em duas expresses.
XoR Executa uma excluso em duas expresses.
Eqv Executa uma equivalncia lgica em duas expresses.
Imp Executa uma implicao lgica em duas expresses.
A ordem de prioridade para operadores em VBA exatamente a mesma
que em frmulas do Excel. A exponenciao tem a maior prioridade. A
multiplicao e a diviso vm em seguida e, depois, vm a adio e
subtrao. Voc pode usar parnteses para alterar a ordem natural de
prioridade, colocando entre parnteses o que vier antes de qualquer
operador. D uma olhada nesse cdigo:
x = 3
y = 2
z = x + 5 * y
Quando este cdigo executado, qual o valor de z? Se voc respondeu 13, vai receber uma medalha de ouro, provando que voc entende
o conceito de prioridade do operador. Se voc respondeu 16, leia isto: o
operador de multiplicao (5*y) executado primeiro e o seu resultado
somado com x. Se voc respondeu alguma outra coisa diferente de 13
ou 16, eu no tenho comentrios.
A propsito, eu nunca consigo lembrar como funciona a prioridade de

operador, portanto, tenho a tendncia de usar parnteses mesmo


quando eles no so exigidos. Por exemplo, na vida real eu escreveria
aquela ltima declarao de atribuio assim:
z = x + (5 * y)
No se acanhe em usar parnteses mesmo que eles no sejam exigidos
especialmente porque se voc fizer isso o seu cdigo ficar mais fcil
de entender. O VBA no se importa se voc usa parnteses extras.
D
I
C
A
ExcelVBABokks.indb 111 15/02/2013 13:59:30
112 Parte III: Conceitos de Programao
Trabalhando com Arrays
A maioria das linguagens de programao suporta arrays (matrizes). Um
array um grupo de variveis que compartilha um nome comum. Voc
faz referncia a uma varivel especfica no array, usando o nome do array
e um nmero de ndice entre parnteses. Por exemplo, possvel definir
um array de 12 strings variveis para conter os nomes dos meses do ano.
Se voc nomear o array como MonthNames, pode se referir ao primeiro
elemento do array como MonthNames(1), ao segundo elemento como
MonthNames(2) e assim por diante.
Declarando arrays
Antes de poder usar um array, voc deve declar-lo. Sem expectativas.
Diferente das variveis normais, VBA bem rgido quanto a esta regra.
Voc declara um array com uma declarao Dim ou Public, exatamente
como declara uma varivel regular. No entanto, voc precisa especificar
sempre o nmero de elementos no array. Isso feito especificando o
primeiro nmero de ndice, a palavra chave To e o ltimo nmero de
ndice tudo entre parnteses. O exemplo a seguir mostra como
declarar um array de 100 nmeros inteiros:
Dim MyArray(1 To 100) As Integer
Ao declarar um array, voc pode escolher especificar apenas o ndice
superior. VBA supe que 0 o ndice inferior. Portanto, ambas as
declaraes a seguir indicam o mesmo array de 101 elementos:
Dim MyArray (0 To 100) As Integer
Dim MyArray (100) As Integer
Se voc quer que o VBA aceite que 1 (ao invs de 0) o ndice inferior
em seus arrays, inclua a seguinte declarao na seo Declaraes de
seu mdulo:
Option Base 1
Essa declarao fora o VBA a usar 1 como o primeiro nmero de ndice
em arrays que s declaram o ndice superior. Se essa declarao estiver
presente, as seguintes declaraes so idnticas, ambas declarando um
array de 100 elementos:
Dim MyArray (1 To 100) As Integer
Dim MyArray (100) As Integer
D
I
C
A
ExcelVBABokks.indb 112 15/02/2013 13:59:30
113 Captulo 7: Elementos Essenciais da Linguagem VBA
Arrays multidimensionais
Os arrays criados nos exemplos anteriores so todos unidimensionais.
Pense em um array unidimensional como uma nica linha de valores. Os
arrays que voc cria em VBA podem ter at 60 dimenses ainda que
raramente voc precise de mais do que duas ou trs em um array. O
seguinte exemplo declara um array de 81 inteiros com duas dimenses:
Dim MyArray (1 To 9, 1 To 9) As Integer

Voc pode pensar nesse array como ocupando uma matriz de 9 x 9


perfeito para armazenar todos os nmeros em um enigma sudoku.
Para fazer referncia a um elemento especfico neste array, voc precisa
especificar dois nmeros de ndice (semelhante sua linha e sua
coluna na matriz). O exemplo a seguir mostra como possvel
atribuir um valor a um elemento neste array:
MyArray (3, 4) = 125
Esta declarao atribui um valor a um nico elemento no array. Se voc
pensar no array em termos de uma matriz de 9 x 9, isso designa 125 ao
elemento localizado na terceira fileira e quarta coluna da matriz.
Eis como declarar um array tridimensional com 1.000 elementos:
Dim My3DArray (1 To 10, 1 To 10, 1 To 10) As Integer
Voc pode pensar de um array tridimensional como um cubo. muito
difcil visualizar um array com mais de trs dimenses. Lamento, mas
ainda no consegui administrar a quarta dimenso e alm.
Arrays dinmicos
Voc tambm pode criar arrays dinmicos. Um array dinmico no tem
um nmero pr-ajustado de elementos. Declare um array dinmico com
um conjunto vazio de parnteses:
Dim MyArray () As Integer
Antes de poder usar este array, voc deve usar a declarao ReDim
para informar ao VBA quantos elementos tem o array. Em geral, a
quantidade de elementos no array determinada enquanto o seu
cdigo est rodando. Voc pode usar a declarao ReDim quantas vezes
quiser, trocando o tamanho do array tanto quanto necessrio. O
exemplo a seguir demonstra como alterar o nmero de elementos em
um array dinmico. O exemplo supe que a varivel NumElements
(nmero de elementos) contenha uma varivel que o seu cdigo
calculou.
ExcelVBABokks.indb 113 15/02/2013 13:59:30
114 Parte III: Conceitos de Programao
ReDim MyArray (1 To NumElements)
Quando voc redimensiona um array usando ReDim, voc apaga
quaisquer valores atualmente armazenados nos elementos do array.
possvel evitar destruir os valores antigos usando a palavra-chave
Preserve. O seguinte exemplo mostra como possvel preservar os
valores de um array quando voc o redimensiona:
ReDim Preserve MyArray(1 To NumElements)
Se no momento MyArray tiver dez elementos e voc executar a declarao anterior com NumElements igualando 12, os primeiros dez elementos permanecem intactos, e o array tem espao para dois elementos
adicionais (at o nmero contido na varivel NumElements). Mas, se
NumElements for igual a 7, os primeiros sete elementos so retidos e os
trs elementos restantes so descartados.
O assunto de arrays volta no Captulo 10, quando discuto sobre loop.
Usando Labels (Etiquetas)
Em verses anteriores de BASIC, cada linha de cdigo exigia um nmero
de linha. Por exemplo, se voc tivesse escrito um programa BASIC nos
anos 70 (claro que usando suas calas boca de sino), ela seria parecida
com algo assim:
010: LET X=5
020: LET Y=3
030: LET Z=X*Y
040: PRINT Z
050: END
VBA permite o uso de tais nmeros de linha e permite at mesmo o uso
de rtulos. Tipicamente, voc no usa um rtulo em cada linha, mas
pode, ocasionalmente, precisar usar um rtulo. Por exemplo, insira um
rtulo se usar uma declarao GoTo (que eu discuto no Captulo 10). Um
rtulo deve comear com o primeiro caractere sem espao em uma linha

e terminar com dois pontos.


As informaes neste captulo ficam mais claras medida que voc l
os captulos subsequentes. Se quiser descobrir mais sobre os elementos da linguagem VBA, eu indico o sistema de Ajuda VBA. Voc pode
encontrar tantos detalhes quanto precise ou se preocupe em saber.
C
U
I
D
A
D
O!
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 114 15/02/2013 13:59:30


Neste Captulo
Descobrindo por que objetos Range so to importantes
Como entender as vrias maneiras de fazer referncia a faixas
Descobrindo algumas das propriedades mais teis do objeto Range
Descobrindo alguns dos mtodos mais teis do objeto Range
Trabalhando com
Objetos Range
Captulo 8
N
este captulo, eu vou um pouco mais fundo nos calabouos do
Excel e olho atentamente os objetos Range. O Excel totalmente
voltado s clulas e o objeto Range um continer para clulas. Por
que voc precisa saber tanto sobre objetos Range? Porque, muito do
trabalho de programao que voc faz no Excel, tem como foco os objetos Range. Pode me agradecer mais tarde.
Uma Reviso Rpida
O objeto Range representa uma faixa contida em um objeto Worksheet
(pasta de trabalho). Objetos Range, como todos os outros objetos, tm
propriedades (as quais voc pode examinar e alterar) e mtodos (que
executam aes no objeto).
Um objeto Range pode ser to pequeno quanto uma nica clula (por
exemplo, B4) ou to grande quanto cada uma das 17.179.869.184 clulas
em uma planilha (A1:XFD1048576).
Ao se referir a um objeto Range, o endereo sempre rodeado por
aspas duplas, assim:
Range(A1:C5)
ExcelVBABokks.indb 115 15/02/2013 13:59:30
116 Parte III: Conceitos de Programao
Se a faixa consistir de uma clula, voc ainda precisa das aspas:
Range(K9)
Se acontecer da faixa ter um nome (criado usando Frmulas Nomes
Definidos Definir Nome ), voc pode usar uma expresso como esta:
Range(PriceList)
A menos que voc diga ao Excel o contrrio, qualificando a faixa de
referncia, ele imagina que voc est se referindo a uma faixa na
planilha ativa. Se alguma outra coisa que no seja uma planilha estiver
ativa (tal como um grfico), a faixa de referncia falha e a sua macro
exibe uma mensagem de erro.

Conforme mostrado no seguinte exemplo, possvel referenciar uma


faixa fora da planilha ativa, qualificando a faixa de referncia com um
nome de planilha a partir de uma pasta de trabalho ativa:
Worksheets(Sheet1).Range(A1:C5)
Se voc precisar fazer referncia a uma faixa em uma pasta de trabalho
diferente (isto , qualquer pasta de trabalho que no aquela ativa),
possvel usar uma declarao como esta:
Workbooks("Budget.xlsl).Worksheets(Sheet1). _
Range(A1:C5)
Um objeto Range pode consistir de uma ou mais linhas ou colunas
inteiras. Voc pode fazer referncia a toda uma linha (nesse caso, linha
3), usando uma sintaxe como esta:
Range(3:3)
possvel fazer referncia a uma coluna inteira (coluna 4 neste exemplo)
assim:
Range(D:D)
No Excel, voc seleciona faixas intercaladas, mantendo pressionada a
tecla Ctrl enquanto seleciona vrias faixas com o seu mouse. A Figura
8-1 mostra uma seleo de faixas intercaladas. Voc no ficaria surpreso
ao saber que VBA tambm lhe permite trabalhar com faixas intercaladas (no contnuas). A seguinte expresso refere-se a uma faixa no
contnua de duas reas. Observe que uma vrgula separa as duas reas.
Range(A1:B8,D9:G16)
Esteja ciente de que alguns mtodos e propriedades causam danos a
faixas no contnuas. Voc pode ter que processar cada rea separadamente, usando um loop.
C
U
I
D
A
D
O!
C
U
I
D
A
D
O!
ExcelVBABokks.indb 116 15/02/2013 13:59:31
117 Captulo 8: Trabalhando com Objetos Range
Outras Maneiras de Fazer Referncia
a uma Faixa
Quanto mais voc trabalha com VBA, mais percebe que ele uma
linguagem muito bem concebida e, geralmente, bastante lgica (apesar
do que voc pode estar pensando agora). Com frequncia, o VBA
oferece mltiplas maneiras de executar uma ao. Voc pode escolher o
mtodo mais adequado ao seu problema. Esta seo discute algumas
das formas de fazer referncia a uma faixa.
Este captulo mal toca a superfcie das propriedades e mtodos do
objeto Range. Ao trabalhar com VBA, provavelmente voc precisar
acessar outras propriedades e mtodos. O sistema de Ajuda o melhor
lugar para descobrir a respeito delas, mas tambm uma boa ideia
gravar suas aes e examinar o cdigo que o Excel gerar.
A propriedade Cells
Ao invs de usar a palavra-chave VBA Range, possvel fazer referncia
a uma faixa atravs da propriedade Cells.
Observe que eu escrevi propriedade Cells e no objeto Cells ou mesmo
coleo Cells. Ainda que Cells possa parecer com um objeto (ou com

uma coleo), na verdade no . Ao contrrio, Cell uma propriedade


que o VBA avalia. Depois, o VBA retorna um objeto (mais especificamente, um objeto Range). Se isso parecer estranho, no se preocupe.
At a Microsoft parece estar confusa quanto a essa questo. Em algumas verses anteriores de Excel, a propriedade Cells era conhecida
como o mtodo Cells. Independente do que ela , apenas entenda que
Cells uma maneira jeitosa de fazer referncia a uma faixa.
Figura 8-1:
Uma
seleo
de faixas
intercaladas.
L
E
M
B
R
E
-SE
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 117 15/02/2013 13:59:31
118 Parte III: Conceitos de Programao
A propriedade Cells toma dois argumentos: linha e coluna. Esses dois
argumentos so nmeros, ainda que normalmente nos referimos a
colunas usando letras. Por exemplo, a seguinte expresso refere-se
clula C2 em Sheet2:
Worksheets(Sheet2).Cells(2, 3)
Tambm possvel usar a propriedade Cells para fazer referncia a uma
faixa de mltiplas clulas. O seguinte exemplo demonstra a sintaxe que
voc usa:
Range(Cells(1, 1), Cells(10, 10))
Esta expresso refere-se a uma faixa de clula 100, que se estende da
clula A1 (linha 1, coluna 1) clula J10 (linha 10, coluna 10).
As duas declaraes seguintes produzem o mesmo resultado: elas
entram com um valor de 99 em uma faixa de clulas 10 por 10. Mais
especificamente, essas declaraes configuram a propriedade Value do
objeto Range:
Range(A1:J10).Value = 99
Range(Cells(1, 1), Cells(10, 10)).Value = 99
A vantagem de usar o mtodo Cells para referenciar faixas torna-se
clara quando voc usa variveis ao invs de nmeros como argumentos
de Cells. E as coisas comeam, de fato, a aparecer quando voc entende
sobre loop, que discuto no Captulo 10.
A propriedade Offset

A propriedade Offset oferece outra forma jeitosa de fazer referncia a


clulas. Essa propriedade, a qual opera em um objeto Range e retorna
outro objeto Range, permite que voc faa referncia a uma clula que
est em dado nmero de linhas e colunas distante de outra clula.
Como a propriedade Cells, a propriedade Offset toma dois argumentos.
O primeiro argumento representa o nmero de linhas a deslocar; o
segundo representa o nmero de colunas a deslocar.
A seguinte expresso refere-se a uma clula localizada a uma linha
abaixo e duas colunas direita da clula A1. Em outras palavras, essa
referncia clula geralmente conhecida como C2:
Range(A1).Offset(1, 2)
D
I
C
A
ExcelVBABokks.indb 118 15/02/2013 13:59:32
119 Captulo 8: Trabalhando com Objetos Range
O mtodo Offset tambm pode usar argumentos negativos. Um offset de
linha negativo refere-se a uma linha acima da faixa. Um offset de coluna
negativo refere-se a uma coluna esquerda da faixa. O seguinte exemplo refere-se clula A1:
Range(C2).Offset(-1, -2)
E, como voc poderia esperar, possvel usar 0 como um ou ambos os
argumentos para Offset. A seguinte expresso refere-se clula A1:
Range(A1).Offset(0, 0)
O mtodo Offset mais til quando voc usa variveis ao invs de
valores nos argumentos. No Captulo 10 apresento alguns exemplos
demonstrando isso.
Fazendo referncia a colunas e linhas inteiras
Se voc precisa referenciar uma faixa que consiste de uma ou mais
colunas inteiras, pode usar uma expresso como a seguinte:
Columns(A:C)
E, para fazer referncia a uma ou mais linhas inteiras, use uma expresso assim:
Rows(1:5)
Algumas Propriedades teis
do Objeto Range
Um objeto Range tem dzias de propriedades. Voc pode escrever programas VBA sem parar pelos prximos dez anos e nunca us-las todas.
Descrevo rapidamente algumas das propriedades Range usadas mais
frequentemente. Para mais detalhes, consulte o sistema de Ajuda no VBE.
Algumas propriedades Range so apenas de leitura, significando que
voc pode fazer com que o seu cdigo olhe para os seus valores, mas
no pode fazer com que ele os altere (olhe, mas no toque). Por exemplo, cada objeto Range tem uma propriedade Address que pode conter
o endereo da faixa). Voc pode acessar essa propriedade, mas no
pode alter-la ela apenas de leitura.
A propsito, os exemplos a seguir so tipicamente declaraes ao invs de
procedimentos completos. Se voc quiser experimentar uma delas (o que
deveria fazer), crie um procedimento Sub para faz-lo. Da mesma forma,
muitas dessas declaraes s funcionam adequadamente na planilha ativa.
D
I
C
A
L
E
M
B
R

E
-SE
ExcelVBABokks.indb 119 15/02/2013 13:59:32
120 Parte III: Conceitos de Programao
Eu no estava sendo totalmente sincero
quando escrevi voc pode ler a propriedade Valor apenas em um objeto Range de clula nica. Na verdade, voc pode atribuir
os valores de um intervalo com mltiplas
clulas a uma varivel, desde que a varivel
seja uma variante. Isso porque uma variante
pode agir como um array. Eis um exemplo:
Dim x As Variant
x = Range(A1:C3).Value
Depois, voc pode tratar a varivel x como
se ela fosse um array. Essa declarao, por
exemplo, retorna o valor na clula B1:
MsgBox x(1, 2)
Atribuindo os valores de um intervalo
de clulas a uma varivel
A propriedade Value
A propriedade Value representa o valor contido em uma clula. Ela
uma propriedade de leitura e escrita, portanto, o seu cdigo VBA pode
ler ou alterar o valor.
A seguinte declarao exibe uma caixa de mensagem que exibe o valor
da clula A1 em Sheet1:
MsgBox Worksheets(Sheet1).Range(A1).Value
No entanto voc pode ler a propriedade Value apenas de um objeto
Range de clula nica. Por exemplo, a seguinte declarao gera um erro:
MsgBox Worksheets(Sheet1).Range(A1:C3).Value
Mas, voc tambm pode usar a propriedade Value com uma faixa de
qualquer tamanho. A seguinte declarao entra com o nmero 123 em
cada clula em uma faixa:
Worksheets(Sheet1).Range(A1:C3).Value = 123
Value a propriedade padro em um objeto Range. Em outras palavras,
se voc omitir uma propriedade para o objeto, o Excel usa a sua
propriedade Value. As duas declaraes a seguir atribuem valor 75 para
a clula A1 em Sheet1:
Worksheets(Sheet1).Range(A1).Value = 75
Worksheets(Sheet1).Range(A1) = 75
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
D
I
C
A

ExcelVBABokks.indb 120 15/02/2013 13:59:33


121 Captulo 8: Trabalhando com Objetos Range
A propriedade Text
A propriedade Text retorna uma string que representa o texto conforme
exibido em uma clula o valor formatado. A propriedade Text
apenas de leitura. Por exemplo, suponha que a clula A1 contenha o
valor 12.3 e esteja formatada para exibir dois decimais e um cifro
($12.30). A seguinte declarao exibe uma mensagem:
MsgBox Worksheets(Sheet1).Range(A1).Text
Porm, a prxima declarao exibe uma caixa de mensagem contendo
12.3:
MsgBox Worksheets(Sheet1).Range(A1).Value
Se a clula contm uma frmula, a propriedade Text retorna o resultado
da frmula. Se uma clula contiver texto, ento a propriedade Text e a
propriedade Value sempre retornaro a mesma coisa, pois texto (diferente
de um nmero) no pode ser formatado para ser exibido diferentemente.
A propriedade Count
A propriedade Count retorna quantidade de clulas de uma faixa. Ela
conta todas as clulas, no apenas as clulas que no esto em branco.
Count uma propriedade apenas de leitura (pense nisso por um
segundo e entender o motivo). A seguinte declarao encaminha uma
propriedade Count da faixa e exibe o resultado (9) em uma caixa de
mensagem:
MsgBox Range(A1:C3).Count
As propriedades Column e Row
A propriedade Column retorna o nmero da coluna de uma faixa de
clula nica. Ela amiga ntima da propriedade Row, que retorna o
nmero da linha de uma faixa de clula nica. Ambas as propriedades
so apenas de leitura. Por exemplo, o resultado da seguinte declarao
6, pois a clula F3 est na sexta coluna:
MsgBox Sheets(Sheet1).Range(F3).Column
A prxima expresso resulta em 3, porque a clula F3 est na terceira linha:
MsgBox Sheets(Sheet1).Range(F3).Row
ExcelVBABokks.indb 121 15/02/2013 13:59:33
122 Parte III: Conceitos de Programao
Se o objeto Range consistir de mais de uma clula, a propriedade Column
retorna o nmero da primeira coluna na faixa, e a propriedade Row
retorna o nmero da primeira linha na faixa.
No confunda as propriedades Column e Row com as propriedades
Columns e Rows (discutidas anteriormente neste captulo). As propriedades Column e Row retornam um nico valor. As propriedades
Columns e Rows retornam um objeto Range. Que diferena um s faz.
A propriedade Address
Address uma propriedade apenas de leitura, exibe o endereo de clula
para um objeto Range com notao absoluta (um cifro antes da letra
da coluna e antes do nmero da linha). A declarao a seguir exibe a
caixa de mensagem mostrada na Figura 8-2.
MsgBox Range(Cells(1, 1), Cells(5, 5)).Address
A propriedade HasFormula
A propriedade HasFormula (que apenas de leitura) retorna True se a
faixa de clula nica contiver uma frmula. Ela retorna False se a clula
no tiver uma frmula. Se a faixa consistir em mais de uma clula, o VBA
s retorna True se todas as clulas da faixa contiver uma frmula ou
retorna False se nenhuma clula da faixa contiver uma frmula. A
propriedade retorna um Null (nulo) caso se apenas uma parte das clulas
contenha frmulas na faixa. Null uma espcie de terra de ningum: a
faixa contm uma mistura de frmulas e valores.
Voc precisa, ter cuidado ao trabalhar com propriedades que podem
retornar Null. Mais especificamente, o nico tipo de dados que pode
lidar com Null Variant.

Por exemplo, suponha que a clula A1 contenha um valor e a clula


A2 contenha uma frmula. As seguintes declaraes geram um erro,
porque a faixa no possui frmulas em todas ou em nenhuma de
suas clulas:
L
E
M
B
R
E
-SE
C
U
I
D
A
D
O!
Figura 8-2:
Esta caixa
de mensagem exibe a
propriedade
Address de
uma faixa de
1 por 5.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 122 15/02/2013 13:59:33
123 Captulo 8: Trabalhando com Objetos Range
Dim FormulaTest As Boolean
FormulaTest = Range(A1:A2).HasFormula
O tipo de dados Boolean s pode lidar com True ou False. Null leva-o a
reclamar e responder com uma mensagem de erro. Para corrigir esse
tipo de situao, a melhor coisa a fazer garantir que a varivel FormulaTest seja declarada como Variant, ao invs de Boolean. O exemplo a
seguir usa convenientemente a funo TypeName (digitar nome) do VBA
(juntamente com uma declarao If-Then) para determinar o tipo de
dados da varivel FormulaTest. Se a faixa misturar frmulas e valores, a
caixa de mensagem exibe Mixed! (misturado).
Dim FormulaTest As Variant
FormulaTest = Range(A1:A2).HasFormula
If TypeName(FormulaTest) = Null Then MsgBox Mixed!
A propriedade Font
Como anteriormente mencionado neste captulo (veja A propriedade
Cells), uma propriedade pode retornar um objeto. A propriedade Font
de um objeto Range um outro exemplo daquele conceito em operao. A propriedade Font retorna um objeto Font.
Como seria esperado, um objeto Font tem muitas propriedades acessveis.
Para alterar alguns aspecto, de uma fonte da faixa, primeiro voc precisa
acessar o objeto Font da faixa e depois, manipular as propriedades daquele
objeto. Isso pode ser confuso, mas talvez o exemplo a seguir ajude.
A seguinte declarao usa a propriedade Font do objeto Range para
retornar um objeto Font. Depois, a propriedade Bold do objeto Font
configurada para True. Em ingls puro, isso faz o contedo da clula ser

exibido em negrito:
Range(A1).Font.Bold = True
A verdade que voc no precisa, de fato, saber que est trabalhando
com um objeto Font que est contido em um objeto Range. Desde que
use a sintaxe apropriada, ela funcionar bem. Com frequncia, gravar as
suas aes enquanto voc grava uma macro o deixar informado sobre
tudo o que precisa saber sobre a sintaxe certa.
Para mais informaes sobre gravao de macros, veja o Captulo 6.
A propriedade Interior
Eis um outro exemplo de uma propriedade que retorna um objeto. A
propriedade Interior do objeto Range retorna um objeto Interior (nome
estranho, mas assim que ele chamado). Esse tipo de objeto de
referncia funciona da mesma maneira que a propriedade Font (a qual
descrevi na seo anterior).
ExcelVBABokks.indb 123 15/02/2013 13:59:34
124 Parte III: Conceitos de Programao
Por exemplo, a declarao a seguir muda a propriedade Color do objeto
Interior contido no objeto Range:
Range(A1).Interior.Color = 8421504
Em outras palavras, esta declarao muda o fundo da clula para cinza
mdio. O que isso? Voc no sabia que 8421504 cinza mdio? Devido
a alguma perspiccia no maravilhoso mundo das cores do Excel, leia o
artigo Um rpido e sujo resumo sobre as cores na prxima pgina.
A propriedade Formula
A propriedade Formula representa a frmula em uma clula. Essa uma
propriedade de leitura e escrita, portanto, voc pode acess-la para
inserir uma frmula em uma clula. Por exemplo, a seguinte declarao
entra com uma frmula SUM na clula A13:
Range(A13).Formula = =SUM(A1:A12)
Veja que a frmula uma string de texto e est entre aspas.
Se a frmula, tiver ela mesma, aspas, as coisas ficam um pouco mais
ardilosas. Por exemplo, digamos que voc quer inserir esta frmula
usando VBA:
=SUM(A1:A12)& Stores
Esta frmula exibe um valor, seguido pela palavra Stores. Para tornar
esta frmula aceitvel, preciso substituir cada aspa na frmula por
duas aspas. Caso contrrio, o VBA ficar confuso e responder com o
aviso de um erro de sintaxe (porque h!). Assim, eis uma declarao
que entrar com uma frmula que contm aspas:
Range(A13).Formula = =SUM(A1:A12)& Stores
A propsito, possvel acessar a propriedade Formula de uma clula
mesmo que a clula no tenha uma frmula. Se uma clula no tem
frmula, a propriedade Formula retorna o mesmo que sua propriedade
Value.
Se voc precisar saber quando uma clula tem frmula, use a propriedade HasFormula.
Esteja atento ao fato de que o VBA fala ingls norte-americano. Isso
significa que para colocar uma frmula em uma clula, voc precisa
usar a sintaxe norte-americana. Para usar a sua prpria sintaxe de
frmula local em VBA, verifique a propriedade FormulaLocal.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 124 15/02/2013 13:59:34
125 Captulo 8: Trabalhando com Objetos Range
Antes do Excel 2007, a Microsoft tentou nos convencer de que 56 core

s eram suficientes
para uma planilha bsica. Mas, as coisas mudaram e podemos usar mais
e
cores em uma pasta de trabalho, 16.777.216 cores, para ser exato.
Muitos objetos tm uma propriedade Color e essa propriedade
es de cor que
variam de 0 a 16777215. Ningum pode se lembrar de tantos valores de
elizmente) h uma maneira mais fcil de especificar cores: use a funo RGB

de 16 milhes d
aceita valor
cor, assim (f
(Red-Green-Blue) do

VBA. Essa funo tem a vantagem de que qualquer dessas 16 milhes de cores pode ser
representada por vrios nveis de vermelho, verde e azul. Os trs argumento
s na funo
RGB correspondem aos componentes das cores vermelho, verde e azul, e cada um des
ses
argumentos pode variar de 0 a 255.
Observe que 256 x 256 = 16.777.216 que por acaso a quantidade de
cores. Voc no
adora quando a matemtica funciona?
A seguir, esto alguns exemplos que usam a funo RGB para mudar a cor de fundo de uma
clula:
Range(A1).Interior.Color = RGB(9, 0, 0) black
Range(A1).Interior.Color = RGB(255, 0, 0) pure red
Range(A1).Interior.Color = RGB(0, 0, 255) pure blue
Range(A1).Interior.Color = RGB(200, 89, 18) orangy-brown
Range(A1).Interior.Color = RGB(128, 126, 128) middle gray
Se voc quiser usar cores padro, optar por usar uma das cores constante
s integradas:
vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan ou vbWhite. Por exe
mplo,
a seguinte declarao torna amarela a clula A1:
Range(A1).Interior.Color = vbYellow
O Excel 2007 tambm introduziu cores de tema. Essas so cores que aparecem quando voc
usa o controle de cor, tal como o controle Fill Color (preencher com cor) no gru
po Font da guia
Pgina Inicial. Experimente gravar uma macro enquanto muda cores e voc r
eceber algo
assim:
Range(A1).Interior.ThemeColor = xlThemeColorAccent4
Range(A1).Interior.TintAndShade = 0.399975585192419
, mais duas propriedades referentes a cor para lidar. Aqui, temos uma cor de tema
(a cor
bsica, especificada como uma constante integrada), mais um valor tint and shade (ma
tiz
e tonalidade) que representa quo escura ou clara a cor. Valores TintAndShade vari
am de
-1.0 a +1.0. Valores positivos da propriedade TintAndShade tornam a cor mais cla
ra e valores negativos tornam a cor mais escura. Quando voc ajusta uma cor usando a propri
edade
ThemeColor, a cor mudar se voc aplicar um documento de tema diferente (usando o co
mando Layout da Pgina Temas Temas).
Um rpido e sujo resumo sobre as cores
A propriedade NumberFormat
A propriedade NumberFormat representa o formato do nmero (expresso como uma string de texto) do objeto Range. Essa uma propriedade
de leitura e escrita, assim, o seu cdigo VBA pode mudar o formato do
ExcelVBABokks.indb 125 15/02/2013 13:59:34

126 Parte III: Conceitos de Programao


nmero. A declarao a seguir altera o formato do nmero da coluna A
para porcentagem com duas casas decimais:
Columns(A:A).NumberFormat = 0.00%
Siga as etapas a seguir para ver uma relao de outros formatos de
nmero. Melhor ainda, ligue o gravador de macro enquanto fizer isso.
1. Ative uma planilha.
2. Acesse a caixa de dilogo Formatar Clulas, pressionando Ctrl+1.
3. Selecione a guia Nmero.
4. Selecione a categoria Personalizado para ver e aplicar algumas
strings adicionais de formato de nmero.
Alguns Mtodos teis do Objeto Range
Como voc sabe, um mtodo VBA executa uma ao. Um objeto Range tem
dezenas de mtodos, mas, de novo, voc no precisa da maioria deles.
Nesta seo, indico alguns dos mtodos mais usados do objeto Range.
O mtodo Select
Use o mtodo Select para selecionar uma faixa de clulas. A seguinte
declarao seleciona uma faixa na planilha ativa:
Range(A1:C12).Select
Antes de selecionar uma faixa, geralmente uma boa ideia usar uma
declarao adicional para garantir que a planilha certa esteja ativa. Por
exemplo, se Sheet1 contm a faixa que voc deseja selecionar, use as
seguintes declaraes para selecionar a faixa:
Sheets(Sheet1).Activate
Range(A1:C12).Select
Ao contrrio do que voc pode esperar, a seguinte declarao gera um
erro se Sheet1 no for a planilha ativa. Em outras palavras, voc deve
usar duas declaraes ao invs de apenas uma: uma para ativar a
planilha e outra para selecionar a faixa.
Sheets(Sheet1).Range(A1:C12).Select
Se voc usar o mtodo GoTo do objeto Application para selecionar uma
faixa, pode esquecer sobre selecionar primeiro a planilha certa. Essa
declarao ativa Sheet1 e depois seleciona a faixa:
C
U
I
D
A
D
O!
D
I
C
A
ExcelVBABokks.indb 126 15/02/2013 13:59:35
127 Captulo 8: Trabalhando com Objetos Range
Application.Goto Sheets(Sheet1).Range(A1:C12)
O mtodo GoTo o equivalente em VBA funo da tecla F5 no Excel,
que exibe a caixa de dilogo Ir para.
Os mtodos Copy e Paste
Voc pode executar as operaes de copiar e colar em VBA usando os
mtodos Copy e Paste. Note que dois objetos diferentes entram em
cena. O mtodo Copy aplicvel ao objeto Range, mas o mtodo Paste
aplica-se ao objeto Worksheet. Na verdade, isso faz sentido: voc copia
uma faixa e a cola em uma planilha.
Esta macro curta (cortesia do gravador de macro) copia a faixa A1:A12
e a cola na mesma planilha, comeando na clula C1:
Sub CopyRange()
Range(A1:A12).Select
Selection.Copy

Range(C1).Select
ActiveSheet.Paste
End Sub
Observe que no exemplo anterior, o objeto ActiveSheet (planilha ativa)
usado com o mtodo Paste. Essa uma verso especial do objeto
Worksheet que se refere planilha ativa no momento. Veja ainda que a
macro seleciona a faixa antes de copi-la. No entanto, voc no tem que
selecionar uma faixa antes de fazer alguma coisa com ela. Na verdade, o
seguinte procedimento consegue realizar a mesma tarefa que o exemplo
anterior, usando uma nica declarao:
Sub CopyRange1()
Range(A1:A12).copy Range(C1)
End Sub
Este procedimento tem a vantagem de que o mtodo Copiar pode usar um
argumento que corresponde faixa de destino para a operao de cpia.
O mtodo Clear
O mtodo Clear (limpar) apaga o contedo de uma faixa, incluindo toda
a formatao de clula. Por exemplo, se voc quiser apagar tudo na
coluna D, a seguinte declarao faz o trabalho:
Columns(D:D).Clear
D
I
C
A
ExcelVBABokks.indb 127 15/02/2013 13:59:35
128 Parte III: Conceitos de Programao
Voc tambm deve conhecer dois mtodos correlatos. O mtodo
ClearContents, que apaga o contedo de uma faixa, mas deixa a formatao intacta. E o mtodo ClearFormats, que apaga a formatao na
faixa, mas no o contedo da clula.
O mtodo Delete
Limpar uma faixa diferente de deletar ou excluir uma faixa. Quando
voc deleta (ou exclui) uma faixa, o Excel desloca as clulas restantes
para preencher a faixa excluda.
O exemplo a seguir usa o mtodo Delete para excluir a linha 6:
Rows(6:6).Delete
Quando voc exclui uma faixa que no uma linha ou coluna inteira, o Excel
precisa ser informado sobre como deslocar as clulas (para ver como isso
funciona, experimente o comando Pgina Inicial Clulas Excluir).
A seguinte declarao exclui uma faixa e preenche o espao resultante,
com as outras clulas sua esquerda:
Range(C6:C10).Delete xlToLeft
O mtodo Delete usa um argumento que indica como o Excel deveria
trocar as clulas restantes. Neste caso, eu uso uma constante integrada
(xlToLeft) para o argumento. Eu tambm poderia usar xlUp, uma outra
constante nomeada.
ExcelVBABokks.indb 128 15/02/2013 13:59:35


Neste Captulo
Como usar funes para tornar suas expresses VBA mais poderosas
Como usar funes VBA integradas
Como usar funes de planilha do Excel em seu cdigo VBA
Como escrever funes personalizadas
Usando VBA e Funes
de Planilha
Captulo 9
N
os captulos anteriores, eu mencionei o fato de que voc pode
usar funes em suas expresses VBA. H trs sabores de fun-

es: as internas do VBA, as do Excel e outras funes escritas em VBA.


Neste captulo, ofereo uma explicao completa sobre isso. As funes
podem fazer o seu cdigo VBA executar algumas faanhas poderosas,
exigindo pouco ou nenhum esforo de programao. Se gostou da ideia,
este captulo para voc.
O que uma Funo?
Exceto por algumas pessoas que pensam que Excel um processador
de palavras, todos os usurios de Excel usam funes de planilha em
suas frmulas. A funo mais comum de planilha a funo SUM, e
voc tem centenas de outras sua disposio.
Essencialmente, uma funo executa um clculo e retorna um nico
valor. Claro que a funo SUM retorna a soma de uma faixa de valores.
O mesmo se refere s funes usadas em suas expresses VBA: cada
funo faz isso e retorna um nico valor.
As funes que voc usa em VBA podem vir a partir de trs fontes:
5 Funes integradas fornecidas pelo VBA
5 Funes de planilha fornecidas pelo Excel
5 Funes personalizadas que voc (ou algum) escreve, usando VBA
ExcelVBABokks.indb 129 15/02/2013 13:59:36
130 Parte III: Conceitos de Programao
O resto deste captulo esclarece as diferenas (espero) e o convence da
importncia de usar funes em seu cdigo VBA.
Usando Funes VBA Integradas
O VBA oferece diversas funes integradas. Algumas dessas funes
usam argumentos e outras no.
Exemplo de funo VBA
Nesta seo, eu apresento alguns exemplos sobre o uso de funes VBA
no cdigo. Em muitos desses exemplos, uso a funo MsgBox para
exibir um valor em uma caixa de mensagem. Sim, MsgBox uma funo
VBA bem incomum, contudo, uma funo. Essa til funo exibe uma
mensagem em uma caixa de dilogo pop-up. Para mais detalhes sobre a
funo MsgBox, veja o Captulo 15.
Uma pasta de trabalho contendo todos os exemplos est disponvel no
Web site deste livro.
Exibindo a data ou horrio do sistema
O primeiro exemplo usa a funo Date do VBA para exibir a data atual
do sistema em uma caixa de mensagem:
Sub ShowDate()
MsgBox Date
End Sub
Veja que a funo Date no usa um argumento. Diferente das funes de
planilha, uma funo VBA sem argumento no exige um conjunto de
parnteses vazios. Na verdade, se voc digitar um conjunto de parnteses vazios, o VBE os remover prontamente.
Para obter o horrio do sistema, use a funo Time. E, se voc quiser
mais, use a funo Now para retornar a data e o horrio.
Como encontrar a extenso de uma string
O procedimento a seguir usa a funo VBA Len (length = comprimento),
que retorna o comprimento de uma string de texto. A funo Len toma
um argumento: a string. Quando voc executa esse procedimento, o
resultado exibido na caixa de mensagem 11, pois o argumento tem 11
caracteres.
ExcelVBABokks.indb 130 15/02/2013 13:59:36
131 Captulo 9: Usando VBA e Funes de Planilha
Sub GetLength()
Dim MyString As String
Dim StringLength As Integer
MyString = Hello World
StringLength = Len(MyString)
MsgBox StringLength

End Sub
O Excel tambm tem uma funo Len, que voc pode usar em suas
planilhas de frmulas. A verso do Excel e a funo VBA funcionam da
mesma maneira.
Exibindo a parte inteira de um nmero
O seguinte procedimento usa a funo Fix (corrigir), a qual retorna a
parte inteira de um valor o valor sem quaisquer casas decimais:
Sub GetIntegerPart()
Dim MyValue As Double
Dim IntValue As Integer
MyValue = 123.456
IntValue = Fix(MyValue)
MsgBox IntValue
End Sub
Neste caso, a caixa de mensagem exibe 123.
VBA tem uma funo semelhante, chamada Int. A diferena entre Int e
Fix como cada uma lida com nmeros negativos. Trata-se de uma
diferena sutil, mas, s vezes, importante.
5 Int retorna o primeiro inteiro negativo que menor ou igual ao
argumento. Fix (-123.456) retorna -124.
5 Fix retorna o primeiro inteiro negativo que maior ou igual ao
argumento. Fix (-123.456) retorna -123.
Determinando o tamanho de um arquivo
O procedimento Sub a seguir exibe o tamanho, em bytes, de um arquivo
Excel executvel. Ele encontra o seu valor usando a funo FileLen
(extenso de arquivo).
Sub GetFileSize()
Dim TheFile As String
TheFile = C:\Program Files\Microsoft Office\
Office14\Excel.exe
MsgBox FileLen(TheFile)
End Sub
Veja que essa rotina restringe os cdigos do nome de arquivo (isto ,
declara explicitamente o caminho). Em geral, essa no uma boa ideia. O
arquivo poderia no estar no drive C, ou a pasta do Excel pode ter um
nome diferente. A seguinte declarao mostra uma abordagem melhor:
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 131 15/02/2013 13:59:37
132 Parte III: Conceitos de Programao
TheFile = Application.Path & \EXCEL.EXE
Path (caminho) uma propriedade do objeto Application. Ela simplesmente retorna o nome da pasta onde o aplicativo (isto , o Excel) est
instalado (sem uma barra invertida ao final).
Identificando o tipo de um objeto selecionado
O procedimento a seguir usa a funo TypeName, que retorna o tipo da
seleo na planilha (como uma string):
Sub ShowSelectionType()
Dim SelType As String
SelType = TypeName(Selection)
MsgBox SelType
End Sub
O objeto poderia ser Range, Picture, Rectangle, ChartArea ou qualquer
outro tipo de objeto que possa ser selecionado.
A funo TypeName muito verstil. Voc tambm pode usar essa

funo para determinar o tipo de dados de uma varivel.


Funes VBA que fazem mais do que
retornar um valor
Algumas funes VBA vo acima e alm da obrigao. Ao invs de
simplesmente retornar em um valor, essas funes tm alguns efeitos
colaterais teis. A Tabela 9-1 as relaciona.
Tabela 9-1 Funes com Benefcios Colaterais teis
Funo O que ela faz
MsgBox Exibe uma caixa de dilogo til contendo uma mensagem e botes.
A funo retorna um cdigo que identifica qual boto o usurio
clica. Para mais detalhes, veja o Captulo 15.
InputBox Exibe uma simples caixa de dilogo que pede alguma entrada do
usurio. A funo retorna o que o usurio inserir na caixa de dilogo. Eu discuto isso no Captulo 15.
Shell Executa outro programa. A funo retorna a ID (um identificador
nico) da tarefa do outro programa (ou um erro, se a funo no
puder iniciar o outro programa).
D
I
C
A
ExcelVBABokks.indb 132 15/02/2013 13:59:38
133 Captulo 9: Usando VBA e Funes de Planilha
Descobrindo funes VBA
Como voc descobre quais funes o VBA oferece? Boa pergunta. A
melhor fonte o sistema de Ajuda do Excel Visual Basic. Eu compilei
uma lista parcial de funes, que compartilho com voc na Tabela 9-2.
Omiti algumas das funes mais especializadas ou obscuras.
Para mais detalhes sobre uma funo em especial, digite o nome da
funo em um mdulo VBA, mova o cursor em qualquer lugar no texto
e pressione F1.
Tabela 9-2 Funes mais teis do VBA
Funo O Que Ela Faz
Abs Retorna o valor absoluto de um nmero.
Array Retorna uma variante contendo um array.
Asc Converte o primeiro caractere de uma string ao seu valor ASCII.
Atn Retorna o arco tangente de um nmero.
Choose Retorna um valor de uma lista de itens.
Chr Converte um valor ANSI a uma string.
Cos Retorna o coseno de um nmero.
CurDir Retorna o caminho atual.
Date Retorna a data atual do sistema.
DateAdd Retorna uma data ao qual foi acrescentado um intervalo de
tempo especificado por exemplo, um ms a partir de uma data
em especial.
DateDiff Retorna um inteiro mostrando o nmero de intervalos de tempo
especificados entre duas datas por exemplo, o nmero de meses
entre agora e o seu aniversrio.
DatePart Retorna um inteiro contendo a parte especificada de determinada
data por exemplo, um dia do ano da data.
DateSerial Converte uma data em um nmero em srie.
DateValue Converte uma string em uma data.
Day Retorna o dia do ms a partir de um valor de data.
Dir Retorna o nome de um arquivo ou diretrio que combina com um padro.
Erl Retorna o nmero da linha que causou um erro.
Err Retorna o nmero de erro de uma condio de erro.
Error Retorna a mensagem de erro que corresponde a um nmero de erro.
Exp Retorna a base do logaritmo natural (e) elevado a uma potncia.
(continua)
D

I
C
A
ExcelVBABokks.indb 133 15/02/2013 13:59:39
134 Parte III: Conceitos de Programao
Tabela 9-2 (continuao)
Funo O Que Ela Faz
FileLen Retorna o nmero de bytes de um arquivo.
Fix Retorna a parte inteira de um nmero.
Format Exibe uma expresso em um formato especial.
GetSetting Retorna o valor de um registro Windows.
Hex Converte de decimal para hexadecimal.
Hour Retorna a parte das horas de um horrio.
InputBox Exibe uma caixa para solicitar uma entrada pelo usurio.
InStr Retorna a posio de uma string dentro de outra string.
Int Retorna a parte inteira de um nmero.
IAmt Retorna o pagamento de juros de uma anuidade ou emprstimo.
IsArray Retorna Verdadeiro se uma varivel for um array.
IsDate Retorna Verdadeiro se uma expresso for uma data.
IsEmpty Retorna Verdadeiro se uma varivel no tiver sido inicializada.
IsError Retorna Verdadeiro se uma expresso for um valor de erro.
IsMissing Retorna Verdadeiro se um argumento opcional no foi passado a
um procedimento.
IsNull Retorna Verdadeiro se uma expresso no contm dados vlidos.
IsNumeric Retorna Verdadeiro se uma expresso pode ser avaliada como
um nmero.
IsObject Retorna Verdadeiro se uma expresso referenciar um objeto OLE
Automation.
LBound Retorna o menor subscrito para a dimenso de um array.
LCase Retorna uma string convertida para minsculas.
Left Retorna uma string a partir do nmero de caracteres especificados
esquerda dessa string.
Len Retorna o nmero de caracteres de uma string.
Log Retorna o logaritmo natural de um nmero base.
LTrim Retorna uma cpia de uma string, com quaisquer espaos sua
esquerda removidos.
Mid Retorna uma string seguido um nmero especificado de caracteres.
Minute Retorna a parte de minutos de um valor de tempo.
Month Retorna o ms de um valor de data.
MsgBox Exibe uma caixa de mensagem e (opcionalmente) retorna um valor.
Now Retorna a data e horrio do sistema atual.
RGB Retorna um valor numrico RGB representando uma cor.
ExcelVBABokks.indb 134 15/02/2013 13:59:39
135 Captulo 9: Usando VBA e Funes de Planilha
Tabela 9-2 (continuao)
Funo O Que Ela Faz
Replace Substitui uma sub-string em uma string por outra sub-string.
Right Retorna uma string conforme um nmero especificado de caracteres
sua direita.
Rnd Retorna um nmero aleatrio entre 0 e 1.
RTrim Retorna uma cpia de uma string, com quaisquer espaos finais removidos.
Second Retorna a parte de segundos de um valor de tempo.
Sgn Retorna um nmero inteiro indicando o sinal do nmero.
Shell Roda um programa executvel.
Sin Retorna o seno de um nmero.
Space Retorna uma string com um nmero especificado de espaos.
Split Divide em partes uma string, usando um caractere delimitador.
Sqr Retorna a raiz quadrada de um nmero.
Str Retorna a representao de um nmero de uma string.
StrComp Retorna um valor indicando o resultado de uma comparao de string.

String Retorna um caractere repetido ou string.


Tan Retorna a tangente de um nmero.
Time Retorna o horrio atual do sistema.
Timer Retorna o nmero de segundos desde a meia-noite.
TimeSerial Retorna o horrio em hora, minuto ou segundo especificados.
TimeValue Converte uma string a um nmero serial de horrio.
Trim Retorna uma string sem espaos em seu incio ou final.
TypeName Retorna uma string que descreve um tipo de dados variveis.
UBound Retorna o maior subscrito disponvel dimenso do array.
UCase Converte uma string para maisculas.
Val Retorna os nmeros contidos em uma string.
VarType Retorna um valor indicando o subtipo de uma varivel.
Weekday Retorna um nmero representando um dia da semana.
Year Retorna o ano a partir de um valor de data.
Usando Funes de Planilha no VBA
Ainda que o VBA oferea uma boa diversidade de funes integradas,
nem sempre voc pode encontrar o que precisa. Felizmente, tambm
possvel usar a maioria das funes de planilha do Excel em seus
procedimentos VBA. As nicas funes de planilha que no podem ser
usadas so aquelas que tm uma funo VBA equivalente.
ExcelVBABokks.indb 135 15/02/2013 13:59:40
136 Parte III: Conceitos de Programao
O VBA disponibiliza as funes de planilha do Excel atravs do objeto
WorksheetFunction, o qual est contido no objeto Application. Portanto, qualquer declarao que use uma funo de planilha deve usar o
qualificador Application.WorksheetFunction. Em outras palavras, voc
deve preceder o nome da funo com Application.WorksheetFunction,
(com um ponto separando os dois). A seguir est um exemplo:
Total = Application.WorksheetFunction.Sum(Range(A1:A12))
Voc pode omitir a parte Application da parte WorksheetFunction da
expresso. De qualquer modo, o VBA saber o que voc est fazendo.
Em outras palavras, as trs expresses a seguir funcionam exatamente
da mesma maneira:
Total = Application.WorksheetFunction.Sum(Range(A1:A12))
Total = WorksheetFunction.Sum(Range(A1:A12))
Total = Application.Sum(Range(A1:A12))
A minha preferncia pessoal usar a parte WorksheetFunction apenas
para deixar bem claro que o cdigo est usando uma funo Excel.
Exemplos de funo e planilha
Nesta seo, demonstro como usar funes de planilha em suas
expresses VBA.
Encontrando o valor mximo em uma faixa
Eis um exemplo que mostra como usar a funo de planilha MXIMO
do Excel em um procedimento VBA. Esse procedimento exibe o valor
mximo encontrado na coluna A da planilha ativa:
Asub ShowMax()
Dim TheMax As Double
TheMax = WorksheetFunction.Max(Range(A:A))
MsgBox TheMax
End Sub
Voc tambm pode usar a funo MNIMO para obter o menor valor em
uma faixa. E, como seria esperado, pode usar outras funes de planilha de maneira semelhante. Por exemplo, voc pode usar a funo
MAIOR para determinar o n-simo maior valor em uma faixa. A
seguinte expresso demonstra isto:
SecondHighest = WorksheetFunction.Large(Range(A:A),2)
Observe que a funo LARGE usa dois argumentos; o segundo argumento representa o n-simo no caso, 2 (o segundo maior valor).
L
E

M
B
R
E
-SE
D
I
C
A
ExcelVBABokks.indb 136 15/02/2013 13:59:41
137 Captulo 9: Usando VBA e Funes de Planilha
Calculando o pagamento de uma hipoteca
O prximo exemplo usa a funo de planilha PGTO (na verso em ingls
do excel: PMT) para calcular o pagamento de uma hipoteca. Eu uso trs
variveis para armazenar os dados que so passados funo Pmt
como argumentos. Uma caixa de mensagem exibe o pagamento calculado.
Sub PmtCalc()
Dim InRate As Double
Dim LoadAmt As Double
Dim Periods As Integer
IntRate = 0.0825 / 12
Periods = 30 * 12
LoanAmt = 150000
MsgBox WorksheetFunction. _
Pmt(IntRate, Periods, -LoanAmt)
End Sub
Como demonstra a declarao a seguir, voc tambm pode inserir os
valores diretamente como argumentos de funo:
MsgBox WorksheetFunction.Pmt(0.0825 / 12, 360, -150000)
No entanto, usar variveis para armazenar os parmetros torna o
cdigo mais fcil de ler e modificar, se necessrio.
Usando uma funo procv(lookup)
O exemplo a seguir usa funes InputBox e MsgBox do VBA, alm da
funo PROCV (vlookup) do Excel. Ela solicita o nmero de um produto
e depois obtm o preo atravs da consulta a uma tabela. Na Figura 9-1,
a faixa A1:B13 chamada de PriceList (lista de preo).
Sub GetPrice()
Dim PartNum As Variant
Dim Price As Double
PartNum = InputBox(Informe o nmero do produto)
Sheets(Prices).Activate
Price = WorksheetFunction. _
Vlookup(PartNum, Range(PriceList), 2, False)
MsgBox PartNum & costs & Price
End Sub
Voc pode fazer o download desse livro de exerccios a partir do Web
site do livro.
O procedimento comea assim:
1. A funo InputBox do VBA pede o nmero do produto ao usurio.
2. Essa declarao atribui o nmero informado varivel PartNum.
3. A prxima declarao ativa a planilha Prices, s para o caso de ela
ainda no ser uma planilha ativa.
ExcelVBABokks.indb 137 15/02/2013 13:59:42
138 Parte III: Conceitos de Programao
4. O cdigo usa a funo VLOOKUP para encontrar o nmero do
produto na tabela.
Observe que os argumentos que voc usa nessa declarao so
iguais queles que voc usaria com a funo em uma planilha de
frmula. Essa declarao atribui o resultado da funo varivel

Price.
5. O cdigo exibe o preo do produto atravs da funo MsgBox.
Este procedimento no tem nenhum erro de execuo e ele falha
miseravelmente se voc informar um nmero de produto inexistente
(Tente). Se isso fosse um aplicativo, voc poderia acrescentar algumas
declaraes de tratamento de erro para um procedimento mais robusto. No Captulo 12, eu discuto sobre tratamento de erro.
Introduzindo funes de planilha
Voc no pode usar a caixa de dilogo Inserir Funo do Excel para
inserir uma funo de planilha em um mdulo VBA. Ao invs disso,
entre com tais funes moda antiga: mo. No entanto, voc pode
usar a caixa de dilogo Inserir Funo para identificar a funo que
deseja usar e descobrir sobre seus argumentos.
Voc tambm pode usufruir a vantagem da opo Autolistar membros
do VBE, a qual exibe uma lista drop-down de todas as funes de
planilha. Basta digitar Application.WorksheetFunction, seguido por um
ponto. Ento, voc ver uma lista das funes sua disposio.
Se esse recurso no estiver funcionando, escolha o comando
Ferramentas Opes do VBE, clique a guia Editor e marque a caixa de
opes Autolistar Membros.
Figura 9-1:
A faixa
nomeada
como
PriceList
contm os
preos das
partes.
D
I
C
A
ExcelVBABokks.indb 138 15/02/2013 13:59:42
139 Captulo 9: Usando VBA e Funes de Planilha
Mais Sobre o Uso de Funes de Planilha
Geralmente, os recm-chegados ao VBA confundem as funes integradas do VBA com as funes de planilha do Excel. Uma boa regra
lembrar que o VBA no tenta reinventar a roda. Na maior parte do
tempo, o VBA no repete funes de planilha do Excel.
Para a maioria das funes de planilha que no esto disponveis como
mtodos do objeto WorksheetFunction, voc pode usar um operador ou
funo integrada a do VBA equivalente. Por exemplo, a funo de
planilha Mod no est disponvel no objeto WorksheetFunction, pois o
VBA tem um equivalente, o seu operador integrado Mod.
A questo toda? Se voc precisa usar uma funo, verifique primeiro se
o VBA tem algo que atenda s suas necessidades. Se no, verifique as
funes de planilha. Se tudo o mais falhar, voc pode ser capaz de
escrever uma funo personalizada usando VBA.
Usando Funes Personalizadas
Eu abordei as funes VBA e as funes de planilha do Excel. A terceira
categoria de funes que voc pode usar em seus procedimentos VBA
a de funes personalizadas. Uma funo personalizada (tambm conhecida como Funo Definida pelo Usurio) aquela que voc mesmo
desenvolve usando (o que mais?) VBA. Para usar uma funo personalizada, preciso defini-la na pasta de trabalho na qual voc a usa.
Eis um exemplo de definio de um simples procedimento Function e
depois, o seu uso em um procedimento VBA Sub:
Function MultiplyTwo(num1, num2) As Double
MultiplyTwo = num1 * num2
End Function

Sub ShowResult()
Dim n1 As Double, n2 As Double
Dim Result As Double
n1 = 123
n2 = 544
Result = MultiplyTwo(n1, n2)
MsgBox Result
End Sub
A funo personalizada MultiplyTwo tem dois argumentos. O procedimento Sub ShowResult usa esse procedimento Function, passando dois
argumentos a ele (entre parnteses). Depois, o procedimento
ShowResult exibe uma caixa de mensagem, mostrando o valor retornado pela funo MultiplyTwo.
D
I
C
A
ExcelVBABokks.indb 139 15/02/2013 13:59:43
140 Parte III: Conceitos de Programao
Provavelmente, eu no preciso dizer a voc que a funo MultiplyTwo
bem intil. muito mais eficaz executar a multiplicao no procedimento Sub ShowResult. Eu a incluo para que voc tenha uma ideia de como
um procedimento Sub pode usar uma funo personalizada.
Voc tambm pode usar funes personalizadas em suas frmulas de
planilha. Por exemplo, se MultiplyTwo estiver definida em sua pasta de
trabalho, voc pode escrever uma frmula, tal como esta:
=MultiplyTwo(A1, A2)
Esta frmula retorna o produto dos valores nas clulas A1 e A2.
As funes de planilha personalizadas so um tpico importante (e
bem til). To importante (e til) que dedico um captulo inteiro a ele.
Veja o Captulo 20.
ExcelVBABokks.indb 140 15/02/2013 13:59:43
Captulo 10

Neste Captulo
Como descobrir mtodos para controlar o uxo de suas rotinas VBA
Como saber sobre a temida declarao GoTo
Usando as estruturas If-Then e Select Case
Como executar loop em seus procedimentos

Controlando o Fluxo
de Programa e
Tomando Decises
A
lguns procedimentos VBA comeam no incio do cdigo e progridem, linha por linha, at o nal, nunca se desviando desse uxo
de programa, de cima para baixo. As macros que voc grava sempre
funcionam assim. Porm, em muitos casos, preciso controlar o uxo
do seu cdigo, pulando algumas declaraes, executando algumas
declaraes diversas vezes e testando condies para determinar qual
procedimento executar em seguida. Segure-se e aproveite o passeio,
pois voc est prestes a descobrir a essncia da programao.
Seguindo o Fluxo, Cara
Alguns novatos em programao no podem entender como um
computador burro pode tomar decises inteligentes. O segredo est em
vrias montagens de programao que a maioria das linguagens de
programao suporta. A Tabela 10-1 oferece um resumo dessas construes. Mais adiante neste captulo, eu explico todas elas.
ExcelVBABokks.indb 141 15/02/2013 13:59:43
142 Parte III: Conceitos de Programao

Tabela 10-1 Construes de Programao para tomar Decises


Construo Como Funciona
Declarao GoTo Pula para uma declarao em especial.
Estrutura If-Then Faz alguma coisa se algo mais for verdadeiro.
Select Case Multiuso, mas depende do valor atribudo..
Loop For-Next Executa uma srie de declaraes um nmero de vezes
especificado.
Loop Do-While Faz algo, desde que alguma outra coisa continue a ser
verdadeira.
Loop Do-Until Faz algo at que alguma outra coisa se torne verdadeira.
A Declarao GoTo
A declarao GoTo oferece o meio mais direto de alterar o fluxo de um
programa. A declarao GoTo simplesmente transfere a execuo do
programa para uma nova declarao, a qual precedida por uma
etiqueta.
As suas rotinas VBA podem conter tantas etiquetas quantas voc
quiser. Uma label (etiqueta) apenas uma string de texto seguida por
dois pontos.
O seguinte procedimento mostra como funciona uma declarao GoTo:
Sub GoToDemo()
UserName = InputBox(Insira seu nome: )
If UserName <> Bill Gates Then GoTo WrongName
MsgBox (Bem-vindo Bil...)

...[Mais cdigo aqui]


Exit Sub
WrongName:
MsgBox Desculpe.Somente Bill Gates pode rodar
este programa.
End Sub
O procedimento usa a funo InputBox para obter o nome do usurio.
Se o usurio entrar com um nome diferente de Bill Gates, o fluxo do
programa pula para a etiqueta WrongName (nome errado), exibe uma
mensagem de desculpas e o procedimento termina. Por outro lado, se o
Sr. Gates rodar esse procedimento e usar o seu verdadeiro nome, o
procedimento exibe uma mensagem de boas vindas e depois executa
algum cdigo adicional (no mostrado no exemplo). Observe que a
declarao Exit Sub encerra o procedimento antes que a segunda
funo MsgBox tenha uma chance de trabalhar.
ExcelVBABokks.indb 142 15/02/2013 13:59:44
143 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
Se voc anda com programadores, cedo ou
tarde ouvir o termo programao estruturada. Este termo existe h dcadas e em
geral, os programadores concordam que
programas estruturados so superiores a
programas no estruturados. Assim, o que
programao estruturada? E possvel faz-la usando VBA?
A premissa bsica de programao estruturada que uma rotina ou segmento de cdigo s deve ter um ponto de entrada e um de
sada. Em outras palavras, um bloco de cdigo deve ser uma unidade individual. Um
programa no pode pular no meio dessa
unidade, nem pode sair em qualquer ponto,
exceto no nico ponto de sada. Quando
voc escreve cdigo estruturado, o seu programa progride de uma forma ordenada e
fcil de acompanhar diferente de um programa que pula em volta de modo desorde-

nado. Praticamente isso elimina o uso da


declarao GoTo.
Geralmente, um programa estruturado
mais fcil de ler e de entender. Mais importante, ele tambm mais fcil de modificar
quando surge a necessidade.
De fato, VBA uma linguagem estruturada.
Ela oferece montagens padro estruturadas, tais como as estruturas de loops Then-Else, For-Next, Do-Until, Do-While e Select
Case. Alm do mais, ela suporta totalmente
construes de cdigo de mdulos. Se voc
for novo em programao, deveria tentar
desenvolver bons hbitos de programao
estruturada logo no incio. Fim da aula.
O que programao estruturada?
Isso importa?
Esta simples rotina funciona, mas o VBA oferece diversas alternativas
melhores (e mais estruturadas) do que GoTo. Em geral, voc s deveria
usar GoTo quando no tiver outra forma de executar uma ao. Na vida
real, a nica vez em que voc deve usar uma declarao GoTo para
driblar erros (eu discuto isso no Captulo 12).
Muitos tipos de programao explcitos tm uma averso intrnseca por
declaraes GoTo, porque us-las pode resultar em cdigo espagueti
difcil de ler (e difcil de manter). Portanto, voc deveria evitar esse
assunto ao falar com outros programadores.
Decises, decises
Nesta seo, discuto duas estruturas de programao que podem
reforar os seus procedimentos VBA quanto capacidade de tomar
decises: If-Then e Select Case.
A estrutura If-Then
Certo, eu direi: If-Then a estrutura de controle mais importante de
VBA. Provavelmente, voc usa esse comando diariamente (pelo menos,
eu uso). Como muitos outros aspectos da vida, tomar decises eficientes a chave do sucesso em escrever macros do Excel. Se este livro
tiver o efeito que pretendo, logo voc compartilhar a minha filosofia
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
C
U
I
D
A
D
O!
ExcelVBABokks.indb

143 15/02/2013

13:59:44

144 Parte III: Conceitos de Programao


de que um aplicativo Excel bem sucedido concentra-se em tomar
decises e agir de acordo com elas.
A estrutura If-Then tem esta sintaxe bsica:
If condition Then statements (Else elsestatements)
Use a estrutura If-Then quando quiser executar, condicionalmente, uma
ou mais declaraes. A clusula opcional Else, se includa, permite que
voc execute uma ou mais declaraes se a condio que estiver
testando no for verdadeira. Parece confuso? No se preocupe: alguns
exemplos esclarecero isso.
Exemplos de If-Then
A rotina a seguir demonstra a estrutura If-Then sem a clusula opcional Else:
Sub GreetMe()
If Time < 0.5 Then MsgBox Bom dia
End Sub
O procedimento GreetMe (cumprimente-me) usa a funo Time do VBA
para obter o horrio do sistema. Se o horrio atual do sistema for
menor que .5 (em outras palavras, antes do meio-dia), a rotina exibe
uma saudao amigvel. Se Time for maior ou igual a .5, a rotina
termina e nada acontece.
Para exibir uma saudao diferente, se Time for maior que ou igual a .5,
acrescente uma outra declarao If-Then aps a primeira:
Sub GreetMe2()
If Time < 0.5 Then MsgBox Bom dia
If Time >= 0.5 Then MsgBox Boa tarde
End Sub
Observe que eu usei >= (maior ou igual a) para a segunda declarao
If-Then. Isso garante que o dia inteiro est coberto. Se eu tivesse usado >
(maior que), ento nenhuma mensagem apareceria se esse procedimento
fosse executado exatamente s 12 horas. Isso bem improvvel, mas com
um programa importante como esse, no quero correr quaisquer riscos.
Um exemplo de If-Then-Else
Uma outra abordagem ao problema anterior usa a clusula Else. Eis a mesma
rotina, recodificada para usar a estrutura If-Then-Else:
Sub GreetMe3()
If Time < 0.5 Then MsgBox Bom dia Else _
MsgBox Boa tarde
End Sub
ExcelVBABokks.indb 144 15/02/2013 13:59:44
145 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
Veja que eu uso o caractere de continuao de linha (sublinhado) no
exemplo anterior. Na verdade, a declarao If-Then-Else uma nica
declarao. VBA oferece uma maneira ligeiramente diferente de codificar montagens If-Then-Else que usam uma declarao End-If (terminar
se). Portanto, o procedimento GreetMe pode ser reescrito como:
Sub GreetMe4()
If Time < 0.5 Then
MsgBox Bom dia
Else
MsgBox Boa tarde
End If
End Sub
Na verdade, possvel inserir qualquer quantidade de declaraes
depois do If, e qualquer quantidade de declaraes depois do Else. Eu
prefiro usar essa sintaxe, pois ela mais fcil de ler e torna as declaraes mais curtas.
E se voc precisar expandir a rotina GreetMe para lidar com trs condies: manh, tarde e noite? Voc tem duas opes: usar trs declaraes
If-Then ou usar uma estrutura aninhada de If-Then-Else. Aninhar significa
colocar uma estrutura If-Then-Else dentro de outra estrutura If-Then-Else.

Na primeira abordagem, mais simples usar as trs declaraes:


Sub GreetMe5()
Dim Msg As String
If Time < 0.5 Then Msg = Manh
If Time >= 0.5 And Time < 0.75 Then Msg = Tarde
If Time >= 0.75 Then Msg = Noite
MsgBox Boa & Msg
End Sub
A varivel Msg obtm um texto de valor diferente, dependendo da hora
do dia. A declarao MsgBox final exibe a saudao Good Morning
(bom dia), Good Afternoon (boa tarde) ou Good Evening (boa noite).
A seguinte rotina executa a mesma ao, mas usa a estrutura If-Then-End If:
Sub GreetMe6()
Dim Msg As String
If Time < 0.5 Then
Msg = Manh
End If
If Time >= 0.5 And Time < 0.75 Then
Msg = Tarde
End If
If Time >= 0.75 Then
Msg = Noite
End If
MsgBox Boa & Msg
End Sub
ExcelVBABokks.indb 145 15/02/2013 13:59:44
146 Parte III: Conceitos de Programao
Voc poderia estar curioso sobre quo rpido o VBA pode rodar atravs de loops com If-Then. Alguns sistemas rodam cdigo significativamente mais depressa do q
ue outros?
Como uma experincia informal, eu postei o seguinte procedimento VBA em meu blog e
pedi
aos outros para postar seus resultados:
Sub TimeTest()
100 milhes de nmeros aleatrios, testes e operaes
matemticas
Dim x As Long
Dim StartTime As Single
Dim i As Long
x = 0
StartTime = Timer
For i = To 100000000
If Rnd <= 0.5 Then x = x + 1 Else X = x 1
Next i
MsgBox Timer StartTime & seconds
End Sub
O cdigo faz loops 100 milhes de vezes e executa algumas operaes dentro do loop: ele
gera um nmero aleatrio, faz uma comparao If-Then e realiza uma operao matemtica. Quando o loop concludo, o tempo transcorrido exibido em uma caixa de mensagem
.
O meu sistema rodou atravs desse loop em 9.03 segundos. Cerca de 100 outras pesso
as
postaram seus resultados e os tempos variaram de aproximadamente 5 a 30 segundos
. Em
outras palavras, alguns computadores so aproximadamente seis vezes mais
rpidos do
que outros. bom saber isso.
Porm, a verdadeira dvida , quanto tempo eu levaria para fazer isso manualmente? Esc
re-

vi em um pedao de papel e joguei uma moeda. Se desse cara, eu acrescentaria um


minha conta. Se desse coroa, eu subtrairia 1. Eu fiz isso dez vezes e demorei 42
segundos.
Portanto, atravs do meu loop demorou 4.2 segundos. Usando essa informao, calculei
que eu demoraria 799 anos para executar essa tarefa 100 milhes de vezes mas s se e
u
trabalhasse sem parar. A concluso: meu computador aproximadamente 52.3 milhes de
vezes mais rpido do que eu.
Quo rpidos so os loops?
Usando ElseIf
Nos exemplos anteriores, cada declarao na rotina executada
mesmo de manh. Uma estrutura mais eficiente sairia da rotina assim
que descobrisse uma condio como verdadeira. Por exemplo, pela
manh, o procedimento exibiria a mensagem Good Morning e depois
sairia sem avaliar as outras condies suprfluas.
Com uma pequena rotina como essa, voc no precisa se preocupar
com a velocidade de execuo. Mas, em aplicativos maiores, onde a
velocidade importante, voc deveria saber sobre uma outra sintaxe
para a estrutura If-Then. A sintaxe de ElseIf :
ExcelVBABokks.indb 146 15/02/2013 13:59:44
147 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
If condition Then
[statements]
ElseIf condition-n Then
[elseifstatements]
Else
[elsestatements]
End If
Eis como voc pode reescrever a rotina GreetMe usando esta sintaxe:
Sub GreetMr7()
Dim Msg As String
If Time < 0.5 Then
Msg = Manh
ElseIf Time >= 0.5 And Time < 0.75 Then
Msg = Tarde
Else
Msg = Noite
End If
MsgBox Boa & Msg
End Sub
Quando uma condio verdadeira, o VBA executa as declaraes
condicionais e a estrutura If termina. Em outras palavras, o VBA no
perde tempo avaliando as condies estranhas, o que torna esse
procedimento um pouco mais eficiente que os exemplos anteriores. A
divergncia (divergncias sempre existem) que o cdigo mais difcil
de entender (claro que voc j sabia disso).
Uma pasta de trabalho que contm tudo sobre os exemplos GreetMe
pode ser baixada do site deste livro.
Um outro exemplo If-Then
Eis um outro exemplo que usa a forma simples da estrutura If-Then.
Esse procedimento solicita ao usurio uma quantidade e, depois, exibe
o desconto apropriado com base na quantidade fornecida pelo usurio.
Sub ShowDiscount()
Dim Quantity As Integer
Dim Discount As Double
Quantity = InputBox(Digite a quantidade:)
If Quantity > 0 Then Discount = 0.1
If Quantity >= 25 Then Discount = 0.15
If Quantity >= 50 Then Discount = 0.2
If Quantity >= 75 Then Discount = 0.25

MsgBox Desconto: & Discount


End Sub
Uma pasta de trabalho contendo os exemplos desta seo pode ser
baixada a partir do Web site deste livro.
Observe que cada declarao If-Then nesta rotina executada e que o
valor de Discount pode mudar, enquanto as declaraes so executaExcelVBABokks.indb 147 15/02/2013 13:59:44
148 Parte III: Conceitos de Programao
das. No entanto, a rotina exibe o valor correto de Discount, pois eu
coloquei as declaraes If-Then em ordem crescente de valores.
O procedimento a seguir executa as mesmas tarefas, usando a sintaxe
Else alternativa. Neste caso, a rotina termina imediatamente depois de
executar as declaraes quando a condio verdadeira.
Sub ShowDiscount2()
Dim Quantity As Integer
Dim Discount As Double
Quantity = InputBox(Digite a quantidade: )
If Quantity > 0 And Quantity < 25 Then
Discount = 0.1
ElseIf Quantity >= 25 And Quantity < 50 Then
Discount = 0.15
ElseIf Quantity >= 50 And Quantity < 75 Then
Discount = 0.2
ElseIf Quantity >= 75 Then
Discount = 0.25
End If
MsgBox Desconto: & Discount
End Sub
Pessoalmente, eu acho essas mltiplas estruturas If-Then bem ineficientes. Em geral, uso a estrutura If-Then apenas para decises de binrio
simples. Quando uma deciso envolve trs ou mais escolhas, a estrutura Select Case oferece uma abordagem mais simples, mais eficiente.
A estrutura Select Case
A estrutura Select Case til em decises envolvendo trs ou mais
opes (embora ela s funcione com duas opes, oferecendo uma
alternativa estrutura If-Then-Else).
A seguir, a sintaxe para a estrutura Select Case:
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
No fique assustado por esta sintaxe oficial. Usar a estrutura Select
Case bem fcil.
Um exemplo de Select Case
O exemplo a seguir mostra como usar a estrutura Select Case. Isso
tambm mostra uma outra forma de codificar os exemplos apresentados na seo anterior.
ExcelVBABokks.indb 148 15/02/2013 13:59:44
149 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
Sub ShowDiscount3()
Dim Quantity As Integer
Dim Discount As Double
Quantity = InputBox(Digite a quantidade: )
Select Case Quantity
Case 0 To 24
Discount = 0.1
Case 25 To 49
Discount = 0.15

Case 50 To 74
Discount = 0.2
Case Is >= 75
Discount = 0.25
End Select
MsgBox Desconto: & Discount
End Sub
Neste exemplo, a varivel Quantity (quantidade) est sob avaliao. A rotina
est verificando os quatro casos diferentes (0-24, 25-49, 50-74 e 75 ou maior).
Qualquer quantidade de declaraes pode seguir cada declarao Case,
e todas elas so executadas se a condio for verdadeira. Se voc usar
apenas uma declarao, como neste exemplo, pode colocar a declarao na mesma linha que a palavra chave Case, precedida por dois
pontos um caractere separador de declarao de VBA. Na minha
opinio, isso torna o cdigo mais compacto e um pouco mais claro. Eis
como se parece a rotina, usando este formato:
Sub ShowDiscount4()
Dim Quantity As Integer
Dim Discount As Double
Quantity = InputBox(Digite a quantidade: )
Select Case Quantity
Case 0 To 24: Discount = 0.1
Case 25 To 49: Discount = 0.15
Case 50 To 74: Discount = 0.2
Case Is >= 75: Discount = 0.25
End Select
MsgBox Desconto: & Discount
End Sub
Quando o VBA executa uma estrutura Select Case, a estrutura finalizada assim que o VBA encontra um caso verdadeiro e executa as declaraes para aquele caso.
Um exemplo de Select Case aninhada
Conforme demonstrado no exemplo a seguir, possvel aninhar estruturas
Select Case. Essa rotina examina a clula ativa e exibe uma mensagem
descrevendo o contedo da clula. Observe que o procedimento tem trs
estruturas Select Case e cada uma tem sua prpria declarao End Select.
ExcelVBABokks.indb 149 15/02/2013 13:59:45
150 Parte III: Conceitos de Programao
Sub CheckCell()
Dim Msg As String
Select Case IsEmpty(ActiveCell)
Case True
Msg = est vazia.
Case Else
Select Case ActiveCell.HasFormula
Case True
Msg = tem uma frmula
Case False
Select Case IsNumeric(ActiveCell)
Case True
Msg = tem um nmero
Case Else
Msg = tem texto
End Select
End Select
End Select
MsgBox clula & ActiveCell.Address& & Msg
End Sub
Este exemplo est disponvel no Web site deste livro.
A lgica mais ou menos assim:

1. Descobrir se a clula est vazia.


2. Se no estiver vazia, veja se ela contm uma frmula.
3. Se no houver frmula, descobrir se ela contm um valor numrico ou texto.
Quando a rotina termina, a varivel Msg contm uma string que descreve o contedo da clula. Conforme mostrado na Figura 10-1, a funo
MsgBox exibe aquela mensagem.
Voc pode aninhar estruturas Select Case to profundamente quanto
precisar, mas, assegure-se de que cada declarao Select Case tenha
uma declarao End Select correspondente.
Figura 10-1:
Uma
mensagem
exibida pelo
procedimento
CheckCell
ExcelVBABokks.indb 150 15/02/2013 13:59:45
151 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
Se voc tiver pensado sobre a razo dos recuos no cdigo que apresento aqui, a listagem anterior serve como um bom exemplo. Na verdade,
os recuos ajudam a esclarecer os nveis de aninhamento (pelo menos,
eu acho). Se voc no acredita em mim, d uma olhada no mesmo
procedimento, sem qualquer recuo:
Sub CheckCell()
Dim Msg As String
Select Case IsEmpty(ActiveCell)
Case True
Msg = est vazia.
Case Else
Select Case ActiveCell.HasFormula
Case True
Msg = tem uma frmula
Case False
Select Case IsNumeric(ActiveCell)
Case True
Msg = tem um nmero
Case Else
Msg = tem texto
End Select
End Select
End Select
MsgBox Clula & ActiveCell.Address & & Msg
End Sub
Bem incompreensvel, no ?
Fazendo Seu Cdigo Dar um Loop
O termo looping refere-se a repetir, vrias vezes, um bloco de declaraes
VBA. Nesta seo, explico sobre os vrios tipos diferentes de loops.
H dois tipos de loops: loops bons e loops ruins (os loops bons so
recompensados e os ruins so mandados para os seus quartos).
O cdigo a seguir demonstra um loop ruim. O procedimento apenas
entra com nmeros consecutivos em uma faixa. Ele inicia, solicitando
dois valores ao usurio um valor de partida e o nmero total de
clulas a preencher (pelo fato de InputBox retornar uma string, eu
converto as strings em inteiros, usando a funo Cint). Essa loop usa
a declarao GoTo para controlar o fluxo. A varivel CellCount controla quantas clulas so preenchidas. Se esse valor for menor que o
nmero informado pelo usurio, o controle do programa faz um loop
de volta para DoAnother.
D

I
C
A
ExcelVBABokks.indb 151 15/02/2013 13:59:45
152 Parte III: Conceitos de Programao
Sub BadLoop()
Dim StartVal As Long
Dim NumToFill As Long
Dim CellCount As Long
StartVal = InputBox(Insira o valor inicial: )
NumToFill = InputBox(Quantas clulas? )
ActiveCell = StartVal
CellCount = 1
DoAnother:
ActiveCell.Offset(CellCount, 0) = StartVal +
CellCount
CellCount = CellCount + 1
If CellCount < NumToFill Then GoTo DoAnother _
Else Exit Sub
End Sub
Esta rotina funciona conforme planejado, mas eu no estou particularmente orgulhoso dela. Ento, por que esse um exemplo de loop ruim?
Conforme mencionei anteriormente neste captulo, evite usar uma
declarao GoTo, a menos que seja absolutamente necessrio. Usar
declaraes para executar loop
5 contrrio ao conceito de programao estruturada (veja o
artigo apresentado anteriormente neste captulo O que
programao estruturada? Isso importa?)
5 Torna o cdigo mais difcil de ler.
5 mais propenso a erros do que usando procedimentos
estruturados de loop.
VBA tem tantos comandos estruturados de loop, que quase nunca voc
precisa se basear em declaraes GoTo para tomar suas decises. De
novo, a exceo est no tratamento de erros.
Agora, voc pode passar para uma discusso de estruturas de loop boa.
Loop For-Next
O tipo mais simples de loop o For-Next. Eis a sintaxe para essa
estrutura:
,
For counter = start To end [Step stepval]
[statements]
[Exit For]
[statements]
Next [counter]
O loop controlado por uma varivel counter (contador), a qual
comea em um valor e acaba em outro. As declaraes entre For e Next
ExcelVBABokks.indb 152 15/02/2013 13:59:45
153 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
so declaraes que se repetem no loop. Para ver isso funcionar,
continue lendo.
Um exemplo For-Next
O seguinte exemplo mostra um loop For-Next que no usa o valor
opcional Step ou a declarao opcional Exit. Essa rotina faz loops 20
vezes e usa a funo Rnd para entrar com um nmero aleatrio em 20
clulas, comeando com a clula ativa:
Sub FillRange()
Dim Count As Long
For Count = 0 To 19
ActiveCell.Offset(Count, 0) = Rnd
Next Count

End Sub
Neste exemplo, Count (a varivel que conta os loops) iniciada com o
valor 0 e aumenta em 1 cada vez que passa pela loop. Pelo fato de que
eu no especifiquei um valor Step, VBA usa o valor (1) padro. O
mtodo Offset usa o valor de Count como um argumento. Na primeira
vez que passa pelo loop, Count 0 e o procedimento entra com um
nmero offset (a diferena entre um valor atual e um valor desejado) na
clula ativa em zero linhas. Na segunda vez que passa (Count = 1), o
procedimento entrar com um nmero em offset na clula ativa em uma
linha, e assim por diante.
Porque o contador de loop uma varivel normal, voc pode escrever
cdigo para alterar o seu valor dentro do bloco de cdigos entre as
declaraes For e Next. No entanto, essa uma prtica muito ruim.
Alterar o contador dentro do loop pode levar a resultados imprevisveis. Tenha cuidado especial para garantir que o seu cdigo no altere
diretamente o valor do contador de loop.
Um exemplo de For-Next com um Step
Voc pode usar um valor Step para pular alguns valores em um loop
For-Next. Eis o mesmo procedimento da seo anterior, reescrito para
inserir nmeros aleatrios em clulas intercaladas:
Sub FillRante2()
Dim Count As Long
For Count = 0 To 19 Step 2
ActiveCell.Offset(Count, 0) = Rnd
Next Count
End Sub
Dessa vez, Count comea como 0 e depois toma o valor 2, 4, 6 e assim por
diante. O valor final de Count 18. O valor Step determina como o contador
incrementado. Veja que o valor superior do loop (19) no usado, pois o
valor mais alto de Count depois de 18 seria 20, e 20 maior do que 19.
A Figura 10-2 mostra o resultado obtido ao executar FillRange2 quando
a clula B2 a clula ativa.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 153 15/02/2013 13:59:45
154 Parte III: Conceitos de Programao
Anteriormente neste captulo, voc viu o exemplo BadLoop (loop ruim),
o qual usa uma declarao GoTo. Eis o mesmo exemplo, que est
disponvel no site deste livro, convertido a um loop bom, usando a
estrutura For-Next:
Sub GoodLoop()
Dim StartVal As Long
Dim NumToFill As Long
Dim CellCount As Long
StartVal = InputBox(Insira o valor inicial: )
NumToFil = InputBox(Quantas clulas? )
For CellCount = 1 To NumToFill
ActiveCell.Offset(CellCount - 1, 0) = _
StartVal + CellCount 1
Next CellCount
End Sub
Um exemplo For-Next com uma declarao Exit For
Um loop For-Next tambm pode incluir uma ou mais declaraes Exit
For dentro do loop. Quando VBA encontra essa declarao, o loop
termina imediatamente.

O exemplo seguinte, disponvel no site do livro, demonstra a declarao


Exit For. Essa rotina identifica quais clulas da planilha ativa na coluna
A tm o maior valor:
Sub ExitForDemo()
Dim MaxVal As Double
Dim Row As Long
MaxVal = WorksheetFunction.Max(Range(A:A))
For Row = 1 To Rows.Count
Figura 10-2:
Usando um
loop para
gerar
nmeros
aleatrios.
ExcelVBABokks.indb 154 15/02/2013 13:59:45
155 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
If Range(A1).Offset(Row-1, 0).Value = MaxVal Then
Range(A1).Offset(Row-1, 0).Activate
MsgBox Max value is in Row & Row
Exit For
End If
Next Row
End Sub
Essa rotina calcula o valor mximo na coluna, usando a funo MAX do
Excel e atribui o resultado varivel MaxVal (valor mximo). Depois, a
loop For-Next verifica cada clula na coluna. Se a clula sendo verificada for igual a MaxVal, a rotina no precisa continuar a fazer loop (o seu
trabalho est encerrado), assim a declarao Exit For encerra a loop.
Agora, voc poderia gritar, Ei, mas voc disse algo sobre usar sempre
um nico ponto de sada!. Bem, voc est certo e, obviamente, est
comeando a entender esse negcio de programao estruturada. Mas,
em alguns casos, uma deciso sbia ignorar essa regra. Neste exemplo, isso aumentar muito a velocidade de seu cdigo, porque no h
motivo para continuar o loop depois do valor ser encontrado.
Antes de encerrar o loop, o procedimento ativa a clula com o valor
mximo e informa ao usurio a localizao dele.
Observe que eu uso Rows.Count (contagem de linhas) na declarao
For. A propriedade de contar do objeto Rows retorna o nmero de
linhas na planilha. Portanto, voc pode usar esse procedimento com
verses anteriores de Excel (que tm menos linhas).
Um exemplo For-Next aninhado
At agora, todos os exemplos deste captulo usam loops relativamente
simples. Porm, voc pode ter qualquer quantidade de declaraes em
um loop e aninhar loops For-Next dentro de outros loops For-Next.
O seguinte exemplo usa um loop aninhado For Next para inserir
nmeros aleatrios em uma faixa de clulas de 12-linhas por 5 colunas,
conforme mostrado na Figura 10-3. Observe que a rotina executa o loop
interno (o loop com o contador Row), para cada iterao do loop
externo (o loop com o contador Col). Em outras palavras, a rotina
executa 60 vezes a declarao Cells(Row, Col) = Rnd.
Sub FillRange2()
Dim Col As Long
Dim Row As Long
For Col = 1 To 5
For Row = 1 To 12
Cells(Row, Col) = Rnd
Next Row
Next Col
End Sub
ExcelVBABokks.indb 155 15/02/2013 13:59:45

156 Parte III: Conceitos de Programao


O prximo exemplo usa loops For-Next aninhados para inicializar um array
tridimensional com o valor 100. Essa rotina executa a declarao no meio
de todas os loops (a declarao de atribuio) 1.000 vezes (10*10*10),
cada vez com uma combinao de valores diferentes para i, j e k:
Sub NestedLoops()
Dim MyArray(10, 10, 10)
Dim i As Integer
Dim j As Integer
Dim k As Integer
For i = 1 To 10
For j = 1 To 10
For k = 1 To 10
MyArray(i, j, k) = 100
Nest k
Next j
Next i
Other statements go here
End Sub
Para informaes sobre arrays, volte ao Captulo 7.
Loop Do-While
VBA suporta um outro tipo de estrutura de loop, conhecida como uma
loop Do-While. Diferente de uma loop For-Next, uma loop Do-While
continua at que seja atingida uma condio especificada. Eis a sintaxe
da loop Do-While:
Do [While condition]
[statements]
[Exit Do]
[statements]
Loop
Figura 10-3:
Estas
clulas
foram
preenchidas usando
um loop
For-Next
aninhado.
ExcelVBABokks.indb 156 15/02/2013 13:59:45
157 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
O exemplo a seguir usa um loop Do-While. Esta rotina usa a clula ativa
como ponto de partida e ento segue coluna abaixo, multiplicando cada
clula por 2. O loop continua at que a rotina encontre uma clula vazia.
Sub DoWhileDemo()
Do While ActiveCell.Value <> Empty
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Algumas pessoas preferem codificar um loop Do-While como um loop
Do-Loop While. Este exemplo age exatamente da mesma forma que o
procedimento anterior, mas usa uma sintaxe de loop diferente:
Sub DoLoopWhileDemo()
Do
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> Empty
End Sub
A principal diferena entre os loops Do-While e Do-Loop While: o loop

Do-While sempre roda o seu teste condicional primeiro. Se o teste no


for verdadeiro, as instrues dentro do loop nunca so executadas. O
loop Do-Loop While, em contrapartida, sempre executa o seu teste
condicional depois que as instrues anteriores ao loop forem executadas. Portanto, as instrues do loop sempre so executadas pelo
menos uma vez, independente do teste. A diferena pode, s vezes, ter
um grande efeito sobre o funcionamento do seu programa.
Loop Do-Until
A estrutura do loop Do-Until similar a estrutura do loop Do-While. As
duas estruturas diferem quanto a verificao das condies testadas.
Um programa continua executando um loop Do-While, enquanto a
condio permanecer verdadeira. Em um loop Do-Until, o programa
executa o loop at que a condio seja verdadeira.
Aqui est a sintaxe Do-Until:
Do [While condition]
[statements]
[Exit Do]
[statements]
Loop
O seguinte exemplo o mesmo apresentado para a loop Do-While,
porm, recodificado para usar a loop Do-Until:
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 157 15/02/2013 13:59:46
158 Parte III: Conceitos de Programao
Sub DoUntilDemo()
Do Until IsEmpty(ActiveCell.Value)
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Exatamente como com o loop Do-While, voc pode encontrar uma
forma diferente do loop Do-Until. O seguinte exemplo, o qual tem o
mesmo efeito que o procedimento anterior, demonstra uma sintaxe
alternativa para esse tipo de loop:
Sub DoLoopUntilDemo()
Do
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActivateCell.Value)
End Sub
Existe uma diferena sutil em como o loop Do-Until e o Do-Loop Until
operam. Na primeira, o teste executado no incio do loop, antes de
qualquer coisa no corpo do loop. Isso significa que possvel que o
cdigo no corpo do loop no ser executado se a condio de teste for
atingida. Na ltima verso, a condio testada ao final do loop.
Portanto, no mnimo, o loop Do-Loop sempre resulta no corpo do loop
ser executado uma vez.
Uma outra maneira de pensar a respeito disso assim: o loop Do-While
mantm o loop desde que a condio seja True (verdadeira). O loop
Do-Until prossegue desde que a condio seja False (falsa).
Fazendo Loop atravs de uma Collection
O VBA suporta ainda outro tipo de loop fazer loop em cada objeto em
uma coleo de objetos. Lembre-se que uma coleo consiste de uma
srie de objetos do mesmo tipo. Por exemplo, o Excel tem uma coleo

de todas as pastas de trabalho abertas (a coleo Workbooks), e cada


pasta de trabalho tem uma coleo de planilhas (a coleo Worksheets).
Quando voc precisa fazer loop atravs de cada objeto em uma coleo, use a estrutura For Each-Next. A sintaxe
For Each element In collection
[statements]
[Exit For]
[statements]
Next [element]
C
U
I
D
A
D
O!
ExcelVBABokks.indb 158 15/02/2013 13:59:46
159 Captulo 10: Controlando o Fluxo de Programa e Tomando Decises
O seguinte exemplo faz loop atravs de cada planilha na pasta de
trabalho ativa, e exclui a primeira linha de cada planilha:
Sub DeleteRow1()
Dim WkSht As Worksheet
For Each WkSht In activeWorkbook.Worksheets
WkSht.Rows(1).Delete
Next WkSht
End Sub
Neste exemplo, a varivel WkSht (planilha) um objeto varivel que
representa cada planilha na pasta de trabalho. No h nada especial
com relao ao nome WkSht voc pode usar qualquer nome de
varivel que quiser.
O exemplo que segue faz loops atravs das clulas em uma faixa e
verifica cada clula. O cdigo troca o sinal dos valores (valores negativos tornam-se positivos; valores positivos tornam-se negativos). Isso
feito multiplicando cada valor por -1. Observe que eu usei uma construo If-Then, junto com a funo IsNumeric VBA, para garantir que a
clula contenha um valor numrico:
Sub ChangeSign()
Dim Cell As Range
For Each Cell In Range(A1:E50)
If IsNumeric(Cell.Value) Then
Cell.Value = Cell.Value * -1
End If
Next Cell
End Sub
O exemplo de cdigo acima tem um problema: ele altera quaisquer
frmulas na faixa pela qual faz loops atravs de valores, apagando as
suas frmulas. Provavelmente, no isso que voc quer. Eis uma outra
verso da Sub que pula clulas de frmula. Ela verifica se a clula tem
uma frmula, acessando a propriedade HasFormula:
Sub ChangeSign2()
Dim Cell As Range
For Each Cell In Range(A1:E50)
If Not Cell.HasFormula Then
If IsNumeric(Cell.Value) Then
Cell.Value = Cell.Value * -1
End If
End If
Next Cell
End Sub
E a seguir est mais um exemplo de For Each-Next. O procedimento faz

loops atravs de cada grfico em Sheet1 (isto , cada membro da


coleo ChartObjects e altera cada grfico para uma linha de grfico.
No exemplo, Cht uma varivel que representa cada ChartObject. Se
Sheet1 no tiver ChartObjects, nada acontece.
ExcelVBABokks.indb 159 15/02/2013 13:59:46
160 Parte III: Conceitos de Programao
Sub ChangeCharts()
Dim Cht As ChartObject
For Each Cht In Sheets(Plan1).ChartObjects
Cht.Chart.Charttype = xlLine
Next Cht
End Sub
Para escrever um procedimento como ChargeCharts voc precisa saber
alguma coisa sobre o modelo objeto para grficos. Essas informaes
podem ser obtidas, gravando uma macro para descobrir quais objetos
esto envolvidos e depois, verificando o sistema de Ajuda para detalhes.
Usurios de Excel 2007 esto com pouca sorte aqui: o gravador de macro
em Excel 2007 no grava todas as alteraes que voc faz no grfico.
ExcelVBABokks.indb 160 15/02/2013 13:59:46


Captulo 11
Procedimentos e Eventos
Automticos
Neste Captulo
Conhecendo os tipos de eventos que podem desencadear uma execuo
Como descobrir onde colocar o seu cdigo VBA que lida com eventos
Executando uma macro quando uma pasta de trabalho est aberta ou fechada
Executando uma macro quando uma pasta de trabalho ou planilha est ativada
V
oc tem uma srie de formas de executar um procedimento VBA
Sub. Uma delas organizar para que Sub seja automaticamente
executado. Neste captulo, abordo os prs e os contras desse recurso
potencialmente til, explicando como acertar as coisas para que uma
macro seja executada automaticamente quando ocorrer um evento em
especial. No, este captulo no sobre pena de morte.
Preparao para o Grande Evento
Sobre quais tipos de eventos estou falando aqui? Boa pergunta. Basicamente, um evento alguma coisa que acontece no Excel. A seguir, esto
alguns exemplos dos tipos de eventos com os quais o Excel pode lidar:
5 Uma pasta de trabalho aberta ou fechada.
5 Uma janela ativada.
5 Uma planilha ativada ou desativada.
5 Dados so fornecidos em uma clula ou a clula editada.
5 Uma pasta de trabalho salva.
5 Uma planilha calculada.
5 Um objeto, tal como um boto, clicado.
5 Uma tecla em especial, ou uma combinao de teclas pressionada.
5 Uma hora especfica do dia ocorrer.
5 Ocorrncia de um erro.
ExcelVBABokks.indb 161 15/02/2013 13:59:46
162 Parte III: Conceitos de Programao
A maioria dos programadores de Excel nunca precisa se preocupar com a
maioria dos eventos desta lista. No entanto, voc deveria pelo menos saber
que estes eventos existem, pois algum dia eles podem se tornar teis. Neste
captulo, eu discuto a maioria dos eventos mais comuns. Para simplificar as
coisas, falo sobre dois tipos de eventos: pasta de trabalho e planilha.
A Tabela 11-1 relaciona a maior parte dos eventos relacionados pasta de
trabalho. Se, por algum motivo, voc precisar ver a lista completa de eventos
relacionados pasta de trabalho, poder encontr-la na Ajuda do sistema.

Tabela 11-1 Eventos de Pasta de Trabalho


Evento Quando Ele Acionado
Activate A pasta de trabalho ativada.
AddinInstall Um add-in instalado (importante apenas para add-ins).
AddinUninstall O add-in desinstalado (importante apenas para add-ins).
BeforeClose A pasta de trabalho fechada.
BeforePrint A pasta de trabalho impressa.
BeforeSave A pasta de trabalho salva.
Deactivate A pasta de trabalho desativada.
NewSheet Uma nova planilha adicionada pasta de trabalho.
Open A pasta de trabalho aberta.
SheetActivate Uma planilha da pasta de trabalho ativada.
SheetBeforeDoubleClick Uma clula na pasta de trabalho clicada duas vezes.
SheetBeforeRightClick Uma clula na pasta de trabalho clicada com o boto direito.
SheetCalculate Uma planilha na pasta de trabalho recalculada.
SheetChange Uma alterao feita em uma clula na pasta de trabalho.
SheetDeactivate Uma planilha na pasta de trabalho desativada.
SheetFollowHyperlink Um hyperlink em uma pasta de trabalho clicado.
SheetSelectionChange A seleo alterada.
WindowActivate A janela da pasta de trabalho ativada.
WindowDeactivate A janela da pasta de trabalho desativada.
WindowResize A janela da pasta de trabalho redimensionada.
A Tabela 11-2 relaciona a maioria dos eventos relacionados planilha.
ExcelVBABokks.indb 162 15/02/2013 13:59:46
163 Captulo 11: Procedimentos e Eventos Automticos
Tabela 11-2 Eventos de Planilha
Evento Quando Ele Acionado
Activate A planilha ativada.
BeforeDoubleClick Uma clula na planilha clicada duas vezes.
BeforeRichtClick Uma clula na planilha clicada com o boto direito.
Calculate A planilha recalculada.
Change Uma alterao feita em uma clula na planilha.
Deactivate A planilha desativada.
FollowHyperlink Um hyperlink ativado.
SelectionChange A seleo alterada.
Os eventos so teis?
A essa altura, voc pode estar se perguntando como esses eventos
podem ser teis. Eis um rpido exemplo.
Imagine que voc tem uma pasta de trabalho onde voc entra com
dados na coluna A. O seu chefe diz que precisa saber exatamente
quando cada ponto dos dados foi inserido. Entrar com dados um
evento um evento WorksheetChange. Voc pode escrever uma macro
que responda a esse evento. Aquela macro detecta sempre que a
planilha alterada. Se a alterao foi feita na coluna A, a macro coloca a
data e a hora na coluna B, prximo ao ponto dos dados que voc
forneceu.
No caso de voc ser curioso, eis como tal macro se pareceria (ela
deveria estar no mdulo Cdigo da planilha). Provavelmente, muito
mais simples do que voc imaginou que seria, no ?
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Target.Offset(0, 1) = Now
End If
End Sub
S porque a sua pasta de trabalho contm procedimentos que respondem a eventos no garante que aqueles procedimentos, de fato, rodaro. Como voc sabe, possvel abrir uma pasta de trabalho com as
macros desativadas. Em tal situao, todas as macros (at procedimentos que respondem a eventos) so desativadas. Tenha isso em mente

quando criar pastas de trabalho que se baseiam em procedimentos que


lidam com eventos.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 163 15/02/2013 13:59:46
164 Parte III: Conceitos de Programao
Programando procedimentos
que lidam com eventos
Um procedimento VBA executado em resposta a um evento chamado
de um procedimento que lida com evento. Esses so sempre procedimentos Sub (em oposto aos procedimentos Function). Escrever esses
manejadores de evento relativamente direto depois que voc entende
como funciona o processo. Tudo se resume em algumas etapas, as
quais explico a seguir:
1. Identifique o evento que deseja para acionar o procedimento.
2. Pressione Alt+F11 para ativar o Visual Basic Editor.
3. Na Janela de Projeto VBE, clique duas vezes o objeto adequado
listado sob Microsoft Excel Objetos.
Para eventos relacionados pasta de trabalho, o objeto EstaPasta_de_Trabalho. Para um evento relacionado planilha, o objeto
Worksheet (tal como Plan1).
4. Na janela Cdigo do objeto, escreva o procedimento que lida
com evento que executado quando o evento ocorre.
Este procedimento ter um nome especial que o identifica como
um procedimento que lida com evento.
Estas etapas tornam-se mais claras na medida em que voc se adianta
no captulo. Confie em mim.
Aonde Vai o Cdigo VBA?
muito importante entender aonde vo os seus procedimentos que
lidam com evento. Eles precisam ficar na janela Cdigo de um mdulo
Objeto. Eles no ficam em um mdulo VBA padro. Se voc puser o seu
procedimento que lida com evento no lugar errado, ele simplesmente
no vai funcionar. E voc no v quaisquer mensagens de erro.
A Figura 11-1 mostra a janela VBE com um projeto exibido na janela
Projeto (para saber mais sobre o VBE, veja o Captulo 3). Observe que
o projeto VBA para Pasta1 est totalmente expandido e consiste de
vrios objetos:
5 Um objeto para cada planilha na pasta de trabalho (neste caso,
trs objetos Plan1)
5 Um objeto nomeado Estapasta_de_trabalho
5 Um mdulo VBA que eu inseri manualmente, usando o comando
Inserir Mdulo.
ExcelVBABokks.indb 164 15/02/2013 13:59:46
165 Captulo 11: Procedimentos e Eventos Automticos
Clicar duas vezes em qualquer um desses objetos exibe o cdigo
associado ao item, se houver.
Os procedimentos que lidam com evento que voc escreve vo na janela
Cdigo para o item EstaPasta_de_Trabalho (para eventos relacionados
pasta de trabalho) ou um dos objetos Plan (para eventos relacionados
planilha).
Na Figura 11-1, a janela Cdigo para o objeto Plan1 exibida, e por
acaso, tem um nico procedimento que lida com eventos definido. Viu
as duas caixas de listagem drop-down no alto do mdulo Cdigo?
Continue lendo para descobrir porque elas so teis.
Escrevendo um Procedimento

Que Lida com Evento


O VBE o ajuda quando voc est pronto para escrever um procedimento que lida com evento; ele exibe uma lista de todos os eventos para o
objeto selecionado.
No alto de cada janela Cdigo, voc encontra duas listas drop-down:
5 A lista de Objeto ( esquerda)
5 A lista de Procedimento ( direita)
Por padro, a lista de Objeto na janela Cdigo exibe o termo Geral. Se
voc estiver escrevendo um procedimento que lida com evento para o
objeto EstaPasta_de_Trabalho, precisa escolher Workbook na caixa de
listagem Objeto (esta a nica escolha).
Figura 11-1:
A janela
VBE exibe
itens para
um nico
projeto.
ExcelVBABokks.indb 165 15/02/2013 13:59:46
166 Parte III: Conceitos de Programao
Se estiver escrevendo para manipular o evento de um objeto Sheet, voc
precisa escolher Worksheet (novamente, a nica escolha).
Depois de ter feito a sua escolha a partir da lista de Objeto, voc pode
escolher o evento da lista drop-down Procedimento. A Figura 11-2 mostra
as escolhas para um evento relacionado pasta de trabalho.
Quando voc seleciona um evento da lista, automaticamente o VBE
comea a criar para voc um procedimento que lida com o evento. Esse
um recurso muito til, pois voc pode verificar se os argumentos
adequados so usados.
Eis um pequeno capricho. Quando voc selecionou Workbook pela
primeira vez na lista Objeto, o VBE sups que voc queria criar um
procedimento para o evento Open e o criou para voc. Se voc estiver, de
fato, criando um procedimento Workbook_Open, est timo. Mas se
estiver criando um procedimento de evento diferente, precisa apagar a
Sub Workbook_Open vazia que o Excel criou.
No entanto, a ajuda do VBE s vai at aqui. Ele escreve a declarao
Sub e a declarao End Sub. seu trabalho escrever o cdigo VBA que
fica entre essas duas declaraes.
Na verdade, voc no precisa usar aquelas duas listas drop-down, mas
facilita o seu trabalho, pois o nome do procedimento que lida com
evento muito importante. Se voc no tiver o nome exato, ele no
funciona. Alm disso, alguns procedimentos que lidam com evento
usam um ou mais argumentos na declarao Sub. No h como voc
lembrar quais so aqueles argumentos. Por exemplo, se voc selecionar
SheetActivate da lista de eventos para um objeto Workbook, o VBE
escreve a seguinte declarao Sub:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Figura 11-2:
Escolhendo
um evento na
janela Cdigo
para o objeto
EstaPasta_
de_trabalho.
L
E
M
B
R
E
-SE

ExcelVBABokks.indb 166 15/02/2013 13:59:46


167 Captulo 11: Procedimentos e Eventos Automticos
Neste caso, Sh o argumento passado ao procedimento e uma
varivel que representa a planilha na pasta de trabalho ativada. Exemplos neste captulo esclarecem esta questo.
Exemplos Introdutrios
Nesta seo, apresento alguns exemplos para que voc possa ter uma
ideia sobre esse negcio de lidar com eventos.
O evento Open para uma pasta de trabalho
Um dos eventos mais usados o evento Workbook Open. Digamos que
voc tem uma pasta de trabalho que usa diariamente. O procedimento
Workbook_Open neste exemplo executado cada vez que a pasta de
trabalho aberta. O procedimento verifica o dia da semana; se for
Sexta-Feira, o cdigo exibe uma mensagem lembrando-o.
Para criar o procedimento que executado sempre que ocorrer o
evento Workbook Open, siga estes passos:
1. Abra uma pasta de trabalho.
Qualquer pasta de trabalho serve.
2. Pressione Alt+F11 para ativar o VBE.
3. Localize a pasta de trabalho na janela Projeto.
4. Clique duas vezes o nome do projeto para exibir os seus itens, se
necessrio.
5. Clique duas vezes o item EstaPasta_de_Trabalho.
O VBE exibe uma janela de Cdigo vazia para o objeto
EstaPasta_de_Trabalho.
6. Na janela Cdigo, selecione Workbook a partir da lista
drop-down de Objeto ( esquerda).
O VBE insere declaraes no incio e no final para um procedimento Workbook_Open.
7. Entre com as seguintes declaraes, para que o procedimento
de evento completo se parea com isto:
Private Sub Workbook_Open()
Dim Msg As String
If WeekDay(Now) = 6 Then
Msg = Today is Friday. Make sure that you
Msg = Msg & do your weekly backup!
MsgBox Msg
End If
End Sub
ExcelVBABokks.indb 167 15/02/2013 13:59:47
168 Parte III: Conceitos de Programao
A janela Cdigo deve parecer com a Figura 11-3.
Workbook_Open automaticamente executado sempre que a pasta de
trabalho for aberta. Ele usa a funo WeekDay do VBA para determinar
o dia da semana. Se for sexta-feira (dia 6), uma caixa de mensagem
lembra o usurio para fazer o backup semanal. Se no for sexta-feira,
nada acontece.
Se hoje no for sexta-feira, voc pode ter dificuldades para testar esse
procedimento. Aqui est uma oportunidade de testar a sua habilidade em
VBA. Voc pode modificar esse procedimento como quiser. Por exemplo,
a seguinte verso exibe uma mensagem sempre que a pasta de trabalho
aberta. Isso irritante depois de algum tempo, acredite em mim.
Private Sub workbook_Open()
Msg = Esta a pasta de trabalho legal de Frank!
MsgBox Msg
End Sub
Um procedimento Workbook_Open pode fazer quase qualquer coisa.
Geralmente, esses acionadores de evento so usados para o seguinte:
5 Exibir mensagens de boas vindas (tal como na bacana pasta de
trabalho do Frank).

5 Abrir outras pastas de trabalho.


5 Ativar uma planilha em especial na pasta de trabalho.
5 Configurar menus de atalho personalizados.
Figura 11-3:
O procedimento para
manipular o
evento
executado
quando a
pasta de
trabalho
aberta.
ExcelVBABokks.indb 168 15/02/2013 13:59:47
169 Captulo 11: Procedimentos e Eventos Automticos
O evento BeforeClose para
uma pasta de trabalho
Eis um exemplo do procedimento que lida com eventos Workbook_BeforeClose, o qual executado imediatamente antes da pasta de trabalho
ser fechada. Esse procedimento est localizado na janela Cdigo para
um objeto This Workbook (Esta Pasta_de_Trabalho):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Msg As String
Dim Ans As Integer
Dim FName As String
Msg = Gostaria de fazer um backup deste arquivo?
Ans = MsgBox(Msg, vbYesNo)
If Ans = vbYes Then
FName = F:\BACKUP\ & ThisWorkbook.Name
ThisWorkbook.SaveCopyAs FName
End If
End Sub
Esta rotina usa uma caixa de mensagem para perguntar ao usurio se ele
gostaria de fazer uma cpia da pasta de trabalho. Se a resposta for sim, o
cdigo usa o mtodo SaveCopyAs, para salvar uma cpia do arquivo no
drive F. Se voc adaptar esse procedimento para o seu prprio uso,
provavelmente precisar mudar o drive e o caminho.
Frequentemente, programadores de Excel usam um procedimento
Workbook_BeforeClose para fazer uma limpeza. Por exemplo, se voc usa
um procedimento Workbook_Open para mudar algumas configuraes
ao abrir uma pasta de trabalho (ocultando a barra de status, por exemplo), simplesmente adequado que voc retorne as configuraes
posio original quando fechar a pasta de trabalho. Voc pode realizar
essa limpeza eletrnica com um procedimento Workbook_BeforeClose.
Existe uma advertncia com o evento Workbook_BeforeClose. Se voc
fechar o Excel e qualquer arquivo aberto tiver sido modificado desde a
ltima vez em que foi salvo, o Excel mostrar a sua habitual caixa de
mensagem Deseja salvar as alteraes. Clicar o boto Cancelar
cancela todo o processo de encerramento. Mas, o evento Workbook_BeforeClose ter sido executado de qualquer forma.
O evento BeforeSave para
uma pasta de trabalho
O evento BeforeSave, como o nome sugere, disparado antes que uma
pasta de trabalho seja salva. Esse evento acontece quando voc usa o
comando Arquivo Salvar ou o comando Arquivo Salvar Como.
O seguinte procedimento a seguir que colocado na janela Cdigo de
um objeto This Workbook, demonstra o evento BeforeSave. A rotina
atualiza o valor em uma clula (clula A1 em Sheet1) sempre que a
pasta de trabalho salva. Em outras palavras, a clula A1 serve como
um contador, para controlar o nmero de vezes que o arquivo foi salvo.

C
U
I
D
A
D
O!
ExcelVBABokks.indb 169 15/02/2013 13:59:47
170 Parte III: Conceitos de Programao
Private Sub Workbook_BeforeSave(ByVal SaveAsUI _
As Boolean, Cancel as Boolean)
Sheets(Sheet1).Range(A1).Value = _
Sheets(Sheet1).Range(A1).Value +1
End Sub
Observe que o procedimento Workbook_BeforeSave tem dois argumentos, SaveAsUI (Salvar Como Interface de Usurio) e Cancel (Cancelar).
Para demonstrar como estes argumentos funcionam, examine a seguinte macro, que executada antes que a pasta de trabalho seja salva. Este
procedimento evita que o usurio salve a pasta de trabalho com um
nome diferente. Se o usurio escolher o comando ArquivoSalvar
Como, ento o argumento SaveAsUI Verdadeiro.
Quando o cdigo executar, ele verifica o valor SaveAsUI. Se essa
varivel for True (verdadeira), o procedimento exibe uma mensagem e
configura Cancel para True, o que cancela a operao Save.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI _
As Boolean, Cancel As Boolean)
If SaveAsUI Then
MsgBox Voc no pode salvar uma cpia desta
pasta!
Cancel = True
End If
End Sub
Tenha em mente que este procedimento, na verdade, no evita que algum
salve uma cpia com um nome diferente. Se algum quiser, de fato, faz-lo,
basta abrir a pasta de trabalho com as macros desativadas. Quando as
macros esto desativadas, os procedimentos acionadores de eventos
tambm esto o que faz sentido, pois afinal, todos eles so macros.
Exemplos de Ativao de Eventos
Uma outra categoria de eventos consiste em ativar e desativar objetos
especificamente planilhas e pastas de trabalho.
Ativar e desativar eventos em uma planilha
O Excel pode detectar quando uma planilha em especial ativada ou
desativada e executar uma macro quando ocorrer qualquer um desses
eventos. Esses procedimentos que lidam com eventos ficam na janela
Cdigo do objeto Sheet.
ExcelVBABokks.indb 170 15/02/2013 13:59:47
171 Captulo 11: Procedimentos e Eventos Automticos
Voc pode acessar rapidamente a janela de cdigo de uma planilha, clicando com o boto direito na guia da planilha e selecionando Ver Cdigo.
O exemplo a seguir mostra um simples procedimento que executado
sempre que uma planilha em especial ativada. Esse cdigo apenas faz
surgir uma caixa de mensagem que exibe o nome da planilha ativa:
Private Sub Worksheet_Activate()
MsgBox You just activated & ActiveSheet.Name
End Sub
Eis um outro exemplo que ativa a clula A1 sempre que a planilha
for ativada:
Private Sub Worksheet_Activate()
Range(A1).Activate

End Sub
Ainda que o cdigo nestes dois procedimentos seja quase to simples
quanto possvel, os procedimentos que acionam eventos podem ser to
complexos quanto voc quiser.
O seguinte procedimento (o qual est armazenado na janela Cdigo do
objeto Sheet1) usa o evento Deactivate (Desativar) para evitar que um
usurio ative qualquer outra planilha na pasta de trabalho. Se Sheet1
estiver desativada (isto , outra planilha estiver ativa), o usurio recebe
uma mensagem e Sheet1 ativada.
Private Sub Worksheet_Deactivate()
MsgBox You must stay on Sheet1
Sheets(Sheet1).Activate
End Sub
A propsito, eu no recomendo usar procedimentos como este, que
tenta assumir o Excel. Esses aplicativos chamados de ditadores
podem ser bem frustrantes e confusos ao usurio. Ao invs disso,
recomendo treinar o usurio a usar corretamente o seu aplicativo.
Ativar e desativar eventos
em uma pasta de trabalho
Os exemplos anteriores usam eventos associados a uma planilha
especfica. O objeto EstaPasta_de_Trabalho tambm aciona eventos
que lidam com a ativao e desativao de planilha. O seguinte procedimento, o qual armazenado na janela Cdigo do objeto ThisWorkbook,
executado quando qualquer planilha na pasta de trabalho ativada. O
cdigo exibe uma mensagem com o nome da planilha ativada.
D
I
C
A
ExcelVBABokks.indb 171 15/02/2013 13:59:47
172 Parte III: Conceitos de Programao
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
End Sub
O procedimento Workbook_SheetActivate usa o argumento Sh. Sh
uma varivel que representa o objeto ativo Sheet. A caixa de mensagem
exibe a propriedade Name do objeto Sheet. O prximo exemplo est
contido em uma janela do cdigo de EstaPasta_de_Trabalho. Ele
consiste de dois procedimentos que lidam com eventos:
5 Workbook_SheetDeactivate: Executado quando qualquer
planilha na pasta de trabalho for desativada. Ele armazena a
planilha que desativada em um objeto varivel (a palavra
chave Set cria um objeto varivel).
5 Workbook_SheetActivate: Executado quando qualquer planilha
na pasta de trabalho for ativada. Ele verifica o tipo de planilha
que est ativa (usando a funo TypeName). Se a planilha for
uma planilha de grfico, o usurio recebe uma mensagem (ver
Figura 11-4). Quando o boto OK na caixa de mensagem for
clicado, a planilha anterior (que est armazenada na varivel
OldSheet) reativada.
Figura
11-4:
Quando
uma
planilha de
grfico
ativada, o
usurio v
uma
mensagem

como esta.
ExcelVBABokks.indb 172 15/02/2013 13:59:47
173 Captulo 11: Procedimentos e Eventos Automticos
Uma pasta de trabalho que contm este cdigo est disponvel no site
deste livro.
Dim OldSheet As Object
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Set OldSheet = Sh
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Msg As String
If TypeName(Sh) + Chart Then
Msg = Esse grfico contm
Msg = Msg & ActiveChart.SeriesCollection(1).
Points.Count
Msg = Msg & pontas de dados. & vbNewLine
Msg = Msg & Clique OK para retornar a & OldSheet.
Name
MsgBox Msg
OldSheet.Activate
End If
End Sub
Eventos de ativao de pasta de trabalho
O Excel tambm reconhece o evento que ocorre quando voc ativa ou
desativa uma pasta de trabalho em especial. O seguinte cdigo, que
est contido na janela Cdigo do objeto EstaPasta_de_Trabalho,
executado sempre que a pasta de trabalho ativada. O procedimento
apenas maximiza a janela da pasta de trabalho.
Private Sub Workbook_Activate()
ActivateWindow.WindowState = xlMaximized
End Sub
O cdigo Workbook_Deactivate, mostrado a seguir, executado quando
uma pasta de trabalho desativada. Eis um exemplo de procedimento
que copia a faixa selecionada. Ele pode ser til se voc estiver copiando
dados de muitas reas diferentes e colando-os em uma pasta de trabalho diferente. Selecione a faixa, ative a outra pasta de trabalho, selecione o destino e pressione Ctrl+V para colar os dados copiados.
Private Sub Workbook_Deactivate()
ThisWorkbook.Windows(1).RangeSelection.Copy
End Sub
Simples assim, este procedimento exigiu algumas tentativas antes que
eu conseguisse faz-lo funcionar corretamente. Primeiro, eu tentei isto:
Selection.copy
ExcelVBABokks.indb 173 15/02/2013 13:59:47
174 Parte III: Conceitos de Programao
Esta declarao no funcionou conforme o pretendido. Ela copiou a faixa da
segunda pasta de trabalho (a que eu ativei depois de desativar a primeira
pasta de trabalho). Isso, porque a segunda pasta de trabalho tornou-se a
primeira pasta de trabalho depois da ocorrncia do evento de desativao.
Esta declarao tambm no funcionou. Na verdade, ela me deu um
erro em tempo de execuo:
ThisWorkbook.ActiveSheet.Selection.Copy
Eventualmente, eu me lembrei da propriedade RangeSelection de um
objeto Window. E essa fez o truque.
Outros Eventos Relacionados
Worksheet (Planilha)
Na seo anterior, apresentei exemplos de eventos de ativao e
desativao de planilha. Nesta seo, eu discuto trs eventos adicionais
que ocorrem em planilhas: clicar duas vezes em uma clula, clicar com
o boto direito em uma clula e alterar uma clula.

O evento BeforeDoubleClick
Voc pode configurar um procedimento VBA para ser executado
quando o usurio clicar duas vezes em uma clula. No exemplo a seguir
(o qual armazenado na janela Cdigo de um objeto Sheet), clicar duas
vezes em uma clula da planilha deixa a clula em negrito (se ela no
estiver em negrito) ou sem negrito (se ela estiver em negrito).
Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Excel.Range, Cancel As Boolean)
Target.Font.Bold = Not Target.Font.Bold
Cancel = True
End Sub
O procedimento Worksheet_BeforeDoubleClick tem dois argumentos:
Target e Cancel. Target representa a clula (um objeto Range) que foi
clicado duas vezes. Se Cancel estiver configurado para Verdadeiro, a
ao padro de clicar duas vezes no acontece.
A ao padro de clicar duas vezes em uma clula colocar o Excel no
modo de edio da clula. Eu no quero que isso acontea, portanto,
configuro Cancel para Verdadeiro.
O evento BeforeRightClick
O evento BeforeRightClick semelhante ao evento BeforeDoubleClick,
exceto que ele consiste em clicar com o boto direito em uma clula. O
ExcelVBABokks.indb 174 15/02/2013 13:59:47
175 Captulo 11: Procedimentos e Eventos Automticos
seguinte procedimento verifica que a clula que foi clicada com o boto
direito contm um valor numrico. Se for o caso, o cdigo exibe a caixa
de dilogo Format Number e configura o argumento Cancel para
Verdadeiro (evitando a exibio normal do menu de atalho). Se a clula
no tiver um valor numrico, nada de especial acontece o menu de
atalho exibido, como de costume.
Private Sub Worksheet_BeforeRightClick _
(ByVal Target As Excel.Range, Cancel As Boolean)
If IsNumeric(Target) And Not IsEmpty(Target) Then
Applicaation.CommandBars.ExecuteMso _
(NumberFormatsDialog)
Cancel = True
End If
End Sub
Observe que o cdigo, que est disponvel no site deste livro, faz uma
verificao adicional para ver se a clula no est vazia. Isso, porque o
VBA considera clulas vazias como sendo numricas. No me pergunte
o motivo; ele simplesmente considera.
O evento Change
O evento Change acontece sempre que qualquer clula na planilha
alterada. No seguinte exemplo, o procedimento Worksheet_Change evita,
efetivamente, que um usurio entre com um valor no numrico na clula
A1. Este cdigo armazenado na janela Cdigo de um objeto Sheet.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = $A$1 Then
If Not IsNumeric(Target) Then
MsgBox = Insira um nmero na clula A1.
Range(A1).ClearContents
Range(A1).Activate
End If
End If
End Sub
O nico argumento para o procedimento Worksheet_Change representa a
faixa que foi alterada. A primeira declarao verifica se o endereo da
clula $A$1. Se for, o cdigo usa a funo IsNumeric para determinar se a
clula contm um valor numrico. Se no, aparece uma mensagem e o
valor da clula apagado. Ento, a clula A1 ativada til, se o indicador

da clula mudou para uma clula diferente depois da entrada ser feita. Se
houver a alterao em qualquer clula, exceto A1, nada acontece.
Por que no usar validao de dados?
Voc pode estar familiarizado com o comando DadosFerramentas de
DadosValidao de Dados. Esse um recurso conveniente que visa
garantir que apenas dados do tipo adequado sejam inseridos em uma
ExcelVBABokks.indb 175 15/02/2013 13:59:47
176 Parte III: Conceitos de Programao
clula ou faixa em especial. Ainda que o comando Dados Ferramentas
de Dados Validao de Dados seja til, definitivamente, ele no prova de tolos. Para demonstrar, inicie com uma planilha em branco e
execute as seguintes etapas:
1. Selecione a faixa A1:C12.
2. Escolha Dados Ferramentas de Dados Validao de Dados.
3. Configure os seus critrios de validao para s aceitar nmeros
inteiros entre 1 e 12, conforme mostrado na Figura 11-5.
Agora, entre com alguns valores na faixa A1:C12. A validao de dados
funciona como deveria. Porm, para v-la se desfazer nas costuras,
tente isso:
1. Entre com -1 em qualquer clula fora da faixa de validao
(qualquer clula fora de A1:C12).
2. Pressione Ctrl+C para copiar o nmero negativo para a
Clipboard (rea de Transferncia).
3. Selecione qualquer clula na faixa de validao.
4. Pressione Ctrl+V para colar o valor copiado.
Voc descobre que a operao de colar permitida. Porm, olhe um
pouco mais de perto e voc descobre que a clula na qual voc colou o
valor negativo no tem mais qualquer critrio de validao. Colar apaga
os critrios de validao de dados! O rigor para tratar essa falha
depende do seu aplicativo. Na prxima seo, descrevo como usar o
evento Change para fornecer uma validao melhor.
Colar apaga a validao de dados porque o Excel considera a validao
um formato de clula. Portanto, ela est na mesma classificao que
tamanho de fonte, cor ou outros atributos semelhantes. Quando voc
cola uma clula, est substituindo os formatos da clula. Infelizmente,
tais formatos tambm incluem as regras de validao.
Figura 11-5:
Estas
configuraes s
permitem
nmeros
inteiros entre
1 e 12.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A

ExcelVBABokks.indb 176 15/02/2013 13:59:48


177 Captulo 11: Procedimentos e Eventos Automticos
Como evitar que a validao de dados seja eliminada
O procedimento nesta seo demonstra como evitar que os usurios
copiem dados e apaguem regras de validao de dados. Este exemplo
supe que a planilha tenha uma faixa chamada InputRange e que essa
rea de entrada contenha regras de validao de dados (configuradas,
usando o comando Dados Ferramentas de Dados Validao de
Dados). A faixa pode ter quaisquer regras de validao que voc quiser.
Uma pasta de trabalho contendo este cdigo est disponvel no site
deste livro:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim VT As Long
Todas as clulas na faixa de validao
ainda?
On Error Resume Next
VT = Range(InputRange).Validation.Type
If Err.Number <> 0 Then
Application.Undo
MsgBox Sua ltima operao foi cancelada. & _
Teria deletado as regras de validao de dados., _
vbCritical
End If
End Sub
O procedimento executado sempre que uma clula alterada. Ele
verifica o tipo de validao da faixa (chamada de InputRange) que
deveria conter as regras de validao de dados. Se a varivel VT
contiver um erro, isso significa que uma ou mais clulas na InputRange
no tm mais validao de dados (provavelmente, o usurio copiou
alguns dados sobre ela). Se esse for o caso, o cdigo executa o mtodo
Undo (desfazer) do objeto Application e reverte a ao do usurio.
Depois, ele exibe uma caixa de mensagem.
Efeito em cadeia? impossvel apagar as regras de validao copiando
dados. Quando o Excel apresentar falhas, use o VBA para repar-lo.
Eventos No Associados a Objetos
Os eventos que discuti anteriormente neste captulo so associados ou
a um objeto Workbook ou a um objeto WorkSheet. Nesta seo, discuto
dois tipos de eventos que no esto associados a objetos: horrio e
toques de tecla.
Como horrio e toques de tecla no esto associados a um objeto
especfico, tal como uma pasta de trabalho ou uma planilha, voc
programa esses eventos em um mdulo normal VBA (diferente de
outros eventos discutidos neste captulo).
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 177 15/02/2013 13:59:48
178 Parte III: Conceitos de Programao
O evento OnTime
O evento OnTime acontece com a ocorrncia de uma hora especfica do
dia. O exemplo a seguir demonstra como fazer o Excel executar um
procedimento quando ocorre o evento 15h00. Nesse caso, uma voz
robotizada diz para voc acordar, acompanhada por uma caixa de
dilogo:
Sub SetAlarm()
Application.OnTime 0.625, DisplayAlarm

End Sub
Sub DisplayAlarm()
Application.Speech.Speak (Hey, acorde)
MsgBox hora para seu descanso vespertino!
End Sub
Neste exemplo, eu uso o mtodo OnTime do objeto Application. Este
mtodo toma dois argumentos: a hora (0.625 ou 15h00) e o nome do
procedimento Sub para executar quando ocorrer o evento da hora
(DisplayAlarm).
Este procedimento bem til se voc tem a tendncia de ficar to
envolvido em seu trabalho que esquece de reunies e encontros. Basta
ajustar um evento OnTime para se lembrar.
A maioria das pessoas (inclusive este autor) encontra dificuldades em
pensar em horrio em termos do sistema de numerao do Excel.
Portanto, voc pode querer usar a funo TimeValue (Valor de Hora) do
VBA para representar a hora. TimeValue converte uma string que se
parece com uma hora em um valor com o qual o Excel pode lidar. A
seguinte declarao mostra uma maneira fcil de programar um evento
para as 15 horas:
Application.OnTime TimeValue(3:00:00 pm), DisplayAlarm
Se voc quiser programar um evento referente ao horrio atual por exemplo,
20 minutos a contar de agora pode usar uma declarao como esta:
Application.OnTime Now + TimeValue(00:20:00),
DisplayAlarm
Tambm possvel usar o mtodo OnTime para rodar um procedimento VBA em determinado dia. Voc precisa assegurar que o seu computador continue rodando e que a pasta de trabalho com o procedimento
seja mantida aberta. A seguinte declarao executa o procedimento
DisplayAlarm s 17h00, em 31 de Dezembro de 2010:
Application.OnTime DateValue(12/31/2010 5:00 pm), _
DisplayAlarm
D
I
C
A
ExcelVBABokks.indb 178 15/02/2013 13:59:48
179 Captulo 11: Procedimentos e Eventos Automticos
Esta linha de cdigo em especial pode ser til para avis-lo de que
precisa ir para casa e se preparar para as festas do Ano Novo.
Eis outro exemplo que usa o evento OnTime. Executar os procedimentos UpdateClock escreve a hora na clula A1 e tambm programa um
outro evento cinco segundos depois. Esse evento roda novamente o
procedimento UpdateClock. O efeito em cadeia ocorre porque a clula
A1 atualizada com o horrio atual a cada cinco segundos. Para
interromper os eventos, execute o procedimento StopClock (que pode
cancelar o evento). Veja que NextTick uma varivel ao nvel de
mdulo que armazena o horrio para o prximo evento.
Dim NextTick As Date
Sub UpdateClock()
Atualiza a clula A1 com a hora atual
ThisWorkbook.Sheets(1).Range(A1) = Time
Configura o prximo evento para
NextTick = Now + TimeValue(00:00:05)
Application.OnTime NextTick, UpdateClock
End Sub
Sub StopClock()
Cancela o evento atual (para o relgio)
On Error Resume Next
Application.OnTime NextTick, UpdateClock, , False
End Sub

O evento OnTime prossegue mesmo depois de a pasta de trabalho estar


fechada. Em outras palavras, se voc fechar a pasta de trabalho sem
rodar o procedimento StopClock, a pasta de trabalho se abrir por si
prpria em cinco segundos (supondo que o Excel ainda estava rodando). Para evitar isso, use um procedimento de evento Workbook_BeforeClose, que contm a seguinte declarao:
Call StopClock
O mtodo OnTime tem dois argumentos adicionais. Se voc pretende usar
esse mtodo, deve consultar a ajuda online quanto a detalhes completos.
Se voc quiser ver um aplicativo bem complicado, faa um download de
uma cpia da minha pasta de trabalho de relgio analgico, mostrado na
Figura 11-6. O rosto do relgio, na verdade, um grfico atualizado a cada
segundo, para exibir a hora do dia. Intil, mas divertido.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 179 15/02/2013 13:59:48
180 Parte III: Conceitos de Programao
Eventos de pressionamento de teclas
Enquanto voc trabalha, o Excel monitora constantemente o que voc
digita. Por causa disso, voc pode configurar um pressionamento de
tecla ou uma combinao de teclas para executar um procedimento.
Eis um exemplo que reatribui as teclas PgDn (Page Down e PgUp (Page Up =):
Sub Setup_OnKey()
Application.OnKey {PgDn}, PgDn_Sub
Application.OnKey {PgUp}, PgUp_Sub
End Sub
Sub PgDn_Sub()
On Error Resume Next
ActivateCell.Offset(1, 0).Activate
End Sub
Sub PgUp_Sub()
On Error Resume Next
ActivateCell.Offset(-1, 0).Activate
End Sub
Depois de configurar os eventos OnKey, executando o procedimento
Setup_OnKey, pressionar PgDn o move uma linha para baixo. Pressionar PgUp o move uma linha para cima.
Note que os cdigos de tecla esto entre chaves, no entre parnteses.
Para uma relao completa de cdigos de teclado, consulte o sistema
de Ajuda. Procure por OnKey.
Figura
11-6:
Aplicativo
do meu
relgio
analgico.
ExcelVBABokks.indb 180 15/02/2013 13:59:48
181 Captulo 11: Procedimentos e Eventos Automticos
Neste exemplo, eu uso On Error Resume Next para ignorar quaisquer
erros que sejam gerados. Por exemplo, se a clula ativa estiver na
primeira linha, tentar mover uma linha para cima causa um erro que
pode ser ignorado com segurana. E se uma planilha de grfico estiver
ativa, no h clula ativa.
Executando a seguinte rotina, voc cancela os eventos OnKey:
Sub Cancel_OnKey()

Application.OnKey {PgDn}
Application.OnKey {PgUp}
End Sub
Usar uma string vazia como o segundo argumento para o mtodo
OnKey no cancela o evento OnKey. Ao contrrio, ele leva o Excel a
simplesmente ignorar o toque de teclado. Por exemplo, a seguinte
declarao diz ao Excel para ignorar Alt+F4. O sinal de porcentagem
representa a tecla Alt:
Application.OnKey %{F4},
Embora voc possa usar o mtodo OnKey para designar uma tecla de
atalho para executar uma macro, voc deveria usar a caixa de dilogo
Macro Options (Opes de Macro) para essa tarefa. Para mais detalhes,
veja o Captulo 5.
Se voc fechar a pasta de trabalho que contm o cdigo e deixar o
Excel aberto, o mtodo OnKey no ser reiniciado. Como consequncia,
pressionar a tecla de atalho levar o Excel a abrir, automaticamente, o
arquivo com a macro. Para evitar que isso acontea, voc deve complementar o cdigo de evento Workbook_BeforeClose (mostrado anteriormente neste captulo), para reiniciar o evento OnKey.
C
U
I
D
A
D
O!
D
I
C
A
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 181 15/02/2013 13:59:48
182 Parte III: Conceitos de Programao
ExcelVBABokks.indb 182 15/02/2013 13:59:48


Neste Captulo
Como entender a diferena entre erros de programao e erros de tempo de execuo
Armadilhas e manipulao de erros de tempo de execuo
Como usar o VBA nas declaraes Error e Resume
Descobrindo como voc pode usar um erro em seu benefcio
Tcnicas de Tratamento
de Erros
Captulo 12
E
rrar humano. Prever erros divino. Ao trabalhar com VBA, voc
deve estar ciente de duas amplas classes de erros: erros de programao e erros em tempo de execuo. Eu abordo erros de programao,
tambm conhecidos como bugs, no Captulo 13. Um programa bem
escrito lida com erros da maneira como Fred Astaire danava: graciosamente. Felizmente, o VBA inclui diversas ferramentas para ajud-lo a
identi car erros e depois, a lidar graciosamente com eles.
Tipos de Erros
Se voc j experimentou qualquer um dos exemplos neste livro,

provavelmente encontrou uma ou mais mensagens de erro. Alguns


desses erros resultam de cdigo VBA ruim. Por exemplo, voc pode
escrever incorretamente uma palavra-chave ou digitar uma declarao
com a sintaxe errada. Se cometer tal erro, voc no ser capaz de
executar o procedimento at corrigi-lo.
Este captulo no trata desses tipos de erros. Ao invs, discuto erros
em tempo de execuo os erros que acontecem enquanto o Excel
executa o seu cdigo VBA. Mais especificamente, este captulo cobre os
seguintes tpicos fascinantes:
5 Identificao de erros
5 Fazer alguma coisa quanto ao erro que acontece
5 Recuperar-se dos erros
5 Criar erros intencionais (sim, s vezes um erro pode ser uma
coisa boa).
ExcelVBABokks.indb 183 15/02/2013 13:59:48
Parte III: Conceitos de Programao 184
O objetivo final de lidar com erros escrever cdigo que evite, tanto
quanto possvel, exibir mensagens de erro do Excel. Em outras palavras, voc quer prever erros em potencial e lidar com eles antes que o
Excel tenha uma chance de levantar a sua cara feia com uma mensagem
de erro (normalmente) pouco informativa.
Um Exemplo Errneo
Para comear, eu desenvolvi uma macro VBA curta. Ative o VBE, insira
um mdulo e entre com o seguinte cdigo:
Sub EnterSquareRoot()
Dim Num As Double

Tela para valor


Num = InputBox(Insira um valor)

Insira a raiz quadrada


ActiveCell.Value = Sqr(Num)
End Sub
Conforme mostrado na Figura 12-1, este procedimento pede um valor
ao usurio. Depois, ele executa um clculo mgico e entra com a raiz
quadrada daquele valor na clula ativa.
Voc pode executar este procedimento diretamente do VBE, pressionando F5. Alternativamente, voc pode acrescentar um boto a uma
planilha (use DesenvolvedorControlesInserir e selecione o boto
nos Controles de Formulrio para fazer isso) e, depois, atribua a macro
ao boto (o Excel pede que voc designe a macro). Ento, possvel
rodar o procedimento simplesmente clicando no boto.
Figura 12-1:
A funo
InputBox
(Caixa de
Entrada)
exibe uma
caixa de
dilogo que
pede um
valor ao
usurio.
D
I
C
A
ExcelVBABokks.indb 184 15/02/2013 13:59:49
185 Captulo 12: Tcnicas de Tratamento de Erros
A imperfeio da macro
Execute o cdigo umas duas vezes para experiment-lo. Ele funciona
muito bem, no ? Agora, tente entrar com um nmero negativo quando

lhe for pedido um valor. Opa! Neste planeta, tentar calcular a raiz quadrada de um nmero negativo ilegal. O Excel responde com a mensagem
mostrada na Figura 12-2, indicando que o seu cdigo gerou um erro em
tempo de execuo. Por ora, apenas clique o boto Fim. Se voc clicar o
boto Depurar, o Excel suspende a macro, assim voc pode usar as
ferramentas de depurao que ajudam a rastrear o erro (eu descrevo as
ferramentas de depurao no Captulo 13).
A maioria das pessoas no acha as mensagens de erro do Excel muito
teis (por exemplo, procedimento ou argumento invlido). Para aperfeioar o procedimento, voc precisa prever o erro e lidar com ele mais
graciosamente. Em outras palavras, precisa acrescentar algum cdigo
para lidar com erro.
Eis uma verso modificada de EnterSquareRoot:
Sub EnterSquareRoot2()
Dim Num As Double

Prompt for a value


Num = InputBox(Insira um valor)

Make sure the number is nonnegative


If Num < 0 Then
MsgBox Voc deve inserir um nmero positivo.
Exit Sub
End If

Insert the square root


ActiveCell.Value = Sqr(Num)
End Sub
Figura 12-2:
O Excel
exibe esta
mensagem
de erro
quando o
procedimento tenta
calcular
a raiz
quadrada
de um
nmero
negativo.
ExcelVBABokks.indb 185 15/02/2013 13:59:49
Parte III: Conceitos de Programao 186
Uma estrutura If-Then verifica o valor contido na varivel Num. Se Num
for menor que 0, o procedimento exibe uma caixa de mensagem contendo
informaes que os humanos podem, de fato, entender. O procedimento
termina com a declarao Exit Sub, assim o erro em tempo de execuo
no tem a oportunidade de acontecer.
A macro ainda no perfeita
Portanto, o procedimento modificado para EnterSquareRoot perfeito,
certo? No exatamente. Tente entrar com texto ao invs de um valor. Ou
clique o boto Cancelar na caixa de entrada. Essas duas aes geram um
erro (Tipos incompatveis). Esse simples e pequeno procedimento ainda
precisa de mais cdigo para lidar com os erros.
O cdigo a seguir usa a funo IsNumeric para garantir que Num contm
um valor numrico. Se o usurio no entrar com um nmero, o procedimento exibe uma mensagem e depois interrrompido. Observe ainda
que a varivel Num agora definida como uma Variant. Se ela fosse
definida como Double, o cdigo geraria um erro no tratado se o usurio
tivesse entrado com um valor no numrico na caixa de entrada.
Sub EnterSquareRoot3()
Dim Num As Variant

Tela para valor


Num = InputBox(Insira um valor)

Certifique-se que Num seja um nmero


If Not IsNumeric(Num) Then
MsgBox Voc deve inserir um nmero.
Exit Sub
End If

Certifique-se que um nmero no negativo


If Num < 0 Then
MsgBox Voc deve inserir um nmero positivo.
Exit Sub
End If

Insira a raiz quadrada


ActiveCell.Value = Sqr(Num)
End Sub
A macro j est perfeita?
Agora, este cdigo est absolutamente perfeito, certo? Ainda no.
Experimente rodar o procedimento enquanto a planilha ativa uma
planilha de grfico. , outro erro em tempo de execuo, dessa vez o
temido Nmero 91 (veja a Figura 12-3). Esse erro ocorre porque no h
clula ativa quando a planilha de grfica est ativa, ou quando alguma
coisa que no uma faixa selecionada.
ExcelVBABokks.indb 186 15/02/2013 13:59:49
187 Captulo 12: Tcnicas de Tratamento de Erros
A listagem a seguir usa a funo TypeName para garantir que a seleo
seja uma faixa. Se qualquer outra coisa que no uma faixa for selecionada, este procedimento exibe uma mensagem e depois sai:
Sub EnterSquareRoot4()
Dim Num As Variant

Make sure a worksheet is active


If TypeName(Selection) <> Range Then
MsgBox Selecione uma clula para o resultado.
Exit Sub
End If

Tela para valor


Num = InputBox(Insira um valor)

Certifique-se que Num seja uma nmero


If Not IsNumeric(Num) Then
MsgBox Voc deve inserir um nmero.
Exit Sub
End If

Certifique-se que o nmero no negativo


If Num < 0 Then
MsgBox Voc deve inserir um nmero positivo.
Exit Sub
End If

Insira a raiz quadrada


ActiveVell.Value = Sqr(Num)
End Sub
Desistindo da perfeio
Por ora, este procedimento simplesmente deve estar perfeito. Pense de
novo, companheiro. Proteja a planilha (use o comando Reviso
Alteraes Proteger Planilha) e, depois, rode o cdigo. Sim, uma
planilha protegida gera ainda outro erro. E provavelmente, eu no
pensei em todos os outros erros que podem acontecer. Continue a ler
sobre outra maneira de lidar com erros at mesmo aqueles que voc
no pode prever.
Figura 12-3:
Rodar o
procedimen-

to quando
um grfico
est selecionado gera
este erro.
ExcelVBABokks.indb 187 15/02/2013 13:59:49
Parte III: Conceitos de Programao 188
Como Lidar com Erros de Outra Maneira
Como voc pode identificar e lidar com cada erro possvel? Com frequncia,
no pode. Felizmente, o VBA oferece uma outra maneira de lidar com erros.
Revendo o procedimento EnterSquareRoot
Examine o seguinte cdigo. Eu modifiquei a rotina da seo anterior,
acrescentando uma declarao geral On Error para capturar todos os
erros e depois verificar se a InputBox foi cancelada.
Sub EnterSquareRoot5()
Dim Num As Variant
Dim Msg As String

Configure a manipulao de erros


On Error GoTo BadEntry

Tela para valor


Num = InputBox(Insira um valor)

Sair se cancelado
If Num = Then Exit Sub

Insira a raiz quadrada


ActiveCell.Value = Sqr(Num)
Exit Sub
BadEntry:
Msg = ocorreu um erro. & vbNewLine & vbNewLine
Msg = Msg & Assegure-se de ter selecionado um
intervalo,
Msg = Msg & que a planilha no esteja protegida,
Msg = Msg & e que voc no inseriu um valor
negativo.
MsgBox Msg, vbCritical
End Sub
Esta rotina captura qualquer tipo de erro em tempo de execuo. Depois
de capturar o erro, o procedimento revisado EnterSquareRoot exibe a
caixa de mensagem mostrada na Figura 12-4. Esta caixa de mensagem
descreve as causas mais provveis do erro.
ExcelVBABokks.indb 188 15/02/2013 13:59:49
189 Captulo 12: Tcnicas de Tratamento de Erros
Se uma declarao On Error no estiver funcionando conforme anunciado, voc precisa
trocar uma VBE de suas configuraes:
1. Ative o VBE.
2. Escolha o comando Ferramentas Opes.
3. Selecione a guia Geral da caixa de dilogo Opes.
4. Assegure-se de que a configurao Interromper em todos os erros no est
selecionada.
Se essa configurao estiver selecionada,
efetivamente o Excel ignora quaisquer declaraes On Error. Em geral, voc quer
manter as opes de On Error configurada
para interromper em erros no tratados.
On Error no est funcionando?
Sobre a declarao On Error
Usar uma declarao On Error em seu cdigo VBA permite que voc
ignore o manuseio de erro integrado do Excel e use o seu prprio

cdigo de lidar com erro. No exemplo anterior, um erro em tempo de


execuo leva a execuo da macro a saltar para a declarao rotulada
como BadEntry. Como resultado, voc evita mensagens de erro pouco
amistosas do Excel e pode exibir a sua prpria mensagem (mais
amistosa, espero) ao usurio.
Observe que o exemplo usa uma declarao Exit Sub bem antes do
rtulo de BadEntry. Essa declarao necessria pois voc no quer
executar o cdigo que lida com erro caso um erro no ocorra.
D
I
C
A
D
I
C
A
Figura 12-4:
Um erro em
tempo de
execuo
no procedimento gera
esta til
mensagem
de erro.
ExcelVBABokks.indb 189 15/02/2013 13:59:49
Parte III: Conceitos de Programao 190
Como Lidar com Erros: Os Detalhes
Voc pode usar uma declarao On Error de trs formas, conforme
mostrado na Tabela 12-1.
Tabela 12-1 Usando a Declarao On Error
Sintaxe O que ela faz
Rtulo On Error GoTo Depois de executar essa declarao, o VBA retoma a
execuo na linha especificada. Voc deve incluir
dois pontos depois do rtulo, para que VBA o
reconhea como um rtulo.
On Error Resume Next Depois de executar essa declarao, o VBA
simplesmente ignora todos os erros e retoma a
execuo com a nova declarao.
On Error GoTo 0 Depois de executar essa declarao, o VBA retoma o
seu comportamento normal de verificao de erro.
Use essa declarao depois de usar uma das outras
declaraes de On Error, ou quando quiser remover a
manipulao de erro de seu procedimento.
Recuperao depois de um erro
Em alguns casos, voc quer apenas que a rotina termine graciosamente
quando ocorre um erro. Por exemplo, voc pode exibir uma mensagem
descrevendo o erro e depois sair do procedimento (o exemplo EnterSquareRoot5 usa essa tcnica). Em outros casos, voc quer se recuperar
do erro, se possvel.
Para se recuperar de um erro, voc deve usar uma declarao Resume.
Isso limpa a condio de erro e permite que voc prossiga com a
execuo em algum lugar. possvel usar a declarao Resume de trs
formas, como mostrado na Tabela 12-2.
Tabela 12-2 Usando a Declarao Resume
Sintaxe O que ela faz
Resume A execuo retorna com a declarao que causou o erro.
Use isso se o seu cdigo que lida com erro corrigir o
problema e estiver bem para continuar.
Resume Next A execuo retorna com a declarao imediatamente depois

da declarao que causou o erro. Essa ignora,


essencialmente, o erro.
Etiqueta Resume A execuo retorna no rtulo que voc especifica.
ExcelVBABokks.indb 190 15/02/2013 13:59:49
191 Captulo 12: Tcnicas de Tratamento de Erros
O seguinte exemplo usa uma declarao Resume depois da ocorrncia
de um erro:
Sub EnterSquareRoot6()
Dim Num As Variant
Dim Msg As String
Dim Ans As Integer
TryAgain:

Configure a manipulao de erros


On Error GoTo BadEntry

Tela para valor


Num = InputBox(Insira um valor)

Insira a raiz quadrada


ActiveCell.Value = Sqr(Num)
Exit Sub
BadEntry:
Msg = Err.Number & : & Error(Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Msg & Make sure a range is selected,
Msg = Msg & the sheet is not protected,
Msg = Msg & and you enter a nonnegative value.
Msg = Msg & vbNewLine & vbNewLine & Try again?
Ans = MsgBox(Msg, vbYesNo + vbCritical)
If Ans = vbYes Then Resume TryAgain
End Sub
Este procedimento tem outro rtulo: TryAgain. Se ocorrer um erro, a
execuo prossegue na etiqueta BadEntry e o cdigo exibe a mensagem
mostrada na Figura 12-5. Se o usurio responder clicando Sim, a
declarao Resume pula e a execuo volta para a etiqueta TryAgain. Se
o usurio clicar No, o procedimento termina.
Observe que a mensagem de erro tambm inclui o nmero do erro,
junto com a descrio oficial do erro. Tirei isso, porque escrevo a
respeito mais adiante. Veja Como identificar erros especficos.
Figura 12-5:
Se ocorrer
um erro, o
usurio
pode
decidir se
quer tentar
de novo.
ExcelVBABokks.indb 191 15/02/2013 13:59:50
Parte III: Conceitos de Programao 192
Lembre-se que a declarao Resume limpa a condio de erro antes de
continuar. Para ver o que quero dizer, experimente substituir a seguinte
declarao pela penltima declarao do exemplo anterior:
If Ans = vbYes Then GoTo TryAgain
O cdigo no funciona corretamente se voc usar GoTo ao invs de
Resume. Para demonstrar, entre com um nmero negativo: voc recebe
uma tela de erro. Clique Sim para tentar de novo e depois, entre com
um outro nmero negativo. Esse segundo erro no capturado, pois a
condio original de erro no foi removida.
Este exemplo est disponvel no site deste livro.
Lidando com erros resumidamente
Para ajud-lo a manter claro esse negcio de lidar com erro, eu preparei
um resumo curto. Um bloco de cdigo para lidar com erros tem as

seguintes caractersticas:
5 Ele comea logo depois do rtulo especificado na declarao
On Error.
5 Ele s deveria ser atingido pela sua macro se ocorrer um erro.
Isso significa que voc deve usar uma declarao, tal como Exit
Sub ou ExitFunction, imediatamente antes do rtulo.
5 Ele pode exigir uma declarao Resume. Se voc decidir no
abortar o procedimento quando ocorrer um erro, deve executar
uma declarao Resume antes de voltar ao cdigo principal.
Como saber quando ignorar erros
Em alguns casos, est perfeitamente certo ignorar erros. quando a declarao On Error Resume Next entra em cena.
O seguinte exemplo faz uma loop atravs de cada clula na faixa
selecionada e converte o valor para a sua raiz quadrada. Este procedimento gera uma mensagem de erro se qualquer clula na seleo
contiver um nmero negativo ou texto:
Sub SelectionSqrt()
Dim cell As Range
If TypeName(Selection) <> Range Then Exit Sub
For Each cell In Selection
cell.Value = Sqr(cell.Value)
Next cell
End Sub
ExcelVBABokks.indb 192 15/02/2013 13:59:50
193 Captulo 12: Tcnicas de Tratamento de Erros
Neste caso, voc pode querer simplesmente pular qualquer clula que
contenha um valor que no pode ser convertido a uma raiz quadrada.
Voc pode criar todos os tipos de capacidades de verificao de erro,
usando estruturas If-Then, mas pode conceber uma soluo melhor (e
mais simples), apenas ignorando os erros que acontecem.
A seguinte rotina consegue isso, usando a declarao On Error Resume Next:
Sub SelectionSqrt()
Dim cell As Range
If TypeName(Selection) <> Range Then Exit Sub
On Error Resume Next
For Each cell In Selection
cell.Value = Sqr(cell.Value)
Next cell
End Sub
Em geral, voc pode usar uma declarao On Error Resume Next se
considerar os erros inconsequentes sua tarefa.
Como identi car erros espec cos
Os erros no so todos criados iguais. Alguns so srios e outros nem
tanto. Embora voc possa ignorar erros que considera sem consequncia, voc deve lidar com outros erros, mais srios. Em alguns casos,
preciso identificar o erro especfico que ocorreu.
Na ocorrncia de um erro, o Excel armazena o nmero do erro em um
objeto Error, chamado Err. A propriedade Number desse objeto contm
o nmero do erro. Voc recebe uma descrio do erro usando a funo
VBA Error. Por exemplo, a seguinte declarao exibe o nmero do erro
e uma descrio:
MsgBox Err.Number & : & Error(Err.Description)
A Figura 12-5, apresentada anteriormente, mostra um exemplo disso.
Porm, tenha em mente que as mensagens de erro do Excel nem
sempre so teis mas, voc j sabe disso.
O procedimento a seguir demonstra como determinar qual erro aconteceu. Nesse caso, voc pode ignorar com segurana erros causados por
tentar obter a raiz quadrada de um nmero no positivo (isto , o erro
5), ou erros causados por tentar obter a raiz quadrada de um valor no
numrico (erro 13). Por outro lado, voc precisa informar ao usurio se

a planilha est protegida e a seleo contm uma ou mais clulas


bloqueadas (caso contrrio, o usurio pode pensar que a macro funcionou, quando na verdade no o fez). Esse evento causa o erro 1004.
ExcelVBABokks.indb 193 15/02/2013 13:59:50
Parte III: Conceitos de Programao 194
Sub SelectionSqrt()
Dim cell As Range
Dim ErrMsg As String
If TypeName(Selection) <> Range Then Exit Sub
On Error GoTo ErrorHandler
For Each cell In Selection
cell.Value = Sqr(cell.Value)
Next cell
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 5 Negative number
Resume Next
Case 13 Type mismatch
Resume Next
Case 1004 Locked cell, protected sheet
MsgBox Cell is locked. Try again.,
vbCritical, cell.Address
Exit Sub
Case Else
ErrMsg = Error(Err.Number)
MsgBox ERROR: & ErrMag, vbCritical, cell,
Address
Exit Sub
End Select
End Sub
Quando ocorre um erro em tempo de execuo, a execuo pula para o
cdigo iniciando no rtulo ErrorHandler. A estrutura Select Case (eu
discuto esta estrutura no Captulo 10) testa trs nmeros comuns de
erros. Se o nmero do erro for 5 ou 13, a execuo retorna na declarao
seguinte (em outras palavras, o erro ignorado). Porm, se o nmero do
erro for 1004, a rotina informa ao usurio e depois termina. O ltimo
caso, um punhado de erros no previstos captura todos os outros erros e
exibe a mensagem de erro atual.
Um Erro Intencional
s vezes, voc pode usar um erro em seu benefcio. Por exemplo,
suponha que voc tem uma macro que s funciona se determinada
pasta de trabalho estiver aberta. Como voc pode determinar se aquela
pasta de trabalho est aberta? Uma maneira escrever cdigo que faa
loops atravs da coleo Workbooks verificando, para determinar se a
pasta de trabalho na qual est interessado est naquela coleo.
ExcelVBABokks.indb 194 15/02/2013 13:59:50
195 Captulo 12: Tcnicas de Tratamento de Erros
Aqui est um modo mais fcil: uma funo mais geral aceita um argumento (um nome de workbook) e retorna True se o workbook estiver
aberto, False se no estiver.
Eis a funo:
Function WorkbookIsOpen(book As String) As Boolean
Dim WBName As String
On Error GoTo NotOpen
WBName = Workbooks(book).Name
WorkbookIsOpen = True
Exit Function
NotOpen:
WorkbookIsOpen = False

End Function
Esta funo tem a vantagem de que o Excel gera um erro se voc fizer
referncia a uma pasta de trabalho que no est aberta. Por exemplo, a
declarao a seguir gera um erro se uma pasta de trabalho chamada
MyBook.xlsl no estiver aberta:
WBName = Workbooks(MyBook.xlsl).Name
Na funo WorkbooksOpen, a declarao On Error diz ao VBA para retornar
a macro declarao NotOpen se houver um erro. Portanto, um erro
significa que a pasta de trabalho no est aberta, e a funo retorna False.
Se a pasta de trabalho estiver aberta, no h erro e a funo retorna True.
Eis outra variao da funo WorkbooksOpen. Esta verso usa On Error
Resume Next para ignorar o erro. Porm, o cdigo verifica a propriedade Number de Err. Se Err.Number for 9, nenhum erro ocorreu e a pasta
de trabalho est aberta. Se Err.Number for qualquer outra coisa,
significa que ocorreu um erro (e a pasta de trabalho no est aberta).
Function WorkbookIsOpen(book) As Boolean
Dim WBName As String
On Error Resume Next
WBName = Workbooks(book).Name
If Err.Number = 0 Then WorkbookIsOpen = True _
Else WorkbookIsOpen = False
End Function
O exemplo a seguir demonstra como usar esta funo em um procedimento Sub:
Sub UpdatePrices()
If Not WorkbookIsOpen(Prices.xlsl) Then
MsgBox Por favor abra a pasta de trabalho
Prices primeiro!
Exit Sub
End If

[Outros cdigos entram aqui]


End Sub
ExcelVBABokks.indb 195 15/02/2013 13:59:50
Parte III: Conceitos de Programao 196
O procedimento UpdatePrices (o qual deve estar na mesma pasta de
trabalho que WorkbookIsOpen) chama a funo WorkbookIsOpen e
passa o nome da pasta de trabalho (Prices.xlsl) como um argumento. A
funo WorkbookIsOpen retorna Verdadeiro ou Falso. Portanto, se a
pasta de trabalho no estiver aberta, o procedimento informa o fato ao
usurio. Se a pasta de trabalho estiver aberta, a macro prossegue.
Lidar com erro pode ser uma proposta ardilosa afinal, pode ocorrer
muitos erros diferentes e voc no pode prever todos eles. Normalmente, se possvel, voc deveria capturar erros e corrigir a situao antes
que o Excel interfira. Escrever cdigo eficiente de captura de erro
requer um conhecimento pormenorizado de Excel e um claro entendimento de como funciona o tratamento de erros do VBA. Captulos
posteriores contm mais exemplos de como lidar com erros.
ExcelVBABokks.indb 196 15/02/2013 13:59:50
Tcnicas de Extermnio
de Bugs
Captulo 13


Neste Captulo
De nio de bug e porque voc deveria esmag-lo
Como reconhecer tipos de bugs de programa que voc pode encontrar
Usando tcnicas para depurar o seu cdigo
Como usar ferramentas de depurao integradas ao VBA
S
e a palavra bug evoca a imagem de um coelho de desenho animado,

este captulo pode deix-lo determinado. Colocando de forma simples,


um bug um erro em sua programao. Aqui, eu abordo o tpico de bugs de
programao como identi c-los e como tir-los da face de seu mdulo.
Espcies de Bugs
Bem-vindo Entomologia 101. O termo bug de programa, como provavelmente voc sabe, refere-se a um problema com software. Em outras
palavras, se o software no executar conforme esperado, ele tem um
bug. A verdade que todos os principais programas de software tm
bugs muitos bugs. O prprio Excel tem centenas (se no milhares) de
bugs. Felizmente, a grande maioria desses bugs relativamente obscura
e s aparece em circunstncia bem especficas.
Quando voc escreve programas VBA pouco comuns, provavelmente o
seu cdigo ter bugs. Isso um fato e no necessariamente um reflexo
de sua habilidade de programao. Os bugs podem estar em qualquer
das seguintes categorias:
5 Falhas lgicas em seu cdigo: Com frequncia, voc pode evitar
esses bugs, pensando cuidadosamente no problema que o seu
programa apresenta.
5 Bugs no contexto incorreto: Esse tipo de bug surge quando voc
tenta fazer algo na hora errada. Por exemplo, voc pode tentar
escrever dados em clulas na planilha ativa quando, na verdade,
ela uma planilha de grfico (que no tem clulas).
5 Bugs de casos extremos: Esses bugs levantam suas caras feias
quando o programa encontra dados no previstos, tais como
nmeros muito grandes ou muito pequenos.
ExcelVBABokks.indb 197 15/02/2013 13:59:50
Parte III: Conceitos de Programao 198
5 Bugs de tipo errado de dados: Esse tipo de bug acontece
quando voc tenta processar dados do tipo errado, tal como
tentar tirar a raiz quadrada de uma string de texto.
5 Bugs de verso errada: Esse tipo de bug envolve
incompatibilidades entre diferentes verses do Excel. Por
exemplo, voc pode desenvolver uma pasta de trabalho com
Excel 2010 e, depois, descobrir que a pasta de trabalho no
funciona com o Excel 2003. Normalmente possvel evitar tais
problemas evitando usar os recursos especficos de verso. Com
frequncia, a abordagem mais fcil desenvolver o seu aplicativo
usando a verso de nmero mais baixo do Excel que os usurios
podem ter. No entanto, em todos os casos, voc deve testar o seu
trabalho em todas as verses que imagina que sero usadas.
5 Bugs alm do seu controle: Esses so os mais frustrantes. Um
exemplo acontece quando a Microsoft atualiza o Excel e faz uma
alterao menor, no documentada, que leva a sua macro a
estourar. At atualizaes de segurana tm sido conhecidas
por causar problemas.
Depurar (debugging) o processo de identificar e corrigir bugs em seu
programa. Leva tempo para desenvolver habilidades de depurao,
assim, no fique desencorajado se esse processo for difcil no incio.
importante entender a distino entre bugs e erros de sintaxe. Um erro
de sintaxe um erro de linguagem. Por exemplo, voc poderia soletrar
errado uma palavra-chave, omitir a declarao Next (Prxima) em um
loop For-Next (Para a Prxima), ou ter um parntese incompatvel.
Antes de poder sequer executar o procedimento, voc deve corrigir
esses erros de sintaxe. Um bug de programa muito mais sutil.
possvel executar a rotina, mas ela no executa conforme esperado.
Como Identi car Bugs
Antes de fazer qualquer depurao, voc deve determinar se, de fato,
existe um bug. Voc pode dizer que a sua macro contm um bug se ela
no funcionar da maneira como deveria. Puxa, este livro est cheio de
perspiccias, no ? Geralmente, mas nem sempre voc pode perceber

isso com facilidade.


Com frequncia (mas nem sempre), um bug fica claro quando o Excel exibe
uma mensagem de erro em tempo de execuo. A Figura 13-1 mostra um
exemplo. Observe que essa mensagem de erro inclui um boto chamado
Depurar. Mais sobre isso, mais adiante, na seo Sobre o Depurador.
Um fato importante conhecido por todos os programadores que,
frequentemente, bugs aparecem quando voc menos espera. Por
exemplo, s porque a sua macro funciona bem com um conjunto de
dados, no significa que voc pode supor que ela funcionar bem da
mesma forma com todos os conjuntos de dados.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 198 15/02/2013 13:59:50
199 Captulo 13: Tcnicas de Extermnio de Bugs
A melhor abordagem de depurao testar cuidadosamente, sob uma
variedade de condies de vida real. E porque quaisquer alteraes em
sua pasta de trabalho feitas pelo seu cdigo VBA no podem ser desfeitas,
sempre uma boa ideia usar uma cpia de segurana da pasta de trabalho
que usar para testar. Normalmente, eu copio alguns arquivos em uma
pasta temporria e uso tais arquivos para o meu teste.
Tcnicas de Depurao
Nesta seo, discuto os quatro mtodos mais comuns para depurar
Cdigo VBA do Excel:
5 Examinar o cdigo
5 Inserir funes MsgBox em vrios locais em seu cdigo
5 Inserir declaraes Debug.Print
5 Inserir as ferramentas de depurao integradas no Excel
Como examinar o seu cdigo
Talvez a tcnica de depurao mais direta seja simplesmente dar uma
boa olhada em seu cdigo, para ver se possvel encontrar o problema.
Se voc tiver sorte, o erro logo aparece e voc bate na testa e diz , Oh!
Quando a dor na testa diminuir, voc pode corrigir o problema.
Veja que eu disse Se voc tiver sorte. Isso porque, com frequncia, voc
descobre erros quando esteve trabalhando em seu programa por oito
horas direto, so duas horas da madrugada e voc est funcionando
base de cafena e fora de vontade. Em ocasies assim, voc tem sorte se
puder ao menos ver seu cdigo, ficando sozinho para encontrar os bugs.
Assim, no se surpreenda se, simplesmente examinar seu cdigo no for o
bastante para faz-lo encontrar e eliminar todos os bugs que ele contm.
Figura 13-1:
Uma
mensagem
de erro como
esta
frequentemente significa que o seu
cdigo VBA
contm um
bug.
ExcelVBABokks.indb 199 15/02/2013 13:59:51
Parte III: Conceitos de Programao 200
Usando a funo MsgBox
Um problema comum em muitos programas envolve uma ou mais
variveis que no tomam os valores que voc espera. Em tais casos,

monitorar a(s) varivel(eis) enquanto o seu cdigo roda uma tcnica


til de depurao. Uma maneira de fazer isso inserir temporariamente
funes MsgBox em sua rotina. Por exemplo, se voc tiver uma varivel
chamada CellCount, pode inserir a seguinte declarao:
MsgBox CellCount
Quando voc executa a rotina, a funo MsgBox exibe o valor de CellCount.
Em geral, til exibir os valores de duas ou mais variveis na caixa de
mensagem. A seguinte declarao exibe o valor atual de duas variveis:
LoopIndex(1) e CellCount(72), conforme mostrado na Figura 13-2:
MsgBox LoopIndex & " " & CellCount
Observe que eu combino as duas variveis com o operador de concatenao (&) e insiro um caractere de espao entre elas. Caso contrrio, a
caixa de mensagem conecta os dois valores, fazendo-os parecer como um
nico valor. Tambm possvel usar a constante integrada vbNewLine,
no lugar do caractere de espao. vbNewLine insere uma linha de alimentao de pausa, a qual exibe o texto em uma nova linha. A seguinte
declarao exibe trs variveis, cada uma em uma linha separada:
MsgBox LoopIndex & vbNewLine & CellCount & _
vbNewLine & MyVal
Esta tcnica no limitada a monitorar variveis. Voc pode usar uma
caixa de mensagem para exibir todo o tipo de informaes teis
enquanto o seu cdigo estiver rodando. Por exemplo, se o seu cdigo
fizer loops atravs de uma srie de planilhas, a seguinte declarao
exibe o nome e o tipo da planilha ativa:
MsgBox ActiveSheet.Name & & TypeName(ActiveSheet)
Figura 13-2:
Usando uma
caixa de
mensagem
para exibir o
valor de
duas
variveis.
ExcelVBABokks.indb 200 15/02/2013 13:59:51
201 Captulo 13: Tcnicas de Extermnio de Bugs
Se a sua caixa de mensagem exibir algo inesperado, pressione
Ctrl+Break e ser exibida uma caixa de dilogo que informa, A Execuo do cdigo foi interrompida. Como mostrado na Figura 13-3, voc
tem quatro escolhas:
5 Clicar no boto Continuar e o cdigo continuar a executar
5 Clicar no boto Fim e a execuo termina.
5 Clicar no boto Depurar e o VBE vai para o modo de depurao
(o qual explicado um pouco mais adiante).
5 Clicar no boto Ajuda e uma tela de ajuda informa que voc
pressionou Ctrl+Break. Em outras palavras, no muito til.
Fique vontade para usar as funes MsgBox frequentemente ao
depurar o seu cdigo. Assegure-se apenas de remov-las depois de
identificar e corrigir o problema.
Inserindo declaraes Debug.Print
Como uma alternativa ao uso de MsgBox em seu cdigo, voc pode inserir
uma ou mais declaraes temporrias Debug.Print. Use essas declaraes
para imprimir o valor de uma ou mais variveis na janela Verificao
imediata. Eis um exemplo que exibe o valor de trs variveis:
Debug.Print LoopIndex, CellCount, MyVal
Observe que as variveis so separadas por vrgulas. Voc pode exibir
tantas variveis quanto quiser com uma nica declarao Debug.Print. Se
a janela Verificao imediata do VBE no estiver visvel, pressione Ctrl+G.
Diferente de MsgBox, as declaraes Debug.Print no interrompem o
seu cdigo. Assim, voc precisar ficar atento janela Verificao
imediata para ver o que est acontecendo.

Depois de ter depurado seu cdigo, assegure-se de remover todas as


declaraes Debug.Print. Mesmo grandes empresas, como a Microsoft,
Figura 13-3:
Pressionar
Ctrl+Break
interrompe a
execuo de
seu cdigo e
lhe d
algumas
escolhas.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 201 15/02/2013 13:59:51
Parte III: Conceitos de Programao 202
ocasionalmente se esquecem de remover suas declaraes Debug.Print.
Em diversas verses anteriores de Excel, cada vez que o add-in Analysis
ToolPak (Pacote de Ferramentas de Anlise) era aberto, voc via
diversas mensagens estranhas na janela Verificao imediata (como
mostrado na Figura 13-4). O problema foi corrigido no Excel 2007.
Usando o depurador VBA
Os projetistas de Excel so intimamente familiarizados com o conceito
de bugs, portanto, o Excel inclui um conjunto de ferramentas de
depurao que pode ajud-lo a corrigir problemas em seu cdigo VBA.
O depurador VBA o tpico da prxima seo.
Sobre o Depurador
Nesta seo, eu discuto os sangrentos detalhes de usar as ferramentas
de depurao do Excel. Essas ferramentas so muito mais poderosas do
que as tcnicas discutidas na seo anterior. Mas, junto com o poder
vem a responsabilidade. Usar as ferramentas de depurao requer um
pouco de trabalho de configurao.
Con gurando pontos de
interrupo em seu cdigo
Anteriormente neste captulo, eu defendi o uso de funes MsgBox em
seu cdigo para monitorar os valores de determinadas variveis. Exibir
uma caixa de mensagem interrompe, essencialmente, o seu cdigo no
meio da execuo e clicar o boto OK retorna a execuo.
No seria bom se voc pudesse interromper a execuo de uma rotina,
dar uma olhada no valor de qualquer de suas variveis e depois continuar a execuo? Bem, isso exatamente o que voc pode fazer configurando um ponto de interrupo. Voc pode configurar um ponto de
interrupo em seu cdigo VBA de vrias maneiras:
Figura 13-4:
At programadores
profissionais
s vezes se
esquecem de
remover suas
declaraes
Debug.Print.
ExcelVBABokks.indb 202 15/02/2013 13:59:51
203 Captulo 13: Tcnicas de Extermnio de Bugs
5 Mova o cursor para a declarao em que deseja que a execuo
seja interrompida; depois, pressione F9.

5 Clique na margem cinza, esquerda da declarao onde voc


deseja que a execuo pare.
5 Posicione o ponto de insero na declarao onde deseja que a
execuo pare. Depois, use o comando Depurar Ativar Ponto
de Interrupo.
5 Clique com o boto direito uma declarao e escolha
Ativar Ponto de Interrupo a partir do menu de atalho.
Os resultados que se obtm ao configurar um ponto de interrupo so
apresentados na Figura 13-5. O Excel destaca a linha para lembr-lo que
voc configura um ponto de interrupo l; ele tambm insere um
ponto grande na margem cinza.
Quando voc executa um procedimento, o Excel entra no Modo de
interrupo antes da linha com o ponto de interrupo ser executado.
No modo de interrupo, a palavra [interromper] exibida na barra de
ttulo do VBE. Para sair do modo de interrupo e continuar a execuo, pressione F5 ou cloque o boto Executar Sub/UserForm na barra
de ferramentas do VBE. Veja Percorrendo o seu cdigo, mais adiante
neste captulo, para saber mais.
Para remover rapidamente um ponto de interrupo, clique o ponto
grande na margem cinza e mova o cursor para a linha destacada e
pressione F9. Para remover todos os pontos de interrupo no mdulo,
pressione Ctrl+Shift+F9.
Figura 13-5:
A declarao
destacada
marca um
ponto de
interrupo
neste
procedimento.
D
I
C
A
ExcelVBABokks.indb 203 15/02/2013 13:59:51
Parte III: Conceitos de Programao 204
O VBA tambm tem uma palavra-chave que fora o modo de interrupo:
Stop
Quando o seu cdigo atingir a palavra-chave Stop, o VBA entra no modo
de interrupo. A coisa jeitosa sobre essa palavra Stop que, se o seu
cdigo for protegido, ele ser ignorado.
O que modo de interrupo? Voc pode pensar nele como uma posio de
animao suspensa. O seu cdigo VBA para de rodar e a declarao atual
destacada em amarelo brilhante. No modo de interrupo voc pode:
5 Digitar declaraes VBA na janela Verificao imediata. Para
detalhes, veja a prxima seo.
5 Pressionar F8 para caminhar pelo seu cdigo uma linha de cada vez,
para verificar diversas coisas enquanto o programa est parado.
5 Mover o cursor do mouse sobre uma varivel para exibir o seu
valor em uma pequena janela pop-up.
5 Pular a(s) prxima(s) declarao(es) e continuar a execuo
l (ou mesmo, voltar um par de declaraes).
5 Editar uma declarao e depois continuar.
A Figura 13-6 mostra alguma depurao em ao. Um ponto de interrupo ajustado (observe o grande ponto) e eu usei a tecla F8 para
percorrer o cdigo, linha por linha (veja a seta que indica para a
declarao atual). Eu usei a janela Verificao imediata para observar
algumas coisas, o cursor do mouse est pairando sobre a varivel
OutputRow e o VBE exibe o seu valor atual.
Usando a janela Verificao imediata

A janela Immediate no pode ser visvel no VBE. Voc pode exibir a janela
Immediate (Imediata) do VBE em qualquer ocasio, pressionando Ctrl+G.
No modo Break, a janela Immediate especialmente til para encontrar
o valor atual de qualquer varivel em seu programa. Por exemplo, se
voc quiser saber o valor atual de uma varivel chamada CellCount,
entre com o seguinte na janela Immediate e pressione Enter (Entrar):
Print CellCount
Voc pode poupar alguns milsimos de segundos usando um ponto de
interrogao no lugar da palavra Print (Imprimir), assim:
? CellCount
D
I
C
A
ExcelVBABokks.indb 204 15/02/2013 13:59:52
205 Captulo 13: Tcnicas de Extermnio de Bugs
A janela Verificao imediata permite que voc faa outras coisas alm
de verificar valores de varivel. Por exemplo, possvel mudar o valor
de uma varivel, ativar uma planilha diferente ou mesmo abrir uma
nova pasta de trabalho. Apenas, assegure-se de que o comando que
voc inserir seja uma declarao VBA vlida.
Voc tambm pode usar a janela Verificao imediata quando o Excel
no estiver no modo de interrupo. Frequentemente, eu uso a janela
Verificao imediata para testar pequenos fragmentos de cdigo
(sempre que posso comprimir em uma nica linha) antes de incorpor-los em meus procedimentos.
Percorrendo o seu cdigo
Enquanto no modo de interrupo, voc tambm pode percorrer o seu
cdigo, linha por linha. Uma declarao executada cada vez que voc
pressionar F8. Atravs dessa execuo linha por linha de seu cdigo,
voc pode ativar a janela Verificao imediata em qualquer ocasio,
para verificar a posio de suas variveis.
Voc pode usar o seu mouse para alterar qual declarao o VBA
executar em seguida. Se colocar o cursor do seu mouse na margem
cinza esquerda da declarao atualmente destacada (que normalmente ser amarela), o seu cursor muda para uma seta indicando direita.
Simplesmente arraste o seu mouse para a declarao a ser executada
em seguida e veja que a declarao fica amarela.
Figura 13-6:
Um cenrio
tpico no
modo de
interrupo.
D
I
C
A
D
I
C
A
ExcelVBABokks.indb 205 15/02/2013 13:59:52
Parte III: Conceitos de Programao 206
Usando a janela Inspeo de Variveis
Em alguns casos, voc pode querer saber se determinada varivel ou
expresso toma um valor em especial. Por exemplo, suponha que um
procedimento faz loops atravs de 1.000 clulas. Voc percebe que
houve um problema durante a 900 iterao do loop. Bem, voc poderia
inserir um ponto de interrupo no loop, mas isso significaria responder
a 899 solicitaes antes de o cdigo finalmente obter a iterao que

voc quer ver (e isso fica chato bem depressa). Uma soluo mais eficaz
envolve configurar inspeo de variveis.
Por exemplo, voc pode usar esse recurso colocando o procedimento
no modo de interrupo sempre que determinada varivel tomar um
valor especfico por exemplo, Counter=900. Para criar uma expresso
de inspeo, escolha DepurarAdicionar inspeo de variveis para
exibir a caixa respectiva de dilogo. Veja a Figura 13-7.
A caixa de dilogo Adicionar inspeo de variveis tem trs partes:
5 Expresso: Entre com uma expresso VBA vlida ou varivel
aqui. Por exemplo, Counter=900 ou apenas Counter.
5 Contexto: Selecione o procedimento e o mdulo que deseja
observar. Veja que possvel selecionar Todos os Procedimentos
e Todos os Mdulos.
5 Tipo de inspeo de variveis: Selecione o tipo de inspeo de
variveis, selecionando uma das opes. A sua escolha aqui
depende da expresso fornecida. A primeira escolha, Expresso
de inspeo de variveis no gera uma interrupo, mas apenas
exibe o valor da expresso quando ocorre uma interrupo.
Figura 13-7:
A caixa de
dilogo
Adicionar
inspeo de
variveis
permite que
voc especifique uma
condio que
causa uma
interrupo.
ExcelVBABokks.indb 206 15/02/2013 13:59:52
207 Captulo 13: Tcnicas de Extermnio de Bugs
Execute o seu procedimento depois de configurar a sua inspeo de
varivel. As coisas rodam normalmente at que a sua expresso seja
satisfeita (com base no Tipo de inspeo que voc especificou).
Quando isso acontecer, o Excel entra no modo de interrupo (voc
configurou o Tipo de inspeo para Interromper quando o valor for
verdadeiro, no foi?). A partir da, voc pode percorrer o cdigo ou
usar a janela Verificao imediata para depurar seu cdigo.
Quando voc cria uma inspeo, o VBE exibe a janela Inspeo de
variveis mostrada na Figura 13-8. Essa janela exibe o valor de todas as
inspees que voc definiu. Nesta figura, o valor de Counter atinge 900,
o que levou o Excel a entrar no modo de interrupo.
A melhor maneira de entender como funciona esse negcio de inspeo
us-lo e tentar vrias opes. Em pouco tempo, provavelmente voc
vai pensar em como conseguia viver sem ele.
Usando a janela Variveis locais
Uma outra ajuda til de depurao a janela Variveis locais. Voc
pode exibir essa janela escolhendo ExibirJanela Variveis locais a
partir do menu do VBE. Quando voc estiver no modo de interrupo,
essa janela exibir uma lista com todas as variveis que so locais ao
procedimento atual (veja a Figura 13-9). Uma coisa boa sobre essa
janela que voc no precisa acrescentar manualmente uma carga de
inspeo se quiser olhar o contedo de muitas variveis. O VBE fez
todo o trabalho duro para voc.
Figura
13-8:
A janela
Inspeo
de

variveis
exibe todas
as
inspees.
ExcelVBABokks.indb 207 15/02/2013 13:59:52
Parte III: Conceitos de Programao 208
Dicas para Reduo de Bugs
Eu no posso dizer a voc como eliminar bugs completamente de seus
programas. Encontrar bugs em software pode ser uma profisso, por si
s, mas eu posso oferecer algumas dicas para ajud-lo a minimizar
esses bugs:
5 Use uma declarao Option Explicit no incio de seus mdulos.
Essa declarao exige que voc defina o tipo de dados para cada
varivel que usar. Isso d um pouco mais de trabalho, mas voc
evita o erro comum de digitar incorretamente o nome de uma
varivel. E isso tem um belo efeito colateral: as suas rotinas
rodam um pouco mais depressa.
5 Formate o seu cdigo com recuo. Usar recuos ajuda a delinear
diferentes segmentos de cdigo. Se o seu programa tiver vrios
loops For-Next aninhados, por exemplo, o uso de recuos ajuda a
controlar todos eles.
5 Tenha cuidado com a declarao On Error Resume Next.
Como discuto no Captulo 12, essa declarao leva o Excel a
ignorar quaisquer erros e continua a executar a rotina. Em
alguns casos, usar essa declarao leva o Excel a ignorar erros
que ele no deveria ignorar. O seu cdigo pode ter bugs e voc
pode nem ao menos saber.
5 Use muitos comentrios. Nada mais frustrante do que rever o
cdigo que voc escreveu seis meses atrs e no ter uma dica
de como ele funciona. Acrescentando alguns comentrios para
descrever a sua lgica, voc pode poupar muito tempo
pelo caminho.
Figura 13-9: A
janela
variveis
locais exibe o
contudo das
Variveis do
procedimento
atual.
D
I
C
A
ExcelVBABokks.indb 208 15/02/2013 13:59:53
209 Captulo 13: Tcnicas de Extermnio de Bugs
5 Mantenha os seus procedimentos Sub e Function simples.
Escrevendo o seu cdigo em pequenos mdulos, cada qual
com um nico objetivo bem definido, voc simplifica o
processo de depurao.
5 Use o gravador de macro para ajudar na identificao de
propriedades e mtodos. Quando eu no consigo lembrar o
nome ou a sintaxe de uma propriedade ou mtodo,
frequentemente eu apenas gravo uma macro e verifico o
cdigo gravado.
5 Entenda o depurador do Excel. Ainda que de incio possa
parecer um pouco desanimador, o depurador do Excel uma
ferramenta til. Invista algum tempo para conhec-lo.
Depurar cdigo no uma das minhas atividades preferidas (tem uma
alta classificao ao ser auditada pela Receita Federal), mas um mal

necessrio que acompanha a programao. Quanto mais experincia


voc adquire com VBA, menos tempo voc gasta depurando e, quando
tiver que depurar, torna-se mais eficiente em faz-lo.
ExcelVBABokks.indb 209 15/02/2013 13:59:53
Parte III: Conceitos de Programao 210
ExcelVBABokks.indb 210 15/02/2013 13:59:53


Neste Captulo
Explorando exemplos de VBA
Como fazer o seu cdigo VBA rodar o mais rpido possvel
Exemplos de Programao
em VBA
Captulo 14
A
minha loso a para descobrir como escrever macros em Excel
se baseia pesadamente em exemplos. Descobri que um bom
exemplo geralmente comunica um conceito muito melhor do que uma
longa descrio da teoria subjacente. Pelo fato de estar lendo este livro,
provavelmente voc concorda comigo. Este captulo apresenta vrios
exemplos que demonstram tcnica comuns em VBA.
Esses exemplos so organizados nas seguintes categorias:
5 Como trabalhar com faixas
5 Como alterar configuraes do Excel
5 Como trabalhar com grficos
5 Como dar velocidade ao seu cdigo VBA
Embora voc possa ser capaz de usar diretamente alguns desses exemplos,
na maioria dos casos voc deve adapt-los s suas prprias necessidades.
Como Trabalhar com Ranges (faixas)
Provavelmente, a maior parte de sua programao em VBA envolve
faixas (para recordar a questo sobre objetos Range, consulte o Captulo 8). Ao trabalhar com objetos Range (faixa), tenha em mente os
seguintes pontos:
5 O seu VBA no precisa selecionar uma faixa para trabalhar com ela.
5 Se o seu cdigo selecionar uma faixa, a planilha dele deve estar ativa.
5 O gravador de macro nem sempre gera o cdigo mais eficiente.
Frequentemente, voc pode criar a sua macro usando o
gravador e depois, editar o cdigo, para torn-lo mais eficaz.
ExcelVBABokks.indb 211 15/02/2013 13:59:53
Parte III: Conceitos de Programao 212
5 uma boa ideia usar faixas nomeadas em seu cdigo VBA. Por
exemplo, usar Range(Total) melhor que usar Range(D45).
Nesse caso, se voc acrescentar uma linha acima da linha 45,
precisar modificar a macro para que ela use o endereo de
faixa correto (D46). Veja que voc nomeia uma faixa de clulas,
escolhendo Frmulas Nomes Definidos Definir Nome.
5 Ao rodar a sua macro que trabalha na seleo atual de faixas, o
usurio poderia selecionar colunas ou linhas inteiras. Na
maioria dos casos, voc no quer fazer loop atravs de cada
clula na seleo (isso poderia demorar muito). A sua macro
deveria criar um subconjunto da seleo, consistindo apenas
de clulas que no esto em branco.
5 O Excel permite mltiplas selees. Por exemplo, voc pode
selecionar uma faixa, pressionar Ctrl e selecionar outra faixa
com o seu mouse. O seu cdigo pode ser testado nesses casos,
de modo que voc tome as aes apropriadas.
Os exemplos nesta seo, que esto disponveis no site deste livro,
demonstram estes pontos.
Se voc prefere digitar esses exemplos por si prprio, pressione Alt+F11
para ativar o VBE. Depois, insira um mdulo VBA e digite o cdigo.

Assegure-se de que a pasta de trabalho esteja configurada adequadamente. Se o exemplo usar duas planilhas chamadas Sheet1 e Sheet2, assegure-se de que a pasta de trabalho tenha as planilhas com esses nomes.
Copiando uma faixa
Uma das atividades em Excel considerada a mais preferida de todos os
tempos copiar uma faixa. Quando voc liga o gravador de macro e
copia uma faixa a partir de A1:A5 para B1:B5, obtm esta macro VBA:
Sub CopyRange()
Range(A1:A5).Select
Selection.Copy
Range(B1).Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub
Observe a ltima declarao. Ela foi gerada pressionando Esc, o que
cancela a marcha das formigas que aparece na planilha quando voc
copia uma faixa.
Esta macro funciona bem, mas voc pode copiar uma faixa com mais
eficincia. possvel produzir o mesmo resultado com a seguinte macro
de uma linha, a qual no seleciona quaisquer clulas:
Sub CopyRange2()
Range(A1:A5).CopyRange(B1)
End Sub
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 212 15/02/2013 13:59:53
213 Captulo 14: Exemplos de Programao em VBA
Este procedimento tem a vantagem de que o mtodo Copy pode usar um
argumento que especifica o destino. Eu descobri isso consultando o
sistema de ajuda do VBA. Este exemplo tambm demonstra que o
gravador de macro nem sempre gera o cdigo mais eficiente.
Copiando uma faixa de tamanho varivel
Em muitos casos, voc precisa copiar uma faixa de clulas, mas no
conhece as dimenses exatas de linha e coluna. Por exemplo, voc
poderia ter uma pasta de trabalho que controla as vendas semanais. A
quantidade de linhas muda quando voc acrescenta novos dados.
A Figura 14-1 mostra uma faixa em uma planilha. Essa faixa consiste de
vrias linhas e uma srie de linhas pode mudar diariamente. Pelo fato
de voc no saber o endereo exato da faixa em determinada ocasio,
escrever uma macro para copi-la pode ser desafiador. Est preparado
para o desafio?
A seguinte macro demonstra como copiar essa faixa de Sheet1 para
Sheet2 (comeando na clula A1). Ela usa a propriedade CurrentRegion,
a qual retorna um objeto Ranger que corresponde ao bloco de clulas
em torno de uma clula em especial. Nesse caso, tal clula A1.
Sub CopyCurrentRegion()
Range(A1).CurrentRegion.Copy
Sheets(Sheet2).Select
Range(A1).Select
ActiveSheet.Paste
Sheets(Sheet1).Select
Application.CutCopyMode = False
End Sub
Figura 14-1:
Essa faixa

pode consistir de
qualquer
quantidade
de linhas.
ExcelVBABokks.indb 213 15/02/2013 13:59:54
Parte III: Conceitos de Programao 214
Usar a propriedade CurrentRegion equivalente a escolher Pgina
Inicial Edio Localizar e Selecionar Ir para Especial (que exibe a
caixa de dilogo Ir para Especial) e escolher a opo Regio Atual. Para
ver como isso funciona, grave as suas aes enquanto executa esse
comando. Normalmente, Regio Atual consiste de um bloco retangular
de clulas rodeado por uma ou mais linhas ou colunas em branco.
possvel tornar essa macro ainda mais eficiente, no selecionando o
destino. A macro a seguir tem a vantagem de que o mtodo Copy pode
usar um argumento para a faixa de destino:
Sub CopyCurrentRegion2()
Range(A1).CurrentRegion.Copy _
Sheets(Sheet2).Range(A1)
Application.CutCopyMode = False
End Sub
Selecionando ao nal de uma linha ou coluna
Provavelmente, voc tem o costume de usar combinaes de teclas,
como Ctrl+Shift+ Seta para a direita e Ctrl+Shift+Seta para baixo para
selecionar uma faixa que consiste de tudo, a partir da clula ativa ao
final de uma linha ou uma coluna. Sem surpresas, voc pode escrever
macros que executam esses tipos de seleo.
Voc pode usar a propriedade CurrentRegion para selecionar um bloco
inteiro de clulas. Mas, e se voc quiser selecionar, digamos, uma
coluna de um bloco de clulas? Felizmente, o VBA pode acomodar esse
tipo de ao. O seguinte procedimento VBA seleciona a faixa iniciando
na clula ativa e se estendendo para baixo. Depois de selecionar a faixa,
voc pode fazer o que quiser com ela copi-la, mov-la, format-la e
assim por diante.
Sub SelectDown()
Range(ActiveCell, ActiveCell.End(xlDown)).Select
End Sub
possvel fazer manualmente esse tipo de seleo: Selecione a primeira
clula, mantenha pressionada a tecla Shift, pressione End e depois,
pressione Seta para baixo.
Este exemplo usa o mtodo End do objeto ActiveCell, o qual retorna um
objeto Range. O mtodo End toma um argumento que pode ser qualquer das seguintes constantes:
5 xlUP
5 xlDown
5 xlToLeft
5 xlToRight
ExcelVBABokks.indb 214 15/02/2013 13:59:54
215 Captulo 14: Exemplos de Programao em VBA
Tenha em mente que no necessrio selecionar uma faixa antes de fazer
alguma coisa com ela. A seguinte macro aplica a formatao em negrito a
uma faixa de tamanho varivel (coluna nica) sem selecionar a faixa:
Sub MakeBold()
Range(ActiveCell, ActiveCell.End(xlDown)) _
.Font.Bold = True
End Sub
Selecionando uma linha ou coluna
O seguinte procedimento demonstra como selecionar a coluna que contm
a clula ativa. Ele usa a propriedade EntireColumn, a qual retorna um
objeto Range que consiste de uma coluna inteira:

Sub SelectColumn()
ActiveCell.EntireColumn.Select
End Sub
Como voc poderia esperar, o VBA tambm oferece uma propriedade
EntireRow, a qual retorna um objeto Range que consiste de uma linha inteira.
Movendo uma faixa
Voc move uma faixa recortando-a para a rea de Transferncia e
depois colando-a em outra rea. Se gravar as suas aes enquanto
executa uma operao de mover, o gravador de macro gera um cdigo
como o seguinte:
Sub MoveRange()
Range(A1:C6).Select
Selection.Cut
Range(A10).Select
ActiveSheet.Paste
End Sub
Como com a cpia do exemplo, anteriormente neste captulo, essa no
a maneira mais eficiente de mover uma faixa de clulas. Na verdade,
voc pode mover uma faixa com uma nica declarao VBA, assim:
Sub MoveRange2()
Range(A1:C6).Cut Range(A10)
End Sub
ExcelVBABokks.indb 215 15/02/2013 13:59:54
Parte III: Conceitos de Programao 216
Esta macro tem a vantagem de que o mtodo Cut pode usar um argumento que especifica o destino. Observe ainda que a faixa no foi selecionada. O indicador de clula permanece em sua posio original.
Como fazer loop e cientemente
atravs de uma faixa
Muitas macros executam uma operao em cada clula de uma faixa, ou
poderiam executar aes selecionadas, com base no contedo de cada
clula. Geralmente, essas clulas incluem um loop For-Next que processa cada clula na faixa.
O seguinte exemplo demonstra como fazer loop atravs de uma faixa de
clulas. Neste caso, a faixa a seleo atual. Um objeto varivel,
chamado Cell, refere-se clula sendo processada. Dentro da loop
For-Next, a nica declarao avalia a clula e aplica formatao em
negrito se a clula contiver um valor positivo.
Sub ProcessCells()
Dim Cell As Range
For Each Cell In Selection
If Cell.Value > 0 Then Cell.Font.Bold = True
Next Cell
End Sub
Este exemplo funciona, mas e se a seleo consistir de uma coluna ou
linha inteira? Isso no incomum, pois o Excel permite que voc realize
operaes em colunas ou linhas inteiras. Em tal caso, a macro parece
demorar para sempre, pois ela faz loops atravs de cada clula (todas
as 1.048.576) na coluna mesmo as clulas em branco. Para tornar a
macro mais eficiente, voc precisa de uma maneira para processar
apenas as clulas que no esto em branco.
A seguinte rotina faz exatamente isso, usando o mtodo SpecialCells
(para detalhes especficos sobre os argumentos dele, consulte o
sistema de Ajuda VBA). Esta rotina usa a palavra chave Set para criar
dois novos objetos Range: o subconjunto da seleo, que consiste de
clulas com constantes e o subconjunto da seleo que consiste de
clulas com frmulas. A rotina processa cada um desses subconjuntos,
com o efeito lquido de pular todas as clulas em branco. Bem esperto,
no ?
Sub SkipBlanks()

Dim ConstantCells As Range


Dim FormulaCells As Range
Dim cell As Range
Ignore erros
On Error Resume Next
ExcelVBABokks.indb 216 15/02/2013 13:59:55
217 Captulo 14: Exemplos de Programao em VBA
Processe as constantes
Set ConstantCells = Selection _
.SpecialCells(xlConstants)
For Each cell In ConstantCells
If cell.Value > 0 Then
cell.Font.Bold = True
End If
Next cell
Processe as frmulas
Set FormulaCells = Selection
.SpecialCells(xlFormulas)
For Each cell In FormulaCells
If cell.Value > 0 Then
cell.Font.Bold = True
End If
Next Cell
End Sub
O procedimento SkipBlanks funciona na mesma velocidade, independente do que voc seleciona. Por exemplo, voc pode selecionar
a faixa, todas as colunas na faixa, todas as linhas na faixa ou mesmo
toda a planilha. um grande aperfeioamento sobre o procedimento
ProcessCells, apresentado anteriormente nesta seo.
Veja que eu uso a seguinte declarao neste cdigo:
On Error Resume Next
Esta declarao diz ao Excel para ignorar quaisquer erros que ocorram
e simplesmente processar a seguinte declarao (veja no Captulo 12
uma discusso sobre como lidar com erros). Esta declarao necessria, porque o mtodo SpecialCells produz um erro se nenhuma das
clulas se qualificar.
Usar o mtodo SpecialCells equivalente a escolher o comando Pgina
inicial Edio Localizar e Selecionar Ir para Especial e selecionar a
opo Constantes ou a opo Frmulas. Para ter uma noo de como
isso funciona, grave as suas aes enquanto executa tal comando e
seleciona as vrias opes.
Como fazer loop e cientemente
atravs de uma faixa (Parte II)
E agora, a continuao. Esta seo demonstra uma outra forma de
processar clulas de uma maneira eficiente. Ela tem a vantagem da
propriedade UsedRange (Faixa Usada) a qual retorna um objeto
Range que consiste apenas da rea usada da planilha. Ela tambm usa o
mtodo Intersect, que retorna um objeto Range que consiste de clulas
que duas faixas tm em comum.
ExcelVBABokks.indb 217 15/02/2013 13:59:55
Parte III: Conceitos de Programao 218
Eis uma variao do procedimento SkipBlanks da seo anterior:
Sub SkipBlanks2()
Dim WorkRange As Range
Dim cell As Range
Set WorkRange = Intersect _
(Selection, ActiveSheet.UsedRange)
For Each cell In WorkRange
If cell.Value > 0 Then
cell.Font.Bold = True

End If
Next cell
End Sub
O objeto varivel WorkRange consiste de clulas que so comuns
seleo do usurio, e a faixa usada da planilha. Portanto, se toda uma
coluna estiver selecionada, WorkRange contm apenas as clulas que
esto dentro da rea usada da planilha. Rpido e eficiente, sem ciclos
de CPU desperdiados no processamento de clulas que esto fora da
rea usada na planilha.
Solicitando o valor de uma clula
Conforme mostrado na Figura 14-2, voc pode usar a funo InputBox
do VBA para obter um valor do usurio. Depois, voc pode inserir
aquele valor em uma clula. O seguinte procedimento demonstra como
pedir um valor ao usurio e colocar o valor na clula A1 da planilha
ativa, usando apenas uma declarao:
Sub GetValue()
Range(A1).Value = InputBox _
(Entre o valor da clula A1)
End Sub
Figura 14-2:
Use a
funo
InputBox do
VBA para
obter um
valor do
usurio.
ExcelVBABokks.indb 218 15/02/2013 13:59:55
219 Captulo 14: Exemplos de Programao em VBA
Se experimentar este exemplo, voc descobrir que clicar o boto
Cancelar na InputBox apaga o valor atual na clula A1. Apagar os dados
do usurio no uma prtica muito boa de programao. A seguinte
macro demonstra uma abordagem melhor: usar uma varivel (x) para
armazenar o valor fornecido pelo usurio. Se o valor no estiver vazio
(isto , se o usurio no cancelou), o valor de x colocado na clula A1.
Caso contrrio, nada acontece.
Sub GetValue2()
Dim x as Variant
x = InputBox(Entre o valor da clula A1)
If x <> Then Range(A1).Value = x
End Sub
A varivel x definida como um tipo de dados Variant (variante), pois ela
poderia ser um nmero ou uma string vazia (se o usurio cancelar).
Determinando o tipo de seleo
Se voc definir a sua macro com uma seleo de faixa, a macro deve ser
capaz de determinar se uma faixa est, de fato, selecionada. Se alguma
outra coisa que no uma faixa estiver selecionada (tal como um grfico
ou uma figura), provavelmente a macro explodir. O seguinte procedimento usa a funo TypeName para identificar o tipo de objeto que est
selecionado no momento:
Sub SelectionType()
MsgBox TypeName(Selection)
End Sub
Se um objeto Range estiver selecionado, a MsgBox exibe Range. Se a
sua macro s funcionar com faixas, voc pode usar uma declarao If
para garantir que uma faixa seja selecionada. Este exemplo exibe uma
mensagem e promove a sada do procedimento se a seleo atual no
for um objeto Range:
Sub CheckSelection()
If TypeName(Selection) <> Range Then

MsgBox Selecione uma faixa.


Exit Sub
End If
... [Other statements go here]
End Sub
Identi cando uma seleo mltipla
Como voc sabe, o Excel permite mltiplas selees, pressionando Ctrl
enquanto voc escolhe objetos ou faixas. Isso pode causar problemas
com algumas macros. Por exemplo, voc no pode copiar uma seleo
mltipla que consiste de clulas no adjacentes. Se tentar faz-lo, o
Excel o repreende com a mensagem mostrada na Figura 14-3.
ExcelVBABokks.indb 219 15/02/2013 13:59:55
Parte III: Conceitos de Programao 220
A seguinte macro demonstra como determinar se o usurio fez uma
seleo mltipla, assim a sua macro pode tomar a atitude apropriada:
Sub MultipleSelection()
If Selection.Areas.Count > 1 Then
MsgBox Selees mltiplas no permitidas.
Exit Sub
End If
... [Outras declaraes entram aqui
End Sub
Este exemplo usa o mtodo Areas, que retorna uma coleo de todos os
objetos na seleo. A propriedade Count retorna o nmero de objetos
na coleo.
Mudando as Con guraes do Excel
Algumas das macros mais teis so simples procedimentos que mudam
uma ou mais configuraes do Excel. Por exemplo, se voc acessa com
frequncia a caixa de dilogo Opes do Excel para alterar uma configurao, trata-se de uma boa oportunidade para poupar tempo com uma
simples macro.
Esta seo apresenta dois exemplos que mostram como mudar configuraes no Excel. Voc pode aplicar os princpios gerais demonstrados
por estes exemplos em outras operaes que alteram configuraes.
Figura 14-3:
O Excel no
gosta se
voc tentar
copiar uma
seleo
mltipla.
ExcelVBABokks.indb 220 15/02/2013 13:59:56
221 Captulo 14: Exemplos de Programao em VBA
Mudando con guraes Booleanas
Como um interruptor de luz, uma configurao Booleana est ligada ou
desligada (ativada ou desativada). Por exemplo, voc poderia querer
criar uma macro que ativasse e desativasse a exibio de quebra de
pgina de planilha. Depois que voc imprime ou visualiza uma planilha,
o Excel exibe linhas pontilhadas para indicar as quebras de pgina.
Algumas pessoas (incluindo o autor) acha essas linhas pontilhadas
muito desagradveis. Infelizmente, a nica maneira de se livrar da
exibio de quebra de pgina abrir a caixa de dilogo Opes do
Excel, clicar na guia Avanado e rolar para baixo, at encontrar a caixa
de verificao Mostrar Quebras de Pgina. Se voc ativar o gravador de
macro ao mudar essa opo, o Excel gera o seguinte cdigo:
ActiveSheet.DisplayPageBreaks = False
Por outro lado, se as quebras de pgina no estiverem visveis quando
voc gravar a macro, o Excel gera o seguinte cdigo:
ActiveSheet.DisplayPageBreaks = True
Isso pode lev-lo a suspeitar que precisa de duas macros: uma para

ativar a exibio de quebra de pgina e uma para desativar. No


verdade. O seguinte procedimento usa o operador Not (no), o qual
troca True para False e False para True. Executar o procedimento
TogglePageBreaks uma maneira simples de ativar a exibio de
quebra de pgina de True para False e de False para True:
Sub TogglePageBreaks()
On Error Resume Next
ActiveSheet.DisplayPageBreaks = Not _
ActiveSheet.DisplayPageBreaks
End Sub
A primeira declarao ignora um erro que acontece se a planilha ativa for
uma planilha de grfico (planilhas de grfico no exibem quebras de pgina).
Voc pode usar esta tcnica para alternar quaisquer configuraes que
tenham valores Booleanos (Verdadeiro ou Falso).
Mudando con guraes no Booleanas
Use uma estrutura Select Case em configuraes no Booleanas. Este
exemplo alterna o modo de clculo entre manual e automtico e exibe
uma mensagem indicando o modo atual:
ExcelVBABokks.indb 221 15/02/2013 13:59:56
Parte III: Conceitos de Programao 222
Sub ToggleCalcMode()
Select Case Application.Calculation
Case xlManual
Application.Calculation = xlCalculationAutomatic
MsgBox Modo de clculo Automatico
Case xlAutomatic
Application.Calculation = xlCalculationManual
MsgBox Modo de clculo Manual
End Select
End Sub
possvel adaptar esta tcnica para alterar outras configuraes
no Booleanas.
Trabalhando com Gr cos
Os grficos so repletos de objetos diferentes, portanto, manipular
grficos com VBA pode ser um pouco desafiador. O desafio aumenta
com o Excel 2007, porque a Microsoft resolveu omitir a gravao de
macros em todas as coisas novas e extravagantes de formatao de
grfico. Felizmente, esse problema srio foi corrigido no Excel 2010.
Eu disparei o Excel 2010, entrei com alguns nmeros em A1:A3 e selecionei aquela faixa. Depois, liguei o gravador de macro e criei um grfico
bsico de coluna com trs pontos de dados. Apaguei a legenda do
grfico e acrescentei um efeito sombreado s colunas. Eis a macro:
Sub Macro1()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Range _
(Sheet1 !$A$1:$A$3)
ActiveChart.Legend.Select
Selection.Delete
ActiveSheet.ChartObjects(Chart 1).Activate
ActiveChart.SeriesCollection(1).Select
Selection.Format.Shadow.Type = msoShadow21
End Sub
Se voc gravar essa macro em Excel 2007, a ltima declarao (a qual
aplica a sombra) nem ao menos gerada. Este apenas um exemplo de
como o Excel 2007 ignora os comandos de formatao de grfico ao
gravar uma macro.
A propsito, esta macro provavelmente gerar um erro, pois ela faz cdigo
slido com o nome do grfico na macro. Quando voc roda essa macro, o
grfico criado no necessariamente nomeado como Chart 1. Se por acaso

voc tiver um grfico chamado Chart 1, a formatao de sombreado ser


aplicada a ele no ao que a macro criou. Da mesma forma, a faixa de
ExcelVBABokks.indb 222 15/02/2013 13:59:56
Captulo 14: Exemplos de Programao em VBA 223
dados do grfico de cdigo slido, portanto, voc no usaria isto em uma
macro de criao de grfico de objetivos gerais.
Entretanto, examinar o cdigo gravado revela algumas coisas que
podem ser teis ao escrever as suas prprias macros relacionadas com
grfico. Se estiver curioso, eis uma verso feita mo daquela macro
que cria um grfico a partir de uma faixa selecionada:
Sub CreateAChart()
Dim ChartData As Tange
Dim ChartShape As Shape
Dim NewChart As Chart
Create object variables
Set ChartData = ActiveWindow.RangeSelection
Set ChartShape = ActiveSheet.Shapes.AddChart
Set NewChart = ChartShape.Chart
Adjust the chart
With NewChart
.ChartType = xlColumnClustered
.SetSourceData Source:=Range(ChartData.Address)
.Legend.Delete
.SeriesCollection(1).Format.Shadow.Type = _
msoShadow21
End With
End Sub
Se precisar escrever macros VBA que manipulem grficos, voc precisa
entender alguma terminologia. Um grfico embutido em uma planilha
um objeto ChartObject. Voc pode ativar um ChartObject exatamente
como ativa uma planilha. A seguinte declarao ativa o ChartObject
chamado Chart 1:
ActiveSheet.ChartObjects(Chart 1).Activate
Depois de ativar o grfico, voc pode referenci-lo em seu cdigo VBA
como o ActiveChart. Se o grfico estiver em uma planilha de grfico
separada, ele se torna o grfico ativo assim que voc ativar a sua
respectiva planilha.
Um ChartObject tambm um Shape, que pode ser um pouco confuso.
Na verdade, quando o seu cdigo VBA criar um grfico, ele comea
acrescentando um novo Shape. Voc tambm pode ativar um grfico,
selecionando o objeto Shape que contm o grfico:
ActiveSheet.Shapes(Chart 1).Select
Eu prefiro usar o objeto ChartObject em meu cdigo, apenas para
deixar perfeitamente claro que estou trabalhando com um grfico.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A

ExcelVBABokks.indb 223 15/02/2013 13:59:57


Parte III: Conceitos de Programao 224
Quando voc clicar um grfico embutido, na verdade o Excel seleciona
um objeto dentro do objeto ChartObject. Voc pode selecionar o prprio
ChartObject, pressionando Ctrl enquanto clica o grfico embutido.
Modi cando o tipo de gr co
Eis uma declarao confusa para voc: Um ChartObject age como um
continer para um objeto Chart. Leia isso algumas vezes e poder, de
fato, fazer sentido.
Para modificar um grfico com VBA, no preciso ativar o grfico.
Ao invs disso, o mtodo Chart pode retornar o grfico contido no
ChartObject. Voc j est bem confuso? Os dois procedimentos seguintes tm o mesmo efeito eles mudam o grfico chamado Chart 1 para
uma rea de grfico. O primeiro procedimento ativa o primeiro grfico e
depois, trabalha com o grfico ativo. O segundo procedimento no
ativa o grfico. Ao invs, ele usa a propriedade Chart para retornar o
objeto Chart contido no objeto ChartObject.
Sub ModifyChart1()
ActiveSheet.ChartObjects(Chart 1).Activate
ActiveChart.Type = xlArea
End sub
Sub ModifyChart2()
ActiveSheet.ChartObjects(Chart 1) _
.Chart.Type = xlArea
End Sub
Fazendo Looping atravs da
coleo ChartObjects
Este exemplo muda o tipo de grfico de cada grfico embutido na
planilha ativa. O procedimento usa um loop For-Next para circular
atravs de cada objeto na coleo ChartObjects, acessar o objeto Chart
em cada um e alterar a sua propriedade Type.
Sub ChartType()
Dim cht As ChartObject
For Each cht In ActiveSheet.ChartObjects
cht.Chart.Type = xlArea
Next cht
End Sub
C
U
I
D
A
D
O!
ExcelVBABokks.indb 224 15/02/2013 13:59:57
Captulo 14: Exemplos de Programao em VBA 225
A seguinte macro executa a mesma funo, mas funciona em todas as
planilhas de grfico na pasta de trabalho ativa:
Sub ChartType2()
Dim cht As ChartType2
For Each cht In ActiveWorkbook.Charts
cht.Type = xlArea
Next cht
End Sub
Modi cando propriedades Chart
O seguinte exemplo muda a fonte da legenda em todos os grficos na
planilha ativa. Ele usa um loop For-Next para processar todos os
objetos ChartObject:
Sub LegendMod()
Dim cht As ChartObject

For Each cht In ActiveSheet.ChartObjects


With cht.Chart.Legend.Font
.Name = Calibri
.FontStyle = Bold
.Size = 12
End With
Next cht
End Sub
Observe que o objeto Font est contido no objeto Legend, o qual est
contido no objeto Chart, que est contido na coleo ChartObjects.
Agora voc entende porque chamada de hierarquia de objeto?
Aplicando formatao de gr co
Este exemplo aplica vrios tipos diferentes de formatao ao grfico ativo.
Eu criei esta macro gravando minhas aes enquanto formatava um
grfico. Depois, limpei o cdigo gravado, removendo as linhas irrelevantes.
Sub ChartMods()
ActiveChart.Type = xlArea
ActiveChart.ChartArea.Font.Name = Calibri
ActiveChart.ChartArea.Font.FontStype = Regular
ActiveChart.ChartArea.Font.Size = 9
ActiveChart.PlotArea.Interior.ColorIndex = xlNone
ActiveChart.Aces(xlValue).TickLabels.Font.Bold = True
ActiveChart.Axes(xlCategory).TockLabels.Font.Bold = _
True
ActiveChart.Legend.Position = xlBottom
End Sub
ExcelVBABokks.indb 225 15/02/2013 13:59:57
Parte III: Conceitos de Programao 226
Voc deve ativar um grfico antes de executar a macro ChartMods.
Ative um grfico embutido clicando-o. Para ativar um grfico em uma
planilha de grfico, ative a planilha de grfico.
Para garantir que um grfico seja selecionado, possvel acrescentar
uma declarao para determinar se um grfico est ativo. Eis a macro
modificada, que exibe uma mensagem (e termina) se um grfico no
estiver ativado:
Sub ChartMods2()
If ActiveChart Is Nothing Then
MsgBox Activate a chart.
Exit Sub
End If
ActiveChart.Type = xlArea
ActiveChart.ChartArea.Font.Name = Calibri
ActiveChart.ChartArea.Font.FontStype = Regular
ActiveChart.ChartArea.Font.Size = 9
ActiveChart.PlotArea.Interior.ColorIndex = xlNone
ActiveChart.Axes(xlValue).TickLabels.Font.Bold = True
ActiveChart.Axes(xlCategory).TickLabels.Font.Bold = _
True
ActiveChart.Legend.Position = xlBottom
End Sub
Eis uma outra verso que usa a construo With-End With para poupar
alguma digitao e tornar o cdigo um pouco mais claro. Novamente,
estou me adiantando a mim mesmo. Folheie algumas pginas para ler
sobre a estrutura de With End-With.
Sub ChartMods3()
If ActiveChart Is Nothing Then
MsgBox Activate a chart.
Exit Sub
End If
With ActiveChart

.Type = xlArea
.ChartArea.Font.Name = Calibri
.ChartArea.Font.FontStyle = Regular
.ChartArea.Font.Size = 9
.PlotArea.Interior.ColorIndex = xlNone
.Axes(xlValue).TickLabels.Font.Bold = True
.Axes(xlCategory).TickLabels.Font.Bold = True
.Legend.Position = xlBottom
End With
End Sub
Quando se trata de usar VBA para trabalhar com grficos, esta curta
seo mal arranhou a superfcie. Claro que h muito mais sobre isso, mas
pelo menos esta introduo bsica ir encaminh-lo na direo certa.
ExcelVBABokks.indb 226 15/02/2013 13:59:57
Captulo 14: Exemplos de Programao em VBA 227
Dicas de Velocidade do VBA
VBA rpido, mas nem sempre rpido o suficiente (os programas de
computador nunca so rpidos o suficiente). Esta seo apresenta
alguns exemplos de programao que podem ser usados para aumentar
a velocidade de suas macros.
Desativando a atualizao de tela
Ao executar uma macro, voc pode sentar e observar na tela toda a
ao que acontece na macro. Ainda que fazer isso possa ser instrutivo,
depois de conseguir fazer a macro funcionar adequadamente, geralmente aborrecido e pode desacelerar consideravelmente o fluxo de sua
macro. Felizmente, voc pode desativar a atualizao de tela que
normalmente acontece quando voc executa uma macro. Para desativar
a atualizao de tela, use a seguinte declarao:
Application.ScreenUpdating = False
Se voc quiser que o usurio veja o que est acontecendo em qualquer
momento durante a macro, use a seguinte declarao para retornar a
ativao de tela:
Application.ScreenUpdating = True
Para demonstrar a diferena em velocidade, execute esta simples
macro, a qual preenche uma faixa com nmeros:
Sub FillRange()
Dim r as Long, c As Long
Dim Number as Long
Number = 0
For r = 1 To 50
For c = 1 To 50
Number = Number + 1
Cells(r, c).Select
Cells(r, c).Value = Number
Next c
Next r
End Sub
Voc v cada clula sendo selecionada e o valor sendo inserido. Agora,
insira a seguinte instruo no incio do procedimento e execute novamente.
Application.ScreenUpdating = False
ExcelVBABokks.indb 227 15/02/2013 13:59:58
Parte III: Conceitos de Programao 228
A faixa preenchida muito mais depressa e voc no v o resultado
final at que a macro tenha acabado de rodar.
Ao depurar cdigo, s vezes a execuo do programa termina em algum
lugar no meio, sem ter retornado a atualizao de Tela (, isso acontece
comigo tambm). s vezes, isso leva a janela de aplicativo do Excel
ficar completamente sem resposta. A forma de sair dessa posio
congelada simples: volte para o VBE e execute a seguinte declarao
na janela Verificao imediata:

Application.ScreenUpdating = True
Desativando o clculo automtico
Se voc tiver uma planilha com muitas frmulas complexas, pode achar
que possvel agilizar consideravelmente as coisas, configurando o
modo de clculo para manual enquanto a sua macro est executando.
Quando a macro terminar, configure o clculo de volta para automtico.
A seguinte declarao configura o modo de clculo do Excel para manual:
Application.Calculation = xlCalculationManual
Execute a seguinte declarao para configurar o modo de clculo
para automtico:
Application.Calculation = xlCalculationAutomatic
Se o seu cdigo usar clulas com resultados de frmulas, lembre-se de
que desativar o clculo significa que as clulas no sero recalculadas,
a menos que voc diga, explicitamente, ao Excel para faz-lo!
Eliminando aquelas inoportunas
mensagens de alerta
Como voc sabe, uma macro pode executar automaticamente uma srie
de aes. Em muitos casos, voc pode iniciar uma macro e depois,
circular pela sala de correspondncia enquanto o Excel faz isso.
Entretanto, algumas operaes do Excel exibem mensagens que
requerem uma resposta humana. Por exemplo, se a sua macro apagar
uma planilha que no est vazia, o seu cdigo d uma parada, enquanto
o Excel espera pela sua resposta mensagem mostrada na Figura 14-4.
Esses tipos de mensagem significam que voc no pode deixar o Excel
sozinho enquanto ele executa a sua macro a menos que voc conhea o truque secreto.
D
I
C
A
C
U
I
D
A
D
O!
ExcelVBABokks.indb 228 15/02/2013 13:59:58
229 Captulo 14: Exemplos de Programao em VBA
O truque secreto: para evitar essas mensagens de alerta, insira a
declarao a seguir em sua macro.
Application.DisplayAlerts = False
O Excel executa a operao padro para esses tipos de mensagens. No
caso de apagar uma planilha, a operao padro Excluir (que
exatamente o que voc quer que acontea). Se no tiver certeza de qual
a operao padro, faa um teste e veja o que acontece.
Quando o procedimento terminar, automaticamente o Excel reconfigura
a propriedade DisplayAlerts para True (a sua posio normal). Se voc
precisar retornar a ativao do alerta antes do procedimento terminar,
use esta declarao:
Application.DisplayAlerts = True
Simpli cando referncias de objeto
Como provavelmente voc j sabe, referncias a objetos podem se
tornar muito longas. Por exemplo, uma referncia totalmente qualificada a um objeto Range pode parecer como isto:
Workbooks(MyBook.xlsx).Worksheets(Sheet1) _
.Range(InterestRate)
Se a sua macro usa essa faixa com frequncia, voc pode querer criar um
objeto varivel, usando o comando Set. Por exemplo, a seguinte declarao designa esse objeto Range a um objeto varivel chamado Rate:

Set Rate = Workbooks(MyBook.xlsx) _


.Worksheets(Sheet1).Range(InterestRate)
Figura 14-4:
Voc pode
instruir o
Excel a no
exibir esses
tipos de
alertas
enquanto
executa
uma macro.
ExcelVBABokks.indb 229 15/02/2013 13:59:58
Parte III: Conceitos de Programao 230
Depois de definir este objeto varivel, voc pode usar a varivel Rate ao
invs da referncia longa. Por exemplo, possvel mudar o valor da
clula chamada InterestRate:
Rate.Value = .085
Isto muito mais fcil de digitar (e entender) que a seguinte declarao:
Workbooks(MyBook.xlsx).Worksheets(Sheet1). _
Range(InterestRate) = .085
Alm de simplificar a sua codificao, usar objetos variveis tambm
agiliza consideravelmente as suas macros. Depois de criar objetos
variveis, tenho visto algumas macros rodar duas vezes mais depressa
que antes.
Declarando tipos de variveis
Normalmente, voc no precisa se preocupar com o tipo de dados que
designa a uma varivel. O Excel lida com todos os detalhes por trs das
cenas para voc. Por exemplo, se tiver uma varivel chamada MyVar,
voc pode designar um nmero de qualquer tipo quela varivel. Pode
at designar uma string de texto a ela, mais adiante no procedimento.
Mas, se voc quiser que os seus procedimentos rodem o mais rpido
possvel (e evitem alguns problemas potencialmente desagradveis),
diga ao Excel qual tipo de dados sero designados a cada uma de suas
variveis. Isso conhecido como declarar um tipo da varivel (para
detalhes completos, consulte o Captulo 7). Acostume-se a declarar
todas as variveis que voc usa.
Em geral, voc deveria usar o tipo de dados que requer o menor
nmero de bytes que, no entanto, lidam com todos os dados designados a ele. Quando o VBA trabalha com dados, a velocidade de execuo
depende do nmero de bytes que o VBA tem sua disposio. Em
outras palavras, quanto menos bytes os dados usam, mais depressa o
VBA pode acessar e manipular os dados.
Se voc usa um objeto varivel (conforme descrito na seo anterior),
pode declarar a varivel como um tipo de objeto especial. Eis um exemplo:
Dim Rate as Range
Set Rate = Workbooks(MyBook.xlsx) _
.Worksheets(Sheet1).Range(InterestRate)
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 230 15/02/2013 13:59:59
231 Captulo 14: Exemplos de Programao em VBA
Como usar a estrutura With-End With
Voc precisa configurar um nmero de propriedades a um objeto? O
seu cdigo roda mais depressa se voc usar a estrutura With-End With.

Um benefcio adicional que o seu cdigo pode ficar mais fcil de ler.
O seguinte cdigo no usa With-End With:
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.WrapText = True
Selection.Orientation = 0
Selection.ShrinkToFit = False
Selection.MergeCells = False
Eis o mesmo cdigo, reescrito para usar With-End With:
With Selection
.HoritontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Orientation = 0
.ShrinkToFit = False
.MergeCells = False
End With
Se esta estrutura parece familiar, provavelmente porque o gravador
de macro usa With-End With sempre que pode. E eu apresentei um
outro exemplo anteriormente neste captulo.
D
I
C
A
ExcelVBABokks.indb 231 15/02/2013 13:59:59
Parte III: Conceitos de Programao 232
ExcelVBABokks.indb 232 15/02/2013 13:59:59
Como se Comunicar
com Seus Usurios
Parte IV
Por Rich Tennant
A 5 Onda
Eu experimentei vrios programas de planilha,
mas este o melhor para modelar
colchas de retalho .
ExcelVBABokks.indb 233 15/02/2013 14:00:00
Nesta parte...
O
s cinco captulos desta parte mostram como
desenvolver caixas de dilogo personalizadas
(tambm conhecidas como UserForms). Esse recurso
VBA bastante fcil de usar, depois que voc consegue controlar alguns conceitos bsicos. E, se for
como eu, na verdade, voc pode gostar de criar caixas
de dilogo.
ExcelVBABokks.indb 234 15/02/2013 14:00:00


Neste Captulo
Como poupar tempo usando qualquer das vrias alternativas a UserForms
Como usar as funes InputBox e MsgBox para obter informaes do usurio
Como obter do usurio um nome de arquivo e caminho
Como obter do usurio um nome de pasta
Escrevendo cdigo VBA para executar comandos da faixa de opes (ribbon) que
exibem caixas de dilogo integradas ao Excel
Caixas de Dilogo Simples
Captulo 15
N
o possvel usar o Excel por muito tempo sem car exposto s
caixas de dilogo. Elas parecem surgir quase sempre que voc

seleciona um comando. O Excel como a maioria dos programas


Windows usa caixas de dilogo para obter informaes, esclarecer
comandos e exibir mensagens. Se voc desenvolver macros, pode criar
as suas prprias caixas de dilogo que funcionam exatamente como
aquelas integradas no Excel. Essas caixas de dilogo personalizadas so
chamadas de UserForms (formulrios de usurio) em VBA.
Este captulo no informa nada sobre a criao de UserForms. Ao invs
disso, descreve algumas tcnicas que podem ser usadas no lugar de
UserForms. Entretanto, os Captulos de 16 a 18 cobrem UserForms.
Alternativas a UserForm
Algumas das macros VBA que voc cria se comportam da mesma forma
sempre que voc as executa. Por exemplo, voc pode desenvolver uma
macro que fornea uma lista de seus funcionrios em uma faixa de
planilha. Essa macro sempre produz o mesmo resultado e no requer
dados adicionais do usurio.
No entanto, seria possvel desenvolver outras macros que se comportem de maneira diferente sob circunstncias diversas ou que ofeream
opes ao usurio. Em tais casos, a macro pode ser aperfeioada com
uma caixa de dilogo personalizada. Uma caixa de dilogo personalizada oferece uma maneira simples de obter informaes do usurio.
Depois, a sua macro usa tais informaes para determinar o que fazer.
UserForms pode ser bem til, mas cri-las requer tempo. Antes de eu entrar
no assunto da criao de UserForms, no prximo captulo, voc precisa
conhecer algumas alternativas que, potencialmente, poupam tempo.
ExcelVBABokks.indb 235 15/02/2013 14:00:00
236 Parte IV: Como se Comunicar com Seus Usurios
O VBA permite que voc exiba vrios tipos diferentes de caixas de
dilogo que, s vezes, podem ser usadas no lugar de uma UserForm.
possvel personalizar de alguma maneira essas caixas de dilogo
integradas, mas, certamente, elas no oferecem as opes disponveis
em uma UserForm. Porm, em alguns casos, elas so exatamente o que
o mdico recomendou.
Neste captulo, voc vai ler sobre
5 A funo MsgBox
5 A funo InputBox
5 O mtodo GetOpenFilename
5 O mtodo GetSaveAsFilename
5 O mtodo FileDialog
Eu tambm descrevo como usar VBA para exibir as caixas de dilogo
integradas do Excel as caixas de dilogo que o Excel usa para obter
informaes suas.
A Funo MsgBox
Provavelmente voc j est familiarizado com a funo MsgBox do VBA
eu a uso bastante nos exemplos deste livro. A funo MsgBox, a qual
aceita os argumentos mostrados na Tabela 15-1, til para exibir
informaes e obter entrada simples do usurio. Uma funo, como
voc deve lembrar, retorna um valor. No caso da funo MsgBox, ela
usa uma caixa de dilogo para obter o valor que ela retornar. Continue
a ler para ver exatamente como ela funciona.
Eis uma verso simplificada da sintaxe para a funo MsgBox:
MsgBox(aviso[, botes][, ttulo])
Tabela 15-1 Argumentos da Funo MsgBox
Argumento O Que Ele Faz
aviso (prompt) O texto que o Excel exibe na caixa de mensagem
botes (buttons) Um nmero que especifica quais botes (e qual cone)
aparece na caixa de mensagem (opcional)
ttulo (title) O texto que aparece na barra de ttulo da caixa de mensagem (opcional), exibindo uma simples caixa de mensagem
ExcelVBABokks.indb 236 15/02/2013 14:00:00
237 Captulo 15: Caixas de Dilogo Simples

Voc pode usar a funo MsgBox de duas maneiras:


5 Apenas para mostrar uma mensagem ao usurio. Nesse caso,
voc no se preocupa com o resultado retornado pela funo.
5 Para obter uma resposta do usurio. Nesse caso, voc se
preocupa com o resultado retornado pela funo. O resultado
depende do boto que o usurio clicar.
Se voc usar a funo MsgBox sozinha, no inclua parnteses em torno
dos argumentos. O exemplo a seguir exibe apenas uma mensagem e no
retorna um resultado. Quando a mensagem exibida, o cdigo
interrompido at o usurio clicar OK.
Sub MsgBoxDemo()
MsgBox Clique OK para iniciar a impresso.
Sheets(Results).PrintOut
End Sub
A Figura 15-1 mostra como essa caixa de mensagem se parece.
Obtendo uma resposta de
uma caixa de mensagem
Se voc exibir uma caixa de mensagem que tenha mais do que apenas um
boto OK, provavelmente ir querer saber qual boto o usurio clicar. A
funo MsgBox pode retornar um valor que representa qual boto foi
clicado. Voc pode designar o resultado da funo MsgBox a uma varivel.
No seguinte cdigo, eu uso algumas constantes integradas (as quais
descrevo mais adiante, na Tabela 15-2), que facilitam trabalhar com os
valores retornados por MsgBox:
Sub GetAnswer()
Dim Ans As Integer
Ans = MsgBox(Voc ainda no almoou?, vbYesNo)
Select Case Ans
Case vbYes

... [code if Ans is Yes]...


Case vbNo

...[code if Ans is No]...


End Select
End Sub
Figura 15-1:
Uma
simples
caixa de
mensagem.
ExcelVBABokks.indb 237 15/02/2013 14:00:01
238 Parte IV: Como se Comunicar com Seus Usurios
A Figura 15-2 mostra como ela se parece. Quando voc executa esse
procedimento, a varivel Ans designada a um valor, seja vbYes ou
vbNo, dependendo de qual boto o usurio clicar. A declarao Select
Case usa o valor Ans para determinar qual ao o cdigo deve executar.
Voc tambm pode usar o resultado da funo MsgBox sem usar uma
varivel, como demonstra o seguinte exemplo:
Sub GetAnswer2()
If MsgBox(Continue?, vbYesNo) = vbYes Then

...[code if Yes is clocked]...


Else

...[code if Yes is not clicked]...


End If
End Sub
Personalizando caixas de mensagem
A flexibilidade dos botes de argumento facilitam a personalizao de
suas caixas de mensagem. Voc pode especificar quais botes exibir,
determinar se um cone aparece e decidir qual boto o padro (o
boto padro clicado se o usurio pressionar Enter).
A Tabela 15-2 relaciona algumas das constantes integradas que voc

pode usar para os botes de argumento. Se preferir, voc pode usar o


valor ao invs de uma constante (mas eu creio que usar as constantes
integradas muito mais fcil).
Tabela 15-2 Constantes Usadas na Funo MsgBox
Constante Valor O Que Ela Faz
vbOKOnly 0 Exibe apenas o boto OK.
vbOKCancel 1 Exibe os botes OK e Cancel.
vbAbortRetryIgnore 2 Exibe os botes Abort, Retry e Ignore
vbYesNoCancel 3 Exibe os botes Yes, No e Cancel.
vbYesNo 4 Exibe os botes Yes e No.
Figura
15-2: Uma
simples
caixa de
mensagem, com
dois
botes.
ExcelVBABokks.indb 238 15/02/2013 14:00:01
239 Captulo 15: Caixas de Dilogo Simples
Constante Valor O Que Ela Faz
vbRetryCancel 5 Exibe os botes Retry e Cancel.
vbCritical 16 Exibe o cone Mensagem Crtica.
vbQuestion 32 Exibe o cone Consulta de Aviso.
vbExclamation 48 Exibe o cone Mensagem de Aviso.
vbInformation 64 Exibe o cone Mensagem de Informao.
vbDefaultButton1 0 O boto padro o primeiro.
vbDefaultButton2 256 O boto padro o segundo.
vbDefaultButton3 512 O boto padro o terceiro.
vbDefaultButton4 768 O boto padro o quarto.
Para usar mais de uma destas constantes como um argumento, basta
conect-las a um operador +. Por exemplo, para exibir uma caixa de mensagem com Sim e No e um cone de ponto de exclamao, use a seguinte
expresso como o segundo argumento de MsgBox:
vbYesNo + vbExclamation
Ou, se voc preferir tornar o seu cdigo menos compreensvel, use um
valor de 52 (isto , 4 + 48).
O exemplo a seguir usa uma combinao de constantes para exibir uma
caixa de mensagem com um boto Sim e um boto No (vbYesNo),
assim como um cone de ponto de interrogao (vbQuestion). A
constante vbDefaultButton2 designa o segundo boto (No) como o
boto padro isto , o boto que clicado se o usurio pressionar
Enter. Para simplificar, eu atribu essas constantes varivel Config e
depois, usei Config como o segundo argumento na funo MsgBox.
Sub GetAnswer3()
Dim Config As Integer
Dim Ans As Integer
Config = vbYesNo + vbQuestion + vbDefaultButton2
Ans = MsgBox(Emitir o relatrio mensal?, Config)
If Ans = vbYes Then RunReport
End Sub
A Figura 15-3 mostra a caixa de mensagem que o Excel exibe quando
voc executa o procedimento GetAnswer3. Se o usurio clicar o boto
Sim, a rotina executa o procedimento chamado RunReport (que no
mostrado). Se o usurio clicar o boto No (ou pressionar Enter), a
rotina termina sem ao. Pelo fato de que eu omiti o argumento ttulo
na funo MsgBox, o Excel usa o ttulo padro, Microsoft Excel.
ExcelVBABokks.indb 239 15/02/2013 14:00:02
240 Parte IV: Como se Comunicar com Seus Usurios
A seguinte rotina oferece um outro exemplo do uso da funo MsgBox:

Sub GetAnswer4()
Dim Msg As String, Title As String
Dim Config As Integer, Ans As Integer
Msg = Voc deseja emitir o relatrio mensal?
Msg = Msg & vbNewLine & vbNewLine
Msg = Msg & O relatrio mensal ser emitido
Msg = Msg & em aproximadamente 15 minutos. Sero
Msg = Msg & geradas 30 pginas para
Msg = Msg & todos os escritrios de vendas do
Msg = Msg & ms atual.
Title = XYZ Marketing Company
Config = vbYesNo + vbQuestion
Ans = MsgBox(Msg, Config, Title)
If Ans = vbYes Then RunReport
End Sub
Este exemplo demonstra uma maneira eficiente de especificar uma
mensagem mais longa em uma caixa de mensagem. Eu uso uma varivel
(Msg) e o operador de concatenao (&) para montar a mensagem em
uma srie de declaraes. A constante VBNewLine inicia uma nova
linha (use-a duas vezes para inserir uma linha em branco). Eu tambm
uso o argumento title para exibir um ttulo diferente na caixa de mensagem. A Figura 15-4 mostra a caixa de mensagem que o Excel exibe
quando voc executa esse procedimento.
Exemplos anteriores usaram constantes (tais como vbYes e vbNo) para
o valor retornado de uma funo MsgBox. Alm destas duas constantes,
a Tabela 15-3 relaciona algumas outras.
E isso praticamente tudo o que voc precisa saber sobre a funo
MsgBox. Porm, use caixas de mensagem com cautela. Normalmente,
no h motivo para exibir caixas de mensagem sem objetivo. Por
exemplo, as pessoas tendem a ficar aborrecidas quando vm uma caixa
de mensagem diariamente, que diz, Bom dia, obrigado por carregar a
pasta de trabalho de Projeo Oramentria.
Figura 15-3:
Os botes
de argumento da
funo
MsgBox
determinam
o que
aparece na
caixa de
mensagem.
ExcelVBABokks.indb 240 15/02/2013 14:00:02
241 Captulo 15: Caixas de Dilogo Simples
Tabela 15-3 Constantes Usadas como Valores de Retorno da
Funo MsgBox
Constante Valor O Que Significa
vbOK 1 Usurio clicou OK
vbCancel 2 Usurio clicou Cancelar
vbAbort 3 Usurio clicou Anular
vbRetry 4 Usurio clicou Repetir
vbIgnore 5 Usurio clicou Ignorar
vbYes 6 Usurio clicou Sim
vbNo 7 Usurio clicou No
A Funo InputBox
A funo InputBox do VBA til para obter parte de uma informao do
usurio. Tal informao poderia ser um valor, uma string de texto ou
mesmo uma faixa de endereo. Essa uma boa alternativa para desenvolver uma UserForm, quando voc s precisar obter um valor.

Sintaxe InputBox
Eis uma verso simplificada da sintaxe para a funo InputBox:
InputBox(prompt[, title][, default])
A funo InputBox aceita os argumentos relacionados na Tabela 15-4.
Figura 15-4:
Esta caixa
de dilogo,
exibida pela
funo
MsgBox,
exibe um
ttulo, um
cone e dois
botes,
ExcelVBABokks.indb 241 15/02/2013 14:00:03
242 Parte IV: Como se Comunicar com Seus Usurios
Tabela 15-4 Argumentos da Funo InputBox
Argumento O Que Ele Significa
Aviso (Prompt) O texto exibido na caixa de entrada
Ttulo (Title) O texto exibido na barra de ttulo da caixa de entrada
(opcional)
Padro(Default)
O valor padro da entrada do usurio (opcional)
Um exemplo de InputBox
Eis um exemplo mostrando como voc pode usar a funo InputBox:
TheName = InputBox(Qual o seu nome?, saudaes)
Quando voc executa essa declarao VBA, o Excel exibe a caixa de
dilogo mostrada na Figura 15-5. Note que esse exemplo s usa os dois
primeiros argumentos e no fornece um valor padro. Quando o
usurio entra com um valor e clica OK, a rotina atribui o valor varivel TheName.
O seguinte exemplo usa o terceiro argumento e oferece um valor
padro. O valor padro o nome de usurio armazenado pelo Excel (a
propriedade UserName do objeto Application).
Sub GetName()
Dim DefName As String
Dim TheName As String
DefName = Application.UserName
TheName = InputBox(Qual o seu nome?, _
Saudaes, DefName)
End Sub
A caixa de entrada sempre exibe um boto Cancelar. Se o usurio clicar
em Cancelar, a funo InputBox retorna uma string vazia.
Figura 15-5:
A funo
InputBox
exibe esta
caixa de
dilogo.
ExcelVBABokks.indb 242 15/02/2013 14:00:03
Captulo 15: Caixas de Dilogo Simples 243
A funo InputBox do VBA sempre retorna uma string, portanto, se
voc precisa obter um valor, o seu cdigo precisar fazer alguma
verificao adicional. O seguinte exemplo usa a funo InputBox para
obter um nmero. Ele usa a funo IsNumeric ( numrico) para
verificar se a string um nmero. Se a string contiver um nmero, est
tudo bem. Se a entrada do usurio no puder interpretar como um
nmero, o cdigo exibe uma caixa de mensagem.
Sub GetName2AddSheet()
Dim Prompt As String
Dim Caption As String

Dim DefValue As Integer


Dim NumSheets As String
Prompt = Quantas planilhas voc deseja adicionar?
Caption = Diga-me...
DefValue = 1
NumSheets = InputBox(Prompt, Caption, DefValue)
If NumSheets = Then Exit Sub Canceled
If IsNumeric(NumSheets) Then
If NumSheets > 0 Then Sheets.Add _
Count:=NumSheets
Else
MsgBox Nmero invlido
End If
End Sub
A Figura 15-6 mostra a caixa de dilogo que esta rotina produz.
As informaes apresentadas nesta seo aplicam-se funo InputBox
do VBA. Alm disso, voc tem acesso ao mtodo InputBox, que um
mtodo do objeto Application.
Uma grande vantagem de usar o mtodo InputBox que seu cdigo
pode solicitar a seleo de uma faixa. Depois, o usurio pode selecionar
a faixa na planilha destacando as clulas. Eis um rpido exemplo que
solicita o usurio a selecionar uma faixa:
L
E
M
B
R
E
-SE
Figura 15-6:
Um outro
exemplo de
uso da
funo
InputBox.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 243 15/02/2013 14:00:04
244 Parte IV: Como se Comunicar com Seus Usurios
Sub GetRange()
Dim Rng As Range
On Error Resume Next
Set Rng = Application.InputBox _
(prompt:=Especifique uma faixa:, Type:=8)
If Rng Is Nothing Then Exit Sub
MsgBox Voc selecionou a faixa & Rng.Address

End Sub
Neste simples exemplo, o cdigo diz ao usurio o endereo da faixa que
foi selecionada. Na vida real, o seu cdigo poderia, de fato, fazer algo
til com a faixa selecionada.
O mtodo Application.InputBox semelhante funo InputBox do
VBA, mas tambm apresenta algumas diferenas. Para detalhes completos, clique o sistema de Ajuda.
O Mtodo GetOpenFilename
Se o seu procedimento VBA precisar pedir ao usurio um nome de
arquivo, voc poderia usar a funo InputBox. Geralmente, uma caixa
de entrada no a melhor ferramenta para esse trabalho, pelo fato de a
maioria dos usurios achar difcil lembrar caminhos, barras invertidas,
nomes de arquivos e extenses de arquivo. Em outras palavras, muito
mais fcil cometer um erro de digitao ao digitar um nome de arquivo.
Para uma melhor soluo desse problema, use o mtodo GetOpenFilename do objeto Application, o qual garante que o seu cdigo oferea
um nome de arquivo vlido, incluindo o seu caminho completo. O
mtodo GetOpenFilename exibe a conhecida caixa de dilogo Abrir
(igual caixa de dilogo que o Excel exibe quando voc escolhe
Arquivo Abrir.
Na verdade, o mtodo GetOpenFilename no abre o arquivo especificado. Esse mtodo apenas retorna o nome de arquivo selecionado pelo
usurio como uma string. Depois, voc pode escrever um cdigo para o
que quiser com o nome de arquivo.
A sintaxe para o mtodo GetOpenFilename
A sintaxe oficial para o mtodo GetOpenFilename como a seguir:
object.GetOpenFilename ([fileFilter], [filterIndex],
[title],[buttonText], [multiSelect])
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 244 15/02/2013 14:00:04
245 Captulo 15: Caixas de Dilogo Simples
O mtodo GetOpenFilename toma os argumentos opcionais mostrados
na Tabela 15-5.
Tabela 15-5 Argumentos do Mtodo GetOpenFilename
Argumento O que ele faz
FileFilter Determina os tipos de arquivos que aparecem na caixa de
dilogo (por exemplo, *.TXT). Voc pode especificar vrios
filtros diferentes a partir dos quais o usurio pode escolher.
FilterIndex Determina qual dos filtros a caixa de dilogo exibe por
padro.
Title Especifica a legenda para a barra de ttulo da caixa de dilogo.
ButtonText Ignorado (usado apenas para a verso Macintosh do Excel).
MultiSelect Se True, o usurio pode selecionar mltiplos arquivos.
Um exemplo de GetOpenFilename
O argumento FileFilter determina o que aparece na lista drop-down
quanto aos tipos de arquivo na caixa de dilogo. Esse argumento
consiste de pares de strings de filtro de arquivo seguidos pela especificao de filtro de arquivo curinga, com vrgulas separando cada parte.
Se omitido, esse argumento padroniza para o seguinte:
All Files (*.*), *.*
Observe que esta string consiste de duas partes:
All Files (*.*)
e
*.*

A primeira parte desta string consiste do texto exibido na lista drop-down


de tipos de arquivos. A segunda parte determina quais arquivos a caixa de
dilogo exibe. Por exemplo, *.* significa todos os arquivos.
O cdigo no exemplo a seguir adianta uma caixa de dilogo que pede
um nome de arquivo ao usurio. O procedimento define cinco filtros de
arquivo. Veja que eu uso a sequncia de continuao de linha do VBA
para configurar a varivel Filter; fazer isso ajuda a simplificar esse bem
complicado argumento.
ExcelVBABokks.indb 245 15/02/2013 14:00:05
246 Parte IV: Como se Comunicar com Seus Usurios
Sub GetImportFileName ()
Dim Finfo As String
Dim FilterIndex As Integer
Dim Title As String
Dim FileName As Variant
Set up list of file filters
Finfo = Text Files (*.txt),*.txt, & _
Lotus Files (*.prn),*.prn, & _
Comma Separated Files (*.csv),*.csv, & _
ASCII Files (*.asc),*.asc, & _
All Files (*.*),*.*
Display *.* by default
FilterIndex = 5
Set the dialog box caption
Title = Selecione um arquivo para importar
Get the filename
FileName = Application.GetOpenFilename (Finfo, _
FilterIndex, Title)
Handle return info from dialog box
If FileName = False Then
MsgBox Nenhum arquivo foi selecionado.
Else
MsgBox Voc selecionou & FileName
End If
End Sub
A Figura 15-7 mostra a caixa de dilogo que o Excel exibe quando voc
executa este procedimento. Em um aplicativo real, voc poderia fazer
algo mais significativo com o nome de arquivo. Por exemplo, voc poderia querer abri-lo usando uma declarao como esta:
Workbooks.Open FileName
Observe que a varivel FileName declarada como um tipo de dados
Variant. Se o usurio clicar em Cancelar, essa varivel armazena um valor
Booleano (Falso). Caso contrrio, FileName uma string. Portanto, usar
um tipo de dados Variant lida com ambas as possibilidades.
A propsito, a caixa de dilogo pode parecer diferente, dependendo de
qual verso de Windows voc usa.
P
A
P
O
D
E
E
S
P
E
C
IALIS

T
A
ExcelVBABokks.indb 246 15/02/2013 14:00:05
247 Captulo 15: Caixas de Dilogo Simples
Selecionando mltiplos arquivos
Se o argumento MultiSelect para o mtodo GetOpenFilename for True, o
usurio pode selecionar mltiplos arquivos na caixa de dilogo, pressionando Ctrl enquanto clica nos arquivos. Nesse caso, o mtodo
GetOpenFilename retorna um array de nomes de arquivos. O seu cdigo
deve fazer um loop atravs do array para identificar cada nome de
arquivo selecionado, como demonstra o seguinte exemplo:
Sub GetImportFileName2()
Dim FileNames As Variant
Dim Msg As String
Dim I As Integer
FileNames = Application.GetOpenFilename _
(MultiSelect:=True)
If IsArray(FileNames) Then

Mostrar o caminho completo e o nome dos arquivos


Msg = Voc selecionou: & vbNewLine
For I = LBound(FileNames) To _
Ubound(FileNames)
Msg = Msg & FileNames(i) & vbNewLine
Next i
MsgBox Msg
Else

Boto de cancelar clicado


MsgBox Nenhum arquivo foi selecionado.
End If
End Sub
Figura 15-7:
O mtodo
GetOpenFilename
exibe uma
caixa de
dilogo
personalizada e retorna
o caminho e
o nome do
arquivo
selecionado.
Ele no abre
o arquivo.
ExcelVBABokks.indb 247 15/02/2013 14:00:06
248 Parte IV: Como se Comunicar com Seus Usurios
A Figura 15-8 mostra o resultado ao rodar este procedimento. A caixa
de mensagem exibe os nomes de arquivo que foram selecionados:
Observe que usei um argumento nomeado para o mtodo GetOpenFilename. Tambm, configurei o argumento MultiSelect (Seleo mltipla)
para True. Os outros argumentos so omitidos, portanto eles tomam
seus valores padro. Usar argumentos nomeados elimina a necessidade
de especificar argumentos que no so usados.
A varivel FileNames definida como um tipo de dados Variant. Eu uso
a funo IsArray para determinar se FileName contm um array. Se
assim for, o cdigo usa as funes Lbound e UBound do VBA para determinar os limites mais baixos e mais altos do array e monta uma mensagem que consiste de cada elemento de array. Se a varivel FileNames
no for um array, significa que o usurio clicou no boto Cancelar (a

varivel FileNames contm um array, mesmo que apenas um arquivo


seja selecionado).
O Mtodo GetSaveAsFileName
O mtodo GetSaveAsFilename do Excel funciona exatamente como o
mtodo GetOpenFilename, mas ele exibe a caixa de dilogo Salvar
Como do Excel, ao invs de sua caixa de dilogo Abrir. O mtodo
GetSaveAsFilename obtm um caminho e nome de arquivo do usurio,
mas no faz nada com isso. voc que escreve o cdigo que, de fato,
salva o arquivo.
A sintaxe para esse mtodo apresentada a seguir:
object.GetSaveAsFilename ([InitialFilename], [FileFilter],
[FilterIndex], [title], [ButtonText])
O mtodo GetSaveAsFilename toma os argumentos da Tabela 15-6,
todos os quais so opcionais.
Figura 15-8:
Selecione
mltiplos
nomes de
arquivos
usando o
mtodo
GetOpenFilename.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 248 15/02/2013 14:00:06
249 Captulo 15: Caixas de Dilogo Simples
Tabela 15-6 Argumentos do Mtodo GetSaveAsFilename
Argumento O Que Ele Faz
InitialFileName Especifica um nome de arquivo padro que aparece na caixa
(de dilogo) FileName.
FileFilter Determina os tipos de arquivos que o Excel exibe na caixa de
dilogo (por exemplo, *.TXT). Voc pode especificar vrios
filtros diferentes a partir dos quais o usurio pode escolher.
FilterIndex Determina qual dos filtros de arquivo o Excel exibe por padro.
Title Define uma legenda para a barra de ttulo da caixa de dilogo.
Como Obter um Nome de Pasta
s vezes, voc no precisa obter um nome de arquivo, s precisa de um
nome de pasta. Se esse for o caso, o objeto FileDialog exatamente o
que o mdico recomendou.
O seguinte procedimento exibe uma caixa de dilogo que permite ao
usurio selecionar um diretrio. O nome do diretrio selecionado (ou
Cancelado) ento exibido, usando a funo MsgBox.
Sub GetAFolder()
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & \

.Title = Please select a location for the backup


.Show
If .SelectedItems.Count = 0 then
MsgBox Cancelado
Else
MsgBox .SelectedItems(1)
End If
End With
End Sub
O objeto FileDialog permite que voc especifique o diretrio de incio,
especificando um valor para a propriedade InitialFileName. Neste caso, o
cdigo usa o caminho de arquivo padro do Excel como o diretrio inicial.
ExcelVBABokks.indb 249 15/02/2013 14:00:07
250 Parte IV: Como se Comunicar com Seus Usurios
Exibindo as Caixas de Dilogo
Integradas do Excel
Uma maneira de ver um VBA que ele uma ferramente que permite
imitar os comandos do Excel. Por exemplo, veja esta declarao VBA:
Range(A1:A12).Name = MonthNames
Executar essa declarao VBA tem o mesmo efeito que escolher
FrmulasNomes DefinidosDefinir Nome para exibir a caixa de
dilogo Novo Nome, e depois, digitar MonthNames na caixa Nome e
A1:A12 na caixa Refere-se a clicar OK.
Quando voc executa a declarao VBA, a caixa de dilogo Novo Nome
no aparece. Quase sempre isso que voc quer que acontea: voc
no quer caixas de dilogo passando na tela enquanto a sua macro
executa.
No entanto, em alguns casos voc pode querer que o seu cdigo exiba
uma das caixas de dilogo integradas do Excel e permita ao usurio
fazer escolhas. Isso pode ser feito usando VBA para executar um
comando da faixa de opes. Eis um exemplo que exibe a caixa de
dilogo Novo Nome (veja a Figura 15-9).
Application.CommandBars.ExecuteMso (NameDefine)
O seu cdigo VBA no pode obter quaisquer informaes da caixa de
dilogo. Por exemplo, se voc executar o cdigo para exibir a caixa de
dilogo Novo Nome, o seu cdigo no pode obter o nome fornecido
pelo usurio, ou a faixa em que ele foi nomeado.
O ExecuteMso um mtodo do objeto CommandBars e aceita um
argumento, um parmetro idMso, que representa um controle da faixa
de opes. Infelizmente, esses parmetros no esto relacionados no
L
E
M
B
R
E
-SE
Figura 15-9:
Exibindo
uma das
caixas de
dilogo do
Excel
usando VBA.
ExcelVBABokks.indb 250 15/02/2013 14:00:07
251 Captulo 15: Caixas de Dilogo Simples
sistema de ajuda. O cdigo que usa o mtodo ExecuteMso no
compatvel com verses anteriores ao Excel 2007.
Voc pode fazer o download de um arquivo a partir do Web site deste
livro, que relaciona todos os nomes de parmetro de comando da faixa

de opes do Excel.
Eis um outro exemplo de usar o mtodo ExecuteMso. Esta declarao,
quando executada, exibe a guia Fonte da caixa de dilogo Formatar Clulas:
Application.CommandBars.ExecuteMso(FormatCellsFontDialog)
Se voc tentar exibir uma caixa de dilogo integrada em um contexto
errado, o Excel exibe uma mensagem de erro. Por exemplo, eis uma declarao que exibe a caixa de dilogo Formatar Nmero:
Application.commandBars.ExecuteMso (NumberFormatsDialog)
Se voc executar esta declarao quando ela no for apropriada (por
exemplo, uma Shape estiver selecionada), o Excel exibe uma mensagem de erro, pois aquela caixa de dilogo s adequada s clulas
de planilha.
ExcelVBABokks.indb 251 15/02/2013 14:00:08
252 Parte IV: Como se Comunicar com Seus Usurios
ExcelVBABokks.indb 252 15/02/2013 14:00:08
U
m UserForm til se a sua macro VBA precisar obter informaes de um usurio. Por exemplo, a sua macro pode ter algumas opes que podem ser especi cadas em um UserForm. Se forem
necessrias apenas algumas partes de informaes (por exemplo, uma
resposta Sim/No ou uma string de texto), uma das tcnicas descritas
no Captulo 15 pode fazer o trabalho. Porm, se voc precisar de mais
informaes, deve criar um UserForm. Neste captulo, eu o apresento
aos UserForms. Voc car feliz em conhec-los.
Como Saber Quando Usar um UserForm
Esta seo descreve uma situao onde um UserForm til. A seguinte
macro muda o texto em cada clula na seleo para letras maisculas.
Isso feito usando a funo UCase (Uppercase Letras maisculas)
integrada do VBA.
Sub ChangeCase ()
Dim WorkRange As Range
Sai se a faixa no foi selecionada
If TypeName(Selection) <> Range Then Exit Sub
Processa apenas clulas de texto, sem frmulas
On error Resume Next
Set WorkRange = Selection.SpecialCells _
(xlCellTypeConstants, xlCellTypeConstants)
For Each cell In WorkRange
cell.Value = Ucase(cell.Value)
Next cell
End Sub


Neste Captulo
Descobrindo quando usar UserForms
Como entender objetos UserForm
Exibindo UserForm
Como criar um Userform que funcione com uma macro til
Princpios Bsicos
de UserForm
Captulo 16
ExcelVBABokks.indb 253 15/02/2013 14:00:08
Parte IV: Como se Comunicar com Seus Usurios
254
Voc pode tornar essa macro ainda mais til. Por exemplo, seria
interessante se a macro tambm pudesse alterar o texto nas clulas
para minsculas ou para o tipo apropriado (colocando em maiscula a
primeira letra de cada palavra). Uma abordagem criar duas macros
adicionais uma para letras minsculas e uma para maisculas. Outra
abordagem modificar a macro para lidar com outras opes. Se voc

usar a segunda abordagem, precisa de algum mtodo para perguntar ao


usurio qual tipo de alterao fazer s clulas.
A soluo exibir uma caixa de dilogo como a mostrada na Figura
16-1. Voc cria esta caixa de dilogo em um UserForm no VBE e a exibe,
usando uma macro VBA. Na prxima seo, ofereo instrues passo a
passo para criar esta caixa de dilogo. Antes de me aprofundar, preparo
o palco com algum material introdutrio.
Em VBA, o nome oficial de uma caixa de dilogo UserForm. Porm, uma
UserForm , na verdade, um objeto que contm o que normalmente
conhecido como uma caixa de dilogo. Esta distino no importante,
portanto, eu costumo usar esses termos alternadamente.
Criando UserForms: Uma Viso Geral
Para criar um UserForm, normalmente voc segue as seguintes
etapas gerais:
1. Determine como a caixa de dilogo ser usada e onde ela ser
exibida em sua macro VBA.
2. Pressione Alt+F11 para ativar o VBE e insira um novo objeto
UserForm.
Um objeto UserForm contm um nico UserForm.
3. Acrescente controles ao UserForm.
Os controles incluem itens tais como caixas de texto, botes,
caixas de verificao e caixas de listas.
Figura 16-1:
Voc pode
obter
informaes
do usurio,
exibindo um
UserForm.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 254 15/02/2013 14:00:09
255
Captulo 16: Princpios Bsicos de UserForm
4. Use a janela Propriedades para modificar as propriedades para
os controles ou para o prprio UserForm.
5. Escreva procedimentos que lidam com eventos para os controles (por exemplo, uma macro que execute quando o usurio
clicar um boto na caixa de dilogo).
Esses procedimentos so armazenados na janela de cdigo para o
objeto UserForm.
6. Escreva um procedimento (armazenado em um mdulo VBA)
que exiba a caixa de dilogo ao usurio.
No se preocupe se algumas dessas etapas parecem estranhas. Eu dou
mais detalhes nas sees seguintes, juntamente com instrues passo a
passo para criar um UserForm.

Quando voc est projetando um UserForm, est criando o que os


desenvolvedores chamam de Graphical User Interface (GUI Interface
Grfica de Usurio) em seu aplicativo. Use algum tempo para pensar em
como o seu formulrio deve se parecer e como os seus usurios podem
querer interagir com os elementos no UserForm. Tente gui-los atravs
das etapas que eles precisam tomar no formulrio, considerando cuidadosamente a organizao e as palavras dos controles. Como a maioria das
coisas relacionadas ao VBA, quanto mais voc fizer, mais fcil ser.
Trabalhando com UserForms
Cada caixa de dilogo que voc cria armazenada em seu prprio
objeto UserForm uma caixa de dilogo UserForm. Voc cria e acessa
esses UserForms no Visual Basic Editor.
Inserindo um novo UserForm
Insira um novo objeto UserForm com as seguintes etapas:
1. Ative o VBE, pressionando Alt+F11.
2. Selecione a pasta de trabalho na janela de projeto.
3. Escolha Inserir UserForm.
O VBE insere um novo objeto UserForm, o qual contm uma caixa
de dilogo vazia.
A Figura 16-2 exibe um UserForm uma caixa de dilogo vazia, precisando de alguns controles.
ExcelVBABokks.indb 255 15/02/2013 14:00:09
Parte IV: Como se Comunicar com Seus Usurios 256
Adicionando controles a um UserForm
Quando voc ativa um UserForm, o VBE exibe a Caixa de ferramentas em
uma janela flutuante, conforme mostrado na Figura 16-2. Voc usa as
ferramentas na Caixa de ferramentas para acrescentar controles ao seu
UserForm. Se a Caixa de ferramentas no aparecer quando o seu UserForm
for ativado, escolha ExibirCaixa de ferramentas.
Para acrescentar um controle, basta clicar o controle desejado na Caixa
de ferramentas e arrast-lo para a caixa de dilogo, para criar o controle. Depois de ter adicionado um controle, voc pode mov-lo e redimension-lo, usando as tcnicas padro.
A Tabela 16-1 indica as vrias ferramentas, assim como suas funes.
Para determinar qual cada ferramenta, passe o cursor do seu mouse
sobre o controle e leia a pequena descrio pop-up.
Tabela 16-1 Controles de Caixa de Ferramentas
Controle O Que Ele Faz
Rtulo Exibe texto.
Caixa de texto Permite ao usurio inserir texto.
Caixa combinaes Exibe uma listagem drop-down
Caixa de listagem Exibe uma lista de itens.
Caixa de seleo til para opes on/off ou sim/no.
Boto de opo Usado em grupos; permite ao usurio selecionar uma
entre vrias opes.
Boto de ativao Um boto que est ativado (on) ou desativado (off)
Quadro Um continer para outros controles.
Figura 16-2:
Um novo
objeto
UserForm.
ExcelVBABokks.indb 256 15/02/2013 14:00:09
257 Captulo 16: Princpios Bsicos de UserForm
Controle O que ele faz
Boto de comando Um boto clicvel
TabStrip Exibe tabs guias.
Multi-pgina Um continer tabulado para outros objetos.
Barra de rolagem Uma barra que pode ser rolada.
Boto de rotao Um boto clicvel usado com frequncia para muda
um valor).

Imagem Contm uma imagem.


RefEdit Permite ao usurio selecionar uma faixa.
Mudando propriedades em um controle UserForm
Cada controle que voc acrescenta a um UserForm tem uma quantidade
de propriedades que determina como o controle se parece e se comporta. Alm disso, o prprio UserForm tem o seu conjunto de propriedades. Voc pode mudar essas propriedades com a janela Propriedades. A
Figura 16-3 mostra a janela de propriedades quando um controle Boto
de comandos selecionado.
A janela Propriedades aparece quando voc pressiona F4, e as propriedades mostradas nessa janela dependem do que est selecionado. Se
voc selecionar um controle diferente, as propriedades mudam para
aqueles apropriados quele controle. Para ocultar a janela Propriedades, clique no boto Fechar em sua barra de ttulo.
Figura
16-3: Use
as janelas
Propriedades para
mudar as
propriedades dos
controles
de
UserForm.
ExcelVBABokks.indb 257 15/02/2013 14:00:09
Parte IV: Como se Comunicar com Seus Usurios 258
As propriedades para os controles incluem o seguinte:
5 Nome
5 Largura
5 Altura
5 Valor
5 Legenda
Cada controle tem o seu prprio conjunto de propriedades (embora
muitos controles tenham algumas propriedades em comum). Para
mudar uma propriedade usando a janela Propriedades:
1. Assegure-se de que o controle certo esteja selecionado no
UserForm.
2. Assegure-se de que a janela Propriedades esteja visvel (se no
estiver, pressione F4).
3. Na janela Propriedades, clique na propriedade que deseja
alterar.
4. Faa a alterao na parte certa da janela Propriedades.
Se voc selecionar o prprio UserForm (no um controle no UserForm),
pode usar a janela Propriedades para ajustar as propriedades do UserForm.
O Captulo 17 informa tudo o que voc precisa saber sobre trabalhar
com controles de caixa de dilogo.
Algumas das propriedades de UserForm servem como configuraes
padro para os novos controles que voc arrasta para dentro do
UserForm. Por exemplo, se voc mudar a propriedade Font em um
UserForm, os controles que voc acrescentar usaro aquela mesma
fonte. Controles que j esto no UserForm no so alterados.
Observando a janela de Cdigo de UserForm
Cada objeto UserForm tem um mdulo de cdigo que contm o cdigo
VBA (os procedimentos que lidam com eventos) que executado
quando o usurio trabalhar com a caixa de dilogo. Para ver o mdulo
de cdigo, pressione F7. A janela de cdigo fica vazia at que voc
adicione alguns procedimentos. Pressione Shift+F7 para retornar caixa
de dilogo.
Eis outra maneira de alternar entre a janela de cdigo e a exibio de

UserForm: Use os botes Exibir Cdigo e Exibir Objeto na barra de


ttulo da janela de projeto. Ou clique com o boto direito no UserForm e
escolha View Code. Se voc estiver vendo o cdigo, clique duas vezes
no nome UserForm na janela de projeto para voltar ao UserForm.
D
I
C
A
ExcelVBABokks.indb 258 15/02/2013 14:00:09
Captulo 16: Princpios Bsicos de UserForm 259
Exibindo um UserForm
Voc exibe um UserForm usando o mtodo Show do UserForm em um
procedimento VBA.
A macro que exibe a caixa de dilogo deve estar em um mdulo VBA
no na janela de cdigo no UserForm.
O seguinte procedimento exibe a caixa de dilogo chamada UserForm1:
Sub ShowDialog()
UserForm1.Show
Outras declaraes entram aqui
End Sub
Quando o Excel exibe a caixa de dilogo, a macro ShowDialog interrompida, at o usurio fechar a caixa de dilogo. Depois, o VBA executa
quaisquer declaraes restantes no procedimento. Na maior parte do
tempo, voc no tem mais cdigo no procedimento. Como ver mais
adiante, voc coloca os seus procedimentos de lidar com eventos na
janela de cdigo para o UserForm.
Usando informaes de um UserForm
O VBE oferece um nome para cada controle que voc acrescenta a um
UserForm. O nome do controle corresponde sua propriedade Name.
Use esse nome para se referir a um controle em especial em seu cdigo.
Por exemplo, se voc acrescentar um controle CheckBox (Caixa de
Verificao) a um UserForm nomeado como UserForm1, por padro, o
controle CheckBox nomeado CheckBox1. A seguinte declarao faz
esse controle aparecer com uma marca de verificao:
UserForm1.CheckBox1.Value = True
Na maior parte do tempo, voc escreve o cdigo para um UserForm no
mdulo de cdigo do UserForm. Se esse for o caso, voc pode omitir o
objeto qualificador de UserForm e escrever a declarao assim:
CheckBox1.Value = True
O seu cdigo VBA tambm pode verificar vrias propriedades dos
controles e executar as aes apropriadas. A seguinte declarao executa
uma macro nomeada PrintReport se a caixa de verificao (nomeada
como CheckBox1) estiver marcada:
If CheckBox1.Value = True Then Call PrintReport
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 259 15/02/2013 14:00:10
Parte IV: Como se Comunicar com Seus Usurios 260
Eu discuto este tpico em detalhes no Captulo 17.
Eu recomendo que voc mude o nome padro que o VBE d aos seus
controles, para algo mais significativo. Voc poderia pensar em nomear
a caixa de verificao descrita acima como cbxPrintReport. Veja que
eu precedi o nome com um prefixo de trs letras (para checkbox - caixa de verificao), indicando o tipo de controle. uma questo de
gosto se voc pensa que fazer isso uma boa prtica.

Um Exemplo de UserForm
O exemplo de UserForm desta seo uma verso ampliada da macro
ChangeCase do incio do captulo. Lembre-se de que a verso original
dessa macro muda o texto nas clulas selecionadas para letras maisculas. Esta verso modificada usa um UserForm para perguntar ao
usurio qual tipo de alterao fazer: letras maisculas, letras minsculas ou as primeiras em maiscula.
Essa caixa de dilogo precisa obter algumas informaes do usurio: o
tipo de mudana a fazer no texto. Porque o usurio tem trs escolhas, a
sua melhor aposta a caixa de dilogo, com trs controles Boto de
Opo. A caixa de dilogo tambm precisa de mais dois botes: um
boto OK e um boto Cancelar. Clicar no boto OK roda o cdigo que
executa o trabalho. Clicar no boto Cancel leva a macro a terminar, sem
fazer qualquer coisa.
Esta pasta de trabalho est disponvel no site do livro. No entanto, voc
consegue mais desse exerccio se seguir as etapas fornecidas aqui e
cri-lo, voc mesmo.
Criando o UserForm
Estas etapas criam o UserForm. Comece com uma pasta de trabalho vazia.
1. Pressione Alt+F11 para ativar o VBE.
2. Se mltiplos projetos estiverem na janela de projeto, selecione
aquele que corresponde pasta de trabalho que voc estiver
usando.
3. Escolha (Inserir UserForm).
O VBE insere um novo objeto UserForm com uma caixa de
dilogo vazia.
4. Pressione F4 para exibir a janela Propriedades.
5. Na janela Propriedades, mude a propriedade Caption para
Change Case.
6. A caixa de dilogo um pouco grande, assim voc pode usar as
alas de dimensionamento direita e embaixo para diminu-la.
A etapa 6 tambm pode ser feita depois que voc posicionar todos
os controles na caixa de dilogo.
D
I
C
A
ExcelVBABokks.indb 260 15/02/2013 14:00:10
Captulo 16: Princpios Bsicos de UserForm 261
Adicionando os Botes de comando
Pronto para acrescentar dois Botes de comando OK e Cancelar
caixa de dilogo? Me acompanhe:
1. Assegure-se de que a Caixa de Ferramentas esteja exibida. Se
no estiver, escolha Exibir Caixa de Ferramentas.
2. Se a janela Propriedades no estiver visvel, pressione F4 para
exibi-la.
3. Na Caixa de Ferramentas, arraste um Boto de comando para a
caixa de dilogo, para criar um boto.
Como voc pode ver na caixa Propriedades, o boto tem um nome
padro e legenda: CommandButton1.
4. Assegure-se de que o Boto de comando esteja selecionado.
Depois, ative a janela Propriedades e mude as seguintes propriedades:
Propriedade Mudar para
Name OKButton
Caption OK
Default True
5. Acrescente um segundo objeto Boto de Comando ao UserForm
e mude as seguintes propriedades:

Propriedade Mudar para


Name CancelButton
Caption Cancelar
Cancel True
6. Ajuste o tamanho e a posio dos controles, para que a sua caixa
de dilogo se parea um pouco com a Figura 16-4.
Figura 16-4:
O UserForm
com dois
controles
Boto de
comando.
ExcelVBABokks.indb 261 15/02/2013 14:00:10
Parte IV: Como se Comunicar com Seus Usurios 262
Adicionando os Botes de opo
Nesta seo, voc acrescenta trs Botes de opo caixa de dilogo.
Antes de acrescentar os Botes de opo, adicione um objeto Frame que
contm os botes de opo. Um Frame no necessrio, mas faz com que
a caixa de dilogo parea mais profissional.
1. Na Caixa de Ferramentas, clique na ferramenta Quadro e
arraste-o para a caixa de dilogo.
Esta etapa cria uma moldura para conter os botes de opo.
2. Use a janela Propriedades para mudar a legenda do quadro para
Options.
3. Na Caixa de Ferramentas, clique na ferramenta Boto de opo
e arraste-a para a caixa de dilogo (dentro da moldura).
Fazer isso cria um controle Boto de opo.
4. Selecione o Boto de opo e use a janela Propriedades para
mudar as seguintes propriedades:
Propriedade Mudar para
Name Option/User
Caption Letras Maisculas
Accelerator U
Value True
Configurar a propriedade Value para True torna esse Boto de
Opo o padro.
5. Adicione outro Boto de opo e use a janela Propriedades para
alterar as seguintes propriedades:
Propriedade Mudar para
Name OptionLower
Caption Letras Minsculas
Accelerator L
6. Acrescente um terceiro Boto de opo e use a janela Propriedades para mudar as seguintes propriedades:
Propriedade Mudar para
Name OptionProper
Caption Iniciais Maisculas
Accelerator P
7. Ajuste o tamanho e a posio dos botes, do quadra da caixa
de dilogo.
O seu UserForm deve se parecer mais ou menos como a Figura 16-5.
ExcelVBABokks.indb 262 15/02/2013 14:00:10
Captulo 16: Princpios Bsicos de UserForm 263
Se voc quisesse dar uma espiada para ver como se parece o UserForm
quando ele estiver exibido, pressione F5. Nenhum dos controles est
funcionando ainda, portanto, voc precisa clicar o X vermelho na
barra de ttulo para fechar a caixa de dilogo.
A propriedade Accelerator determina qual letra na legenda sublinhada mais importante, ela determina qual combinao Alt-tecla seleciona aquele controle. Por exemplo, voc pode selecionar a opo Lower

Case (Letra Minscula) pressionando Alt+L, pois o L est sublinhado.


As teclas de Accelerator so opcionais, porm alguns usurios preferem
usar o teclado para navegar pelas caixas de dilogo.
Voc pode estar imaginando porque os botes de opo tm teclas de
acelerao, mas no os Botes de Comando. Normalmente, os botes OK e
cancelar nunca tm teclas de acelerao, porque eles podem ser acessados a partir do teclado. Pressionar Enter equivalente a clicar OK, pois a
propriedade Default do controle True. Pressionar Esc equivalente a
clicar em Cancelar, pois a propriedade em Cancel do controle True.
Adicionando procedimentos que lidam com
eventos
Chegou a hora do UserForm, de fato, fazer alguma coisa. Eis como acrescentar um procedimento que lida com eventos aos botes Cancelar e OK:
1. Clique duas vezes no boto Cancelar.
O VBE ativa a janela de cdigo do UserForm e insere um procedimento vazio:
Private Sub CancelButton_Click()
O procedimento chamado CancelButton_Click executado quando
o boto clicado, mas s quando a caixa de dilogo exibida. Em
outras palavras, clicar o boto Cancelar quando voc estiver
projetando a caixa de dilogo no executa o procedimento. Pelo
Figura 16-5:
Este o
Userform
depois do
acrscimo
dos trs
Botes de
opes dentro de um
quadro.
ExcelVBABokks.indb 263 15/02/2013 14:00:10
Parte IV: Como se Comunicar com Seus Usurios 264
fato de a propriedade Cancel do boto Cancelar estar configurada
para True, pressionar Esc tambm dispara o procedimento
CancelButton_Click.
2. Insira a seguinte declarao dentro do procedimento (antes da
declarao End Sub):
Unload UserForm1
Esta declarao fecha o UserForm (e o remove da memria)
quando o boto Cancelar clicado.
3. Pressione Shift+F7 para voltar ao UserForm.
4. Clique duas vezes no boto OK.
O VBE ativa a janela de cdigo para o UserForm e insere um
procedimento Sub chamado
Private Sub OKButton_Click
Quando o UserForm exibido, clicar OK executa esse procedimento. Porque esse boto tem a sua propriedade Default (Padro)
configurada para True, pressionar Enter tambm executa o
procedimento OKButton_Click.
5. Entre com o seguinte cdigo dentro do procedimento:
Private Sub OKButton_Click()
Dim WorkRange As Range
Processa apenas clulas com texto, sem frmulas
On Error Resume Next
Set WorkRange = Selection.SpecialCells _
(xlCellTypeConstants, xlCellTypeConstants)
Letras Maisculas
If OptionUpper Then
For Each cell In WorkRange

cell.Value = Ucase(cell.Value)
Next cell
End If
Letras Minsculas
If OptionLower Then
For Each cell In WorkRange
cell.Value = Lcase(cell.Value)
Next cell
End If
Iniciais Maisculas
If OptionProper Then
For Each cell In WorkRange
cell.Value = Application. _
WorksheetFunction.Proper(cell.Value)
ExcelVBABokks.indb 264 15/02/2013 14:00:10
265 Captulo 16: Princpios Bsicos de UserForm
Next cell
End If
Unload UserForm1
End Sub
O cdigo anterior uma verso ampliada da macro ChangeCase original
que apresentei no incio do captulo. A macro consiste de trs blocos de
cdigo separados. Este cdigo usa trs estruturas If-Then; cada uma
tem um loop For Each. Apenas um bloco executado, determinado pelo
boto de opo que o usurio selecionar. A ltima declarao (unloads)
fecha a caixa de dilogo depois do trabalho concludo.
Aqui, h alguma coisa meio estranha. Observe que o VBA tem uma
funo UCase e uma funo LCase, mas no tem uma funo para
converter texto para as primeiras letras em maiscula. Portanto, eu uso
a funo de planilha PROPER do Excel (precedida pela Application.
WorksheetFunction) para a converso s primeiras letras em maiscula. Uma outra opo usar a funo VBA StrConv (para detalhes, veja o
sistema de Ajuda). A funo StrConv no est disponvel em todas as
verses do Excel, assim, eu uso a funo de planilha PROPER.
Criando uma macro para exibir a caixa de dilogo
Estamos quase terminando com este projeto. A nica coisa faltando
uma maneira de exibir a caixa de dilogo. Siga estas etapas para
executar o procedimento que faz a caixa de dilogo aparecer:
1. Na janela do VBE, escolha Inserir Mdulo.
O VBE adiciona um mdulo VBA vazio (chamado Mdulo1) ao projeto.
2. Entre com o seguinte cdigo:
Sub ChanceCase()
If TypeName(Selection) = Range Then
UserForm1.Show
Else
MsgBox Selecione uma faixa., vbCritical
End If
End Sub
Este procedimento simples. Ele permite se certificar de que uma faixa
foi selecionada. Se estiver, a caixa de dilogo exibida (usando o
mtodo Show). Depois, o usurio interage com a caixa de dilogo e o
cdigo armazenado no UserForm executado. Se uma faixa no foi
selecionada, o usurio v uma MsgBox com o texto Selecione uma faixa.
ExcelVBABokks.indb 265 15/02/2013 14:00:10
Parte IV: Como se Comunicar com Seus Usurios 266
Como disponibilizar a macro
Nesse ponto, tudo deveria estar funcionando adequadamente. Mas voc
ainda precisa de uma maneira fcil para executar a macro. Atribua uma
tecla de atalho (Ctrl+Shift+C) que executa a macro ChangeCase:
1. Ative a janela do Excel atravs de Alt+F11.

2. Escolha Desenvolvedor Cdigo Macros ou pressione Alt+F8.


3. Na caixa de dilogo Macros, selecione a macro ChangeCase.
4. Clique no boto Opes.
O Excel exibe a caixa de dilogo Opes de macro.
5. Entre com a letra maiscula C como tecla de atalho.
Veja a Figura 16-6.
6. Entre com uma descrio da macro no campo Descrio.
7. Clique OK.
8. Clique em Cancelar quando voltar para a caixa de dilogo
Macro.
Depois de efetuar esta operao, pressionar Ctrl+Shift+C executa a macro
ChangeCase, a qual exibe o UserForm se uma faixa estiver selecionada.
Tambm possvel disponibilizar essa macro a partir da barra de
Ferramentas de Acesso Rpido. Clique com o boto direito na barra de
Ferramentas de Acesso Rpido e escolha Personalizar a Barra de
Ferramentas de Acesso Rpido. A caixa de dilogo Opes do Excel
aparece, e voc encontrar a macro ChangeCase relacionada em
Macros (veja a Figura 16-7). Adicionar uma macro sua barra de
ferramentas Quick Access funciona muito melhor no Excel 2010. Se a
pasta de trabalho que contm a macro no estiver aberta, o Excel 2010
a abre e roda a macro. No Excel 2007, voc recebe um erro se a pasta de
trabalho no estiver aberta.
Figura 16-6:
Atribua uma
tecla de
atalho para
executar a
macro
ChangeCase.
ExcelVBABokks.indb 266 15/02/2013 14:00:11
Captulo 16: Princpios Bsicos de UserForm 267
Testando a macro
Finalmente, voc precisa testar a macro e a caixa de dilogo, para ter
certeza de que elas esto funcionando adequadamente:
1. Ative uma planilha (qualquer planilha em qualquer pasta de
trabalho).
2. Selecione algumas clulas que contenham texto.
3. Pressione Ctrl+Shift+C.
O UserForm aparece. A Figura 16-8 mostra a sua aparncia.
4. Faa a sua escolha e clique OK.
Se voc fez tudo certo, a macro faz a mudana especificada ao
texto nas clulas selecionadas.
Figura 16-7:
Adicionando a macro
ChangeCase barra
de ferramentas de
acesso
rpido.
Figura 16-8:
O UserForm
est em
ao.
ExcelVBABokks.indb 267 15/02/2013 14:00:11
Parte IV: Como se Comunicar com Seus Usurios 268
A Figura 16-9 mostra a planilha depois de converter o texto para
maisculas. Observe que as frmulas na clula B15 e a data na clula

B16 no foram alteradas. Como voc se lembra, a macro s trabalha


com clulas que contenha texto.
Desde que a pasta de trabalho esteja aberta, voc pode executar a
macro a partir de qualquer outra pasta de trabalho. Se fechar a pasta
de trabalho que contm a sua macro, Ctrl+Shift+C no tem mais qualquer funo.
Se a macro no funcionar adequadamente, clique duas vezes as etapas
anteriores para localizar e corrigir o erro. No se preocupe: a depurao uma parte normal de desenvolver macros. Como um ltimo
recurso, faa o download da pasta de trabalho concluda, a partir do
site deste livro e tente descobrir o que saiu errado.
Figura 16-9:
O texto foi
convertido
para
maisculas.
ExcelVBABokks.indb 268 15/02/2013 14:00:11


Neste Captulo
Como entender cada tipo de controle da caixa de dilogo
Mudando as propriedades de cada controle
Trabalhando com controles da caixa de dilogo
Usando os Controles
de UserForm
Captulo 17
U
m usurio responde a uma caixa de dilogo personalizada (tambm conhecida como UserForm), usando os vrios controles
(botes, caixas de edio, botes de edio e assim por diante) que a
caixa de dilogo contm. Depois, o seu cdigo VBA utiliza essas respostas para determinar quais aes tomar. Voc tem muitos controles sua
disposio e este captulo fala sobre eles.
Se voc trabalhou no exemplo do Captulo 16, j tem alguma experincia com os controles de UserForm. Este captulo preenche as lacunas.
Comeando com os Controles da Caixa de Dilogo
Nesta seo, falo como acrescentar controles a um UserForm, dar a eles
nomes significativos e ajustar algumas de suas propriedades.
Antes de poder fazer qualquer dessas coisas, voc deve ter um UserForm, que obtido escolhendo Inserir
UserForm no VBE. Quando voc
acrescentar um UserForm, assegure-se de que o projeto certo foi selecionado na janela de projeto (se mais de um projeto estiver disponvel).
Adicionando controles
Estranhamente, o VBE no tem um menu de comandos que permite
adicionar controles a uma caixa de dilogo. Voc deve usar a Caixa de
Ferramentas flutuante, que descrevi no Captulo 16, para acrescentar
controles. Normalmente, a Caixa de Ferramentas aparece automaticamente quando voc ativa um UserForm no VBE. Se isso no acontecer,
voc pode exibir a Caixa de Ferramentas escolhendo Exibir Caixa de
Ferramentas.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 269 15/02/2013 14:00:11
270 Parte IV: Como se Comunicar com Seus Usurios
Acompanhe, para acrescentar um controle ao UserForm:

1. Clique na ferramenta da Caixa de Ferramentas que corresponde


ao controle que deseja adicionar.
2. Clique no UserForm, dimensione e posicione o controle.
Alternativamente, voc pode simplesmente arrastar um controle
da Caixa de Ferramentas para o UserForm, para criar um controle
com as dimenses padro. A Figura 17-1 mostra um UserForm que
contm alguns controles.
Um UserForm pode conter grades de linhas verticais e horizontais, as
quais ajudam a alinhar os controles que voc acrescenta. Quando um
controle adicionado ou movido, ele muda repentinamente para a
grade. Se voc no gostar desse recurso, pode desativar as grades,
seguindo estas etapas:
1. Escolha Ferramentas Opes no VBE.
2. Na caixa de dilogo Opes, selecione a guia Geral.
3. Configure as opes desejadas na seo Configuraes da Grade
do Formulrio.
Introduzindo propriedades de controle
Cada controle que voc adiciona a um UserForm tem propriedades que
determinam como o controle se parece e se comporta. possvel
alterar as propriedades de um controle nas seguintes ocasies:
5 Por ocasio do projeto quando voc estiver projetando o
UserForm. Isso feito manualmente, usando a janela
Propriedades.
5 Em tempo de execuo enquanto a sua macro est rodando.
Isso feito manualmente. As mudanas feitas em tempo de
execuo so sempre temporrias; elas so feitas na caixa de
dilogo que voc est exibindo, no no objeto UserForm que
voc criou.
D
I
C
A
Figura 17-1:
Um
UserForm
com alguns
controles
acrescentados.
ExcelVBABokks.indb 270 15/02/2013 14:00:11
271 Captulo 17: Usando os Controles de UserForm
Quando voc acrescenta um controle a um UserForm, quase sempre
necessrio fazer alguns ajustes de tempo de execuo s propriedades
dele. Essas alteraes so feitas na janela Propriedades (para exibir a
janela Propriedades, pressione F4). A Figura 17-2 mostra a janela
Propriedades, a qual exibe propriedades para o objeto selecionado no
UserForm que, por acaso, um controle CheckBox.
Para mudar as propriedades do controle no tempo de execuo, voc
deve escrever cdigo VBA. Por exemplo, voc pode querer ocultar um
controle em especial quando o usurio clicar uma caixa de verificao.
Nesse caso, voc escreve cdigo para alterar a propriedade Visible do
controle.
Cada controle tem o seu prprio conjunto de propriedades. No entanto,
todos os controles compartilham algumas propriedades comuns, tais como
Name (nome), Width (largura) e Height (altura). A Tabela 17-1 relaciona
algumas das propriedades comuns disponveis a muitos controles.
Tabela 17-1 Propriedades Comuns de Controle
Propriedade O Que Ela
Accelerator a letra sublinhada na legenda do controle. O usurio
pressiona esta tecla junto com a tecla Alt para

selecionar o controle.
AutoSize Se True, o controle se redimensiona
automaticamente, com base no texto de sua legenda.
BackColor A cor de fundo do controle.
BackStyle O estilo de fundo (transparente ou opaco).
(continua)
Figura 17-2:
Use a janela
Propriedades para
fazer
alteraes
no tempo de
execuo s
propriedades
do controle.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 271 15/02/2013 14:00:11
272 Parte IV: Como se Comunicar com Seus Usurios
Tabela 17-1 (continuao)
Propriedade O Que Ela
Caption O texto que aparece no controle.
Value O valor do controle.
Left e Top Valores que determinam a posio do controle
Width e Height Valores que determinam a largura e altura do
controle.
Visible Se Falso, o controle fica oculto.
Name O nome do controle. Por padro, o nome de um
controle baseado no tipo de controle. Voc pode
mudar o nome para qualquer nome vlido, mas
cada nome de controle deve ser nico dentro da
caixa de dilogo.
Picture Uma imagem grfica para exibir. A imagem pode ser
de um arquivo de grficos ou voc pode selecionar
a propriedade Picture e colar uma imagem que
copiou na rea de Transferncia.
Quando voc seleciona um controle, tais propriedades do controle
aparecem na janela Propriedades. Para alterar uma propriedade, basta
selecion-la na janela Propriedades e fazer a mudana. Algumas propriedades oferecem alguma ajuda. Por exemplo, se voc precisar mudar
a propriedade TextAlign, a janela Propriedades exibe uma lista
drop-down que contm todos os valores vlidos de propriedade,
conforme mostrado na Figura 17-3.
Figura 17-3:
Mude
algumas
propriedades,
selecionando a partir
de uma lista
drop-down,
os valores
vlidos da

propriedade.
ExcelVBABokks.indb 272 15/02/2013 14:00:11
273 Captulo 17: Usando os Controles de UserForm
Controles de Caixa de Dilogo:
Os Detalhes
Nas sees a seguir, eu o apresento a cada tipo de controle que voc
pode usar em caixas de dilogo personalizadas e discuto algumas das
propriedades mais teis. No abordo cada propriedade para cada
controle, porque isso exigiria um livro quase que quatro vezes maior
que este (e seria um livro bem chato).
O sistema de ajuda para os controles e propriedades minucioso. Para
encontrar detalhes completos para uma propriedade em especial,
selecione a propriedade na janela Propriedades e pressione F1. A Figura
17-4 mostra a ajuda online para a propriedade SpecialEffect til para
quando voc fizer a sua prxima aventura estrondosa de UserForm.
Todos os arquivos de exemplo desta seo esto disponveis no site
deste livro.
D
I
C
A
Figura 17-4:
O sistema
de Ajuda
oferece
muitas
informaes para
cada
propriedade
e controle.
ExcelVBABokks.indb 273 15/02/2013 14:00:12
274 Parte IV: Como se Comunicar com Seus Usurios
Controle Caixa de Seleo
Um controle Caixa de Seleo (ChekBox) til para obter uma escolha binria:
sim ou no, verdadeiro ou falso, ligado ou desligado, e assim por diante. A
Figura 17-5 mostra alguns exemplos dos controles Caixa de Seleo.
A seguir, so descritas as propriedades mais teis de um controle
CheckBox:
5 Accelerator: Uma letra que permite ao usurio mudar o valor
do controle usando o teclado. Por exemplo, se o acelerador for
A, pressionar Alt+A altera o valor do controle Caixa de Seleo
(de marcado para desmarcado ou de desmarcado para
marcado).
5 ControlSource: O endereo de uma clula de planilha que est
conectada Caixa de Seleo. A clula exibe TRUE se o controle
estiver marcado, ou FALSE (falso) se o controle no estiver
marcado.
5 Value: Se True, a Caixa de Seleo tem uma marca de
verificao. Se False, ele no tem uma marca de verificao.
No confunda controles Caixa de Seleo com controles Boto de opo.
Eles so meio parecidos, mas so usados com diferentes objetivos.
Controle Caixa de Combinao
Um controle Caixa de Combinao (ComboBox) semelhante a um
controle Caixa de listagem (ListBox), descrito mais adiante, na seo
Controle Caixa de listagem. Entretanto, uma Caixa de combinao
uma lista drop-down que exibe apenas um item de cada vez. Uma outra
diferena que o usurio pode ter permisso de inserir um valor que
no aparece na lista de itens. A Figura 17-6 mostra dois controles Caixa
de Combinao. O controle direita (para o ano) est sendo usado,

assim, ele exibe a sua lista de opes.


Figura 17-5:
Controles
CheckBox.
C
U
I
D
A
D
O!
Figura 17-6:
Controles
Caixa de
Combinao.
ExcelVBABokks.indb 274 15/02/2013 14:00:12
Captulo 17: Usando os Controles de UserForm 275
A seguir est uma descrio de algumas propriedades teis do controle
Caixa de combinao:
5 BoundColumn: Se a lista contm mltiplas colunas, esta
propriedade determina qual coluna contm o valor retornado.
5 ColumnCount: O nmero de colunas na lista.
5 ControlSource: Uma clula que armazena o valor selecionado
na Caixa de combinao.
5 ListRows: A quantidade de itens a exibir quando a lista dropdown acionada.
5 ListStyle: A aparncia dos itens da lista.
5 RowSource: Uma faixa de endereo que contm a lista dos itens
exibidos na Caixa de combinao.
5 Style: Determina se o controle age como uma lista drop-down
ou como uma caixa de combinao. Uma lista drop-down no
permite que o usurio entre com um novo valor.
5 Value: O texto do item selecionado pelo usurio e exibido na
Caixa de combinao.
Se a sua lista de itens no est em uma planilha, voc pode acrescentar
itens a um controle Caixa de Combinao, usando o mtodo AddItem.
Mais informaes sobre esse mtodo esto no Captulo 18.
Controle Boto de comando
O Boto de Comando (Command Button) apenas um boto comum
clicvel. Ele no tem utilidade a menos que voc fornea um procedimento que lida com eventos para executar quando o boto for
clicado.A Figura 17-7 mostra uma caixa de dilogo com nove botes de
comando. Dois desses botes apresentam uma imagem em clipart (inserida, copiando o clipart e depois colando-o no campo Picture na janela
Propriedades).
Quando um boto de comando clicado, ele executa um procedimento
que lida com eventos com um nome que consiste do nome do boto,
um sublinhado e a palavra Click. Por exemplo, se um boto de comando
for chamado MyButton, clic-lo executa a macro chamada MyButton_
Click. Essa macro armazenada na janela de cdigo do UserForm.
P
A
P
O
D
E
E
S

P
E
C
IALIS
T
A
Figura 17-7:
Controles
de Boto de
comando.
ExcelVBABokks.indb 275 15/02/2013 14:00:12
276 Parte IV: Como se Comunicar com Seus Usurios
A seguir, est uma descrio de algumas propriedades teis do controle
Boto de Comando:
5 Cancel: Se Verdadeiro, pressionar Esc executa a macro anexada
ao boto (apenas um dos botes do formulrio deve ter essa
opo configurada para True).
5 Default: Se Verdadeiro, pressionar Enter executa a macro
anexada ao boto (novamente: Apenas um boto deve ter essa
opo configurada para True).
Controle Quadro
Um controle Quadro (Frame) inclui outros controles. Ele usado com
objetivos estticos ou para agrupar logicamente um conjunto de
controles. Um quadro especialmente til quando a caixa de dilogo
contm mais que um conjunto de controles botes de opo (veja
Controle Boto de Opo, mais adiante neste captulo.)
A lista a seguir descreve algumas propriedades teis do controle
Quadro:
5 BorderStyle: A aparncia do quadro.
5 Caption: O texto exibido no alto do quadro. A legenda pode ser
uma string vazia se voc no quiser que o controle exiba uma
legenda.
Controle Imagem
Um controle Imagem exibe uma imagem. Voc pode us-lo para exibir a
logomarca de sua empresa em uma caixa de dilogo. A Figura 17-8 mostra
uma caixa de dilogo com um controle Imagem que exibe a foto de um
camarada que escreve livros de Excel.
Figura 17-8:
Um controle
imagem
exibe uma
foto.
ExcelVBABokks.indb 276 15/02/2013 14:00:12
Captulo 17: Usando os Controles de UserForm 277
A seguinte lista descreve as propriedades mais teis do controle
Imagem:
5 Picture: A imagem grfica que exibida.
5 PictureSizeMode: Como a imagem exibida se o tamanho do
controle no combinar com o tamanho da imagem.
Ao clicar a propriedade Picture, voc solicitado a fornecer um nome
de arquivo. No entanto, a imagem grfica (quando ela recuperada)
est armazenada na pasta de trabalho. Assim, se voc distribui a sua
pasta de trabalho para outra pessoa, no tem como incluir uma cpia
do arquivo da imagem.
A coleo clipart do Excel uma tima fonte de imagens. Use
(Inserir Ilustraes Clipart) e escolha uma imagem para colocar em
sua planilha. Selecione a imagem e pressione Ctrl+C para copi-la na
rea de Transferncia. Depois, ative o seu UserForm, clique o controle
Imagem e selecione a propriedade Picture na caixa Propriedades.
Pressione Ctrl+V para colar a imagem copiada. Ento, voc pode apagar

a imagem do clipart na planilha.


Algumas imagens grficas so muito grandes e podem fazer o tamanho
da sua pasta de trabalho aumentar dramaticamente. Para melhores
resultados, use uma imagem que seja to pequena quanto possvel.
Controle Rtulo
Um controle Rtulo (Label) simplesmente exibe texto em sua caixa de
dilogo. A Figura 17-9 mostra alguns controles Rtulo. Como voc pode
ver, possvel ter um bom controle na formatao de um controle
Rtulo.
D
I
C
A
C
U
I
D
A
D
O!
Figura 17-9:
Controles
Rtulo so
facilmente
moldados.
ExcelVBABokks.indb 277 15/02/2013 14:00:12
278 Parte IV: Como se Comunicar com Seus Usurios
Controle Caixa de Listagem
O controle Caixa de listagem (ListBox) apresenta uma relao de itens,
a partir dos quais o usurio pode escolher um ou mais. A Figura 17-10
mostra uma caixa de dilogo com dois controles Caixa de listagem.
Os controles Caixa de listagem so muito flexveis. Por exemplo, voc
pode especificar uma faixa de planilha que contm os itens da lista, e a
faixa pode consistir de mltiplas colunas. Ou, voc pode preencher a
lista com itens usando cdigo VBA (eu contei que prefiro esse mtodo?)
Se uma Caixa de listagem no exibir todos os itens da lista, aparece uma
barra de rolagem para que o usurio possa rolar para baixo, para ver
mais itens.
A relao abaixo uma descrio das propriedades mais teis do
controle:
5 BoundColumn: Se a lista contm mltiplas colunas, essa
propriedade determina qual coluna contm o valor retornado.
5 ColumnCount: A quantidade de colunas na lista.
5 ControlSource: Uma clula que o valor selecionado na Caixa de
listagem.
5 IntegralHeight: True se a altura da Caixa de listagem se
ajustar automaticamente para exibir linhas repletas de texto
quando a lista rolada verticalmente. Se False, a caixa de
listagem pode exibir linhas parciais de texto quando for rolado
verticalmente. Note que, quando essa propriedade True, a
altura real da lista pode ser ligeiramente diferente, quando o
seu UserForm mostrado, a partir de como voc o configurou
originalmente. O Visual Basic pode ajustar a altura para garantir
que a ltima entrada seja totalmente visvel.
5 ListStyle: A aparncia dos itens da lista.
5 MultiSelect: Determina se o usurio pode selecionar mltiplos
itens da lista.
5 RowSource: Uma faixa de endereo que contm a lista de itens
exibida na Caixa de listagem.
5 Value: O texto do item selecionado na lista.

Figura 17-10:
Controles
Caixa de
listagem
ExcelVBABokks.indb 278 15/02/2013 14:00:12
Captulo 17: Usando os Controles de UserForm 279
Se a Caixa de listagem tiver a sua propriedade MultiSelect configurada
para 1 ou 2, ento o usurio pode selecionar mltiplos itens na lista.
Nesse caso, voc no pode especificar um ControlSource; preciso
escrever uma macro que determine quais itens so selecionados. O
Captulo 18 mostra como fazer.
Controle Multi-pgina
Um controle Multi-pgina (MultiPage) permite que voc crie caixas de
dilogo tabuladas, como a caixa de dilogo Formatar Clulas (que
aparece quando voc pressiona Ctrl+1 no Excel). A Figura 17-11 mostra
um exemplo de uma caixa de dilogo personalizada que usa um controle Multi-pgina. Esse controle, em particular, tem trs pginas, ou
tabulaes.
A seguir, veja as propriedades mais teis do controle Multi-pgina:
5 Style: Determina a aparncia do controle. Os tabuladores
podem aparecer normalmente (no alto), esquerda, como
botes ou ocultos (sem tabuladores o seu cdigo VBA
determina qual pgina exibida).
5 Value: Determina qual pgina ou tabulador exibido. Um Valor
de 0 exibe a primeira pgina, um Valor de 1 exibe a segunda
pgina e assim por diante.
Por padro, um controle Multi-pgina tem duas pginas. Para acrescentar pginas, clique com o boto direito no tabulador e selecione Nova
Pgina no menu Contexto.
Controle Boto de Opo
Os botes de opo (Option Buttons) so teis quando o usurio precisa
selecionar a partir de uma pequena quantidade de itens. Botes de opo
so sempre usados em grupos de pelo menos dois. A Figura 17-12 mostra
dois conjuntos de botes, e cada conjunto est contido em um quadro.
L
E
M
B
R
E
-SE
Figura 17-11:
Use o
controle
Multi-pgina
para criar
uma caixa
de dilogo
tabulada.
D
I
C
A
ExcelVBABokks.indb 279 15/02/2013 14:00:13
280 Parte IV: Como se Comunicar com Seus Usurios
A seguir est uma descrio das propriedades mais teis do controle
Botes de opo:
5 Accelerator: Uma letra que permite ao usurio selecionar a
opo usando o teclado. Por exemplo, se o acelerador for um
boto de opo C, ento, pressionar Alt+C seleciona o controle.

5 GroupName: Um nome que identifica um boto de opo como


sendo associado a outros botes de opo com a mesma
propriedade GroupName.
5 ControlSource): A clula da planilha que est conectada ao
boto de opo. A clula exibe TRUE se o controle estiver
selecionado ou FALSE se o controle no estiver selecionado.
5 Value: Se True, o controle est selecionado. Se False, no est
selecionado.
Se a sua caixa de dilogo contiver mais que um conjunto de controles,
voc deve mudar a propriedade GroupName em todos os botes de
opo em um conjunto em especial. Caso contrrio, todos os botes de
opo se tornam parte do mesmo conjunto. Alternativamente, voc
pode encerrar cada conjunto de botes de opo em um controle
Quadro, o qual, automaticamente, agrupa os botes de opo em uma
moldura.
Controle RefEdit
O controle RefEdit usado quando voc precisa deixar o usurio
selecionar uma faixa em uma planilha. A Figura 17-13 mostra um
UserForm com dois controles RefEdit. A sua propriedade Value contm
o endereo da faixa selecionada (como uma string de texto).
Figura 17-12:
Dois
conjuntos de
controles
botes de
opo, cada
um contido
em um
controle
Frame.
L
E
M
B
R
E
-SE
Figura 17-13:
Dois
controles
RefEdit.
ExcelVBABokks.indb 280 15/02/2013 14:00:13
Captulo 17: Usando os Controles de UserForm 281
s vezes, o controle RefEdit causa problemas nos UserForms mais
complexos. Para melhores resultados, no coloque um controle RefEdit
dentro de um controle Quadro ou Multi-pgina.
Controle Barra de Rolagem
Quando voc adiciona um controle Barra de Rolagem (ScrollBar), pode
faz-lo horizontal ou vertical. A barra de rolagem semelhante a um
boto de rotao (descrito mais adiante). A diferena que o usurio
pode arrastar o boto da barra de rolagem para mudar o valor do
controle em aumentos maiores. Uma outra diferena que, quando
voc clica o boto up (para cima) em uma barra de rolagem vertical, o
valor diminui o que um pouco contraintuitivo. Assim, uma barra de
rolagem nem sempre um bom substituto de um boto de rotao.
A Figura 17-14 mostra um controle Barra de rolagem com uma orientao horizontal. A sua propriedade Value exibida em um controle
Rtulo, colocado abaixo da barra de rolagem.
A seguir, est uma descrio das propriedades mais teis de um
controle Barra de rolagem:

5 Value: O valor atual do controle.


5 Min: O valor mnimo do controle.
5 Max: O valor mximo do controle.
5 ControlSource: A clula de planilha que exibe o valor do
controle.
5 SmallChange: A quantia que o valor do controle alterada por
um clique.
5 LargeChange: A quantia que o valor do controle alterada
clicando em qualquer lado do boto.
O controle Barra de rolagem mais til para especificar um valor que
se expande atravs de uma ampla faixa de possveis valores.
C
U
I
D
A
D
O!
Figura 17-14:
Uma barra
de rolagem
com um
rtulo abaixo
dela.
ExcelVBABokks.indb 281 15/02/2013 14:00:13
282 Parte IV: Como se Comunicar com Seus Usurios
Controle Boto de Rotao
O controle Boto de Rotao (SpinButton) permite ao usurio selecionar um valor clicando o controle, o qual tem duas setas (uma para
aumentar o valor e outra para diminuir o valor). Tal qual uma barra de
rolagem, um boto de rotao pode ser orientado horizontal ou verticalmente. A Figura 17-15 mostra uma caixa de dilogo que usa dois
botes de rotao verticalmente orientados. Cada controle conectado
ao controle Rtulo direita (usando procedimentos VBA).
As seguintes descries explicam as propriedades mais teis de um
controle boto de rotao:
5 Value: O valor atual do controle.
5 Min: O valor mnimo do controle.
5 Max: O valor mximo do controle.
5 ControlSource: A clula da planilha que exibe o valor do
controle.
5 SmallChange: A quantia que o valor do controle alterada por
um clique. Normalmente, esta propriedade configurada para
1, mas voc pode faz-la de qualquer valor.
Se voc usar uma ControlSource em um boto de rotao, precisa
entender que a planilha recalculada a cada vez que o valor do controle mudado. Portanto, se o usurio mudar o valor de 0 para 12, a
planilha calculada 12 vezes. Se a sua planilha demorar muito para
calcular, voc pode querer evitar usar uma ControlSource para armazenar o valor.
Controle TabStrip
Um controle TabStrip semelhante a um controle Multi-pgina, mas ele
no fcil de usar. Na verdade, eu no tenho certeza do motivo pelo
qual este controle foi includo. Voc pode muito bem ignor-lo e, ao
invs, usar o controle Multi-pgina.
Controle Caixa de Texto
Um controle TextBox permite ao usurio entrar com texto. A Figura 17-16
mostra uma caixa de dilogo com duas caixas de texto.
Figura 17-15:
Controles

Boto de
rotao.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 282 15/02/2013 14:00:13
Captulo 17: Usando os Controles de UserForm 283
A seguir est uma descrio das propriedades mais teis desse
controle TextBox:
5 AutoSize: Se True (verdadeiro), o controle ajusta
automaticamente o seu tamanho, dependendo da quantidade de
texto.
5 ControlSource: O endereo de uma clula que contm o texto
no TextBox.
5 Integral Height: Se True, a altura de da caixa de texto se ajusta
automaticamente para exibir linhas completas de texto quando a
lista rolada verticalmente. Se False, a caixa de texto pode exibir
linhas parciais de texto quando ela rolada verticalmente.
5 MaxLenght: O nmero mximo de caracteres permitido. Se 0, o
nmero de caracteres ilimitado.
5 MultiLine: Se True, a caixa de texto pode exibir mais de uma
linha de texto.
5 TextAlign: Determina como o texto alinhado no TextBox.
5 WordWrap: Determina se o controle permite quebra de linha.
5 ScrollBars: Determina o tipo de barras de rolagem para o
controle: horizontal, vertical, ambos ou nenhum.
Quando voc adiciona uma caixa de texto, a sua propriedade WordWrap
configurada para True, e a sua propriedade MultiLine configurada
para False. O resultado? A quebra de linha no funciona! Assim, se voc
quer quebrar linhas em uma caixa de texto, assegure-se de configurar a
propriedade MultiLine para True.
Controle ToggleButton
Um controle Boto de Ativao (ToggleButton) tem duas posies: on
(ativado) e off (desativado). Clicar o boto alterna entre essas duas
posies, e o boto muda a sua aparncia quando clicado. O seu valor
True (pressionado) ou False (no pressionado). A Figura 17-17 mostra
uma caixa de dilogo com quatro botes de ativao. Os dois de cima
esto alternados.
Raramente eu uso esse controles. Prefiro usar os controles caixa de seleo.
Figura 17-16:
Controles
Caixa de
texto.
D
I
C
A
ExcelVBABokks.indb 283 15/02/2013 14:00:13
284 Parte IV: Como se Comunicar com Seus Usurios
Trabalhando com Controles
de Caixa de Dilogo
Nesta seo, eu discuto como trabalhar com controles de caixa de
dilogo em um objeto UserForm.
Movendo e redimensionando controles
Depois de colocar um controle em uma caixa de dilogo, voc o move e
redimensiona, usando as tcnicas padro do mouse. Ou, para definir

com preciso, voc pode usar a janela Propriedades para inserir um


valor propriedade Height, Width, Left ou Top do controle.
possvel selecionar mltiplos controles com Ctrl+clique nos controles. Ou, voc pode clicar e arrastar para laar um grupo de controles.
Quando mltiplos controles so selecionados, a janela Propriedades
exibe apenas as propriedades comuns a todos os controles selecionados. Voc pode mudar essas propriedades comuns, e a alterao ser
feita em todos os controles que voc selecionou, o que muito mais
rpido do que fazer um de cada vez.
Um controle pode ocultar outro; em outras palavras, voc pode empilhar um controle sobre outro. A menos que tenha um bom motivo para
fazer isso, assegure-se de no sobrepor controles.
Alinhando e espaando controles
O menu Formatar na janela VBE oferece diversos comandos para
ajud-lo a alinhar e espaar com preciso os controles em uma caixa de
dilogo. Antes de usar esses comandos, selecione os controles com os
quais deseja trabalhar. Esses comandos funcionam exatamente como
voc poderia esperar, portanto no os explico aqui. A Figura 17-18
mostra uma caixa de dilogo com vrias caixas de seleo prontas para
ser alinhadas.
Figura 17-17:
Controles
Boto de
ativao.
D
I
C
A
ExcelVBABokks.indb 284 15/02/2013 14:00:13
Captulo 17: Usando os Controles de UserForm 285
Quando voc seleciona mltiplos controles, o ltimo controle selecionado aparece com alas brancas ao invs das alas pretas normais. O
controle com as alas brancas a base para alinhar ou redimensionar
os outros controles selecionados quando voc usa o menu Formatar.
Acomodando teclado de usurios
Muitos usurios (incluindo os seus, de verdade) preferem navegar atravs
de uma caixa de dilogo, usando o teclado: pressionar Tab ou Shift+Tab
permite circular atravs dos controles, enquanto que pressionar uma tecla
de atalho ativa instantaneamente um controle em particular.
Para ter certeza de que as suas caixas de dilogo funcionam adequadamente para os usurios de teclado, voc deve estar ciente de duas
questes:
5 A ordem da tabulao
5 Teclas de acelerao
Como mudar a ordem de tabulao
A ordem de tabulao determina a ordem pela qual os controles so
ativados quando o usurio pressiona Tab ou Shift+Tab. Ela tambm
determina qual controle tem o foco inicial isto , qual controle est
ativo quando a caixa de dilogo aparece pela primeira vez. Por exemplo, se um usurio estiver inserindo texto em uma caixa de texto, esse
D
I
C
A
Figura 17-18:
Use o comando Formatar Alinhar
para mudar o
alinhamento

de controles
UserForm.
ExcelVBABokks.indb 285 15/02/2013 14:00:13
286 Parte IV: Como se Comunicar com Seus Usurios
controle tem o foco. Se o usurio clicar um boto de opo, ele tem o
foco. O primeiro controle na ordem de tabulao tem o foco quando o
Excel exibe uma caixa de dilogo pela primeira vez.
Para configurar a ordem de tabulao do controle, escolha ExibirOrdem de tabulao. Voc tambm pode clicar com o boto direito a caixa
de dilogo e escolher Ordem de tabulao no menu de atalho. Em
qualquer caso, o Excel exibe a caixa de dilogo Ordem de tabulao
mostrada na Figura 17-19.
A caixa de dilogo Ordem de tabulao relaciona todos os controles no
UserForm. A ordem de tabulao no UserForm corresponde ordem
dos itens na lista. Para mudar a ordem de tabulao de um controle,
selecione-o na lista e, depois clique os botes de seta para cima ou para
baixo. Voc pode escolher mais de um controle (clique enquanto
pressiona Shift ou Ctrl) e mov-los todos de uma vez.
Ao invs de usar a caixa de dilogo Ordem de tabulao, voc pode
configurar a posio de um controle na ordem de tabulao usando a
janela Propriedades. O primeiro controle na ordem de tabulao tem uma
propriedade TabIndex (ndice de tabulao) de 0. Se quiser remover um
controle da ordem de tabulao, configure a sua propriedade TabStop
(parar tabulao) para False.
Alguns controles (tais como os controles Quadro ou Multi-pgina) agem
como contineres para outros controles. Os controles dentro de um
continer tm suas prprias ordens de tabulao. Para configurar a
ordem de tabulao para um grupo de Botes de opo dentro de um
controle Quadro, selecione o quadro antes de escolher o comando
Exibir Ordem de tabulao.
Configurando teclas de atalho
Normalmente, voc quer atribuir uma tecla de acelerao, ou hot key
(tecla de atalho) aos controles da caixa de dilogo. Isso pode ser feito
inserindo uma letra para a propriedade Accelerator na janela propriedades. Se um controle no tiver uma propriedade Accelerator (uma caixa
de texto, por exemplo), voc ainda pode permitir acesso direto de teclado a ela, usando um controle Rtulo. Isto , designando uma tecla de
atalho ao rtulo e o posicionamento antes da caixa de texto na ordem
de tabulao.
A Figura 17-20 mostra um UserForm com trs Caixas de texto. Os rtulos
que as descrevem tm teclas de atalho, e cada rtulo precede a sua caixa
de texto correspondente na ordem de tabulao. Pressionar Alt+D, por
exemplo, ativa a caixa de texto prxima ao rtulo Department.
Figura 17-19:
A caixa de
dilogo
Ordem de
tabulao.
D
I
C
A
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 286 15/02/2013 14:00:13

Captulo 17: Usando os Controles de UserForm 287


Testando um UserForm
O VBE oferece trs maneiras de testar um UserForm sem execut-lo a
partir de um procedimento VBA:
5 Escolha o comando ExecutarExecutar Sub/UserForm.
5 Pressione F5.
5 Clique no boto Executar Sub/UserForm na barra de
ferramentas padro.
Quando uma caixa de dilogo exibida neste modo de teste, voc pode
experimentar a ordem de tabulao e as teclas de atalho.
Esttica de Caixa de Dilogo
Caixas de dilogo podem parecer bonitas, feias ou algo em torno disso.
Uma caixa de dilogo com boa aparncia fcil de se ver, ela tem
controles bem dimensionados e alinhados e torna a sua funo perfeitamente clara ao usurio. As caixas de dilogo de aspecto feio confundem
o usurio, tm controles desalinhados e do a impresso de que o
desenvolvedor no tinha um plano (ou uma ideia).
Tente limitar o nmero de controles em seu formulrio. Se voc precisar de muitos controles (uma regra emprica: mais de 10 controles),
considere usar um controle Multi-pgina para separar a tarefa que o
usurio tem a fazer, em etapas lgicas (e menores).
Uma boa regra a seguir tentar fazer suas caixas de dilogo parecidas
com as caixas de dilogo integradas do Excel. Na medida em que voc
adquire mais experincia com a montagem da caixa de dilogo, voc
pode repetir quase todos os recursos das caixas de dilogo do Excel.
Figura 17-20:
Use rtulos
para oferecer
acesso direto
aos controles
que no tm
teclas de
atalho.
ExcelVBABokks.indb 287 15/02/2013 14:00:14
288 Parte IV: Como se Comunicar com Seus Usurios
ExcelVBABokks.indb 288 15/02/2013 14:00:14


Neste Captulo
Como usar uma caixa de dilogo personalizada em seu aplicativo
Criando uma caixa de dilogo: um exemplo prtico
Captulo 18
Tcnicas e Truques
do UserForm
O
s captulo anteriores mostram como inserir um UserForm (o qual
contm uma caixa de dilogo personalizada), acrescentar controles
ao UserForm e ajustar algumas das propriedades do controle. No entanto,
essas habilidades no sero de muita ajuda, a menos que voc saiba utilizar Userforms em seu cdigo VBA. Este captulo oferece esses detalhes
que faltam e, no processo, apresenta algumas tcnicas e truques teis.
Como Usar Caixas de Dilogo
Ao usar uma caixa de dilogo em seu aplicativo, normalmente voc
escreve um cdigo VBA que faz o seguinte:
5 Inicializa os controles UserForm. Por exemplo, voc pode escrever
cdigo que configura os valores padro para os controles.
5 Exibe a caixa de dilogo usando o mtodo Show do objeto
UserForm.
5 Reage a eventos que ocorrem nos diversos controles.
5 Valida as informaes fornecidas pelo usurio (se o usurio no

cancelou a caixa de dilogo). Esta etapa nem sempre


necessria.
5 Executa alguma ao com as informaes fornecidas pelo
usurio (se as informaes forem vlidas).
Um Exemplo de UserForm
O exemplo a seguir demonstra os cinco pontos que descrevi na seo
anterior. Nele, voc usa uma caixa de dilogo para obter duas partes de
informaes: o nome e o sexo de uma pessoa. A caixa de dilogo usa um
ExcelVBABokks.indb 289 15/02/2013 14:00:14
290 Parte IV: Como se Comunicar com Seus Usurios
controle Caixa de Texto para obter o nome e trs Botes de Opo, para
conseguir o sexo (Masculino, Feminino ou Desconhecido). As informaes coletadas na caixa de dilogo so ento enviadas linha seguinte
em branco em uma planilha.
Criando a caixa de dilogo
A Figura 18-1 mostra o UserForm concludo neste exemplo. Para
melhores resultados, inicie com uma nova pasta de trabalho contendo
apenas uma planilha. Depois, siga estas etapas:
1. Pressione Alt+F11 para ativar o VBE.
2. Na janela de projeto, selecione uma pasta de trabalho vazia e
escolha Inserir UserForm.
Um UserForm vazio acrescentado ao projeto.
3. Mude a propriedade Caption do UserForm para Get Name
and Sex.
Se a janela de propriedade no estiver visvel, pressione F4.
Esta caixa de dilogo tem oito controles:
5 Um rtulo. Eu modifiquei as seguintes propriedades para este
controle:
Propriedade Valor
Accelerator N
Caption Nome
TabIndex (ndice de tabulao) 0
Figura 18-1:
Esta caixa de
dilogo pede
ao usurio
para entrar
com um
Nome e
escolher um
Sexo.
ExcelVBABokks.indb 290 15/02/2013 14:00:14
291 Captulo 18: Tcnicas e Truques do UserForm
5 Uma caixa de texto. Eu modifiquei as seguintes propriedades
para este controle:
Propriedade Valor
Name TextName (Texto de Nome)
TabIndex 1
5 Um quadro. Eu modifiquei as seguintes propriedades para este
controle:
Propriedade Valor
Caption Sexo
TabIndex 2
5 Um boto de opo. Eu modifiquei as seguintes propriedades
para este controle:
Propriedade Valor
Accelerator M
Caption Masculino
Name OptionMale
TabIndex 0

5 Outro boto de opo: Eu modifiquei as seguintes propriedades


para este controle:
Propriedade Valor
Accelerator F
Caption Feminino
Name OptionFemale (Opo Feminina)
TabIndex 1
5 Outro: Eu modifiquei as seguintes propriedades para este
controle:
Propriedade Valor
Accelerator D
Caption Desconhecido
Name Option Unknown
TabIndex 2
Value (valor) True
5 Um boto de comando: Eu modifiquei as seguintes
propriedades para este controle:
Propriedade Valor
Caption Enter
Default True
Name EnterButton
TabIndex 3
ExcelVBABokks.indb 291 15/02/2013 14:00:14
292 Parte IV: Como se Comunicar com Seus Usurios
5 Outro boto de comando: Eu modifiquei as seguintes
propriedades para este controle:
Propriedade Valor
Caption Fechar
Cancel (cancelar) True
Name CloseButton
TabIndex 4
Se voc estiver acompanhando em seu computador (e deveria), tome
alguns minutos para criar esse UserForm, usando as informaes
precedentes; assegure-se de criar o objeto Quadro antes de acrescentar
a ele os botes de opo.
Em alguns casos, voc pode descobrir que copiar um controle existente
mais fcil que criar um novo. Para copiar um controle, pressione Ctrl
enquanto arrasta o controle.
Se voc preferir parar de caar, pode fazer o download do exemplo a
partir do site deste livro.
Escrevendo cdigo para exibir a caixa de
dilogo
Depois de ter acrescentado os controles ao UserForm, o seu prximo
passo desenvolver algum cdigo VBA para exibir essa caixa de dilogo:
1. Na janela VBE, escolha Inserir Mdulo, para inserir um
mdulo VBA.
2. Entre com a seguinte macro:
Sub GetData()
UserForm1.Show
End Sub
Este curto procedimento usa o mtodo Show do objeto UserForm
para exibir a caixa de dilogo.
Disponibilizando a macro
O seguinte conjunto de etapas d ao usurio uma maneira fcil de
executar o procedimento:
1. Ative o Excel.
2. Escolha Desenvolvedor Controles Inserir e clique no cone do
Boto na seo Controle de Formulrios.
D
I

C
A
ExcelVBABokks.indb 292 15/02/2013 14:00:14
Captulo 18: Tcnicas e Truques do UserForm 293
3. Arraste na planilha para criar o boto.
A caixa de dilogo Atribuir macro aparece.
4. Designe a macro GetData ao boto.
5. Edite a legenda do boto para Data Entry (entrada de dados).
Se voc quiser ser muito extravagante, pode acrescentar um cone
sua barra de ferramentas de Acesso Rpido. Depois, clicar no cone
roda a macro GetData. Para configurar isso, clique com o boto direito
na sua barra de ferramentas de Acesso Rpido e escolha Personalizar
Barra de Ferramentas de Acesso Rpido, que exibe guia respectiva na
caixa de dilogo Opes do Excel. No menu drop-down, selecione
Macros. Modifique o boto e mude o cone. Se voc usa Excel 2010,
torne o cone de acesso rpido visvel apenas quando a pasta de
trabalho apropriada estiver ativada. Antes de adicionar a macro, use o
menu drop-down, do lado superior direito da caixa de dilogo Opes
do Excel, para especificar o nome da pasta de trabalho, ao invs de
Para todos documentos (Padro).
Testando a sua caixa de dilogo
Siga estas etapas para testar a sua caixa de dilogo:
1. Clique no boto Data Entry (Entrada de Dados) na planilha. Ou
clique no cone Quick Access da barra de ferramentas, se voc
configurou um.
A caixa de dilogo aparece, conforme mostrado na Figura 18-2.
2. Entre com algum texto na caixa de edio.
3. Clique Enter ou Fechar.
Nada acontece o que compreensvel, pois voc ainda no
criou quaisquer procedimentos.
4. Clique no boto X na barra de ttulo da caixa de dilogo, para
se livrar dela.
D
I
C
A
Figura 18-2:
Executar o
procedimento GetData
exibe a caixa
de dilogo.
ExcelVBABokks.indb 293 15/02/2013 14:00:14
294 Parte IV: Como se Comunicar com Seus Usurios
Adicionando procedimentos que lidam com eventos
Nesta seo, eu explico como escrever os procedimentos que lidam
com os eventos que ocorrem quando a caixa de dilogo exibida.
1. Pressione Alt+F11 para ativar o VBE e, depois, assegure-se de
que o UserForm seja exibido.
2. Clique duas vezes no boto Close (fechar) no UserForm.
O VBE ativa a janela Code (cdigo) para o UserForm e oferece
um procedimento vazio, chamado CloseButton_Click (Fechar
Boto, Clicar).
3. Modifique o procedimento como a seguir:
Private Sub CloseButton_Click()
Unload UserForm1
End Sub
Este procedimento, que executado quando o usurio clicar no
boto Fechar, simplesmente remove a caixa de dilogo da memria.
4. Pressione Shift+F7 para exibir novamente UserForm1.

5. Clique duas vezes no boto Enter e entre com o seguinte


procedimento:
Private Sub EnterButton_Click()
Dim Next Row As Long
Certifique-se que Plan1 est ativa
Sheets(Plan1).Activate
Determine a prxima linha vazia
NextRow = Application.WorksheetFunction. _
CountA(Range(A:A)) + 1
Transfira o nome
Cells(NextRow, 1) = TextName.Text
Transfira o sexo
If OptionMale Then Cells(NextRow, 2) = Masculino
If OptionFemale Then Cells(NextRow, 2) = Feminino
If OptionUnknown Then Cells(NextRow, 2) = _
Desconhecido
Apaga os controles para a prxima entrada
TextName.Text =
OptionUnknown = True
TextName.SetFocus
End Sub
6. Agora, ative o Excel e rode novamente o procedimento, clicando
o boto Data Entry.
A caixa de dilogo funciona muito bem. A Figura 18-3 mostra como
fica em ao.
ExcelVBABokks.indb 294 15/02/2013 14:00:14
Captulo 18: Tcnicas e Truques do UserForm 295
Eis como funciona o procedimento EnterButton_Click:
5 Primeiro, o cdigo garante que a planilha apropriada (Plan1)
esteja ativa.
5 Depois, ele usa a funo COUNTA do Excel para contar o
nmero de entradas na coluna A e determinar a prxima clula
em branco na coluna.
5 Em seguida, o procedimento transfere o texto de TextBox (Caixa
de Texto) para a Coluna A.
5 Depois, ele usa uma srie de declaraes If para determinar qual
Boto de Opo foi selecionado e escreve o texto apropriado
(Feminino, Masculino ou Desconhecido) na coluna B.
5 Finalmente, a caixa de dilogo reconfigurada, para deix-la
pronta para a prxima entrada. Observe que clicar no boto
Enter no fecha a caixa de dilogo, pois o usurio,
provavelmente quer entrar com mais dados. Para encerrar a
entrada de dados, clique no boto Fechar.
Validando os dados
Pratique um pouco mais com esta rotina e voc descobrir que a macro
tem um pequeno problema: ela no garante que o usurio entra, de fato,
com um nome na caixa de texto. O seguinte cdigo o qual inserido
no procedimento EnterButton_Click antes de transferir o texto para a
planilha garante que o usurio entre com algum texto na caixa. Se ela
estiver vazia, uma mensagem aparece e a rotina interrompida.
Certifique-se que um nome seja inserido
If TextName.Text = Then
MsgBox Voc deve inserir um nome.
Exit Sub
End If
Figura
18-3: Uso
da caixa
de dilogo
personali-

zada para
entrada de
dados.
ExcelVBABokks.indb 295 15/02/2013 14:00:15
296 Parte IV: Como se Comunicar com Seus Usurios
Agora a caixa de dilogo funciona
Depois de fazer estas modificaes, voc descobre que a caixa de
dilogo funciona sem falhas. Na vida real, provavelmente voc precisaria reunir mais informaes do que apenas nome e sexo. No entanto, os
mesmos princpios bsicos se aplicam. Voc s precisa lidar com mais
controles UserForm.
Mais uma coisa a lembrar: se os dados no comearem na linha 1 ou se a
rea de dados contiver quaisquer linhas em branco, a contagem para a
varivel NextRow (Prxima Fileira) ser errada. A funo COUNTA est
contando o nmero de clulas em A1 e, a suposio de que os dados
comecem na clula A1 e no h clulas em branco acima do ltimo nome
na coluna. Eis uma outra forma de determinar a prxima linha vazia:
NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
A declarao simula ativar a ltima clula na coluna A, pressionando End,
pressionando Seta para cima e, depois descendo uma linha. Se voc fizer
isso manualmente, o indicador da clula estar na prxima clula varia
na coluna A mesmo se a rea de dados no comear na linha 1 e
contiver linhas em branco.
Mais Exemplos do UserForm
Provavelmente, eu poderia encher um livro inteiro com dicas interessantes e teis para trabalhar com caixas de dilogo personalizadas.
Infelizmente, este livro tem um nmero limitado de pginas, portanto,
eu o completo com mais alguns exemplos.
Um exemplo de Caixa de Listagem
Caixas de listagens so controles teis, porm, trabalhar com elas pode
ser um pouco ardiloso. Antes de exibir uma caixa de dilogo que usa
uma caixa de listagem, preencha-a com itens. Depois, quando a caixa de
dilogo for fechada, voc precisa determinar qual(is) item(ns) o usurio
selecionou:
Ao lidar com ListBoxes, voc precisa saber sobre as seguintes propriedades e mtodos:
5 AddItem: Voc usa este mtodo para acrescentar um item
caixa de listagem.
5 ListCount: Esta propriedade retorna o nmero de itens da caixa
de listagem.
5 ListIndex: Esta propriedade retorna o ndice de nmero do item
selecionado ou conjuntos de itens que so selecionados
(apenas selees individuais). O primeiro item tem um
ListIndex de 0 (no 1).
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 296 15/02/2013 14:00:15
Captulo 18: Tcnicas e Truques do UserForm 297
5 MultiSelect: Esta propriedade determina se o usurio pode
selecionar mais de um item da lista.
5 RemoveAllItems: Use este mtodo para remover todos os itens
da lista.
5 Selected: Esta propriedade retorna um array, indicando itens
selecionados (aplicvel apenas quando so permitidas
mltiplas selees).

5 Value: Esta propriedade retorna o item selecionado em uma


lista.
A maioria dos mtodos e propriedades que trabalham com caixas de
listagem tambm trabalha com caixas de combinao. Assim, depois de
ter descoberto como lidar com caixas de listagem, voc pode transferir
esse conhecimento para o seu trabalho com caixas de combinao.
Preenchendo uma Caixa de Listagem
Para melhores resultados, comece com uma pasta de trabalho vazia. O
exemplo nesta seo supe o seguinte:
5 Voc adicionou um UserForm.
5 O UserForm contm um controle caixa de listagem chamado
ListBox1.
5 O UserForm tem um Boto de comando chamado OKButton.
5 O UserForm tem um Boto de comando chamado CancelButton,
o qual tem o seguinte procedimento ao ser clicado:
Private Sub Cancelbuton_Click()
Unload UserForm1
End Sub
O seguinte procedimento armazenado no procedimento Initialize do
UserForm:
1. Selecione o seu UserForm e pressione F7 para ativar a sua janela
de cdigo.
O VBE exibe a janela de cdigo para o seu formulrio e est pronto
para voc entrar com o cdigo para o evento Initialize.
2. Usando a lista drop-down de Procedure no alto da janela de
cdigo, escolha Initialize.
3. Adicione o cdigo de inicializao ao formulrio:
Sub Userform_Initialize()
Preencha a caixa de listagem
With ListBox1
.AddItem Janeiro
.AddItem Fevereiro
.AddItem Maro
.AddItem Abril
.AddItem Maio
.AddItem Junho
D
I
C
A
ExcelVBABokks.indb 297 15/02/2013 14:00:15
298 Parte IV: Como se Comunicar com Seus Usurios
.AddItem Julho
.AddItem Agosto
.AddItem Setembro
.AddItem Outubro
.AddItem Novembro
.AddItem Dezembro
End With
Selecione o primeiro item da lista
ListBox1.ListIndex = 0
End Sub
Esta rotina de inicializao roda automaticamente, sempre que o
seu UserForm for carregado. Assim, quando voc usa o mtodo
Show para o UserForm, o cdigo executado e a sua caixa de
listagem preenchida com 12 itens, cada um acrescentado atravs
do mtodo AddItem.
4. Insira um mdulo VBA e digite um curto procedimento Sub para
exibir a caixa de dilogo:
Sub ShowList()

UserForm1.Show
End Sub
No obrigatrio usar o procedimento Initialize para preencher as suas
listas. Isso pode ser feito em um procedimento VBA normal. Usar esse
procedimento parece ser algo normal para cuidar de uma etapa to
comum (ainda que importante). Se voc ocultar o UserForm usando
UserForm_Hide e depois exibir novamente o formulrio (UserForm1.
Show), o evento Initialize no dispara novamente.
Determinando o item selecionado
O cdigo anterior simplesmente exibe uma caixa de dilogo com uma
caixa de listagem preenchida com nomes de meses. O que est faltando
um procedimento para determinar qual item est selecionado na lista.
Acrescente o seguinte ao procedimento OKButton_Click:
Private Sub OKButton_Click()
Dim Msg As String
Msg = Voc selecionou o item #
Msg = Msg & ListBox1.ListIndex
Msg = Mag & ListBox1.Value
MsgBox Msg
Unload UserForm1
End Sub
Este procedimento exibe uma caixa de mensagem com o nmero do
item selecionado e o item selecionado.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
ExcelVBABokks.indb 298 15/02/2013 14:00:15
Captulo 18: Tcnicas e Truques do UserForm 299
Se nenhum item da listagem for selecionado, a propriedade ListIndex
retorna -1. No entanto, esse nunca ser o caso com essa caixa de
listagem em particular, pois o cdigo no procedimento UserForm_Initialize selecionou o primeiro item. Assim, sempre haver um item selecionado, se o usurio, de fato, no selecionar um ms.
A Figura 18-4 mostra como isto parece.
O primeiro item de uma caixa de listagem tem um ListIndex de 0, no 1
(como voc poderia esperar). Esse sempre o caso, ainda que voc use
uma declarao Option Base 1 (Opo de Base 1) para mudar o limite
inferior padro para arrays.
Este exemplo est disponvel no site deste livro.
Determinando mltiplas selees
Se a sua caixa de listagem for configurada para que o usurio possa
selecionar mais de um item, voc descobrir que a propriedade ListIndex retorna apenas o ltimo item selecionado. Para determinar todos os
itens selecionados, voc precisa usar a propriedade Selected, a qual
contm um array.
Para permitir mltiplas selees em uma caixa de listagem, configure a
propriedade MultiSelect para 1 ou 2. Isso pode ser feito usando a janela

Propriedades ou em tempo de execuo, usando uma declarao VBA


como esta:
UserForm1.ListBox1.MultiSelect = 1
A propriedade MultiSelect tem trs configuraes possveis. O significado de cada uma mostrado na Tabela 18-1.
Figura 18-4:
Determinando qual item
est
selecionado
em uma
caixa de
listagem.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 299 15/02/2013 14:00:15
300 Parte IV: Como se Comunicar com Seus Usurios
Tabela 18-1 Configuraes para a propriedade MultiSelect
Valor Constante VBA Significado
0 fmMultiSelectSingle Apenas um nico item pode ser selecionado.
1 fmMultiSelectMulti Clicar um item ou pressionar a barra de espao
seleciona ou desfaz a seleo de um item na lista.
2 fmMultiSelect Itens so adicionados ou removidos da seleo
Extended mantendo pressionada a tecla Shift ou
Ctrl enquanto voc clica nos itens.
O seguinte procedimento exibe uma caixa de mensagem que relaciona
todos os itens selecionados na caixa de listagem. A Figura 18-5 mostra
um exemplo.
Private Sub OKButton_Click()
Dim Msg As String
Dim i As Integer
Dim Counter As Integer
Msg = Voc selecionou: & vbNewLine
For i = 0 To ListBox1.ListCount 1
If ListBox1.Selected(i) Then
Counter = Counter + 1
Msg = Msg & ListBox1.List(i) & vbNewLine
End If
Next i

If Counter = 0 then Msg = Msg & (nada)


MsgBox Msg
Unload UserForm1
End Sub
Figura 18-5:
Determinar
os itens
selecionados em uma
caixa de
listagem
possibilita
mltiplas
selees.
ExcelVBABokks.indb 300 15/02/2013 14:00:15
Captulo 18: Tcnicas e Truques do UserForm 301
Esta rotina usa um loop For-Next para circular atravs de cada item na
caixa de listagem. Observe que o loop inicia com o item 0 (o primeiro
item) e termina com o ltimo item (determinado pelo valor da propriedade ListCount menos 1). Se a propriedade Selected de um item for True,
significa que o item da lista foi selecionado. O cdigo tambm usa uma
varivel (Counter) para controlar quantos itens so selecionados. Uma
declarao If-Then modifica a mensagem se nada estiver selecionado.
Este exemplo est disponvel no site deste livro.
Selecionando uma faixa
Em alguns casos, voc pode querer que o usurio selecione uma faixa
enquanto uma caixa de dilogo exibida. Um exemplo dessa escolha
acontece na caixa de dilogo Criar Tabela, que exibida quando voc
escolhe InserirTabela. A caixa de dilogo seleciona a faixa sob a
hiptese de que voc vai usar mas voc pode usar esse recurso para
mudar a faixa, selecionando clulas na planilha.
Para permitir a seleo de faixa em sua caixa de dilogo, acrescente um
controle RefEdit. O seguinte exemplo exibe uma caixa de dilogo com a
faixa de endereo da regio atual exibida em um controle RefEdit,
conforme mostrado na Figura 18-6. A regio atual um bloco de clulas
que no esto vazias, que contm a clula ativa. O usurio pode aceitar
ou mudar essa faixa. Quando o usurio clicar OK, o procedimento muda
a faixa para negrito.
Figura 18-6:
Esta caixa de
dilogo
permite que
o usurio
selecione
uma faixa.
ExcelVBABokks.indb 301 15/02/2013 14:00:15
302 Parte IV: Como se Comunicar com Seus Usurios
Este exemplo supe o seguinte:
5 Voc tem um UserForm chamado UserForm1.
5 O UserForm contm um controle boto de comando chamado
OKButton.
5 O UserForm contm um controle boto de comando chamado
CancelButton.
5 O UserForm contm um controle RefEdit chamado RefEdit1.
O cdigo armazenado em um mdulo VBA e mostrado aqui. Este
cdigo faz duas coisas: inicializa a caixa de dilogo, designando o
endereo da regio atual ao controle RefEdit e exibe o UserForm.
Sub BoldCells()
Sair se a pasta de trabalho no estiver ativa
If TypeName(ActiveSheet) <> Worksheet Then _

Exit Sub
Selecione a regio atual
ActiveCell.CurrentRegion.Select
Inicialize o controle RefEdit
UserForm1.RefEdit1.Text = Selection.Address
Mostrar caixa de dilogo
UserForm1.Show
End Sub
O seguinte procedimento executado quando o boto OK clicado.
Este procedimento executa uma simples verificao de erro para
garantir que a faixa especificada no controle RefEdit seja vlida.
Private Sub OKButton_Click()
On Error GoTo BadRange
Range(RefEdit1.Text).Font.Bold = True
Unload UserForm1
Exit Sub
BadRange:
MsgBox A faixa especificada no vlida.
End Sub
Se ocorrer um erro (mais provavelmente uma especificao invlida de
faixa no controle RefEdit), o cdigo pula para a etiqueta BadRange e
exibida uma caixa de mensagem. A caixa de dilogo permanece aberta
para que o usurio possa selecionar outra faixa.
Usando mltiplos conjuntos de Botes de opo
A Figura 18-7 mostra uma caixa de dilogo personalizada com trs
conjuntos de botes de opo. Se o seu UserForm contiver mais do que
um conjunto de botes, assegure-se de que cada conjunto trabalhe
como um grupo. Voc pode fazer isso em uma de duas maneiras:
ExcelVBABokks.indb 302 15/02/2013 14:00:16
Captulo 18: Tcnicas e Truques do UserForm 303
5 Organize cada conjunto de botes em um controle Quadro. Essa
abordagem a mais fcil, e tambm faz a caixa de dilogo parecer
mais organizada. mais fcil acrescentar o quadro antes de
adicionar os botes. No entanto, voc tambm pode arrast-los
para um quadro.
5 Assegure-se de que cada conjunto de botes tenha uma nica
propriedade GroupName (que voc especifica na caixa
Propriedades). Se os botes estiverem em um quadro, voc no
precisa se preocupar com a propriedade GroupName.
Apenas um boto de opo de cada grupo pode ter o valor True. Para
especificar uma opo padro a um conjunto de botes, basta configurar a propriedade Value no item Default para True. Isso pode ser feito
diretamente na caixa Propriedades ou usando cdigo VBA:
UserForm1.OptionButton1.Value = True
Este exemplo est disponvel no site deste livro. Ele tambm contm o
cdigo que exibe as opes selecionadas quando o usurio clicar OK.
Utilizando um Boto de Rotao e uma
Caixa de Texto
Um controle Boto de rotao permite que o usurio especifique um
nmero, clicando setas. Esse controle consiste apenas em setas (sem
texto), portanto voc quer um mtodo para exibir o nmero selecionado. Uma opo usar um controle Rtulo, mas isso tem uma desvantagem: o usurio no pode digitar texto em um rtulo. Uma escolha
melhor usar uma caixa de texto.
Um controle Boto de rotao e um controle Caixa de texto formam um par
natural, e o Excel os usa frequentemente. Por exemplo, verifique a caixa de
Figura 18-7:
Esta caixa
de dilogo
contm trs

conjuntos de
botes de
opo.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 303 15/02/2013 14:00:16
304 Parte IV: Como se Comunicar com Seus Usurios
dilogo Configurar pgina do Excel quanto a alguns exemplos. De preferncia, Botes de rotao e Caixa de texto esto sempre em sincronia: se o
usurio clicar no boto, o seu valor deve aparecer na caixa de texto. E se
o usurio entrar com um valor diretamente na caixa de texto, o boto de
rotao assumir aquele valor. A Figura 18-8 mostra uma caixa de dilogo
personalizada com um boto de rotao e uma caixa de texto.
Este UserForm contm os seguintes controles:
5 Um boto de rotao chamado SpinButton1, com a sua
propriedade Min configurada para 1 e sua propriedade Max
configurada para 100.
5 Uma caixa de texto chamada TextBox1.
5 Um boto de comando chamado OKButton.
A seguir, o procedimento que lida com eventos para o boto de rotao.
Este procedimento lida com o evento Change, que disparado sempre
que o valor do boto de rotao alterado. Quando esse valor mudar
(quando ele for clicado), este procedimento designa o seu valor ao
TextBox. Para criar este procedimento, clique duas vezes no boto de
rotao, para ativar a janela de cdigo do UserForm. Depois, entre com
este cdigo:
Private Sub SpinButton1_Change()
TextBox1.Text = SpinButton1.Value
End Sub
O controlador de eventos da caixa de texto, que listado a seguir, um
pouco mais complicado. Para criar este procedimento, clique duas
vezes na caixa para ativar a janela de cdigo do UserForm. Este procedimento executado sempre que o usurio mudar o texto na caixa.
Private Sub TextBox1_Change()
Dim NewVal As Integer
NewVal = Val(TextBox1.Text)
If NewVal >= Spinbutton1.Min And _
NewVal <= SpinButton1.Max Then _
SpinButton1.Value = NewVal
End Sub
Figura 18-8:
Um UserForm
com um
boto de
rotao e
uma
companheira,
a Caixa de
texto.
ExcelVBABokks.indb 304 15/02/2013 14:00:16
Captulo 18: Tcnicas e Truques do UserForm 305
Este procedimento usa uma varivel, a qual armazena o texto na caixa
de texto (convertido para um valor com a funo Val). Depois, ele
verifica se o valor est dentro da faixa adequada. Se assim for, o boto
de rotao recebe o valor no TextBox. O efeito que o valor do boto

sempre igual ao valor da caixa (supondo que o valor do boto esteja na


faixa apropriada).
Se voc usar F8 para uma nica etapa atravs do cdigo no modo de
depurao, notar que quando a linha SpinButton.Value = NewVal
executada, o evento change do boto de rotao dispara imediatamente.
Por outro lado, o evento SpinButton1_Change configura o valor da caixa de
texto1. Por sorte, isso no dispara o evento TextBox1_Change, pois o seu
valor no , de fato, alterado pelo evento SpinButton1_Change. Mas, voc
pode imaginar que este efeito pode causar resultados surpreendentes em
seu UserForm. Confuso? Lembre-se apenas que se o seu cdigo mudar o
valor de um controle, o evento Change daquele controle disparar.
Este exemplo est disponvel no site deste livro. H tambm alguns
sinos e apitos que voc pode julgar teis.
Usando um UserForm como um indicador
de progresso
Uma das perguntas mais comuns em programao de Excel que escuto :
Como posso exibir o progresso da execuo de uma macro comprida?
Resposta: Use um UserForm para criar um atraente indicador de
progresso, conforme mostrado na Figura 18-9. No entanto, o uso de
caixas de dilogo exige alguns truques que estou prestes a mostrar
para voc.
P
A
P
O
D
E
E
S
P
E
C
IALIS
T
A
Figura 18-9:
Este
UserForm
funciona
como um
indicador de
progresso
para uma
macro longa.
ExcelVBABokks.indb 305 15/02/2013 14:00:16
306 Parte IV: Como se Comunicar com Seus Usurios
Criando o indicador de progresso na caixa de dilogo
O primeiro passo criar o seu UserForm. Neste exemplo, a caixa de
dilogo exibe o progresso enquanto uma macro insere nmeros aleatrios em 100 colunas e 1.000 linhas da atraente planilha. Para criar a
caixa de dilogo, siga estas etapas:
1. Ative o VBE e insira um novo UserForm.
2. Mude a legenda do UserForm para Progress.
3. Acrescente um objeto Quadro e configure as seguintes propriedades:
Propriedade Valor
Caption 0%
Name FrameProgress

SpecialEffect 2 fmSpecialEffectSunken
Width 204
Height 28
4. Adicione um objeto Rtulo dentro do quadro e configure as
seguintes propriedades:
Propriedade Valor
Name LabelProgress (Progresso de
Etiqueta)
BackColor &H000000FF& (red)
Caption (sem legenda)
SpecialEffect 1 fmSpecialEffectRaised
Width 20
Height 13
Top 5
Left 2
5. Acrescente outro Rtulo no quadro e mude a sua propriedade
Caption para Entering random numbers
O UserForm deve se parecer com a Figura 18-10.
(figura)
Os procedimentos
Figura 18-10:
O indicador
de progresso
de UserForm.
ExcelVBABokks.indb 306 15/02/2013 14:00:16
Captulo 18: Tcnicas e Truques do UserForm 307
Os procedimentos
Este exemplo usa dois procedimentos e um mdulo de nvel varivel.
5 O mdulo de nvel varivel. Localizado em um mdulo VBA.
Essa varivel contm a cpia do formulrio de usurio:
Dim ProgressIndicator as UserForm1
5 EnterRandomNumbers. Ele faz todo o trabalho e executado
quando o UserForm exibido. Observe que ele chama o
procedimento UpdateProgress, que atualiza o indicador de
progresso na caixa de dilogo:
Sub EnterRandomNumbers ()
Insere nmeros aleatrios na planilha de trabalho ativa
Dim Counter As Long
Dim RowMax As Long, ColMax As Long
Dim r As Long, c As Long
Dim PctDone As Single
CCria uma cpia do formulrio em uma varivel
Set ProgressIndicator = New UserForm1
Mostra ProgressIndicator em estado sem modo
ProgressIndicator.Show vbModeless
If TypeName(ActiveSheet) <> Worksheet Then
Unload ProgressIndicator
Exit Sub
End If
Insira os nmeros aleatrios
Cells.Clear
Counter = 1
RowMax = 200
ColMax = 50
For r = 1 To RowMax
For c = 1 To ColMax
Cells, c) = Int(Rnd * 1000)
Counter = Counter + 1
Next c

PctDone = Counter / (RowMax * ColMax)


Call UpdateProgress(PctDone)
Next r
Unload ProgressIndicator
Set ProgressIndicator = Nothing
End Sub
5 UpdateProgress. Este procedimento aceita um argumento e
atualiza o indicador de progresso na caixa de dilogo:
Sub UpdateProgress(pct)
With ProgressIndicator
.FrameProgress.Caption = Format(pct, 0%)
.LabelProgress.Width = pct*(.FrameProgress _
ExcelVBABokks.indb 307 15/02/2013 14:00:16
308 Parte IV: Como se Comunicar com Seus Usurios
.Width 10)
End With
A declarao DoEvents atualiza o formulrio
DoEvents
End Sub
Como este exemplo funciona
Quando o procedimento EnterRandomNumbers executado, ele carrega
uma cpia do UserForm1 no mdulo varivel chamado ProgressIndicator.
Depois, ele configura a largura do rtulo LabelProgress para 0 e exibe o
UserForm na posio Modeless (de modo que o cdigo continuar a rodar).
O procedimento EnterRandomNumber verifica a planilha ativa. Se ela
no for uma planilha, o UserForm (ProgressIndicator) fechado, e o
procedimento termina sem ao. Se a planilha ativa uma planilha, o
procedimento faz o seguinte:
1. Apaga todas as clulas na planilha ativa.
2. Faz loops atravs das linhas e colunas (especificadas pelas
variveis RowMax e ColMax) e insere um nmero aleatrio.
3. Aumenta a varivel Counter e calcula a porcentagem completa (que
armazenada na varivel PctDone).
4. Chama o procedimento UpdateProgress, o qual exibe a porcentagem completa, mudando a largura da etiqueta LabelProgress e
atualizando a legenda do controle de quadro.
5. Por fim, o UserForm fechado.
Claro que usar um indicador de progresso far a sua macro rodar um
pouco mais lentamente, pois o cdigo est fazendo trabalho adicional,
atualizando o UserForm. Se a velocidade for absolutamente crtica,
pense duas vezes em usar um indicador de progresso.
Se voc adaptar esta tcnica para o seu prprio uso, precisa descobrir
como determinar o progresso da macro, que varia dependendo de sua
macro. Depois, chame o procedimento UpdateProgress a intervalos
regulares enquanto a sua macro estiver executando.
Este exemplo est disponvel no site deste livro.
Criao de uma caixa de dilogo Multi-pgina
Caixas de dilogo em mltiplas pginas so teis, pois elas permitem que
voc apresente informaes em pequenas e organizadas pores. A caixa
de dilogo Formatar Clulas do Excel (que exibida quando voc clica
com o boto direito em uma clula e escolhe Formatar Clulas) um bom
ExcelVBABokks.indb 308 15/02/2013 14:00:16
Captulo 18: Tcnicas e Truques do UserForm 309
exemplo. A caixa de dilogo, neste exemplo usa, trs pginas para ajudar
a organizar algumas opes de exibio do Excel.
Criar as suas prprias caixas de dilogo multi-pginas relativamente
fcil, graas ao controle Multi-pginas. A Figura 18-11 mostra uma caixa
de dilogo personalizada que usa um controle Multipgina com trs
pginas. Quando o usurio clicar uma pgina, a nova pgina ativada e
apenas os controles a ela relacionados so exibidos.

Observe que esta uma caixa de dilogo modeless. Em outras palavras,


o usurio pode mant-la exibida enquanto estiver trabalhando. Cada
um dos controles tem um efeito imediato, portanto, no necessrio
ter um boto OK.
Tenha em mente os seguintes pontos ao usar o controle Multipginas
para criar uma caixa de dilogo:
5 Use apenas um controle Multi-pginas por caixa de dilogo.
5 Assegure-se de usar o controle Multipgina, no o controle
TabStrip. O controle TabStrip mais difcil de usar.
5 Para tornar alguns controles (tais como os botes OK, Cancelar
ou Fechar) visveis o tempo todo, coloque esses controles fora
do controle Multi-pgina.
5 Clique com o boto direito em uma pgina no controle para
exibir um menu de atalho que permite acrescentar, remover,
renomear ou mover a pgina.
Figura 18-11:
As trs
pginas de
um controle
Multi-pgina.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 309 15/02/2013 14:00:17
310 Parte IV: Como se Comunicar com Seus Usurios
5 Por ocasio do projeto, clique em uma pgina para ativ-la.
Depois que ela estiver ativada, adicione outros controles
pgina usando os procedimentos normais.
5 Para selecionar o prprio controle Multipgina (ao invs de
uma pgina no controle), clique a margem do controle. Fique de
olho na janela Propriedades, que exibe o nome e o tipo do
controle selecionado. Voc tambm pode selecionar o controle
selecionando o seu nome a partir da lista drop-down na janela
Propriedades.
5 Voc pode mudar a aparncia do controle, alterando as
propriedades Style e TabOrientation.
5 A propriedade Value de um controle Multi-pginas determina
qual pgina exibida. Por exemplo, se voc escrever um cdigo
e configurar a propriedade Value para 0, a primeira pgina do
controle exibida.
Este exemplo est disponvel no site deste livro.
Exibindo um gr co em um UserForm
Se voc precisa exibir um grfico em um UserForm, descobre que o
Excel no oferece qualquer maneira direta de faz-lo. Portanto, voc
precisa ser criativo. Esta seo descreve uma tcnica para permitir que
voc exiba um ou mais grficos em um UserForm.
A Figura 18-12 mostra um exemplo, que exibe trs grficos. O UserForm
tem um controle Imagem. O truque usar cdigo VBA para salvar o
grfico como um arquivo GIF (Graphic User Interface) e, depois,
especificar qual arquivo tem a propriedade Picture do controle Imagem
(que carrega a imagem do seu disco). Os botes Previous e Next trocam
o grfico exibido.
Figura 18-12:
Exibindo
um grfico
em um

UserForm.
ExcelVBABokks.indb 310 15/02/2013 14:00:17
Captulo 18: Tcnicas e Truques do UserForm 311
Neste exemplo, que tambm est disponvel no site deste livro, os trs
grficos esto em uma planilha chamada Charts. Os botes Previous e
Next determinam qual grfico exibir, e o nmero desse grfico armazenado como uma varivel Public chamada ChartNum, que acessvel
a todos os procedimentos. Um procedimento chamado UpdateChart,
que listado aqui, faz o verdadeiro trabalho.
Private Sub UpdateChart()
Dim CurrentChart As Chart
Dim Fname As String
Set CurrentChart = _
Sheets(Charts).ChartObjects(ChartNum).Chart
CurrentChart.Parent.Width = 300
CurrentChart.Parent.Height = 150
Salva o grfico como GIF
Fname ThisWorkbook.Path & \temp.gif
CurrentChart.Export FileName:=Fname, _
FilterName:=GIF
Mostra o grfico
Image1.Picture = LoadPicture(Fname)
End Sub
Este procedimento determina um nome para o grfico salvo e depois,
usa o mtodo Export para exportar o arquivo GIF. Finalmente, ele usa a
funo VBA LoadPicture para especificar a propriedade Picture do
objeto Image.
Uma Lista de Veri cao
de Caixa de Dilogo
Eu concluo este captulo com uma lista de verificao para usar ao criar
caixas de dilogo:
Os controles esto alinhados entre si?
Os controles similares tm o mesmo tamanho?
Os controles esto igualmente espaados?
A caixa de dilogo tem uma legenda adequada?
A caixa de dilogo est muito pesada? Se estiver, voc pode querer
usar uma srie de caixas de dilogo ou dividi-las por um controle
Multi-pgina.
O usurio pode acessar cada controle com uma tecla de atalho?
H teclas de atalho repetidas?
Os controles esto agrupados logicamente, por funo?
ExcelVBABokks.indb 311 15/02/2013 14:00:17
312 Parte IV: Como se Comunicar com Seus Usurios
A ordem de tabulao est configurada corretamente? O usurio
deve ser capaz de tabular atravs da caixa de dilogo e acessar
controles sequencialmente.
Se voc planeja armazenar a caixa de dilogo em um add-in, voc a
testou cuidadosamente depois de criar o add-in?
O seu cdigo VBA agir de forma apropriada se o usurio cancelar a
caixa de dilogo, pressionar Esc ou usar o boto de fechar?
O texto contm qualquer erro de ortografia? Infelizmente, o corretor do Excel no funciona com UserForms, assim, voc est por sua
conta quando se trata de escrever corretamente.
A sua caixa de dilogo caber na tela na resoluo mais baixa que
for usada (normalmente, no modo 800x600)? Em outras palavras, se
voc desenvolver sua caixa de dilogo usando um modo de vdeo
de alta resoluo, a sua caixa de dilogo pode ser grande demais
para caber em uma tela de resoluo mais baixa.
Todas as caixas de texto tm a configurao apropriada de validao? Se voc pretende usar a propriedade WordWrap, a proprieda-

de MultiLane tambm est configurada para True?


Todas as barras de rolagem e botes de rotao permitem apenas
valores vlidos?
Todos as caixas de listagem tm sua propriedade MultiSelect
configurada adequadamente?
A melhor maneira de administrar caixas de dilogo personalizadas
criar caixas de dilogo muitas delas. Comece simplesmente e experimente com os controles e suas propriedades. E no se esquea do
sistema de ajuda: ele a sua melhor fonte de detalhes sobre cada
controle e propriedade.
ExcelVBABokks.indb 312 15/02/2013 14:00:17


Neste Captulo
Uma espiada na personalizao da Faixa de Opes usando XML
Adicionando itens a um menu de clicar com o boto direito
Como adicionar um boto barra de ferramentas de acesso rpido (manualmente)
Personalizando a Faixa de Opes (manualmente)
Como Acessar suas Macros
atravs da Interface
de Usurio
Captulo 19
A
ntes do Excel 2007, os usurios tinham acesso a dezenas de barras
de ferramentas integradas, e a criao de novas barras de ferramentas foi repentina. Porm, como escreveu Bob Dylan, Os tempos
esto mudando. Este captulo descreve o que mudou, comeando com
o Excel 2007, e mostra um pouco do que voc pode fazer para exibir
suas macros na interface de usurio.
O Que Aconteceu com CommandBars?
Ao programar em Excel 2003 e antes, voc escrevia cdigo para criar uma
barra de ferramentas (chamada de CommandBar em VBA). A barra de
ferramentas continha botes, para permitir ao usurio (ou a voc
mesmo) acessar suas macros. Alm disso, voc podia usar o objeto
CommandBar para adicionar novos comandos aos menus do Excel. A
partir do Excel 2007, a nova interface de usurio, a Faixa de Opes
(Ribbon), que muda drasticamente o quadro. So boas e ms notcias.
A boa notcia que a maioria do antigo cdigo de CommandBar escrito
em VBA ainda funcionar.
A m notcia que o seu cdigo VBA bem refinado, que tenta criar uma
barra de ferramentas ou acrescentar um comando a um menu interceptado pelo Excel. Ao invs de exibir o aperfeioamento bem pensado
de sua interface, o Excel 2007 (e o Excel 2010) simplesmente move os
seus menus e barras de ferramentas personalizadas para um tabulador
da Faixa de Opes que engloba tudo, chamado Add-Ins.
ExcelVBABokks.indb 313 15/02/2013 14:00:17
314 Parte IV: Como se Comunicar com Seus Usurios
Personalizao da Faixa de Opes
Quase tudo o que escrevi neste livro aplica-se tanto ao Excel 2007
quanto ao Excel 2010. Estou para apresentar uma diferena
significativa entre essas duas verses, e ela envolve personalizar a
Faixa de opes.
Se voc usa o Excel 2007, tem uma maneira de personalizar a Faixa de
opes: aprenda a escrever cdigo RibbonX e adicione a modificao a
uma pasta de trabalho. Essa no uma tarefa simples, como ver mais
adiante. Mas, se usar o Excel 2010, voc tambm pode modificar a Faixa
de opes manualmente, usando a guia Personalizar Faixa de Opes
da caixa de dilogo Opes do Excel.
Voc no pode fazer alteraes ao Ribbon usando VBA. Triste, mas
verdade. Por exemplo, se voc escrever um aplicativo e quiser acres-

centar alguns novos botes ao Ribbon, precisa de um programa que


faa mudanas fora do Excel, usando algo chamado RibbonX.
Como personalizar manualmente a Faixa
de Opes
fcil fazer alteraes manualmente Faixa de Opes, mas voc deve
usar o Excel 2010. Se usar Excel 2007, simplesmente pule esta seo,
porque ela no se aplica a voc.
possvel personalizar a Faixa de Opes destas maneiras:
5 Guias
Adicione uma nova guia personalizada.
Apague guias personalizadas.
Adicione um novo grupo guia.
Mude a ordem das guias.
Mude o nome de uma guia.
Oculte guias integradas.
5 Grupos
Adicione novos grupos personalizados.
Adicione comandos a um grupo personalizado.
Remova comandos dos grupos personalizados.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 314 15/02/2013 14:00:17
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio 315
Remova grupos de uma guia.
Mova um grupo para uma guia diferente.
Mude a ordem dos grupos dentro de uma guia.
Mude o nome de um grupo.
Esta uma lista bem compreensvel de opes de personalizao, mas
h algumas aes que voc no pode fazer (no importa quanto tente):
5 Voc no pode remover guias integradas - mas pode ocult-las.
5 Voc no pode remover comandos de grupos integrados.
5 Voc no pode mudar a ordem de comandos em um grupo integrado.
Voc faz mudanas manuais Faixa de Opes no painel Personalizar
Faixa de Opes da caixa de dilogo Opes do Excel (veja a Figura
19-1). A maneira mais rpida de exibir esta caixa de dilogo clicar com
o boto direito em qualquer lugar na Faixa de Opes e escolher
Personalizar Faixa de Opes.
O processo de personalizar a Faixa de Opes muito similar a personalizar a barra de ferramentas de Acesso Rpido, que descrito mais
adiante neste captulo. A nica diferena que voc precisa decidir se
coloca o comando dentro da Faixa de Opes. O procedimento geral :
Figura 19-1:
A guia
Personalizar
Faixa de
Opes da
caixa de
dilogo
Opes do
Excel.
ExcelVBABokks.indb 315 15/02/2013 14:00:17
316 Parte IV: Como se Comunicar com Seus Usurios
1. Use a lista drop-down esquerda (chamada como Escolher comandos
em) para exibir vrios grupos de comandos.
2. Localize o comando na caixa de listagem e selecione-o.

3. Use a lista drop-down direita (chamada como Personalizar a


Faixa de Opes) para escolher um grupo de guias. Guias Principais refere-se s guias que esto sempre visveis; Guias de Ferramenta refere-se s guias de contexto que aparecem quando um
objeto em especial selecionado.
4. Na caixa de listagem direita, selecione a guia e o grupo onde voc
gostaria de colocar o comando. Voc precisar clicar nos controles
e no sinal de adio para expandir as listas hierrquicas.
5. Clique no boto Adicionar para adicionar o comando selecionado
da esquerda para o grupo direita.
Tenha em mente que voc pode usar o boto Nova Guia para criar uma
nova guia, e o boto Novo Grupo para criar um novo grupo dentro de
uma guia. As novas guias e grupos recebem nomes genricos, portanto,
possivelmente voc ir querer dar a eles nomes mais significativos. Use
o boto Renomear para renomear a guia ou grupo selecionado. Tambm
possvel renomear guias e grupos integrados.
Embora voc no possa remover uma guia integrada, pode ocultar a
guia, desmarcando a caixa de verificao prxima ao seu nome.
Por sorte, tambm possvel acrescentar macros Faixa de Opes.
Escolha Macros a partir da lista drop-down esquerda, e todas as
macros atualmente disponveis so relacionadas, prontas para serem
adicionadas Faixa de Opes.
Se voc personalizar a Faixa de Opes para incluir uma macro, o
comando macro fica visvel na Faixa de Opes, mesmo quando a pasta
de trabalho que contm a macro no estiver aberta. Clicar o comando
abrir a pasta de trabalho que contm a macro.
Personalizando a Faixa de Opes com XML
Em algumas situaes, voc pode querer modificar automaticamente a
Faixa de Opes, quando uma pasta de trabalho ou add-in estiver
aberto. Fazer isso facilita ao usurio acessar a sua macro. Isso tambm
elimina a necessidade do usurio de modificar manualmente a Faixa de
Opes, usando a caixa de dilogo Opes do Excel.
Fazer alteraes automticas na Faixa de Opes pode ser feito com o
Excel 2007 e o Excel 2010, mas no fcil. Modificar a Faixa de Opes
envolve escrever cdigo XML (Extensible Markup Language) em um
editor de texto, copiar aquele arquivo XML no arquivo da pasta de
trabalho, editar um punhado de arquivos XML (que tambm so
afastados dentro do novo formato de arquivo do Excel, o que, de fato,
nada mais do que um continer compactado de arquivos individuais
mas relacionados) e, depois, escrever procedimentos VBA para lidar
com o clique dos controles que voc pe no arquivo XML.
L
E
M
B
R
E
-SE
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 316 15/02/2013 14:00:18
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio 317
Se voc quiser acompanhar o exemplo de personalizao da Faixa de Opes, precisa fazer o
download de um pequeno programa chamado Custom UI Editor (Editor de Interface de
Usurio

Personalizada) para o Microsoft Office. Esse um programa gratuito que simplifica


enormemente o processo de personalizar a Faixa de Opes nos aplicativos do Microsoft Office.
Usar esse
software ainda requer muito trabalho, mas muito mais fcil do que fazer manualment
e
Enquanto eu escrevia isto, o software estava disponvel aqui:
http://openxmldeveloper.org/articles/customuieditor.aspx
Se esta URL no funcionar, busque na Web por Custom UI Editor for Microsoft Office e
voc encontrar o software. Ele tem um pequeno download e gratuito.
Obtenha o software
Felizmente, o software est disponvel para ajud-lo com a personalizao da Faixa de Opes mas, voc ainda precisa conhecer termos
com XML.
Explicar todos os detalhes intrnsecos envolvidos em personalizar a Faixa
de Opes est bem alm do escopo deste livro. Entretanto, eu o encaminho atravs de um rpido exemplo que demonstra as etapas exigidas para
acrescentar um novo grupo guia Pgina Inicial. O novo grupo chamado
de Excel VBA Para Leigos e contm um boto Click Me. Clicar tal boto
roda uma macro VBA chamada ShowMessage.
Voc pode fazer o download desse exemplo a partir do site deste livro,
que contm esta personalizao. Se voc quiser cri-la sozinho, siga
exatamente estas etapas:
1. Crie uma nova pasta de trabalho Excel.
2. Salve a pasta de trabalho e nomeie como ribbon modification.xlsm.
3. Feche a pasta de trabalho. Esta etapa muito importante.
4. Inicie o Custom UI Editor do Microsoft Office. Se no tiver esse
software, voc precisa encontr-lo e instal-lo. Consulte o tpico
Obtenha o software, anteriormente neste captulo.
5. No Custom UI Editor, escolha File Open e encontre a pasta de
trabalho que voc salvou na Etapa 2.
6. Escolha Insert Office 2007 Custom UI Part. Escolha o respectivo
comando se voc estiver usando Excel 2010.
7. Digite o seguinte cdigo no painel de cdigo (chamado
customUI.xml), exibido no Custom UI Editor (veja a Figura 19-2):
ExcelVBABokks.indb 317 15/02/2013 14:00:18
318 Parte IV: Como se Comunicar com Seus Usurios
<customUI xmlns=http://schemas.microsoft.com/
office/2006/01/customui>
<ribbon>
<tabs>
<tab idMso=TabHome>
<group id=Group1 label=Excel VBA For Dummies>
<button id=Button1
label=Click Me
size=large
onAction=ShowMessage
imageMso=FileStartWorkflow />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
8. Clique o boto Validate na barra de ferramentas. Se o cdigo
tiver quaisquer erros de sintaxe, voc receber uma mensagem
que descreve o problema. Se quaisquer erros forem identificados, voc precisa corrigi-los.
9. Clique o boto Generate Callback.
CustonUI Editor cria um procedimento VBA Sub que executado

quando o boto clicado (veja a Figura 19-3). Na verdade, esse


procedimento no inserido na pasta de trabalho, assim, voc
precisa copi-lo para uso posterior (ou memoriz-lo, se tiver uma
boa memria).
10. Volte para o mdulo customUI.xml e escolha File Save (ou
clique o cone Save na barra de ferramentas).
11. Feche o arquivo usando o comando File Close.
12. Abra a pasta de trabalho no Excel. Clique na Guia Pgina Inicial
e voc dever ver um novo grupo na Faixa de Opes e um
boto Ribbon. Mas, ainda no funciona.
13. Pressione Alt+F11 para ativar o VBE.
14. Insira um novo mdulo VBA e cole (ou digite) o procedimento
que foi gerado na Etapa 9. Acrescente uma declarao MsgBox,
assim voc saber se o procedimento est, de fato, sendo
executado. O procedimento :
Sub ShowMessage(control As IribbonControl)
MsgBox Congrats. You found the new ribbon
command.
End Sub
15. Pressione Alt+F11 para pular de volta para o Excel. Clique o
novo boto da Faixa de Opes. Se tudo correu bem, voc ver a
MsgBox mostrada na Figura 19-4.
ExcelVBABokks.indb 318 15/02/2013 14:00:18
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio
Figura 19-3:
O procedimento VBA
de teste que
executado
clicando no
boto da
Faixa de
Opes.
Figura 19-4:
Prova de
que, de fato,
possvel
adicionar um
comando na
Faixa de
Opes
usando XML.
Figura 19-2:
Cdigo
RibbonX
exibido no
Custom UI
Editor.
ExcelVBABokks.indb 319 15/02/2013 14:00:18
320 Parte IV: Como se Comunicar com Seus Usurios
No Custom UI Editor, quando voc escolhe InserOffice 2007 Custom UI
Part, voc insere uma parte UI (Interface de Usurio) do Excel 2007. O
Custom UI Editor tambm tem essa opo para o Excel 2010. Se escolher
essa opo, a modificao da Faixa de Opes no funcionar no Excel
2007. Alm disso, voc precisa especificar um Namespace diferente na
primeira declarao XML:
<customUI xmlns=http://schemas.microsoft.com/
office/2009/07/customUI>
Voc s precisa inserir uma parte UI no Excel 2010 se usar recursos que
so especficos para o Excel 2010. Tambm possvel ter uma parte UI

319

para cada verso, mas isso raramente necessrio.


Provavelmente, voc notou que fazer modificaes na Faixa de Opes
usando XML no exatamente intuitivo. Mesmo com uma boa ferramenta de ajuda (tal como o Custom UI Editor), voc ainda precisa
entender XML. Se isso parece atraente, verifique as livrarias. Voc
encontrar livros dedicados exclusivamente personalizao da
interface da Faixa de Opes do Microsoft Office. Este no um deles.
Se voc criar uma macro que usa com frequncia,
pode querer acrescentar um novo boto barra
de ferramentas de Acesso Rpido. Fazer isso
fcil, mas voc deve faz-lo manualmente. A barra
de ferramentas de Acesso Rpido destina-se a ser
personalizada apenas pelos usurios finais no
programadores. Eis como fazer:
1. Clique com o boto direito na barra de ferramentas de Acesso Rpido e selecione
Personalizar Barra de Ferramentas de
Acesso Rpido para exibir a respectiva guia
na caixa de dilogo Options (Opes) do
Excel. No Excel 2007, essa guia chamada
de Personalizar.
2. Na lista drop-down chamada como Escolher
comandos em, selecione Macros.
3. Selecione da lista a sua macro.
4. Clique o boto Adicionar e a macro acrescentada lista da barra de ferramentas de
Acesso Rpido, direita.
5. Se voc quiser, clique o boto Modificar
para mudar o cone e (opcionalmente) o
nome a exibir.
Se voc usa o Excel 2007, o boto da barra de
ferramentas de Acesso Rpido s funciona
quando a pasta de trabalho que contm a macro estiver aberta. Pior ainda, a macro s funciona quando aquela pasta de trabalho for
uma pasta de trabalho ativa. Porm, esses
problemas foram corrigidos no Excel 2010.
Quando voc clica um boto de macro na barra de ferramentas de Acesso Rpido, a pasta de
trabalho que contm a macro aberta (se j
no estiver aberta). E a macro pode ser executada quando qualquer pasta de trabalho estiver aberta.
O Excel 2010 tambm tem uma opo para exibir o boto da barra de ferramentas de Acesso
Rpido apenas quando uma pasta de trabalho
em especial estiver aberta. Antes de voc
acrescentar a macro, use a lista drop-down
direita da caixa de dilogo Opes do Excel, e
especifique o nome da pasta de trabalho, ao
invs de Para todos Documentos (Padro).
Se voc tiver macros que so usadas em muitas
pastas de trabalho diferentes, uma boa ideia
armazen-las em sua Personal Macro Workbook.
Acrescentando um boto barra de
ferramentas de Acesso Rpido
L
E
M
B

R
E
-SE
ExcelVBABokks.indb 320 15/02/2013 14:00:18
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio 321
Como essa coisa de XML complexa demais para o programador VBA
iniciante, o restante deste captulo aborda a personalizao da UI
(Interface de Usurio) usando o antigo mtodo (apenas VBA). Ele no
to esperto quanto a Faixa de Opes, mas muito mais fcil e ainda
oferece acesso rpido s suas macros.
Personalizando Menus de Atalho
Antes do Excel 2007, os programadores de VBA usavam o objeto
CommandBar para criar menus personalizados, barras de ferramentas
personalizadas e menus de atalho (a partir do boto direito) personalizadas.
Comeando com o Excel 2007, o objeto CommandBar est em uma
posio bastante estranha. Se voc escrever cdigo para personalizar um
menu ou uma barra de ferramentas, o Excel intercepta aquele cdigo e
ignora muitos de seus comandos. Como observei anteriormente neste
captulo, as personalizaes de menu e barra de ferramentas acabam em
Add-InsMenu Commands ou no grupo Add-InsCustom Toolbars.
Assim, em todos os objetivos prticos, voc est limitado aos menus de
atalho. E isso que discuto nas seguintes sees.
Comandando a coleo de CommandBars
O Excel suporta trs tipos de CommandBars, diferenciados pela sua
propriedade Type. Para os menus de atalho, voc est interessado no
tipo 2, tambm conhecido pelo seu nome enquanto constante integrada, msoBarTypePopup.
Listando todos os menus de atalho
O procedimento relacionado aqui usa a coleo CommandBars. Ele
exibe, em uma planilha, os nomes de todos os menus de atalho
CommandBars que tm uma propriedade Type de 2 (msoBarType
Popup). Para cada CommandBar, o procedimento lista o seu ndice e nome.
Sub ShowShortcutMenusName()
Dim Row As Long
Dim cbar As CommandBar
Row = 1
For Each cbar In Application.commandBars
If cbar.Type = msoBarTypePopup then
Cells(Row, 1) = cbar.Index
Cells(Row, 2) = cbar.Name
Row = Row + 1
End If
Next cbar
End Sub
ExcelVBABokks.indb 321 15/02/2013 14:00:19
322 Parte IV: Como se Comunicar com Seus Usurios
A Figura 19-5 mostra uma parte do resultado obtido ao executar esse
procedimento, que est disponvel no Web site deste livro. Por exemplo, voc v que o menu de atalho chamado Workbook Tabs tem um
ndice de 34. Este o menu de atalho que aparece quando voc clica
com o boto direito sobre uma guia da planilha.
Referncia a CommandBars
Voc pode se referir a um CommandBar em especial pelo seu ndice ou
pelo seu nome. Se olhar a Figura 19-5, ver que o menu acessvel pelo
boto direito Cell tem um ndice de 35 ou 38. Isso porque o contedo
desse menu difere quando o Excel est em uma posio diferente. O
nmero 35 o que voc obtm quando o Excel est em seu modo de
visualizao Normal, o nmero 38 mostra quando voc est no modo
Visualizao de Quebra de Pgina. Voc pode fazer referncia ao menu
de atalho em qualquer de duas maneiras:

Application.CommandBars(35)
ou
Application.commandBars(Cell)
Ainda que haja duas Clulas CommandBars, a segunda linha de cdigo
acima sempre encaminha aquela com o ndice 35. Por algum motivo, a
Macrosoft no consistente na nomeao de CommandBars. Voc
poderia esperar que cada CommandBar tivesse o seu prprio nome, mas
obviamente, eles no tm. Os menus acessveis pelo boto direito que
Figura 19-5:
Uma macro
VBA produziu
esta lista de
todos os
nomes de
menus de
atalho.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 322 15/02/2013 14:00:19
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio 323
diferem em contedo dependendo da posio em que o Excel est
aparecem mais de uma vez na lista de CommandBars disponveis.
Voc poderia pensar que melhor fazer referncia a CommandBars
usando sua propriedade Index. Errado! Mas, at isso pode causar
problemas, porque os nmeros do Index nem sempre permaneceram
constantes atravs das diferentes verses do Excel. Na verdade, a
propriedade Index pode at variar dentro de uma nica verso do Excel.
Referncia a controles em um CommandBar
Um objeto CommandBar contm controles, que so botes, menus ou
itens de menu. O seguinte procedimento exibe a propriedade Caption
para o primeiro controle no menu de clula acessvel pelo boto direito:
Sub ShowCaption()
MsgBox Application.CommandBars(Cell). _
Controls(1).Caption
End Sub
Quando voc executa este procedimento, v a caixa de mensagem
mostrada na Figura 19-6. O e comercial (&) usado para indicar a
letra sublinhada no texto o toque de teclado que executar o item
do menu.
Em alguns casos, objetos Control em um menu de atalho contm outros
objetos Control. Por exemplo, o controle Sort, obtido ao clicar com o boto
direito nas clulas contm outros controles.
Cada controle tem uma propriedade Name e uma Id. Voc pode acessar
um controle usando qualquer dessas propriedades (mas localizar um
controle pela sua Id um pouco mais complexo):
Sub AccessControlByName()
MsgBox CommandBars(Cell).Controls(Copy).Caption
End Sub
Sub AccessControlById()
MsgBox CommandBars(Cell).FindControl(ID:=19).Caption
End Sub
Figura 19-6:
Exibindo a
propriedade
Caption em

um controle.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 323 15/02/2013 14:00:19
324 Parte IV: Como se Comunicar com Seus Usurios
No use a propriedade Caption para acessar um controle se estiver
escrevendo cdigo que pode ser utilizado por usurios com uma verso
de linguagem diferente de Excel. Caption uma linguagem especfica,
portanto, o seu cdigo falhar nos sistemas daqueles usurios. Ao invs
disso use o mtodo FindControl junto com a Id do controle (que
independe de linguagem). Felizmente, os nomes de CommandBar no
so internacionalizados.
Propriedades de controles CommandBar
Os controles CommandBar tm uma srie de propriedades que determinam
aspectos como a aparncia e o funcionamento dos controles. Esta lista
contm algumas das propriedades mais teis dos controles CommandBars:
5 Caption: O texto exibido para o controle. Se o controle s
mostrar uma imagem, Caption aparece quando voc move o
mouse sobre o controle.
5 FaceID: Um nmero que representa uma imagem grfica exibida
prxima ao texto do controle.
5 BeginGroup: True se aparecer uma barra de separao antes
do controle.
5 OnAction: O nome de uma macro VBA que executa quando o
usurio clica o controle.
5 BuiltIn: True se o controle for um controle integrado do Excel.
5 Enabled (habilitado): True se o controle puder ser clicado.
5 Visible: True se o controle for visvel. Muitos dos menus de
atalho contm controles ocultos.
5 ToolTipText: Texto que aparece quando o usurio move o cursor
do mouse sobre o controle.
O procedimento ShowShortcutMenuItems lista todos os controles de
primeiro nvel em cada menu de atalho. Alm disso, ele identifica
controles ocultos, colocando suas Legendas entre colchetes.
Sub ShowShortcutMenuItems()
Dim Row As Long, Col As Long
Dim Cbar As CommandBar
Dim Ctl As CommandBarControl
Row = 1
Application.ScreenUpdating = False
For Each Cbar In Application.CommandBars
If Cbar.Type = msoBarTypePopup then
Cells(Row, 1) = Cbar.Index
Cells(Row, 2) = Cbar.Name
Col = 3
For Each Ctl In Cbar.Controls
C
U
I
D
A
D
O!
ExcelVBABokks.indb 324 15/02/2013 14:00:19

Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio


If Ctl.Visible Then
Cells(Row, Col)= Ctl.Caption
Else
Cells(Row, Col)= < & Ctl.Caption & >
End If
Col = Col + 1
Next Ctl
Row = Row + 1
End If
Next Cbar
End Sub
A Figura 19-7 mostra uma parte da sada.
O procedimento ShowShortcutMenuItems est disponvel no site deste
livro. Se voc rodar a macro, poder ver que muitos dos menus de
atalho contm controles ocultos.
Esta foi uma viso geral rpida de CommandBars. Claro que h muito
mais sobre CommandBars, mas o mximo em que posso ir neste livro.
A prxima seo oferece alguns exemplos que podem ajudar a esclarecer qualquer confuso que voc tenha feito.
Com a introduo da nova interface de usurio, a Faixa de Opes
muita coisa mudou. Algumas das mudanas so para melhor e algumas
so para pior. As possibilidades de conseguir controle sobre a interface
de usurio usando apenas VBA agora so muito limitadas.
Figura 19-7:
Listagem de
todos os
controles de
alto nvel em
todos os
menus de
atalho.
ExcelVBABokks.indb 325 15/02/2013 14:00:20
326 Parte IV: Como se Comunicar com Seus Usurios
Exemplos de Menu de Atalho VBA
Esta seo contm alguns exemplos do uso de VBA para manipular os
menus obtidos com o boto direito do mouse normalmente conhecidos como menus de atalho. Esses exemplos do uma ideia dos tipos de
coisas que voc pode fazer e todos eles podem ser modificados para se
adequar s suas necessidades.
Reconfigure todos os menus integrados de clicar com o boto direito. O
seguinte procedimento reconfigura todas as barras de ferramentas
integradas sua posio original:
Sub ResetAll()
Dim cbar As CommandBar
For Each cbar In Application.CommandBars
If cbar.Type = msoBarTypePopup Then
cbar.Reset
cbar.Enabled = True
End If
Next cbar
End Sub
Este procedimento no ter efeito a menos que algum tenha executado
algum cdigo VBA que adicione itens, remova itens ou desative menus
de atalho.
Adicionando um novo item ao menu de
atalho Cell
No Captulo 16, descrevi o utilitrio Change Case. Voc pode aperfeioar um pouco esse utilitrio, tornando-o disponvel a partir do menu de
atalho da clula.

325

Este exemplo est disponvel no site deste livro.


O procedimento AddToShortcut acrescenta um novo item ao menu de
atalho. Lembre-se que o Excel tem dois menus de atalho para clulas.
Este procedimento modifica o menu normal, mas no o menu que
aparece no modo Visualizao de Quebra de Pgina.
Sub AddToShortcut()
Dim Bar As CommandBar
Dim NewControl As CommandBarButton
DeleteFromShortcut
Set Bar = Application.CommandBars(Cell)
(Type:=msoControlButton, ID:=1, _
temporary:=True)
With NewControl
.Caption = &Change Case
ExcelVBABokks.indb 326 15/02/2013 14:00:20
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio
.OnAction = ChangeCase
.Style = msoButtonIconAndCaption
End With
End Sub
Quando voc modifica um menu de atalho, essa modificao tem efeito
at voc reiniciar o Excel. Em outras palavras, menus de atalho modificados no se reconfiguram quando voc fecha a pasta de trabalho que
contm o cdigo VBA. Portanto, se escrever cdigo para modificar um
menu de atalho, quase sempre voc escreve cdigo para inverter o
efeito de sua modificao.
O procedimento DeleteFromShortcut remove o novo item de menu.
Sub DeleteFromShortcut()
On Error Resume Next
Application.CommandBars(Cell).Controls _
(&Change Case).Delete
End Sub
A Figura 19-8 mostra o novo item do menu exibido depois de clicar uma
clula com o boto direito.
O primeiro comando depois da declarao de um par de variveis
chama o procedimento DeleteFromShortcut. Essa declarao garante
que apenas um item Change case aparece no menu de atalho. Tente
comentar essa linha (ponha um apstrofo no incio da linha) e rode o
procedimento algumas vezes agora, no se entusiasme! Clique uma
clula com o boto direito e poder ver mltiplas cpias do item de
L
E
M
B
R
E
-SE
Figura 19-8: O
menu de
atalho Cell
(Clula)
exibindo um
item do menu
personalizado.
ExcelVBABokks.indb 327 15/02/2013 14:00:20
328 Parte IV: Como se Comunicar com Seus Usurios
menu Change Case. Livre-se de todas as entradas, executando
DeleteFromShortcut vrias vezes (uma vez para cada item extra
do menu).
Por fim, voc precisa de uma maneira para acrescentar o item de menu

327

de atalho quando a pasta de trabalho estiver aberta, e apagar o item de


menu quando a pasta de trabalho for fechada. Fazer isso fcil se
voc leu o Captulo 11. Basta adicionar dois procedimentos de evento
ao mdulo de cdigo ThisWorkbook:
Private Sub Workbook_Open()
Call AddToShortcut
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call DeleteFromShortcut
End Sub
O procedimento Workbook_Open executado quando a pasta de
trabalho est aberta, e o procedimento Workbook_BeforeClose executado antes da pasta de trabalho ser fechada. Exatamente o que o mdico
recomendou.
Desativando um menu de atalho
Se tiver inclinao, voc pode desativar um menu de atalho inteiro. Por
exemplo, pode faz-lo para exibir o menu de atalho ao clicar com o
boto direito em uma clula. O seguinte procedimento, que executado
automaticamente quando a pasta de trabalho aberta, desativa o menu
de atalho de clula:
Private Sub Workbook_Open()
Application.CommandBars(Cell).Enabled = False
End Sub
E aqui est o procedimento companheiro dele, que habilita o menu de
atalho quando a pasta de trabalho fechada.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.CommandBars(Cell).Enabled = True
End Sub
Tenha em mente que mudanas a CommandBars so permanentes. Se
voc no executar o procedimento para habilitar o menu de atalho, tal
menu de atalho no estar disponvel at voc reiniciar o Excel. O
procedimento ResetAll, mencionado anteriormente neste captulo,
mostra como voc consegue que todos os seus CommandBars voltem
s suas posies originais.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 328 15/02/2013 14:00:20
Captulo 19: Como Acessar suas Macros atravs da Interface de Usurio 329
Criando uma Barra de Ferramentas
Personalizadas
Se voc verificou todos os CommandBars disponveis, pode ter notado
um chamado Built-in Menus (Menus Integrados). Esse CommandBar
contm todos os comandos do antigo Excel 2003. A Figura 19-9 mostra
parte desse enorme menu pop-up (instantneo). Todos os antigos
comandos esto l, mas eles no esto muito bem organizados.
Neste exemplo, apresento um procedimento VBA que (de certa forma) cria a
barra de menu do antigo Excel 2003. Ele cria um novo CommandBar e depois,
copia os controles Built-in Menus do CommandBar.
Sub MakeOldMenus()
Dim cb As CommandBar
Dim cbc As CommandBarControl
Delete, se existir
On Error Resume Next
Application.CommandBars(Old Menus).Delete
On Error GoTo 0

crie uma barra de ferramentas em estilo antigo


Configure a ltima declarao para Falsa para um menu
mais compacto
Set OldMenu = Application.CommandBars.Add
_(Old Menus, , True)
Copie os controles dos menus do Excel
shortcut menu
With CommandBars(Built-in Menus)
Figura 19-9:
Exibindo o
menu de
atalho
Built-in
Menus.
ExcelVBABokks.indb 329 15/02/2013 14:00:20
330 Parte IV: Como se Comunicar com Seus Usurios
.Controls(&Arquivo).Copy OldMenu
.Controls(&Editar).Copy OldMenu
.Controls(&Exibir).Copy OldMenu
.Controls(&Inserir).Copy OldMenu
.Controls(&Formatar).Copy OldMenu
.Controls(&Ferramentas).Copy OldMenu
.Controls(&Dados).Copy OldMenu
.Controls(&Janela).Copy OldMenu
.Controls(&Ajuda).copy OldMenu
End With
Torne visvel. Aparece nas abas inseridas
Application.CommandBars(Old Menus).Visible = True
End Sub
A Figura 19-10 mostra o resultado de rodar o procedimento
MakeOldMenus. Observe que ele aparece no grupo Custom ToolBars
(Barras de Ferramentas Personalizadas) da guia Add-Ins. Afinal, este
menu uma barra de ferramentas. Ele apenas parece um menu.
O novo CommandBar chamado de Old Menus. O procedimento
comea apagando aquela barra de ferramentas, se ela ainda existir.
Depois, o cdigo copia os controles de alto nvel do CommandBar
chamado Built-in Menus para Old Menus CommandBar. Por padro, um
novo CommandBar est oculto, assim, a declarao final o torna visvel.
O novo menu do sistema no perfeito. Alguns comandos no
funcionam. Voc perceber tambm que os arquivos recentes no menu
Arquivo s mostram contentores de lugar. Para se livrar da barra de
ferramentas, clique-a com o boto direito e escolha Delete Custom
Toolbar.
Este exemplo est disponvel no site do livro.
Figura 19-10:
Uma barra
de ferramentas fingindo
ser o menu
do sistema
do Excel
2003.
ExcelVBABokks.indb 330 15/02/2013 14:00:20
Juntando Tudo
Parte V
Por Rich Tennant
A 5 Onda
De acordo com os seus sintomas fsicos atuais,
voc car careca antes de car gordo.
EXCESSO DE PLANILHAS

ExcelVBABokks.indb 331 15/02/2013 14:00:21


Nesta parte...
O
s 19 captulos anteriores abrangem um bom
punhado de material. A essa altura, voc ainda
pode se sentir um pouco desarticulado sobre toda a
coisa de VBA. Os captulos nesta parte preenchem os
espaos e juntam tudo. Voc aprende como incluir os
seus prprios botes personalizados na interface de
usurio do Excel. Eu discuto sobre funes personalizadas de planilha (um recurso muito til), descrevo
add-ins, ofereo mais exemplos de programao e
encerro com uma discusso de aplicativos orientados por usurio.
ExcelVBABokks.indb 332 15/02/2013 14:00:21


Neste Captulo
Como saber porque funes personalizadas de planilha so to teis
Explorando funes que usam vrios tipos de argumentos
Como entender a caixa de dilogo Inserir Funo
Como Criar Funes
de Planilha e Viver
para Contar
Captulo 20
P
ara muitas pessoas, o principal atrativo do VBA a capacidade de
criar funes personalizadas de planilha funes que parecem,
funcionam e se acreditam exatamente como aquelas que a Microsoft
integrou ao Excel. Uma funo personalizada oferece a vantagem adicional de trabalhar exatamente como voc quer que ela faa (porque voc
a escreveu). Apresentei funes personalizadas no Captulo 6. Neste
captulo, eu me aprofundo e descrevo alguns truques do negcio.
Por Que Criar Funes Personalizadas?
Sem dvida voc est familiarizado com as funes de planilha do Excel
mesmo os iniciantes em Excel sabem como usar funes comuns de
planilha, tais como Soma, Mdia e SE. Pelas minhas contas, o Excel 2007
contm mais de 350 funes de planilha pr-definidas, e o Excel 2010
acrescenta mais umas 50. E se isso no for suficiente, voc pode criar
funes usando o VBA.
Com todas as funes disponveis em Excel e VBA, voc pode imaginar
por que precisaria criar funes. A resposta: para simplificar o seu
trabalho. Com um pouco de planejamento, funes personalizadas so
muito teis em frmulas de planilha e procedimentos VBA. Por exemplo, com frequncia, voc pode encurtar significativamente uma
frmula, criando uma funo personalizada. Afinal, frmulas mais
curtas so mais legveis e mais fceis para trabalhar.
ExcelVBABokks.indb 333 15/02/2013 14:00:21
334 Parte V: Juntando Tudo
Quando voc desenvolve funes personalizadas para usar em suas frmulas de planilha, im
portante que voc entenda um ponto chave. Os procedimentos Function de
planilha VBA so
essencialmente passivos. Por exemplo, o cdigo dentro de um procedimento Function
no pode
manipular faixas, mudar formatao ou fazer muitas outras coisas que so po
ssveis com um
procedimento Sub. Um exemplo pode ajudar.
Pode ser til criar uma funo que mude a cor de texto em uma clula, com
base no valor da

clula. No entanto, mesmo tentando, voc no pode escrever tal funo. Ela sempre retorna
um
erro de valor.
Lembre-se apenas disto: uma funo usada em uma frmula de planilha retorna um valor e
la
no executa aes com objetos.
Dito isto, h algumas excees a essa regra. Por exemplo, eis um procedime
nto Function que
muda o texto em um comentrio de clula:
Function ChangeComment(cell, NewText)
cell.Comment.Text NewText
End Function
E eis a frmula que usa a funo. Ela supe que a clula A1 j tem um comen
trio. Quando a
frmula calculada, o comentrio alterado.
=ChangeComment (A1, I changed the comment!)
Eu no tenho certeza se isso um descuido ou um recurso. Mas, um exe
mplo raro de uma
funo VBA que muda alguma coisa em uma planilha.
O que funes personalizadas de planilha podem fazer
Como Entender os Princpios Bsicos
de Funo VBA
Hora de uma rpida reviso. Uma funo VBA um procedimento que
armazenado em um mdulo VBA. Voc pode usar essas funes em
outros procedimentos VBA ou em suas frmulas de planilha.
Um mdulo pode conter qualquer quantidade de funes. Voc pode usar
uma funo personalizada em uma frmula exatamente como se ela fosse
uma funo integrada. Mas, se a funo for definida em uma pasta de
trabalho diferente, voc deve preceder o nome da funo com o nome da
pasta de trabalho. Por exemplo, digamos que voc desenvolveu uma
funo chamada DiscountPrice (que toma um argumento) e a funo est
armazenada em uma pasta de trabalho chamada pricing.xlsm.
Para usar essa funo na pasta de trabalho pricing.xlsm, entre com uma
frmula como esta:
=DiscountPrice(A1)
Se voc quiser usar essa funo em uma pasta de trabalho diferente,
entre com uma frmula tal como esta:
=pricing.xlsm!discountprice(A1)
ExcelVBABokks.indb 334 15/02/2013 14:00:21
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 335
Se a funo personalizada estiver armazenada em um add-in, voc no
precisa preceder o nome da funo com o nome da pasta de trabalho.
Eu discuto add-ins no Captulo 21.
As funes personalizadas aparecem na caixa de dilogo Inserir Funo, na
categoria User Defined (Definido por Usurio). Pressionar Shift+F3 uma
maneira de exibir a caixa de dilogo Inserir Funo.
Escrevendo Funes
Lembre-se que o nome de uma funo age como uma varivel. O valor
final dessa varivel o valor retornado pela funo. Para demonstrar,
examine a seguinte funo, a qual retorna o primeiro nome do usurio:
Function FirstName()
Dim FullName As String
Dim FirstSpace As Integer
FullName = Application.UserName
FirstSpace = InStr(FullName, )
If FirstSpace = 0 then
FirstName = FullName
Else
FirstName = Left(FullName, FirstSpace 1)
End If

End Function
Esta funo comea designando a propriedade UserName do objeto
Application a uma varivel chamada FullName. Em seguida, ela usa a
funo VBA InStr, para localizar o primeiro espao no nome. Se no
houver espao, FirstSpace igual a 0, e FirstName igual ao nome
inteiro. Se FullName no tiver um espao, a funo Left extrai o texto
para a esquerda do espao e o atribui a FirstName.
Observe que FirstName o nome da funo e tambm usado como
um nome varivel na funo. O valor final de FirstName o valor
retornado pela funo. Vrios clculos intermedirios podem estar
acontecendo na funo, porm, ela sempre retorna o ltimo valor
designado varivel, que igual ao nome da funo.
Todos os exemplos deste captulo esto disponveis no site deste livro.
Trabalhando com Argumentos de Funo
Para trabalhar com funes, voc precisa entender como trabalhar com
argumentos. Os seguintes pontos aplicam-se aos argumentos para as
funes de planilha do Excel e funes VBA personalizadas.
D
I
C
A
ExcelVBABokks.indb 335 15/02/2013 14:00:21
336 Parte V: Juntando Tudo
5 Argumentos podem ser referncias a clulas, variveis
(incluindo arrays), constantes, valores literais ou expresses.
5 Algumas funes no tm argumentos.
5 Algumas funes tm um nmero fixo de argumentos exigidos
(de 1 a 60).
5 Algumas funes tm uma combinao de argumentos exigidos
e opcionais.
Exemplos de Funo
Os exemplos nesta seo demonstram como trabalhar com os vrios
tipos de argumentos.
Uma funo sem argumento
Como procedimentos sub, procedimentos Function no precisam ter
argumentos. Por exemplo, o Excel tem algumas funes de planilha integradas que no usam argumentos, incluindo Aleatrio, Hoje e Agora.
Eis um exemplo de uma funo sem argumentos. A seguinte funo
retorna a propriedade UserName do objeto Application. O nome do
usurio aparece na guia Geral da caixa de dilogo Opes do Excel (no
Excel 2007, ela chamada de guia Popular). Este exemplo simples, mas
til, mostra a nica maneira pela qual voc pode conseguir que o nome
do usurio aparea em uma clula de planilha:
Function User()
Retorna o nome do usurio atual
User = Application.UserName
End Function
Quando voc entra com a seguinte frmula em uma clula de planilha, a
clula exibe o nome do usurio atual:
=User()
Tal como acontece com as funes integradas do Excel, voc deve incluir
parnteses vazios ao usar uma funo sem argumentos. Caso contrrio, o
Excel tenta interpretar a funo como uma faixa nomeada.
Uma funo com um argumento
A funo de argumento nico nesta seo destina-se aos gerentes de
vendas que precisam calcular as comisses de seus vendedores. A taxa
de comisso depende do volume mensal de vendas; aqueles que
vendem mais ganham uma taxa mais, alta de comisso. A funo
ExcelVBABokks.indb 336 15/02/2013 14:00:22
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 337

retorna o valor da comisso com base nas vendas mensais (que o


nico argumento da funo um argumento exigido). Os clculos
neste exemplo so baseados na Tabela 20-1.
Tabela 20-1
Taxas de Comisso por Vendas
Vendas Mensais Taxa de Comisso
$0-$9.999 8.0%
$10.000-$19.999 10.5%
$20.000-$39.999 12.0%
$40.000+ 14.0%
Voc pode usar vrias abordagens para calcular comisses para os
valores de vendas inseridos em uma planilha. Voc poderia escrever
uma longa frmula de planilha, tal como esta:
=SE(E(A1>=0;A1<=9999.99);A1*0;08;IF(E(A1>=10000;
A1<=19999.99);A1*0.105;SE(E(A1>=20000;A1<=39999.99);
A1*0;12;SE(A1>=40000;;A1*9.14;0))))
Vrias razes tornam isso uma pssima abordagem. Primeiro, a frmula
excessivamente complexa. Segundo, os valores so codificados com
dificuldade na frmula, tornando-a difcil de modificar caso a estrutura
de comisso mude.
Uma abordagem melhor criar uma tabela de valores de comisso e
usar a funo de planilha PROCV para calcular as comisses:
=PROCV(A;Table;2)*A1
Uma outra abordagem, que no requer uma tabela de comisses, criar
uma funo personalizada:
Function Commissuin(Sales)
Calcula as comission de vendas
Const Tier1 As Double = 0.08
Const Tier1 As Double = 0.105
Const Tier3 As Double = 0.12
Const Tier4 As Double = 0.14
Select Case Sales
Case 0 To 999.99: Commission = Sales * Tier1
Case 10000 To 19999.00: Commission = Sales * Tier2
Case 20000 To 39999.99: Commission = Sales * Tier3
Case Is >= 40000: Commission = Sales * Tier4
End Select
Commission = Round(Commission, 2)
End Function
ExcelVBABokks.indb 337 15/02/2013 14:00:22
338 Parte V: Juntando Tudo
Observe que as quatro taxas de comisso so declaradas como constantes, ao invs de cdigo difcil. Isso facilita muito modificar a funo
se as taxas de comisso mudarem.
Depois de definir essa funo em um mdulo VBA, voc pode us-la em
uma frmula de planilha. Entrar com a frmula a seguir em uma clula
produz um resultado de 3.000. A quantia de 25000 qualifica para uma
taxa de comisso de 12 por cento:
=Commission(25000)
A Figura 20-1 mostra uma planilha que usa a funo Commission em
frmulas na coluna C.
Uma funo com dois argumentos
O seguinte exemplo se baseia no anterior. Imagine que o gerente de
vendas implemente uma nova poltica para recompensar funcionrios
antigos: o total da comisso paga aumenta em 1% por cada ano que o
vendedor est na empresa.
Eu modifiquei a funo personalizada Commission (definida na seo
anterior) para que ela tome dois argumentos, sendo que ambos so
argumentos exigidos. Chame esta nova funo de Commission2:
Function Commission2(Sales, Years)
Calcula a comisso de vendas baseada nos anos de

servio
Const Tier1 As Double = 0.08
Const Tier2 As Double = 0.105
Const Tier3 As Double = 0.12
Const Tier4 As Double = 0.14
Figura 20-1:
Usando a
funo
Commission
em uma
planilha.
ExcelVBABokks.indb 338 15/02/2013 14:00:22
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 339
Select Case Sales
Case 0 to 9999.99: Commission2=Sales*Tier1
Case 10000 To 19999.99: Commission2=Sales*Tier2
Case 20000 to 39999.99: Commission2=Sales*Tier3
Case Is>=40000: Commission2=Sales*Tier4
End Select
Commission2=Commission2+(Commission2*Years/100)
Commission2=Round(Commission2, 2)
End Function
Eu apenas adicionei o segundo argumento (Years) declarao Function
(Funo) e inclu um clculo adicional, que ajusta a comisso antes de
encerrar a funo. Esse clculo multiplica a comisso original pelo
nmero de anos de servios, divide por 100 e, depois, acrescenta o
resultado ao clculo original.
Eis um exemplo de como voc pode escrever uma frmula usando esta
funo (ela supe que a quantia de vendas est na clula A1; a clula B1
especifica o nmero de anos que o vendedor trabalhou).
=Commission2(A1;B1)
Uma funo com um argumento faixa
Usar uma faixa de planilha como um argumento no to complicado; o
Excel cuida dos detalhes por trs.
Suponha que voc queira calcular a mdia dos cinco maiores valores
em uma faixa chamada Data (Dados). O Excel no tem uma funo que
possa fazer isso, assim, provavelmente voc escreveria uma frmula:
=(MXIMO(Data;1)+MXIMO(Data;2)+MXIMO(Data;3)+
MXIMO(Data;4)+MXIMO(Data;5))/5
Esta frmula usa a funo Mximo do Excel, a qual retorna o valor mais
alto em uma faixa. A frmula adiciona os cinco maiores valores na faixa
chamada Data e, depois, divide o resultado por 5. A frmula funciona
bem, mas bem pesada. E se voc decidir que precisa computar a
mdia dos seis maiores valores? Precisaria reescrever a frmula e
garantir que atualizaria todas as cpias da frmula.
No seria mais fcil se o Excel tivesse uma funo chamada TopAvg
(mdia mais alta)? Assim, voc computaria a mdia usando a seguinte
(inexistente) funo:
=TopAvg(Data;5)
ExcelVBABokks.indb 339 15/02/2013 14:00:22
340 Parte V: Juntando Tudo
Este exemplo mostra uma situao em que uma funo personalizada
pode tornar as coisas muito mais fceis para voc. A funo VBA a
seguir, chamada TopAvg, retorna a mdia dos maiores valores N em
uma faixa:
Function TopAvg(InRange, N)
Retorna a mdia dos maiores valores de N em
InRange
Dim Sum As Double
Dim I As Long

Sum = 0
For i = 1 To N
Sum = Sum + WorksheetFunction.Large(InRange, i)
Next i
TopAvg = Sum / N
End Function
Esta funo toma dois argumentos: InRange (que uma faixa de planilha) e N (o nmero de valores para tirar a mdia). Ela comea inicializando a varivel Sum para 0. Depois, usa um loop For-Next para calcular a soma dos maiores valores N na faixa. Observe que eu uso a funo
Mximo (Large) do Excel dentro do loop. Por fim, TopAvg atribuda ao
valor de Sum dividido por N.
Voc pode usar todas as funes de planilha do Excel em seus procedimentos VBA, exceto aqueles que tm equivalentes em VBA. Por exemplo, o VBA tem uma funo Rnd, que retorna um nmero aleatrio.
Portanto, voc no pode usar a funo Aleatrio (rand) do Excel em um
procedimento VBA.
Uma funo com um argumento opcional
Muitas funes de planilha integradas do Excel usam argumentos opcionais. Um exemplo a funo LEFT (Esquerda), a qual retorna caracteres
do lado esquerdo de uma string. Em seguida, a sua sintaxe oficial:
ESQUERDA(texto,[nm_corect])
O primeiro argumento exigido, mas o segundo (entre colchetes)
opcional. Se voc omitir o argumento opcional, o Excel assume o valor de
1. Portanto, as seguintes frmulas retornam o mesmo resultado:
=ESQUERDA(A1;1)
=ESQUERDA(A1)
As funes personalizadas que voc desenvolve em VBA tambm
podem ter argumentos opcionais. Voc especifica um argumento
D
I
C
A
ExcelVBABokks.indb 340 15/02/2013 14:00:23
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 341
opcional, precedendo o nome do argumento com a palavra-chave
Optional, seguido por um sinal de igual e o valor padro. Se o argumento opcional estiver faltando, o cdigo usa o valor padro.
O seguinte exemplo mostra uma funo personalizada que usa um
argumento opcional:
Function DrawOne(InRange, Optional Recalc = 0)
Escolhe uma clula aleatoriamente de uma faixa
Randomize
Torna a funo voltil se Recalc igual a 1
If Recalc = 1 Then Application.Volatile True
Determine a random cell
DrawOne = InRange(Int((InRange.Count) * Rnd + 1))
End Function
Esta funo escolhe aleatoriamente uma clula a partir de uma faixa de
entrada. A faixa passada como um argumento , na verdade, um array
(eu explico arrays no Captulo 7), e a funo seleciona, aleatoriamente,
um item do array. Se o segundo argumento for 1, o valor selecionado
muda sempre que a planilha for recalculada (a funo se torna voltil.)
Se o segundo argumento for 0 (ou for omitido), a funo no recalculada, a menos que uma das clulas na faixa de entrada seja modificada.
Depurar um procedimento Function pode
ser um pouco mais desafiador do que depurar um procedimento Sub. Se voc desenvolver uma funo para usar em frmulas
de planilha, descobre que um erro no pro-

cedimento Function, simplesmente resulta


em um erro exibido na clula da frmula
(normalmente #VALUE!). Em outras palavras, voc no recebe uma mensagem normal de erro em tempo de execuo que o
ajuda a localizar a declarao afetada.
Voc pode escolher entre trs mtodos para
depurar funes personalizadas:
5 Coloque as funes MsgBox em lugares estratgicos para monitorar o valor
de variveis especficas. Felizmente, as
caixas de mensagem nos procedimentos Function aparecem quando voc
executa o procedimento. Assegure-se
de que apenas uma frmula na planilha
use a sua funo, ou as caixas de mensagem aparecero em cada frmula
que for avaliada o que poderia ser
bem desagradvel.
5 Teste o procedimento, chamando-o a
partir de um procedimento Sub. Erros
em tempo de execuo aparecem normalmente em uma janela instantnea
(pop-up), e voc pode corrigir o problema (se souber qual ) ou pular direto
para o depurador.
5 Configure um ponto de interrupo na
funo e depois, use o depurador do
Excel para percorrer a funo. Depois,
voc pode acessar todas as ferramentas habituais do depurador. Consulte o
Captulo 13 para mais detalhes sobre o
depurador.
Como depurar funes personalizadas
ExcelVBABokks.indb 341 15/02/2013 14:00:23
342 Parte V: Juntando Tudo
Eu uso a declarao Randomize para garantir que um nmero aleatrio
diferente pr-selecionado seja escolhido cada vez que a pasta de
trabalho for aberta. Sem essa declarao, os mesmos nmeros aleatrios
sero gerados sempre que a pasta de trabalho for aberta.
Voc pode usar essa funo para escolher nmeros da loteria, selecionando um vencedor a partir da lista de nomes, e assim por diante.
Uma funo com um nmero
inde nido de argumentos
Algumas funes de planilha do Excel tomam um nmero indefinido de
argumentos. Um exemplo conhecido a funo SOMA, que tem a
seguinte sintaxe:
SOMA(nm1,nm2...)
O primeiro argumento exigido, mas voc pode ter at 254 argumentos
adicionais. Eis um exemplo de uma funo SOMA com quatro faixas de
argumentos:
=SOMA(A1:A5;C1:C5;E1:E5;G1:G5)
Eis uma funo VBA que pode ter qualquer quantidade de argumentos
de um nico valor. Esta funo no funciona com argumentos de faixa
de mltiplas clulas.
Function Concat(string1, ParamArray string2())
Demonstra um nmero indefinido de declaraes de
funes
Dim Args As Variant
Processa as primeiras declaraes

Concat = string1
Process additional arguments (if any)
If UBound(string2) <> -1 Then
For Args = LBound(string2) To Ubound(string2)
Concat = Concat & & string2(Args)
Next Args
End If
End Function
Esta funo semelhante funo CONCATENAR do Excel, a qual combina
argumentos de texto em uma nica string. A diferena que essa funo
personalizada insere um espao entre cada par de strings concatenadas.
O segundo argumento, string2(), um array precedido pela palavra-chave ParamArray. Se o segundo argumento estiver vazio, a funo
UBound retorna -1 e a funo encerra. Se o segundo argumento no
ExcelVBABokks.indb 342 15/02/2013 14:00:23
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 343
estiver vazio, o procedimento faz loop atravs dos elementos do array
string2 e processa cada argumento adicional. As funes LBound e
UBound determinam o incio e o fim dos elementos do array. Normalmente, o elemento de incio 0, a menos que voc o declare como
alguma outra coisa ou que use uma declarao Option Base 1 no incio
do seu mdulo.
ParamArray s pode ser aplicado ao ltimo argumento no procedimento.
Ele sempre um tipo de dados Variant e sempre um argumento opcional
(ainda que voc no use a palavra-chave Optional). A Figura 20-2 mostra
essa funo em uso. Examine a figura para ver os resultados diferentes
daqueles produzidos pela funo CONCATENAR do Excel, que no
inserem um espao entre os itens concatenados.
Funes Que Retornam um Array
As frmulas de array (arr]anjo: coleo de dados similares armazenados sob o mesmo nome) so um dos recursos mais poderosos do Excel.
Se voc est familiarizado com frmulas de array, ficar feliz em saber
que pode criar funes VBA que retornam um array.
Retornando um array de nomes de meses
Comearei com um simples exemplo. A funo MonthNames retorna um
array de 12 elementos de voc adivinhou nomes de meses.
Function MonthNames()
MonthNames = Array(Janeiro, Fevereiro, Maro, _
Abril, Maio, Junho, Julho, Agosto, _
Setembro, Outubro, Novembro, Dezembro)
End Function
Para usar a funo MonthNames em uma planilha, voc deve entrar
com ela como uma frmula de array de 12 clulas. Por exemplo,
selecione a faixa A1:L1 e entre com =MonthNames(). Depois, use
Ctrl+Shift+Enter para entrar com a frmula de array em todas as 12
clulas selecionadas. A Figura 20-3 mostra o resultado.
L
E
M
B
R
E
-SE
Figura 20-2:
Usando a
funo
Concat em
frmulas
de planilha.
ExcelVBABokks.indb 343 15/02/2013 14:00:23

344 Parte V: Juntando Tudo


Se voc quiser exibir os nomes de meses em uma coluna, selecione 12
clulas em uma coluna e use esta frmula de array (no se esquea de
entrar com ela usando Ctrl+Shift+Enter):
=TRANSPOR(MonthNames())
Retornando uma lista classi cada
Suponha que voc tem uma lista de nomes que deseja mostrar em
ordem classificada em uma outra faixa de clulas. No seria timo ter
uma funo de planilha para fazer isso por voc?
A funo personalizada nesta seo faz exatamente isso: ela toma uma
faixa de clulas de coluna nica como seu argumento e, depois, retorna
um array daquelas clulas classificadas. A Figura 20-4 mostra como
funciona. A faixa A2:A13 contm alguns nomes. A faixa C2:C13 contm
essa frmula de array de mltiplas clulas (lembre-se, a frmula deve
ser inserida pressionando Ctrl+Shift+Enter).
=Sorted(A2:A13)
Eis o cdigo para a funo Sorted:
Function Sorted(Rng As Range)
Dim SortedData() As Variant
Dim Cell As Range
Dim Temp As Variant, i As Long, j As Long
Dim NonEmpty As Long
transfere os dados para SortedData
For Each Cell In Rng
If Not IsEmpty(Cell) Then
NonEmpty = NonEmpty + 1
ReDim Preserve SortedData(1 To NonEmpty)
SortedData(NonEmpty) = Cell.Value
End If
Next Cell
Figura 20-3:
Usando a
funo
MonthNames para
retornar um
array de 12
elementos.
ExcelVBABokks.indb 344 15/02/2013 14:00:24
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 345
Organiza o array
For i = 1 To NonEmpty
For j = i + 1 To NonEmpty
If SortedData(i) > SortedData(j) Then
Temp = SortedData(j)
SortedData(i) = Temp
End If
Next j
Next i
Transporta o array e
Sorted = Application.Transpose(SortedData)
End Function
A funo Sorted comea criando um array chamado SortedData. Esse
array contm todos os valores que no esto em branco na faixa de
argumento. Em seguida, o array SortedData classificado, usando um
algoritmo do tipo bolha. Porque o array um array horizontal, ele deve
ser invertido antes de ser retornado pela funo.
A funo Sorted trabalha com uma faixa de qualquer tamanho, desde
que ela esteja em uma coluna ou linha nica. Se os dados no classificados estiverem em uma linha, a sua frmula precisa usar a funo

TRANSPOR do Excel para exibir horizontalmente os dados classificados. Por exemplo:


=TRANSPOR(Sorted(A16:L:16))
Como Usar a Caixa de Dilogo
Inserir Funo
A caixa de dilogo Inserir Funo do Excel uma ferramenta til que permite
escolher uma funo de planilha a partir de uma lista e solicita que voc
entre com os argumentos da funo. E, como observei anteriormente neste
captulo, as suas funes personalizadas de planilha tambm aparecem
Figura 20-4:
Usando uma
funo
personalizada
para retornar
uma faixa
classificada.
ExcelVBABokks.indb 345 15/02/2013 14:00:24
346 Parte V: Juntando Tudo
nessa caixa de dilogo. Funes personalizadas aparecem na categoria
Definido pelo Usurio.
Os procedimentos Function definidos com a palavra-chave Private no
aparecem na caixa de dilogo Inserir Funo. Portanto, se voc escrever um procedimento Function que se destine a ser usado apenas por
outros procedimentos VBA (mas no em frmulas), voc deve declar-lo como Private.
Exibindo a descrio da funo
A caixa de dilogo Inserir Funo exibe uma descrio de cada funo
integrada. Mas, como voc pode ver na Figura 20-5, uma funo personalizada exibe o seguinte texto como sua descrio: no h ajuda disponvel.
Para exibir uma descrio significativa de sua funo personalizada na
caixa de dilogo Inserir Funo, execute algumas etapas adicionais (no
intuitivas):
1. Ative uma planilha na pasta de trabalho que contm a funo
personalizada.
2. Escolha Desenvolvedor Cdigo Macros (ou pressione Alt+F8).
A caixa de dilogo Macro aparece.
3. No campo Nome de macro, digite o nome da funo.
Observe que a funo no aparece na lista de macros; voc deve
digitar o nome.
4. Clique o boto Opes.
A caixa de dilogo Opes de macro aparece.
D
I
C
A
Figura 20-5:
Por padro,
a caixa de
dilogo
Inserir
Funo no
oferece
uma descrio para
funes
personalizadas.
ExcelVBABokks.indb 346 15/02/2013 14:00:24
Captulo 20: Como Criar Funes de Planilha e Viver para Contar 347
5. No campo Descrio, digite uma descrio da funo.

6. Clique OK.
7. Clique Cancelar.
Agora, a caixa de dilogo Inserir Funo exibe a descrio de sua
funo; veja a Figura 20-6.
Por padro, funes personalizadas so listadas na categoria Definido
pelo Usurio. Para adicionar uma funo a uma categoria diferente,
voc precisa usar o VBA. Esta declarao, quando executada, adiciona
a funo TopAvg categoria Matemtica e Trigonomtrica (que a
categoria #3):
Application.MacroOptions Macro:=TopAvg, Category:=3
Consulte o sistema de ajuda quanto aos nmeros das outras categoria.
E lembre-se, voc s precisa executar essa declarao uma vez. Depois
de execut-la (e salvar a pasta de trabalho), o nmero da categoria
permanentemente designado funo.
Descries de argumento
Quando voc acessar uma funo integrada a partir da caixa de dilogo
Inserir Funo, a caixa de dilogo Argumentos da Funo exibe uma
descrio de cada argumento (veja a Figura 20-7). Se voc usa o Excel
2007, no h uma forma direta de oferecer tais descries s suas
funes personalizadas.
Mas, se voc usa o Excel 2010, um novo recurso permite que voc
especifique descries para as suas funes personalizadas. Isso feito
usando o mtodo MacroOptions. Eis um exemplo que adiciona descries aos argumentos usados pela funo TopAvg:
Figura 20-6:
A funo
personalizada agora
exibe uma
descrio.
D
I
C
A
ExcelVBABokks.indb 347 15/02/2013 14:00:25
348 Parte V: Juntando Tudo
Sub AddArgumentDescriptions()
Application.MacroOptions Macro:=TopAvg, _
ArgumentDescriptions:= _
Array(Faixa que contm os valores, _
Nmero de valores na mdia)
End Sub
Voc s precisa executar este procedimento uma vez. Depois de
execut-lo, as descries do argumento so armazenadas na pasta de
trabalho e so associadas funo.
Note que a descrio do argumento aparece como um argumento para a
funo Array. Voc deve usar a funo Array mesmo se estiver inserindo
uma descrio para uma funo que tenha apenas um argumento.
Este captulo oferece muitas informaes sobre a criao de funes
personalizadas de planilha. Use esses exemplos como modelos quando
criar funes para o seu prprio trabalho. Como sempre, a ajuda online
oferece detalhes adicionais. V para o Captulo 21 se quiser descobrir
como tornar as suas funes personalizadas mais acessveis, armazenando-as em um add-in (suplemento).
Figura 20-7:
Por padro, a
caixa de
dilogo
Argumentos
da funo

exibe
descries
de argumento de funo
apenas para
funes
integradas.
ExcelVBABokks.indb 348 15/02/2013 14:00:25


Neste Captulo
Usando add-ins (suplementos): que conceito!
Saiba por que criar os seus prprios add-ins
Criando add-ins personalizados
Criando Add-Ins do Excel
Captulo 21
U
m dos recursos mais engenhosos do Excel pelo menos na
minha mente a capacidade de criar add-ins (suplementos).
Neste captulo, explico porque eu gosto desse recurso, e mostro como
criar add-ins usando apenas as ferramentas integradas no Excel.
Certo Ento, o Que um Add-In?
O que um add-in? Que bom que voc perguntou. Um add-in do Excel
algo que voc acrescenta para aperfeioar a funcionalidade do Excel.
Alguns add-ins oferecem novas funes de planilha que voc pode usar
em frmulas; outros add-ins fornecem novos comandos ou utilitrios. Se o
add-in for adequadamente projetado, os novos recursos se misturam bem
com a interface original, para que eles paream fazer parte do programa.
O Excel vem com vrios add-ins, incluindo o Pacote de Ferramentas de
Anlise e o Solver. Voc tambm pode conseguir add-ins do Excel de
fornecedores terceirizados ou como shareware (programas que podem ser
usados e copiados livremente). O meu Power Utility Pak um exemplo de
add-in (ele acrescenta cerca de 70 novos recursos ao Excel, mais um
punhado de novas funes de planilha).
Qualquer usurio com conhecimento pode criar add-ins, mas so
exigidas habilidades de programao em VBA. Um add-in do Excel ,
basicamente, uma forma diferente de arquivo de pasta de trabalho
XLSM. Mais especificamente, um add-in uma pasta de trabalho XLSM
normal, com as seguintes diferenas:
5 A propriedade IsAddin do objeto Workbook True.
5 A janela de pasta de trabalho oculta e no pode ser exibida
usando o comando ExibioJanelaReexibir janela.
5 A pasta de trabalho no um membro da coleo Workbooks.
Ao invs disso, ela est na coleo de AddIns.
D
I
C
A
ExcelVBABokks.indb 349 15/02/2013 14:00:25
350 Parte V: Juntando Tudo
Voc pode converter qualquer arquivo de pasta de trabalho em um
add-in, mas nem todas as pastas de trabalho so boas candidatas.
Como os acessrios esto sempre ocultos, voc no pode exibir
planilhas ou planilhas de grficos contidas em um add-in. No entanto,
voc pode acessar os procedimentos Sub e Function VBA de um add-in
e exibir caixas de dilogo contidas em UserForms.
Normalmente, os add-ins do Excel tm uma extenso de arquivo XLAM
para distingui-los dos arquivos de planilha XLSM. Verses anteriores de
Excel criaram add-ins com uma extenso XLA.
Por Que Criar Add-Ins?

Voc poderia resolver converter o seu aplicativo em Excel em um


add-in por qualquer uma das seguintes razes:
5 Dificultar o acesso ao seu cdigo: Quando voc distribui um
aplicativo como um add-in (e protege o seu projeto VBA),
usurios casuais no podem ver as planilhas na pasta de
trabalho. Se voc usar tcnicas proprietrias em seu cdigo
VBA, voc pode dificultar que outros copiem o cdigo. Os
recursos de proteo do Excel no so perfeitos e utilitrios de
invaso de senha esto disponveis.
5 Evitar confuso: Se um usurio carregar o seu aplicativo como
um add-in, o arquivo fica invisvel e, portanto, menos passvel
de confundir usurios iniciantes ou atrapalhar. Diferente de
uma pasta de trabalho oculta, o contedo de um add-in no
pode ser revelado.
5 Simplificar o acesso a funes de planilha: As funes
personalizadas de planilha que voc armazena em um add-in no
requerem o nome qualificador da pasta de trabalho. Por exemplo,
se voc armazenar uma funo personalizada chamada MOVAVG
em uma pasta de trabalho chamada NEWFUNC.XLSM, voc deve
usar sintaxe como a seguinte para usar esta funo em uma
diferente pasta de trabalho:
=NEWFUNC.XLSM!MOVAVG(A1:A50)
Mas se esta funo for armazenada em um arquivo add-in que
est aberto, voc pode usar sintaxe muito mais simples, pois
no precisa incluir referncia ao arquivo:
=MOVAVG(A1:A50)
5 Oferecer acesso mais fcil aos usurios: Depois de identificar a
localizao do seu add-in, ele aparece na caixa de dilogo Add-Ins,
com um nome amistoso e uma descrio do que ele faz.
Facilmente, o usurio pode ativar ou desativar o seu add-in.
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 350 15/02/2013 14:00:25
Captulo 21: Criando Add-Ins do Excel 351
5 Obter mais controle no carregamento: Os add-ins podem ser
abertos automaticamente quando o Excel iniciar, independente
do diretrio em que eles esto armazenados.
5 Evitar exibir solicitaes ao descarregar: Quando um add-in
fechado, o usurio nunca v a caixa de dilogo aparecer
pedindo que voc salve as mudanas no arquivo.
Trabalhando com Add-Ins
Voc carrega e descarrega add-ins usando a caixa de dilogo SuplemenOpes Supletos. Para exibir essa caixa de dilogo, escolha Arquivo
mentos. Depois, selecione Suplementos do Excel da lista drop-down
dessa caixa de dilogo e clique Ir. Se voc estiver usando Excel 2010,
chegar a essa caixa de dilogo um pouco mais fcil: escolha Desenvolve
dor Suplementos Suplementos. Porm, o mtodo mais fcil simplesmente pressionar Alt+MU (o antigo atalho de teclado do Excel 2003).
Qualquer desses mtodos exibe a caixa de dilogo Suplementos,
mostrada na Figura 21-1. A caixa de listagem contm os nomes de todos
os suplementos que o Excel conhece. Nessa lista, marcas de verificao
identificam quaisquer add-ins abertos no momento. Voc pode abrir e
fechar add-ins a partir da caixa de dilogo, selecionando ou desfazendo
a seleo das caixas de verificao.
Voc tambm pode abrir a maioria dos arquivos de add-in (como se

eles fossem arquivos de pasta de trabalho), escolhendo o comando


ArquivoAbrir. Um acessrio aberto dessa maneira no aparece na
caixa de dilogo Suplementos. Alm disso, se o add-in foi aberto usando
o comando Abrir, voc no pode fech-lo escolhendo ArquivoFechar.
Voc s pode remover o add-in saindo e reiniciando o Excel ou escrevendo uma macro para fech-lo.
Figura 21-1:
A caixa de
dilogo
Suplementos
(add-ins)
relaciona
todos os
add-ins
conhecidos
pelo Excel.
C
U
I
D
A
D
O!
ExcelVBABokks.indb 351 15/02/2013 14:00:26
352 Parte V: Juntando Tudo
Quando voc abre um acessrio, pode ou no notar alguma coisa diferente. No entanto, em muitos casos, A Faixa de Opes muda de alguma
maneira o Excel exibe ou uma nova guia ou um ou mais novos grupos
em uma guia existente. Por exemplo, abrir o add-in Ferramentas de Anlise
d a voc um novo item na guia Dados: AnliseAnlise de Dados. Se o
add-in s contiver funes de planilha, as novas funes aparecem na
caixa de dilogo Inserir Funo, e voc no ver alterao na interface de
usurio do Excel.
Princpios Bsicos do Add-In
Embora voc possa converter qualquer pasta de trabalho a um add-in,
nem todas as pastas de trabalho se beneficiam dessa converso. Uma
pasta de trabalho sem macros torna um acessrio completamente intil.
Na verdade, os nicos tipos de pastas de trabalho que se beneficiam de ser
convertidos a um suplemento so os que contm macros. Por exemplo,
uma pasta de trabalho que consiste de macros de objetivo geral (procedimentos Sub e Function) fazem um add-in ideal.
Criar um add-in no difcil, mas exige um pouco de trabalho extra. Use
as seguintes etapas para criar um add-in a partir de um arquivo normal
de pasta de trabalho:
1. Desenvolva o seu aplicativo e assegure-se de que tudo funciona
adequadamente.
No se esquea de incluir um mtodo para executar a macro ou
macros. Voc pode definir uma tecla de atalho ou personalizar, de
alguma maneira, a interface de usurio (veja o Captulo 19). Se o
add-in consistir apenas de funes, no h necessidade de incluir
um mtodo para execut-las, pois elas aparecero na caixa de
dilogo Inserir Funo.
2. Teste o aplicativo, executando-o quando uma pasta de trabalho
diferente estiver ativa.
Fazer isso simula o comportamento do aplicativo quando ele usado
como um add-in, pois um add-in nunca a pasta de trabalho ativa.
3. Ative o VBE e selecione a pasta de trabalho na janela de Projeto;
escolha FerramentasPropriedade de VBA Project e clique a
guia Proteo; selecione a caixa de verificao Bloquear Projeto
Para Exibio e entre com uma senha (duas vezes); clique OK.

Esta etapa s necessria se voc quiser evitar que outros vejam


ou modifiquem as suas macros ou UserForms.
4. No Excel 2010, escolha DesenvolvedorPainel de Documentos.
No Excel 2007, escolha OfficePrepararPropriedades.
O Excel exibe o seu painel Propriedades de Documentos abaixo da
Faixa de Opes .
ExcelVBABokks.indb 352 15/02/2013 14:00:26
Captulo 21: Criando Add-Ins do Excel 353
5. No painel Document Properties, entre com um rpido ttulo
descritivo no campo Ttulo e uma descrio mais longa no
campo Comentrios.
As etapas 4 e 5 no so exigidas, mas tornam o add-in mais fcil de
usar, porque as descries fornecidas aparecem na caixa de
dilogo Add-Ins quando o seu add-in (acessrio) selecionado.
6. Escolha Arquivo Salvar Como.
7. Na caixa de dilogo Salvar Como, selecione a opo Excel
(*.xlam) a partir da lista drop-down Tipo.
8. Especifique a pasta que armazenar o Suplemento.
O Excel prope uma pasta chamada Suplementos, mas voc pode
salvar o arquivo em qualquer pasta que quiser.
9. Clique Salvar.
Uma cpia da sua pasta de trabalho convertida a um add-in e salva
com a extenso XLAM. A sua pasta de trabalho original permanece
aberta.
Um Exemplo de Add-In
Nesta seo, eu discuto as etapas bsicas envolvidas na criao de um
acessrio til. O exemplo baseado no utilitrio de converso de texto
Change Case, que descrevi no Captulo 16.
A verso XLSM deste exemplo est disponvel no site deste livro. Voc
pode criar um acessrio a partir dessa pasta de trabalho.
Con gurando a pasta de trabalho
A pasta de trabalho consiste de uma planilha em branco, um mdulo
VBA e um UserForm. No Captulo 19, eu j acrescentei cdigo pasta de
trabalho que cria um novo item no menu de atalho acessado com o
boto direito nas clulas.
A verso original do utilitrio inclua opes para letra maiscula, letra
minscula e iniciais maisculas. Para a verso de add-in, acrescentei
duas novas opes ao UserForm, para que ele tenha as mesmas opes
que a ferramenta integrada no Microsoft Word:
5 Primeiras em maisculas (de sentena): Torna a primeira letra
maiscula, e todas as outras letras minsculas.
5 Letras invertidas (alternadas): Todos os caracteres em
maisculas so convertidos para minsculas, e vice-versa.
ExcelVBABokks.indb 353 15/02/2013 14:00:27
354 Parte V: Juntando Tudo
A Figura 21-2 mostra o UserForm1. Os cinco botes de opo esto
dentro de um controle Quadro. Alm disso, o UserForm tem um boto
Cancelar (chamado de CancelButton) e um boto OK (chamado de
OKButton).
O cdigo executado quando o boto Cancelar clicado muito simples.
Este procedimento descarrega o UserForm sem ao:
Private Sub CancelButton_Click()
Unload UserForm1
End Sub
A seguir, o cdigo que executado quando o boto OK clicado. Este
cdigo faz todo o trabalho:
Private Sub OKButton_Click()
Dim TextCells As Range
Dim cell As Range
Dim Text As String

Dim i As Long
Cria um objeto com constantes de texto somente
On Error Resume Next
Set TextCells = Selection._
SpecialCells(xlConstants, _
xlTextValues)
Desliga a atualizao de tela
Application.ScreenUpdating = False
Faz o Loop pelas clulas
For Each cell In TextCells
Text = cell.Value
Select Case True
Case OptionLower lowercase
cell.Value = LCase(cell.Value)
Case OptionUpper UPPERCASE
cell.Value = UCase(cell.Value)
Case OptionProper Proper Case
cell.Value = _
WorksheetFunction.Proper(cell.Value)
Figura 21-2:
O UserForm para
o add-in
Change
Case.
ExcelVBABokks.indb 354 15/02/2013 14:00:27
Captulo 21: Criando Add-Ins do Excel 355
Case OptionSentence Sentence case
Text = UCase(Left(cell.Value, 1))
Text = Text & LCase(Mid(cell.Value, 2, _
Len(cell.Value)))
cell.Value = Text
Case OptionToggle TOGGLE CASE
For i = 1 To Len(Text)
If Mid(Text, i, 1) Like [A-z] Then
Mid(Text, i, 1) = LCase(Mid(Text, i, 1))
Else
Mid(Text, i, 1) = UCase(Mid(Text, i, 1))
End If
Next i
cell.Value = Text
End Select
Next
Fecha a caixa de dilogo
Unload UserForm1
End Sub
Alm das duas novas opes, esta verso do utilitrio Change Case difere
da verso no Captulo 16 de outras duas maneiras:
5 Eu uso o mtodo SpecialCells para criar um objeto varivel que consiste
das clulas na seleo que contm uma constante de texto (no uma
frmula). Essa tcnica faz a rotina rodar um pouco mais depressa se a
seleo contiver muitas clulas de frmula. Veja o Captulo 14 para mais
informaes sobre esta tcnica.
5 Acrescentei o item de menu de Change Case aos menus de atalho de
linha e de coluna. Assim, agora voc pode executar o utilitrio
clicando com o boto direito uma seleo de faixa, uma linha inteira
ou um coluna inteira.
Testando a pasta de trabalho
Teste o add-in antes de converter essa pasta de trabalho. Para simular o
que acontece quando a pasta de trabalho um suplemento, voc deve

test-la quando uma pasta de trabalho diferente estiver ativa. Lembre-se,


um add-in nunca uma planilha ativa ou pasta de trabalho, portanto,
test-lo quando uma diferente pasta de trabalho est aberta pode ajud-lo a
identificar alguns erros em potencial.
1. Abra uma nova pasta de trabalho e entre com informaes em
algumas clulas.
Com objetivos de teste, entre com vrios tipos de informaes,
inclusive texto, valores e frmulas. Ou apenas abra uma pasta de
trabalho existente e use-a em seus testes lembre-se de que quaisquer mudanas na pasta de trabalho no podem ser desfeitas,
portanto, voc pode usar uma cpia.
2. Selecione uma ou mais clulas (ou linhas e colunas inteiras).
ExcelVBABokks.indb 355 15/02/2013 14:00:28
356 Parte V: Juntando Tudo
3. Execute a macro ChangeCase, escolhendo o novo comando Change
Case a partir do menu de atalho da clula, linha ou coluna).
Se o comando Change Case no aparecer no menu, o motivo mais
provvel que voc no ativou as macros quando abriu a pasta de
trabalho change case.xlsm. Feche a pasta de trabalho e reabra-a e
assegure-se de ativar as macros.
Como adicionar informaes descritivas
Eu recomendo inserir uma descrio de seu add-in, mas isso no
exigido.
1. Ative a pasta de trabalho change case.xlsm.
2. No Excel 2010, escolha Desenvolvedor Painel de Documentos.
No Excel 2007, escolha Office Preparar Propriedades.
O Excel exibe o painel Propriedades do Documentos acima da
barra de frmula. Veja a Figura 21-3.
3. Entre com um ttulo para o add-in (acessrio) no campo Title (Ttulo).
Esse texto aparece na lista de add-ins na caixa de dilogo Add-Ins.
Para este exemplo, entre com Change Case.
L
E
M
B
R
E
-SE
Figura 21-3:
Use o painel
Propriedades do
Documentos para
entrar com
informaes descritivas sobre
o seu
add-in.
ExcelVBABokks.indb 356 15/02/2013 14:00:28
Captulo 21: Criando Add-Ins do Excel 357
4. No campo Comentrios, adicione uma descrio.
Essas informaes aparecem embaixo da caixa de dilogo Suplementos quando o add-in selecionado. Para este exemplo, digite a
letra do texto nas clulas selecionadas. Acesse este utilitrio
clicando com o boto direito do mouse para abrir o menu de
atalho.
Protegendo o cdigo VBA
Se voc quiser adicionar uma senha para evitar que os outros vejam o

cdigo VBA, siga estas etapas:


1. Ative o VBE e selecione a pasta de trabalho change case.xlsm na
janela de projeto.
2. Escolha Ferramentas Propriedades de VBA Project e clique na
guia Proteo da caixa de dilogo que aparece.
3. Selecione a caixa de verificao Bloquear Projeto para Exibio e
entre com uma senha (duas vezes).
4. Clique OK.
5. Salve a pasta de trabalho, escolhendo Arquivo Salvar do menu do
VBE ou voltando janela do Excel e escolhendo Arquivo Salvar.
Criando o add-in
Nesse ponto, voc j testou o arquivo change case.xlsm e ele est
funcionando corretamente. A prxima etapa criar o add-in (acessrio):
1. Se necessrio, reative o Excel.
2. Ative a pasta de trabalho change case.xlsm e escolha
Arquivo Salvar como.
O Excel exibe a sua caixa de dilogo Salvar Como.
3. No menu drop-down Tipo, selecione Suplemento do Excel (*.xlsm).
4. Especifique o local e clique Salvar.
Um novo arquivo add-in (com uma extenso xlam) criado, e a
verso original em xlsm permanece aberta.
Abrindo o add-in
Para evitar confuso, feche a pasta de trabalho XLSM antes de abrir o
Suplemento que voc criou a partir daquela pasta de trabalho.
ExcelVBABokks.indb 357 15/02/2013 14:00:29
358 Parte V: Juntando Tudo
Abra o add-in com estas etapas:
1. Pressione Alt+MU.
O Excel exibe a caixa de dilogo Suplementos.
2. Clique no boto Procurar.
3. Localize e selecione o add-in que voc acabou
de criar.
4. Clique OK para fechar a caixa de dilogo Procurar.
Depois de encontrar o seu novo suplemento, a caixa de dilogo
Suplementos ir list-la. Conforme mostrado na Figura 21-4, essa
caixa de dilogo tambm exibe as informaes descritivas que
voc forneceu no painel Propriedades de Documentos.
5. Assegure-se de que a caixa de dilogo Add-Ins tenha uma marca
de verificao para o seu novo suplemento.
6. Clique OK para fechar a caixa de dilogo.
O Excel abre o add-in e, agora, voc pode us-lo com todas as suas
planilhas.
Distribuindo o add-in
Se voc estiver se sentindo generoso, pode distribuir esse add-in para
outros usurios do Excel, simplesmente dando a eles uma cpia do
arquivo XLAM (eles no precisam da verso XLSM). Quando eles
abrirem o suplemento, o novo comando Change Case aparecer no
menu de atalho quando eles selecionarem uma faixa, uma ou mais
linhas ou colunas. Se voc bloqueou o projeto VBA com uma senha,
outros usurios no podero ver o seu cdigo de macro (a menos que
eles conheam a senha).
Figura 21-4:
A caixa de
dilogo
Suplementos
tem o novo
suplemento
selecionado.

ExcelVBABokks.indb 358 15/02/2013 14:00:29


Captulo 21: Criando Add-Ins do Excel 359
Como modi car o add-in
Se voc j precisou modificar o acessrio (e protegeu o projeto VBA
com uma senha), precisa desbloque-lo:
1. Abra o seu arquivo XLAM se ele j no estiver aberto.
2. Ative o VBE.
3. Clique duas vezes o nome do projeto na janela de projeto.
Voc solicitado a entrar com a senha.
4. Entre com a sua senha e clique OK.
5. Faa as suas alteraes no cdigo.
6. Salve o arquivo a partir do VBE escolhendo Arquivo Salvar.
Se voc criar um add-in que armazena informaes em uma planilha,
deve configurar a propriedade IsAddIn da pasta de trabalho para False,
para ver a pasta de trabalho. Voc faz isso na janela Propriedade,
quando o objeto ThisWorkbook selecionado (veja a Figura 21-5).
Depois de ter efetuado suas alteraes pasta de trabalho, assegure-se
de configurar a propriedade IsAddIn de volta para True antes de salvar
o arquivo.
Agora voc sabe como trabalhar com add-ins e porque pode querer
criar os seus prprios acessrios.
D
I
C
A
Figura 21-5:
Propriedade
InAddin do
objeto
ThisWorkbook.
ExcelVBABokks.indb 359 15/02/2013 14:00:30
360 Parte V: Juntando Tudo
ExcelVBABokks.indb 360 15/02/2013 14:00:30
A Parte dos Dez
Parte VI
Por Rich Tennant A 5 Onda
Eu nunca vi uma
planilha to cheia
de cor e de dados.
, veja! Olhe
xamente
por bastante tempo para
o centro e ver aparecer
uma imagem em 3D de
um pssaro
voando.
ExcelVBABokks.indb 361 15/02/2013 14:00:30
Nesta parte...
P
or razes histricas assim como teis todos
os livros da srie Para Leigos tm captulos com
listas. Os dois prximos captulos contm as minhas
prprias listas dos dez, que lidam com as perguntas
frequentes e outros recursos.
ExcelVBABokks.indb 362 15/02/2013 14:00:30


Neste Captulo
Armazenando procedimentos de funo de planilha
Limitaes do gravador de macro

Como aumentar a velocidade do seu cdigo VBA


Como declarar variveis explicitamente
Como usar o caractere de continuao de linha do VBA
Dez Perguntas de VBA
(E Respostas)
Captulo 22
A
s seguintes dez perguntas (e respostas) tratam de algumas das
questes mais comuns feitas por recm-chegados ao VBA.
Eu criei uma funo VBA personalizada. Quando tento us-la em uma
frmula, a frmula exibe #NAME?. Qual o erro?
Provavelmente, voc colocou o seu cdigo de funo no lugar errado.
Cdigo VBA para funes de planilha deve estar em um mdulo padro
VBA no em um mdulo para uma planilha ou em ThisWorkbook. No
VBE, use Inserir Mdulo para inserir um mdulo padro. Depois, corte
e cole o seu cdigo para o novo mdulo VBA.
Esse um erro muito comum, pois um mdulo Sheet (folha de planilha) se
parece exatamente com um mdulo padro VBA. Resista tentao de
colocar o seu cdigo l. Perca alguns segundos e escolha Inserir Mdulo.
Posso usar o gravador de macro do VBA para gravar todas as
minhas macros?
S se as suas macros forem bem simples. Em geral, voc s o usa para
gravar macros simples ou como um ponto de partida para uma macro
mais complexa. O gravador de macro no grava macros que usam
variveis, loop ou qualquer outro tipo de programa com montagens em
sequncia. Alm disso, voc no pode gravar um procedimento
Function no gravador de macro do VBA. Infelizmente, o Excel 2007 se
recusa a gravar muitas aes que esto relacionadas a grficos e
formas. Esse descuido foi corrigido no Excel 2010.
ExcelVBABokks.indb 363 15/02/2013 14:00:31
364 Parte VI: A Parte dos Dez
Como eu posso evitar que outros vejam o meu cdigo VBA?
1. Ative o seu projeto no VBE e escolha Ferramentas xxxxx Propriedades.
2. Na caixa de dilogo que aparece, clique na guia Proteo e
selecione Bloquear Projeto para Exibio.
3. Entre com uma senha (duas vezes) e clique OK.
4. Salve a sua pasta de trabalho.
Fazer isso evita que usurios casuais vejam o seu cdigo, mas com
certeza, a proteo de senha no 100% segura. Existem utilitrios de
quebra de senha.
Qual o cdigo VBA para aumentar ou diminuir o nmero de linhas
e colunas em uma planilha?
No existe tal cdigo. O nmero de linhas e colunas fixo e no pode
ser mudado. No entanto, se voc abrir uma pasta de trabalho que tenha
sido criada usando uma verso anterior do Excel (antes do Excel 2007),
o texto Modo de Compatibilidade aparece na barra de ttulo. Essa
informao indica que essa pasta de trabalho limitada antiga grade
de 256-x-65536 clulas. Voc pode se livrar dessas limitaes, salvando
o arquivo como uma pasta de trabalho normal (XLSX ou XLSM) e
depois, fechando e reabrindo esse novo arquivo.
Quando fao referncia a uma planilha em meu cdigo VBA, recebo
um erro subscrito fora do intervalo. Eu no estou usando quaisquer subscries. O que h?
Esse erro acontece se voc tentar acessar um elemento em uma
coleo que no existe. Por exemplo, esta declarao gera o erro se a
pasta de trabalho ativa no contiver uma planilha chamada MySheet:
Set X = ActiveWorkbook.Sheets(MySheet)
No seu caso, a pasta de trabalho que voc pensa que est aberta,
provavelmente no est (assim, no est na coleo Workbooks). Ou,
talvez voc tenha digitado errado o nome da pasta de trabalho.

Existe um comando VBA que seleciona uma faixa da clula ativa at a


ltima entrada em uma coluna ou uma linha? (Em outras palavras,
como uma macro pode conseguir o mesmo que Ctrl+Shift+ ou
Ctrl+Shift+?)
Eis o equivalente VBA a Ctrl+Shift+:
Range(ActiveCell, ActiveCell.End(xlDown)).Select
Para outras direes, use as constantes xlToLeft, xlToRight ou xlUp ao
invs de xlDown.
ExcelVBABokks.indb 364 15/02/2013 14:00:31
Captulo 22: Dez Perguntas de VBA (E Respostas) 365
Como posso fazer o meu cdigo VBA rodar o mais depressa possvel?
Aqui esto algumas dicas:
5 Assegure-se de declarar todas as suas variveis como um tipo
especfico de dados (use Option Explicit na declarao do
mdulo, o que te obrigar a declarar todas as variveis).
5 Se voc fizer referncia a um objeto (tal como uma faixa) mais
de uma vez, crie um objeto varivel usando a palavra-chave Set.
5 Sempre que possvel, use a construo With-End With.
5 Se a sua macro escrever dados para uma planilha e voc tiver
muitas frmulas complexas, configure o modo de clculo para
Manual enquanto a macro rodar (mas certifique-se de fazer um
clculo quando precisar usar os resultados!).
5 Se a sua macro escrever informaes para uma planilha,
desative a atualizao de tela, usando Application.
ScreenUpdating = False.
No se esquea de reintegrar essas duas ltimas configuraes aos
seus valores iniciais quando a sua macro tiver concludo.
Como eu posso exibir mltiplas mensagens em uma caixa de mensagem?
A maneira mais fcil montar a sua mensagem em uma string varivel,
usando a constante vbNewLine para indicar onde voc quer que
ocorram as suas quebras de linhas. O seguinte um rpido exemplo:
Msg = Voc selecionou o seguinte: & vbNewLine
Msg = Msg & UserAns
MsgBox Msg
Eu escrevi algum cdigo que apaga planilhas. Como posso evitar
exibir o aviso do Excel?
Insira esta declarao antes do cdigo que apaga as planilhas:
Application.DisplayAlerts = False
Por que no posso fazer o caractere de continuao de linha (sublinhado) do VBA funcionar?
A sequncia de continuao de linha consiste, na verdade, de dois
caracteres: um espao seguido por um sublinhado. Assegure-se de usar
os dois caracteres e pressionar Enter depois do sublinhado.
ExcelVBABokks.indb 365 15/02/2013 14:00:32
366 Parte VI: A Parte dos Dez
ExcelVBABokks.indb 366 15/02/2013 14:00:33
Captulo 23

Neste Captulo
Como usar o Sistema de Ajuda do VBA
Como conseguir assistncia da Microsoft
Encontrando ajuda online

(Quase) Dez Recursos do Excel
E
ste livro apenas uma introduo programao de Excel VBA. Se
voc estiver com fome de mais informaes, que vontade para
se alimentar com a lista de recursos adicionais que compilei aqui. Voc
pode descobrir novas tcnicas, se comunicar com outros usurios de
Excel, fazer o download de arquivos teis, fazer perguntas, acessar a

extensa Base de Conhecimentos da Microsoft e muito mais.


Vrios desses recursos so servios online ou recursos de Internet, os
quais tendem a mudar frequentemente. As descries so precisas,
enquanto escrevo isto, mas eu no posso garantir que essas informaes permanecero atuais. assim que a Internet funciona.
O Sistema de Ajuda do VBA
Espero que voc j tenha descoberto o sistema de Ajuda do VBA. Eu
acho essa fonte de referncia particularmente til para identificar
objetos, propriedades e mtodos. Ela est prontamente disponvel,
gratuita e (na maior parte do tempo) preciso. Portanto, use-a.
Suporte de Produtos Microsoft
A Microsoft oferece uma ampla variedade de opes de suporte tcnico
(alguns gratuitos, outros por uma taxa). Para acessar os servios de
suporte da Microsoft (incluindo a til base de conhecimento), v para:
http://support.microsoft.com
L
E
M
B
R
E
-SE
ExcelVBABokks.indb 367 15/02/2013 14:00:33
368 Parte VI: A Parte dos Dez
E no se esquea do site do Office da Microsoft, que tem quantidades
de material relacionado ao Excel:
http://office.microsoft.com
Um outro timo recurso o site Microsoft Developer Network (MSDN). Ele
disponibiliza muitas, muitas informaes destinadas ao desenvolvedor (,
este voc!). Aqui est um link para o site principal, onde voc pode
buscar por informaes relacionadas ao Excel:
http://msdn.microsoft.com
Grupos de Notcias da Internet
Os newsgroups (grupos de notcias) da Microsoft so, talvez, o melhor
lugar para ir se voc tem uma dvida. Voc pode encontrar centenas de
grupos de notcias dedicados aos produtos da Microsoft inclusive
uma dzia ou mais de grupos de notcias s para Excel. A melhor
maneira de acessar esses grupos de notcias usando um software
especial de leitura de notcias. Ou, usar o e-mail cliente que vem com o
Windows. Dependendo de sua verso do Windows, ele chamado de
Outlook Express, Windows Mail ou Windows Live Mail. Todos esses
programas permitem que voc se conecte com os grupos de notcias.
Configure o seu software leitor de notcias para acessar o servidor de
notcias em msnews.microsoft.com.
Os grupos mais populares, em ingls, relacionados ao Excel, esto
listados aqui:
microsoft.public.excel.charting
microsoft.public.excel.misc
microsoft.public.excel.printing
microsoft.public.excel.programming
microsoft.public.excel.setup
microsoft.public.excel.worksheet.functions
Se voc preferir acessar os grupos de notcias usando o seu navegador
da Web, h duas opes:
http://microsoft.com/communities/
http://groups.google.com
Sem ao menos saber qual a sua pergunta, estou disposto a apostar
que ela j foi respondida. Para buscar mensagens de grupos de notcias
antigos por palavra-chave, aponte o seu navegador da Web para:
http://groups.google.com

D
I
C
A
ExcelVBABokks.indb 368 15/02/2013 14:00:33
369 Captulo 23: (Quase) Dez Recursos do Excel
Sites da Internet
Vrios sites contm material relacionado ao Excel. Um bom lugar para
comear a sua navegao pela Web pelo meu prprio site, o qual
chamado de The Spreadsheet Page. Depois de chegar l, voc pode
examinar o meu material e visitar a minha seo Resources (recursos), que o leva a dzias de sites relacionados ao Excel. A URL para o
meu site :
http://spreadsheetpage.com
Blogs do Excel
Voc pode encontrar, literalmente, milhes de blogs na Web. Um blog ,
basicamente, um dirio atualizado frequentemente sobre um assunto
em especial. Muitos blogs so dedicados exclusivamente ao Excel. Eu
mantenho uma lista de blogs de Excel em meu site:
http://spreadsheetpage.com/index.php/excelfeeds
Google
Quando eu tenho uma dvida sobre qualquer assunto (inclusive
programao do Excel), a minha primeira linha de ataque o Google
atualmente, o site de busca mais popular do mundo.
http://google.com
Insira alguns termos chave de busca e veja o que o Google encontra. Eu
consigo uma resposta em cerca de 90% das vezes. Se isso falhar, ento
eu procuro nos grupos de notcias (descritos anteriormente), usando
esta URL:
http://groups.google.com
Bing
Bing a resposta da Microsoft ao site de busca Google. Algumas
pessoas o preferem ao Google; outras no. Se voc no tiver experimentado, a URL :
http://bing.com
ExcelVBABokks.indb 369 15/02/2013 14:00:33
370 Parte VI: A Parte dos Dez
Grupos e Usurios Locais
Muitas comunidades maiores e universidades tm um grupo de usurios
de Excel que se encontra periodicamente. Se voc puder encontrar um
grupo de usurios em sua rea, verifique-o. Geralmente, esses grupos so
uma excelente fonte de contatos e compartilhamento de ideias.
Meus Outros Livros
Sinto muito, mas eu no pude resistir oportunidade de uma propaganda descarada. Para levar a programao de VBA ao prximo nvel, d
uma olhada no meu Excel 2007 Power Programming with VBA ou no Excel
2010 Power Programming with VBA (ambos publicados pela Wiley).
ExcelVBABokks.indb 370 15/02/2013 14:00:33

ndice
Smbolos
= (sinal de igual), 109-110
(apstrofe), em comentrios, 95-96
+ (adio), operador de, 110-111
/ (diviso), operador de, 110-111
^ (exponenciao), operador de, 110-111
\ (diviso de inteiro), operador de, 110-111
* (multiplicao), operador de, 110-111
& (concatenao), operador de, 110
- (subtrao), operador de, 110-111

A
aumentando nmero de fileiras/colunas em
uma planilha, 364
abrindo add-ins (acessrios), 351-352
Abs (absoluto), funo, 133
absolute (absoluto), modo (gravador de
macro), 84-85
Accelerator (Acelerador), propriedade, 263,
271
acelerao, teclas de, 263, 285-286
Activate (ativar), evento, 64, 162-163,
170-174
AddinInstall, evento, 162
abrindo, 351-352
Analysis ToolPak (Pacote de Ferramentas de Anlise), 349
carregando, 351
Change Case (Alterar/Mudar Letra),
suplemento, 353-359
cdigo, 350
convertendo arquivos de pasta de
trabalho em um add-in (acessrio),
350
criando/criao, 16, 349-353
definido, 349
descarregando, 351
distribuindo/distribuio, 358
Faixa de Opes, 352
fechando, 351
IsAddin, propriedade, 349
modificando, 359
planilha, funes de, 350
Power Utility Pak, 349
shareware, 349
Solver, 349
Suplementos (add-ins)
terceirizados, fornecedores, 349
AddinUninstall, evento de, 162
Address (endereo), propriedade de
(Objeto Range), 122
vantagens do VBA, 17
esttica de UserForms, 287
adio (+), operador de, 110-111
adicionando. Ver tambm inserindo
faixa de Opes, 16
controles aos UserForms, 254, 256-257,
261-263, 269-270
alerta, mensagens de, 228-229
alertas
desativando avisos de alerta, 365
alerta de segurana, 32
alinhando controles em UserForms, 284-285
Alterando
configuraes, 220-222
controle, propriedades de, 257-258,
270-272
ordem de guia em caixas de dilogo,
285-286
alterando propriedades, 62-63
alternando entre janelas, 43

aplicativos
criao de, 16
usurios de, CB 20
apstrofo () em comentrios, 95-96
Application, objeto, 56
argumentos em funes
argumento opcional, 340-342
definidos, 335
descries, 347-348
dois argumentos, 338-339
faixa de argumento, 339-340
nmero indefinido de argumentos,
342-343
sem argumento, 336
um argumento, 336-338
armazenando macros, 26-27, 88
Nota: CB (Captulo de Bonificao)em um nmero de pgina, significa que o contedo est
localizado no site deste livro (www.altabooks.com.br procurar pelo nome do
livro).
ExcelVBABokks.indb 371 15/02/2013 14:00:33
372 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
Array, funo, 133
arrays
declarando, 112
definidos, 112
dinmicos, 113-114
funes de, 343-345
multidimensionais, 113
Asc, funo, 133
ativando VBE, 37
Atn, funo, 133
atualizao de tela, 227-228
Auto Indent (Recuo Automtico), opo
(VBE), 52
Auto listar membros, opo (VBE), 51, 66-67
Auto verificar sintaxe, opo (VBE), 50
automtico, clculo, 228
automatizando/automatizar
definio, 14
operaes repetitivas, 15
tarefas, 15
AutoSize, propriedade, 271
avisos de alerta, 365
B
BackColor (cor de fundo), propriedade, 271
BackStyle (estilo de fundo), 271
backups, CB 20
Banfield, Colin, Excel 2010 For Dummies
Quick Reference, 2
barras de ferramentas
personalizando, 329-330
apagando, 330
VBE, 38-39
barras de ferramentas, 329-330
BeforeClose, evento, 162, 169
BeforeDoubleClick, evento,163, 174
BeforePrint (antes de imprimir), evento, 162
BeforeRightClick (antes de clicar com boto

direito), evento, 163, 174-175


BeforeSave, evento, 162, 169-170
Bing, 369
blogs, 369
Booleano, configuraes, 221
Booleano, tipo de dados, 99
botes
Acesso rpido, barra de ferramentas,
320
acrescentando faixa de opes, 16
botes personalizados, 16
macros, 76-77
botes personalizados, 16
Break, modo, 203-207
bugs de tipo de dados errado, 198
bugs de verso errada, 198
bugs. Ver tambm depurao
atualizaes de segurana, 198
bugs de casos extremos, 197
bugs de texto incorreto, 197
bugs de tipo errado de dados, 198
bugs de verso errada, 198
comentrios, 208
definidos, 183
dicas para reduo, 208-209
erros de sintaxe, 198
falhas lgicas, 197
identificando, 198-199
mensagens de erro, 198-100
procedimentos Function (funo), 209
procedimentos Sub, 209
C
Caixa de seleo, controle, 256, 274
caixas de dilogo personalizadas. Ver caixas
de dilogo
caixas de mensagem, 238-241
calculando pagamento de hipoteca, 137
Calculate (calcular), evento, 163
clculo automtico, 228
caminhando atravs do cdigo, 205
Caption (legenda), propriedade, 272
carregando add-ins (acessrios), 351
Cells, propriedade, 117-118
Clula, menu de atalho de, 326-328
clulas, faixas de. Ver faixas
chamando um procedimento Function
(funo) de um procedimento Sub, 79
Change Case, suplemento, 353-359
Change, evento, 163, 175-177
Choose, funo, 133
Chr, funo, 133
circulando atravs de janelas, 43
Clear (limpar), mtodo, 128
Code (cdigo), janela
em VBE, 38-39, 42-44
para UserForms, 258
Code Colors (cdigo de cores), opo
(VBE), 52-53
cdigo
add-ins (acessrios), 350

breakpoints (pontos de interrupo),


202-203
caminhando atravs de linha por linha,
205
cdigo modular, BC18
comentrios, 95-97
convenes usadas neste livro, 4
ExcelVBABokks.indb 372 15/02/2013 14:00:33
373 ndice
copiando, 49
entrando em mdulos VBA, 44-49
etiquetas, 113
falhas lgicas, 197
limpando, BC18
nmeros de linha, 113
recuando, 52, 208
rodando to rpido quanto possvel,
365
senha de proteo, 364, BC17-BC18
sequncia de caractere de continuao
de linha, 4-5
variveis, 97-98
verses de Excel, CB20
colando faixas, 127
colees
definidas, 19, 58
loops, 158-160
mtodos, 64
propriedades, 63
Color (cor), propriedade, 125
comandos personalizados, 15
ComboBox (caixa combinada), controle,
256, 174-175
comentrios
apstrofe (), 95-96
bugs, 208
convertendo declaraes em comentrios, 96
definidos, 95
inserindo, 95-96
uso efetivo de, 97
CommandBars (barras de comando),
objeto, 250-252, 313, 321-325
CommandButton (boto de comando),
controle, 257, 275-276
compilao, erros de, 97
comprimento de string, 130-131
computador, vrus de, 5-6
concatenao, 110
configuraes. Ver tambm propriedades
configuraes Booleanas, 221
mudando, 220-222
configuraes no Booleanas, 221-222
segurana, 5
configurando pontos de interrupo no
cdigo, 202-203
Const (constante), declarao, 105
constantes
constantes integradas, 106-107
constantes pr-definidas para cores,

CB1
declarao Const, 105
declarando, 105
funo MsgBox (caixa de mensagem),
238-239
objetivo (em), 106
valores, 105-107
constantes integradas, 106-107
contadores, 99
contratando projetos, 40
controles (UserForms)
acrescentando/adicionando, 254,
256-257, 261-263, 269-270
ajuda, 273
alinhando, 284-285
CheckBox (caixa de verificao), 256
ComboBox (caixa combinada), 256
CommandButton (boto de comando),
257, 275-276
controle CheckBox (caixa de verificao), 274
controle ComboBox (caixa combinada),
274-275
controle Frame (moldura), 276
controle ListBox (caixa de lista),
296-301
controle OptionButton (boto de
opo), 302-303
controle RefEdit, 280-281, 301-302
controle SpinButton (boto de rotao),
303-305
controle TextBox (caixa de texto),
303-305
cores, 271
dimensionando, 270
espaando, 284-285
Frame (moldura), 256
Image (imagem), 257, 276-277
imagens, 272
Label (etiqueta), 256, 277
ListBox (caixa de lista), 256, 278-279
movendo, 284
mudando propriedades, 257-258,
270-272
MultiPage (mltiplas pginas), 257, 279
nomeao, 259-260, 272
ocultando, 284
OptionButton (boto de opo), 256,
279-280
posicionando, 270
propriedade Accelerator (acelerador),
271
propriedade AutoSize (tamanho
automtico), 271
propriedade BackColor (cor de fundo),
271
propriedade BackStyle (estilo de
fundo), 271
propriedade Caption (legenda), 272
propriedade Left and Top (esquerda e

superior/no alto), 272


ExcelVBABokks.indb 373 15/02/2013 14:00:33
374 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
propriedade Name (nome), 272
propriedade Picture (imagem, retrato),
272
propriedade Value (valor), 272
propriedade Visible (visvel), 272
propriedade Width and Height (largura
e altura), 272
propriedades, 257-258, 270-272
redimensionando, 284
RefEdit, 257
ScrollBar (barra de rolagem), 257, 281
SpinButton (boto de rotao), 257, 282
TabStrip, 257, 282
TextBox (caixa de texto), 256, 282-283
ToggleButton (boto de alternncia),
256, 283
controles (UserForms), 284
controles(CommandBars), 323-325
convenes, explicadas, 4
convertendo
arquivos de pasta de trabalho em
add-ins (acessrios), 350
cores, CB3-CB4, CB6-CB7
declaraes em comentrios, 96
cpia, proteo, 21
copiando
cdigo, 49
faixas, 127, 212-214
Copy (copiar), mtodo, 127
cores
Color (cor), propriedade, 125
constantes pr-definidas, BC1
controles (UserForms), 271
convertendo, BC3-BC4, BC6-BC7
escala cinza, BC5-BC8
especificando, BC1
objetos, 125
sistema de cor RGB, CB1-CB2, CB8-CB9
temas, CB10-CB15
ThemeColor (cor de tema), propriedade, CB12
TintAndShade (matiz e tonalidade),
propriedade, 125, BC12-BC13
valor decimais de cor, CB1-CB5
Column (coluna), propriedade (objeto
Range [faixa]), 121-122
colunas
aumentando o nmero de, 364
diminuindo o nmero de, 364
objetos Range (faixa), 119
cores, BC1
Cos (cosseno), funo, 133
Count (contar), propriedade (objeto Range
[faixa]), 121
criando

add-ins (acessrios), 16, 349-353


aplicativos, 16
botes, 16
caixas de dilogo, 254-255, 260-263
caixas de mensagem, 236-237
comandos, 15
expresses de observao, 206-207
funes de planilha, 333-335
funes, 16
macros, 25-27
mdulos VBA, 44
UserForms (formulrios de usurio),
254-255, 260-263, 290-292
Ctrl+Chift+ e Ctrl+Shift+, 364-365
CurDir, funo, 133
Currency (moeda), tipo de dados, 99
CurrentRegion (regio atual), propriedade,
214
custom UI Editor for Microsoft Office
(Editor de Interface de Usurio Personalizada para Microsoft Office), 317-320
D
dados, procedimento de cpia de, BC20
dados, tipos de
Booleano, 99
bugs de tipo errado de dados, 198
Currency (moeda), 99
Date (data), 99, 108
definidos por User (usurio), 99
definidos, 98
Double [duplo] (negativo), 99
Double [duplo] (positivo), 99
identificando tipo de dados de um
objeto selecionado, 132
Integer (inteiro), 99
integrados, 99
Long (longo), 99
Object (objeto), 99
Single (nico), 99
String, 99
Variant (variante), 99
variveis, 98-99, 230
dados, tipos de Date (data), 99, 108
dados, validao de, 175-177, 295
data, exibindo, 130
Date (data), funo, 130, 133
DateAdd (acrescentar data), funo, 133
DateDiff (data diferente), funo, 133
DatePart (data em especial), funo, 133
DateSerial (data em srie), funo, 133
DateValue (valor de data), funo, 133
Day (dia), funo, 133
Deactivate (desativar), funo, 162-163,
170-174
ExcelVBABokks.indb 374 15/02/2013 14:00:34
375 ndice
Debug.Print (depurar impresso), declaraes, 201-202
decimais, valor de cor, CB1-CB5
DECIMAL2RGB, funo, CB3-CB4

deciso, tomada de, construes. Ver


programa, fluxo de
declaraes
declaraes de designao, 109-110
convertendo em comentrios, 96
definio, 45
declaraes em mdulos VBA, 44
declarando
arrays, 112
constantes, 105
tipos de dados variveis, 230
variveis, 98-105, BC17
Default to Full Module View (padronizar
para exibio mdulo completo), opo
(VBE), 52
Delete (apagar), mtodo, 128
depurando
declaraes Debug-Print (depurar
impresso), 201-202
definio, 198
funo MsgBox (caixa de mensagem),
200-201
pontos de interrupo, 202
procedimentos Function (funo), 341
tcnicas de, 199-202
VBA Debugger (depurador VBA),
202-208
desativando, 328
descarregando add-ins (acessrios), 351
descries
de argumentos, 347-348
de funes, 346-347
de macros, 26, 88
designando
macros a um boto, 76-77
valores a variveis, 20
designando declaraes, 109-110
desvantagens de VBA, 17
determinando um tamanho de arquivo,
131data, 130
Developer (desenvolvedor), guia, 23-24
dilogo, caixas de. Ver tambm UserForms
acrescentando controles a, 254, 256-257,
261-263, 269-270
alinhando controles, 284-285
alternativas a, 235-236
criao de, 254-255, 260-263, 290, 292
de grficos, 310-311
dimensionando controles, 270
espaando controles, 284-285
esttica de, 287
exemplo de, 289-293, 295-296
exibindo caixas de dilogo integradas,
250-251
exibindo, 259, 265, 292
indicador de progresso, 305-308
inserindo, 255-256
janela Code (cdigo), 258
lista de verificao para criao,
311-312

macros, 265-268, 292-293


movendo controles, 284
mudando propriedades de controle,
257-258, 270-272
nomeando controles, 259-260
ocultando controles, 284
ordem de tabulao, 285-286
posicionando controles, 270
procedimentos que lidam com eventos,
263-265, 294-295
quando usar, 253-254
redimensionando controles, 284
tabuladas, 308-310
teclas de acelerador, 285-286
testando, 287
usurios de teclado, 285
validao de dados, 295
Dicas Automticas de Dados, opo (VBE),
51
dicas de velocidade, 227-229, 231
Dim, 102-104
Dim, declarao, 102-104
Dim, palavra-chave, 102-104
dimensionando controles (UserForms), 270
diminuindo o nmero de fileiras/colunas em
uma planilha, 364
dinmicos, arrays, 113-114
Dir, funo, 133
distribuindo add-ins (acessrios), 358
diviso (/), operador de, 110-111
Do-Until (fazer at), loops, 142, 157-158
Do-While (fazer enquanto), loops, 142,
156-157
Docking (acoplar), guia (VBE), 54
docking (acoplar), janela de, 54
documento, temas de
cores, BC10-BC15
definio, BC10
fazendo download, BC10
efeitos, BC10
fontes, BC10
misturando e combinando elementos,
BC10
Double [duplo] (negativo), tipo de dados,
99
Double [duplo] (positivo), tipo de dados, 99
ExcelVBABokks.indb 375 15/02/2013 14:00:34
376 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
Drag-and-Drop Text Editing (arrastar e
soltar de edio de texto), opo (VBE),
52
E
editando
macros, 30
mdulos VBA, 18
Editor Format (editor de formatao), guia
(VBE), 52-53
Editor, guia (VBE), 50

efeitos (temas), BC10


eficincia de gravador de macro, 90-92
ElseIf (e se), estrutura de, 146-147
embutidos, grficos, 223-224
End (fim/final/trmino/encerramento),
declarao, 70
End Function (trmino de funo), declarao, 70
End Sub, declarao, 70
EntireColumn (coluna inteira), propriedade,
215
EntireRow (fileira inteira), propriedade, 215
entrando (com/inserindo)
cdigo em mdulos VBA, 44-49
funes de planilha, 138
eqv (equivalncia), operador de, 111
Erl, funo, 133
Err (erro), objeto, 193-194
Err, funo, 133
erro assinatura fora de faixa, 364
erro, mensagens de, 198-199
Error (erro), funo, 133
erros
bugs, 183
declarao Exit Function (sair de
funo), 192
declarao Exit Sub (sair de Sub), 192
declarao On Error Resume Next (em
erro, ir para prxima), 192
declarao On Error, 189-190, 192
declarao Resume (ir; continuar),
190-192
erro subscript out of range (assinatura fora de faixa), 364
erros de compilao, 97
erros de programao, 183
erros de tempo de execuo, 183
identificando, 193-194
ignorando, 192-193
intencionais, 194-196
macros, 22
objeto Err, 193-194
procedimento EnterSquareRoot (entrar
com raiz quadrada), 184-188
erros de tempo de execuo, 182
especificando
etiquetas, 113
eventos
Activate (ativar), 64, 162-163, 170-174
AddInInstall (instalar acessrio), 162
AddInUninstall (desinstalar acessrio),
162
BeforeClose (antes de fechar), 162, 169
BeforeDoubleClick (antes de clicar duas
vezes), 163, 174
BeforePrint (antes de imprimir), 162
BeforeRightClick (antes de clicar com o
boto direito), 163, 174-175
BeforeSave (antes de salvar), 162,
169-170

Calculate (calcular), 163


Change (mudar/alterar), 163, 175-177
Deactivate (desativar), 162-163, 170-174
definidos, 64, 161-162
FollowHyperlink (seguir hyperlink), 163
hora/horrio, de, 177-180
macros, 163
NewSheet (nova folha de planilha), 162
OnKey (na tecla), 180-181
OnTime (na hora), 178-180
Open (abrir), 162, 167-168
pastas de trabalho, em, 162
planilhas, em, 163
SelectionChange (mudar seleo), 163
SheetActivate (ativar planilha), 162
SheetBeforeDoubleClick (planilha antes
de clicar duas vezes), 162
SheetBeforeRightClick (planilha antes
de clicar com o boto direito), 162
SheetCalculate (calcular planilha), 162
SheetChange (alterar planilha), 162
SheetDeactivate (desativar planilha),
162
SheetFollowHyperlink (planilha
seguindo o hyperlink), 162
SheetSelectionChange (alterar seleo
de planilha, 162
teclas de pressionar, de, 177, 180-181
WindowActivate (ativar janela), 162
WindowDeactivate (desativar janela),
162
WindowResize (redimensionar janela),
162
eventos, procedimentos que lidam com
programao, 164-167
UserForms, 263-265, 294-295
Excel
ExcelVBABokks.indb 376 15/02/2013 14:00:34
377 ndice
considerando outras opes, BC19
funes de planilha, 135-139
mudando configuraes, em, 220-222
Office Compatibility Pak (pacote de
compatibilidade Office), 22
verses de, 20-22, 198, CB20
Excel 2007 Power Programming with VBA
(Walkenbach), 370
Excel 2010 Bible (Walkenback), 2
Excel 2010 For Dummies (Harvey), 2
Excel 2010 For Dummies Quick Reference
(Walkenback e Bandield), 2
Excel 2010 Power Programming with VBA
Walkenback), 370
Excel, modelo objeto, 55
Excel, programao
benefcios e aprender, 3
cdigo, 4
definio, 2
exemplo de arquivos, 8
sequncia de caractere de continuao

de linha, 4-5
vrus, 5-6
executando
procedimentos Function (funo), 70,
78-80
procedimentos Sub, 70-78
ExecuteMso (execute Mso), mtodo,
250-251
exemplo de arquivos, 8
exemplos, 326-327
exibindo, data ou horrio do sistema, 130
Exit Function (sair de funo), declarao,
192
Exit Sub (sair de Sub), declarao), 192
Exp (expandir), funo, 133
expandindo projetos, 40
experimentando / testando, BC19
exponenciao (^), operador de, 110-111
exportando objetos, 42
expresses
bugs de situaes extremas, 197
caractere de continuao de linha, 109
definio, 109
expresses watch (de observao),
206-207
funes, 109
extraindo variveis da memria, 105
F
faixas, 128
fechando
add-ins (acessrios), 351
janelas, 44
Ferramentas de anlise, 349
FileDialog (dilogo de arquivo), objeto, 249
fileiras
diminuindo o nmero de fileiras, 364
aumentando o nmero de fileiras, 364
objetos Range (faixa), 119
FileLen (extenso de arquivo), funo,
131-132, 134
Fix (corrigir), funo, 131, 134
fixo, comprimento de strings, 107-108
FollowHyperlink (acompanhar hyperlink),
evento de, 163
Font (fonte), opo (VBE), 53
Font (fonte), propriedade (objeto Range
[faixa]), 123
fontes (temas), BC10
For-Next (para prximo), loops, 142, 152-156
forando modo Break (pausa/interrupo),
204
Format (formatar/formato), funo, 134
formatando grficos, 225-226
Forms (formulrios), n de, 41
Formula (frmula), propriedade (objeto
Range [faixa]), 124
Frame (moldura), controle, 256, 276
funes (planilha)
add-ins (acessrios), 350
argumentos, 335-343

criao, 333-335
DECIMAL2RGB, BC3-BC4
descries, 346-347
entrando (com), 138
exemplos, 336-341
LARGE (grande), 136
MAX (mximo), 136
personalizadas, 333-335
PMT, 137
RGB (vermelho, verde, preto), 125, 134,
CB2
RGB2DECIMAL, CB3-CB4
VLOOKUP, 137-138
WorksheetFunction (funo de planilha), objeto, 139
funes (VBA)
Abs (absoluto), 133
Ano, 135
argumentos, 335-336
Array, 133
arrays, 343-345
Asc, 133
Atn, 133
Choose (escolher), 133
Chr, 133
Cos, 133
ExcelVBABokks.indb 377 15/02/2013 14:00:34
378 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
criao de, 16
CurDir, 133
Date (data), 130, 133
DateAdd (adicionar data), 133
DateDiff (data diferente), 133
DatePart (parte de data), 133
DateSerial (data em srie), 133
DateValue (valor de data), 133
Day (dia), 133
definidas, 129, 334
dia da semana, 135
Dir, 133
Erl, 133
Err, 133
Error (erro), 133
Exp, 133
expresses, 109
FileLen (extenso de arquivo), 131-132, 134
Fix (corrigir), 131, 134
Format (formatar/formato), 134
GetSetting (obter configurao), 134
Hex (hexagonal), 134
Hour (hora), 134
InputBox (caixa de entrada), 132, 134,
218, 241-244
InStr, 134
Int, 131, 134
integradas, 130-135
Ipmt, 134
IsArray ( array), 134

IsDate ( data), 134


IsEmpty (est vazio), 134
IsError ( erro), 134
IsMissing (est faltando), 134
IsNull ( nulo), 134
IsNumeric ( numrico), 134
IsObject ( objeto), 134
LBound (limite esquerda), 134
LCase (tipo de letra esquerda), 134
Left (esquerdo), 134
Len (comprimento/extenso), 130-131,
134
Log (registro), 134
lookup (consultar), 137-138
LTrim (aparar esquerda), 134
Mid (meio), 134
MIN (mnimo), 136
Minute (minuto), 134
Month (ms), 134
MsgBox (caixa de mensagem), 132, 134,
200-201, 236-241
MultiplyTwo (multiplicar por dois),
138-139
Now (agora), 134
personalizadas, 16, 138-139, 333
Replace (substituir), 135
Right ( direita), 135
Rnd (random aleatrio), 135
RTrim, 135
Second (segundo), 135
Sgn, 135
Shell (envoltrio), 132, 135
Sin, 135
Space (espao), 135
Split (separar), 135
Sqr (quadrada), 135
Str (rua), 135
StrComp (complemento de rua), 135
String, 135
Tan (tangente), 135
Time (horrio), 135
Timer (temporizador), 135
TimeSerial (horrio em srie), 135
TimeValue (valor de horrio), 135
Trim (aparar), 135
TypeName (digitar nome), 132, 135
UBound (limite de maisculas), 135
UCase (letras maisculas), 135, 253
User Defined Function (UDF) [Funo
Definida por Usurio], 138
Val, 135
VarType (tipo de varivel), 135
funes integradas, 130-135
funes personalizadas, 16, 138-139, 333-335
Function (funo), 70
Function (funo), procedimentos
bugs, 209
chamando a partir de um procedimento
Sub, 79
declarao End Function (fim/trmino

de funo), 70
definidos, 18, 69-70
depurando, 341
executando, 70, 78-80
gravando, 70
mdulos VBA, 44
nomeando, 71
palavra-chave de Function (funo), 70
palavras reservadas, 98
G
General (geral), guia (VBE), 53-54
GetOpenFilename (obter nome de arquivo
aberto), mtodo, 244-248
GetSaveAsFilename (obter nome de arquivo
salvado como), mtodo, 148-249
GetSetting (obter configurao), funo, 134
ExcelVBABokks.indb 378 15/02/2013 14:00:34
379 ndice
globais, variveis, 104-105
Google, 369
GoTo (ir para), declarao, 142-143
grade de linhas, 270
grficos
Chart, propriedade, 224
ChartObject (objeto grfico), objeto,
223-224
ChartObjects (objetos grficos),
coleo, 224-225
escala/cinza, deC7-bC8
formatando, 225-226
grficos embutidos, 223-224
macros, 222-223
modificando tipo de grfico, 224
propriedades, 225
selecionando, 226
UserForms, 310-311
gravando macros
eficincia, 90-92
gravador de macro, 26-27, 30, 47-48,
81-92, 363
modo absoluto, 84-85
modo relativo, 85-86
mdulos VBA, 47-48
o que gravado, 87-88
opes de gravao, 88-89
orientaes passo a passo, 26-27, 82-83
preparao, 25, 84
procedimentos Function (funo), 70
procedimentos Sub, 70
GUI (Graphical User Interface Interface
Grfica de Usurio), 255
H
habilitando macros, 5-6, BC19
Harvey, Greg, Excel 2010 For Dummies, 2
HasFormula (tem frmula), propriedade
(objeto Range [faixa]), 122-123
help (ajuda)
controles (Userforms), 273
Sistema de Ajuda VBA, 367
Hex (hexagonal), funo, 134

hierarquia de objetos, 18-19, 56-57


Hora, 130
hora, eventos, 177-180
hora, exibindo, 130
Hora, funo de, 134
I
Informaes rpidas automticas, opo
(VBE), 51
cones, explicados, 8
identificando
bugs, 198-199
erros, 193-194
tipo de dados de um objeto selecionado, 132
If-Then (se, ento), estrutura, 142-148
If-Then-Else (se, ento, outra coisa), 144-145
ignorando erros, 192-193
Image (imagem), controle, 257, 276-277
imagens para controles de UserForm, 272
Immediate (imediata), janela (VBE), 38-39,
204-205
imp (importao), operador de, 111
importando objetos, 42
incorreto, bugs de contexto, 197
InputBox (caixa de entrada), funo, 132,
134, 218, 241-244
Insert Function (inserir funo), caixa de
dilogo, 345-348
inserindo. Ver tambm adicionando/
acrescentando
comentrios, 95-96
funes de planilha em um mdulo
VBA, 138
texto, 15
UserForms, 255-256
InStr, funo, 134
Int, funo, 131, 134
Integer (inteiro), tipo de dados, 99
integer, operador de diviso (\), 110
inteiro, parte de um nmero, exibindo, 131
intencionais, erros, 194-196
Interior, propriedade (objeto Range [faixa]),
123-124
Internet, grupos de notcias, 368
IPmt, funo, 134
IsAddin ( acessrio), propriedade, 349
IsDate ( data), funo, 134
IsEmpty (est vazio), funo, 134
IsError ( erro), funo, 134
IsMissing (est faltando), funo, 134
IsNull ( nulo), funo, 134
IsNumeric ( numrico), funo, 134
IsObject ( objeto), funo, 134
L
Label (etiqueta), controle, 256, 277
LARGE (grande), planilha, funo de, 136
LBound, funo, 134
LCase (letra minscula), funo, 134
Left (esquerda), funo, 134
Left and Top (esquerda e no alto), proprie-

dade, 272
ExcelVBABokks.indb 379 15/02/2013 14:00:34
380 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
Len (extenso), funo, 130-131, 134
limpando cdigo, 18
limpando faixas, 128
linha, continuao de, caractere de, 109
linha, nmeros de, em cdigo, 113
linha, sequncia de caractere de continuao de, 4-5, 365
lista de verificao para criar UserForms,
311-312
lista, retornando, 344-345
listando menus de atalho, 321-322
listando, 321-322
ListBox (caixa de lista), controle, 256,
278-279, 296-301
locais confiveis, 32
locals (locais), janela (VBE), 207-208
Log (registro), funo, 134
lgicas, falhas, em cdigo, 197
lgicos, operadores, 111
Long (longos), tipo de dados, 99
lookup (consulta), funes, 137-138
loop, contadores de, 99
loops
colees de, 158-160
definidas, 151-152
faixas, 216-218
loops Do-Until (fazer at), 142, 157-158
loops Do-While (fazer enquanto), 142,
156-157
loops For-Next (para prximo), 142, 152,
154-156
velocidade de, 146
LTrim, funo, 134
M
macro, gravador de
eficincia, 90-92
limites de, 83-84
modo absoluto, 84-85
modo relativo, 85-86
mdulos VBA, 47-48
o que gravado, 87-88
opes de gravao, 88-89
orientaes passo a passo, 26-27, 82-83
preparao para usar, 25, 84
procedimentos Function (Funo), 70
procedimentos Sub, 70
macros
armazenando, 26-27, 88
barra de ferramentas Quick Access
(acesso rpido), 266
criando, 25-27
Ctrl+Shift+, 364-365
definio, 14
desativando, 5-6
descrio, 26

designando a um boto, 76-77


editando, 30
erros, 22
eventos, 163
grficos, 222-223
gravando, 26-27, 30, 47-48, 81-92, 363
habilitando, 5-6, BC19
macro de NameAndTime (nome e hora),
25-33
nomeando, 26, 88
salvando, 30-31
segurana, 31-32
teclas de atalho, 26, 75-76, 88
testando, 27, 267-268
UserForms, 265-268, 292-293
vendo, 27-29
macros, 5-6
Margin Indicator Bar (margem de barra de
indicao), opo (VBE), 53
MAX (mximo), funo de planilha, 136
maximizando janelas, 42-43
maximizando, 42-43
memria, 105
mensagem, caixas de
criao, 236-237
exibindo o valor de duas variveis,
200-201
mensagens de mltiplas linhas, 365
personalizando, 238-241
respostas, 237-238
mensagens de alerta, 228-229
menu de atalho Cell (clula), 326-328
menu, barra de, em Visual BasicEditor
(VBE), 38
menus de atalho, 321-328
menus de atalho, 328
mtodos
Auto List Members (lista automtica de
membros), 66-67
colees, 64
definidos, 20, 60-61, 63-64
Delete (apagar), 128
especificando, 20
ExecuteMso, 250-251
GetOpenFilename (obter nome de
arquivo aberto), 244-248
GetSaveAsFilename (obter nome de
arquivo salvado como), 248-249
mtodo Clear (limpar), 128
mtodo Copy (copiar), 127
ExcelVBABokks.indb 380 15/02/2013 14:00:34
381 ndice
mtodo Paste (colar), 127
mtodo Select (selecionar), 126-127
objeto Range (faixa), 126
objetos Range (faixa), 127-128
Sistema Help (de ajuda) VBA, 65
mtodos, 20
Microsoft Developer Network Desenvolvedor de Rede Microsoft), site (MSDN),

368
Microsoft Excel
considerando outras opes, BC19
funes de planilha, 135-139
mudando configuraes, 220-222
Office Compatibility Pak (pacote de
compatibilidade Office), 22
verses, 20-22, 198, BC20
Microsoft Excel 2010 Power Programming
with VBA (Walkenbach), 2
Microsoft Excel Objects, n, 40
Microsoft Product Support (suporte de
produtos Microsoft), 367-368
Mid (meio), funo, 134
MIN (mnimo), funo de planilha, 136
minimizando janelas, 42-44
Minute (minuto), funo, 134
misturando e combinando elementos de
tema de documento, BC10
modificando
add-ins (acessrios), 359
tipo de grfico, 224
modular, cdigo, BC18
Modules (mdulos), n, 41
mdulo aritmtico, operador (mod), 110
mdulo VBA a um projeto, 41
mdulo, variveis apenas de, 103-104
mdulos. Ver mdulos VBA
Month (ms), funo, 134
movendo
controles (UserForms), 284
faixas, 215
MSDN (site Microsoft Developer Network),
368
MsgBox (caixa de mensagem), funo, 132,
134, 200-201, 236-241
multidimensionais, arrays, 113
MultiPage (mltiplas pginas), controle,
257, 279
mltiplas linhas, mensagens de, 365
multiplicao, operador (*), 110-111
MultiplyTwo (multiplicar dois), funo
personalizada, 138-139
MultiSelect (mltipla seleo), propriedade,
299-300
N
#NAME, frmula, 363
Name (nome), propriedade, 272
NameAndTime (nome e hora), macro
armazenando, 26-27
criao, 25-27
descrio, 26
editando, 30
gravando, 26-27, 30
nomeando, 26
recursos, 25-33
salvando, 30-31
segurana, 31-32
tecla de atalho, 26
testando, 27

vendo, 27-29
nomeando
controles (UserForms), 259-260, 272
macros, 26, 88
procedimentos Function (funo), 71
procedimentos Sub, 71
variveis, 97-98
NewSheet (nova folha de planilha), evento,
162
ns (projetos)
definidos, 40
n de Forms (formulrios), 41
n de Microsoft Excel Objects, 40
n de Modules (mdulos), 41
no booleanos, configuraes, 221-222
no contnuas, faixas, 116-117
not (no), operador, 111
Now (agora), funo, 134
NumberFormat (formato de nmero),
propriedade (objeto Range [faixa]), 126
O
Object Browser (objeto navegador), 66
Object Model Map (mapa modelo objeto),
57
objeto CommandBars (barras de comando),
321-325
ocultando, 43-44
organizando, 43
Objeto, tipo de dados de, 99
Objetos Ativos, 19
objetos. Ver tambm objetos por nome
ativos, 19
colees, 19, 58
cores, 125
definio, 18, 55-56
ExcelVBABokks.indb 381 15/02/2013 14:00:34
382 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
eventos, 64
exportando, 42
expresses, 109-110
hierarquia, 18-19, 56-57
identificando tipo de um objeto
selecionado, 132
importando, 42
mtodos, 20, 60-61, 63-64
navegando atravs da hierarquia, 59
Object Browser (objeto navegador), 66
Object Model Map (mapa modelo
objeto), 57
propriedades, 19, 60-63
referncias, 19, 58-60, 229-230
VBA Help System (sistema de ajuda do
VBA), 65
Office Compatibility Pak (pacote de
compatibilidade Office), 22
Offset (desvio), propriedade, 118-119
On Error (em erro), declarao, 189-190, 192
On Error Resume Next (em erro ir para

prximo), declarao, 192-193, 208


OnKey (na tecla), evento, 180-181
OnTime (na hora), evento, 178-180
OOP (programao orientada a objeto), 55
Open (abrir), evento, 162, 167-168
operador (diviso de inteiro), 110
operadores
adio (+), 110-111
concatenao de string (&), 110
diviso (/), 110-111
diviso de inteiro (\), 110 e, 111
eqv (equivalncia), 111
exponenciao (^), 110-111
imp (importando), 111
lgicos, 111
mdulo aritmtico (mod), 110
multiplicao (*), 110-111
not (no), 111
or (ou), 111
ordem de prioridade, 111
sinal de igual (=), operador de, 109-110
subtrao (-), 110-111
usando parnteses para mudar ordem
de prioridade, 111
XoR, 111
Option Explicit (opo explcita), declarao, 100-101, 208
OptionButton (boto de opo), controle,
256, 279-280, 302-303
or (ou), operador, 111
organizando mdulos VBA, 44
orientado a objeto, programao (OOP), 55
P
parnteses, usando para mudar o operador
de ordem de prioridade, 111
parte inteira de um nmero, 131
Paste (colar), mtodo, 127
personalizando, 321-328
Picture (imagem, retrato), propriedade, 272
planilhas, 365
planilhas, funes. Ver funes (worksheet
= planilha)
PMT, funo de planilha, 137
Pontos de interrupo
configurando, 202-203
definidos, 202
removendo, 203
posicionando controles em UserForms, 270
Power Utility Pak, 349
pr-definidas, constantes para cores, BC1
prioridade, ordem de para operadores, 111
procedimento, apenas, variveis de, 102-103
procedimentos. Ver procedimentos que
lidam com eventos; procedimentos
Function (funo); procedimentos Sub
Procedure Separator (procedimento
separador), opo (VBE), 52
produto, ativao, 21
programa, fluxo de
declarao GoTo (ir para), 142-143

descrio, 141
estrutura ElseIf (e se), 146-147
estrutura If-Then (se, ento), 142-148
estrutura If-Then-Else (se, ento, outra
coisa), 144-145
estrutura Select Case (selecionar tipo
de letra), 142, 148-151
estrutura With-End With, 231
loops Do-Until (fazer at), 142, 157-158
loops Do-While (fazer enquanto), 142,
156-157
loops For-Next (para prximo), 142,
152-156
programao
benefcios de aprender, 3
cdigo, 4
definio, 2
exemplo de arquivos, 8
experimentando, BC19
programao estruturada, 143
sequncia de caractere de continuao
de linha, 4-5
vrus, 5-6
programao estruturada, 143
programao, erros de, 183
programas, bugs de. Ver bugs
ExcelVBABokks.indb 382 15/02/2013 14:00:34
383 ndice
programas, definidos, 14
progresso, indicador de, 305-308
Project (projeto), janela (VBE), 28, 38-42
projetos
acrescentando um mdulo VBA, 41
contratando, 40
definidos, 40
expandindo, 40
ns, 40-41
removendo um mdulo VBA, 41-42
Properties (propriedades), janela (VBE), 38
propriedades. Ver tambm propriedades
por nome
Auto List Members (lista automtica de
membros), 66-67
colees, 63
controles (UserForms), 257-258, 270
definio, 19, 60-62
grficos, 225
mudando, 62-63
objetos Range (faixa), 119-126
propriedade ThemeColor (cor de tema),
125
referncias, 19
Sistema de Ajuda VBA, 65
vendo, 62-63
protegendo
cdigo, 364, BC17-BC18
regras de validao de dados, 177
protegendo cdigo, 364, BC17-BC18
Public (pblica), declarao, 104
Public (pblica), palavra-chave, 104

Public (pblico), 104


pblicas, variveis, 104-105
Q
Quick Access (acesso rpido), barra de
ferramentas, 266, 320
R
Range (faixa), objetos. Ber tambm ranges
(faixas)
colunas, 119
definio, 115
faixas descontnuas, 116-117
fileiras, 119
mtodo SpecialCells (clulas especiais),
216-217
mtodos, 126-128
propriedade Address (endereo), 122
propriedade Cells (clulas), 117-118
propriedade Color (cor), 125
propriedade Column (coluna), 121-122
propriedade Count (contar/contagem),
121
propriedade CurrentRegion (regio
atual), 214
propriedade Entirecolumn (coluna
inteira), 215
propriedade EntireRow (fileira inteira),
215
propriedade Font (fonte), 123
propriedade Formula (frmula), 124
propriedade HasFormula (tem frmula),
122-123
propriedade Interior (interna), 123-124
propriedade NumberFormat (formato
de nmero), 126
propriedade Offset (descio), 118-119
propriedade Row (fileira), 121-122
propriedade Text (texto), 121
propriedade ThemeColor (cor de tema),
125
propriedade Value (valor), 120
propriedades apenas de leitura, 119
propriedades, 119-126
referncias, 115-119
selecionando, 211
Range (faixa), palavra-chave, 115-117
ranges (faixas). Ver tambm Range (faixa),
objetos
apagando, 128
argumentos, 339-340
colando, 127
copiando, 127, 212-214
determinando tipo de seleo, 219
faixas de tamanhos variveis, 213-214
faixas nomeadas, 212
limpando, 128
loops, 216-218
movendo, 215
mltiplas faixas, 219-220
selecionando, 126-127, 211-212, 214-215,
219-220

solicitando por um valor de clula,


218-219
valor mximo em uma faixa, 136
ReDim, declarao, 113-114
redimensionando
controles (UserForms), 284
janelas, 43
redimensionando, 43
Redo (refazer), boto (VBE), 45-46
RefEdit, controle, 257, 280-281, 301-302
referncias
a objetos Range (faixa), 115-119
a objetos, 19, 58-60, 229-230
ExcelVBABokks.indb 383 15/02/2013 14:00:34
384 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
as propriedades de objeto, 19
referncia totalmente qualificada, 59
relativo, modo (gravador de macro), 85-86
removendo. Ver tambm apagando
barras de ferramentas, 330
mdulo VBA de um projeto, 41-42
pontos de interrupo, 203
reorganizando janelas, 43
reorganizando, 43
repetitivas, operaes, automatizando, 15
Replace (substituir), funo, 135
Require Variable Declaration (exige declarao e varivel), opo (VBE), 50
reservadas, palavras
procedimentos Function (funo), 98
procedimentos Sub, 98
variveis, 98
Resume (retomar; continuar), declarao,
190-192
retornando uma lista classificada, 344-345
RGB (vermelho, verde, preto), sistema de
cor, BC1-BC2, BC8-BC9
RGB, funo, 125, 134, BC2
RGB2DECIMAL, funo, BC3-BC4
Ribbon (barra grfica)
add-ins (acessrios), 352
adicionando botes, 16
guia Developer (desenvolvedor), 23-24
personalizando, 24, 314-321
Ribbon (barra grfica), 24, 314-321
Right (direita), funo, 135
Rnd (random = aleatrio), 135
rodando
cdigo o mais rpido possvel, 365
Visual Basic Editor (VBE), 37
rotinas, definidas, 45
Row (fileira), propriedade (objeto Range
[faixa]), 121-122
RTrim, funo, 135
S
salvando macros, 30-31
ScrollBar (barra de rolagem), controle, 257,
281

Second (segunda), funo, 135


segurana
configuraes, 5
locais confiveis, 32
macros, 31-32
senhas, BC17-BC18
Trust Center (centro de confiana), 5
segurana, alerta de, 32
segurana, atualizaes, 198
segurana, BC17-BC18
selecionando
arquivos mltiplos, 247-248
faixas, 126-127, 211-212, 214-215, 219-220
grficos, 226
objetos Range (faixa), 211
selecionando mltiplos arquivos, 247-248,
Select (selecionar), mtodo, 126-127
Select Case (selecionar tipo de letra),
estrutura, 142, 148-151
SelectionChange (mudana de seleo),
evento, 163
separadoras, barras, 52
Sgn, funo, 135
shareware, 349
SheetActivate (ativar planilhas), evento, 162
SheetBeforeDoubleClick (planilha antes de
clicar duas vezes), evento, 162
SheetBeforeRightClick (planilha antes de
clicar com o boto direito), evento, 162
SheetCalculate (calcular planilha), evento,
162
SheetChange (alterar planilha), evento, 162
SheetDeactivate (desativar planilha),
evento, 162
SheetFollowHyperlink (planilha seguindo
hyperlink), 162
SheetSelectionChange (alterao de seleo
de planilha), evento, 162
Shell (envoltrio), funo, 132, 135
Sin, funo, 135
sinal de igual (=), operador de, 109-110
Single (nico), tipo de dados, 99
sintaxe, erros de, 198
Size (tamanho), opo (VBE), 53
Solver (solucionador), 349
Space (espao), funo, 135
SpecialCells (clulas especiais), mtodo,
216-217
SpinButton (boto de giro), controle, 257,
282, 303-305
Split (separao), funo, 135
Spreadsheet Page (pgina de planilha
financeira), A, Web site, 369
Sqr (quadrada), funo, 135
Stop (parar), 204
Stop (pare/parar), palavra-chave, 204
Str, funo, 135
StrComp, funo, 135
String, funo, 135
string, operador (&) de concatenao, 110

String, tipo de dados, 99


strings
comprimento fixo, 107-108
comprimento varivel, 107
ExcelVBABokks.indb 384 15/02/2013 14:00:34
385 ndice
concatenao, 110
definidas, 107
descobrindo, extenso de string,
130-131
Sub, 70
Sub, procedimentos
bugs, 209
chamando um procedimento Function
(funo), 79
declarao End Sub, 70
definidos, 18, 69-70
executando, 70-78
gravando, 70
mdulos VBA, 44
nomeando, 71
palavra-chave Sub, 70
palavras reservadas, 98
subtrao, operador (-), 110-111
T
tab (guia), ordem em caixas de dilogo,
285-286
TabStrip (separao de tabulao), funo,
135
tabulao, caixas de dilogo, 308-310
tarefas, automatizando, 15
tecla, combinaes de, 4
teclas de atalho para macros, 16, 75-76, 88
tema, cores de, 125
temas
de cores, BC10-BC15
definidos, BC10
efeitos, BC10
fazendo download, BC10
fontes, BC10
misturando e combinando elementos
de, BC10
terceiros, fornecedores de add-ins (acessrios), 349
testando
macros, 27, 267-268
UserForms, 287, 293
Text (texto), propriedade (objeto Range
[faixa]), 121
TextBox (caixa de texto), controle, 256,
282-283, 303-305
texto
inserindo, 15
strings, 107
ThemeColor (cor de tema), propriedade
(objeto Range [faixa]), 125, BC12
Time (hora), funo, 135
Timer (temporizador), funo, 135
TimeSerial (horrio em srie), funo, 135
TimeValue (valor de hora), funo, 135

TintAndShade (tonalidade e matiz),


propriedade, 125, BC12-BC13
tipos de dados integrados, 99
ToggleButton (boto de alternncia),
controle, 256, 283
toques de tecla, 177, 180-181
totalmente qualificada, referncia, 59
Trim (aparar), funo, 135
trocando entre janelas, 43
Trust Center (centro de confiana), 5
TypeName (digitar nome), funo, 132, 135
U
UBound, funo, 135
UCase, funo, 135, 253
UDF (User Defined Function funo
definida por usurio), 138
Undo (desfazer), boto em VBE, 45-46
User Defined Function (UDF funo
definida por usurio), 138
UserForms (formulrios de usurio),
250-251, 259, 265, 292
UserForms. Ver tambm caixas de dilogo
acrescentando controles, 254, 256-257,
261-263, 269-270
alinhando controles, 284-285
alternativas a, 235-236
criando, 254-255, 260-263, 290-292
dimensionando controles, 270
espaando controles, 284-285
esttica, 287
exemplo, 289-293, 295-296
exibindo, 250-251, 259, 265, 292
grficos, 310-311
indicador de progresso, 305-308
inserindo, 255-256
janela Code (cdigo), 258
lista de verificao para criao,
311-312
macros, 265-268, 292-293
movendo controles, 284
mudando propriedades de controle,
257-258, 270-272
nomeando controles, 259-260
ocultando controles, 284
ordem de guia/tabulao, 285-286
posicionando controles, 270
procedimentos que lidam com eventos,
263-265, 294-295
quando usar, 253-254
redimensionando controles, 284
ExcelVBABokks.indb 385 15/02/2013 14:00:34
386 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
tabulado, 308-310
teclas de acelerao, 285-286
testando, 287, 293
usando informaes a partir de, 259
usurios de teclado, 285
validao de dados, 295

UserName (nome de usurio), propriedade,


335
Usurio, tipo de dados definidos por, 99
usurios de teclado e caixas de dilogo, 285
usurios, BC20
usurios, grupos de, 370
V
Val (validao), funo, 135
validao, regras de, 175-177
valor mximo em uma faixa, 136
valores
constantes, 105-107
designando a variveis, 20
encontrando valor mximo em uma
faixa, 136
solicitando o valor de uma clula,
218-219
valores decimais de cor, BC1-BC5
variveis, 105
Value (valor), propriedades
controles (UserForms), 272
objeto Range (faixa), 120
Variant (variante), tipos de dados, 99
variveis
apenas mdulo, 103-104
apenas procedimento, 102-103
arrays, 112-114
declarao Dim, 102-104
declarao End (fim/final), 105
declarao Option Explicit (opo
explcita), 100-101
declarao Public (pblica), 104
declarando, 98-105, BC17
definio, 20, 97
designando valores, 20
estticas, 104-105
exibindo o valor de duas variveis,
200-201
expresses, 109-110
globais, 104-105
nomeao, 97-98
objetivo, 99-105
palavras reservadas, 98
pblicas, 104-105
tipos de dados, 98-99, 230
tirando da memria, 105
valores, 105
vida de (durao), 105
variveis estticas, 104-105
variveis, 99-105
variveis, dimensionadas, faixas de, 213-214
varivel, extenso de, strings, 107
VarType (tipo de variante), funo, 135
VBA (Visual Basic for Applications)
benefcios de aprender, 3
cdigo, 4
definio, 13
desvantagens de, 17
exemplo de arquivos, 8
sequncia de caractere de continuao

de linha, 4-5, 365


usos comuns, 14-16
vantagens de, 17
vrus, 5-6
VBA, cdigo. Ver cdigo
VBA, Debugger (depurador), 202-208
VBA, funes. Ver funes (VBA)
VBA, gravador de macro. Ver gravador de
macro
VBA, Help System (sistema de ajuda), 65,
367
VBA, mdulos
acrescentando a um projeto, 41
copiando cdigo, 49
criando, 44
declaraes, 44
definio, 334
editando, 18
entrando com cdigo, 44-49
inserindo funes de planilha, 138
organizando, 44
procedimentos Function (funo), 18,
44
procedimentos Sub, 18, 44
removendo de um projeto, 41-42
vendo, 18
VBE (Visual Basic Editor). Ver Visual Basic
Editor (VBE)
velocidade de loops, 146
vendo
macros, 27-29
propriedades, 62-63
mdulos VBA, 18
verses de Excel, 20-22, 198, BC20
vida/durao de variveis, 105
vrus, 5-6
Visible (visvel), propriedade, 272
Visual Basic Editor (VBE)
ativando, 37
barra de menu, 38
barras de ferramentas, 38-39
ExcelVBABokks.indb 386 15/02/2013 14:00:34
387 ndice
boto Redo (refazer), 45-46
boto Undo (desfazer), 45-46
guia Docking, 54
guia Editor Format (editor de formatao), 52-53
guia Editor, 50
guia General (geral), 53-54
janela Code (cdigo), 38-39, 42-44
janela Immediate (imediata), 38-39,
204-205
janela Locals (locais), 207-208
janela Project (projeto), 28, 38-42
janela Properties (propriedades), 38
janela Watches, 206-207
menus de atalho, 39
novos recursos, 40
opo Auto Data Tips (dicas de dados),

51
opo Auto Indent (recuo automtico),
52
opo Auto List Members (lista
automtica de membros), 51, 66-67
opo Auto Quick Info ( informaes
rpidas automticas), 51
opo Auto Sintax Check (verificao
automtica de sintaxe), 50
opo Code Colors (cdigo de cores),
52-53
opo Default to Full Module View
(padro para visualizar mdulo
inteiro), 52
opo Drag-and-Drop Text Editing
(edio de texto de agarrar e soltar),
52
opo Font (fonte), 53
opo Margin Indicator Bar (barra
indicadora de margem), 53
opo Procedure Separator, 52
opo Require Variable Declaration
(exige declarao de varivel), 50
opo Size (tamanho), 53
personalizando, 49-54
rodando, 37
Visual Basic Editor (VBE), 49-54
Visual Basic for Applications (VBA). Ver
VBA Visual Basic for Applications)
VLOOKUP, funo de planilha, 137-138
W
Walkenbach, John
Excel 2007 Power Programming with
VBA. 370
Excel 2010 Bible,
Excel 2010 For Dummies Quick Reference, 2
Excel 2010 Power Programming with
VBA, 370
Microsoft Excel 2010 Power Programming with VBA, 2
watch (observar), expresses de, 206-207
Watches, janela (VBE), 206-207
Web sites
Microsoft Developer Network, site
(MSDN), 368
Microsoft Product Support, 367-368
Spreadsheet Page (pgina de planilha),
The (a), 369
Weekday (dia da semana), funo, 135
Width and Height (largura e altura),
propriedade, 272
WindowActivate (ativar janela), evento, 162
WindowResize (redimensionar janela),
evento, 162
Window Deactivate (desativar janela), 162
Window Resize (redimensionar janela), 162
With-End With, estrutura, 231
workbooks (pastas de trabalho)
convertendo arquivos de pasta de

trabalho em add-ins (acessrios),


350
eventos, 162
WorkRange (faixa de trabalho), objeto, 218
WorksheetFunction (funo de planilha),
objeto, 136-139
worksheets (planilhas)
apagando, 365
eventos, 163
X
XLAM, extenso de arquivo, 350
XoR, operador, 111
Y
Year (ano), funo, 135
ExcelVBABokks.indb 387 15/02/2013 14:00:35
388 Programando Excel VBA Para Leigos, Traduo da 2
a
Edio
ExcelVBABokks.indb 388 15/02/2013 14:00:35