Você está na página 1de 403

1

Apostila de
VBA
Lio #02 O Vocabulrio das Macros VBA do Excel 2

O Excel um programa que tem um grande potencial, mas a maioria do pessoal o maneja de forma
simples, utilizando somente as suas opes bsicas. Porm h algo muito importante que tenho a lhes dizer. O
Excel conta com uma linguagem muito poderosa chamada Visual Basic , ou melhor, somente com uma
parte da linguagem, mas que permite resolver os problemas mais facilmente. Porm, devemos aprender a
program-lo e para isso que existe este curso. As pessoas poderiam dizer que este curso de um nvel muito
alto, e talvez o seja, mas fcil de aprender, j que se manipularo as coisas termos simples, e eu gosto de falar
com palavras que todo mundo entenda, por isso o torna mais fcil. A programao empregada neste este curso
ou as estruturas que aparecero so criadas pelo prprio aplicativo, j que para manejar a programao de
Visual Basic do Excel necessrio ter muita criatividade, cada pessoa pode criar estruturas diferentes, mas
que trabalhem de forma igual. Assim mos obra e divirtam-se!
Lies de VBA do Excel 3

FASES DO CURSO
Fase # 1: Desenvolvendo Procedimentos (Macros) VBA em Excel

Descubra o Gravador de Macros que funcionar para voc todas s vezes, mesmo quando voc se tornar um
expert. Descubra ento o ambiente amigvel Visual Basic Editor onde todas as coisas acontecem no VBA.
Aqui temos 9 lies para fazer voc se sentir mais confortvel, de modo que voc se diverte desenvolvendo
procedimentos VBA (macros).

Lio 1: Introduo - Lio 2: Vocabulrio das Macros do Excel - Lio 3: O Gravador de Macros
Excel - Lio 4: O Visual Basic Editor - VBE - Lio 5: Modificando Macros no Visual Basic Editor -
Lio 6: Criando Macros no Visual Basic Editor - Lio 7: Testando Macros no Visual Basic Editor -
Lio 8:
Eventos VBA - Lio 9: Segurana e Proteo no VBA

Fase # 2: O Cdigo VBA

quase o Ingls, mesmo assim existem maneiras para falar ao Excel. Nestas 8 lies voc aprender trabalhar
com o Application (o prprio Excel), com pastas, planilhas, clulas e ranges, caixas de mensagens, caixas de
entradas de dados e erros.

Lio 1: Palavras e sentenas (cdigo) no VBA para o Excel - Lio 2:


Trabalhando com o Application - Lio 3: Trabalhando com Workbooks - Lio 4:
Trabalhando com Worksheets - Lio 5: Trabalhando com Clulas e Ranges -
Lio 6: Trabalhando com Caixas de Mensagens - Lio 7: Trabalhando com Caixas de Entrada -
Lio 8: Trabalhando com Erros

Fase # 3: VBA Avanado para o Excel Vamos agora nos aprofundar mais . Em 12
lies voc aprender como trabalhar com variveis, declaraes e funes. Da ento descobrir os databases
no Excel e o cdigo para trabalhar com eles. Depois a parte divertida, trabalhar com userforms e controles.
Como criar e/ou modificar Menus? Use os controles ActiveX nas prprias planilhas e grficos. Vamos trabalhar
com barras de ferramentas. Finalmente como criar os Suplementos.

Lio 1: Cdigo VBA do Excel para Variveis - Lio 2: Trabalhando com Declaraes - Lio 3:
Trabalhando com Funes - Lio 4: Trabalhando com databases - Lio 5: Criando UserForms -
Lio 6: Adicionando Controles aos userforms Lio 7: Cdigo VBA do Excel para UserForms -
Lio 8: Cdigo VBA do Excel para Grficos e Arquivos Seqenciais Lio 9: Criando e
Modificando Menus Lio 10: Usando controles ActiveX nas planilhas e grficos Lio 11:
Trabalhando com Barras de Ferramentas Lio 12: Os Suplementos
Lio #02 O Vocabulrio das Macros VBA do Excel 4

Saudao
Entre no maravilhoso mundo do VBA (macros) com estas 29 lies. No somente a linguagem de
programao para desenvolver macros (Visual Basic for Application ou VBA) fcil para aprender, mas o
seu ambiente de desenvolvimento extremamente amigvel para o usurio. Desde 1997, voc pode
desenvolver muito mais que comandos de macro (macros) com VBA. O VBA para todo mundo. Ele uma
linguagem muito simples e projetada para os USURIOS. Com o VBA voc pode desenvolver pequenos
procedimentos (10 linhas ou menos) que lhe pouparo um monte de tempo, eliminando tarefas repetitivas.
Voc tambm pode desenvolver programas complexos e poderosos por uma frao do preo que ele poderia
lhe custar para consegu-los desenvolvidos por especialistas em computao. A experincia tem me mostrado
em incontveis vezes que certas anlises e relatrios sofisticados SOMENTE podem ser desenvolvidos com o
Excel e o VBA. Isto porque o Excel o programa de anlise e relatrio mais usado no mundo.

Divirta-se
Fase # 1: Desenvolvendo Procedimentos (Macros) VBA em
Excel.
Lio 1: Introduo ao VBA do Excel - Lio 2: Vocabulrio das Macros VBA do
Excel - Lio 3: O Gravador de Macros Excel - Lio 4: O Visual Basic Editor - Lio 5: Modificando
Macros no Visual Basic Editor - Lio 6: Escrevendo
Macros no VBEditor - Lio 7: Testando Macros no Visual Basic Editor - Lio 8: Eventos VBA do
Excel - Lio 9: Segurana e Proteo no VBA do Excel

Lio 1: Introduo ao VBA do Excel


O VBA "Visual Basic for Application". Ele uma linguagem de programao que permite usurios a
programarem macros para executar tarefas repetitivas ou complexas automaticamente dentro do Excel. Com
o VBA do Excel voc pode desenvolver pequenos procedimentos (macros) que tornaro a sua vida profissional
mais fcil e lhe permitir fazer mais em menos tempo. Mas o VBA tambm uma linguagem de programao
muito poderosa com a qual voc pode desenvolver dentro do Excel programas reais que executem em poucos
minutos tarefas muito complexas. Com o VBA do Excel voc pode desenvolver um programa que faa
EXATAMENTE o que voc precisa.
Lio 2: Vocabulrio das Macros VBA do Excel
Se como eu voc for um contador voc tem dispensar anos numa faculdade para aprender lanamentos de
dbitos e crditos. Quando voc falar com outros contadores eles entendero a respeito do que voc est
falando, mas se voc falar com advogados ou engenheiros eles no tm uma pista. Em programao existem
certos termos que voc precisa aprender sobre eles para descobrir o bsico e o mais complexo. Estes termos
so "objetos", "propriedades", "mtodos" e outros. Aqui est o que eles so e o que eles significam.
Lio 3: O Gravador de Macros do Excel
Quando voc iniciar o gravador de macro voc pode escolher para anexar a macro a uma tecla do teclado.
Quando ela foi gravada voc apenas clicou na tecla que voc escolheu e a macro por outro lado fez isto
novamente. Desenvolva a sua primeira macro Excel com esta lio passo a passo sobre como usar o Gravador
Lies de VBA do Excel 5
de Macros do Excel. Aps 12 anos de programao eu ainda uso o Gravador de Macros do Excel diariamente.
Ele o melhor professor e o maior dos assistentes. Lio 4: O Visual Basic Editor
O Visual Basic Editor - VBE o subprograma em Excel com o qual voc desenvolve, testa e modifica as suas
macros, em Excel. Ele um ambiente muito amigvel para o usurio. Voc no precisa instal-lo, ele j est
l toda vez que voc abrir o Excel. Aqui est como configur-lo para tornar a sua experincia tanto quanto
possvel, fcil, agradvel e til. Desenvolver macros, criar useforms com controles (botes de comando, caixa
de listagens, caixas de texto, caixas de combinao (listas drop-down), etc..). Configure e mude todas as
propriedades dos componentes.

Lio 5: Modificando Macros no Visual Basic Editor


Numa lio anterior voc gravou uma macro mas agora que voc entendeu o fundamento
dela voc quer faz-la MAIS. Aprenda como modificar uma dada macro no Visual Basic
Editor - VBE.
Lio 6: Escrevendo Macros no VBEditor
Neste captulo criamos uma nova macro (procedimento VBA) estigmatizada.
Escreveremos manualmente as sentenas (cdigos) que o Excel entende. Descubra
mesmo assim uma linguagem muito poderosa.
Lio 7: Testando Macros no Visual Basic Editor
Agora a vez de testar a macro passo a passo. Voc no quer somente test-la passo a
passo, mas voc quer v-la funcionando no Excel quando voc rod-la lentamente.
Aprenda como se desdobra a sua tela para ver o Visual Basic Editor e o Excel ao mesmo
tempo. Voc clica na tecla F8 para rodar a macro passo a passo e voc v as coisas
acontecendo no Excel. Voc no gostou do que viu ento voc volta atrs para modificar
o cdigo e v adiante novamente. Lio 8: Eventos VBA do Excel
Uma macro inicia quando um evento acontece. Uma macro em Excel usualmente inicia
quando voc clica num boto como em qualquer outro programa grande. O clicar
chamado de um evento. Existem mais coisas para os eventos do que apenas clicar num
boto. Voc pode clicar num item de menu, num cone de uma barra de ferramentas,
numa tecla do teclado mas a abertura de uma pasta tambm um evento, mover-se para
uma certa folha um evento e apenas mover o cursor sobre um boto pode iniciar uma
macro. Aprenda sobre todos os eventos, o mais usual e alguns dos menos usuais. Assim
basicamente quando um evento acontecer voc chamar uma macro com uma sentena
muito simples como "Call proMyMacro".
Lio 9: Segurana e Proteo no VBA do Excel
Aprenda como proteger seu computador de vrus transmitidos pelas macros. Aprenda
como proteger suas macros (procedimentos VBA) com uma senha (password) e aprenda
como usar a propriedade "VeryHidden" da folha para REALMENTE ocultar uma
planilha contendo salrios e preos. Quando ela estiver very hidden a folha est l mas
somente VOC e uns poucos selecionados que sabe o password para a suas macros
podem acess-las.
Lio #02 O Vocabulrio das Macros VBA do Excel 6

Para quem serve estas 9 lies?


Estas lies foram projetadas para os contadores, planejadores de produes,
supervisores de produo, pessoal de vendas, analistas financeiros e outros analistas de
dados de negcios.
O VBA uma linguagem de programao para os usurios. Ela simples e fcil
para aprender. Qualquer um pode desenvolver macros simples (procedimentos de VBA)
e com tempo e interesse voc pode chegar a um ponto onde voc pode desenvolver
muitos procedimentos complexos para efetuar tarefas muito sofisticadas. Ela fornecer
a voc uma ferramenta que vai alm daquele feijo com arroz geralmente praticado por
muitos todo o dia.
Voc pode esperar em desenvolver aplicaes muito brilhantes se voc:
- conhecer bem os seus dados (financeiros, contbeis, vendas, marketing, estoque, etc..)
- conhecer bem o Excel (SUMPRODUCT, INDEX/MATCH e outras funes importantes
do Excel, mais as funcionalidades do database do Excel). No precisa aprender sobre
funcionalidades muito raramente usadas como pivot tables, solver, atingir metas,
cenrios, group e outline e outras ferramentas especializadas.
esta maleabilidade que faz com que a anlise dos dados tenha uma apresentao
realmente profissional e somente vista em verses de programas estatsticos SPSS, etc..
Se voc tiver mais do que 10 anos de experincia no seu campo de
especializao (Contabilidade, Finanas, Produo, Engenharia, etc...) voc deve querer
aprender VBA para tornar-se um desenvolvedor VBA do Excel (o mercado e o dinheiro
so muito bons). Precisa para isso ter conhecimentos bsicos de Excel.
nossa inteno desenvolver ferramentas que permanecem na obscuridade e
abrir a voc novas fronteiras na arte de analisar dados. O que so estas 9 lies?
Por favor, no pule o primeiro captulo sobre o vocabulrio. Algumas das coisas
que eu preciso falar para voc sobre elas mais tarde soaro como Marcianas. Se voc
falar Marciano, ento, siga em frente....
Da ento eu lhe apresentarei ao gravador de macro, uma caracterstica nica que
permite a voc criar macros enquanto voc est fazendo manualmente o que voc
gostaria que a macro fizesse. Da ento nas prximas 4 lies, eu darei uma olhada no
Visual Basic Editor (VBE), o ambiente de programao mais amigvel do usurio no
mercado.
Voc ento aprender sobre os EVENTOS que disparam as macros (lio 8), controles
(botes de comando) e os userforms.
Finalmente h a lio 9 sobre segurana e proteo.

Lio #01: Introduo ao VBA do Excel

O
VBA "Visual Basic for Application". uma linguagem de
programao que permite os usurios a programarem macros para efetuar
tarefas complexas dentro de uma aplicao. Com o VBA do Excel voc
pode desenvolver pequenos procedimentos (macros e/ou funes) que
Lies de VBA do Excel 7
tornaro sua vida profissional mais fcil e lhe permitir fazer mais em menos
tempo. Mas o VBA tambm uma linguagem de programao muito poderosa
com a qual voc pode desenvolver dentro do Excel programas reais que efetuaro
em uns poucos minutos tarefas muito complexas. Com o VBA para o Excel voc
pode desenvolver um programa que faa EXATAMENTE o que voc precisa.
Visual Basic e VBA
O que VBA?
Existe o VBA para o Excel, o VBA para o Word, o VBA para o Project, o VBA para Existe um VBA para
o Access. Voc pode usar o VBA em Autocad, Oracle e mesmo com o EssBase. cada Aplicativo
Todos os VBA's so semelhantes, mas variam nos objetos com os quais eles trabalham.
Todos eles tm a mesma fonte Visual Basic (VB).
De onde veio o VBA?
Nos anos 70 uma nova linguagem de computador apareceu chamada Basic. Eu
a usei em calculadoras avanadas (TI 59). Naquele tempo, a RAM (memria) e a CPU's
(o crebro do computador) eram muito, muito pequenos e voc estava limitado no que
voc poderia fazer com a linguagem. Lembro-me ainda que no final daquela dcada eu
era Estagirio numa Empresa de Construo Civil, no Rio de Janeiro, e tinha programado
uma folha de pagamento completa (salrios, impostos, benefcios) para 500 empregados
na calculadora Texas Instrument 59.
Com os computadores de hoje em dia veio o Visual Basic (VB). Ela ainda o
Basic, mas, um monte de elementos est pr-programado, tornando a tarefa do usurio
muito mais simples. A Microsoft adotou a linguagem e introduziu-a como um
componente de todas as suas aplicaes. Deveria eu aprender VBA ou VB?
Digamos que VB para programadores e VBA para usurios (ou
desenvolvedores). Pessoalmente, eu tive vrias horas de treinamento em VB, mas eu
fao todo o meu trabalho no VBA para Excel. Voc no precisa aprender VB para ser
bom em VBA. Eu tenho adotado o VBA para o Excel porque a maioria das funes que
eu preciso para organizar e analisar os dados de negcios est pre-programada no Excel.
Custa muito menos para desenvolver aplicaes financeiras e administrativas no Excel
do que re-inventar a roda e fazer tudo em VB.
Qual a diferena entre VB, VBA para Excel, para Access, para Word,
para Project, etc.?
Para responder esta questo eu lhe pediria para imaginar um encontro de cinco
pessoas falando Portugus, um advogado, um contador, um mdico, um qumico e um
psiclogo. Todos eles falam Portugus, mas quando for vez de falar a respeito do seu
trabalho dirio nenhum deles entende totalmente o outro. o mesmo com o VB e

VBA's. Os objetos, propriedades e mtodos variam substancialmente de uma sublinguagem para a


outra.
Mas basicamente, se voc falar Ingls voc pode falar VB ou quaisquer dos VBA's.
Lio #02 O Vocabulrio das Macros VBA do Excel 8

O Projeto VBA

Ao iniciarmos uma Pasta de trabalho no Excel automaticamente criado

um Projeto VBA atrelado a ela. Um Projeto VBA o equivalente Pasta de


trabalho no Excel.

O Projeto VBA composto por:


Pastas de Trabalho
Estes dois elementos so prprios do Excel
Planilhas
Formulrios
Mdulos Estes trs elementos so prprios do VBA

Classes

Gostaramos de salientar que durante o processo de desenvolvimento em VBA,


haver situaes onde a resposta ser encontrada com muito trabalho. Para assegurar
que o esforo no foi em vo, boa prtica documentar o que est sendo feito, e como
a soluo foi encontrada. Quando todo o trabalho documentado voc assegura um
documento de referncia para o futuro.

Prtica #01: Introduo ao VBA do Excel

Lio 2: Vocabulrio das Macros VBA do Excel1

N o universo do VBA do Excel (Macros) existe algum vocabulrio


(terminologia) que voc poder querer adotar de modo que outros possam
lhe entender e de modo que voc possa entender os outros. Isto
ocorre em qualquer linguagem de programao. Alguns dos termos so bem conhecidos,
e requerem pouca explicao. Outros so termos que voc no deve ter encontrado antes.
O que segue uma lista dos termos chaves do Visual Basic que so cobertos nesta lio:

Objeto
Propriedade
Mtodo
Argumento
Colees
Procedimento
Subrotina
Funo

1
NOTA: Esta lio sobre o vocabulrio de programao. Se voc estiver procurando cdigos (as
palavras usadas para falar ao Excel em VBA) v para a seo de cdigo VBA (11 pginas deles)..
Lies de VBA do Excel 9
Macro
Declarao
Expresso

Esta lio dar uma explicao destes termos junto com ilustraes de modo que
quando voc encontrar estes termos nas outras lies voc no ficar confuso. Tambm,
voc encontrar que outras lies do uma cobertura em profundidade destes termos.
Macros do Excel: uma srie de passos que se armazenam e que podem ser ativados com O que uma
alguma tecla de controle (Ctrl) mais uma letra. Por exemplo, todos os dias emprego MACRO?
freqentemente em minhas clulas os mesmos passos: Tamanho de Fonte (Tamanho da letra),
Negrito, Fonte (Tipo de letra) e Cor de Fonte (Cor de Letra). Para no estar repetindo estes passos, posso
armazen-los numa macro e, quando executar esta macro, os passos antes mencionados se executaro quantas
vezes eu desejar. Enfim, uma macro uma srie de instrues realizadas pelo Excel, ao invs de voc.
As macros ou sub-rotinas comeam com a palavra Sub, seguida pelo nome da macro.
Elas terminam com as palavras End Sub.
O que segue um exemplo de uma subrotina ou macro:

Sub AlMundo()
MsgBox "Al Mundo"
End Sub
PROCEDIMENTOS: So conjuntos de declaraes que realizam uma tarefa especfica.
Procedimentos podem ser ou macros ou funes. As Funes sero vistas mais abaixo.
Eventos: Para um procedimento iniciar e ser executado, um evento deve acontecer. O
evento , portanto, a causa de uma ao (ou mtodo, como veremos abaixo). Um evento
que todo mundo conhece o clique (click) no boto. Outros eventos incluem abertura de
uma pasta, ativao de uma folha, modificao do valor de uma clula, etc.
Cdigo: Quando voc estiver escrevendo as instrues em VBA, diz-se que voc est
codificando, ou escrevendo cdigo. Mostre-me seu cdigo e eu lhe mostrarei a mina.
Todos os pedaos de cdigos esto aqui apresentados na fonte Courier New de tamanho
11.

Para escrever cdigo em VBA para macros voc usar 5 tipos de componentes: Componentes
objetos, propriedades, mtodos, funes e declaraes: dos Cdigos
O QUE SO OBJETOS ?
Antes de definir o que um objeto, observe os exemplos seguintes:
Televises
Carros
Lmpadas
Objetos do dia a dia
Mesas
Lpis
Computadores
Lio #02 O Vocabulrio das Macros VBA do Excel 10

No exatamente o que voc esperava ver? Objetos sua volta so as coisas que
voc pode ver, tocar, sentir ou mudar. Em Visual Basic, objetos so as mesmas coisas.
Eles so basicamente qualquer coisa que voc possa selecion-la. O que segue so alguns
dos objetos mais comuns do Visual Basic do Microsoft Excel:

Clulas
Planilhas
Pastas
Folhas de grficos
Grficos encaixados
Objetos do VBA
Qualquer coisa que voc desenhar numa folha
Linhas de um diagrama
Legendas de diagramas
Eixos X e Y num diagrama
Barras de ferramentas
Botes Menus

Eles so os blocos de construo dos seus projetos Excel e, so (entre outros), o


Application (o prprio Excel), as Workbooks (Pastas), as Worksheets (Folhas de
Planilhas e/ou Graficos), as Clulas e os Intervalos (Ranges), os Charts, os Desenhos,
os Controles (botes de comando, caixas de texto, caixa de listagens, etc..).

Voc deve ter notado que grandes objetos, freqentemente, incluem objetos
menores. Por exemplo, um objeto pasta contm objetos folhas de planilhas. Um objeto
planilha contm objetos clulas. Se voc olhar ao seu redor, o mesmo se aplica.
Um objeto casa contm objetos salas. E objeto sala contm objetos mveis e utenslios. SOBRE
COLEES...

Uma coleo um grupo de objetos que so todos do mesmo tipo. As colees


esto quase sempre no plural. Exemplos de colees so pastas, folhas de planilhas, e
diagramas. Os membros individuais de uma coleo podem ser referenciados
especificando a coleo e, da ento, ou o nome do membro, ou um nmero que indique a
posio do membro na coleo. Por exemplo, se a primeira folha de planilha na coleo
Sheets chamada Sheet1, uma das duas declaraes seguintes selecionar esta folha e a
tornar a folha ativa:
Coleo
Sheets("Plan1").Select
Membro
ou Sheets(1).Select

Um dos modos principais que o Visual Basic funciona especificando um objeto e da


ento uma ao a ser imposta ao objeto. por isso que o Visual Basic chamado de
linguagem orientada ao objeto.
SOBRE AS PROPRIEDADES...
Lies de VBA do Excel 11
Se voc observar os objetos ao seu redor, voc ver que eles tm propriedades. Por
exemplo, uma casa tem uma propriedade endereo, uma pessoa tem uma propriedade
nome, uma sala tem uma propriedade cor, e uma televiso tem uma propriedade ativa (ou
est ligada ou desligada). Os objetos no Microsoft Excel tambm tm propriedades. Por
exemplo, uma clula tem uma propriedade endereo, uma folha de planilha tem uma
propriedade nome, e uma fonte tem uma propriedade cor.

Como os exemplos acima ilustram, as propriedades so caractersticas de um objeto.


Alguns objetos no Microsoft Excel tm muitas propriedades, outros tm muito poucas. A
maioria das propriedades dos objetos expressa como nmeros (tais como o tamanho da
margem), strings de textos (tal como um nome de uma folha), ou valores Booleanos (True
ou False).

Se voc observar os objetos ao seu redor, voc pode mudar algumas propriedades
de um objeto, mas nem sempre todas as propriedades. Por exemplo, voc pode ligar e
desligar sua televiso. E voc pode pintar uma sala para mudar sua cor. Mas voc no
pode mudar onde a sua casa est localizada. O mesmo se aplica ao Microsoft Excel. Voc
pode mudar quase todas as propriedades que voc encontrar, mas existem umas poucas
que voc no pode mudar. Por exemplo, voc pode mudar o valor de uma clula (a
propriedade Valor), mas voc no pode mudar o nmero de clulas de uma folha.

O Visual Basic funciona muito do jeito que voc faz no Microsoft Excel. Se voc quiser
entrar com um valor numa clula, voc primeiro seleciona a clula da ento voc digita nela
o valor. No Visual Basic, voc especificar a clula, digita um ponto, especifica uma
propriedade Valor, digita um sinal de igual e digita o valor para a clula. Por exemplo:
Como entrar com
ActiveCell.Value = 5 um valor numa
clula
Neste caso ActiveCell uma palavra-chave que se refere clula ativa, que a
clula destacada pelo cursor. Value uma palavra-chave que representa o valor da
propriedade de uma clula. Por favor, note que so muitas as maneiras de se referir s
clulas alm de ActiveCell. Estas maneiras sero cobertas, em detalhes, nas lies
posteriores.

Exatamente como voc especifica sua cidade, rua, e nmero da casa num endereo, voc
pode fazer o mesmo no Visual Basic para melhor identificar uma clula particular:
Workbooks("Custo.Xls").Sheets("Folha1"). _
Outra maneira
Range("A1").Value = 5
Neste caso, vrios objetos (uma pasta, uma folha de planilha e uma clula) so
juntados com pontos para identificar uma clula particular. Dai ento a propriedade
(Value novamente neste caso) ligada com um ponto. Finalmente um sinal de igual
entrado seguido por um nmero. A string acima diz ao Visual Basic que ajuste o valor da
clula A1 da folha de planilha Folha1 na pasta Custo.Xls para 5. Por favor, note que clula
A1 no tem que ser a clula ativa.

Se voc quiser encontrar o valor de uma propriedade em vez de mud-la, especifique o


objeto e a propriedade. Normalmente, o valor que retornado armazenado numa
Lio #02 O Vocabulrio das Macros VBA do Excel 12

varivel ou usado numa declarao. Por exemplo, a declarao seguinte mostra uma caixa
de mensagem que lhe diz o valor da clula ativa:
MsgBox ActiveCell.Value

Outra maneira usar a janela local que ser discutida na lio sobre depurao de
suas macros.

A declarao seguinte armazena o nome da folha de planilha ativa numa varivel chamada X, para
uso posterior:
X = ActiveSheet.Name
Neste caso, ActiveSheet o objeto e se refere folha de planilha ativa. Name a
propriedade. A varivel nesta declarao chamada simplesmente de "X". Nomes mais
compridos e mais descritivos de varivel so permitidos.
Falar em propriedade pensar ento no verbo ser/estar ou ter.
A seguir, mostramos outros exemplos de propriedades de objetos do VBA:
Selection.Font.Bold = True ..................A fonte est em negrito.
Exemplos de
Sheets("Talqual").Visible = True.......A folha de planilha Talqual est Propriedade
visvel
ActiveWorkbook.Name ................................. A pasta ativa tem um nome
Exemplos de
Activecell.Value = 10 ou
Propriedade
Activecell.Formula = "=A1+B2" .... A clula pode ter um valor ou uma frmula.

O conjunto de propriedades difere de um objeto para outro. Uma planilha no pode


ser negritada e uma pasta no pode ter uma frmula. Excel dir quando voc estiver
tentando usar uma propriedade que no existe para o objeto que voc est trabalhando.
SOBRE OS MTODOS

Um mtodo um termo do Visual Basic para uma palavra-chave que representa


uma ao que voc quer impor a um objeto. Por exemplo, Copiar, Recortar, e Colar so
todos exemplos de mtodos do Visual Basic. Como uma ao est associada com um
objeto, o Visual Basic requer que voc especifique o objeto, um ponto e da ento o
mtodo. Um sinal de igual no usado. Na declarao seguinte,

Range("B9").Select

o objeto a clula B9 e o mtodo a palavra-chave Select, que faz o ponteiro de clula mover-se
para esta clula.

Na declarao seguinte,
Lies de VBA do Excel 13
ActiveCell.Copy
Ao = Mtodo

ActiveCell a palavra-chave que identifica a clula ativa. Copy o mtodo. Esta


declarao diz ao Visual Basic copiar os contedos da clula ativa para o clipboard para
ser usado mais tarde.

O que segue um exemplo de uso do mtodo Copy sobre uma clula que no a clula ativa:
Range("A9").Copy
Falar em mtodo pensar ento no verbo fazer. Voc poder querer fazer com
que um objeto feche, abra, seja copiado ou colado, etc.. (ActiveWorkbook.Close,
Activecell.Paste). Novamente, o Excel lhe dir quando voc estiver tentando usar
um mtodo que no se aplica ao objeto em uso.
Exemplo:
Sub proTeste ()
Range("A2").Value= 2
ThisWorkbook.Close
Application.Quit
End Sub
Estas quatro linhas constituem um procedimento (macro) chamado "proTeste". Eu
sempre nomeio minhas macros iniciando com o prefixo "pro" e a primeira letra maiscula
para qualquer palavra significante compreendida no nome como proInfo, proDadosBrutos,
proSempreque. Voc ver mais tarde quo importante este prefixo e letra maiscula
costumam ser.

"Range("A2")", "ThisWorkbook" e "Application" so objetos, "Value" uma propriedade e "Close" e


"Quit" so mtodos.
Este procedimento VBA ser atribudo a um objeto boto (controle) e quando o
usurio clicar nele (o evento) o procedimento VBA rodar (o mtodo rodar ser aplicado).
Este procedimento VBA diz ao computador que quando o usurio clicar no boto, a
clula "A2" recebe um valor 2 e o Excel fechado.

Aqui vo alguns cdigos muito comuns:

Trasladar-se a uma Clula

Range("A1").Select

Escrever em uma Clula

Activecell.FormulaR1C1="Bertolo"

Letra em Negrito

Selection.Font.Bold = True

Letra Cursiva (Itlico)


Lio #02 O Vocabulrio das Macros VBA do Excel 14

Selection.Font.Italic = True

Letra Sublinhada

Selection.Font.Underline = xlUnderlineStyleSingle

Centralizar o Texto

With Selection

.HorizontalAlignment = xlCenter

End With

Alinhar esquerda

With Selection

.HorizontalAlignment = xlLeft

End With
Alinhar Direita

With Selection
.HorizontalAlignment = xlRight
End With

Tipos de Letra (Fonte)

With Selection.Font
.Name = "AGaramond"
End With

Tamanho de Letra (Tamanho de Fonte)

With Selection.Font
.Size = 15
End With

Copiar

Selection.Copy

Colar

ActiveSheet.Paste

Cortar

Selection.Cut
Lies de VBA do Excel 15
Ordenar Ascendente

Selection.Sort Key1:=Range("A1"), Order1:=xlAscending,


Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

Ordenar Descendente

Selection.Sort Key1:=Range("A1"), Order1:=xlDescending,


Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

Buscar

Cells.Find(What:="Bertolo", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False).Activate

Inserir Arquivo
Selection.EntireRow.Insert

Eliminar Arquivo

Selection.EntireRow.Delete

Inserir Coluna

Selection.EntireColumn.Insert

Eliminar Coluna

Selection.EntireColumn.Delete

Abrir uma Pasta

Workbooks.Open Filename:="C:\Meus documentos\video safe 3.xls"

Gravar um Pasta

ActiveWorkbook.SaveAs Filename:="C:\Meus documentos\piscis.xls",


FileFormat _
:=xlNormal, Password:="", WriteResPassword:="",
ReadOnlyRecommended:= _
False, CreateBackup:=False

Esses seriam alguns cdigos muito comuns no Excel, mas se voc deseja pode gerar mais cdigos de
outras opes, uma questo de que os ocupe.
Lio #02 O Vocabulrio das Macros VBA do Excel 16

EXERCCIOS:
1. Escreva uma declarao para o Visual Basic colar o contedo do clipboard na
clula A21.
2. Escreva uma declarao para o Visual Basic selecionar a clula A10.
3. Escreva uma declarao para o Visual Basic escrever Bertolo na clula ativa.
4. Identifique nos cdigos acima o objeto, a propriedade e os mtodos

SOBRE AS FUNES...
Funes so conjuntos de declaraes que retornam um valor. Exemplos de funes que
so construdas no Microsoft Excel so a funo Soma() e a funo TIR().

As funes escritas por um usurio so chamadas User Defined Function (UDF's). Tais
funes so teis porque elas podem ser usadas nas clulas da planilha para fazer clculos
especializados no programados nas funes existentes no Microsoft Excel. Tambm,
voc pode usar funes para trocar complexas frmulas de clula SE.
Voc pode, tambm, usar funes em suas macros.
O que segue um exemplo de uma funo UDF:

Function TamanhoDaCaixa(X, Y)
TamanhoDaCaixa = X * Y End
Function

Esta funo calcula o tamanho de uma caixa e retorna com um nmero baseado nos
valores fornecidos para X e Y. Para us-la, voc dever digitar = TamanhoDaCaixa
(clula referncia, clula referncia) numa clula de uma planilha. Por
favor, note que as macros e as funes podem ser muito complexas e poderosas!
Voc pode, e voc vai usar todas as funes Excel dentro de seu cdigo VBA, mas
voc tambm pode usar as funes do VBA como UCASE, LCASE, NOW(), etc..
(Activecell.Value=NOW())
FORNECENDO ARGUMENTOS

Argumentos so valores que so passados s macros, aos mtodos, e s funes.


Para ilustrar o que um argumento, primeiro selecione uma clula e selecione Editar,
Copiar do menu da barra de ferramentas Padro do Excel.. Da ento, v a outra clula e
selecione Editar, Colar especial. Aparecer o menu seguinte:
Lies de VBA do Excel 17
Nesta declarao, as palavras: paste, operation, skipBlanks e transpose so os
argumentos para o mtodo PasteSpecial. Os valores so atribudos a um argumento por
uma combinao de dois pontos e um sinal de igual. Neste caso os valores ou so
numricos, especificados pelas constantes do Visual Basic (xlValues e xlNone), ou so
valores Booleanos que so as palavras: Verdadeiro(True) ou Falso (False). As constantes
do Visual Basic so apenas nomes para nmeros. Usando nomes para nmeros, torna as
declaraes do Visual Basic mais fceis de entender e os valores mais fceis de lembrar.

SOBRE AS EXPRESSES E DECLARAES

As macros, e as funes, so constitudas de declaraes, e estas declaraes so


constitudas de expresses. Na funo
TamanhoDaCaixa = X * Y acima, X * Y uma expresso e TamanhoDaCaixa
= X * Y uma declarao. Uma declarao pode se estender por mltiplas linhas, ou
apenas ser de uma nica linha de tamanho. Na macro AlMundo, cada uma de suas linhas
so declaraes.
Outros exemplos de declaraes so: IF..THEN, DO...LOOP, FOR...NEXT,
WITH...END WITH, EXIT FOR, EXIT DO, EXIT SUB que veremos em detalhes em lies
posteriores.

O PROJETO VBA
Um projeto VBA pode compreender 4 tipos de componentes: a pasta, as
planilhas, os mdulos e os userforms. Componentes

As diferentes selees que voc pode fazer neste painel representam os


argumentos para o comando colar especial. A declarao seguinte do Visual
Basic tem o mesmo efeito que as selees na caixa acima:

ActiveCell.PasteSpecial paste:=xlValues, _ Argumentos de


Lio #02 O Vocabulrio das Macros VBA do Excel 18

operation:=xlNone, _ um Mtodo skipBlanks:=False, _


transpose:=False
UserForms: So folhas de planilhas especializadas que voc cria para permitir o usurio
submeter parmetros (valores). So usados extensivamente em bancos de dados
(databases), contabilidade, produo e programas de vendas, porque no existem folhas
regulares nestes ambientes.
Os Controles so os botes de comando, as caixas de verificao, os rtulos, as caixas de
texto, as caixas de listagens, os botes de opo e outros utenslios que voc colocar nas
planilhas ou userforms.

REQUISITOS DE CONFIGURAO (SETUP) DE MDULO

Esta lio supe que esteja ativada a opo Mostrar erros de sintaxe. Para
confirmar isto no Visual Basic Editor, selecione Ferramentas, Opes, guia Editor, e
verifique esta configurao. Ns recomendamos tambm que medida que o seu nvel de
experincia no Visual Basic tenha aumentado que voc desligue esta opo ela pode
ficar bastante irritante.

Tambm, no Visual Basic Editor, selecione Ferramentas, Opes e v guia Geral e


certifique-se que a opo Interromper em erros no tratados esteja marcada.

SUMRIO

Esta lio introduziu a linguagem Visual Basic. Quanto mais voc usar o Visual
Basic, mais entendvel a linguagem se tornar. A informao nas lies seguintes
fornecer exemplos adicionais dos objetos, mtodos, propriedades, macros, e funes
do Visual Basic.

de um Projeto

Workbooks (Pasta): A pasta um arquivo Excel (algo.xls) tambm chamado de


planilha. O objeto "ThisWorkbook" a pasta para a qual a macro foi criada. O cdigo:
ThisWorkbook.Close

um mtodo que fechar a pasta dentro da qual a macro ativa est rodando.
Worksheets (Planilha): Uma folha de planilha do Excel 2007 que pode ter
1.048.576 linhas e 18.278 colunas.
Mdulos: uma espc ie de um arquivo no qual voc guarda a m aioria de suas m acros
(= sub-rotinas VBA). Mdulos so criados e nomeados no Visual Basic Editor.
Lies de VBA do Excel 19

Lio 3: O Gravador de Macros Excel


Com o gravador de macro Excel voc no pode desenvolver uma macro que
danificar o Excel ou seu computador. Quanto mais corajoso voc em suas
tentativas mais voc aprender.
Eu tenho desenvolvido macros por algum tempo, e uso o gravador de macro Excel
diariamente. No para aprender qualquer coisa, mas para escrever cdigo (palavras e
sentenas VBA) para mim. O gravador de macro Excel o melhor professor que voc
pode ter e permanecer o melhor assistente para o resto de sua vida de desenvolvedor de
VBA. Pessoalmente, eu uso muito o gravador de macro Excel para evitar em escrever
cdigo e fazer erros de ortografia.
Imprima esta pgina e siga as suas instrues passo a passo.
Antes de mais nada, caso esteja trabalhando com o Office 2007 procure ativar

(se voc ainda no fez) a guia Desenvolvedor. Para tanto v ao boto do Office >
Opes do Excel e marque a caixa de verificao

Lembre-se que no Office 2007 precisamos salvar as planilhas habilitadas para


macros. Assim,
Lio #03 O Gravador de Macros Excel 20

A seguir lhe mostro como gravar uma macro, e como execut-la:


Abra o Excel
Translade-se clula A1 e escreva o seu nome. Por exemplo, Bertolo e pressione Enter
Regresse clula A1, porque quando destes Enter sob a clula A1, o ponteiro muda
para outra clula.
D um clique na Guia Desenvolvedor, a sua tela ficar assim:

Ativar-se-o as ferramentas do Visual Basic.


Agora d um clique no boto Gravar Macro. O Windows ativa a caixa de
dilogo Gravar macro, a qual lhe permitir dar a ela um nome e qual tecla de atalho ser
usada para execut-la. A tecla de atalho se refere com qual letra se vai ativar a macro,
obviamente se ativar com a tecla Controle (Ctrl) e uma letra que voc queira, de
preferncia em minscula, porque se usar as maisculas a macro dever ser ativada
pressionando a tecla Shift + Controle + a letra que voc indicou.
Lies de VBA do Excel 21

Onde se diz Nome da macro j aparece o nome que a macro levar, neste caso
Macro1. Se desejares trocar este nome, escreva um novo, mas eu o recomendo que
deixes assim.
Na opo Tecla de atalho que aparece e que se ativar com a tecla Controle (CTRL)
+ a letra que voc indicar, d um clique no quadradinho e ponha uma letra. Para o
propsito deste exerccio entre com A (maisculo) nesta caixa de texto. Mais tarde
voc ser capaz de rodar a macro apenas mantendo as teclas CTRL e um SHIFT e
clicando em A2.
Em "Armazenar macro em:" est uma lista de todas as pasta que esto abertas,
selecione "Esta pasta de trabalho" que a pasta na qual voc est realmente
trabalhando.
Observe que existe uma opo drop down nesta caixa de dilogo. Se voc selecionar
Pasta de trabalho pessoal de macros, as instrues sero gravadas numa pasta
chamada "Pessoal.xls". Se esta pasta no existir, o Microsoft Excel a criar. Se o
Microsoft Excel a criar, a pasta inicialmente ser uma pasta oculta. Voc ter que
selecionar Janela, Reexibir para mostr-la. Quando voc salvar Pessoal.xls, ela ser
salva no seu diretrio XLSTART. Deste modo, quando voc abrir Microsoft Excel,
este arquivo automaticamente aberto e as macros que voc criou e armazenou nesta
pasta esto imediatamente disponveis. Se voc estiver executando o Excel numa rede,
voc deve precisar especificar um diretrio de incio alternativo no painel
Ferramentas, Opes, Geral e salvar o arquivo para este diretrio na primeira vez.
Usualmente a opo Esta pasta de trabalho melhor.
D um clique no boto OK. O Windows comear a gravar todos os passos na
chamada daquilo que voc especificou e a anexou na pasta que voc est trabalhando,
e aparecer na barra de Status o cone quadradinho Azul e chamarse- Parar
gravao

2
NOTA: Sempre selecione a letra maiscula de modo que voc no desative importantes funes que
esto j anexadas a alguma letra minscula pelo Excel.
Lio #03 O Gravador de Macros Excel 22

Quando voc gravar a planilha que voc est trabalhando, a macro ser salva ao
mesmo tempo. Tambm significa que a Macro1 desaparecer do seu computador
quando voc deletar a planilha.
De agora em diante voc no pode errar, pois ser tudo gravado (inclusive os
erros).

#1. Clique com o boto direito do mouse na clula e, a seguir, clique no item de menu
Formatar Clulas..., e aparecer o painel abaixo:
Lies de VBA do Excel 23

Na guia Fonte troque o tipo de letra na caixa Fonte:


#2. Troque o tamanho da letra na caixa Tamanho:
#3. Selecione Negrito na caixa Estilo da fonte #4.
Troque a cor da letra na caixa Cor:.
Lembre-se que todos estes passos esto sendo armazenados na macro que estamos
gravando e, tambm lembre-se que estes passos esto se efetuando na clula A1.
#5. Pressione o boto Parar gravao na barra de Status:
ou ento, no cone Parar Gravao na Guia Desenvolvedor.

Assim o Excel guarda os passos na Macro1 qu e se ativar pression ado a tecla


Ctrl + a .
I. Escreva outro nome na clula C1 e pressione Enter, depois volte clula C1.
II. Pressione a tecla Ctrl + Shift + A. O Windows efetuar todos os passos gravados
sobre a clula C1, isto quer dizer que o nome que esta em C1 ter as mesmas
caracteresticas do que est em A1. Tipo de letra, tamanho, negrito e a cor que indicastes
ao gravar a macro3.
III. V para Plan2 e rode a macro novamente. Voc pode ver que a macro que voc
criou rodar em qualquer folha de planilha enquanto a folha de planilha em que ela foi
criada estiver aberta
IV. Salve sua pasta como "VBATeste1" para as prximas lies e feche-a. Tente
rodar a macro novamente. Ela no estar mais l, assim voc no pode rod-la se a tecla
de atalho estiver livre.
Se voc fez isto, voc gravou sua primeira macro com o gravador de macro do
Excel e a usou, congratulaes. Agora recomendo que domines estes passos antes de
passares lio seguinte. Trata-se de criar macros que armazenem passos como esses,
grave os passos que te indiquei, e parar a gravao depois de que indicastes estes passos.
Repita este exerccio tantas vezes quanto desejares necessrio para apreend-lo bem.

3
Cada vez que presisonares Ctrl + Shift + a, o Excel executar a macro e efetuar os passos na clula que
onde voc se encontrar. Podes gravar todas as macros que desejares.
Lio #03 O Gravador de Macros Excel 24

Prtica I
1. Vamos agora gravar outra macro com o gravador de macro Excel:
Selecione clula A1 e entre com 34
Selecione clula A2 e entre com 55
Selecione clula A3 e entre com a frmula =A1 + A2
Selecione clula A2 e mude a cor da fonte para vermelha
Selecione clula A1 e mude a cor de background (padro) para azul
Selecione clula A3 e mude o tamanho da fonte para 24
Clique no cone no meio da tela para parar o gravador ou ir para a barra de menu
"Ferramentas/Macro/Parar gravao".
Teste a sua macro na Plan2, na Plan3,

2. Gerar as Macros seguintes:


Grave uma Macro que se ative com Ctrl+Shift+b e que esta macro lhe permita abrir um
arquivo
Grave uma Macro que se ative com Ctrl+Shift+c e que esta macro lhe permita inserir um
WordArt
3, Ver Livros mais exerccios..............

Muitos pensaro que isto no nada mais do que veremos mais adiante quando mesclarmos os cdigos
que fora gerado pelo Excel com os de Visual Basic. Isto ser pura Mentira.

GRAVAO ABSOLUTA E RELATIVA


Quando voc estiver gravando uma macro, voc tem a opo gravar usando
endereos de clula absolutos ou endereos de clula relativos. Alm disso, voc pode
mudar esta opo quando voc estiver gravando uma macro. Qual opo escolher muito
importante em como opera a macro que voc gravou. Tambm, declaraes diferentes
do Visual Basic so gravadas.
Esta opo est disponvel no segundo boto na barra de ferramentas que aparece
quando voc comear a gravao de uma macro:

Se o boto estiver apertado, a gravao est no modo relativo. Se no apertado,


ento referncias de clula absoluta esto sendo usadas.. O execcio que segue ilustra a
diferena entre gravao relativa e absoluta.
Crie uma folha de planilha como a seguinte de modo que voc possa fazer este exerccio.

A B C D E
1
2
3 Nmeros Frmulas
4
5 1234 1234
6 5678
7
Lies de VBA do Excel 25

Coloque o ponteiro de clula na clula B3, a qual contm a palavra "Nmeros".


Voc no pode pre-definir a opo de gravao relativa/absoluta.
Principalmente, se voc configur-la aps comear a gravao. Se o boto relativo
estiver apertado, ento a gravao relativa, caso contrrio, absoluta.
Novamente selecione na Barrra de Status o cone Gravar Macro

Nomeie a macro como "GravaoAbsoluta" (sem as aspas duplas). Mude a caixa


de descrio para apresentar "Macro modelo para demonstrar gravao absoluta".
Selecione o boto OK. Tenha certeza de que o boto gravao relativa no est apertado.
At este ponto, suas aes estavam sendo gravadas. Selecione (usando seu mouse)
a clula D3, que contm a palavra "Frmulas".
Pare a gravao clicando no boto parar na Barra de Status.
O que voc tem feito foi gravar uma macro usando gravao de endereos de clula
absoluta. Eu explicarei mais sobre esta macro mais tarde. O que eu preciso que voc
faa agora gravar uma outra macro. Esta uma demonstrar a gravao relativa.
Novamente selecione a clula B3, a clula com a palavra "Nmeros" de modo que voc
esteja nesta clula quando voc fizer o prximo passo.
Selecione Gravar Macro na Barra de Status.
D macro o nome de "GravaoRelativa", e entrar com uma breve descrio na caixa
de descrio. Selecionar OK. Clicar no boto gravao relativa para torn-lo
pressionado, ligando assim a gravao relativa.
Clique na clula D3 (a clula com a palavra "Frmulas") com o mouse.
Selecione Parar Gravao ( o boto ) na Barra de Status
At este ponto voc tem duas macros, uma chamada "GravaoAbsoluta", e uma
chamada "GravaoRelativa". Faa o seguinte para testar a macro GravaoAbsoluta:
Coloque o ponteiro de clula na Clula A1
Selecione Ferramentas, Macro, e execute a macro GravaoAbsoluta.
Repita o passo acima, mas primeiro coloque o ponteiro de clula em diferentes
clulas, Por exemplo, A5, C3, D7, etc..
O que acontece cada vez que voc executa a macro que o cursor vai para a clula
D5. Esta a clula que voc selecionou quando voc gravou a macro. Assim, gravao
de endereo de clula absoluta significa ir para as clulas que esto selecionadas, no
importa onde voc esteja na planilha.
Faa o seguinte para tentar a macro GravaoRelativa:
Coloque o ponteiro de clula na Clula A1
Selecione Ferramentas, Macro, e d um duplo clique na macro GravaoRelativa.
Repita o passo acima, mas com o ponteiro de clula nas clulas diferentes, Por
exemplo, A5, C3, D7, etc..
26

Lies de VBA do Excel

O que acontece cada vez que voc rodar a macro e que o ponteiro de clula move
duas clulas para a direita. Isto o que voc fez quando voc gravou a macro usando
gravao relativa. Assim, gravao relativa de clula significa mover o ponteiro da clula
relativa para a clula ativa.
No importa qual meio de gravao voc escolheu, relativo ou absoluto, depende da
seleo de clula em atividade que voc quer gravar. Se a macro que voc est gravando
no envolver qualquer seleo de clula em atividade, ento no faz diferena qual
configurao est no lugar. Por exemplo, uma macro que apenas muda a estrutura da
pgina ou que imprime um arquivo no envolve selees de clula.
O que segue o que o cdigo de macro das duas macros acima se parece:
Sub GravacaoAbsoluta()
Range("D3").Select End
Sub

Sub GravacaoRelativa()
ActiveCell.Offset(0, 2).Range("A1").Select
End Sub
Quando macros so gravadas usando gravao absoluta, o Microsoft Excel grava
as referncias de clula na macro que criada. Se a macro for gravada usando gravao
relativa, ento gravada a distncia da clula destino em termos do nmero de linhas e
colunas da clula ativa. Como as duas macros acima ilustram, declaraes diferentes
tambm so gravadas, por exemplo, os mtodos Select e Offset.
As duas macros que gravamos tambm do vrios comandos adicionais para ns que
provaro serem de valor: Range, Select, e Offset. Este um dos benefcios principais
do gravador de macros - o fato que eles mostram a voc declaraes de macros que
provaro teis para voc em suas macros. A discusso deles ser deixada por enquanto.
ARMADILHA DA GRAVAO ABSOLUTA
H uma armadilha com o uso de gravao absoluta que voc dever estar
consciente. Eu ilustrarei isto com o seguinte exerccio que insere Jan, Fev, e Mar como
ttulos de colunas.
V para uma planilha em branco numa pasta
Selecione a clula B2
Verifique para ver se a gravao absoluta ou relativa. Faa isto examinando o
boto. Se ele no estiver apertado, ento a gravao est configurada para
Absoluta. Se ele estiver apertado, ento a gravao est configurada para
Relativa. Clique o boto se ele no estiver apertado
Selecione Ferramentas, Gravar Macro, Gravar Nova Macro.
Defina o nome da macro para atravesMeses
Selecionar OK para comear a gravao. Fique certo de que o boto gravao
relativa no esteja pressionado.
Digite "Jan", selecione C2, digite "Fev", selecione D2, e digite "Mar" Selecione
B2, a clula contendo "Jan"
27

Parar gravao.
At este ponto voc tem uma pequena macro que entra com Jan, Fev, e Mar nas
clulas B2, C2, e D2 para voc. Vamos conferir a macro.
Apagar as B2, C2 e D2
Coloque o ponteiro de clula em B2
Execute a macro.
Como voc esperava, a macro escreve Jan em B2, Fev em B3, e Mar em B4.
Apagae a planilha e repeta o que est acim, mas coloca o ponteiro de clula em B5 antes
de executar a macro. O que segue o resultado que voc obtm:
Note que Jan no est na clula B2, mas em B5. Se voc repetir o proceso mas
comeando numa clula diferente, por exemplo A1, a entrada de Jan termina naquela
clula. Por que isto aconteceu com a gravao absoluta ligada? Esperar-se-a a macro
colocar Jan na clula B2 como voc digitou-a pois a gravao absoluta estava ligada. O
problema acima aconteceu porque a primeira ao que voc fez depois de
ligar o gravador foi digitar a palavra "Jan". Voc no selecionou primeiro a clula B2.
O que segue o que a macro que voc gravou se parece:
Sub atravesMeses()
ActiveCell.FormulaR1C1 = "Jan"
Range("C2").Select
ActiveCell.FormulaR1C1 = "Fev"
Range("D2").Select
ActiveCell.FormulaR1C1 = "Mar"
Range("B2").Select
End Sub
O R1C1 um resqucio da verso original do Excel. Nas verses anteriores do
Excel, macros trabalhavam se referindo s linhas e colunas por seus nmeros, por
exemplo, Coluna A era C1, coluna B era C2, e assim por diante. Se uma propriedade,
neste caso a propriedade frmula tem R1C1 anexada nela, significa que voc deve
fornecer os endereos de clula numa frmula usando a notao R1C1. Se voc est
fornecendo apenas valores, ento no faz diferena. No nosso exemplo, estamos
fornecendo valores.
Para gravao absoluta funcionar da maneira que voc quer, primeiro voc deve
selecionar uma clula, depois que voc ligou o gravador, e da digitar a entrada. Se a
clula j estiver destacada, clicar nela novamente com o mouse. Isto diz ao gravador para
selecionar a clula. Se voc clicou na clula B2 mesmo que ela estivesse selecionada,
sua macro ficar parecida com esta, e entrar com Jan em B2, etc..
exatamente como voc pretendia:
Sub atravesMeses()
Range("B2").Select
ActiveCell.FormulaR1C1 = "Jan"
Range("C2").Select
ActiveCell.FormulaR1C1 = "Fev"
Range("D2").Select
ActiveCell.FormulaR1C1 = "Mar"
Range("B2").Select
Lio #03 O Gravador de Macros Excel 28

End Sub
Por favor, note que se voc estiver usando gravao relativa e j tiver o ponteiro
de clula onde voc quer comear suas entradas, voc no precisa selecionar a clula
primeiro.

Fase #1: Desenvolvendo Procedimentos VBA em Excel

Lio 4: O Ambiente Amigvel do Visual Basic Editor do Excel

B em, agora depois de praticar os diferentes exemplos ou seja, as Macros


desenvolvidas com o Gravador de Macros (GM), vamos, nas prximas lies,
observar os cdigos que foram gerados para elas. Recomendo a voc que salve o
Excel e volte a entrar, para que trabalhe limpo sem nenhuma macro, e comeando
a macro1 de novo.
As observaes, testes e modificaes dos cdigos dos procedimentos VBA so
feitas numa ambiente de programao conhecido como Visual Basic Editor (VBE) do
Excel. um ambiente muito amigvel ao usurio. Nele tambm podemos escrever os
nossos procedimentos (macros e funes) a partir do zero, isto , sem a utilizao do
gravador de macros.
Os procedimentos VBA desenvolvidos no VBE, tornam-se parte da pasta na qual
eles foram desenvolvidos, e quando a pasta salva, os componentes do projeto (macros,
mdulos, userforms) so salvos ao mesmo tempo. O Visual Basic Editor do Excel
(VBE)
O VBE est integrado ao Excel e voc pode abr-lo de trs maneiras:
Selecione a guia Desenvolvedor, Visual Basic Editor, ou
Pressione ALT-F11, ou
Clique no cone na Barra de Ferramentas de Acesso Rpido do Excel.
O que segue com o que o Visual Basic Editor se apresenta. Seu editor deve parecer
ligeiramente diferente por causa das mudanas que voc fez ou porque diferentes verses
do Excel ter caractersticas diferentes:
Lies de VBA do Excel 29

Do VBE voc pode ir para o Excel clic ando no boto Excel no topo/esquerdo de
sua te la . Assim usando os dois botes voc pode navegar no VBE para o
Excel e, vice-versa.
Para inserir um mdulo usando os menus do Visual Basic, selecione (no editor do
VB) Inserir, Mdulo.

No inserir um mdulo de classe. Mdulos de classe so usados para


programao especializada de macros tais como indicar macros para serem rodadas
quando eventos tais como substituio de folhas ou pastas acontecerem. Um exemplo de
usar mdulos de classe encontrado numa lio posterior. O que segue ilustra um mdulo
que foi adicionado:
Lio #04 O Visual Basic Editor - VBE 30

O que est acima pode tambm parecer com o que segue se o mdulo de cdigo (a janela do
centro) for maximizada:
Lies de VBA do Excel 31

Project Explorer

Janela
de Janela de Cdigo
Proprieda
des

A janela esquerda superior chamada de janela Project Explorer. Ela mostra a


diferentes folhas de cada pasta aberta. A janela esquerda inferior a janela Propriedades.
Ela mostra as propriedades do objeto selecionado ou ativo. A janela do lado direito
chamada de janela de cdigo.

Para mudar o nome de um mdulo, clique no nome do mdulo na janela Project Explorer. Da
ento mostrar a janela Propriedades (pressione F4, ou selecione Exibir,
Janela Propriedades, ou clique no boto que mostra a Janela de Propriedades na
barra de ferramentas padro). Na janela propriedades voc pode mudar o nome do
mdulo. Voc pode usar somente letras e nmeros para nomear os seus mdulos. No
deve ser usado espao ou caracterees especiais.
NOMES DE PROJETOS

s folhas e mdulos associados com uma pasta dado o nome projeto. O nome
default "VBAProject". Se voc tiver mltiplas pastas abertas, ento voc poderia dar a
cada uma delas seu prprio nome de projeto. Isto lhe permite usar o Pesquisador de
Objeto (discutido mais tarde) para ver somente as macros de uma dada pasta. E, como o
Pesquisador de Objeto remove gradualmente nomes de projeto, nomes nicos so teis.

Para mudar o nome de projeto default de "VBAProject", selecione Ferramentas,


Propriedades de VBAProject (Se voc j tiver mudado o nome de projeto, voc ver
Lio #04 O Visual Basic Editor - VBE 32

"xxx" no menu Propriedades, onde "xxx" o nome do projeto para o qual voc mudou..)
O dilogo que segue aparece:

Voc pode ento mudar este nome para um novo nome contanto que o novo
nome no tenha espaos. O campo Descrio projeto do pode ser qualquer texto que voc
queira, e aparece no Pesquisador de Objeto quando o projeto selecionado. As outras
opes neste dilogo so discutidas posteriormente neste material. Se voc estiver curioso
agora, voc pode selecionar o boto Ajuda para uma explicao.
ONDE COLOCAR AS MACROS

Voc pode colocar macros em qualquer pasta que voc queira. Muitos usurios
guardam suas macros numa pasta chamada PERSONAL.XLS. Esta pasta normalmente
encontrada no diretrio de inicializao do Microsoft Excel. Este diretrio chamado
XLSTART e quase sempre um subdiretrio de seu diretrio Microsoft Excel. O que
segue so os caminhos mais comuns para este diretrio:

C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\XLSTART

C:\EXCEL\XLSTART

C:\MSOFFICE\EXCEL\XLSTART

Se voc estiver rodando o Excel numa rede, voc deve precisar especificar um diretrio de
inicializao alternativo em Ferramentas, Opes, painel Geral
Lies de VBA do Excel 33

Para usurios da Apple e MacIntosh, a pasta de inicializao quase sempre chamada


"EXCEL STARTUP FOLDER" e normalmente uma pasta na pasta
SYSTEM:PREFERENCES.

A vantagem de colocar macros na PERSONAL.XLS no seu diretrio de inicializao


que este arquivo automaticamente ser aberto pelo Microsoft Excel quando voc iniciar o
Microsoft Excel. Deste modo, suas macros esto imediatamente disponveis para o seu
uso. E, quando voc gravar macros, voc pode especificar que a gravao seja armazenada
neste arquivo, como veremos na lio seguinte.

O MENU DO VISUAL BASIC EDITOR

O menu do Visual Basic Editor que estava no Excel 5 e 7 foi removido a partir do Excel 97.
A personalizao de menu deve agora ser feita com o cdigo.

CONFIGURANDO SEUS MDULOS

No Visual Basic Editor, selecionando Ferramentas, Opes, mostra o seguinte dilogo:

O que est acima tambm mostra o setup (configurao) necessrio para os exerccios da
lio seguinte: Marque as caixas de verificao Auto-recuar , Autoverificar sintaxe e
Lio #04 O Visual Basic Editor - VBE 34

Requerer declarao de varivel . A seguir, selecione a guia Geral e certifique-se q ue a


caixa de verificao, Interromper em erros no tratados, est assinalada.

Se o seu setup nestas caixas for diferente, voc poder mud-los para este setup
para os exerccios iniciais da lio seguinte. O que segue explica em detalhes estas opes:

Auto-recuar: Se o texto que voc est digitando recuado, quando voc dar um enter para
ir prxima linha, a nova linha automaticamente ser recuada. Recuar o seu cdigo ajuda
juntar as declaraes relacionadas de modo que elas fiquem visivelmente agrupadas.

Autoverificar sintaxe: Esta opo mostrar uma caixa de mensagem sempre que um erro
de sintaxe for detectado na declarao a ser editada e lhe dar uma breve mensagem
explicando o problema da sintaxe. At este ponto, voc decidir qua a coisa certa a fazer
desligar estas mensagens. No existe problema em se fazer assim. Entretanto,
inicialmente deixe esta opo ligada, pois, as mensagens como voc ver sero parte da
lio seguinte.

Interromper em erros no tratados: Esta opo dever ser selecionada, ela far macro
parar de rodar sempre que ocorrer um erro no manipulvel. Fique certo de que esta
opo esteja selecionada. Rotinas de manipulao de erros sero cobertas em detalhes no
captulo 10, Manipulando Erros. A seleo Interromper em erros no tratados encontra-se
na ala Geral.

Requerer declarao de varivel: Voc dever ligar esta opo. Quando esta opo
ligada, a declarao Option Explicit do Visual Basic automaticamente colocada no topo
de cada nova folha de mdulo. Esta declarao simplesmente diz ao Visual Basic que
Lies de VBA do Excel 35

cada varivel deve ser declarada antes de funcionar a macro. Para declarar uma varivel
muito simples e ser coberto mais tarde.

Declarar variveis tem vrias vantagens. Ela ajuda a evitar erros acidentais e resultar em
confuso. E ela mantm a aparncia da capitalizao que voc der s variveis. Quaisquer
declaraes que voc entrar num mdulo poder ser aps a declarao Option Explicit.

Os ajustes nas caixas de dilogo acima fazem o seguinte:

Recurso de edio arrastar-e-soltar permite-lhe destacar texto e arrast-lo a uma nova


localizao no mdulo. Voc pode tambm arrastar texto aos painis imediatos ou de
viso (watch) (discutidos mais tarde)

Padro para modo de exibio de mdulo completo se esta opo est ligada, ento
todas macros so visveis num mdulo em qualquer momento. Se ela estiver desligada,
ento voc pode ver somente uma macro de cada vez. Se voc desligar esta opo, voc
pode ir a outras macros, clicando na caixa abaixo localizada na janela direita superior de
um mdulo. Isto mostrar as diferentes macros, de modo que voc possa salt-las:

Separador de Procedimentos Este desenha uma linha entre os diferentes mdulos como
ilustrado acima. muito til para ajud-lo separar visualmente uma macro da outra.
Lio #04 O Visual Basic Editor - VBE 36

Clicando na ala Formato do editor (do dilogo Ferramentas, Opes) mostrar o


seguinte painel:

As opes deste painel controlam a aparncia do texto nos seus mdulos. A fonte
default Courier New. Entretanto, a fonte Fixedsys d uma aparncia mais ousada e
para muitos, mais fcil de ler que a Courier New. altamente recomendado que voc
mude sua fonte para Fixed sys. A tabela que segue mostra as cores de cdigo que eu
recomendo:

Tipo de Texto Frente (texto) Fundo

Texto de seleo Automtico* Automtico*


Texto de erro de sintaxe Vermelho Automtico (branco)
Texto de ponto de execuo Automtico (preto) Automtico (branco)
Texto de ponto de interrupo Automtico (preto) Texto Amarelo
de comentrio Automtico (preto) Texto de Azul celeste
palavra-chave Violeta Automtico (branco)
Texto de identificador Automtico (preto) Automtico (branco)
Texto Normal Azul escuro Automtico (branco)

* Automtico em Texto de seleo significa aparncia de vdeo reverso.

Texto de seleo o texto que voc destacou com o cursor de modo que voc possa
recort-lo, copi-lo ou delet-lo. Deixando o ajuste em automtico em Primeiro plano e
no Plano de fundo, permite o Microsoft Excel, apresentar o texto selecionado texto na
aparncia de vdeo reverso, o qual o que a maioria dos processadores de textos fazem
quando voc seleciona texto.
Lies de VBA do Excel 37

Texto de erro de sintaxe o texto que Visual Basic no entende porque ele no est escrito
corretamente. Por exemplo, um parntese pode ter sido deixado de fora. Desde que erros
de sintaxe so ruins, colorir o texto em vermelho o melhor modo de destacar o texto que
deve ser corrigido. Este o ajuste default.

Texto de ponto de execuo a prxima declarao que ser executada se voc estiver
caminhando pela macro para depur-la. Existe um captulo mais tarde neste material que
cobre a depurao de suas macros. O ajuste default maravilhoso quando o Visual Basic
tambm desenha uma caixa ao redor da prxima declarao a ser executada.

Texto de ponto de interrupo uma entrada que voc pode fazer e que pausar sua macro
e lhe permitir depur-la interativamente. Isto lhe permite caminhar pelos comandos,
comeando no texto que foi destacado e declarado um ponto de interrupo. Configurar o
seu Primeiro plano para automtico (preto) e seu Plano de fundo para amarelo serve para
enfatizar os pontos de interrupo, mas torna-os bem mais legveis que os ajustes default.
(No se aborrea com os pontos de interrupo. Eles sero tratados em detalhes
posteriormente. Apenas lembre-se que eles so teis).

Texto de comentrio qualquer texto que comece com aspas simples. Ele serve para
documentar suas macros. Tenho percebido que usando um Plano de fundo verde coloca
os comentrios fora das declaraes reais do Visual Basic que so executadas.

Texto de palavra-chave so palavras que o Visual Basic identifica como parte da


linguagem de programao. Alguns exemplos de tais palavras so If, Then, GoTo, And,
Is, Integer, Next, e Error. Ajustando as palavras chave para um texto de cor azul escuro
serve para distinguir tais palavras melhor do que o ajuste default.

Texto de identificador so os nomes de variveis que voc criou e muitos dos comandos
que voc usa. Por exemplo MsgBox um comando do Visual Basic que mostra uma
mensagem na tela. Ele tambm considerado texto identificador, muito do que voc
digitar ser assim. O ajuste automtico mostra MsgBox como texto negro.

Texto normal so os nmeros, texto includos em aspas, e smbolos como =, +, *, -, ), e (.


Ajustando tais textos para azul escuro serve para distingu-los de outros textos.

A BARRA DE FERRAMENTAS DO VISUAL BASIC


Lio #04 O Visual Basic Editor - VBE 38

Existem vrias barras de ferramentas no Visual Basic Editor. A barra de ferramentas


normalmente no topo do Visual Basic editor chamada de barra de ferramentas Padro.
Ela se parece com o seguinte:

Se voc mantiver o ponteiro do mouse sobre um boto, voc ver uma dica de
ferramenta que descreve a funo deste boto.
Os primeiros trs botes, , fazem o seguinte:
Retornar ao Excel
Permite-lhe inserir um novo mdulo, procedimento (macro), ou a userform (dilogo). O
pequeno tringulo direita deste boto mostrar uma lista drop down destas escolhas.

Salvar o Arquivo
Os prximos trs botes, lhe permitem recortar, copiar, e colar textos.
O boto binculos, . Clicar nos binculos para mostrar uma caixa de dilogo
Localizar:

Os prximos dois botes, , ou o undo e o redo desfaz e refaz a ltima ao de


edio.

Os prximos trs botes nesta barra de ferramentas, lhe permitem fazer o


seguinte:
Rodar o procedimento ou mostrar o userform que voc est editando
Parar ou interromper uma macro que esteja rodando. Parar uma macro que est rodando

O boto o boto modo de design (criao). Normalmente voc far muito


pouco uso deste boto, e pode ser ignorado.

Os prximos quatro botes na barra de ferramentas padro, lhe permitem fazer


o seguinte:
Mostrar o Project Explorer se ele estiver oculto. O Project Explorer a janela no VB editor
que mostra uma lista das diferentes folhas de planilhas de um arquivo.
Lies de VBA do Excel 39

Mostrar a Janela Propriedades sempre que um objeto for selecionado na janela Project
Explorer
Mostrar o Pesquisador de Objeto (discutido mais tarde)
Se num userform (dilogo), o ltimo boto mostra a caixa de ferramentas, que lhe permite
inserir objetos no formulrio.

O ltimo boto na barra de ferramentas padro mostra o assistente de ajuda.

O Visual Basic Editor tem outras trs barras de ferramentas que voc pode tambm usar:

Estas barras de ferramentas podem ser mostradas selecionando Exibir, Barra de


ferramentas dentro do Visual Basic Editor. Uma curta descrio de cada boto mostrada,
se voc mantiver o cursor sobre o boto. Os botes da barra de ferramentas Userform esto
ativos somente se um deles estiver no Userform.

As caractersticas teis da barra de ferramentas Editar so:

Os botes recuar e no-recuar, que ajudam tornar seu cdigo mais fcil de ler.
Os botes bloco de comentrio e bloco de no-comentrio, os quais mudam as declaraes
do Visual Basic para comentrios e voltam novamente.
O boto indicador de bookmark (bandeiras), que realmente cria um indicador (bookmark)
para ajud-lo na navegao de seu cdigo. Uma vez tendo criado um indicador, os outros
botes lhe ajuda retornar para ela.

Os botes teis na barra de ferramentas Depurar so:

O boto executar, que roda uma macro sem pressionar quaisquer teclas ou retornar sua
pasta.
O boto interromper, que pra a sua macro.
Os botes step into e step over que lhe permitem executar uma nica linha de cada vez.
Os botes de inspeo, que lhe permitem examinar valores de variveis e outros tens
quando voc caminhar atravs do seu cdigo
Lio #04 O Visual Basic Editor - VBE 40

EDITANDO UM MDULO

Voc entra com o texto numa folha de mdulo exatamente como num processador
de texto. Para adicionar linhas adicionais apenas pressione enter. Use o mouse para andar
pela folha de mdulo. Pressionando a tecla inserir indicadores entre inserir e editar
durante a digitao. Voc pode recortar, copiar, e colar usando os botes nas suas barras
de ferramentas, os menus de comandos Editar, ou as teclas (CTRL-X para recortar, CTRL-
C para copiar, e CTRL-V para colar). Tambm, se voc selecionr texto e da clicar com o
boto direito do mouse, o seguinte menu pop-up aparecer:

Se voc tiver destacado o texto, os itens de menu recortar e copiar estaro ativos.
A seleo Definio (shift F2) em EXIBIR lhe permite saltar para macros (mais sobre isto,
mais tarde). As selees Adicionar inspeo de variveis, e Inspeo de variveis rpida
, so usadas na depurao de uma macro. A opo Indicadores, permite-lhe inserir ou
um ponto de interrupo ou um bookmark.

A tecla caracterstica de editar num mdulo o comando desfazer (undo). Este est
disponvel selecionando os menus Editar, Desfazer, ou usando o boto desfazer na Barra de
Ferramentas Padro do Microsoft Excel. O comando desfazer pode ser usado
repetidamente para desfazer mltiplas mudanas de edio. Voc pode tambm ligar o
comando desfazer pressionando CTRL-Z no teclado.

Quando voc digitar os comandos, voc poder digitar com letras minsculas. Isto fornece os
seguintes benefcios:
Lies de VBA do Excel 41

Se voc entrou com as declaraes corretamente, as palavras identificadas pelo Visual Basic
so convertidas para a case apropriada quando voc for prxima declarao.

Quaisquer palavras que no forem convertidas para o case apropriado ou no so soletradas


corretamente, ou so palavras que o Visual Basic no reconhece.

Outra tcnica que til na edio de um mdulo recuar grupos de declaraes


relacionadas. Voc pode facilmente recuar sees de cdigo destacando-o e pressionando
a tecla Tab. Para remover recuos, pressione shift Tab. Linhas em branco podem ser usadas
para agruparem comandos relacionados. Isto os torna mais fceis de leitura e seguir as
macros. Voc ver muitos exemplos destas tcnicas atravs deste material.

Voc pode tambm usar o comando Substituir, disponvel selecionando


Substituir no menu Editar, para fazer as variaes. Entretanto, um cuidado: O ajuste
default para o comando substituir substituir todo o texto correspondente, se ele um
texto destacado texto ou no. Voc pode mudar estes ajustes e especificar qualquer um
do que segue:

Procedimento (a macro ou funo que voc est editando)

Mdulo

Todos os Mdulos

Texto Selecionado

Existem tambm vrias teclas de atalho que voc pode usar enquanto edita um mdulo.
O uso das teclas de atalho pode economizar tempo quando voc no tem de manter o uso
do mouse. O que segue so as teclas de atalho que eu acho mais teis:

Tecla de Atalho/Mouse Resultado


Lio #04 O Visual Basic Editor - VBE 42

Duplo clique Seleciona a palavra do cursor


CTRL-X Recorta o texto destacado para o clipboard
CTRL-C Copia o texto destacado para o clipboard
CTRL-V Cola o texto destacado do clipboard

Home End Vai para o inicio da linha


Vai para o final da linha

CTRL-Home CTRL- Vai para o topo do mdulo Vai


End para o final do mdulo
CTRL-down arrow Vai para a prxima macro abaixo
CTRL-up arrow Vai para a prxima macro acima

Mostra o painel localizar


CTRL-F
CTRL-H Mostra o painel substituir

Mostra ajuda de palavra destacada


F1
Roda a macro onde o cursor est localizado
F5
Caminha atravs de uma macro linha por linha
F8

Se voc mantiver apertada a tecla shift quando voc usar um dos comandos
relocao acima, isto selecionar todo o texto na direo que o cursor move. Por exemplo,
mantendo a tecla shift pressionada quando voc pressionar CTRL-End, isto selecionar
todo o texto direita do cursor.
CARACTERSTICAS TEIS DE EDIO

Voc tambm tem as seguintes capacidades:

Auto-complete - o Visual Basic editor sugere propriedades dos seus objetos para voc.
Pressionando a barra de espao, um ponto, parntese esquerdo, sinal de igual ou tab inserir
o nome sugerido.
Recurso de edio de arrastar-e-soltar.
Quando voc destacar uma seleo e pressionar a guia Tecla, as linhas destacadas so
recuadas 4 espaos.
Voc pode editar a macro enquanto estiver no modo depurar. ENTRETANTO, isto se sabe
tem derrubado o Excel, tome cuidado.

USANDO TELAS SEPARADAS ENQUANTO EDITA

Se voc estiver fazendo uma poro de edio num mdulo, voc pode separ as
telas selecionando Janela, Dividir. Isto lhe permite trabalhar em duas sees separadas de
um mdulo. E, o tamanho das parties que foram criadas pelo item de menu Dividir pode
ser mudado clicando e arrastando a barra de diviso. Voc pode tambm dividir as telas
clicando e mantendo-se sobre a barra de diviso logo acima da barra de rolamento.

PROTEGENDO SUAS MACROS


Lies de VBA do Excel 43

Voc pode evitar os outros de acessarem o cdigo selecionando no Visual Basic


Editor Ferramentas, Propriedades de VBAProject. No dilogo que aparece, selecione a
ala Proteo e ajuste a proteo do jeito que voc quiser e, tambm, entre com uma senha.
Por favor, note que crackers de senhas existem e que extraem uma determinada senha,
assim tal proteo no impedir uma determinada pessoa.

OPERADORES MATEMTICOS E OUTROS OPERADORES

Para fazer clculos numa macro, voc usa os operadores matemticos normais:
+, -, *, e /.
A multiplicao e diviso so feitas primeiro na ordem encontrada. Por exemplo, 10/2*5
25. Adio e subtrao so feitas a seguir, Tambm na ordem encontrada.
Voc pode usar parnteses para controlar a ordem dos clculos.
Alm dos operadores matemticos acima, voc pode tambm usar os seguintes
operadores, nas suas declaraes Visual Basic:
Operador Explicao / Exemplo
^ Exponenciao. 3^2 = 9 Diviso
\ inteira.
Qualquer resto fracionrio descartado, deixando
um resultado inteiro. Por exemplo, 10 \ 3 = 3.
Se o numerador e o denominador so
fraes, eles primeiro sero arredondados para
inteiro antes da diviso ser feita.
Retorna somente o resto inteiro de uma operao diviso. O numerador e
Mod
o denominador so primeiro arredondados. Exemplos: 5 mod 2 =
Lio #04 O Visual Basic Editor - VBE 44

1 e 6.8 mod 3.4 = 1

Se voc tentar fazer clculos usando um valor que o Visual Basic considera ser um texto
string, ele dar a seguinte mensagem de erro:

Por exemplo, "Miami" * 3 pode no ser interpretado pelo Visual Basic assim a
mensagem de erro acima mostrada. Voc pode determinar qual dos valores numa
expresso matemtica causou um erro usando o modo depurar do Visual Basic para
examinar a expresso para texto strings, que qualquer valor entre aspas duplas.
Depurao ser coberta no ltimo captulo.
Se o operador adio (o sinal de mais) usado e todos os valores a serem
adicionados so textos, o Visual Basic no mostrar erro. Ao invs disso, ele concatenar
os valores.
Qualquer coisa, texto ou nmeros, entre aspas duplas considerado uma string
texto. Por exemplo, "3" + "5" + "2" torna-se "352", no o nmero 10. Se um dos valores
na expresso um nmero e os outros so textos, uma mensagem de erro do tipo
combinao mal sucedida ser mostrada.

USANDO & PARA CONCATENAR STRINGS

Existiro inmeras vezes em que voc precisar combinar duas strings de texto
juntas. Isto poderia ser feito usando o operador de concatenao, o ampersand (&). Por
exemplo:

"Trabalho" & "E" & "Mais Trabalho"

torna-se "Trabalho E Mais Trabalho"

Por favor, note que quando voc usar o & para combinar strings, voc deve colocar
um espao na frente dele e depois dele. Se voc no colocar, poder obter um erro. Note
que aspas duplas so usadas para cercar o texto. Isto indica que ela um dado e no
instrues para o Visual Basic.
Lies de VBA do Excel 45

Voc pode tambm concatenar nmeros e texto. Por exemplo:

1008 & 44 torna-se: "100844"

972 & " Main Street" torna-se "972 Main Street

Note que os resultados acima so agora considerados strings (representadas por


estarem entre aspas duplas). Se voc precisar converter uma string para um nmero, ento
a funo Val (discutida posteriormente) far isto: Val("100844") conduz 100844 a
nmero. Val("972 Rua Principal") torna 972. O texto truncado.

SEPARANDO LINHAS COM O CARACTERE CONTINUAO

Se uma declarao Visual Basic muito longa par ser mais facilmente vista numa
nica linha, ento um espao e um caractere sublinhado ( _ ) colocado no final de uma
linha para permitir a declarao continuar na prxima linha. Esta uma conveno do
Visual Basic padro, e que voc pode us-la quando escrever macros. Voc pode usar at
nove sublinhados numa declarao nica. Voc no precisa separar linhas se voc no
quiser. Eu tenho escrito linhas que so extremamente longas. A desvantagem de se fazer
isto que mais difcil de l-las!

O que segue ilustra o uso de um caracteree de continuao:


MsgBox = _
"Isto um exemplo de continuao de uma declarao."
Em alguns lugares o caractere de continuao pode ser usado antes ou aps o sinal
de igual, operadores matemticos (+,-, *,/), nomes de variveis, e seguindo o ponto que
junta duas palavras chaves. Voc ver muito poucas ilustraes do caractere de
continuao neste material, pois as linhas deste material so limitadas nos comprimentos!

Se voc usar o caractere de continuao para separar o texto de uma longa mensagem,
como mostrado pelo que segue, voc obter um erro.
MsgBox = "Isto um exemplo de como no separar _
uma longa mensagem"
Para separar corretamente esta mensagem, voc precisa usar a seguinte abordagem:
MsgBox = "Isto um exemplo de como separar " & _
"uma longa mensagem"

Note que existe espao seguindo a palavra 'separar' para separ-la da palavra 'uma'. E,
cada conjunto de palavras que estiver entre aspas duplas.

LINHAS DE COMENTRIOS
Lio #04 O Visual Basic Editor - VBE 46

As linhas de comentrios nas macros comeam com uma aspas simples ( ' ). Para
enfatizar mais os comentrios nas vrias macros ilustradas neste material, eles so
negritados e so sublinhados. Por exemplo:
'Isto com o que se parece uma linha de comentrio numa macro deste
material
Embora voc no possa sublinhar comentrios num mdulo, possvel mudar o
Plano de fundo e a cor das linhas de comentrios como discutido anteriormente neste
captulo para atingir um efeito semelhante nos seus mdulos.

Uma linha de comentrio como a seguinte:

'***************************************************

Freqentemente usada para separar uma dada macro de outra, nas ilustraes deste
material. Voc pode usar a mesma abordagem nos seus mdulos. Linhas separadoras so
automaticamente adicionadas tela entre macros. Se por alguma razo voc no tiver
estas barras separadoras, verifique as opes no VBA Editor. Linhas separadoras no so
impressas quando voc imprimir seu cdigo.

MOVENDO-SE DE UMA MACRO OUTRA

Mais cedo ou mais tarde, voc descobrir que tm muitas macros. E que voc est
gastando uma poro de tempo indo de uma macro a outra. Entretanto, existem vrias
maneiras muito rpidas de ir de uma macro para outra. O modo mais simples usar CTRL-
seta para cima ou CTRL-seta para baixo se as macros esto no mesmo mdulo.
Outra abordagem para se mover de macro a macro usar o Pesquisador de Objeto.
O Pesquisador de Objeto permite-lhe ver uma lista de macros em cada mdulo e da ir
diretamente a uma macro, mesmo se a folha de mdulo estiver oculta. Para conseguir o
Pesquisador de Objeto, voc pode clicar no boto Pesquisador de Objeto na barra de
ferramentas Padro do Visual Basic. Ou, selecionar Exibir, Pesquisador de Objeto
enquanto voc estiver num mdulo. Ou, apenas pressionar a tecla F2. O que segue aparece:
Lies de VBA do Excel 47

Na caixa Biblioteca/Pasta voc pode selecionar qualquer pasta aberta pelo nome
do seu projeto. O nome default para um arquivo "VBAProject". Uma vez tendo
selecionado um projeto, os mdulos daquele projeto/pasta sero listados na janela do lado
esquerdo. Quando voc selecionar um mdulo, as macros e funes do mdulo
selecionado so mostrados na caixa do lado direito. Se voc der um duplo clique sobre
uma macro, voc pode ento ir diretamente a ela clicando sobre o boto Show.
O Pesquisador de objeto fornece, portanto, todas as classes disponveis no VBA
com suas respectivas propriedades e mtodos. Na janela Membros do objeto temos as
funes, os eventos e as propriedades daquele objeto. As funes so representadas pelo
pequeno tijolo em movimento. Os eventos so representados pelo raio e as
propriedades, pelo pequeno carto segurado por uma mo.
Alm dos objetos j instalados, o VBA ainda contm referncias a bibliotecas de
terceiros e da prpria Microsoft. Por exemplo, se desejarmos criar uma conexo a um
banco de dados Access, na biblioteca inicial no existe o objeto Database ou Recordset.
Porm, podemos adicionar referncias a outros objetos. Para adicionar referncias a outros
objetos, clique em Ferramentas/Referncia.
Uma caixa de dilogo contendo as referncias aberta. Como exemplo, se
desejarmos criar conexes a banco de dados diretamente podemos utilizar a referncia ao
Microsoft DAO 3.6 Object Library, como mostra a figura abaixo.
Ao acrescentarmos a referncia a esta biblioteca temos nossa disposio todas as
classes da biblioteca adicionada. Isso facilita, em muito, a criao de objetos, como
formulrios, onde necessitamos de uma conexo direta ao banco de dados.
Na mesma lista da figura abaixo, ainda temos vrias outras referncias que no
foram selecionadas. O nmero de classes disponveis to grande que improvvel que
haja a necessidade de voc criar a sua prpria classe no VBA.
Lio #04 O Visual Basic Editor - VBE 48

MOVENDO DE UM MDULO A OUTRO

Voc move de um mdulo a outro com duplo clique num mdulo ou userform listado no
Project Explorer:

Se o Project Explorer no est visvel, clicando no boto Project Explorer na barra


de ferramentas Padro ou pressionando Ctrl-R a mostrar.

USANDO INDICADORES
Lies de VBA do Excel 49

O Visual Basic Editor lhe d a habilidade de adicionar bookmarks a um mdulo.


Isto mais facilmente feito usando os botes na barra de ferramentas Editar. Voc pode
ento saltar de bookmark a bookmark. Adicionando bookmarks e ir de bookmark a
bookmark mais facilmente feito usando os ltimos quatro botes na barra de ferramentas
Editar:

Mantendo o ponteiro do mouse sobre um boto, ele descreve o que o boto faz. Se
esta barra de ferramentas no visvel, voc deve mostr-la selecionando Exibir, Barra de
ferramentas de dentro do VBA editor.

PROBLEMAS DAS BARRAS DE FERRAMENTAS

Se voc tiver barras de ferramentas flutuantes numa pasta, quando voc indicar ao
Visual Basic Editor usando ALT-F11, as barras de ferramentas flutuantes do Excel podem
permanecer visveis. Isto um bug claro. E, ele no acontecer consistentemente. Se a
barra de ferramentas do Excel visvel no Visual Basic Editor, clicando nela joga voc de
volta ao Excel. Existem vrias maneiras de contornar:
Reduza todas as barras de ferramentas flutuantes. Isto lhe permite usar a tecla AltF11
para mover para trs e para frente. Entretanto, reduzir deve no ser uma abordagem
aceitvel.
Use ALT-TAB para ir ao editor. Se voc mantiver a tecla ALT apertada e no liber-
la, voc pode confirmar que voc est indo para o editor, ou continue a selecionar das
aplicaes abertas pressionando a tecla ALT.
Use a Barra de Tarefas do Windows quando quiser permutar do Excel para o Visual
Basic Editor

UMA MACRO ILUSTRATIVA

Para ilustrar a edio num mdulo, a maior parte da formatao do texto acima, e
mostrar-lhe quo simples uma macro pode ser, crie uma nova folha de mdulo e entre com
as seguintes linhas nela.

Sub Al()
'Esta macro diz al ao mundo
MsgBox "Al mundo!"
End Sub

Se uma caixa de erro aparecer quando voc estiver digitando esta macro e a linha estar em
vermelho, voc tem de redigitar a linha e ela precisa ser corrigida.

As palavras Sub e End Sub so usadas pelo Visual Basic para indicar o comeo e o final de
uma macro. Al o nome da macro. O parnteses so exigidos.
Lio #04 O Visual Basic Editor - VBE 50

A linha:
'Esta macro diz al para o mundo
uma linha de comentrio pois ela comea com aspas simples. A
linha:
MsgBox "Al mundo!"

diz ao Visual Basic mostrar a seguinte caixa de mensagem.

Assumindo que voc tenha modificado o esquema de cores no painel de formato


do mdulo pelas minhas recomendaes, voc ver que Sub e End Sub, estaro coloridas
em violeta indicando que elas so palavras chave para o Visual Basic. A linha "Esta macro
diz al para o mundo" mostrada com um Plano de fundo azul celeste para indicar que
ela uma linha comentrio. A palavra MsgBox est em preto, pois ela uma palavra de
identificao. Ela representa uma instruo para o Visual Basic dizendo a ele para mostrar
uma mensagem. Finalmente na frase "Al mundo!", as aspas duplas, e os parnteses so
coloridos em azul escuro par indicar que eles so textos normais em oposio a uma
instruo ou comando.

Para rodar esta macro muito simples: apenas coloque o cursor em qualquer linha
da macro e ento pressione a tecla F5 ou clique no boto da barra de ferramentas do Visual
Basic que roda uma macro (o boto com o tringulo azul). Usando uma destas duas
abordagens, v em frente e rode a macro acima.

TROCANDO MACROS

Uma das coisas que finalmente voc vai querer fazer trocar uma macro que voc
escreveu com algum. Toda vez que a macro for escrita em Ingls, trocar macros muito
simples. Voc deve dar ao usurio uma cpia do arquivo contendo as macros. Se a macro
est escrita numa outra linguagem, tal como Alemo ou Francs, e a linguagem da sua
verso do Excel diferente, voc ainda poder trocar arquivos. Entretanto, voc precisa
ter arquivos especiais do Microsoft que lhe permitam rodar as macros. Os arquivos so
chamados de arquivos biblioteca do objeto. Voc pode baixar os arquivos do site de
Internet da Microsoft ou contatar a Microsoft por eles. Certifique-se tambm de obter as
instrues de instalao.

SUMRIO DA LIO
Lies de VBA do Excel 51

Este material lhe fornecer muitos exemplos de macros. Voc poder levar tempo
para digitar os exemplos, mesmo se elas so somente trs ou quatro linhas, dentro de um
mdulo e test-los fora. Isto lhe dar experincia valiosa em usar Visual Basic e em
corrigir erros que vem dos erros de digitao! Voc encontrar que quanto mais voc usar
o Visual Basic, mais simples ele se tornar.
52
Fase #1: Desenvolvendo Procedimentos VBA em Excel

Lio 5: Modificando Macros no Visual Basic Editor

V amos comear esta lio criando uma macro e depois observando e modificando
seus cdigos:

Para observar os cdigos de uma macro devemos de seguir os seguintes passos:

1. Primeiramente translade-se clula A5 antes de comear a gravao da Macro 2.


Pressione o boto Gravar nova macro na barra de Status do Excel:

O Excel mostra a caixa de dilogo Gravar macro.


3. Na opo Tecla de atalho escreva a letra R (em maisculo), portanto a macro ser
chamada com o Ctrl +Shift+ R
4. Pressione o boto OK. O Excel inicia a gravao da Macro1
5. Mude-se para a clula A1 e escreva Bertolo, depois pressione Enter para aceitar o
valor na clula 6. Pare a gravao da macro pressionando o boto Parar
gravao na barra de Status do Excel.

O Excel ter gravado os passos e ter gerado um cdigo. Observemo-lo:


7. Pressione a tecla Alt + a tecla de funo F11 (Alt + F11). O Excel nos leva ao Editor
de Visual Basic.
8. Ative as seguintes caixas ou janelas:
D um clique no menu Exibir e escolha a opo Project Explorer
D um clique no menu Exibir e escolha a opo Janela de propriedades
Estas duas opes devem estar sempre ativadas j que delas dependem tudo que
vamos fazer.
Lies de VBA do Excel 53

1. Na janela Projeto VBAProject d um duplo clique em Mdulos ou simplemente


pressione o sinal de + que aparece na opo Mdulos. Sob as janelas de Mdulos se
ativar a opo Mdulo1

2. D um duplo clique em Mdulo1. Ser mostrado no Editor de Visual Basic o cdigo


da macro que gravamos, da seguinte forma:

Sub Bertolo()
'
' Bertolo Macro
'
' Atalho do teclado: Ctrl+Shift+R
'
Range("A1").Select

ActiveCell.FormulaR1C1 = "Bertolo"

Range("A2").Select

End Sub

O que significa isto, perguntaremos ns assombrados. A seguir damos-lhes uma


explicao do que fez o Excel:
Lio #05 Modificando Macros no Visual Basic Editor 54
Sub e End Sub indicam o incio e o final do procedimento da Macro1
Tudo o que aparecer com um apstrofe , indica que no se levar em conta,
pois somente texto ou comentrios e esses textos devem aparecer numa cor, ou
seja, a cor verde.
Range("A1").Select - Indica que a primeiro coisa que fizemos ao gravar a macro
foi transladarmos clula A1.A ordem Range nos permite transladarmos a ( ou
ativar) uma clula
ActiveCell.FormulaR1C1 = "Bertolo" - Isto indica que se escrever na clula em
que se encontra (clula ativa), o valor de texto Bertolo. Tudo o que aparece
entre aspas sempre ser um valor de texto. A ordem ActiveCell.FormulaR1C1
nos permite escrever um valor na clula ativa.
Range("A2").Select :Outra vez indicamos que se translade clula A2. Isto se
deve a que ao escrevermos o nome Bertolo em A1 pressionamos Enter e ao dar
Enter pulamos para a clula A2.

Para compreender melhor, alteraremos o cdigo dentro do Editor de Visual Basic.

O que acreditas que se passar com nossa Macro?

Sub Macro1()
'
' Macro1 Macro
' Macro gravada em 7/7/2007 por Bertolo
'
' Atalho do teclado: Ctrl+Shift+R
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "Bertolo"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Catanduva, 07 de Julho de 2007"
Range("C1").Select
ActiveCell.FormulaR1C1 = "31-2-47-13"
Range("D1").Select
ActiveCell.FormulaR1C1 = "Festa do Peo"
Range("E1").Select
ActiveCell.FormulaR1C1 = "FAFICA"
End Sub
Assim terminada alterao do cdigo e quando voltares ao Excel e executares a
macro com Crtl + Shift + R, ters o seguinte:

Em A1 se escrever Bertolo

Em B1 se escrever Catanduva, 07 de Julho de 2007

Em C1 se escrever 31-2-47-13

Em D1 se escrever Festa do Peo


Em E1 se escrever FAFICA
Lies de VBA do Excel 55

Assim que salvarmos do editor, dando um clique no menu Arquivo e elegendo a opo
Fechar e voltar ao Microsoft Excel (Alt +Q).

Se no deseja sair por completo, d um clique no boto Microsoft Excel


que se encontra ativado na barra de ferramentas Padro, e quando desejar voltar ao

editor d um clique no boto Microsoft Visual Basic que se encontra na Barra de


Ferramentas de Acesso Rpido.

Agora j que saimos do Visual Basic e estamos no Excel de novo executemos a


macro atravs de Ctrl + Shift + r e vejamos os resultados de nossa modificao.

Parece simples ou no? Claro, necessitamos praticar bastante para dominar isto,
antes de passarmos adiante. Outra coisa, no trates de gerar cdigos muito complexos em
tuas macros porque se enrolars, pouco a pouco se chegar ao longe.

Prtica

Gere uma Macro que escreva um nome em uma clula e o ponha em negrito e observe o
Cdigo.
Gere uma Macro que escreva um nome em uma clula e o Centralize. Observe o Cdigo.
Gere uma Macro que escreva um nome em uma clula e troque o tamanho da letra para
20 pontos. Observe o Cdigo.

Vejamos alguns cdigos muito comuns:


Trasladar-se a uma Clula
Range("A1").Select
Escrever em uma Clula
Activecell.FormulaR1C1="Bertolo"
Letra em Negrito
Selection.Font.Bold = True
Letra Cursiva (Itlico)
Selection.Font.Italic = True
Letra Sublinhada
Selection.Font.Underline = xlUnderlineStyleSingle
Centralizar o Texto
With Selection
.HorizontalAlignment = xlCenter
End With
Alinhar esquerda
With Selection
.HorizontalAlignment = xlLeft
Lio #05 Modificando Macros no Visual Basic Editor 56
End With
Alinhar Direita
With Selection
.HorizontalAlignment = xlRight
End With
Tipos de Letra (Fonte)
With Selection.Font
.Name = "AGaramond"
End With
Tamanho de Letra (Tamanho de Fonte)
With Selection.Font
.Size = 15 End
With
Copiar
Selection.Copy
Colar
ActiveSheet.Paste
Cortar
Selection.Cut
Ordenar Ascendente
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending,
Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Ordenar Descendente
Selection.Sort Key1:=Range("A1"), Order1:=xlDescending,
Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Buscar
Cells.Find(What:="Bertolo", After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False).Activate
Inserir Arquivo
Selection.EntireRow.Insert
Eliminar Arquivo
Selection.EntireRow.Delete
Inserir Coluna
Selection.EntireColumn.Insert
Eliminar Coluna
Selection.EntireColumn.Delete
Abrir uma Pasta
Lies de VBA do Excel 57

Workbooks.Open Filename:="C:\Meus documentos\video safe 3.xls"


Gravar um Pasta
ActiveWorkbook.SaveAs Filename:="C:\Meus documentos\piscis.xls",
FileFormat _
:=xlNormal, Password:="", WriteResPassword:="",
ReadOnlyRecommended:= _
False, CreateBackup:=False
Esses seriam alguns cdigos muito comuns no Excel, mas se voc deseja pode
gerar mais cdigos de outras opes, uma questo de que os ocupe.

EXTERMNIO DO GRAVADOR DE MACRO


Um dos problemas com macros criados pelo gravador de macro que as macros
resultantes incluem muito mais declaraes do que voc precisa. E, freqentemente
declaraes que voc no quer. O exerccio que segue ilustra isto gravando uma macro
para remover o cabealho e rodap:
Selecionar o boto Gravar nova macro na barra de Status do Excel. A
configurao de referncias relativa ou absoluta no afetar esta macro.
Especificar "mudarConfiguracao" como o nome da macro e da selecionar OK
para comear a gravao.
Selecionar a guia Layout da Pgina , o grupo Opes de Pla nilha e clicando na
setinha a janela Configurar Pgina aparece, nela selecionamos a ala
Cabealho/rodap
Lio #05 Modificando Macros no Visual Basic Editor 58

Mudar o cabealho do nome da folha para nenhum. (Ou, selecionar "(nenhum)"


na caixa pull down, ou selecionar cabealho personalizado e deletar o cabealho.
Fazer a memsma coisa para o rodap
Selecione OK para sair deste painel, e OK para sair do painel de configurao de
pgina.
Selecionar o boto Parar gravao na barra de Status do Excel. V macro
que voc gravou e observe nela o cdigo. Ele se parecer com o seguinte:
Sub mudarConfiguracao()
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
.LeftMargin = Application.InchesToPoints(0.75)
.RightMargin = Application.InchesToPoints(0.75)
.TopMargin = Application.InchesToPoints(1)
.BottomMargin = Application.InchesToPoints(1)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
.PrintHeadings = False
.PrintGridlines = True
.PrintNotes = False
.PrintQuality = 300
Lies de VBA do Excel 59

.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlPortrait
.Draft = False
.PaperSize = xlPaperLetter
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
End With
End Sub
No que est acima voc viu vrios valores tais como "xlPortrait" ou
"xlAutomatic" ou "xlPaperLetter". Os programadores da Microsoft usam esta
conveno quando se referem a uma constante numrica do Visual Basic. Por exemplo,
se voc executou o seguinte cdigo:
Sub ShowConstantValue
MsgBox xlPortrait
End Sub
Ento uma caixa de mensagem aparecer com o nmero 1 na caixa de mensagem.
Mesmo que voc faa somente duas mudanas em sua configurao de pgina, o
gravador de macro gerou 34 linhas de cdigo! Isto ocorreu porque o Microsoft Excel
grava todas as configuraes da pgina e no apenas aquelas que voc mudou. Estas
definies so as propriedades do objeto PageSetup. Quantidades semelhantes de cdigo
resultam com muitas outras gravaes. Por favor, note que esta quantidade de cdigo em
excesso provavelmente um caso extremo. A maioria das macros que voc gravar no
ser esta coisa feia.
Um lado positivo do gravador de macro gerar muito mais cdigo que voc
encontra freqentemente comandos que voc estava inconsciente deles! Por exemplo, a
macro acima ilustra o comando With. O comando With evita voc de ter de digitar
novamente o nome PageSetup em cada linha. Voc pode aprender mais sobre o comando
With colocando o cursor na palavra With e pressionando F1. Isto o levar ajuda Visual
Basic deste comando. Este comando tambm discutido em detalhes em lies
posteriores.
Quando voc obtiver muito cdigo como resultado da gravao de uma macro,
voc dever manter somente os pedaos que voc precisar. Por exemplo, o que segue
todo o cdigo que voc precisa a fim de deletar os cabealhos e rodaps numa folha de
planilha:

Sub ChangeSettings()
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
End With
Lio #05 Modificando Macros no Visual Basic Editor 60
End Sub
Como a macro acima ser usada num exerccio seguinte, voc dever deletar o
excesso de cdigo de modo que sua macro se parea com a macro acima.
LIMPANDO O CDIGO DO GRAVADOR DE MACRO
O que segue outra macro que foi gravada pelo gravador de macro. Sua tarefa
colocar em vrias entradas de texto e colocar caixas ao redor das clulas direita destas
entradas:
Sub Macro1()
Range("A2").Select
ActiveCell.FormulaR1C1 = "Descrio de Caso:"
Range("C2").Select
Selection.Borders(xlLeft).LineStyle = xlNone
Selection.Borders(xlRight).LineStyle = xlNone
Selection.Borders(xlTop).LineStyle = xlNone
Selection.Borders(xlBottom).LineStyle = xlNone
Selection.BorderAround Weight:=xlThin, _
ColorIndex:=xlAutomatic
Range("A4").Select
ActiveCell.FormulaR1C1 = "Nome do Arquivo"
Range("C4").Select
Selection.Borders(xlLeft).LineStyle = xlNone
Selection.Borders(xlRight).LineStyle = xlNone
Selection.Borders(xlTop).LineStyle = xlNone
Selection.Borders(xlBottom).LineStyle = xlNone
Selection.BorderAround Weight:=xlThin, _
ColorIndex:=xlAutomatic
Range("A6").Select
ActiveCell.FormulaR1C1 = "Nome da Planilha"
Range("C6").Select
Selection.Borders(xlLeft).LineStyle = xlNone
Selection.Borders(xlRight).LineStyle = xlNone
Selection.Borders(xlTop).LineStyle = xlNone
Selection.Borders(xlBottom).LineStyle = xlNone
Selection.BorderAround Weight:=xlThin, _
ColorIndex:=xlAutomatic
End Sub
O que est acima consiste de 24 linhas de cdigo. Compare-o macro seguinte
que faz a mesma tarefa com somente 4 linhas de cdigo. Tambm, note que nenhuma
Selects foi usada, o que desacelera suas macros. Reduzindo o nmero de linhas de
cdigo torna suas macros mais legveis e mais rpidas.
Sub A_Shorter_Macro()
Range("A2").FormulaR1C1 = " Descrio de Caso:"
Range("A4").FormulaR1C1 = " Nome do Arquivo "
Range("A6").FormulaR1C1 = " Nome da Planilha "
Range("C2, C4, C6").BorderAround Weight:=xlThin
End Sub

Outro Exerccio
Lies de VBA do Excel 61

muito importante esta lio. Recomendo que voc, atravs de sua criatividade,
invente vrias coisas para serem feitas no Excel usando o Gravador de Macros (GM) e
da interpretando os cdigos gerados. Acredito que assim que se aprende esse assunto.
Vamos agora modificar um procedimento VBA que voc criou com o gravador de macro
anteriormente. Abra o Excel, abra o pasta "VBATeste1.xls" e v para o Visual Basic
Editor (Alt + F11). D um duplo clique no Mdulo1 na janela de projeto do VBA e o
cdigo seguinte aparecer na Janela de Cdigo.
Clique na janela de cdigo e imprima o mdulo para referncia futura
"Arquivo/Imprimir/ Mdulo Atual"

Imprima esta pgina e siga as instrues passo a passo.

O Gravador de Macros (GM) tem uma maneira muito especial para escrever
cdigos. O procedimento acima funciona de modo que poderamos deix-lo assim mas
apenas para torn-lo mais claro, vamos faz-lo mais simples. Voc pode trocar cada linha
de cdigo por si mesmo ou copiar/colar por inteiro o novo procedimento abaixo desta
web page sobre o antigo procedimento no VBE
Quando eu iniciei o Gravador de Macros a clula A1 estava selecionada e eu entrei
com 34 nela. O GM escreve:
ActiveCell.FormulaR1C1="34"
Eu nunca uso e voc nunca usar a propriedade FormulaR1C1. Em segundo lugar
adicionaremos uma linha de cdigo para dizer ao Excel para iniciar este procedimento na
clula A1 em vez disso, 34 ser entrado na clula que est selecionada quando iniciarmos
Lio #05 Modificando Macros no Visual Basic Editor 62
o procedimento. A Clula A1 a ActiveCell e voc pode trocar esta linha simplesmente
por:
Range("A1").Select
ActiveCell.Value=34
Linha 2 e 3 do procedimento para ler como esta:
Range("A2").Select
ActiveCell.FormulaR1C1 = "55"
Novamente evitaremos uma coisa como FormulaR1C1 e no selecionaremos uma clula
apenas e lhe daremos um valor vamos ento trocar as linhas 2 e 3 por esta:
Range("A2").Value=55
Lembre-se que voc no precisa selecionar uma clula para dar a ela um valor. Troque
as Linha 4 e 5 do procedimento para ler com esta:
Range("A3").Select
ActiveCell.FormulaR1C1 = "=R[-2]C+R[-1]C"
Novamente evitaremos a FormulaR1C1. Novamente no queremos selecionar uma clula
apena entraremos com uma frmula vamos ento trocar as linhas 4 e 5 por esta:
Range("A3").Formula="=A1+A2"

As Linha 6 e 7 do procedimento para ler como esta:


Range("A2").Select
Selection.Font.ColorIndex = 3
Aqui ns no selecionaremos a clula ns apenas especificaremos que ns queremos
mudar a cor da fonte vamos ento trocar as linhas 6 e 7 por esta:
Range("A2").Font.ColorIndex = 3
O trs est em vermelho. Eu sempre uso o GM nesta situao porque eu no sei como
fazer para lembrar todos os cdigos de cores.
Linha 8 a 12 do procedimento para ler com esta:

Range("A1").Select
With Selection.Interior
.ColorIndex = 41
.Pattern = xlSolid
End With

O GM usa um monte de "With..End With" mas eu no. O cdigo desenvolvido pelo GM


dever ler num Ingls simples: Selecione a clula A1 (clula A1 torna-se a Seleo) da
ento para o Selection.Interior torne a ColorIndex 41 e a Pattern xlSolid. Aqui est uma
verso mais simples de trocar as linhas 8 at 12 por isto:

Range("A1").Interior.ColorIndex = 41
Range("A1").Interior.Pattern = xlSolid
Linha 13 a 25 do procedimento l assim:
Range("A3").Select
Lies de VBA do Excel 63

With Selection.Font
.Name = "Arial"
.Size = 24
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With

Novamente o GM usa "With...End With" e tambm modifica TODAS as


propriedades da fonte cada vez. Queremos apenas que o tamanho da fonte seja mudado
para 24 vamos ento trocar as linhas 13 at 25 por isto:
Range("A3").Font.Size= 24
O procedimento VBA, ou macro chamada "Macro1" agora se parece com isto:
Sub Macro1()
' Macro1 Macro
' Macro gravada 27/5/2007 por Bertolo'
Range("A1").Select
ActiveCell.Value = 34
Range("A2").Value = 55
Range("A3").Formula = "=A1+A2"
Range("A2").Font.ColorIndex = 3
Range("A1").Interior.ColorIndex = 41
Range("A1").Interior.Pattern = xlSolid
Range("A3").Font.Size = 24
End Sub

Teste agora esta macro.


64

Fase #1: Desenvolvendo Procedimentos VBA em Excel

Lio 6: Escrevendo Macros no VBA do Excel

O
modo mais fcil para se comear a aprender o Visual Basic escrevendo uma
macro. Esta lio lhe ensinar muito do Visual Basic fazendo voc criar uma
macro que somar, subtrair, multiplicar ou dividir por qualquer valor que
voc especificar. E, para ajud-lo a aprender, eu vou ter que cometer erros! Voc
aprender mais rapidamente com os erros, porque deste modo voc ganhar experincia
que lhe permitir controlar os seus prprios erros no futuro. E, esperanosamente, evitar
esses mesmos erros!
AS PRIMEIRAS DECLARAES DE MACRO
O primeiro passo que voc precisa fazer criar um mdulo novo. Abra o Excel,
renomeie a folha de planilha Plan1 para Teste (clicar com o boto direito do mouse na
guia, escolher Renomeare digitar o nome nela). A seguir vamos criar um novo
mdulo. V para o editor de VB (ALT-F11) e Selecione Inserir, Mdulo.
Se voc ajustou anteriormente as opes do Mdulo Geral, a declarao Option
Explicit ser a linha de topo do novo mdulo. Se no, mude as suas opes ou digite Option
Explicit no topo do mdulo.
Para criar a macro que ns buscamos, primeiro comecemos tentando escrever
uma macro estigmatizante que divida por 100. Voc sempre dever digitar minsculas
com a exceo de linhas de comentrios, que so linhas comeando com uma aspa nica,
e o nome da macro. O Visual Basic capitalizar palavras que ele reconhece, e que no
esto numa linha de comentrio. Entre com o que se segue em seu mdulo como o
primeiro passo para escrever esta macro:

Sub DividirPor100 ()
Esta macro divide por 100
ActiveCell.Value = ActiveCell.Value / 100
End Sub

Se uma caixa de erro apareceu quando voc foi de uma linha para outra ou a linha
vermelha, voc digitou incorretamente a linha e precisa corrigi-la. O "End Sub"
adicionado automaticamente quando voc entrar na primeira linha no mdulo.

A primeira linha no macro, Sub DividirPor100 (), comea com o palavra


Sub. Todos as macros tm que comear com a palavra chave Sub seguida pelo nome
da macro. A palavra Sub para os programadores de computadores estabelece um
"procedimento sub-rotina".

Se voc digitar Sub em minsculo, quando voc entrar na primeira linha, o Visual
Basic mudar isto de sub para Sub quando voc for para a prxima linha. Este o modo
do Visual Basic falar para voc que ele reconheceu Sub como uma palavra chave que ele
conhece.
Lies de VBA do Excel 65
Imediatamente aps Sub est a entrada "DividirPor100 ()". Este o nome para
a macro. Nomes de macro seguem as regras seguintes:

Um nome de macro tem que comear com uma letra.


Um nome de macro dever conter s letras, nmeros e o carter de sublinhado (_). No use
caracterees especiais como o ponto, asterisco, ponto de exclamao, ou outros caracterees especiais
(#, $,%, etc..).
Um nome de macro no pode incluir espaos.
Um nome de macro dever fazer sentido e deveria dizer-lhe o que o macro faz (por exemplo
"DB100" realmente no carrega o mesmo significado que "DividirPor100"). Dever fazer sentido
agora e daqui a seis meses.
Um nome de macro pode conter letras minsculas e maisculas juntas. As palavras em maisculo
em um nome de macro a torna mais legvel (DividirPor100 em vez de dividirpor100).
Um nome de macro no pode ser o mesmo nome de um mdulo ou uma palavra chave do Visual
Basic (por exemplo, ActiveCell ou MsgBox).
Um nome de macro pode ser bastante longo, mais de 250 caracterees!
Outra parte do nome de macro so os dois parnteses ao trmino do nome da
macro. Esta uma exigncia de Visual Basic. Voc no precisa adicionar os parnteses,
pois o Visual Basic os adicionaro automaticamente para voc quando voc for para
outra linha!

Antes de ns darmos uma olhada nas outras linhas dessa macro, cometamos
alguns erros no nome de macro. Volte e faa as mudanas seguintes ao nome de macro, e
tente ir para a linha imediatamente prxima aps cada mudana:

Escreva o nome usando espaos (Divida Por 100)


Incluir pontos no nome (Dividir.Por.100)

Comece o nome com um nmero (100Dividir)

Nunca se esquea da cor vermelha! Elas existem para ajud-lo. Afinal de contas,
melhor saber que voc tem um erro do que no saber! Se voc no corrigir a linha, voc
ainda pode mover para outra linha. Porm, a linha vermelha permanece at que o
problema seja corrigido. Esteja seguro de corrigir a linha atrs para Sub
DividirPor100 () seno sua macro no funcionar! Quando voc ganhar experincia
suficiente em escrever macros e no precisar destas advertncias, jogue fora as exibies
das opes das sintaxes erro em Ferramentas, Opes.

A segunda linha na que voc entrou,


Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 66
' Esta macro divide por 100

uma linha de comentrio. Linhas de comentrios so linhas que comeam com uma aspa
simples. A formatao em azul dos comentrios neste feita para enfatizar que a linha
uma linha de comentrio. Eles no so sublinhados em um mdulo. Nas linhas de
comentrio voc fornece se a palavra maiscula ou minscula. O Visual Basic
capitalizar apenas as palavras que reconhecer e, que esto nas linhas de declarao (no
linhas de comentrios).

Se voc omitir a aspa no comeo de uma linha de comentrio, voc ganhar uma
mensagem de erro (a linha fica vermelha) quando voc tentar mover prxima linha. Este
modo Visual Basic de lhe falar que voc deu mancada! Por favor, note que o texto
realado sempre no onde o problema est. Por exemplo, se voc digitou a linha de
comentrio corretamente, volte e remova a aspa simples e v para a prxima linha. A
linha ficar vermelha e o Visual Basic realar a palavra "divide" na linha de comentrio,
embora o problema seja a aspa simples perdida. Para consertar a linha de comentrio,
reponha a aspa simples de volta no comeo da linha.

Comentrio tambm pode ser colocado direita de declaraes. O seguinte ilustra isto:

Sub DividirPor100() 'Esta macro divide por 100


ActiveCell.Value = ActiveCell.Value/100 'divide por 100
End Sub ' Final da macro DividirPor100

Tambm, podem ser postas linhas em branco na macro em qualquer local. Linhas de
espao em branco ajudam freqentemente as leituras de suas macros.

A prxima declarao em sua macro a seguinte:

ActiveCell.Value = ActiveCell.Value/100

Se voc digitou esta linha em minsculas, o Visual Basic capitalizou as palavras


que ele reconheceu. V para a macro e mude apenas a letra " A " na palavra ActiveCell
para minscula. Quando voc mover para outra linha, o "a" mudado de volta para "A"
pelo Visual Basic.

A melhor aproximao digitar tudo, salvo linhas de comentrio, nome de macro, e texto
includos em aspas duplas e em minscula. Deste modo, se o Visual Basic no capitalizar
a palavra, voc sabe que foi digitado errado.

Para ilustrar isto, mude "ActiveCell" para "activcell" (torne-a minscula e apague
o e dentro de active). Quando voc faz isto e vai para a prxima linha, a palavra
permanece minscula, e nenhuma mensagem de advertncia de qualquer espcie aparece.
Por que o Visual Basic no d uma mensagem de erro devido a ortografia incorreta? O
Visual Basic pensa que voc est criando que uma varivel definida pelo usurio. Uma
Lies de VBA do Excel 67
varivel definida pelo usurio usada para armazenar valores ou outras informaes.
Esteja seguro em mudar " activcell " de volta para " ActiveCell ".

A palavra ActiveCell diz ao Visual Basic que voc est se referindo clula que
realada pelo ponteiro de clula. A palavra Value depois do ponto diz ao Visual Basic que
voc est se referindo ao Valor daquela clula. Assim, ActiveCell.Value refere-se ao
valor da clula ativa. O valor de uma clula uma das muitas propriedades de clula que
voc pode especificar. Como vimos em lio anterior algumas das outras propriedades de
clula que podem ser obtidas e modificadas so:

Propriedade de clula Retorno

Frmula frmula na clula com um sinal igual


Font.Name O nome da fonte
Font.Bold True se estiver em negrito, Falso se no estiver NumberFormat
Format da clula

Se a expresso ActiveCell.Value est direita do sinal igual, diz ao Visual


Basic para retornar com o valor da clula ativa. Se a clula contiver um nmero, o
nmero retornado. Se a clula contiver uma frmula, o valor numrico da frmula
retornado. Se a clula contiver texto, ento texto retornado. Se a clula estiver vazia,
ento um valor nulo retornado. Um valor nulo tratado como um zero nos clculos.
Em equaes de texto, um valor nulo anunciado por "", duas aspas duplas no tendo um
espao entre elas.

Se a expresso que ActiveCell.Value est do lado esquerdo de um sinal igual,


diz ao Visual Basic para atribuir para a clula o valor do que calculado direita do sinal
igual. Os exemplos seguintes ilustram isso:

Declarao de macro: Valor atribudo Clula:

ActiveCell.Value = 45 45
ActiveCell.Value = 1/2 0.5
ActiveCell.Value = "ABC" ABC

Note que Visual Basic avalia a expresso direita do sinal igual antes de atribulo
ao valor da clula ativa. Por exemplo, a entrada "1/2" se tornou "0.5".

Com este background, ns podemos entender o que faz a declarao


ActiveCell.Value = ActiveCell.Value / 100 em nossa macro. A expresso
ActiveCell.Value direita do sinal de igual retorna o valor da clula. Ele ento
dividido por 100 e o valor resultante atribudo clula.

A ltima declarao em nossa macro a seguinte:

End Sub
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 68

A palavra chave End quando combinada com a palavra chave Sub diz ao Visual Basic
que este o fim da macro. Todos as macros tm que terminar com End Sub. Se voc se
esquecer do End Sub, um erro acontecer quando voc tentar rodar a macro. O editor
bsico visual adiciona um End Sub automaticamente quando voc digitar a linha de Sub.

TESTANDO SUA MACRO

O prximo passo ao escrever esta macro testar as declaraes que voc escreveu.
Voc deveria testar qualquer macro que voc escreve muito freqentemente. Deste modo,
se voc tiver um problema, provvel que as linhas que acabaram de ser mudadas que
est causando o problema.

Quando voc testar uma macro, voc precisa testar todas as situaes diferentes que
podem acontecer quando a macro rodada. Nesta macro que ns queremos testar as
entradas de clula diferentes que se deveria rodar ao usar esta macro. Elas so:

Clulas contendo nmeros


Clulas contendo frmulas
Clulas contendo texto
Clulas em branco

Antes de voc poder testar esta macro, voc precisar ir para um planilha em branco
e fazer as entradas seguintes:

Clula Entrada Clula Entrada

B3 "Nmeros" D3 "Frmulas"
B5 1234 D5 =B5
B6 5678 D6 =B5+B6

Por favor, note que foram entrados 1234 e 5678 sem os sinais de igual.
Lies de VBA do Excel 69
Quando voc fizer isto, sua planilha dever se parecer ao seguinte:
=B5 =B5+B6
A B C D E
1
2
3 Nmeros Frmulas
4
5 1234 1234
6 5678 6912
7
8

O primeiro passo que voc dever fazer antes de testar uma macro salvar o seu
arquivo. Isto muito importante. Se voc tiver um problema e a macro no funcionar
corretamente, voc pode restabelecer o arquivo re-carregando-o. Tambm, se por alguma
razo uma determinada macro travar o Microsoft Excel (muito improvvel, mas acontece),
voc no perder as declaraes de macro que voc acabou de escrever.

Para testar a macro, primeiro selecione a clula B5. Esta a clula que contm o nmero
1234. Ento, selecione Ferramentas do menu da barra de Ferramentas Padro, e da
Macro neste menu e depois Macros... no sub-menu que aparece. Voc tambm pode exibir
rapidamente este dilogo apertando ALT-F8. Isto exibe a caixa seguinte:

Se voc tiver outras macros, elas tambm sero exibidas nesta lista. Quando voc clicar
uma vez no nome da macro, os botes cinzentos ficam ativos. Realce a macro DividirPor100
e d um clique no boto executar. A tela piscar e uma de duas coisas acontecer:
uma caixa de erro aparecer.

ou o valor 1234 em B5 ser trocado com 12,34.


Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 70
Se uma caixa de erro aparecer, significa que voc no digitou algo corretamente. A
mensagem de erro exata depende do que voc digitou! Para fixar, compare o que voc
digitou a listagem anterior da macro.

ATRIBUINDO UM BOTO NOSSA MACRO

Neste momento, voc tem uma macro que funciona bem com nmeros. Antes de
fazer uma prova adicional, montemos uma barra de ferramentas (toolbar) com um boto
nela que rodar esta macro sempre que o boto for clicado. Isto eliminar os passos de se
selecionar Ferramentas, Macros, selecionar a macro e clicar em Executar toda vez que
voc testar a macro.
Lies de VBA do Excel 71

Para criar uma barra de ferramentas com um boto para esta macro, selecione o
boto do Office e da Opes do Excel, e a seguir clique em Personalizar

Obteremos a janela seguinte:


Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 72
No menu drop-down que aparece em Escolher comandos em escolha Macros:

E obtenha a janela:

Clique no boto Adicionar e termos a macro na Barra de Ferramentas de Acesso Rpido

Para personalizar a barra de ferramentas do VBE, fazemos o seguinte


Exibir, Barra de Ferramentas, Personalizar
Lies de VBA do Excel 73

Aparecer a seguinte janela:

Na guia Barras de ferramentas, selecione o boto Nova... para criar uma barra de
ferramentas nova. Isto lhe permitir criar uma barra de ferramentas nova, em branco. Na
caixa de dilogo que aparece d um nome barra de ferramentas, por exemplo, "Botes de
Teste".
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 74

Uma nova barra de ferramentas em branco aparecer:


A seguir, selecione a aba de Comandos e clique na categoria de executar:

Clique sobre a face do Executar e arraste-o barra de ferramentas nova .


Para mudar o boto a uma nova imagem, clique com o boto direito do mouse sobre a
imagem no boto e selecione Alterar imagem de boto.

A seguir, escolha uma nova imagem.


Por favor, note que o Excel freqentemente torna-se instvel quando voc criar barra de
ferramentas. Sempre que eu crio uma barra de ferramentas nova, eu saio imediatamente
do Excel e da, volto a abri-lo. Eu acho que se eu no fizer isso, o Excel tende a cair mais
cedo ou mais tarde.

TESTANDO NAS CLULAS DE FRMULAS

O prximo passo de teste de nossa macro test-la em clulas que contenham frmulas.
Antes de testar, primeiro tenha certeza de que voc reps os valores nas clulas B5 e B6
de novo para 1234 e 5678. Os valores nas clulas D5 e D6 devero ser respectivamente
1234 e 6912, e elas devero conter frmulas, no nmeros.
Lies de VBA do Excel 75
Para testar uma frmula, clique sobre D5 e da clique no boto de teste que voc acabou
de criar. A notcia boa que o valor em D5 muda de 1234 para 12,34. A notcia ruim
que ela no mais uma frmula, mas um valor 12,34. preciso encontrar ento uma
maneira precisa que modifique as clulas com frmulas de modo que a frmula seja retida.

CONSERTANDO A MACRO PARA CLULAS DE FRMULAS

Para descobrir qual a frmula que est em uma clula, voc precisa usar a
propriedade Frmula em vez da propriedade Valor. Assim, usando a expresso
ActiveCell.Formula em vez de ActiveCell.Value lhe devolvido uma frmula
em vez do valor na clula. Mas o que acontece se a clula contm um nmero em vez de
uma frmula? Para descobrir o que voc obtm neste caso com ActiveCell.Formula,
criemos uma segunda macro que mostre a sada da expresso ActiveCell.Formula.
Usar pequenas macros, para obter informaes ou testar um novo cdigo, uma tcnica
muito til.

Entre vrias linhas abaixo da macro anterior DividirPor100 com esta outra macro que se
segue. Esteja certo em digitar minscula, com a exceo da palavra "testeMacro" que o
nome da nosso macro.

Sub testeMacro()
MsgBox ActiveCell.Formula
End Sub

A macro acima exibir uma caixa de mensagem na tela que contm a frmula da
clula ativa. V para sua planilha de teste e rode a macro de teste em vrias clulas. A
figura seguinte ilustra o que voc obter se voc clicar na clula D5 que contm a frmula
" =B5 " e rodar a macro de teste.

Rode a macro de teste em clulas que contenham nmeros, numa que esteja em branco, e
em uma que contenha texto. O seguinte os resultados que voc adquirir:

Se a Clula Contm: ActiveCell.Formula Retorna:

Frmula Frmula com um sinal de igual


Nmero O nmero
Texto O texto Nada Nada

Assim, ns precisamos modificar a macro DividirPor100 para usar


ActiveCell.Formula em vez de ActiveCell.Valor. Sua macro dever se parecer com o
seguinte quando voc tiver terminado:
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 76

Sub DividirPor100()
' Esta macro divide por 100
ActiveCell.Formula = ActiveCell.Formula / 100 End
Sub

Agora volte para sua planilha de teste e teste-a. Teste-a primeiro em nmeros e da
em clulas de frmula. Quando voc test-la em nmeros, ela funciona da mesma maneira
que antes. O nmero 1234 se torna 12,34, o nmero 5678 se torna 56,78.
Porm, quando voc rod-la em uma clula de frmula, as coisas ficam de mal a pior! A
caixa de erro seguinte aparece:

Selecionando o boto Fim lhe devolvido a pasta, se voc executou a macro de uma
pasta de planilhas. Se voc executou a macro do editor de VB, ele retorna voc ao editor.
Para encontrar qual a linha que est causando o problema, selecione o boto Depurar.
Isto resultar na linha com o problema comear realada. Por favor, note que isto o pe
no modo DEPURAR no editor de VB. E, voc pode corrigir a declarao e clicar no boto
executar/continuar para retomar a macro de forma que voc possa modific-la sem
correr o risco de travar o Excel. Por ora, selecione do menu Executar, Redefinir. Isto lhe
permite parar a macro e ento voltar pasta de planilhas e recomela do princpio.
Embora as correes de declaraes possam ser feitas enquanto estiver no modo depurar,
mais cedo ou mais tarde far o Excel e o editor visual basic travar.

Quando voc encontrar um erro numa linha de frmula, ele normalmente significa
que algo est errado do lado direito do sinal de igual. Neste caso, algo est errado com
ActiveCell.Formula/100. A frmula mostra-se bem. E, no est em vermelho, o que
indica que voc digitou algo erradamente.

Para descobrir o que est acontecendo, volte para a clula D5 que contm a frmula "=B5"
e execute a macro novamente. Quando a caixa de erro se aparecer desta vez, selecione
Depurar. Da ento, selecione Exibir, Janela Inspeo de variveis para fazer a janela
inspeo aparecer. O seguinte ilustra o modo depurar com uma janela Inspeo dentro e a
linha que causadora do problema realada (sua janela de inspeo pode estar no fundo ou
flutuando no topo ela controlada pelo usurio):
Lies de VBA do Excel 77

Para usar as caractersticas do Depurar, primeiro certifique-se que o painel


Inspeo esteja mostrado. Depois, a poro realada ActiveCell.Formula/100 da
linha do problema. Dai clique na linha realada e v para o menu Depurar e procure o item
Inspeo de variveis rpida ou Depurar, Adicionar Inspeo de variveis.
Aparecer o seguinte, se confirmar sua ao e se voc clicar o boto de Inspeo Rpida:

Se voc selecionar Depurar, Adicionar inspeo de variveis aparecer o seguinte:


Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 78

Selecione OK na caixa de dilogo. Depois, selecione ActiveCell.Formula e repita


as mesmas selees.
O seguinte o que a tela mostrar aps as inspees terem sido feitas com o ponteiro
na clula D5 da planilha:

Destas "inspees" voc v que quando o Visual Basic avalia o


ActiveCell.Formula que est rodando a frmula na clula, "=B5". Mas quando este
dividido por 100, o Visual Basic retorna "<Tipos Incompatveis>". Por que isto est
ocorrendo? O Visual Basic est dividindo o texto ("=B5") por 100, o que no pode ser
feito. Da uma mensagem de erro, "Tipos Incompatveis", porque ele est fazendo uma
operao matemtica no texto.
Lies de VBA do Excel 79

O que queremos que acontea terminar com "= (B5)/100" na clula. Para fazer isto
acontecer, o que voc precisa fazer cercar o "/100" com aspas duplas e concaten-lo
com ActiveCell.Formula usando um ampersand (&). Cercar / 100 com aspas duplas
diz ao Visual Basic que isto texto em oposio expresso matemtica que deveria
executar. O texto pode ser concatenado usando um ampersand (&). Certifique-se que
tenha colocado espaos na frente e aps o ampersand (&).

Para ordenar a macro, selecione Executar, Redefinir para sair do modo Depurar.
Ou, e ainda mais facilmente, clique no boto quadrado que o boto parar/redefinir
para retornar a edio normal e sair do modo depurar. Modifique ento a declarao na
macro para ficar como o que se segue:

ActiveCell.Formula = ActiveCell.Formula & "/ 100"

Quando voc digitar isto nela, tenha certeza de que voc colocou um espao antes
e outro depois do &. De outra forma, voc obter uma mensagem de erro, quando o Visual
Basic no conseguir entender ActiveCell.Formula&. Tente isto sem o espao de
modo que voc tambm experimente este erro. Voc recordar dele quando ele acontecer
a voc no futuro. Tente tambm escrever a declarao sem o & para fazer aparecer uma
mensagem de erro.

MANIPULANDO CLULAS DE EQUAES COMPLEXAS

Voc est ficando mais ntimo! Volte para sua folha de planilha de teste e experimente-a na
clula D5 que contm a frmula "= B5". O resultado "= B5/100".
E se voc repetir isto em uma segunda vez nesta clula, voc adquire "= B5/100/100".
Isto est perfeito! Logo, experimente na frmula mais complexa em clula D6 que
"=B5+B6 ". Quando voc fizer isto, voc obtm a frmula "= B5+B6/100". Isto no
totalmente o que se deseja! A Microsoft Excel dividir o valor de B6 primeiro antes do
100 e ento acrescentar isto a B5 em vez de somar B5 e B6 que dividem junto e ento
antes das 100. O que voc realmente deseja "= (B5+B6)/100". Se a equao existente
no rodeada por parnteses, as respostas mudam. Por exemplo, 5+100/100 so 5+1 = 6,
enquanto (5+100)/100 so 105/100=1.05.
Para consertar este problema, voc precisa modificar a declarao de macro de
forma a cercar a frmula com parnteses e ento adicionar os " /100 ". Mude a declarao
de forma que ela l:

ActiveCell.Formula = "(" & ActiveCell.Formula & ") / 100"

Volte para sua folha de planilha de teste e para clula D6, e corrija-a de novo a sua
frmula original, "=B5+B6 ". Agora experimente a macro. O resultado ligeiramente
diferente do que desejado: a clula termina com a entrada de texto "(=B5+B6)/100"
em vez de uma frmula. O que deve ser feito selecionar tudo da frmula que retornada
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 80
por ActiveCell.Formula com a exceo do sinal de igual. Para fazer isto ns
precisamos usar a funo Mid que devolver s parte do texto especificado.

USANDO A AJUDA PARA ENCONTRAR COMANDOS

Se voc est desejando saber como eu propus a funo Mid, eu a achei na ajuda do
Microsoft Visual Basic. Selecione Ajuda no menu editor VB e o item de menu "Ajuda do
Microsoft Visual Basic. Da, ento, selecione a guia de ndice e digite em "palavras
chaves". Selecione "string manipulation" e procure a informao de ajuda resultante.

Este texto apresentar muitas tais funes teis a voc para livr-lo de ter que descobri-las.
L apareceu a seguinte informao:

Funo Mid

Retorna uma Variant (String) que contm um nmero especificado de caracteres de uma
seqncia de caracteres.
Sintaxe: Mid(string, start[, length]) A sinta xe da funo
Mid tem os seguintes argumentos nomeados:

Parte Descrio

string Obrigatria. Expresso de seqncia da qual so retornados os caracteres. Se string


contiver Null, ser retornado Null.
start Obrigatria; Long. A posio do caractere em string onde a parte a ser
considerada
comea. Se start for maior que o nmero de caracteres existentes em string, a funo Mid
retornar uma seqncia de caracteres de comprimento zero ("").
Lies de VBA do Excel 81

length Opcional; Variant (Long). Nmero de caraclengteres a seth no textr oret (ionclrnuadsio.ve
Se o caromaictitdoere em ou s estart ), sero existiremreto rnados menos tcaodos os caracteres racteres
do que os de a partir da posio start at o final da seqncia de caracteres.

.............
............
Exemplo da funo Mid

O primeiro exemplo usa a funo Mid para retornar um nmero especifico de caracteres de uma

seqncia de Dim MyStricnagracteres. , FirstWord, LastWord, MidWords


MyString = "Demonstrao da funo Mid" ' Criar a seqncia de texto.
FirstWord = Mid(MyString, 1, 3) ' Retorna "Dem".

LastWord = MidWords = Mid(Mid(MyStringMyString,, 17 1), 6 )' ' Retorna


"funo". Retorna "Demonstrao da funo Mid".

USANDO A FUNO MID

A informao de ajuda nos fala que a funo Mid precisa ser fornecida a um texto
string, um nmero indicando posio do caractere na string onde a parte a ser considerada
comea, e o nmero de caracteres a ser retornado. Neste caso o nmero indicando a
posio do caractere onde a parte a ser considerada comea 2, porque o sinal de igual
est na posio de caractere 1. Se ns no fizermos uma entrada para o argumento de
comprimento (lenght), o Microsoft Excel assumir que ns queremos a poro restante do
texto, isto o que ns queremos.

A outra mudana que ns precisamos fazer pr um sinal de igual na frente dos primeiros
parnteses. Isto se faz para a entrada de uma clula de frmula em vez de uma entrada de
texto. A declarao de macro precisa se parecer com o seguinte depois que voc modific-
la:

ActiveCell.Formula = _
"=(" & Mid(ActiveCell.Formula, 2) & ")/ 100"

Na declarao anterior voc v um espao e um sublinhado (_) depois do primeiro


sinal de igual, e que a declarao continua na prxima linha. A combinao de um espao
e um sublinhado permite-se continuar uma declarao na prxima linha em vez de fazer a
declarao estender alm da rea visvel. Se voc tem espao em sua tela voc pode digitar
tudo isso em uma linha. Mas se voc fizer assim, esteja certo de remover o sublinhado.
A razo que eu escrevi declarao anterior em duas linhas em vez de uma que a rea de
impresso neste texto no larga o bastante para exibi-la em uma linha.

TESTANDO A MACRO MODIFICADA


Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 82
hora de testar novamente! Volte para a folha de planilha de teste e esteja certo
de que as entradas em D5 e D6 so respectivamente "=B5" e "=B5+B6". Quando voc
rodar a macro em cada destas clulas, voc obtm as frmulas que ns buscamos:

Clula Frmula Era: Frmula Tornou-se:

D5 =B5 =(B5)/100
D6 =B5+B6 =(B5+B6)/100

At aqui tudo bem! Mas, ns fizemos muitas modificaes desde que ns testamos
a macro por ltimo em uma clula que contm apenas um nmero em vez de uma frmula.
V para a clula B5 que contm o nmero 1234 e rode a macro. Os resultados so
ligeiramente diferentes do que ns queremos. Nossa macro removeu o "1" de "1234" e
entrou a a frmula "= (234/100).

USANDO IF E A FUNO LEFT

At este momento ns escrevemos uma declarao que possa controlar nmeros


mas no pode controlar equaes, e ns escrevemos uma declarao que pode controlar
equaes mas no pode controlar nmeros. O que ns precisamos fazer usar a declarao
que possa controlar nmeros somente em clulas que contm nmeros, e usar a declarao
que possa controlar frmulas somente em clulas que contm frmulas. Duas coisas so
necessrias para se fazer isto:

Uma maneira de distinguir entre clulas que contm nmeros e clulas que contm frmulas.
E, uma maneira para dizer a nossa macro que conjunto de instrues usar.

Se voc examina clulas que contm nmeros ao invs de frmulas, voc v que a
diferena fundamental o sinal de igual. Se o primeiro carter for um sinal igual, ento
ns usaremos a frmula existente que fica depois do sinal de igual. Se o primeiro carter
no for um sinal igual, ento dever ser um nmero.

Ns podemos usar a funo Left(texto, nmero) do Visual Basic para extrair apenas o primeiro
carter de uma clula de frmula. Nesta funo, voc especifica o texto e depois o nmero de
carter para retornar. Se o texto uma equao (Ex: "=B5+B6"), e o nmero de carter para
devolver apenas um, ento um sinal de igual retornado.

Para satisfazer a segunda exigncia, um modo de dizer nossa macro que conjunto
de instrues usar, ns usaremos uma declarao If. O seguinte ilustra a simples
declarao If que ns usaremos:

Se (If) o sinal igual for encontrado Ento (Then)


use a declarao para uma frmula Seno (Else)
Use a declarao para um nmero
Fim do If
Lies de VBA do Excel 83

Como informao, as declaraes If sero explicadas em detalhes em numa lio posterior.

Nossa nova macro se parece com o seguinte depois de ter sido modificada para ter
a funo Left () e os testes If adicionados a ela.

Sub DividirPor100() '


Esta macro divide por 100

If Left(ActiveCell.Formula, 1) = "=" Then


'Faa isto desde que a clula contenha uma funo
ActiveCell.Formula = _
"=(" & Mid(ActiveCell.Formula, 2) & ")/100"
Else
'Faa isto desde que a clula contenha um nmero
ActiveCell.Formula = _
"=" & ActiveCell.Formula & "/100"
End If
End Sub

Embora ns mencionamos o sublinhado anteriormente, voc pode ter perdido o


pargrafo dele. Na macro anterior voc v duas declaraes onde eu pus um espao e um
sublinhado (_) e que a declarao continua na prxima linha. A combinao de um espao
e um sublinhado permite-se continuar uma declarao nas prximas linhas ao invs de
fazer a linha estender alm da rea visual. Voc no pode dividir palavras usando o
sublinhado a menos que voc goste de mensagens de erro!

hora de testar novamente! Fique certo de que suas clulas de teste esto fixadas
novamente s condies originais delas (B5 e B6 so os nmeros 1234 e 5678; as clulas
D5 e D6 so as frmulas "=B5" e "=B5+B6"). Os resultados, em clulas que contm
nmeros e frmulas exatamente o que ns queremos! A clula que contm o nmero
1234 se torna " = (1234)/100 " e a frmula "=B5+B6" se torna "= (B5+B6)/100". Se
ns rodarmos isto em uma segunda vez nestas duas clulas, os resultados so "=
((1234)/100)/100" e "= ((B5+B6)/100)/100", tambm o que ns queramos!

MANIPULANDO TEXTO E CLULAS EM BRANCO

At agora, quando ns testamos a macro, ns s testamos em clulas numricas.


Estas so as clulas que contm nmeros ou frmulas que avaliam a um nmero. Mas se
ns rodarmos a macro em uma clula em branco ns encontraremos uma mensagem de
erro como a seguinte:
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 84

E, se ns a testarmos em uma clula que contm uma entrada de texto, ns obtemos


uma frmula sem sentido. Por exemplo, teste o macro em clula B3 que contm a palavra
"Nmero". O resultado a equao "= (Nmero)/100". O que ns queremos que a
macro ignore clulas que esto em branco ou tm texto.

O que ns precisamos de um modo de dizer se uma clula contm nmeros e equaes


em vez de texto ou est vazia. Acontece que existe uma funo Visual Basic que nos diz
se uma clula uma clula numrica. A funo Visual Basic IsNumeric (valor). Se a
clula contiver um nmero ou uma frmula numrica, ela retorna com o valor Verdadeiro
(True). Caso contrrio, retorna com o valor Falso (False). Modificando a macro para usar
este teste nela, um teste If, ns poderemos distinguir entre clulas numricas e clulas no-
numricas.

USANDO O PESQUISADOR DE OBJETO (OBJECT BROWSER)

Antes de fazermos uso do IsNumeric, lhe mostremos como ach-lo usando o


Pesquisador de Objetos. O Pesquisador de Objetos til para procurar por comandos.
Para fazer isto, v para o mdulo Visual Basic e selecione Exibir, Pesquisador de Objetos
(ou F2 ou clicando no boto-cone ). Voc ver o Pesquisador de Objetos exibido da
seguinte maneira:
Lies de VBA do Excel 85
Selecione VBA na caixa de listagem de cima esquerda e Information na caixa de listagem
de baixo lista direita. Uma descrio curta do item destacado aparecer no
fundo deste painel.

Na caixa Membros de Information, na janela acima, voc ver as diferentes


propriedades e mtodos que podem ser usados para esta classe de objeto Information da
biblioteca VBA. Se voc clicar sobre uma propriedade e da clicar no ponto de
interrogao no canto esquerdo superior do painel acim a, a Ajuda do Visual Basic sobre
o mtodo ou propriedade selecionada ser mostrada. Freqentemente a ajuda fornecer vrios
exemplos usando o mtodo ou propriedade selecionada.
Destaque a palavra IsNumeric na caixa Membros de Information e clique sobre o
boto ponto de interrogao para mostrar a informao de ajuda.
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 86

Como voc pode ver da informao de ajuda (Comentrio), ela retorna True se a
clula for numrica e False se no for. Tambm, a informao de ajuda fornece a sintaxe
a ser usada.

Voc pode deixar o Pesquisador de Objetos ativo e simplesmente selecionar


Janela no menu do editor VB e selecionar a janela que voc gostaria de ativar. Voc pode
tambm fechar o Pesquisador de Objetos clicando no boto fechar no canto direito
superior da janela.

USANDO IsNumeric NA MACRO


Lies de VBA do Excel 87
O que se segue macro DividirPor100 modificada para incluir o teste IsNumeric.
Note que o uso de identaes para agrupar declaraes relacionadas. Tambm, linhas em
branco so usadas para melhorar a facilidade de leitura da macro, e comentrios foram
colocados no final de cada declarao If.

Sub DividirPor100()
' Esta macro divide por 100

If IsNumeric(ActiveCell.Value) Then
'Faa isto desde que a clula seja numrica
If Left(ActiveCell.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
ActiveCell.Formula = _
"=(" & Mid(ActiveCell.Formula, 2) & ")/100"
Else
'Faa isto desde que a clula contenha um nmero
ActiveCell.Formula = _
"=" & ActiveCell.Formula & "/100"
End If 'Fim do teste Se Left
End If 'Fim do teste IsNumeric End
Sub

Note que ns testamos a propriedade de Valor da clula ativa com a funo


IsNumeric. Se ns tivssemos testado a propriedade de Frmula da clula ativa, clulas
que contm frmulas teriam retornado Falso desde que frmulas so entradas de texto.
Quando o teste de IsNumeric for True, so executadas as declaraes imediatamente
seguintes. Estas so as instrues que dividem nmeros ou frmulas por 100. Se o teste
Falso isto indica que a clula no contm uma entrada numrica. Nestes casos, a macro
pula o bloco de declaraes para a declarao End IF que o fim do teste If de IsNumeric.
Como a prxima declarao depois deste End IF End Sub, a macro pra.

Tambm note que ns pusemos declaraes de comentrio em cada uma das linhas
de declarao End If. Sempre que voc tem muitas declaraes If numa macro melhor
documentar as declaraes End If com um comentrio que lhe conte com qual declarao
If elas esto associadas. Como ilustrado anteriormente, isto muito fcil fazer. Por favor,
note que isso s porque voc rotula End If com uma declarao de comentrio que diz
que o fim de uma particular declarao Se, isto no funciona assim. Declaraes de
comentrio so apenas aquelas de comentrios. Quando voc escrever macro mais
complexa, voc poder achar que no tem mais que atarraxar s suas declaraes If os
comentrios.

Quando ns testamos nossa macro em uma clula que contm texto, como a
palavra " Frmula " na nossa planilha de teste, ela funciona exatamente como ns
queremos- ela no faz nada. Isto porque IsNumeric(ActiveCell.Value) retorna o
valor Falso quando uma clula contm texto. Isto faz nossa macro pular as declaraes
que modificam a clula. Quando ns testarmos em clulas que contm um nmero ou
uma frmula, ela tambm funciona perfeitamente, modificando estas clulas a serem
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 88
divididas por 100. Mas quando ns testamos o macro em uma clula em branco obtemos
umas outras das caixas de erro infames do Visual Basic:

Por que isto aconteceu? O teste IsNumeric(ActiveCell.Value) em uma clula


em branco deve ter retornado Verdadeiro (True), no Falso (False). Voc pode usar as
tcnicas de depurar ilustradas anteriormente para confirmar isto. O IsNumeric retorna
True numa clula em branco porque uma clula em branco em Microsoft Excel tratada
como sendo igual a zero. E desde que zero um nmero, o teste IsNumeric retorna True.
Para provar isto, v para a planilha de teste e entre com a frmula seguinte na clula
B12:"=B5*B10". A clula B5 contm um nmero, e clula B10 uma clula em
branco. O resultado zero, que consistente com o tratar uma clula em branco como
um zero.

Assim, ns tambm precisamos de um teste para ver se uma clula est em branco
ou no. V para o mdulo Visual Basic, selecione Exibir, e da Pesquisador de Objetos.
A opo << todas as bibliotecas >> dever ser selecionada, e Information selecionada no
painel Classes. Olhe as vrias propriedades. Voc achar uma propriedade chamada
IsEmpty. Selecione-a e d um clique no ponto de interrogao para descobrir mais sobre
ela. Voc achar que o teste IsEmpty retorna True se a clula est vazia.

Considerando que ns queremos somente rodar as declaraes que modificam os


contedos de clulas quando a clula no estiver vazia, ns precisamos "sacudir" a
resposta que ns queremos. O Microsoft Excel no faz isto para ns. Por exemplo, o teste
Not retorna True se o teste falso, e Falso se o teste verdadeiro. A declarao seguinte
na tabela ilustra isto:

IsEmpty(ActiveCell) Not(IsEmpty(ActiveCell))

Clula Contm Retorna Retorna

Entrada Qualquer False True


Nenhuma Entrada True False

O uso dos parnteses com a funo Not opcional.


Baseado nisto modificamos a macro para ler:
Lies de VBA do Excel 89
Sub DividirPor100()
' Esta macro divide por 100
If Not IsEmpty(ActiveCell) then
'Faa isto se a clula no estiver vazia
If IsNumeric(ActiveCell.Value) Then
'Faa isto desde que a clula seja numrica
If Left(ActiveCell.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
ActiveCell.Formula = _
"=(" & Mid(ActiveCell.Formula, 2) & ")/100"
Else
'Faa isto desde que a clula contenha um nmero
ActiveCell.Formula = _
"=" & ActiveCell.Formula & "/100"
End If 'Fim do teste If Left
End If 'Fim do teste IsNumeric
End If 'Fim do teste Not IsEmpty End
Sub

Quando testarmos as modificaes acima ela funciona para todos os casos!

DIVIDINDO TODAS AS CLULAS DE UMA SELEO POR 100

At este estgio, a nossa macro funcionou somente numa nica clula por vez. Se
tivermos 50 clulas para processar, teramos que rodar a macro 50 vezes. Seria muito
melhor selecionar um intervalo contendo as clulas que queremos dividir por 100 e rodar
a macro somente uma vez.

necessrio ento declaraes do Visual Basic que circule por todas as clulas de nossa
seleo e rode as declaraes em cada uma delas. A declarao For Each...Next do Visual
Basic faz isto, e tem a seguinte estrutura:

For Each item In uma coleo


declaraes
Next

Este comando tambm ser coberto em detalhes em lies posteriores.

A coleo que ns desejamos processar so as clulas no intervalo que ns realamos.


As clulas selecionadas na planilha ativa so identificadas pela de palavra chave Selection
do Visual Basic. O comando For Each circular por cada uma das clulas que foram
selecionadas e rodar as declaraes que esto entre o For Each e o Next. A declarao
Next diz ao Visual Basic para voltar ao topo do lao (loop), onde a declarao For est, e
processar a prxima clula. Isto continua at todas as clulas serem processadas.
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 90
A clula que est sendo atuada identificada por qualquer nome de varivel que
ns usarmos depois das palavras For Each. O nome que eu prefiro usar o nome "clula",
em minscula.

O que segue a estrutura bsica para uma macro que faz um lao atravs de uma seleo
de clulas e executa uma srie de declaraes nelas:

For Each clula In Selection


declaraes
Next clula

Mudemos nossa macro para usar as declaraes anteriores de forma que ela atuaro
nas clulas mltiplas. Sua macro deveria se parecer com o que se segue. (as nicas
mudanas so a terceira linha do topo e o segunda linha de baixo para cima).

Sub DividirPor100()
'Esta macro divide por 100 For
Each clula In Selection
If Not IsEmpty(ActiveCell) Then
'Faa isto se a clula no est vazia
If IsNumeric(ActiveCell.Value) Then
'Faa isto desde que a clula seja numrica
If Left(ActiveCell.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
ActiveCell.Formula = _
"=(" & Mid(ActiveCell.Formula, 2) & ")/100"
Else
'Faa isto desde que a clula contenha um nmero
ActiveCell.Formula = _
"=" & ActiveCell.Formula & "/100"
End If 'Fim do teste If Left
End If 'Fim do teste IsNumeric
End If 'Fim do teste Not IsEmpty
Next clula
End Sub
Agora v testar a planilha e selecione B5 at D6:

Agora rode a macro com todas estas clulas selecionadas. Em vez da macro funcionar, a seguinte
mensagem de erro aparece:
Lies de VBA do Excel 91

E a palavra "clula" na linha "For Each clula In Selection" destacada.

O que aconteceu que voc no declarou no topo da macro que a varivel clula
seria usada na macro. E, desde que a declarao Option Explicit est no topo do mdulo,
o Visual Basic pra a macro, mostra a mensagem de erro, e destaca a varivel no
declarada.
Se isto no aconteceu, clique no menu pop up do VB onde est atualmente
DividirPor100 e acesse o item (Declarao). Se a declarao Option Explicit no estiver
l, aquela mensagem no aparecer e a macro encontrar valores absurdos como resultado.

Declarar uma varivel muito fcil. Adicione apenas a declarao

Dim nome da varivel

No topo de uma macro. Neste caso,

Dim clula

Seria a declarao para declarar a varivel clula. Dim abreviao da palavra inglesa Dimension,
que era usada nas linguagens antigas de programao.
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 92

A macro ficaria agora com a seguinte aparncia:

Sub DividirPor100()
' Esta macro divide por 100
Dim clula
'restante do cdigo da macro
End Sub

Depois que voc fizer a correo anterior, volte planilha de teste, realce as clulas B5
at D6 e rode a macro. Voc notar que s a frmula em B5 muda. As frmulas nas
outras clulas no mudam, embora os valores exibidos mudem devido mudana no valor
de B5. H uma razo simples para isto. Embora a declarao For Each est selecionando
cada clula no intervalo de seleo, a macro s est agindo na ActiveCell. H s uma
clula ativa em uma seleo. Neste caso que clula B5. A declarao For Each no
muda a clula ativa quando ela circula pelas clulas. Para consertar, modifique a macro
mudando cada ocorrncia de ActiveCell palavra "Cell ". A macro corrigida se parece
agora com o seguinte:

Sub DividirPor100()
'Esta macro divide por 100
Dim clula
For Each clula In Selection
If Not IsEmpty(clula) Then
'Faa isto se a clula no est vazia
If IsNumeric(clula.Value) Then
'Faa isto desde que a clula seja numrica
If Left(clula.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
clula.Formula = _
"=(" & Mid(clula.Formula, 2) & ")/100"
Else
'Faa isto desde que a clula contenha um nmero
clula.Formula = _
"=" & clula.Formula & "/100"
End If 'Fim do teste If Left
End If 'Fim do teste IsNumeric
End If 'Fim do teste Not IsEmpty
Next clula
End Sub

Quando voc tentar esta macro, voc ver que toda clula numrica na seleo
dividida por 100 e as clulas no-numricas no so mudadas. Nesta fase voc tem uma
ferramenta bastante poderosa. Tambm, por favor, note que a macro anterior no
seleciona nenhuma clula nem muda a clula ativa. Esta aproximao aquela que voc
deveria tentar seguir em todas as suas macros.
Lies de VBA do Excel 93

TORNANDO SUA MACRO SUPER PODEROSA

Realmente seria agradvel se a macro que h pouco voc escreveu pudesse fazer
muito mais que dividir por 100. Pode haver casos onde voc quer dividir por 10, 1000, ou
algum outro nmero. Ou, voc pode querer fazer multiplicao, adio, ou subtrao em
vez de diviso. Um modo para resolver isto seria fazer cpias deste macro e modificar o
que ela faz. Ento, voc ter uma macro para cada tarefa que voc quer. Isto, obviamente
resultaria em muitas macros fazendo tarefas semelhantes. Outra aproximao seria editar
a macro sempre que voc quisesse fazer algo diferente. Mas isso na verdade no muito
eficiente, e perigoso, pois se voc pensar que a macro que foi ajustada para fazer uma coisa
agora ajustada para fazer algo diferente de fato. Isto especialmente importante, pois
no existe capacidade de se desfazer (undo) com macros.

Felizmente, o Visual Basic fornece vrios significados para incitar a contribuio


do usurio. O mais simples destes a funo InputBox (). Esta funo permite uma
macro mostrar uma caixa de entrada onde o usurio pode digitar em resposta solicitao.

O que segue so as declaraes que precisam ser acrescentadas ao topo da nossa macro
(direitamente abaixo da declarao "Dim clula):

Dim aodesejada
aodesejada = _
InputBox("Entre com uma ao matemtica (Ex: / 100)")
If aodesejada = "" Then Exit Sub

A varivel aodesejada uma nova varivel de usurio e a primeira letra no


maiscula. Esta uma conveno que freqentemente usada para nomear variveis.

Estas declaraes fazem aparecer a seguinte caixa de entrada na tela:

Quando estas declaraes so rodadas, a entrada na caixa atribuda varivel de


usurio aodesejada. Se o boto Cancelar selecionado, ento a aodesejada
fixada igual a "". A varivel aodesejada tambm fixada para "" se nada posto na
caixa de entrada e o boto de OK selecionado. Se qualquer uma destas duas situaes
acontecer, ento a macro precisa conferir isto e parar. Isso exatamente o que a declarao
If aodesejada = "" Then Exit Sub faz.
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 94
Se o usurio entra com uma ao de matemtica, por exemplo "/ 100", ou "* 5",
ento a varivel aodesejada fixada para este valor. Ento, quando ns
referenciarmos a aodesejada mais tarde em nossa macro, o Visual Basic substitui o
que est armazenado na varivel aodesejada para o nome da varivel.

A outra modificao que voc precisa fazer em sua macro substituir o " / 100 " com a
varivel aodesejada. H duas ocorrncias que precisam ser substitudas - uma para
o caso da clula conter exatamente um nmero, e um para o caso em que a clula contm
uma frmula. Naquele contendo a frmula, os parnteses fechados precisam ser mantidos.

O que segue o que a macro modificada agora se parece. Note que a varivel
aodesejada no est inclusa em aspas duplas. Tambm, o nome da macro foi mudado
para AesMatemticas para indicar melhor o que o macro faz.

Sub AesMatemticas()
' Esta macro modifica clulas baseadas em aes matemticas entradas pelo usurio
Dim clula
Dim aodesejada
aodesejada = _
InputBox("Entrar com uma ao matemtica (Ex: / 100)")
If aodesejada = "" Then Exit Sub For Each clula In
Selection
If Not IsEmpty(clula) Then
'Faa isto se a clula no estiver vazia
If IsNumeric(clula.Value) Then
'Faa isto desde que a clula seja numrica
If Left(clula.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
clula.Formula = _
"=(" & Mid(clula.Formula, 2) & _
")" & aodesejada
Else
'Faa isto desde que a clula contenha um nmero
clula.Formula = _
"=" & clula.Formula & aodesejada
End If 'Fim do teste If Left
End If 'Fim do teste IsNumeric
End If 'Fim do teste Not IsEmpty
Next clula End Sub

Se voc mudar a capitalizao da varivel aodesejada em seu comando


declarao de variveis (Dim aodesejada), a capitalizao muda em todos lugares na
macro quando voc se mover para fora da linha Dim. Mude a capitalizao e movase para
fora da linha para ver isto acontecer.

Se voc no salvou o seu arquivo, por favor, faa-o ento neste momento! Voc deveria adquirir
o hbito de salvar muito freqentemente o seu trabalho.
Lies de VBA do Excel 95

ANTES DE VOC TESTAR, voc precisa mudar o macro atribuindo-a a seu boto da
barra de ferramentas. Se voc no fizer a seguinte caixa de erro vai estourar na sua frente
desde que o nome de DividirPor100 foi mudado para AesMatemticas.

Tente seu boto - o que est acima aparecer! Para consertar faa o seguinte:

Selecione Exibir, Barra de ferramentas, Personalizar


Clique com o boto direito do mouse sobre o boto de sua macro. Selecione 'Atribuir Macro' do
painel que aparece.
Selecione a macro "AesMatemticas" e feche todas as caixas.

Uma vez tendo feito as mudanas anteriores, voc pode voltar planilha de teste e
testar a macro nova melhorada. Voc a achar bastante poderosa. Voc no s pode entrar
com aes de matemtica como " / 100 " ou " * 5 ", como tambm voc pode entrar com
aes complexas. Por exemplo, voc poder entrar com "*100 - 456".

MANIPULANDO ERROS

Se voc entrar com uma ao de matemtica complexa incorreta (Ex: "*/*456"), sua macro
explodir com a mensagem de erro seguinte:

Tambm explodir se voc tentar modificar uma clula que contm uma frmula e esquecer de pr
nela o operador de matemtica (Exemplo: 1000 em vez de em * 1000).

Seria muito melhor se exibisse uma mensagem que mostrasse a ao de matemtica que
fora entrada nela e uma mensagem que diga que o Microsoft Excel no pode modificar
clulas que usam aquela entrada de ao de matemtica. Para fazer isto, duas mudanas
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 96
tm que ser feitas na macro. Primeiro, adicione a linha seguinte logo acima da linha For
Each.

On Error GoTo erroMsg

E, coloque a seguinte declarao aps a declarao "Next clula".

Exit Sub
erroMsg:
MsgBox "No pode modificar clulas usando " & aodesejada
Exit Sub

A frase On Error uma declarao do Visual Basic que monitora sua macro por
erros. Ela chamada de armadilha de erros. Quando um deles ocorrer, a declarao que
segue On Error imediatamente executada. Neste caso a declarao "GoTo erroMsg".
GoTo uma declarao do Visual Basic que transfere o controle para a localizao
especificada aps a palavra GoTo. Neste caso, o Visual Basic procurar um rtulo (label)
na macro chamado "erroMsg:". Um rtulo consiste de um nome seguido por dois pontos.
Assim, dois pontos so exigidos no final de "erroMsg" no segundo grupo de declaraes
que esto sendo adicionadas.
Se voc esquecer de colocar os dois pontos aps o nome de rtulo , voc obter a seguinte
mensagem de erro quando voc rodar a macro:

Nenhum erro ocorrer se voc colocar os dois pontos aps o nome de rtulo quando voc se
referir a ele numa declarao GoTo.

A primeira das duas declaraes Exit Sub pra a macro se nenhuma mensagem de erro
ocorrer. A segunda Exit Sub pra a macro se ela saltar o rtulo erroMsg:. A macro
ser sempre parada pela linha End Sub, voc dever tambm colocar uma linha Exit Sub
aps rotinas de erros. Esta exatamente uma boa tcnica de programao. MsgBox
Lies de VBA do Excel 97
uma funo do Visual Basic que mostra mensagens na tela. O texto a ser mostrado deve
estar entre aspas duplas. Se voc estiver combinando texto e variveis, ento eles so
concatenados usando um smbolo &. Note que espaos so exigidos de cada lado do
smbolo &. Caso contrrio um erro poder ocorrer. Tambm, nomes de variveis no
ficam entre aspas duplas.

O que segue o que a macro modificada se parece:

Sub AesMatemticas ()
'Esta macro modifica as clulas baseada em uma ao matemtica que o
usurio entra

Dim clula
Dim aodesejada

Obtenha uma entrada do usurio aodesejada


= _
InputBox("Entrar com uma ao matemtica (Ex: / 100)")
If aodesejada = "" Then Exit Sub

On Error GoTo erroMsg

For Each clula In Selection


If Not IsEmpty(clula) Then
'Faa isto se a clula no estiver vazia
If IsNumeric(clula.Value) Then
'Faa isto desde que a clula seja numrica
If Left(clula.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
clula.Formula = _
"=(" & Mid(clula.Formula, 2) & _
")" & aodesejada
Else
'Faa isto desde que a clula contenha um nmero
clula.Formula = _
"=" & clula.Formula & aodesejada
End If 'Fim do teste If do sinal de igual
End If 'Fim do teste IsNumeric
End If 'Fim do teste Not IsEmpty
Next clula

Exit Sub

erroMsg:
MsgBox "No pode modificar clulas usando " & aodesejada
Exit Sub
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 98
End Sub

V agora testar a planilha e testar a macro. Desta vez, coloque a entrada "* / 100" na
caixa de entrada ao invs de "/ 100". Quando voc fizer isso, a seguinte caixa de
mensagem aparecer:

Finalmente, volte e teste o macro em todos os tipos diferentes de clulas. Voc


achar que ela funciona exatamente como ns queramos, com uma exceo: Se uma
clula contm um nmero e voc entra em um nmero sem um operador de matemtica
(+. -. *, /), a macro combinar os dois nmeros em um: Por exemplo, se a clula que
modificada contm o nmero 1234 e voc entra em 100 (no /100) na caixa de entrada,
voc obtm 1234100. No totalmente a resposta certa. Para resolver este problema, ns
precisamos testar a entrada na caixa de entrada e ver se o primeiro carter um operador
de matemtica. O cdigo a seguir realiza esta tarefa:

Private Sub ChecarPrimeiroCaract(entradaParaChecar)


Dim primeiroCaract
'checar texto para ver se a entrada um operador matemtico

primeiroCaract = Left(LTrim(entradaParaChecar), 1)
If primeiroCaract = "+" Or _ primeiroCaract
= "-" Or _ primeiroCaract = "*" Or _
primeiroCaract = "/" Or _ primeiroCaract =
"^" Then Exit Sub
Else
'Mostrar mensagem e parar a macro
MsgBox "Sua entrada no comea " & _
"com +, -, * ou /. Atividade interrompida."
End End
If
End Sub

O anterior de fato uma macro separada que ser chamada pela macro AesMatemticas. Uma
macro que chamada por outra macro chamada sub-rotina.
Pondo a palavra chave Private na frente da declarao de Sub desta macro
ChecarPrimeiroCaract, esta no se apresentar quando voc selecionar Ferramentas,
Macro dos menus. Isto normalmente feito em sub-rotinas, pois elas somente so rodadas
quando forem chamadas por uma macro.

Para chamar a sub-rotina anterior, insira a seguinte declarao na macro de AesMatemticas


imediatamente acima da declarao On Error:
Lies de VBA do Excel 99

ChecarPrimeiroCaract aodesejada

Esta declarao diz ao Visual Basic para ir macro chamada


ChecarPrimeiroCaract e passar a ela o valor da varivel aodesejada. A macro
ChecarPrimeiroCaract guarda o valor que passado pra ela numa varivel chamada
EntradaParaChecar. A macro ChecarPrimeiroCaract usa ento a funo LTrim
e a funo Left para encontrar qualquer branco na frente do texto armazenado na varivel
EntradaParaChecar e obter o primeiro caracteree. A macro ento verifica se aquele
primeiro caracteree um smbolo +, -, *, / ou ^ . Se for, o controle retornado macro
AesMatemticas. Se no for, uma caixa de mensagem aparece dizendo que a entrada
est incorreta. Ela ento usa a declarao End que por si s pra toda a atividade de
macro. Se uma declarao Exit Sub tivese sido usada na sub-rotina em vez da declarao
End, o controle teria retornado para a AesMatemticas, e a macro AesMatemticas
teria continuado.

O que se segue so as macros finais. Note que os comentrios foram adicionados para facilitar
a documentao das macros:

Sub AesMatemticas()
'Esta macro modifica as clulas baseadas nas aes matemticas entradas
pelo 'usurio
Dim clula Dim
aodesejada
'Obtenha a ao matemtica que o usurio quer introduzir aodesejada = _
InputBox("Entrar com ao matemtica (Ex: / 100)")
'Encerrar se nenhuma ao for entrada o se selecionar Cancelar If
aodesejada = "" then Exit Sub
'chamar a sub-rotina para confirmar que o primeiro caracteree
um operador 'matemtico ChecarPrimeiroCaract aodesejada
'verificar se na ao introduzida se ocorreu um erro
On Error GoTo ErrorMsg
'circule atravs de cada clula na seleo For
Each clula In Selection
'faa as aes seguintes se a clula no estiver vazia If
Not IsEmpty(clula) then
'Faa isto se a clula no estiver vazia
If IsNumeric(clula.Value) Then
'Faa isto desde que a clula seja numrica
If Left(clula.Formula, 1) = "=" Then
'Faa isto desde que a clula contenha uma equao
clula.Formula = _
"=(" & Mid(clula.Formula, 2) & _
")" & aodesejada
Else
'Faa isto desde que a clula contenha um nmero
clula.Formula = _
"=" & clula.Formula & aodesejada
End If 'Fim do teste de sinal de igual
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 100
End If 'Fim do teste IsNumeric End
If 'Fim do teste Not IsEmpty
'retorne no crculo e faa na prxima clula Next
clula
'terminar a macro quando todas as clulas forem processadas
Exit Sub
venha aqui se existir um erro quando a formula escrita errada ErrorMsg:
MsgBox "No se pode modificar a clula usando" & aodesejada
Exit Sub End Sub

'******************************************************

Private Sub ChecarPrimeiroCaract(entradaParaChecar)


'esta sub-rotina chamada pela AesMatemticas para confirmar se
um operador 'matemtico o primeiro
'caractere no texto que entrado. Dim
primeiroCaract
'checar o texto para ver se a entrada um operador matemtico
primeiroCaract = Left(LTrim(entradaParaChecar), 1) If
primeiroCaract = "+" Or _ primeiroCaract = "-" Or _
primeiroCaract = "*" Or _
primeiroCaract = "/" Or _
primeiroCaract = "^" Then
Exit Sub 'retorna macro que a chamou Else
'Mostra uma mensagem e pra a macro MsgBox
"Sua entrada no comea " & _
"com +, -, * ou /. Atividade parada"
End End
If

End Sub

'****************************************************** RESUMO
DA LIO

Nesta lio, voc criou no s uma macro muito poderosa e til, voc tambm
aprendeu bastante a respeito do Visual Basic e de como escrever macros. Por exemplo,
voc sabe descobrir o que est em uma clula agora e como mud-la. Mais adiante, voc
viu como escrever uma macro que trabalhar em todas as clulas que voc selecionou e
no em s numa nica clula. E, voc viu como perguntar ao usurio pelas entradas e
exibir mensagens de volta a ele.

Se voc s leu esta lio e no fez os exerccios, voc precisa voltar e fazer os exerccios.
S fazendo voc ir aprend-los verdadeiramente.

Finalmente, voc encontrar algumas tcnicas e comandos adicionais mais tarde


que voc poder usar para agilizar e melhorar a macro anterior. Prossiga e faa isto. A
macro anterior foi escrita de modo a ilustrar as declaraes do Visual Basic ao invs de
Lies de VBA do Excel 101
ser um conjunto bem eficiente de declaraes para fazer a tarefa. Por exemplo, voc pode
querer substituir o InputBox com um userform. Ou, voc pode querer modificar a macro
de forma que ela se lembre da ltima entrada.

OUTRO EXEMPLO
Vamos agora criar uma outra macro mais simples. Abra o Excel, abra a pasta
"VBATeste1.xls" aquela que voc criou na lio.... . Adicione uma folha de planilha sua
pasta e renomeie-a "Teste2" (clicar com o boto direito do mouse na guia, escolher
"Renomear" e digitar nela o nome). Na clula A1 a A10 entrar com os 10 primeiros nomes
de algumas pessoas e nas clulas B1 at B10 entrar com os 10 ltimos nomes daquelas
pessoas.
Vamos agora criar um novo mdulo. V para o VBE e clique com o boto direito do
mouse no projeto "VBATeste1" dentro da Janela VBA project e selecione
"Inserir/Mdulo". Voc agora tem um novo mdulo. Na janela de propriedades, d um
duplo clique na caixa da propriedade "(Name)" e entre com "modTeste2". Temos agora
um novo mdulo com um novo nome.
Na janela VBAProject d um clique na folha de planilha chamada "Teste2". Na
janela de propriedades d um duplo clique na caixa de propriedade "(Name)" e entre com
"folTeste2". Voc agora tem uma folha de planilha com um caption lendo "Teste2" e com
o nome "folTeste2".
Na janela VBAProject d um duplo clique sobre "modTeste2"" e v para a janela de
cdigo para desenvolver uma macro.
Escreva "Sub proTeste2 ()" e clique "Enter". O VBE adiciona uma linha "End
Sub". Ns escreveremos nosso cdigo entre estas duas linhas, assim crie alguma coisa
para ela definindo o cursor no final de "End Sub" e clicando "Enter" umas poucas vezes.
Logo abaixo de "Sub proTeste2()" escreva seu nome precedido por uma apstrofe (') '
Luiz Bertolo e clique "Enter". Note que a fonte na linha que voc acabou de escrever
verde. Por causa da apstrofe o VBA considerar o texto como um comentrio (remark -
REM) e no se incomodar com ele. Voc pode adicionar um nmero qualquer de linhas
REM em qualquer lugar para tornar o seu cdigo inteligvel. Eu geralmente sempre
comeo meus procedimentos com trs linhas Rem (meu nome, meu nmero de telefone
e o endereo do meu website) de modo que as pessoas possam entrar em contato comigo
se elas tiverem problemas com meus procedimentos VBA.
Clique "Enter" novamente par inserir uma vazia linha. No hesite em inserir linhas vazias
em qualquer lugar para tornar seu cdigo mais facilmente legvel.
Aqui esto as 6 linhas de cdigo que voc estar escrevendo (ou copiar/colar daqui):
folTeste2.Select
Range("C1").Select
Do Until Selection.Offset(0, -2).Value = ""
Selection.Value = Selection.Offset(0, -2).Value & " " &
Selection.Offset(0, -1)
Selection.Offset(1, 0).Select
Loop
Range("A1").Select
Lio #06 Escrevendo Macros no Visual Basic Editor do Excel 102
As primeiras 2 linhas dizem ao VBA onde comear o procedimento. Se voc no
mencion-las o VBA comear o procedimento de qualquer clula que estiver selecionada
na sua pasta.
As linhas 5 at 7 a tarefa real que voc quer que o VBA realize. Voc est dizendo: de
alguma coisa para o valor da clula 2 colunas esquerda da clula selecionada em vazio (aspas
duplas). Com a clula selecionada uma linha aps onde estava por ltimo a tarefa encerrar. Se
houver um primeiro nome voc faz outra vez seu loop (ltima linha da declarao).
Qual a tarefa: torne o valor da clula selecionada igual ao valor da clula a 2
colunas esquerda, (&) um espao (espao entre duas aspas duplas) (" "), e o valor da clula
a 1 coluna esquerda da clula selecionada. Da mova-se para baixo uma clula.
Quando a tarefa tiver sido efetuada v para a clula A1.
Agora volte ao Excel v para "Ferramentas/Macro/Macros" selecione a macro
"proTeste2" e clique "Executar". Apague a coluna C e faa isto novamente. Adicione o primeiro
e o ltimo nome de pessoas sua lista e faa isto novamente.
Congratulaes por voc ter criado o seu primeiro procedimento VBA.
Ns o testaremos passo a passo na prxima lio.
Lies de VBA do Excel 103
PRTICA
Bertolo Fa entos VBA em Excel 104

se #1: Desenvolvendo Procedim

Lio 7: Testando Macros no Visual Basic Editor para Excel

A qui est uma maneira muito interessante de testar uma macro passo a passo enquanto
voc a acompanha trabalhando na pasta Excel.
Feche cada um dos programas do seu computador. Abra o Excel e a pasta na qual
voc criou a macro. Abra o Visual Basic editor. Na barra de status do Window no fundo
de sua tela voc pode ver que o Excel est aberto e o VBE tambm. Clique com o boto
direito do mouse na barra de status no espao vazio onde onde eu adicionei as estrelas
laranjas:

O menu seguinte aparece:

Clique em "Janelas lado a lado verticalmente" e a tela se parecer com isto:


Fa entos VBA em Excel 105

Lio #07 Testando Macros no Visual Basic Editor

A pasta Excel ocupa metade da tela e o VBE ocupa a outra metade. Torne a Janela de
Cdigo mais larga no VBE de modo que voc possa ver todo o cdigo.
Clique em qualquer lugar dentro da macro e pressione a tecla F8 no topo do seu
teclado. A primeira linha de cdigo torna-se amarelo e a pequena seta aparece na margem.

Clique novamente em F8 at toda a macro ter sido executada. Apague os valores


da coluna B do Excel e inicie a macro novamente. Pare quando a linha "Do" for destacada.
Mude "B1 para B5" na linha acima. Clique na pequena seta, segure e arraste a seta de
volta para a nova linha "Range("B5").Select". Pressione F8 novamente. Voc v que se
voc modificar o cdigo e pode voltar um passo sempre voc quiser. Voc pode mesmo
pular certas linhas de cdigo e testar somente parte do procedimento.
Enquanto voc estiver rodando a macro passo a passo voc pode parar a execuo em

qualquer instante clicando no boto parar na barra de ferramentas.


106

se #1:Desenvolvendo Procedim

Lio 8: Eventos VBA No Excel

Quando a macro inicia? Quando um EVENTO acontece. O evento aquilo que dispara a macro
VBA do Excel.
Do Menu
No Excel voc pode rodar uma macro VBA do Excel indo ao menu
"Ferramentasl/Macro/Macros.." da selecionar a macro na lista e clicar "Executar".

Abra muitas pastas com macros nelas. Quando voc for ao menu
"Ferramentas/Macro/Macros.." voc notar que voc tem acesso a todas as macros de
todas as pastas abertas. Isto significa que voc pode armazenar TODAS as suas macros
teis do Excel numa nica pasta (chame-a myMacros.xls) e tenha acesso a elas enquanto
a pasta estiver aberta. Digamos por exemplo que voc tenha projetado a macro que
multiplica o contedo de uma clula por 2. Se "myMacros.xls" est aberta voc pode
chamar esta macro Excel de qualquer clula de qualquer outra pasta que esteja aberta. No
precisa copiar suas macros essenciais em todas as suas pastas apenas abra myMacros.xls
e coloque-as para trabalhar.
Clicando numa Tecla do seu Teclado
Primeiro voc precisa programar uma tecla. Para fazer isto v a
"Ferramentas/Macro/Macros.." da selecione uma macro da lista. Clique nas "Options" e
siga as instrues. Uma sugesto, atribua s suas macros teclas maisculas ("Shift/A" em
vez de "Shift/a por exemplo) para garantir-se de que voc no usa uma das muitas teclas
minsculas que j so usadas pelo Excel.
Clicando numa caixa de texto na planilha
Fa entos VBA em Excel 107

80% das macros Excel que eu desenvolvi so disparadas por um clique numa caixa de texto
localizada sobre uma planilha.
Lio #08 Eventos VBA no Excel

Eu prefiro usar caixas de texto ao invs de botes de comando VBA porque elas
so muito mais fceis de manter e permitir muito mais criatividade no design. Voc pode
usar the fonte que voc gosta e a cor de fundo (background) que ajuste s suas
necessidades. Se voc for um pouco criativo, voc pode adicionar efeitos 3D, bordas
especiais e as preferncias.
Umas poucas notas sobre as caixas de texto do Excel:
Eu mantenho sempre a barra de ferramentas de desenho visvel no fundo da minha tela

Voc cria caixas de texto clicando com o boto esquerdo do mouse no cone ,
da v planilha clique com o boto esquerdo do mouse, segurar e esticar a caixa de texto.
Quando a borda da caixa de texto ativa for feita de linhas em diagonal voc pode trabalhar
o texto dentro da caixa de texto. Se voc clicar novamente na borda ela tornase um
conjunto de pontos e voc pode ento trabalhar a prpria caixa de texto. D um clique
com o boto direito do mouse na borda em qualquer dos dois estados e voc ver que os
menus so diferentes. no segundo estado que voc pode atribuir uma macro caixa de
texto.

Voc pode atribuir uma macro VBA para uma caixa de texto e tambm para um
WordArt, uma figura ou qualquer outra forma da barra de ferramentas de "Desenho".
Sempre que a um boto (imagem, a palavra arte ou caixa de texto) tiver sido atribuida uma
macro ou um hyperlink voc precisa selecion-lo com um clique com o boto direito do
mouse para modific-lo.
Download um destes botes (clicar com o boto direito do mouse nele no seu browser e
escolher "Save imagem as"). Salve-os no seu desktop:

Inserir a imagem que voc tiver importado na primeira folha de planilha


"Inserir/Figura/Do Arquivo/Desktop/..........gif". Uma vez a imagem tendo sido adicionada
folha de planilha, clicar com o boto direito do mouse na imagem, selecione "Atribuir
Macro" e selecione uma macro da lista. Clique "OK".
Agora clique na imagem.
Voc pode "copiar" todas espcies de botes da Internet ou criar seu prprio da barra de
ferramentas "Design" e us-los para disparar seus procedimentos VBA.
Fa entos VBA em Excel 108

se #2: Desenvolvendo Procedim

Lio 9: Segurana e Proteo VBA no Excel

A lgumas vezes quando voc envia uma pasta com macros nela a um colega
e ele no consegue trabalhar com elas provavelmente porque sua
definio de segurana est em "High". Logo lhe direi como mud-la
em "Ferramentas/Macros/Segurana".
Um arquivo Excel (.xls) no pode ser infectado por um destes vrus que aparecem
regularmente na Internet mas algum pode desenvolver procedimentos VBA (macros)
que possam danificar seus dados e seu computador seriamente. Ento defina o nvel de
segurana do Excel para "Medium" (Ferramentas/Macro/Segurana) e cada vez que voc
estiver tentando abrir uma pasta que contenha macro a janela de dilogo
seguinte aparecer.

Adotar a mesma atitude quando voc tiver com documentos anexados a Emails.
Se voc conhece a origem do arquivo voc pode habilitar as se no clique em "Desativar
macros" e voc estar inteiramente protegido. Voc pode observar a pasta mas os
procedimentos VBA (macros) no so operacionais. Voc pode ir para quaisquer dos
mdulos ou outros elementos da pasta que voc ver "API Function" significa que o
programador est tentando acessar seu computador atravs do Microsoft Windows ISTO
SUSPEITO.
Protegendo o cdigo
Como um Desenvolvedor VBA-Excel voc poder querer proteger seu cdigo de
modo que ningum deva modific-lo. No VBE editor v para
"Ferramentas/VBAProject Propriedades/Proteo". Marque a caixa e submeta um
password. Verifique se voc salvou o password em algum lugar que voc se lembrar
porque crackear passwords VBA muito custoso.
Protegendo a Pasta
Existem muitos nveis de proteo que voc pode configurar para a pasta. Primeiro
voc deve querer proibir qualquer um de abrir a pasta a menos que eles saibam o
password. Para fazer isto no Excel v ao "Arquivo/Salvar como" e clique em
"Ferramentas/Opes Gerais".
Ocultando Planilhas
Lio #09 Segurana e Proteo no VBA do Excel

Numa de suas pastas voc poder querer ocultar uma folha de planilha que
contenha informao confidencial (salrios e outros parmetros). Se voc apenas ocultar
a folha de planilha os usurios podem reexib-las. Existe uma maneira no VBA para
ocultar uma folha de planilha sem proteger a pasta inteira. Para ver a folha de planilha
tem-se que ir ao Visual Basic Editor e mudar a propriedade da folha de planilha. Se o seu
cdigo estiver protegido, ele tambm precisa de um password. Assim a folha de planilha
muito hidden e somente voc pode obt-la para modificar seu contedo. Selecione a
folha de planilha na janela VBAProject e configure a propriedade visible como
xlVeryHidden.
A Janela de Verificao imediata
Na de Verificao imediata (Crtl + G) podemos ver o cdigo sendo executado e o
que retornado pelo cdigo. Veja a figura abaixo.
Ela mostra, passo a passo, os resultados para um loop, por exemplo, conforme eles
ocorrem. Neste caso usamos a janela de Vericao imediata para ver os resultados de um
loop que vai encontrado os valores de Y de uma funo quadrtica (3x2 + 2x +
5), para x variando de 1 a 5.

Para vermos o cdigo sendo executado linha por linha, podemos pressionar a tecla F8
para entrar em modo de depurao. Para cad linha a ser executada precisamos acionar a
110
execuo atravs da tecla F8. Este mtodo, porm, pode ser muito eficiente. Vamos supor
que neste exemplo acima o loop j tenha sido avaliado e os clculos/frmulas so dados
como corretos. No precisamos executar o loop passo a passo. Ao invs, colocamos um
ponto de interrupo na parte que desejamos avaliar.
Todo o cdigo anterior executado e somente interrompido no ponto por ns definido.
Para isso, selecione a linha e v em Depurar/Ativar ou desativar pontos de interrupo
(F9)

Fase # 2: Cdigo VBA do Excel (macros)


Lio 1: Palavras e sentenas (cdigo) em VBA do Excel - Lio 2:
Trabalhando com o Application - Lio 3: Trabalhando com Workbooks -
Lio 4: Trabalhando com Worksheets - Lio 5: Trabalhando com
Clulas e Ranges - Lio 6: Trabalhando com Caixas de Mensagens -
Lio 7: Trabalhando com Caixas de Entrada - Lio 8: Trabalhando com
Erros

Lio 1: Palavras e sentenas (cdigo) em VBA do Excel


Umas poucas notas e dicas teis ao se escrever cdigo VBA.
Lio 2: Trabalhando com o Application
O objeto "Application" o Excel, o prrio programa. Como congelar a tela enquanto a
macro estiver rodando, como evitar mensagens como "Um arquivo j existe com este
nome, voc quer fazer....", como desativar e reativar clculos, como modificar o
ponteiro, para abrir o "Open" ou "SaveAs" e outras janelas de dilogos etc..
Lio 3: Trabalhando com Workbooks
Propriedades e mtodos da "ThisWorkbook" e de outras pastas. "ThisWorkbook" a
folha de planilha onde a macro est voc acabou de fech-la com o cdigo
ThisWorkbook.Close e voc pode encontrar o diretrio no qual ele reside com
ThisWorkbook.Path
Lio 4: Trabalhando com Worksheets
Trabalhando com planilhas ativando-as, imprimido-as, copiando-as numa outra folha de
planilha...
Lio 5: Trabalhando com Clulas e Ranges
Movendo-se entre clulas e ranges, valores, frmulas e outras propriedades e mtodos.
Contando o nmero de linhas e colunas para definir os limites de seus loops (For...Next,
Do...Loop, etc..).
Lio 6: Trabalhando com Caixas de Entrada
A ferramenta bsica a exigir um pedao de informao nico do usurio. Quando voc
concretizar seus limites voc move para os userforms (a parte divertida do VBA) Lio
7: Trabalhando com Caixas de Mensagens
Um modo fcil para comunicar-se com o usurio.
Lio 8: Trabalhando com Erros
Quando um erro ocorre voc no quer que seu usurio fique preso mensagem de erro
do VBA. Voc quer dizer-lhe o que est errado e dizer-lhe como fixar o problema. Voc
no quer que seu procedimento apenas EXPLODA.
Fase #2: Cdigo VBA do Excel (Macros)

Lio 1: Dicas Gerais do Cdigo VBA

V oc aprendeu como criar procedimentos VBA (macros) numa lio anterior.


Nesta lio voc encontrar muitos deles, pequenos, ilustrando os diferentes
objetos, mtodos e propriedades que voc pode usar para fazer as coisas
acontecerem no VBA do Excel. Voc descobrir tambm declaraes, funes
e variveis.
Vamos iniciar por meio de umas poucas dicas gerais. No hesite em usar o
gravador de macro para evitar erros de impresso. Escrever seu cdigo em letras
minsculas. Se a ortografia estiver correta, o VBE colocar em maisculas as letras
necessrias. Se no, verifique sua ortografia. Note:Aspas dentro de aspas devem ser
dobradas por exemplo:
MsgBox "Meu nome Bertolo" est OK e resultar em: Meu nome Bertolo
Mas se voc quiser o nome Bertolo fique entre aspas voc no pode escrever:
MsgBox "Meu nome "Bertolo""
voc deve dobrar as aspas:
MsgBox "Meu nome ""Bertolo"""
Nomeie TODAS as clulas e ranges que voc usar no seu cdigo de modo que
se os seus endereos mudarem (adicionando ou deletando colunas ou linhas, etc...), seu
cdigo no fica invalidado.
Nomeie todas suas folhas de modo que se um usurio mudar o ttulo (caption) seu
cdigo no fica invalidado. Na janela de projetos do VB Editor, quando voc selecionar
uma folha a Janela de propriedades lhe permite mudar ambos o nome a usar no
procedimento "(Name)" e no caption "Nome" da folha que usado na guia da folha.
Sempre use o "(Name)" para desenvolver seus procedimentos. Por exemplo:
Sheet1.Select ou folProgramacaoNome.Select
ainda funcionaro mesmo se o usurio mudar o caption da folha na guia.
Sheets("plan1").Select
ser invalidada se o usurio mudar o nome da folha na guia.
112
Sempre ativar a "Option Explicit". Embora, voc seja forado declarar variveis,
existem muitas outras vantagens. Se voc tiver um erro de ortografia para a sua varivel,
o VBE lhe dir. Voc deve sempre garantir que suas variveis so consideradas pelo VBE.
Voc pode usar Shift/Space para chamar suas variveis num menu contextual e dar duplo
clique nelas para ajust-las.
Declare todas suas variveis, (Dim), no comeo do procedimento, ele simplificar
o teste do seu cdigo.
113

Fase #2: Cdigo VBA do Excel (Macros)

Lio 2: Cdigo VBA do Excel para o Objeto Application bjeto


Application

O O Application um objeto VBA, ELE O PRPRIO EXCEL. Sempre que


voc quiser que o Excel faa alguma coisa ou se voc quiser mudar as propriedades do
Excel, voc usar o objeto Application. Atravs dele, ento, podemos configurar o Excel
em termos de visualizao, execues e outras funcionalidades.
Este objeto importante possui muitas propriedades e mtodos. Vejamos algumas
delas:
Propriedade Calculation
Quando voc estiver trabalhando com uma pasta na qual existem um monte de
frmulas e voc quiser desativar temporariamente os clculos voc usar:
Application.Calculation = xlManual (No esquea do xl antes de Manual)

CERTIFIQUE-SE de que no final do procedimento voc adicionou esta linha de


cdigo:
Application.Calculation = xlAutomatic
Se durante a execuo do procedimento voc quiser que uma nica folha seja
calculada voc usar:
Activesheet.Calculate
CutCopyMode
Aps cada operao Copiar/Colar, voc dever esvaziar o clipboard com a
seguinte linha de cdigo para ficar seguro de que a memria do computador no
sobrecarregou.
ActiveSheet.Paste
Application.CutCopyMode=False
Dilogos
Para mostrar quaisquer das janelas de dilogo do Excel voc usar o seguinte
cdigo (exemplo):
Application.Dialogs(xlDialogOpen).Show
Note que quando voc digitar esta sentena, to logo voc abrir os parnteses o
Lio #02 Cdigo VBA do Excel para o objeto Application 114

VBE lhe oferece a lista de todas as janelas de dilogo do Excel.

Aps digitar o ponto o amigo VBE lhe oferece outra lista para voc escolher
dentre os itens. Neste caso foi escolhido Show.
Neste exemplo ser mostrada a janela de dilogo ABRIR, como mostrado abaixo:

Propriedade DisplayAlerts
Habilita ou desabilita a exibio de mensagens de aviso como resposta de vrias
aes no Excel. True habilita as mensagens e False as desabilita.
Quando voc no quiser que o Excel lhe pergunte coisas como "Um arquivo j
existe....." ou "Voc quer salvar este arquivo..." voc usar o seguinte linha de cdigo
no comeo do seu procedimento VBA. Application.DisplayAlerts = False
E da ento no final:
Application.DisplayAlerts = True
Vamos a um outro exemplo:
Sub ExcluirFolha( )
115

Application.DisplayAlerts = False
Application.Worksheets(plan3).Delete
MsgBox A folha de planilha PLAN3 foi excluda sem nenhuma
mensagem...
Application.DisplayAlerts = True
Application.Worksheets(plan2).Delete
MsgBox A folha de planilha PLAN2 foi excluda com uma
mensagem de aviso...
End Sub

Lies de VBA do Excel

Neste exemplo anterior aparecer a seguinte mensagem de aviso quando da


excluso da PLAN2:

Propriedade DisplayFormulaBar
Exibe ou oculta a barra de frmulas do Excel como mostra o exemplo a seguir:
Public Sub BarraDeFormula ( )
Dim Resposta As VbMsgBoxResult
Application.DisplayFormulaBar = False
MsgBox A barra de frmulas est agora desabilitada
Resposta = MsgBox (Voc quer habilit-la novamente?,
vbYesNoCancel Or vbQuestion, Habilitao da barra de
frmulas)
If Rsposta = vbYes Then
Application.DisplayFormulaBar = True
MsgBox A barra de frmula acaba de ser habilitada novamente
ElseIf Resposta = vbNo Then
MsgBox Voc clicou em No. A barra de frmulas
continuar desabilitada
Else
MsgBox Voc clicou em Cancelar. A barra de frmulas continuar
desabilitada End Sub
Propriedade DisplayFullScreen
Exibe o Excel em tela cheia, diferente de maximizar a aplicao.
Public Sub TelaCheia ( )
Application.DisplayFullScreen = True
MsgBox A tela est no modo de Tela Cheia
Application.DisplayFullScreen = False
Lio #02 Cdigo VBA do Excel para o objeto Application 116

MsgBox A tela voltou ao modo normal


End Sub
Propriedade EnableAnimations
Essa propriedade ativa animao quando inserimos ou excluimos linhas ou
colunas de uma planilha. Podemos ter os seguintes valores:
Application.EnableAnimations = True
Application.EnableAnimations = False

Propriedade EnableAutoComplete
Esta propriedade habilita ou desabilita o recurso de AutoCompletar textos j conhecidos:
Application.EnableAutoComplete = True
Application.EnableAutoComplete = False
Propriedade EnableSound
Habilita ou desabilita a emisso do beep dentro do Excel.
Application.EnableSound = True Application.EnableSound
= False
Mtodo OnKey
O mtodo OnKey o responsvel pela atribuio de teclas de atalho para
procedimentois especficos. Esse mtodo sempre acionado para designar teclas de
atalho no momento de criao (design) de uma macro, quando configuramos essa
opo.
Sua sintaxe :
Application.Onkey(Tecla,Procedimento)
Tecla uma string que mostra uma tecla ou combinao de teclas que serviro de
atalho para um determinado procedimento Sub.
Vamos a um exemplo. O atalho de teclado Crtl + A exibe a caixa de dilogo Abrir
dentro de uma pasta de trabalho. Vamos desabilit-la:
Application.OnKey ^a,
Para fazer com que o atalho volte sua funo normal, fazemos o seguinte:
Application.OnKey ^a
O argumento Tecla pode assumir qualquer combinao de teclas. Para tanto,
designamos as letras como atalho direto e temos teclas especiais para designar
combinaes ou outras teclas no-diretas.
Vejamos a seguir uma lista de teclas especiais para o Microsoft Excel. As teclas
combinadas com Shift, Ctrl e Alt usam os seguintes prefixos:

Teclas Cdigo
117

Shift + (sinal de mais)

Ctrl ^ (circunflexo)

Alt % (porcentagem)

Backspace (retorno) {BACKSPACE} ou {BS}

Break (interrupo) {BREAK}

Caps Lock (letras maisculas) {CAPSLOCK}


Lies de VBA do Excel

Clear (limpar) {CLEAR}

Delete ou Del (apagar) {DELETE} ou {DEL}

Down Arrow {DOWN}

End {END}

Enter (entrar) {ENTER}

Esc (sair) {ESCAPE} ou {ESC}

Help (ajuda) {HELP}

Home (ponto inicial) {HOME}

Ins (inserir) {INSERT}

Left Arrow (seta a esquerda) {LEFT}

Num Lock (bloqueio numrico) {NUMLOCK}

Page Down (pgina abaixo) {PGDN}

Page Up (pgina acima) {PGUP}

Return (retorno) {RETURN}

Right Arrow (seta a direita) {RIGHT}

Scroll Lock (bloqueio de rolagem) {SCROLLLOCK}


Lio #02 Cdigo VBA do Excel para o objeto Application 118

Tab (guia para tabulao) {TAB}

Up Arrow (seta para cima) {UP}

F1 a F15 {F1} a {F15}


Mtodo GoTo
Para selecionar uma certa clula voc pode usar
Application.Goto Reference:=Range("V300")
ou mais simplesmente
Range("V300").Select
Mas se voc quiser que esta clula seja selecionada e fique como a clula do
topo/esquerdo na sua tela, voc usar
Application.Goto Reference:=Range("V300"), Scroll=True
Mtodo Quit
Esse mtodo encerra o Microsoft Excel e d os procedimentos comuns antes da
finalizao, com uma caixa de mensagem perguntando se o usurio deseja salvar a
aplicao.
A seguinte linha de cdigo fecha Excel no geral.
Application.Quit
ScreenUpdating
Quando voc no quiser ver sua tela siga as aes do seu procedimento VBA,
voc inicia e termina seu cdigo com as seguintes sentenas:
Application.ScreenUpdating = False Application.ScreenUpdating =
True
119

Fase #2: Cdigo VBA do Excel (Macros)

Lio 3: Procedimentos (Procedures) VBA para Pastas (Workbooks)


m objeto Workbook representa uma pasta de trabalho aberta. Cada objeto

U
Workbook armazenado em uma coleo Workbooks, que faz parte das colees
do objeto Application, visto na lio 2.
Como um objeto Workbook representa uma pasta de trabalho, podemos
acesslo como um ndice da coleo Workbooks da seguinte maneira:
Workboobs(1) ou pelo nome do arquivo Workbooks(nome do arquivo).
Para voc perceber a diferena entre o objeto Application e o objeto Workbook,
monte o seguinte cdigo:
Public Sub DiferenaDeObjetos ( )
MsgBox Application.Name Retorna o nome da pasta.XLS (ou
MsgBox Workbooks(1).Name = o nome-arquivo)
End Sub
ThisWorkbook
"ThisWorkbook" um objeto VBA. a pasta dentro da qual os procedimentos
rodam.

Vejamos agora alguma PROPRIEDADES do objeto Workbook:


Propriedade FullName
Retorna o Path e o Name do objeto. Digamos que uma pasta chamada Nome.xls
fosse salva em C:\Meus Documentos. A declarao: Workbooks(1).FullName
Retornar com o seguinte:
C:\Meus Documentos\Nome.xls
Propriedade Path
Retorna o caminho onde est salva a pasta de trabalho desejada. Digamos que
uma pasta de trabalho chamada Nome.xls fosse salva em C:\Meus Documentos. A
declarao:
Workbooks(1).FullName
Retornar com o seguinte:
C:\Meus Documentos
Quando voc trabalhar com pastas diferentes que esto todas no mesmo diretrio
que ThisWorkbook voc pode mudar o diretrio default "Abrir" com esta linha de
cdigo:
varPath= ThisWorkbook.Path
Mas eu prefiro a seguinte abordagem para ficar seguro de que eu abri ou saveAs
outras pastas no mesmo diretrio que ThisWorkbook
Lio #02 Cdigo VBA do Excel para o objeto Application 120

Sub proTeste()
Dim varPath as String
Lies de VBA do Excel 121

Workbooks.Open "pasta1.xls"
varPath=ThisWorkbook.Name
Workbooks.Open varPath & "/" & "pasta1.xls"
Workbooks.SaveAs varPath & "/" & "pasta1.xls"
End Sub
Propriedade Saved
Indica se a pasta de trabalho j est salva ou no. Se esta propriedade retornar
True, porque a pasta j foi salva.
Se voc quiser fechar ThisWorkbook sem salv-la:
ThisWorkbook.Saved = True ThisWorkbook.Close
Propriedade HasPassword
Verifica se a pasta de trabalho possui uma senha de acesso. Em caso positivo, seu retorno
True.
Vejamos agora alguns MTODOS deste objeto Workbook:
Mtodo Activate
Este mtodo torna uma pasta de trabalho ativa. Por exemplo,
Workbooks(1).Activate
Ou
ThisWorkbook.Activate Mtodo
AddToFavorites

Adiciona um atalho para a pasta de trabalho no menu Favoritos do Windows.


ThisWorkbook.AddToFavorites
Mtodo Close
Este mtodo fecha a pasta de trabalho desejada. O mtodo Close tem alguns
parmetros que, se omitidos, vo garantir que o funcionamento da ao seja padro
Windows. O mtodo vai verificar se a propriedade Saved do objeto Workbook True.
Se for, fechar a pasta; caso contrrio, perguntar ao usurio se deseja salvar a pasta de
trabalho.
Workbooks(1).Close
Para fechar a pasta ativa, basta:
ThisWorkbook.Close
Mtodos Close e Saved atuando juntos
Como vimos acima see voc quiser fechar a pasta ativa voc escreve:
ActiveWorkbook.Close
Se voc quiser fechar a pasta ativa sem salv-la:
Lio #03 Procedimentos (Porcedures) VBA para Pastas (Workbooks) 122

ActiveWorkbook.Saved = True
ActiveWorkbook.Close
Se voc no quiser dificultar o cdigo com o nome do arquivo, voc pode usar
os endereos de uma clula na qual voc entrou com o nome do arquivo ou uma
varivel na qual voc armazenou o nome do arquivo.
Workbooks(Range("A1").Value).Close Workbooks(varFileName).Close
Note a ausncia de aspas duplas nas ltimas duas sentenas. Mtodo
PrintOut

Imprime toda a pasta de trabalho desejada, ou parte dela, se for especificado.


Sua sintaxe:
Workbooks(1).PrintOut(From, To, Copies, Preview,
ActivePrinter, PrintToFile, Collate)
Sero impressas as pginas que estiverem no intervalo de From at To, com o
nmero total de cpias Copies. Se Preview for configurado para True, voc obter o
recurso de visualizao antes da impresso. ActivePrinter designa o nome da impressora
ativa, enquanto que PrintToFile solicita o nome de um arquivo para ser base da
impresso. Collate marcado como True intercala mltiplas cpias. Mtodo Save
Este mtodo salva quaisquer mudanas na pasta de trabalho.
Voc geralmente salva a pasta que est ativa, ento aqui est o cdigo:
ActiveWorkbook.Save
Mas voc tambm pode salvar uma pasta que esteja aberta mas no ativa com:
Workbooks("Pasta1.xls").Save

Se voc no quiser dificultar o cdigo com o nome do arquivo, voc pode usar
os endereos de uma clula na qual voc entrou com o nome do arquivo ou a varivel
na qual voc armazenou o nome do arquivo.
Workbooks(Range("A1").Value).Save Workbooks(varFileName).Save
Note a ausncia das aspas duplas nas ltimas duas sentenas.
SaveAs
Quando voc quiser salvar a pasta ativa sob um outro nome ou num outro
diretrio, voc usar o seguinte cdigo:
ActiveWorkbook.SaveAs "talqual.xls" or
ActiveWorkbook.SaveAs "C:/talqual.xls"
Se voc no quiser dificultar cdigo do nome do arquivo voc pode usar os
endereos de uma clula na qual voc entrou com o nome do arquivo ou a varivel na
qual voc armazenou o nome do arquivo.
Voc tambm pode aplicar o mtodo "saveAs" numa pasta que est aberta mas
no ativa:
Workbooks("Pasta1.xls").SaveAs "C:/talqual.xls"
Lies de VBA do Excel 123

Se voc quiser que o usurio escolha um diretrio e crie um nome do arquivo na


janela de dilogo regular "SaveAs" voc escreve este cdigo:
Application.Dialogs(xlDialogSaveAs).Show
Abrindo Outras Pastas (Workbooks) e Arquivos
NOTA IMPORTANTE: Existem duas maneiras para abrir manualmente a pasta. Voc
clica no seu nome no Windows Explorer ou voc abre o Excel e ento na barra de menu
"Arquivo/Abrir" voc a encontra e abre a pasta. Se voc abrir o Excel e ento com o item
de menu "Arquivo/Abrir" voc seleciona a pasta, as funcionalidades "Abrir", "Salvar" e
"Salvar como" todas apontam para o diretrio na qual reside a pasta que voc acabou de
abrir. Mas se voc abre uma pasta do Windows Explorer as funcionalidades "Abrir" e
"Salvar" apontam amabas para o diretrio na qual reside a pasta que voc acabou de abrir.
MAS, mas a funcionalidade "Salvar como" aponta para o diretrio default (usualmente
"Meus Documentos"). Lembre-se desta realidade quando voc iniciar "abertura",
"salvamento" ou "salvando como" de pastas e outros arquivos nos seus procedimentos
VBA.
Abrindo Workbooks
Para abrir um outro arquivo (pasta) Excel com um procedimento VBA voc
simplesmente escreve (note que "Workbooks" plural):
Workbooks.Open "talqual.xls"
Voc no precisa especificar um diretrio (path) se a segunda pasta reside no
mesmo diretrio que "ThisWorkbook"
Voc poder no querer dificultar o cdigo com o nome do arquivo (de modo que
se ele mudar voc no tem que modificar o cdigo). Entre com o nome do arquivo na
clula "A1" da plan1 por exemplo e escreva isto:
Workbooks.Open Sheets("plan1").Range("A1").Value
O modo que eu prefiro fazer armazenar o nome do arquivo numa varivel do
tipo string como isto:
Sub proTeste()
Dim varNomeArquivo as String
varNomeArquivo=Sheets("plan1").Range("A1").Value
Workbooks.Open varFileName
End Sub
Se voc quiser que o usurio escolha um arquivo da janela de dilogo regular
"Abrir" voc escreve este cdigo:
Application.Dialogs(xlDialogOpen).Show
Se voc quiser especificar o diretrio escreva:
Workbooks.Open "C:\talqual.xls"
note que voc usa a linha inclinada \ e no a linha inclinada /.
Lio #03 Procedimentos (Porcedures) VBA para Pastas (Workbooks) 124

Quando voc somente entrar com o path e o nome do arquivo numa clula, voc
pode escrever:
Workbooks.Open Sheets("plan1").Range("A1").Value
Voc tambm pode escrever o path numa clula e o nome do arquivo numa outra
clula:
Workbooks.Open Sheets("plan1").Range("A1").Value &
Sheets("plan1").Range("A2").Value
Voc tambm pode trabalhar com 2 variveis para o path e o nome do arquivo
como mostrado acima:
Workbooks.Open varPath & varNomeArquivo
Abrindo Outros Arquivos
Quando eu preciso abrir um TXT, CSV ou qualquer outro tipo de arquivo,
geralmente eu uso o gravador de macro para faz-lo e obter algo como este:
Workbooks.OpenText Filename:= _
"C:\Pasta1.txt", Origin:=xlMSDOS, _
StartRow:=1, DataType:=xlDelimited,
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False,
Comma:=False, _
Space:=True, Other:=False, FieldInfo:=Array(1, 1),
TrailingMinusNumbers _
:=True
Se eu no quiser que o path e o nome do arquivo seja difcil de codificar, eu uso
a mesma abordagem como mostrada acima para Workbooks.Open usando endereos ou
variveis.
Eu ento deleto o TrailingMinusNumbers:=True porque certas verses antigas do
Excel no entendem este argumento.
Movendo-se pelas Workbooks
Quando duas pastas esto abertas e voc quiser mover de uma para a outra voc
usar ThisWorkbook.Activate e Windows("OutraPasta.xls").Activate
Quando eu trabalho com duas pasta geralmente declaro uma varivel na qual eu
armazeno o nome da segunda pasta e movo de uma para outra com
ThisWorkbook.Activate e Windows(varThatWorkbook).Activate. Aqui est
um exemplo:
Sub proTest()
Dim varThatWorkbook as String
Workbooks.Open "pasta1.xls"
varThatWorkbook=ActiveWorkbook.Name
' e da eu movo de uma para outra at eu fechar a outra
pasta
ThisWorkbook.Activate
Windows(varThatWorkbook).Activate
Lies de VBA do Excel 125

Windows(varThatWorkbook).Close
End Sub

EXEMPLO
No exemplo que segue, vou dar uma amostra de coisas simples que podemos fazer
com o objeto Workbook. Esse um procedimento que faz uma anlise de alguns detalhes
da pasta de trabalho ativa e nos d algumas informaes sobre ela e suas planilhas.
Public Sub Analise ( )

Dim Wb As Workbook
Dim Ws As Worksheet
Dim Quantidade As Byte
Dim Plan() As String
Dim Nome, Mensagem As String

Set Wb = ActiveWorkbook
Nome = Wb.Name
Quantidade = Wb.Sheets.Count
ReDim Plan(1 To Quantidade)
For i = 1 To Quantidade
Plan(i) = Wb.Sheets(i).Name
Next i

Mensagem = Essa pasta de trabalho se chama & Nome &


Chr(13)
Mensagem = Mensagem & Nela h & Quantidade &
planilhas& Chr(13)
Mensagem = Mensagem & Seus nomes:
For i = 1 To Quantidade
Mensagem = Mensagem & Chr(13) & Plan(i)
Next i
MsgBox Mensagem, vbExclamation, Anlise
End Sub
Vejamos agora alguns EVENTOS do objeto Workbook. Lembrando que um
evento algo que acontece (causa) com um determinado objeto e que dispara um mtodo
(efeito), ou seja uma ao neste objeto. claro, portanto, que de acordo com o evento que
ocorrer ser executado um mtodo (que no fundo um bloco de cdigos ou procedimento)
apropriado.
O objeto Workbook tem uma srie de eventos (em termos de cdigo, uma Sub)
que podem ser aplicados a ele.
Para acessar os eventos de um Workbook dentro de um ambiente VBA, d um
clique duplo em EstaPasta_de_Trabalho, que est no seu Projeto na Janela VBAProject.
Com isso vai aparecer uma janela de cdigo parecida com a do mdulo. Clicando na
caixa de combinao (combobox) situada no canto superior esquerdo da janela (na qual
Lio #03 Procedimentos (Porcedures) VBA para Pastas (Workbooks) 126

Caixa de Eventos
Clicando no objeto Workbook, temos: (Procedimentos)

est aparecendo a opo Geral, tambm chamada de caixa dos objetos), poderemos
encontrar o objeto Workbook .

Abrindo a caixa de eventos pode-se ver o nome de todos os eventos que o objeto
Workbook pode sofrer.
Olhemos alguns mais usados para descobrir o que podem fazer.
Evento Activate
Ocorre sempre que a pasta de trabalho se torna ativa. Isso pode ocorrer de duas
maneiras: aps a pasta de trabalho ser aberta ou aps alternarmos a pasta de trabalho
com outra pasta atravs do menu Janela, ou da barra de tarefas.
Para testar, inclua o seguinte cdigo no evento Activate, da pasta de trabalho, e
tente alternar a janela ou reabrir o arquivo.
Private Sub Workbook_Activate( )
Lies de VBA do Excel 127

Dim Nome As String


Nome = ThisWorkbook.Name
MsgBox A pasta de trabalho & Nome & _
acaba de tornar-se ativa
End Sub
Evento BeforeClose
Ocorre antes que a pasta de trabalho seja fechada. O evento BeforeClose possui
um argumento: Cancel As Boolean. Este argumento serve para cancelarmos o evento
caso achemos necessrio. Para fazermos isso, simplesmente dizemos que Cancel =
True.
Para testarmos, podemos elaborar a nossa prpria mensagem de sada da pasta
de trabalho. Na pasta de trabalho, crie o cdigo que segue e salve a pasta com um nome
qualquer. Feche-a e veja a mensagem. Em seguida, reabra o arquivo, faa algumas
alteraes de texto e torne a fechar. Isso pode ser bem interessante.
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim WS As Workbook
Dim Resposta As vbMsgBoxResult

Set WS = ThisWorkbook
If WS.Saved = False Then
WS.Saved = True
Resposta = MsgBox(Gostaria de salvar as alteraes& _
nesta pasta de trabalho?, vbYesNoCancel Or _ vbQuestion,
Salvar Personalizado)
If Resposta = vbYes Then
WS.Save
MsgBox Tchau, vbExclamation
ElseIf Resposta = vbCancel Then
End If
Else
MsgBox Tchau, vbExclamation
End If
End Sub
Evento Deactivate
o oposto do Activate. Ocorre sempre que uma folha desativada. Como
exemplo, podemos colocar uma mensagem antes de fechar a pasta de trabalho:
Private Sub Workbook_Deactivate()
MsgBox "A folha est sendo desativada", vbInformation,
"Desativar a folha" End
Sub
Evento NewSheet
Ocorre quando uma nova folha criada ou inserida dentro de uma pasta de trabalho.
Lio #03 Procedimentos (Porcedures) VBA para Pastas (Workbooks) 128

Esse evento tem como argumento uma varivel Sh, do tipo Object, que vai ser
uma referncia para a planilha criada e pode ser utilizada dentro do cdigo como um
elemento Worksheet.
No exemplo que segue, colocamos em uma mensagem o nome da planilha que
est sendo criada, movemos esta para o final da lista de planilhas e solicitamos que o
usurio digite um novo nome.
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim Resposta As String

MsgBox "O nome da nova folha " & Sh.Name


Sh.Move , after:=ThisWorkbook.Worksheets _
(ThisWorkbook.Worksheets.Count)
Resposta = InputBox("Qual o novo nome da folha a ser
criada?")
Sh.Name = Resposta

End Sub
Evento Open
Ocorre quando a pasta de trabalho aberta. Esse o evento padro de
Workbook, ou seja, quando selecionamos o objeto em sua janela de cdigos, esse
evento que se torna ativo. Seja o exemplo a seguir:
Private Sub Workbook_Open()
MsgBox "A pasta de trabalho " & ThisWorkboob.Name & _
" acaba de ser aberta.", vbExclamation, "Abertura da pasta"
End Sub

Para poder ver o exemplo acima em funcionamento, voc deve salvar a pasta de
trabalho, fech-la e tornar abr-la.
Evento SheetActivate
Ocorre quando qualquer uma das folhas contidas na coleo Worksheets da
pasta de trabalho for ativada. Esse evento tambm possui o argumento Sh, que
representa a planilha que acaba de ser ativada. Mais um exemplo:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

MsgBox A folha & Sh.Name & _


acaba de ser ativada., vbInformation

End Sub

Os outros eventos so relacionados s planilha e sero vistos na prxima lio com o


escopo unitrio da prpria planilha, mas que pode ser expandido facilmente para o escopo
global. Vejamos quais so eles: Evento SheetBeforeDoubleClick
Ocorre no momento em que dado um duplo clique em alguma planilha, antes da ao
padro de duplo clique.
Lies de VBA do Excel 129

Evento SheetBeforeRightClick
Ocorre no momento em que o boto direito do mouse clicado em alguma planilha,
antes da ao padro de clique com o boto direito. Evento Sheet.calculate
Ocorre aps qualquer uma das planilhas ser recalculada ou qualquer mudana de dados
ser feita em algum grfico.
Evento Sheet.change
D-se quando executado algum tipo de alterao em qualquer clula das planilhas.
Evento SheetSelectionChange
Ocorre quando muda a seleo de clulas em qualquer planilha.
130

Fase #2: Cdigo VBA do Excel (Macros)

Lio 4: Cdigo VBA do Excel para Planilha (WorkSheet)


objeto WorkSheet representa uma planilha especificada da coleo

O
WorkSheets.
Por alguma razo obscura quando voc clicar num nome de folha na janela
VBAProject do Visual Basic Editor (VBE) ela tem duas propriedades
chamadas Name. Uma entre parnteses e outra no. Uma planilha tem dois nomes, aquele
um que aparece na sua guia no Excel (vamos chamar este de propriedade "caption") e
aquele um que tem como objeto VBA na janela VBAProject do Visual Basic Editor
(VBE) (por default: Plan1, Plan2....). Assim voc pode ativar Plan1 "cujo caption
"Balano"" com ambas declaraes:
Sheets("Balano").Select
Worksheets("Balano").Select
no esquecer os parnteses e as aspas duplas ou
Plan1.Select
Eu prefiro o segundo mtodo por 2 razes. Primeiro h menos para teclar nele e
em segundo lugar, se voc, ou seu usurio, sempre mudar o caption da folha, no h
necessidade para rever e corrigir seu cdigo de acordo. A nica desvantagem que o
cdigo VBA no claro e fcil para ler (O que "Plan1"?). por isto que eu renomeio
as folhas no Visual Basic Editor (eu seleciono a folha na Janela Project e modifico o seu
nome (aquele um com parnteses) na Janela Propriedade). No exemplo abaixo o nome
da folha (quando objeto VBA) "folBalanco" quando para o caption, realmente eu no
tomo cuidado:
folBalanco.Select

Propriedades da Worksheet

Quando a folha for selecionada na janela VBAProject voc pode ver 11


propriedades da planilha na Janela de propriedades do VBE, propriedades para as quais
voc pode definir um valor default para comear com ele e que voc pode modificar pelo
procedimento VBA sempre que voc quiser.
Existem 3 propriedades que voc usar freqentemente: a Name (nome dentro de
parnteses), a Name (sem parnteses) que de fato o caption aparecendo na guia da folha
no Excel e a propriedade visible.

Propriedades (Name)

Como explicado acima voc pode mudar a (Name) se voc estiver desenvolvendo
uma pasta para outros que possam modific-la no Excel. Voc no pode mudar o (Name)
de uma folha programaticamente.
Lies de VBA do Excel 131

Deve-se tomar cuidado de no se usarem caracteres especiais tais como: :, /,


?e *.
Para mudar o caption voc pode faz-lo na janela propriedade do VBE, ou no
Excel, clicando com o boto direito do mouse na guia e da selecionando "Renomear".
Programaticamente voc pode mudar o caption de uma folha com o seguinte cdigo:
Sheets("Plan1").Name= "Balano"
Propriedades Visible
A propriedade "Visible" controla a visibilidade de uma planilha e pode tomar 3
valores diferentes. Os primeiros dois so True ou False significando que uma certa folha
est ou no est visvel que ela est oculta ou no.
Sheets("Plan1").Visible= True
Sheets("Plan1").Visible= False
Lembre-se que frmulas em clulas so calculadas mesmo se a folha estiver oculta
mas que antes voc pode fazer algo programaticamente na folha voc ocult-la:
Sheets("Plan1").Visible= True
Sheets("Plan1").Select Range("A1").Value=6
Sheets("Plan1").Visible= False
O terceiro valor que a propriedade "Visible" pode tomar muito interessante. Uma
folha pode ser very hidden "Sheets("Plan1").Visible= xlVeryHidden".
Neste estado no somente a folha est oculta mas voc no pode ver seu nome quando no
Excel voc for para "Formatar/Planilha/Reexibir". O valor xlVeryHidden pode somente
ser variado programaticamente. O que significa que somente usurios que tenham acesso
ao cdigo VBA podem exibir esta folha. Se seu cdigo estiver protegido por um
password somente usurios com o password pode acessar o cdigo e modificar o valor
"xlVeryHidden". Voc pode usar este valor da propriedade "Visible" para ocultar
informao confidencial como salrios e preos ou ocultar parmetros que voc no quer
que sejam modificados pelo usurio.
Lembre-se que frmulas nas clulas so calculadas mesmo se a folha est very
hidden mas que antes voc pode fazer qualquer coisa programaticamente na folha voc
deve reexib-la:
Sheets("Plan1").Visible= True
Sheets("Plan1").Select
Range("A1").Value=6
Sheets("Plan1").Visible= xlVeryHidden
Lembre-que frmulas nas outras folhas referindo-se s clulas de uma folha
hidden ou very hidden funciona mesmo se a folha estiver hidden ou very hidden.
Se voc quiser ocultar muitas folhas ao mesmo tempo voc usar o seguinte
cdigo:
Sheets(Array("Plan1", "Plan2")).Select
Sheets("Plan1").Activate
ActiveWindow.SelectedSheets.Visible = False
Lio #04 Cdigo VBA do Excel para Planilha (Worksheet) 132

Os valores xlSheetHidden e xlSheetVisible permitem, respectivamente, ocultar ou


exib-la novamente.
Propriedades ScrollArea
Essa propriedade limita a rea de rolagem e atuao de uma planilha. Por exemplo:
ActiveSheet.ScrollArea = A1:D20
Permite-nos trabalhar apenas no intervalo delimitado.
Propriedades CodeName
Retorna o nome de cdigo de uma planilha, que substitui a declarao
Worksheets(index). Podemos usar: Plan1.Cells(1,1).Value = 10
Ao invs de :
Worksheets(1).Cells(1,1).Value = 10
Vejamos agora alguns MTODOS do objeto Worksheet:

Mtodo Deletar
Voc poder querer deletar folhas. Aqui est o cdigo para fazer isto:
Sheets("Balano").Delete
Ou
Worksheets(worksheets.count).Delete
Mtodo Add
Voc poder tambm querer adicionar uma folha. Se voc usar o seguinte cdigo
o VBA adicionar uma nova folha antes da planilha ativa.
Sheets.Add
Se voc quiser ser mais preciso como para onde e quantas voc usar em cada um
dos seguintes procedimentos:
Inserindo uma folha aps a folha cujo caption "Balano" e cujo nome shBalance:
Sub proTeste()
Sheets.Add before:=Sheets("Balano")
End Sub
Sub proTeste()
Sheets.Add before:=folBalanco End
Sub
Inserindo trs folhas aps a folha cujo caption "Balano":
Sub proTeste()
Sheets.Add after:=Sheets("Balano"), Count:=3 End
Sub
Lies de VBA do Excel 133

Inserindo uma folha no comeo da pasta. Note a ausncia de aspas duplas quando usar a
posio (rank) da folha:
Sub proTest()
Sheets.Add after:=Sheets(1)
End Sub
Finalmente se voc quiser adicionar uma nova folha no final da pasta voc precisa
contar as folhas com Sheets.Count e usar este valor quando a posio da folha aps a
qual voc quiser adicionar a nova folha:
Sub proTeste()
Sheets.Add After:=Sheets(Sheets.Count)
End Sub
Mtodo Select
Este mtodo seleciona uma planilha. A vantagem deste mtodo sobre o Activate
que ele serve para selecionar vrias planilhas ao mesmo tempo (poderia ser com o
propsito de exclu-las).
Mtodo Copy
Serve para criar uma cpia fiel de uma determinada planilha, em uma posio
especfica na coleo Worksheets. Por exemplo para criar uma cpia fiel da planilha
ativa como a ltima da coleo Worksheets:
Active.Copy After:=Worksheets(Worksheets.count)
Algumas vezes voc quer fornecer uma nica planilha de uma pasta para algum
mas voc no quer que todas as frmulas vo juntas. Aqui est o cdigo para copiar
uma folha de uma pasta numa nova pasta, trocar as frmulas pelos valores e salve a
nova pasta:
Sheets("Plan3").Select
Sheets("Plan3").Copy
Clulas.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
ActiveWorkbook.SaveAs "novaPasta.xls"
Se voc quiser fazer a mesma coisa para muitas folhas, voc repete o procedimento ou
escreve:
Sheets(Array("Plan1", " Plan2")).Select
Sheets("Copia2").Activate
Sheets(Array("Plan1", " Plan2")).Copy
Sheets("Plan1").Select
Clulas.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Lio #04 Cdigo VBA do Excel para Planilha (Worksheet) 134

Sheets("Plan2").Select
Clulas.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
ActiveWorkbook.SaveAs "novaPasta.xls"
Veja a lio sobre pastas para gerenciar o diretrio (path) quando usar o mtodo
"SaveAs".
ActiveSheet
A ActiveSheet a planilha que foi selecionada por ltimo. Assim voc pode escrever:
ActiveSheet.Visible=True
ActiveSheet.Copy
Lembre-se que quando voc copiou uma clula ou um grupo de clulas ou qualquer outro
objeto de uma folha voc SEMPRE cola-o na ActiveSheet: ActiveSheet.Paste
a menos que voc esteja fazendo um PasteSpecial no qual caso o objeto "Selection":
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Se voc quiser verificar so os autofilters esto ligados para remov-los voc
precisa usar o objeto ActiveSheet tambm como no seguinte procedimento onde eu marco
os autofilters para ligados para remov-los ou sair do procedimento:
Range("A2").Select
If ActiveSheet.AutoFilterMode = True Then
Selection.AutoFilter
Else
Exit Sub
End If
Voc tambm pode do alguma coisa em cada uma das folhas numa pasta com o
seguinte cdigo. Neste exemplo eu defino o valor da clula A1 a 22 em cada planilha.
Note que eu primeiro declaro uma varivel do tipo Variant Dim varSheet As Variant
e ento o procedimento pode rodar.
Sub proTest()
Dim varSheet As Variant
For Each varSheet In Worksheets
Range("A1").Value = 22
Next
End Sub
Vejamos agora alguns EVENTOS do objeto Worksheet. A maioria dos eventos
de um Workbook, como foi visto, afetam globalmente uma aplicao. Os eventos
relacionados a um objeto Worksheet afetam apenas a planilha onde o evento ocorre.
Evento Activate
Lies de VBA do Excel 135

Ocorre quando uma planilha ativada. Por exemplo:


Private Sub Worksheet_Activate( )
MsgBox A planilha & Me.Name & _
acaba de ser ativada.,vbExclamation
End Sub

Observe o uso da clusula Me. Ela representa o objeto que est em anlise, nesdse caso,
a planilha que sofre o evento. Atravs da clusula Me, temos acesso a todas as
propriedades e mtodos da planilha. Evento BeforeDoubleClick
Acontece quando h um duplo clique na planilha, antes que a ao padro seja executada.
Esse evento possui dois argumentos: O argumento Cancel, j estudado em outros
eventos, que proporciona a possibilidade de cancel-lo. O outro parmetro Target, do
tipo Range. Atravs desse argumento, podemos saber qual a clula recebeu o duplo clique
e dar os devidos tratamentos ao evento. Vejamos um exemplo:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range,
Cancel As Boolean)
Dim Resposta As Byte
MsgBox "A clula que recebeu o duplo clique " & Target.Address
Resposta = InputBox("Digite o nmero da cor para pintar a
clula:")
Target.Interior.ColorIndex = Resposta End
Sub
No exemplo anterior, trocamos a cor da clula que sofreu o evento de duplo clique e,
atravs de cancel = true, evitamos que a ao padro ocorra, a qual seria colocar a clula
em modo de edio. Evento BeforeRightClick
Esse evento ocorre quando h um clique com o boto direito do mouse na planilha. Assim
como o evento BeforeDoubleClick, o BeforeRightClick tem os dois argumentos, Target
e Cancel, usados para detectar a clula clicada e cancelar o evento, respectivamente.
Vamos fazer um exemplo que troca o padro de preenchimento de uma clula que
recebe o clique com o boto direito do mouse, de acordo com a vontade do usurio.
Na figura ao lado vemos todos os valores possveis para esses padres
Nesta Sub apresentamos um detalhe interessante, o uso de On Error, que faz um
tratamento caso algum erro ocorra. Em resposta ao erro, On Error faz um desvio da
aplicao para a rotina Trat, que evita o erro e cancela o evento. Evento Calculate
Ocorre toda vez que um clculo executado em uma planilha, alterando valores. Por
exemplo, quando montamos uma frmula e esta executa um clculo, alteramos os valores
das clulas que so referncias para frmulas (a planilha no est em mdulo de clculo
automtico) e pressionamos F9, fazendo o reclculo da planilha, entre outros. A seguir,
temos um exemplo do uso do evento Calculate. Antes de implementar o cdigo, crie a
planilha que segue. Na coluna D, existe uma frmula que calcula os valores de entrada,
menos os valores de sada. Na clula D14, existe uma frmula de soma das clulas que
esto acima dela, perfazendo o saldo anual.
Lio #04 Cdigo VBA do Excel para Planilha (Worksheet) 136

Private Sub Worksheet_Calculate()

Dim Valor As Integer

Valor = Me.Range("d14").Value
If Valor < 0 Then
MsgBox "Seu balano anual est negativo", vbCritical
Else
MsgBox "Seu balano anual est positivo", vbInformation
End If

End Sub
Evento Activate
Este evento ocorre quando uma das clulas da planilha teve o seu contedo alterado pelo
usurio ou por um agente externo. Seja o exemplo:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Trat

MsgBox "A clula que teve o seu contedo alterado foi " & _
Target.Address, vbInformation
MsgBox "O novo valor de " & Target.Address & " " & _
Target.Value, vbInformation
Exit Sub

Trat:
MsgBox "Voc deve ter alterado mais de uma clula ao" & _
" mesmo tempo", vbCritical

End Sub
Perceba que, se voc selecionar um conjunto de clulas e apagar o seu contedo,
Target.Value retorna um erro, pois s funciona dessa forma quando temos apenas uma
Lies de VBA do Excel 137

clula no Range selecionado. Assim, somos desviados para a rotina de tratamento de


erro, que informa o que aconteceu.

Evento Activate
o evento oposto ao evento Activate. acionado quando desativamos a planilha.
Evento SelectionChange
Este evento o evento padro de uma Worksheet. Ele ocorre toda vez que um Range de
clulas dentro de uma planilha selecionado. Atravs do parmetro de retorno Target,
temos acesso a todas as clulas selecionadas no intervalo e podemos dar o tratamento que
desejamos. Seja o exemplo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "O Range de clulas selecionado " & Target.Address
If Target.Count = 1 Then
MsgBox "Nesse Range existe 1 clula"
Else
MsgBox "Nesse Range existem " & Target.Count & " clulas"
End If

End Sub
Esses so os sete eventos da coleo Worksheets, que so os mais usados em uma pasta
de trabalho. Lembremos que podemos estend-los ao objeto Workbook de forma global,
pois tal objeto possui os mesmos eventos detectados para qualquer planilha da aplicao.
138

Fase #2: Cdigo VBA do Excel (Macros)

Lio 5: Cdigo VBA do Excel para mover-se entre as Clulas e Ranges


o Excel o usurio trabalha nas planilhas e precisa conhecer como fazer para ir

N de uma clula para outra, para uma linha, para uma coluna, como entrar com
valores e frmulas, para copiar/colar etc....
O objeto Range quem faz o trabalho pesado dentro do Excel. Esse objeto
representa uma elula, at todas as clulas de uma planilha; por isso, to genrico e
funcional.
Range, Select, Selection, Value
Quando voc quiser entrar com um valor numrico numa clula voc escrever:
Range("A1").Select
Selection.Value = 32
Note que voc no precisa selecionar uma clula para entrar com um valor nela,
de qualquer lugar na folha voc pode escrever:
Range("A1").Value = 32
Voc pode mesmo mudar o valor da clula ou uma outra folha com:
Sheets("AssimEassim").Range("A1").Value = 32

Voc tambm pode entrar com o mesmo valor em muitas clulas, isto , num
intervalo de clulas, com:
Range("A1:B32").Value = 32
Se voc quiser entrar com um texto numa clula voc precisa usar as aspas duplas
como:
Range("A1").Value = "Bertolo"
Se voc quiser entrar com um texto dentro de aspas duplas numa clula voc
precisa de uma tripla de aspas duplas como:
Range("A1").Value = """Bertolo"""

Uma interseco de intervalos dada assim: Range(B1:D4


C2:E6)

Uma unio de intervalos dada assim:


Range(B1:D4, C2:E6)
Pode tambm ser representado por um conjunto de linhas ou colunas, assim:
Range(Columns(1), Columns(3)) Range,
Formula, Select, Selection

Quando voc quiser entrar com uma frmula numa clula voc escrever:
Lies de VBA do Excel 139

Range("A1").Select
Selection.Formula = "=C8+C9"
Note os dois sinais de igual (=) incluindo aquele um dentro das aspas duplas como se
voc fosse entr-lo manualmente. Novamente voc no precisa selecionar a clula para
entrar com uma frmula nela, de qualquer lugar na folha voc pode escrever:
Range("A1").Formula = "=C8+C9"

Se voc escrever o seguinte:

Range("A1:A8").Formula = "=C8+C9"
A frmula em A1 ser =C8+C9, a frmula em A2 ser =C9+C10 e assim por diante. Se
voc quiser ter a frmula exata =C8+C9 em todas as clulas, voc precisa escrever:
Range("A1:A8").Formula = "=$C$8+$C$9"
Activecell
A Activecell uma clula muito importante. Ela a clula selecionada quando somente
uma clula est selecionada mas ela a clula do canto superior esquerdo de um range
que est selecionado. Por exemplo, se voc selecionar um range como este:
Range("A8:G8").Select
A Activecell A8. Assim se voc escrever:
Activecell.Select
clula A8 ser selecionada. Mas se voc selecionar o range de G8 a A8:
Range("G8:A8:).Select
Clula G8 torna-se a Activecell.
Vejamos agora as PROPRIEDADES deste objeto Range: Propriedade
Cells

Representa todas as clulas de dentro do Range. Atravs dela, podemos obter


informaes especficas a respeito de cada clula ou do conjunto como um todo.
Propriedades Column e Row
Indicam a coluna e a linha, respectivamente, que formam a base de um Range, ou
seja, relativas clula do canto superior esquerdo.
Vamos fazer um teste colocando o cdigo abaixo no evento SelectionChange de uma
planilha:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "A clula base do Range est na coluna " & _
Target.Column & " e na linha " & Target.Row
End Sub
Propriedades Columns e Rows
Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 140
Veja o s no final. A est a diferena da propriedade anterior.
Estas duas propriedades agem como colees, que armazenam as informaes de
colunas e linhas de um Range. Vejamos um exemplo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "Neste Range existem " & Target.Columns.Count & "
coluna(s) " _
& Chr(13) & "Neste Range existem " & Target.Rows.Count & "
linha(s) " End Sub
Propriedade Address
Esta propriedade retorna o endereo de clulas do objeto Range em questo.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

MsgBox Target.Address(RowAbsolute:=False, _
ColumnAbsolute:=False)

End Sub
Nesse exemplo, poderamos omitir os parmetros RowAbsolute e
ColumnAbsolute; o resultado seria o mesmo endereo, masmem referncia absoluta
(com os smbolos de $, indicando o travamento de linhas e colunas).
Propriedades ColumnWidth e RowHeight
Essas propriedades medem e definem a largura de uma coluna e altura de uma
linha, respectivamente. Quando vrias colunas ou linhas esto selecionadas e tm
tamanhos diferentes, essas propriedades retornam o valor Null.
A largura de uma coluna medida em quantidade de caracterees 0 oara o tipo de fonte,
enquanto que a altura de uma linha medida em pontos. Propriedade Formula
Esta propriedade retorna ou determina qual a frmula contida em uma clula do
Range.
Propriedade HasFormula
Retorna True, se existe uma frmula em uma clula do Range, ou False, caso no exista.
Propriedade HorizontalAlignment
Retorna ou define o alinhamento horizontal das clulas contidas no Range
selecionado. As constantes podem ser: xlHAlignRight Alinhamento direita
xlHAlignLeft Alinhamento esquerda xlHAlignJustify Alinhamento justificado
xlHAlignDistributed Alinhamento distribudo xlHAlignCenter Alinhamento
centralizado xlHAlignGeneral Alinhamento padro xlHAlignFill Preenche todo
o Range horizontalmente com o contedo da clula.
xlHAlignCenterAcrossSelection Alinha horizontalmente por sobre uma seleo.

Propriedade Locked
Trava ou destrava as clulas do Range, sendo equivalente guia Proteo, em
Formatar | Clulas, no item Travada.
Lies de VBA do Excel 141

Propriedade Value
Retorna ou define o valor de uma determinada clula do Range. Exemplo:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Clula As Range, i As Integer
For Each Clula In Target i =
i + 1 Clula.Value = i
Next
End Sub
Aqui cada clula selecionada ser preenchida com o seu index (posio) no
Range.

Vejamos agora os MTODOS deste objeto Range: Mtodo


AddComment

Este mtodo adiciona um texto de comentrio a uma clula do Range.


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim R As Range
Set R = Range(Cells(Target.Row, Target.Column), _
Cells(Target.Row, Target.Column))
R.AddComment "Esta a primeira clula do Range" End
Sub
Mtodo AutoFilter
O mtodo AutoFilter habilita o recurso de autofiltro do Excel nas clulas que
envolvem o Range. Mtodo AutoFit
O mtodo AutoFit ajusta colunas ou linhas para uma melhor disposio do texto dentro
das clulas.
Mtodo BorderAround
o mtodo usado para acrescentar uma borda ao Range especificado. A sua sintaxe :
Range.BorderAround(LineStyle, Weight, ColorIndex, Color)
Onde LineStyle pode ser uma das seguintes constantes:
xlLineStyleNone Sem estilo
xlDouble = = = = = = = = = = = = = = = = = xlDot
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlDash - - - -
----------------------

xlContinuous ________________________
xlDashDot - . - . - . - . - . - . - . - . - . - . - . - . - xlDashDotDot
-..-..-..-..-..-..-..-

xlSlantDashDot O mesmo que xlDashDot, mas entrelaado


Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 142
O parmetro Weight pode ser uma das seguintes constantes:
xlHairLine Intensidade muito fina
xlThin Intensidade fina xlMedium
Intensidade mediana xlThick
Intensidade forte.

ColorIndex e Color so as constantes de cores, onde ColoIndex definida por um valor


do Index da cor da paleta e Color definida como um valor de uma funo RGB.
Uma funo RGB trabalha com trs parmetros, que indicam a quantidade de vermelho,
verde e azul na composio de uma cor, variando de 0 a 255. Um exemplo poderia ser a
cor vermelha: RGB(255,0,0).
Apenas um componente de cor deve ser definido para o mtodo BorderAround. Mtodo
Clear

Limpa todo e qualquer contedo das clulas dentro de um Range. O contedo envolve
valores, formatao e frmulas.
Mtodo Copy
Esse mtodo copia o contedo de um Range para um outro Range de destino ou
para o clipboard. Sua sintaxe:
Range.Copy (Destino) Mtodo
Delete

Exclui as clulas do Range especificado.


Mtodo FillDown, FillLeft, FillRight, FillUp
Copia o contedo da primeira clula do Range para o resto da seleo, na direo
especfica.
Range(A1:A20).FillDown
Preencher da clula A2 at A20 com o contedo de A1.
Mtodo Find

Localiza informaes especficas em um intervalo, e retorna um objeto Range


representando a primeira clula onde essas informaes se encontram. Retorna Nothing
se nenhuma coincidncia for encontrada. No afeta a seleo da clula ativa.

Vejamos a sua sintaxe:

Range.Find(What,After,LookIn,LookAt,SearchOrder, _
SearchDirection,MatchCase,MatchByte, SearchFormat)
Lies de VBA do Excel 143

What uma varivel do tipo Variant necessria. Os dados ou valores a serem


buscadoss. Pode ser uma seqncia de caracterees ou qualquer tipo de dados do
Microsoft Excel.

After uma varivel do tipo Variant opcional. A clula depois da qual voc deseja que a
pesquisa comece. Corresponde posio da clula ativa quando uma pesquisa feita a
partir da interface do usurio. Observe que After precisa ser uma nica clula no
intervalo. Lembre-se de que a pesquisa comea depois dessa clula; a clula
especificada no pesquisada at que o mtodo d a volta e chegue a ela. Se voc no
especificar esse argumento, a pesquisa comear aps a clula do canto superior
esquerdo do intervalo.

LookIn uma varivel do tipo Variant opcional. O tipo de informao. Pode ser uma
das seguintes constantes de busca: xlValues (valores), xlComments (comentrios) ou
xlFormulas (frmulas)

LookAt uma varivel do tipo Variant opcional. Determina se o valor deve bater com
todo o contedo da clula, ou parte dele simplesmente. Pode ser uma das seguintes
constantes XlLookAt: xlWhole (completo) ou xlPart (parte).

SearchOrder uma varivel do tipo Variant opcional. Define se a busca deve seguir em
colunas ou linhas. Pode ser uma das seguintes constantes XlSearchOrder: xlByRows ou
xlByColumns.

SearchDirection opcional. Indica a direo da pesquisa. XlSearchDirection pode ser


uma das seguintes constantes:
xlNext padro xlPrevious

MatchCase uma varivel do tipo Variant opcional. Deve ser definida como True para
fazer a pesquisa sensitiva, isto , fazer distino entre maisculas e minsculas. O valor
padro False.

MatchByte uma varivel do tipo Variant opcional. Usado somente se voc tiver
selecionado ou instalado suporte de linguagem de byte duplo, padro Excel para o
Oriente. True para que os caracterees de dois bytes coincidam somente com caracterees
de dois bytes. False para que os caracterees de dois bytes coincidam com seus
equivalentes de um byte.

SearchFormat Variant opcional. O formato da pesquisa.


Comentrios

As definies de LookIn, LookAt, SearchOrder e MatchByte so salvas toda vez que voc
usa esse mtodo. Se voc no especificar valores para esses argumentos na prxima vez
que voc chamar o mtodo, os valores salvos sero usados. A definio desses
argumentos altera as definies da caixa de dilogo Localizar, e a alterao das
Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 144
definies da caixa de dilogo Localizar faz com que os valores salvos, usados quando
voc omite os argumentos, sejam alterados. Para evitar problemas, defina explicitamente
esses argumentos toda vez que voc usar esse mtodo.

Para localizar clulas coincidentes com padres mais complicados, use uma
instruo For Each...Next com o operador Like. Por exemplo, o cdigo a seguir pesquisa
todas as clulas do intervalo A1:C5 que usam uma fonte cujo nome comea com as letras
Cour. Quando o Microsoft Excel encontra uma coincidncia, altera a fonte para Times
New Roman.

For Each c In [A1:C5]


If c.Font.Name Like "Cour*" Then
c.Font.Name = "Times New Roman"
End If
Next

Exemplo

Este exemplo localiza todas as clulas do intervalo A1:A500 na planilha um que contm
o valor 2 e o altera para 5.

With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If End
With

Mtodo FindNext e FindPrevious


Esses mtodos prosseguem com a busca iniciada no mtodo Find procura de
novas ocorrncias do critrio dentro do Range.
Exemplo

Este exemplo mostra como o mtodo FindPrevious usado com os mtodos


Find e FindNext. Antes de executar este exemplo, certifique-se de que Plan1 contenha
pelo menos duas ocorrncias da palavra Phoenix na coluna B.

Set fc = Worksheets("Plan1").Columns("B").Find(what:="Phoenix")
MsgBox "A primeira ocorrncia est na clula " & fc.Address
Set fc = Worksheets("Plan1").Columns("B").FindNext(after:=fc)
MsgBox "A prxima ocorrncia est na clula " & fc.Address
Set fc = Worksheets("Plan1").Columns("B").FindPrevious(after:=fc)
MsgBox "A ocorrncia anterior est na clula " & fc.Address
Mtodo Insert
Insere clulas, linhas ou colunas na planilha determinada
Lies de VBA do Excel 145

Mtodo Merge
o recurso de mesclar clulas. Tem a seguinte sintaxe: Range.Merge(Across)

Onde Across deve ser definido como True, caso queiramos mesclar as clulas do Range,
gerando uma clula por linha; e False, caso queiramos que todo o Range vire uma nica
clula. Mtodo Select
Seleciona o Range especificado.
Mtodo Sort

Classifica os dados de um relatrio de tabela dinmica, um intervalo ou a regio


ativa se o intervalo especificado contiver somente uma clula. Sua sintaxe :

expresso.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3,


Header, OrderCustom, MatchCase, Orientation, SortMethod,
DataOption1, DataOption2, DataOption3)

expresso - Necessria. Uma expresso que retorna um dos objetos da lista Aplica-se
a.
Key1 Variant opcional. O primeiro campo de classificao, como texto (um campo de
tabela dinmica ou nome de intervalo) ou um objeto Range ("Dept" ou Cells(1, 1),
por exemplo).
Order1 opcional. A ordem de classificao para o campo ou intervalo especificado em
Key1.

XlSortOrder pode ser uma das seguintes constantes:


xlDescending Classifica Key1 na ordem decrescente. xlAscending
padro Classifica Key1 na ordem crescente.

Key2 Variant opcional. O segundo campo de classificao, como texto (um campo de
tabela dinmica ou nome de intervalo) ou um objeto Range. Se voc omitir este
argumento, no haver um segundo campo de classificao. No pode ser usado ao
classificar relatrios de tabela dinmica.
Type Variant opcional. Especifica os elementos a serem classificados. Use este
argumento somente ao classificar relatrios de tabela dinmica.
XlSortType pode ser uma das seguintes constantes:
xlSortLabels. Classifica o relatrio de tabela dinmica por rtulos. xlSortValues.
Classifica o relatrio de tabela dinmica por valores.
Order2 XlSortOrder opcional. A ordem de classificao para o campo ou intervalo
especificado em Key2. No pode ser usado ao classificar relatrios de tabela dinmica.
Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 146
XlSortOrder pode ser uma das seguintes constantes: xlDescending
Classifica Key2 na ordem decrescente. xlAscending padro
Classifica Key2 na ordem crescente.

Key3 Variant opcional. O terceiro campo de classificao, como texto (um nome de
intervalo) ou um objeto Range. Se voc omitir este argumento, no haver um terceiro
campo de classificao. No pode ser usado ao classificar relatrios de tabela dinmica.
Order3 XlSortOrder opcional. A ordem de classificao para o campo ou intervalo
especificado em Key3. No pode ser usado ao classificar relatrios de tabela dinmica.

XlSortOrder pode ser uma das seguintes constantes: xlDescending


Classifica Key3 na ordem decrescente. xlAscending padro
Classifica Key3 na ordem crescente.
Header XlYesNoGuess opcional. Especifica se a primeira linha contm ou no
cabealhos. No pode ser usado ao classificar relatrios de tabela dinmica.
XlYesNoGuess pode ser uma das seguintes constantes:
xlGuess. Deixa o Microsoft Excel determinar se deve haver um cabealho, e a determinar
onde ele deve estar, se existir um.
xlNo padro. (O intervalo inteiro deve ser classificado). xlYes.
(O intervalo inteiro no deve ser classificado).
OrderCustom Variant opcional. Este argumento um deslocamento de inteiro baseado
em um para a lista de ordens de classificao personalizadas. Se voc omitir
OrderCustom, ser usada uma classificao normal.
MatchCase Variant opcional. True para fazer uma classificao que faz distino
entre maisculas e minsculas; False para fazer uma classificao que no faz distino
entre maisculas e minsculas. No pode ser usado ao classificar relatrios de tabela
dinmica.
Orientation XlLink opcional. A orientao da classificao.

XlSortOrientationpode ser uma das seguintes constantes:


xlSortRows padro. Classifica por linha. xlSortColumns. Classifica
por coluna.
SortMethod XlSortMethod opcional. O tipo de classificao. Algumas dessas
constantes podem no estar disponveis, dependendo do suporte a idioma (portugus do
Brasil, por exemplo) que voc selecionou ou instalou.

XlSortMethod pode ser uma das seguintes constantes:


xlStroke Classificao pela quantidade de pressionamentos de tecla em cada caracteree.

xlPinYin padro. Ordem de classificao do chins fontico para caracterees.

DataOption1 XlSortDataOption opcional. Especifica como classificar texto em tecla


1. No pode ser usado ao classificar relatrios de tabela dinmica.

XlSortDataOption pode ser uma das seguintes constantes:


Lies de VBA do Excel 147

xlSortTextAsNumbers. Trata o texto como dados numricos para a classificao.


xlSortNormal padro. Classifica dados numricos e de texto separadamente.
DataOption2 XlSortDataOption opcional. Especifica como classificar texto em tecla
2. No pode ser usado ao classificar relatrios de tabela dinmica.

XlSortDataOption pode ser uma das seguintes constantes:


xlSortTextAsNumbers. Trata o texto como dados numricos para a classificao.
xlSortNormal padro. Classifica dados numricos e de texto separadamente.
DataOption3 XlSortDataOption opcional. Especifica como classificar texto em tecla
3. No pode ser usado ao classificar relatrios de tabela dinmica.

pode ser uma das seguintes constantes:


XlSortDataOption
xlSortTextAsNumbers. Trata o texto como dados numricos para a classificao.
xlSortNormal padro. Classifica dados numricos e de texto separadamente.
Comentrios

As configuraes para Header, Order1, Order2, Order3, OrderCustom e Orientation so


salvas, na planilha especfica, sempre que voc usa este mtodo. Se voc no especificar
valores para estes argumentos na prxima vez em que chamar o mtodo, sero usados
os valores salvos. Defina esses argumentos explicitamente sempre que for usar o
mtodo Sort , caso escolha no usar os valores salvos.
Seqncias de caracterees de texto que no podem ser convertidas em dados numricos
so classificadas normalmente.
Observao Se no houver argumentos definidos com o mtodo Sort, o Microsoft Excel
classificar a seleo, escolhida para classificao, na ordem crescente.
Exemplo
Este exemplo classifica o intervalo A1:C20 em Plan1, usando a clula A1 como
a primeira chave de classificao e a clula B1 como a segunda chave de classificao.
A classificao feita na ordem crescente por linha, e no h cabealhos. O exemplo
supe que existam dados no intervalo A1:C20.
Sub SortRange1()

Worksheets("Sheet1").Range("A1:C20").Sort _
Key1:=Worksheets("Sheet1").Range("A1"), _
Key2:=Worksheets("Sheet1").Range("B1")

End Sub
Este segundo exemplo classifica a regio que contm a clula A1 (a regio ativa)
em Plan1, classificando pelos dados na primeira coluna e usando automaticamente uma
linha de cabealho, se existir. O exemplo supe que existam dados na regio ativa, que
inclui a clula A1. O mtodo Sort determina a regio ativa automaticamente.
Sub SortRange2()
Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 148
Worksheets("Plan1").Range("A1").Sort _
Key1:=Worksheets("Plan1").Columns("A"), _
Header:=xlGuess

End Sub
Mtodo Offset
O mtodo Offset aquele um que voc usar mais. Ele lhe permite mover para a
direita, para a esquerda, para cima e para baixo. Por exemplo se voc quiser mover 3
clulas para a direita, voc escrever:
Activecell.Offset(0,3).Select
Se voc quiser mover trs clulas para baixo:
Activecell.Offset(3,0).Select
Se voc quiser selecionar uma clula e mais uma outra a trs linhas abaixo desta:
Range(Activecell,activecell.Offset(3,0)).Select
Range("A1",Range("A1").Offset(3,0)).Select
Lies de VBA do Excel 149

A Coleo Borders

A coleo Borders responsvel por determinar as caracteresticas das bordas de


um determinado Range.
Uma coleo de quatro objetos Border representando as quatro bordas de um objeto
Range ou Style.
Usando a coleo Borders
Use a propriedade Borders para retornar a coleo Borders, que contm todas
as quatro bordas. O exemplo seguinte adiciona uma borda dupla clula A1 na planilha
um.
Worksheets(1).Range("A1").Borders.LineStyle = xlDouble

Use Borders(index), onde index identifica a borda, para retornar um nico


objeto Border. O exemplo seguinte define como vermelho a cor da borda inferior das
clulas A1:G1.
Worksheets("Sheet1").Range("A1:G1"). _
Borders(xlEdgeBottom).Color = RGB(255, 0, 0)
Index pode ser uma das seguintes constantes XlBordersIndex: xlDiagonalDown,
xlDiagonalUp, xlEdgeBottom, xlEdgeLeft, xlEdgeRight ou xlEdgeTop,
xlInsideHorizontal ou xlInsideVertical.
Junto com Borders, so passadas as constantes que representam qual borda est
sendo modificada. So elas:
xlDiagonalDown Diagonal de cima para baixo
xlDiagonalUp Diagonal de baixo para cima
xlEdgeLeft Borda esquerda xlEdgeTop
Borda superior xlEdgeBottom Borda inferior
xlEdgeRight Borda direita xlInsideVertical
Linha interna vertical xlInsideHorizontal
Linha interna horizontal.
Exemplos:
With Range(A1:D4).Borders(xlEdgeBottom)
.ColorIndex = 3
.LineStyle = xlDash
.Weight = xlMedium
End With
Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 150
Propriedades Color e ColorIndex
A propriedade Color especifica,em RGB, a cor da borda, enquanto ColorIndex
especifica, em valor inteiro, o index para a paleta de cores. Por exemplo, Color =
RGB(255,0,0) equivale a ColorIndex = 3.
Propriedades LineStyle e Weight
Possuem os mesmos parmetros de LineStyle e Weight do mtodo BorderAround.
O Objeto Font
O objeto Font possui toda a formatao de fonte que podemos fazer na interface
grfica do Excel. Vejamos as principais propriedades:
Bold Propriedade Booleana que define o estilo negrito da fonte.
Color ou ColoIndex Define a cor da fonte nos parmetros anteriormente citados.
Italic Propriedade Booleana que define o estilo itlico da fonte.
Name Define o nome da fonte a ser usada. Size
Define o tamanho da fonte.
O Objeto Interior
O objeto Interior define a formatao visual do fundo de uma clula. Suas
principais propriedades so:
Propriedade Color e ColorIndex
Definem a cor de preenchimento de uma clula.
EXEMPLO Colorindo Clulas Baseado No Seu Valor

A rotina seguinte colorir uma clula numa seleo em vermelho se o valor da clula for
maior do que 5 Sub testeCor( )
Dim celula As Range
For Each celula In Selection
'testar um valor numrico primeiro
If IsNumeric(celula.Value) Then
'testar o valor da clula
If celula.Value > 5 Then
'colorir se for maior do que 5
celula.Interior.ColorIndex = 3
Else
'limpar a cor se no for maior do que 5
celula.Interior.ColorIndex = xlNone
End If
End If
Next
End Sub
Propriedade Pattern
Define um padro para ser aplicado no fundo de uma clula. Existem dezoito
padres que podem ser usados.
Propriedades PatternColor e PatternColorIndex
Lies de VBA do Excel 151

Retorna ou define a cor do padro a ser aplicada no interior da clula como um


ndice na paleta de cores atual, ou como uma das seguintes constantes XlColorIndex:
xlColorIndexAutomatic ou xlColorIndexNone. Long de leitura/gravao. Defina
essa propriedade como xlColorIndexAutomatic para especificar o padro automtico
para clulas ou o estilo de preenchimento automtico para objetos de desenho. Defina
essa propriedade como xlColorIndexNone para especificar que voc no deseja um
padro (isso o mesmo que definir a propriedade Pattern do objeto Interior como
xlPatternNone). Comentrios
A ilustrao seguinte mostra os valores de ndice de cor da paleta de cores padro.

Exemplo
Este exemplo define a cor do padro interior para o retngulo um em Sheet1.
With Worksheets("Sheet1").Rectangles(1).Interior
.Pattern = xlChecker
.PatternColorIndex = 5 End
With

Para testar todos os valores, aqui est uma rotina interessante.


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Trat
Dim Fundo, Padrao, CorPadrao As Integer
Fundo = InputBox("Por favor, digite o valor" & _
" da cor de preenchimento das clulas (0 - 56)")
Target.Interior.ColorIndex = Fundo
Padrao = InputBox("Por favor, digite o padro desejado" & _
" para as clulas (0 - 18)")
Target.Interior.Pattern = Padrao
CorPadrao = InputBox("Por favor, digite o valor da cor" & _
" do padro da clula (0 - 56)")
Target.Interior.PatternColorIndex = CorPadrao
Exit Sub
Trat:
MsgBox "Voc deve ter escolhido algum valor fora " & _
"do Range especificado...", vbCritical End
Sub
Outro Exemplo
Lio #05 Cdigo VBA do Excel para mover-se entre as Clulas e Ranges 152
A macro seguinte somar todas as clulas na seleo que tenha uma cor de fundo(
background) em vermelho.

Sub SomaDeCores()
Dim somaInt As Single
Dim celula As Range
'inicializa a varivel soma variable em zero (no exigido,
mas uma boa prtica somaInt = 0
'verifica cada uma das clulas na seleo que est tambm
no range usado.
'Isto evita ter que verificar se h clula est vazia numa
' coluna inteira ou linha est selecionada. For Each celula
In Intersect(Selection,
ActiveSheet.UsedRange)
'o interior refere-se ao background de uma clula

If celula.Interior.ColorIndex = 3 Then
somaInt = somaInt + celula.Value
End If
Next celula
'mostra os resultados
MsgBox "a soma " & somaInt
End Sub
Mais Um Exemplo Colorindo Clulas Para Destac-las Baseado Num Texto
O que segue mudar a cor de fundo (background) de cada linha que tenha o texto
"conta" na coluna 1.
Sub ColorindoAs()
Dim Ndx As Long
For Ndx = 1 To ActiveSheet.UsedRange.Rows.Count
If LCase(Cells(Ndx, 1).Value) = "conta" Then
Rows(Ndx).Interior.ColorIndex = 3
End If
Next Ndx
End Sub
Como fazer a sua macro esperar uns poucos segundos.
A declarao seguinte:
Application.Wait Now + TimeValue("00:00:05")
esperar por 5 segundos e da rodar a prxima declarao.
153
Fase #2: Cdigo VBA do Excel (Macros)

Lio 6: Cdigo VBA do Excel para Caixas de Mensagens

N o VBA para Excel a caixa de mensagem a principal ferramenta para interagir


com o usurio. Voc pode us-la para informar, alertar-lhe ou pedir-lhe para
escolher um certo path (Sim/No).
O cdigo no VBA para Excel para gerar a seguinte caixa de mensagem bsica :
MsgBox "Sua mensagem aqui"

Quando voc desenvolver um procedimento que leva tempo para rodar, voc
encerra seu cdigo com uma caixa de mensagem bsica dizendo ao usurio que o
procedimento foi executado.
MsgBox "O relatrio est pronto"
Ou
MsgBox "O procedimento foi executado voc deve agora ir para a
folha ""Capa"""
Ou
MsgBox "O procedimento foi executado voc deve agora ir para a
clula ""A1"""
Note que se voc quiser parte da sua mensagem esteja entre aspas voc tem de
dobrar as aspas dentro da mensagem. Quando a usurio clicar num boto na caixa de
mensagem Excel ela dispara um procedimento que far alguma coisa importante como
deletar todos os dados. Sempre iniciar o cdigo com uma caixa de mensagem que pergunte
ao usurio se ele tem certeza que ele quer que o procedimento rode. Neste caso use uma
caixa de mensagem "Sim/No".
Quando trabalhando com uma caixa de mensagem " Sim/No" voc precisar coletar
a resposta dada pelo usurio.
Passo 1: Voc primeiro declara uma varivel para armazenar a resposta "Dim
varResposta as string".

Passo 2: Voc guarda a resposta na varivel com o cdigo:


"varResposta = MsgBox("Voc est certo que voc quer deletar todos
os dados?", vbYesNo, "Advertncia")".
Note os parnteses dentro do qual voc submete os trs argumentos; a mensagem,
o tipo de caixa de mensagem e seu ttulo. Note tambm as aspas envolvendo a mensagem
e o ttulo.
Lio #06 Cdigo VBA do Excel para Caixas de Mensagens 154
Passo 3: Voc trata a resposta com uma declarao "IF" onde se o usurio responder
"No" voc sai do procedimento com "Exit Sub" Aqui est o procedimento inteiro.
Sub proProcedimentoPerigoso() Dim varResposta As String
varResposta = MsgBox("Voc est certo que voc quer deletar
todos os dados?", vbYesNo, "Advertncia")
If varResposta = vbNo Then
Exit Sub
End if
Aqui inicia o procedimento perigoso de deletar os dados
End Sub
Quando voc criar uma caixa de mensagem bsica (primeiro exemplo acima), voc
no precisa usar parnteses. Se voc desenvolver uma caixa de mensagem mais complexa
voc ver que quando voc iniciar escrevendo a linha de cdigo (exemplo acima)
varAnswer = MsgBox(, logo aps os parnteses o Excel mostra-lhe o que esperado como
argumentos:

1- O Prompt no opcional, a mensagem que voc quer que seu usurio leia na caixa
de mensagem e ela deve estar entre aspas.
2- Quando voc entrar com vrgula aps o prompt, o Excel oferece-lhe uma lista
dropdown de todos os tipos de caixa de mensagem que voc pode criar.

Escolha a sua caixa de mensagem e entre com uma vrgula.


3- O terceiro argumento o ttulo da caixa de mensagem que aparecer na faixa azul no
topo da caixa de mensagem. Submeta um ttulo entre aspas.
O quarto e quinto argumentos raramente so usados, eles so opcionais e voc no
precisa entrar com qualquer coisa ento...mas feche os parnteses.
Como voc pode ver, existem muitos tipos de caixas de mensagens. Aquelas que
so mais freqentemente usadas so a vbYesNo, vbOKCancel, vbRetryCancel. Voc
dever tambm querer usar uma caixa de mensagem mais decorativa como a vbQuestion,
a vbInformation, a vbExclamation ou a vbCritical como mostrado abaixo.
Lies de VBA do Excel 155

No existem caixas de mensagem no VBA para Excel que voc possa mostrar ao
usurio enquanto um procedimento roda por um tempo muito longo. Mas h um modo de
contornar isto. Adicione uma planilha chamada "Espera" e insira uma figura, um
wordart ou uma mensagem numa fonte muito grande como "Procedimento rodando" e
oculte a folha.
Passo #1: Primeiro voc torna a folha que voc criou visvel e selecione-a (Linhas 1 e 2).
Passo #2: Voc deve querer mudar o cursor para a ampulheta (Linha 3)
Passo #3: Voc desativa a funcionalidade de atualizao de tela (Linha 4)
Passo #4: Voc escreve o seu longo procedimento (Linha 5 no exemplo)
Passo #5: Voc oculta a folha especial (Linha 6)
Passo #6: Voc traz de volta o cursor default (Linha 7)
Passo #7: Voc re-ativa a funcionalidade atualizao de tela
Adicione este cdigo ao seu longo procedimento. Apenas troque a linha "Aqui est
seu longo procedimento" pelo seu prprio procedimento.:
Sub proProcedimentoLongo()
Sheets("Espera").Visible=True
Sheets("Espera").Select
Application.Cursor = xlWait
Application.ScreenUpdating=False
Aqui est o longo procedimento
Sheets("Espera").Visible=False
Application.Cursor = xlDefault
Application.ScreenUpdating=True
End Sub
Mostrando Caixas de Mensagens
O que segue mostra uma caixa de mensagem que tem apenas um boto OK nela.
Sub MsgExemplo1()
Lio #06 Cdigo VBA do Excel para Caixas de Mensagens 156
MsgBox "Este um exemplo de uma mensagem."
End Sub
O que segue mostra uma caixa de mensagem que mostra os botes OK e
Cancelar, permitindo o usurio fornecer uma resposta:
Sub MsgExemplo2()
Dim iResposta As Integer
iResposta = MsgBox("Selecione OK ou Cancelar", vbOKCancel)
'verifique para ver se o boto cancelar foi selecionado If
iResposta = vbCancel Then
MsgBox "Voc selecionou Cancelar"
End If
If iResposta = vbOK Then
MsgBox "Voc selecionou OK"
End If
End Sub
Este exemplo tambm poderia ter sido escrito de uma maneira muito mais condensada,
onde a seleo do boto Cancelar pra a execuo e a seleo do boto OK permite
continu-la:
Sub MsgExemplo3()
If MsgBox("Selecione OK para Continuar") = vbOKCancel Then
End
'Comandos a serem executados se OK for selecionado End
Sub
O que segue ilustra uma caixa de mensagem que mostra os botes Sim, No e Cancelar.
Se voc quiser somente os botes Sim ou No, ento use vbYesNo em vez de
vbYesNoCancel
Sub MsgExemplo4()
Dim iResposta As Integer
'mostrar uma mensagem e armazenar uma resposta para
'avaliao iResposta = MsgBox("Selecione um
boto", vbYesNoCancel)
'verifique para ver se o boto Cancelar foi selecionado
If iResposta = vbCancel Then
MsgBox "Voc selecionou Cancelar"
End If
'verifique para ver se Sim foi selecionado
If iResposta = vbYes Then
MsgBox "Voc selecionou Sim"
End If
'verifique e veja se No foi selecionado
If iResposta = vbNo Then
MsgBox "Voc selecionou No"
End If
End Sub
Formatando numa Caixa de Mensagem
O que segue ilustra como formatar entradas numa MsgBox:
MsgBox " Equipamento N. " & numEquip & Chr(13) _
& " Descrio - " & Descrio &
Lies de VBA do Excel 157

Chr(13) _
& " Prazo Interno - " & Format(partedaData,"ddd-mm")

onde as variveis numEquip, Descrio, e partedaData j foram definidas.


Acima o Chr(13) a tecla enter, permitindo mostrar a entrada na prxima linha.
Outros valores teis para Chr() so 174 que um smbolo copyright e 34 que uma aspa
dupla.
Usando Aspas Duplas Numa Caixa de Mensagem
O principal uso das aspas duplas no seu cdigo us-lo para delimitar strings de texto. Por
exemplo,
MsgBox "Al Mundo" ou
ActiveCell.Value = "Descrio"

Se voc quiser usar aspas duplas para destacar texto numa caixa de mensagem, ento use
uma das seguintes aproximaes:
MsgBox "O mundo" & Chr(34) & "AOOO" & Chr
(34) & "est em aspas duplas" ou MsgBox "O mundo
""AOOO"" est em aspas duplas"

O segundo exemplo funciona porque as duas aspas duplas numa linha


interpretada como parte da string de texto e, no como delimitao de uma string de texto.
Mais exemplos de uso das caixas de mensagens
Aqui esto alguns exemplos de como se usar a funo MsgBox:
MsgBox "O trabalho est feito !"
' caixa de mensagem com texto e boto OK
MsgBox "O trabalho est feito !", vbInformation
' caixa de mensagem com texto, boto OK e um cone de informao MsgBox
"O trabalho est feito !", vbCritical
' caixa de mensagem com texto, boto OK e um cone de advertncia
MsgBox "O trabalho est feito !", vbInformation, "Meu Ttulo"
' caixa de mensagem com texto, boto OK, cone de informao e um texto
de ttulo personalizado.

Resposta = MsgBox("Voc quer continuar ?", vbYesNo)


' caixa de mensagem com botes YES e NO,
' o resultado um inteiro, as constantes so nomeadas vbYes e vbNo.
Resposta = MsgBox("Voc quer continuar ?", vbYesNo + vbQuestion)
' caixa de mensagem com botes YES e NO e um cone de interrogao
Resposta = MsgBox("Voc quer continuar ?", vbYesNo + vbQuestion, "Meu
Ttulo")
' caixa de mensagem com botes YES e NO,
' cone de interrogao e um texto de ttulo personalizado
Resposta = MsgBox("Voc quer continuar ?", vbYesNo + 256 + vbQuestion,
"Meu Ttulo")
' caixa de mensagem com botes YES e NO, cone de interrogao e um texto
de ttulo personalizado,
' o boto NO o default
Lio #06 Cdigo VBA do Excel para Caixas de Mensagens 158
Resposta = MsgBox("Voc quer continuar ?", vbOKCancel, "Meu Ttulo")
' caixa de mensagem com botes OK- e CANCEL, o resultado um inteiro, '
as constantes so nomeadas vbOK ou vbCancel.

O resultado da funo MsgBox pode ser armazenado numa varivel. A varivel


pode ser do tipo Integer. Esta varivel pode ser usada mais tarde num cdigo de macro
como este:
Resposta = MsgBox("Voc quer continuar ?", _
vbOKCancel, "Meu Ttulo")
If Resposta = vbCancel Then Exit Sub ' a macro termina se o usurio
selecionar o boto CANCEL
Ou como este:
If MsgBox("Voc quer continuar ?", vbOKCancel, _
"Meu Ttulo") = vbCancel Then Exit Sub

Como Formatar Uma Mensagem Numa Caixa de Entrada Ou Caixa de


Mensagem

Se voc usar Chr(13) no seu texto MsgBox, ento isto atua como um alinhamento do papel,
colocando o texto seguinte ao Chr(13) numa nova linha numa MsgBox.

Sub ExemploMultiLinhas ()
MsgBox "Esta a primeira linha." & _
Chr(13) & "Esta a segunda linha." & _
Chr(13) & "Esta a terceira linha"
End Sub

Se voc quer que uma linha seja indentada (afastada da margem), ento use um cdigo como
o seguinte:

Sub ExemploIndentar ()
MsgBox "Esta a primeira linha." & _
Chr(13) & Chr(9) & "Esta indentada." & _
Chr(13) & Chr(9) & "Esta tambm indentada"
End Sub

Adicionando Um Boto de Ajuda A Uma MsgBox

O boto de ajuda numa caixa de mensagem pode somente ser mostrado usando a seguinte
aproximao. possvel que erros fixados pelo Microsoft podem consertar isto, mas isto
necessrio para usurios que no fizeram. Voc tem que adicionar um boto ajuda
explicitamente com os argumentos de botes, como este:

MsgBox "Clique Ajuda para ajuda?", _


vbCritical + vbMsgBoxHelpButton, "Ajuda",
"runner.hlp", 10
Lies de VBA do Excel 159

Isto mostrar um arquivo ajuda chamado runner.hlp que est no diretrio


Windows (assumindo que ele exista). Por favor note que o nmero usado como o ltimo
argumento dependente do arquivo ajuda.
160

Fase #2: Cdigo VBA do Excel (Macros)

Lio 7: Cdigo para Caixas de Entrada VBA do Excel

C a ixas de entrada de dados so usadas para exigirem um NICO valor do usurio.

O cdigo bsico para um a caixa de entrada de dados como segue. Com este
procedimento sempre que o valor submitido pelo usurio entrado na clula "A1" de uma
folha chamada "Intro".
Sub proInput()
Sheets("Intro").Range("A1").Value = InputBox("Para que ano
voc precisa este relatrio?")
End Sub
Voc tambm pode usar um cabealho diferente para a caixa de entrada de dados
(como "Ano" neste exemplo)
Sheets("Intro").Range("A1").Value = InputBox("Para que ano voc
precisa este relatrio?",Ano)

Antes de ir adiante, devo dizer-lhe que no possvel impor um caractere de


password (*) na caixa de entrada de dados. Para conseguir isto voc deve trabalhar com
um userform e uma caixa de texto. Veja como na lio sobre userforms e controles. Se
voc quiser validar o valor submitido pelo usurio antes de continuar com o
procedimento voc no armazenar o valor diretamente numa clula mas numa varivel.
O cdigo dever ento se parecer com este:
Sub proEntrada() Dim varEntrada As Integer varEntrada
= InputBox("Para que ano voc precisa este relatrio?")
Lies de VBA do Excel 161

Sheets("Intro").Range("A1").valor = varEntrada
End Sub
Uma varivel "varEntrada" declarada Dim varEntrada As Integer para receber
o valor submetido pelo usurio. O usurio entra com um valor que transferido para
uma varivel e da para uma clula. Note aqui que a varivel declarada como "Integer"
assim se o usurio submete um texto "string" um erro gerado. Voc pode declarar a
varivel como string Dim varEntrada As String se voc estiver esperando um texto ou
como date Dim varEntrada As Date se voc estiver perguntando uma data.
Com esta abordagem voc pode usar um manipulador de erro ou alguma
declarao "IF" para validar o valor submetido pelo usurio antes de seguir em frente.
Aqui est o cdigo para manipular erros (resposta do usurio cancelada ou invlida) e
validar o valor submetido:
Sub proEntrada()
Dim varEntrada As Date
On Error GoTo adErro
varInput = InputBox("Para que ano voc precisa este
relatrio?")
If year(varEntrada)> 2006 then
MsgBox "Ano invlido"
Exit Sub
End If
Faa isto e aquilo.
Exit Sub adErro:
MsgBox "Isto no uma data."
End Sub
Neste procedimento eu primeiro declaro uma varivel do tipo data Dim
varEntrada As Date de modo que se o usurio submeter alguma coisa alm de uma data
l ser um erro VBA a ser manipulado. Eu digo ento ao VBA que se um erro ocorrer o
procedimento dever pular para os endereos adErro On Error GoTo adErro. Isto
significa que se o usurio submeter qualquer coisa alm de uma data o procedimento
saltar todas as linhas at chegar em adErro. Uma caixa de mensagem dir ento ao
usurio que aquilo que ele submeteu no uma data MsgBox "Isto no uma data.". Se
aquilo que submetido for de fato uma data eu uso uma declarao "IF" para verificar se
o ano da data maior que 2006. Se ele for h uma outra caixa de mensagem Msgbox "Ano
invlido" seguido por um Exit Sub que coloca um final ao procedimento. Se o valor
submetido for uma data e o ano vlido o procedimento roda completamente at ele
atingir o outro Exit Sub logo antes de adErro: ( com a vrgula no final).

Interrompendo Uma Macro Para Entradas

O que segue uma macro que se interrompe at que o usurio entre com um
valor. O valor ento escrito na clula ativa. Se o usurio pressionar Cancel, a macro
entra em loop.
Sub ObterEntrada()
Dim str As String
Do
Lio #07 Cdigo para Caixas de Entrada em VBA do Excel 162
str = InputBox("Entre com alguma coisa")
If str <> "" Then
ActiveCell.Value = str
Exit Do
End If
Loop
End Sub
Voc pode colocar os seguintes passos diretamente antes da declarao Loop para
ver se o usurio quer continuar:
If MsgBox("Voc quer continuar", vbYesNo, _
"Continuar?") = vbNo Then End
RESTRINGINDO O QUE PERMITIDO NUMA CAIXA DE ENTRADA
Se voc usar Application.InputBox para mostrar uma caixa de entrada, voc pode
restringir o que permitido ao usurio entrar especificando um valor para o tipo de
argumento. Por exemplo, o que segue restringe o usurio a fornecer apenas nmeros:

Dim entradaResposta As Variant


Dim lNum As Single
'use uma varivel variant para obter a resposta da caixa de
'entrada quando a resposta puder ser Boolean (falsa) ou um
'valor
entradaResposta = Application.InputBox( _
Prompt:="Entre com um nmero",
Type:=1)
If entradaResposta = False Then Exit Sub
'armazena a entrada do usurio numa varivel numrica.
'Note que a caixa de entrada retorna uma string mesmo se o tipo
'for 1
lNum = Val(entradaResposta) MsgBox
"voc entrou com " & lNum

O que segue usa Application.InputBox para obter um intervalo selecionado pelo


usurio, ajustando o tipo de argumento para 8.

'A varivel para a resposta da caixa de entrada deve ser do tipo


'range ou ento o teste Is Nothing explodir!
Dim userSelection As Range
'ligue o manipulador de erro no caso do usurio pressionar
'cancel
On Error Resume Next
Set userSelection = Application.InputBox( _
prompt:="entre com um range", Type:=8)
On Error GoTo 0
If userSelection Is Nothing Then
'mostrar esta menssagem se o boto cancel foi selecionado
MsgBox "Um range no foi selecionado"
Exit Sub
End If
'mostrar o range selecionado
MsgBox "Voc selecionou " & userSelection.Address
Lies de VBA do Excel 163

(external:=True)
'para ir ao range selecionado
Application.Goto userSelection, True

Os valores mais populares para o tipo de argumento so:

1 Um nmero
2 Texto (uma string)
4 Um valor lgico (True ou False)
8 Uma referncia de clula, como um objeto Range

Para maiores informaes sobre a caixa de entrada, destacar a palavra no Visual Basic
Editor e pressionar F1 para ajuda.
CONVIDANDO O USURIO A ENTRAR COM UM NMERO
Voc pode conseguir que o usurio fornea-lhe um nmero usando o cdigo como
o seguinte.
Sub GetANumber()
Dim userInput As Variant
'mostrar a aplicao caixa de entrada, com o tipo ajustado
'para 1 a qual permite somente entradas de nmeros
userInput = Application.InputBox( _
prompt:="Por favor entrar com um nmero",
Type:=1)
'se o boto cancel for selecionado, o TypeName Boolean
If TypeName(userInput) = "Boolean" Then
Exit Sub
End If
'converte a entrada do usurio de uma string para um nmero
userInput = Val(userInput)
'mostra a entrada do usurio e o TypeName
MsgBox userInput & " " & TypeName
(userInput)
End Sub
Se o Tipo de argumento no for especificado, ento o usurio poder entrar com
qualquer string, no apenas nmeros. Se Application.InputBox no for usado, mas
somente a InputBox for usada, no h maneira de distinguir entre um Zero e a seleo
cancelar do usurio. Finalmente, toda entrada de uma caixa de entrada uma string, e
deve ser convertida para um nmero se ela um nmero. Por outro lado, testes
numricos no funcionaro.
USANDO A FUNO APPLICATION.INPUTBOX PARA ESPECIFICAR UM
NMERO
A funo Application.InputBox pode ser usada par restringir entradas do usurio
apenas a nmeros especificando um tipo de argumento quando voc mostrar a caixa de
entrada caixa de entrada. O que segue ilustra isto:
Lio #07 Cdigo para Caixas de Entrada em VBA do Excel 164

Sub Obter_Um_Numero()
Dim RespostaDoUsuario As Variant
'mostrar a caixa de entrada
RespostaDoUsuario = _
Application.InputBox(Prompt:="Entre com um nmero", _
Type:=1)
'verificar e ver se boto cancelar foi selecionado. Sair
'se for
If RespostaDoUsuario = "False" Then Exit Sub
'mostrar uma mensagem mostrando qual nmero foi entrado
'use Val() para converter a um nmero ao invs de uma
'"string number"
MsgBox "O nmero entrada foi " & Val(RespostaDoUsuario) End Sub

No exemplo acima, a varivel que recebe o resultado da declarao


Application.InputBox deve ser uma varivel Variant. Deste modo, ela pode acitar ou um
nmero ou uma resposta False se o boto cancelar for selecionado.
Uma outra maneira de se determinar se o boto cancelar foi selecionado na
Application.InputBox usar um teste TypeName():

If TypeName(RespostaDoUsuario) = "Boolean" Then Exit Sub


INPUTBOX PARA PEDIR POR UMA DATA

Tente o cdigo seguinte:

Sub ObterUmaData()
Dim AString As String
Dim RowNdx As Integer
Dim AData As Double
AString = Application.InputBox("Entrar Com Uma Data
Inicial")
If IsDate(AString) Then
AData = DateValue(AString)
Else
MsgBox "Data invlida"
End If
End Sub

Note que voc deveria validar a varivel AData para confirmar que ela est dentro
do intervalo de data que voc quer.
USANDO A INPUTBOX DO VISUAL BASIC PARA RETORNAR UM RANGE
Existem dois tipos de input boxes no Excel. H a funo Visual Basic InputBox
e ela retorna somente uma string texto. Ela a mais simples para se usar. H tambm a
Excel Application.InputBox que permite-lhe especificar o tipo de entrada que
retornada. O que segue ilustra o uso da funo VB InputBox:
Lies de VBA do Excel 165

A abordagem mais simples com nenhuma verificao de erro assume que o usurio no
confundir a seleo ou no sair se uma caixa de erro aparecer.

'declarar uma varivel Variant para a sada da InputBox Dim


meuObjeto As Variant
meuObjeto = InputBox("Entrar com uma clula")
Range(meuObjeto).Select

Entretanto, voc dever considerar se o usurio acionou a tecla cancelar que


retorna False ou entrou com um endereo invlido. O que segue mostra como fazer isto:

Sub ExemploInputBox()
Dim meuObjeto As Variant, celulasSelecionadas As Range
'retorna uma label no caso de um intervalo invlido ser
'entrado ObterUmaCelula:
meuObjeto = InputBox("Entrar uma clula")
'Se nenhuma entrada for feita na caixa, mesmo se OK
'cancelou, sair do procedimento
If meuObjeto = "" Then
Exit Sub
Else
'ligar error handling no caso da entrada no ser um range
On Error GoTo ErrorHandler
'armazenar a entrada numa varivel range para usar mais
'tarde
Set celulasSelecionadas = Range(meuObjeto)
'desligar error handling
On Error GoTo 0
End If
'restante do seu cdigo
Exit Sub
'a sub exit acima evita entrar no seguinte error handler
'que usado se a entrada no for um range vlido ErrorHandler:
MsgBox "Este no era um endereo de clula vlido"
Resume ObterUmaCelula
End Sub
COMO OBTER UM ENDEREO DE CLULA DE UM USURIO
Use o mtodo Application.InputBox, com o argumento Type ajustado para 8:

Dim ORange As Range


On Error Resume Next
Set ORange = Application.InputBox _
(prompt:="Selecione uma clula",type:=8)
On Error GoTo 0
If ORange Is Nothing Then
MsgBox "Voc no selecionou uma clula"
End If
'restante do seu cdigo
Lio #07 Cdigo para Caixas de Entrada em VBA do Excel 166
USANDO INPUTBOXES PARA OBTER UM RANGE DE CLULAS

O que segue so dois exemplos que mostram como o usurio conseguir


selecionar apenas um intervalo de clula simples. Os dois exemplos aps estes dois
permitem o usurio selecionar qualquer nmero de clulas.

Sub ExemploDeEntrada1()
'Este exemplo mostra uma caixa de entrada e pede ao usurio
'para selecionar uma clula.
Dim celulasSelecionadas As Range
'configurar on error no caso de cancelar ter sido
'selecionado
On Error Resume Next
'mostrar a caixa de entrada e atribuir resultados de
'seleo para uma varivel
Set celulasSelecionadas = Application.InputBox( _
prompt:="Selecione uma clula simples", Type:=8) 'desligar
o verificador de erro
On Error GoTo 0
'verificar se um intervalo foi selecionado If
celulasSelecionadas Is Nothing Then
MsgBox "Nenhuma clula foi selecionada"
Exit Sub
ElseIf celulasSelecionadas.Cells.Count > 1 Then
'verificar e ver quantas clulas foram selecionadas
'mostrar mensagens dando o resultado
MsgBox "Voc selecionou mais do que uma clula"
Exit Sub
Else
MsgBox "Voc selecionou " &
celulasSelecionadas.Address(external:=True)
End If
End Sub

Sub InputExample2()
'Este exemplo mostra uma caixa de entrada e pede ao usurio
'para selecionar uma clula
'Ele continua o lao at o boto cancel ser selecionado ou
'uma clula simples for selecionada
Dim celulasSelecionadas As Range
'ajuste o on error no caso do boto cancelar ser
selecionado
On Error Resume Next
Do
'mostrar a caixa de entrada e atribuir o resultado da
'seleo a uma varivel
Set celulasSelecionadas = Application.InputBox _
(prompt:="Selecione uma clula simples", Type:
=8)
'desligar o verificador de erro
On Error GoTo 0
'verificar se um intervalo selecionado. Parar toda
Lies de VBA do Excel 167

'ao se nenhum for selecionado


If celulasSelecionadas Is Nothing Then

End
'verificar e ver quantas clulas foram selecionadas
ElseIf celulasSelecionadas.Cells.Count > 1 Then
MsgBox "Voc selecionou mais do que uma clula"
Else
'sair se uma clula for selecionada
Exit Do
End If
Loop
'mostrar o valor da clula selecionada
MsgBox "o valor da clula selecionada " _
& celulasSelecionadas.Value
End Sub

Sub InputExample3()
'Este exemplo mostra uma caixa de entrada e pede ao usurio
'para selecionar um intervalo
Dim cellsSelected As Range
'configure on error no caso do boto cancelar ter sido
'selecionado
On Error Resume Next
'mostra a caixa de entrada e atribui um resultado da
seleo 'a uma varivel
Set cellsSelected = Application.InputBox( _
prompt:="Selecione um intervalo de uma ou mais clulas",Type:=8)
'desligar o verificador de erro
On Error GoTo 0
'verificar se um range selecionado
If cellsSelected Is Nothing Then
MsgBox "Nenhuma clula foi selecionada"
Exit Sub
Else
'mostrar mensagens dando as clulas selecionadas
MsgBox "Voc selecionou " &
cellsSelected.Address(external:=True)
End If
End Sub

Sub InputExample4()
'Este exemplo mostra uma caixa de entrada e pede ao usurio
'para selecionar um intervalo
'Ele continua o lao at o boto cancel ser selecionado ou
'um intervalo ser selecionado
Dim cellsSelected As Range, cell As Range
'configure on error no caso de cancel ser selecionado
On Error Resume Next
Do
Lio #07 Cdigo para Caixas de Entrada em VBA do Excel 168
'mostra a caixa de entrada e atribui o resultado da
'seleo a uma varivel
Set cellsSelected = Application.InputBox _
(prompt:="Selecione uma clula simples", Type:
=8)
'desligue o verificador de erro
On Error GoTo 0
'verifique se um intervalo selecionado. Pare toda a
'ao se nenhum for selecionado
If cellsSelected Is Nothing Then
End
Else
'sair quando um range tiver sido selecionado
Exit Do
End If
Loop
'mostrar o valor das clulas selecionadas
For Each cell In cellsSelected
MsgBox "o valor da " cell
.Address(external:=True) _
& " " & cell.Value
End Sub
UM EXEMPLO DE APPLICATION.INPUTBOX QUE OBTM UM INTERVALO
O que segue ilustra como usar a funo Application.InputBox. Para
obter uma seleo de intervalo pelo usurio.

Dim Rng As Range


On Error Resume Next
Set Rng = Application.InputBox(prompt:="Entrar Com Um Range",
Type:=8)
If Rng Is Nothing Then
MsgBox "Nenhum Intervalo Selecionado"
Else
Rng.Select
End If
On Error GoTo 0
USANDO A INPUTBOX PARA COLOCAR UM VALOR NUMA CLULA
O que segue ilustra como obter um valor do usurio e coloc-lo na clula A3 da
planilha ativa:

Sub InputBoxExample()
Dim cellValue As Variant
reShowInputBox:
cellValue = Application.InputBox("Entrar com o valor e ir para
A3")
If cellValue = False Then
Beep
Exit Sub
ElseIf cellValue = "" Then
Beep
Lies de VBA do Excel 169

GoTo reShowInputBox
Else
ActiveSheet.Range("A3").Value = cellValue
End If
End Sub
CONVIDANDO O USURIO PARA MLTIPLAS ENTRADAS
O que segue um modo simples de convidar um usurio para uma srie de
entradas e colocar os valores nas clulas da planilha ativa. Ele usa uma das rotinas
principais que chama novamente uma sub-rotina repetidamente.

Sub MainProcedure()
LoadData "A1", "Entrar com um valor para alguma coisa"
LoadData "G1", " Entrar com um valor ainda para alguma coisa"
End Sub

'os argumentos so endereos de clulas para o valor e a


'mensagem a ser mostrada
Sub LoadData(addr As String, msg As String)
Dim resposta As Variant, iR As Integer
'fazer o lao at o usurio entrar ou escolher.
While response = ""
'mostra uma caixa de entrada com a msg que foi transmitida
' esta rotina resposta =
InputBox(prompt:=msg)
'se o boto cancelar for selecionado ou nenhum valor
'for entrado, ver ser o 'usurio quer parar.
If resposta = "" Then
iR = MsgBox("Nenhum valor foi entrado. " & _
"Voc quer parar?",
vbYesNo)
'isto pra toda atividade
If iR = vbYes Then End
End If
Wend
'isto carrega o valor na clula
Range(addr).Value = resposta
End Sub
Exemplo da funo InputBox

Este exemplo mostra vrias maneiras de utilizar a funo InputBox para solicitar ao
usurio que digite um valor. Se as posies x e y forem omitidas, a caixa de dilogo
ser automaticamente centralizada em relao aos respectivos eixos. A varivel
MeuValor contm o valor digitado pelo usurio se ele clicar em OK ou pressionar a
tecla ENTER.
Se o usurio clicar em Cancel, ser retornada uma seqncia de comprimento zero.
Dim Mensagem, Titulo, Default, MeuValor
Mensagem = "Digite um valor entre 1 e 3" ' Define o aviso. Titulo
= "Demonstrao da CaixaDeEntrada" ' Define o ttulo.
Default = "1" ' Define o padro.
Lio #07 Cdigo para Caixas de Entrada em VBA do Excel 170
' Exibe a mensagem, o ttulo e o valor padro.
MeuValor = InputBox(Mensagem, Titulo, Padro)
' Utiliza o arquivo de Ajuda e o contexto. O boto Ajuda adicionado
' atomaticamente.
MeuValor = InputBox(Mensagem, Titulo, , , , "DEMO.HLP", 10)

' Exibe a caixa de dilogo na posio 100, 100.


MeuValor = InputBox(Mensagem, Titulo, Padro, 100, 100)
171

Fase #2: Cdigo VBA do Excel (Macros)

Lio 8: Cdigo para Manipular Erros no VBA para Excel

E xistem dois tipos de erros que podem ocorrer quando se trabalha com VBA para
Excel, o erro VBA e o erro Excel. Os erros VBA so aqueles capturados pelo
VBA que disparam a janela de dilogo de erro e que so gerados quando
existem erros de impresso ou erros lgicos no cdigo. O erro Excel so aqueles que o
VBA no captura e que voc manipula com as declaraes "IF".
Manipulando Erros no Excel
Um erro Excel acontece quando por exemplo voc estiver pedindo a um usurio
para submeter um nmero numa clula A1 de uma planilha e que o nmero submetido
ou muito pequeno ou muito grande. No seguinte exemplo voc est esperando um usurio
submeter um nmero entre 100 e 200. Se o valor for menor do que 100 e, voc quiser
dizer ao usurio mas voc concorda em deixar o procedimento VBA ir adiante. Se o valor
for maior do que 200 e, voc quiser dizer ao usurio e parar o procedimento. Aqui est o
cdigo:
Sub proTestExcelErrors()
If Range("A1").Value < 100 Then
MsgBox "Valor submetido muito pequeno."
ElseIf Range("A1").Value > 200 Then
MsgBox "Valor submetido muito grande."
Exit Sub
End If
' aqui est o resto do procedimento.
MsgBox "O procedimento vai em frente."
End Sub
Erros no VBA para Excel
Um VBA erro acontece quando o VBA no entende ou aceita que voc tem escrito. Um
erro VBA acontece quando:
- o nome de um objeto, uma propriedade ou um mtodo tem a ortografia incorreta,
- um mtodo invlido ou propriedade so chamados para um certo objeto. Por exemplo
voc no pode escrever ActiveSheet.Value se a folha no tem um valor. Ela tem um nome,
ele pode ser visvel ou no mas ele no tem valor.
- um valor invlido enviado para uma varivel. Por exemplo voc no pode
guardar um texto ("Bertolo") numa varivel que voc declarou como Integer (Dim
varVariable as Integer).
- um valor no encontrado pelo mtodo Find ( Selection.Find...). Por exemplo,
voc est procurando "Bertolo" na coluna A mas ele no est l. - uma varivel no foi
declarada enquanto trabalhando com a Option Explicit ativada. - e mais.
extremamente importante manipular estes erros para programadores que
desenvolvem programas enormes ou video games que sero distribudos numa larga
escala. Isto porque existem enormes equipes de teste para testar e tentar encontrar bugs
172

nos programas antes deles serem lanados para o pblico. E mesmo assim.....Microsoft
Internet Explorer....segurana bugs....
Assim o primeiro passo na manipulao de erros testar seu programa.
Quando voc estiver desenvolvendo procedimentos VBA no Excel para si prprio
no realmente importante manipular erros. Voc trabalha com seu programa e corrige-
os quando aparecerem. Se voc desenvolver programas para umas poucas pessoas com
quem tem ligaes estretiras voc pode esquecer a respeito de erros tambm. Mas se voc
estiver desenvolvendo programas para distribuio em grande escala voc deve manipular
os erros lembrando de adicionar um pouco do custo de sua aplicao. Voc pode mesmo
formar a sua prpria equipe de teste. Descoberta de Erros VBA enquanto estiver
Digitando o Procedimento, enquanto estiver Tentando Rodar o Procedimento ou
enquanto estiver Rodando o Procedimento
Uma poro de erros so capturados pelo Visual Basic Editor (VBE) e voc no
alertado quando voc escrever o cdigo mas quando voc tentar obter a prxima linha
enquanto da escrita do cdigo. A fonte da linha torna-se vermelha e a caixa de mensagem
lhe diz o que est errado. Outros erros no so detetados quando voc escrever o cdigo
mas quando voc tentar rodar seu procedimento VBA ou quando voc rod-los.
Enquanto digita
O VBE aponta um monte de erros quando voc escreve o cdigo. Tente escrever
Range("A1".Value por exemplo. Voc ser alertado para o fato que um parnteses est
faltando com a caixa de mensagem dizendo "Expected: End of Statement" (imagem
abaixo). Voc ser alertado pela falta de parnteses, aspas duplas, dois pontos, pontos e
outro "separadores". Mas o VBE no lhe alertar pelos erros de impresso como
Range("A1").Value ou qualquer coisa que esteja entre aspas duplas
Range("namedoCampo").Value. O VBE no lhe alertar se voc escreveu de forma
errada o nome de uma varivel.

Voc corrige estes erros e da voc pode rodar suas macros passo a passo com a tecla F8
ou indo ao menu "Ferramentas/Macro/Macros". At este ponto outro erroVBA ser
identificado pelo VBE.
Enquanto tenta Rodar o Procedimento
O segundo conjunto de erros identificado pelo VBE to logo voc tentar rodar o
procedimento. Se existirem alguns erros especficos no cdigo, a execuo no comear.
Uma janela de dilogo diferente aparece dependendo se voc estiver rodando o
procedimento do VBE do Excel ou do Excel quando o procedimento for protegido com
password. O tipo de erro nesta segunda categoria inclui a ausncia de End Sub, uma falta
Lies de VBA do Excel 173

de End If, uma falta de Next ou Loop uma varivel no declarada e alguns outros. Quando
estes erros so identificados pelo VBE e a janela de dilogo aparecer
Lio #08 Cdigo para Manipular Erros no VBA do Excel

voc no ter de se aborrecer sobre se alguns cdigos foram executados. A execuo no


inicia.
Se voc estiver tentando executar o procedimento do Excel e aquele procedimento
estiver protegido com password (proteo ativada) o seguinte tipo de caixa de
mensagem aparece.

Clique em "OK", v para o VBE, desproteja o projetoe rode o procedimento. A


primeira linha de cdigo destacada em amarelo, o problem destacado em azul e a
caixa de mensagem diferente aparece. Fixe o problema, clique na seta azul na barra de
ferramentas para reiniciar a execuo ou clique no quadrado azul na barra de
ferramentas e recomece do VBE ou do Excel..
Se voc estiver tentando executar o procedimento do VBE o seguinte tipo de
caixa de mensagem aparece. Se voc estiver tentando executar o procedimento do Excel
e aquele procedimento no estiver protegido com password ou a proteo foi desativad,
o VBE abre e o seguinte tipo de caixa de mensagem aparece.

A primeira linha de cdigo na janela de cdigo do VBE destacada em amarelo


e o problema destacado em azul. Fixe o problema, clicar na seta azul na barra de
ferramentas para retornar a execuo ou clicar no quadrado azul na barra de ferramentas
e reiniciar o VBE ou o Excel.
Enquanto Roda o Procedimento
Um terceiro conjunto de erros identificado pelo VBE quando ele tenta executar
uma certa sentena incorreta no seu procedimento. Este tipo de erro inclui quando voc
est pedindo para o VBA abrir a pasta que ele no pode encontrar, quando voc estiver
174

pedindo ao VBA para ativar uma folha que no saiu ou quando voc estiver usando o
mtodo Find e o valor que voc est procurando no encontrado.
De onde o procedimento tem sido iniciado a seguinte caixa de mensagem aparece.
Se o procedimento estiver protegido por um password e a proteo est ativa o boto
"Debug" no est ativo (fonte cinza) neste caso a nica soluo encerrar o procedimento
no ponto onde o erro foi encontrado. Isto significa que parte da tarefa foi efetuada sempre
que problemas como este forem criados.

Se o procedimento est sendo testado do VBE voc pode clicar no "Debug". A


sentena falha ser destacada em amarelo. Fixe o problema, clique na seta azul na barra
de ferramentas para reiniciar a execuo ou clique no quadrado azul na barra de
ferramentas e reinicie do VBE ou do Excel. Manipulando Erros VBA
Aqui est o modo bsico de manipular um erro. A primeira coisa voc criar um
endereo para onde VBA saltar se houver um erro. Neste exemplo o endereo
addJump com os dois pontos NO OPCIONAL no final. Abaixo addJump est aquilo
que suposto acontecer se houver um erro e acima est o procedimento que deveria rodar
se no existirem erros. Note que a ltima linha de cdigo na seo acima addJump
Exit Sub porque se no existirem erros voc no quer que o resto do cdigo seja
executado. Exemplo 1:
Sub proTesteManipuladorDeErro()
On Error GoTo addJump
Workbooks.Open "xxxxxx"
Exit Sub addJump:
MsgBox "Um erro ocorreu, chamar Bertolo em 1 514-257-0734"
End Sub Exemplo 2:
Sub proTesteManipuladorDeErroNenhumErro()
On Error GoTo addJump
MsgBox "Est tudo perfeito."
Exit Sub addJump:
MsgBox " Um erro ocorreu, chamar Bertolo em 1 514-257-0734"
End Sub
Copiar/Colar ambos os exemplos num mdulo do seu prprio e rod-los. O primeiro
exemplo gerar uma caixa de mensagem dizendo Um erro ocorreu, chamar Bertolo rm 1
Lies de VBA do Excel 175

Lio #08 Cdigo para Manipular Erros no VBA do Excel

514-257-0734 porque um erro tem ocorrido. A pasta xxxxxx no pode ser encontrada.
O segundo exemplo gerar uma caixa de mensagem dizendo Everything is fine. Se
voc rodar o procedimento sem o manipulador de erro:
Sub proTesteManipuladorDeErro2()
Workbooks.Open "xxxxxx" End
Sub
Voc terminar com a seguinte caixa de mensagem do VBA.

Se voc apenas quiser que os erros sejam ignorados voc escreve On Error Resume Next
no comeo do procedimento. Copiar/Colar o seguinte procedimento num mdulo para o
seu prprio e rod-lo. Ele gerar uma caixa de mensagem dizendo Um erro ocorreu mas
ns temos ignorado-o.
Sub proTesteManipuladorDeErroIgnorar()
On Error Resume Next
Workbooks.Open "xxxxxx"
MsgBox " Um erro ocorreu mas ns temos ignorado-o." End
Sub
Fase # 3: VBA do Excel Avanado
Lio 1: Cdigo VBA do Excel para Variveis - Lio 2: Trabalhando com
Declaraes - Lio 3: Trabalhando com Funes - Lio 4: Trabalhando com
databases - Lio 5: Criando UserForms - Lio 6: Adicionando Controles aos
userforms Lio 7: Cdigo VBA do Excel para UserForms - Lio 8: Cdigo VBA
do Excel para Grficos e Arquivos Seqenciais Lio 9: Criando e Modificando
Menus Lio 10: Usando controles ActiveX nas planilhas e grficos Lio 11:
Trabalhando com Barras de Ferramentas Lio 12: Os Suplementos
Lio 1: Trabalhando com Variveis
Voc as cria no VBA e voc carrega nelas os valores, nmeros, palavras e tabelas de
dados inteiras. O cdigo fica menos difcil, e valores com menos manuteno. Existem
mesmo tipos de varivel que permite voc resolver problemas de clculos compridos
(1.000.000 clulas calculadas em uns poucos segundos).
Lio 2: Trabalhando com Declaraes
Coisas como IF..THEN, DO...LOOP, FOR...NEXT, WITH...END WITH, EXIT FOR,
EXIT DO, EXIT SUB
Lio 3: Trabalhando com Funes
Usando as funes Excel com macros, criando novas funes Excel e usando funes
VBA como UCASE, LCASE e NOW().
Lio 4: Trabalhando com Databases
As caracteresticas do database em Excel so ferramentas extraordinrias. Aprenda ai a
us-las com VBA (classificao, filtragem de dados). Lio 5: Criando Userforms
Forms so folhas especializadas que voc cria para exigir entradas de um usurio. Quando
a caixa de entrada de dados ou a caixa de mensagem no forem suficientes, voc
desenvolve userforms para exigir um password (com os caracterees ****), para exigir
um ou muitos parmetros (datas, nmeros, taxas..., nomes ramificados...). Lio 6:
Adicionando Controles a Userforms
No userform voc adiciona controles (botes de comando, caixa de listagens, caixas de
texto, caixas de combinao (listas drop-down),etc.. Aprenda como cri-las e a configurar
suas propriedades de modo que elas faam EXATAMENTE o que voc quiser que elas
faam. Ela uma forma de ser amigvel ao usurio. Lio 7: Cdigo VBA do Excel
para UserForms
O cdigo funciona com userforms e controles (botes de comando, caixas de texto, caixa
de listagens, etc...). Adicionar valores aos seus controles quando o form estiver ativado,
mostrar e ocult-lo....

Lies de VBA do Excel


177

Lio 8: Cdigo VBA do Excel para Grficos e Arquivos Seqenciais


O cdigo funciona com controles (botes de comando, caixas de texto, caixa de
listagemes, etc...). , validar os valores que os usurios entraram e transfer-los quando o
usurio clicar no boto de comando.
Lio 9: Criando e Modificando Menus
O Microsoft Excel tem mais de 30 menus que ajudam voc no seu uso do
Microsoft Excel. possvel aumentar ainda mais a barra de menus adicionando novos
menus e itens de menu a eles. E, voc pode adicionar itens de menus que aparecem
somente quando um dado arquivo aberto. De fato, voc pode remover os menus
Microsoft Excel e troc-los com menus personalizados se voc estiver criando uma
aplicao personalizada no Microsoft Excel.
Lio 10: Usando controles ActiveX nas planilhas e nos grficos
As lies 5, 6 e 7 mostraram-lhe como criar userforms e colocar neles objetos tais
como as barras de rolamento, as caixas de listagem, e os botes de comando. O Microsoft
Excel tambm lhe permite colocar tais objetos diretamente numa planilha ou grfico. Se
o objeto for um boto de comando, uma macro pode ser especificada a executar quando
o boto for clicado. Se o objeto for uma caixa de listagem, um boto de rotao ou uma
barra de rolamento, ento estes podem estar vinculados s frmulas ou clulas nas suas
planilhas.
Lio 11: Trabalhando com Barras de Ferramentas
possvel com o Microsoft Excel modificar as barras de ferramentas de modo
que as ferramentas que voc precisar so aquelas que esto nas suas barras de ferramentas.
No somente se pode atribuir qualquer um dos muitos botes ferramenta s suas barras
de ferramentas, voc pode tambm atribuir macros aos seus botes que podem ser
adicionados a uma barra de ferramenta existente ou a uma nova barra de ferramenta. E,
voc pode ter macros para criar barras de ferramentas e botes quando uma pasta for
aberta e remov-los quando ela for fechada. Lio 12: Os Suplementos
Se voc quiser distribuir macros e aplicaes que voc escreveu, voc provavelmente
vai querer considerar em distribu-las como um arquivo suplemento em vez de um
arquivo pasta. A principal vantagem de um arquivo suplemento que ele mais fcil
para usar funes. Uma outra vantagem, um suplemento pode ser armazenado em
qualquer diretrio e ajustado para ser carregado quando o Microsoft Excel iniciar. Isto
elimina a necessidade de colocar o arquivo no diretrio de incio do Microsoft Excel
(tipicamente o Excel\Xlinicio). E, os suplementos no solicitam se sero ou no
gravados quando se fecha o Microsoft Excel.
Fase #3: VBA do Excel Avanado

Lio 1: Cdigo VBA do Excel para Variveis ma varivel um objeto que voc
cria e na qual voc pode armazenar texto (STRING), datas (DATE), nmeros

U (INTEGER, LONG, SIMPLE, DOUBLE) ou qualquer outra coisa tambm


(VARIANT).
178

Eu crio as variveis que uso como, e com, contadores. Copiar/Colar o seguinte


procedimento num mdulo e tent-lo passo a passo:
Sub proTeste()
Dim varContador as Double
Dim varNumero as Double
Range("A1").Select varNumero
= 1
For varContador = 1 to 25
Selection.Value= varNumero * 3
varNumero =Selection.Value
Selection.Offset(1,0).Select
Next
End Sub
Algumas vezes eu contarei o nmero de linhas, armazeno o resultado numa
varivel e da eu fao alguma coisa tantas vezes quantas linhas existirem:
Sub proTest()
Dim varContador as Double Dim
varNrLinhas as Double
Aqui eu conto o nmero de linhas
For varContador = 1 to varNrLinhas
Fazer isto e aquilo
Next
End Sub
Quando eu crio uma nova pasta de um procedimento numa outra pasta e quero
salvar a nova pasta no mesmo diretrio que a pasta que estou trabalhando nela, eu uso
uma varivel que eu nomeio de "varPath". A razo de fazer isto que se a pasta original
for aberta pelo Excel o diretrio default o diretrio da pasta aberta, mas se a pasta
original tiver sido aberta pelo Explorer, o diretrio por default "Meus Documentos".
ASSIM para ficar certo de que a nova pasta est salva no diretrio certo, eu processo o
seguinte cod:
Sub proTeste() Dim varPath as
String varPath =
ThisWorkbook.Path
Eu ento crio uma nova pasta e quando a hora de salv-la
Activeworkbook.SaveAs varPath & "\novaPasta.xls"
End Sub
Eu uso variveis em 99% dos meus procedimentos e, voc far o mesmo para reduzir o
nmero de valores codificados dificilmente. A Manuteno torna-se assim muito mais
simples.
Li0 #01 Cdigo VBA do Excel para Variveis

Option Explicit
Quando voc abre um mdulo no VBE a sentena "Option Explicit" dever ser a
primeira linha de cdigo no topo. Isto significa que voc DEVE declarar todas as
variveis que voc usar e existem muitas vantagens desta obrigao.
179

Para ativar ou desativar esta opo v a Ferramentas/Options/Editor no VBE e


marque o item "Require Variable Declaration". Agora no topo de todas as janelas de
cdigo voc ver "Option Explicit". Por que dever esta opo ser ativada? Digamos que
voc esteja usando uma varivel chamada "varMinhaVar" e que voc escreva
varNinhaVar = 32. Voc errou na ortografia do nome da varivel e voc ir continuar
pensando que o valor de varMinhaVar seja 32 e ele no . Se a Option Explict estiver
ativada, o VBE lhe dir que voc est usando uma varivel no existente " varNinhaVar
". Voc ento evitar um monte de erros possveis.
Declarao de Varivel
Declare todas as suas variveis no comeo dos seus procedimentos e sempre use
o prefixo "var" e um ou muitas letras maisculas dentro do nome:
Dim varEstaVariavel as STRING
se voc errar na ortografia do nome da varivel dentro do procedimento, o Excel no capitalizar
as letras dizendo-lhe que h alguma coisa errada. O prefixo "var" tornar o seu cdigo mais fcil
para ler.
Tipos de Dados
Por querer manter as coisas simples, eu essencialmente uso quatro tipos de variveis:

STRING Text, at 65.000 caracterees. Eu uso-o para textos mas


tambm nomes de arquivo,
path, nomes de planilha,
nomes de pasta, endereos de
clulas.

DOUBLE Nmero com ou sem decimais Eu poderia tambm usar


"Bytes", Integer", "Long" e
"Single" mas eles todos tem
limites.

DATA Se voc usa o tipo STRING para datas, voc no ser capaz de
realizar clculos com elas assim use o tipo "Date".

VARIANT Eu uso o tipo VARIANT cada vez que eu tenho um grande


nmero de clculos a realizar (mai do que 2.000 frmulas). Eu
levo o range para um array VARIANT, executo os clculos e
trago o range de volta para a planilha.

Eu criei este procedimento muito simples que executa


1.000.000 de clculos em menos do que 5 segundos.

Lies de VBA do Excel


180

Variveis Public e Private


Quando voc declara uma varivel com o cdigo Dim varMyVar as String ela pode
somente ser usados no procedimento onde ela foi declarada. Quando o procedimento
terminar, a varivel desaparece.
Se voc quer usar uma varivel em muitos procedimentos voc declar-la no topo
de um mdulo desta maneira:
Public varMinhaVar as String
Voc deve lembrar que esta varivel desaparece somente quando a pasta estiver
fechada e que at ento ele leva o ltimo valor que voc armazenou nela. Para limpar o
valor voc deve usar o cdigo:
varMinhaVar = "" ou varMinhaVar = Empty
Eu me sinto desconfortvel tornando uma varivel public assim eu uso outro
abordagem de levar o valor de uma varivel de um procedimento ao outro.
Levando o valor de uma varivel de um procedimento ao outro
O modo fcil de levar o valor de uma varivel de um procedimento a outro
armazenando este valor numa clula qualquer da pasta:
no primeiro procedimento:
Range("A3456").Value=Variable1
no segundo procedimento:
Variable1=Range("A3456").Value
Voc tambm pode levar a prpria varivel de um procedimento para um outro
procedimento que voc chama do primeiro. Por exemplo:
Sub proTeste1() Dim varMinhaVar
As Double varMinhaVar = 3
Call proTeste2(varMinhaVar) End
Sub

Sub proTeste2(varMinhaVar)
varMinhaVar = varMinhaVar * 2
Range("A1").Value = varMinhaVar
End Sub
A varivel declarada somente no primeiro procedimento. Um valor
armazenado nela (3). Um segundo procedimento ento chamado com a varivel coimo
argumento. Aps a execuo dos dois procedimentos, o valor do range A1 ser 6.
Variveis Array
Uma VARIVEL ARRAY uma varivel multidimensional que voc pode ser do
tamanho da sua preferncia: minhaVariavel (3) uma varivel consistindo de 4 valores
diferentes, minhaVariavel (5,10) uma varivel consistindo de 66 valores, 6 linhas e 11
colunas e minhaVariavel (5,10,10) pode tomar 726 valores, etc....
Li0 #01 Cdigo VBA do Excel para Variveis
181

Quando voc declara uma varivel array, o primeiro elemento comea com o nmero
"0". Uma Varivel varMinhaVariable(3) inclui 4 elementos de "0" a "3". Se como eu,
voc fica desconfortvel com uma varivel varMinhaVariable(0), voc pode impor que o
primeiro elemento comece com o nmero "1". Na declarao geral (onde voc encontra
a Option Explicit), escreva:
Option Base 1
Nesta situao, minhaVariable(3) contm somente trs elementos.
Voc pode tomar o valor de uma varivel de um procedimento para o outro
armazenando este valor numa clula qualquer na pasta. ex:
no primeiro procedimento:
Range("A3456").Value=Variable1
no segundo procedimento:
Variable2=Range("A3456").Value
182

Fase #3: VBA do Excel Avanado

Lio 2: Trabalhando com Declaraes


Cdigo VBA do Excel para Declaraes
As declaraes que eu uso mais freqentemente nas minhas macros VBA Excel
so: If..Then..End If, Do...Loop, For...Next e Select Case
If..Then...End If
Quando h somente uma condio e uma ao, voc usar a simples declarao:
If Selection.Value > 10 Then
Selection.Offset(1,0).Value = 100
End If
Num Portugus simples: se o valor da clula selecionada for maior que 10 ento
o valor da clula abaixo 100 se no fizer nada4.
If LCase(Selection.Value).Value= "sim" then...
Com esta abordagem, seu teste ser vlido sempre que o case que o seu cliente
usa (Sim, SIM ou qualquer outra combinao de cases).
If..Then...End If (mltiplas filas)
Quando existirem somente duas condies que voc quiser verificar
seqencialmente, voc usar a declarao:
If Selection.Value > 10 Then
If Selection.Value = 12 Then
Selection.Offset(1,0).Value = 100
End If
End If
Num Portugus simples: primeiro verifique se o valor da clula selecionada
maior que 10. Se ele no for no faa nada. Se ela verificada e se o valor da clula
selecionada for igual a 12. Se for, defina o valor clula abaixo como 100 e da no faa
nada.
If..Then...And...End If
Quando existirem duas condies inclusivas, voc usar a declarao:
If Selection.Value >= 10 And Selection.Offset(0,1).Value < 20
Then
Selection.Offset(1,0).Value = 100
End If

4
Nota: Testes nas strings so case sensitive de modo que quando voc testar uma string de
caracteres e voc no souber se o usurio usar letras maisculas ou minsculas, use a funo
LCase dentro do seu teste e escreva as strings no seu cdigo em letras minsculas:
183

Num Portugus simples: se o valor da clula selecionada maior ou igual a 10 e


meno do que 20 o valor da clula abaixo 100 caso contrrio no faa nada.
If..Then...Or...End If
Lio #02 Trabalhando com Declaraes 184

Quando existirem duas condies exclusivas e uma ao, voc usar a declarao:
If Selection.Value = 10 Or Selection.Offset(0,1).Value = 20 Then
Selection.Offset(1,0).Value = 100
End If
Num Portugus simples: se o valor da clula selecionada igual a 10 ou igual a
20 ento o valor da clula abaixo 100 caso contrrio no faa nada.
If..Then...Else...End If
Quando h somente uma condio mas duas aes, voc usar a declarao:
If Selection.Value > 10 Then
Selection.Offset(1,0).Value = 100
Else
Selection.Offset(1,0).Value = 50
End If
Num Portugus simples: se o valor da clula selecionada maior que 10 ento o
valor da clula abaixo 100, caso contrrio o valor da clula abaixo 50.
If..Then..ElseIf...End If
Quando existirem mais do que uma condio vinculada cada uma a diferente ao,
voc usar a declarao:

If Selection.Value = 1 Then
Selection.Offset(1, 0).Value = 10
ElseIf Selection.Value = 2 Then
Selection.Offset(1, 0).Value = 20
ElseIf Selection.Value = 3 Then
Selection.Offset(1, 0).Value = 30
ElseIf Selection.Value = 4 Then
Selection.Offset(1, 0).Value = 40
ElseIf Selection.Value = 5 Then
Selection.Offset(1, 0).Value = 50
End If

Num Portugus simples: Se o valor da clula selecionada 1 ento o valor da


clula abaixo 10 mas se o valor da clula selecionada 2 ento o valor da clula abaixo
20 mas se o valor da clula selecionada 3 ento o valor da clula abaixo 30 mas se
o valor da clula selecionada 4 ento o valor da clula abaixo 40 mas se o valor da
clula selecionada 5 ento o valor da clula abaixo 50 mas ento se o valor da clula
selecionada no 1, 2, 3, 4 ou 5, no faa nada.
Select Case
Digamos que uma varivel ou uma clula pode tomar 25 valores diferentes e
dependendo daquele valor 25 coisas diferentes devero acontecer. Voc pode ou construir
uma declarao IF muito longa ou usar Select Case.
Do..Loop
Lies de VBA do Excel 185

A declarao Do...Loop faz maravilhosamente muito da mesma coisa que a


declarao For..Next mas voc no precisa declarar um contador porque o Loop pra
quando ele encontrar uma certa condio. Tente o seguinte procedimento primeiro
entrando com 1 nas clulas A1 at A7 ou A27 ou para mais longe quanto voc queira ir.

Sub proTeste()
Dim varContador as Integer
Range("A1").Select
Do Until Selection.Value = ""
Selection.Value = Selection.Value + 1
Selection.Offset(1, 0).Select
Loop
End Sub
Num Portugus simples: comeando na clula A1 adicionar 1 ao valor da clula
selecionada e mover uma clula para baixo. Faa isto at que o valor da clula selecionada
seja nada. Variao da declarao:
Do Until Selection.Value = ""
Faa at a clula selecionada estar vazia
Do While Selection.Value <> ""
Faa sempre que clula selecionada no estiver vazia
Loop Until Selection.Value = ""
Loop at que a clula selecionada seja vazia
Loop While Selection.Value <>""
Loop enquanto a clula selecionada no estiver vazia Exit...

Voc pode sair de um FOR..NEXT, DO...LOOP e mesmo de um procedimento a


qualquer momento com a declarao EXIT
If Selection.Value > 10 Then Exit For
If Selection.Value > 10 Then Exit Do If Selection.Value
> 10 Then Exit Sub

With...End With
Antigamente quando a memria do computador era rara e cara e os computadores
no eram muito poderosos, os programadores oferecia-nos um monte de declaraes
With..End With porque ela era muito menos exigente de memria e das capacidades do
computador. Quando voc desenvolver no VBA do Excel (programas muito pequenos) a
memria no realmente uma objeo e nossos computadores pessoais so to poderosos
quanto os grandes computadores de ontem. O gravador de macro usa um monte de
declaraes With..End With mas eu pessoalmente no. De qualquer modo aqui est como
ela funciona.
Range("A3").Select
With Selection.Font
Lio #02 Trabalhando com Declaraes 186

.Name = "Arial"
.Size = 24
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
o mesmo que escrever
Range("A3").Select
Selection.Font.Name = "Arial"
Selection.Font.Size = 24
Selection.Font.Strikethrough = False
Selection.Font.Superscript = False
Selection.Font.Subscript = False
Selection.Font.OutlineFont = False Selection.Font.Shadow
= False
Selection.Font.Underline = xlUnderlineStyleNone
Selection.Font.ColorIndex = xlAutomatic
Ambos funcionam e voc que escolhe.
For..Next
O loop FOR...NEXT aquele um que eu uso mais. Ele permite voc repetir uma ao um
certo nmero de vezes.

Sub proTeste()
Range("A1") = 10 Range("A2").Select
For varContador = 1 To 10
Selection.Value = Selection.Offset(-1, 0).Value * 2
Selection.Offset(1, 0).Select
Next
End Sub

Num Portugus simples: Defina o valor da clula A1 como 10 e ento selecione a clula
A2. Enquanto o contador estiver indo de 1 a 10 (10 vezes em outras palavras) o valor da
clula selecionada ser duas vezes o valor da clula acima...mover uma clula para baixo.
Resultando deste procedimento, Clula A1=10, A2=20, A3=40.....A11=10.240.
Se voc escrevesse:
For varContador = 1 To 10 Step 2
a faanha seria realizada somente 5 vezes. Resultando deste procedimento, clula A1=10,
A2=20, A3=40.....A6=320.
Voc pode tambm iniciar debaixo para cima
For varContador = 10 To 1 Step -1
Lies de VBA do Excel 187

Quando voc usa a declarao For..Next num conjunto de dados interessante


contar o nmero de linhas e ter o seu contador se movendo de 1 ao nmero de linhas.
For varContador = 1 to varNrLinhas
Lio #02 Trabalhando com Declaraes 188

COMANDOS DE CONTROLE
VISO GERAL

Para adicionar poder s suas macros e lhe dar controle completo sobre quais aes
suas macros fazem, voc precisa ser capaz de usar as seguintes declaraes do Visual
Basic:

Do..Loop
For..Next
For Each..Next
While..Wend
GoTo
With..End With
IF..Then
Selecionar Case

Por exemplo, usando declaraes Do e For lhe permite repetir um conjunto de


declaraes novamente, sem que duplic-las muitas vezes na sua macro. A declarao If
uma dos comandos mais importantes e mais poderosos do Visual Basic. Ele permite o
Visual Basic tomar decises como quais declaraes executar baseado nos testes que voc
especificou. O comando With permite-lhe escrever declaraes do Visual Basic de uma
maneira curta que minimiza a digitao.
O que segue so os tpicos deste captulo:

Tests Expressions
Boolean Tests And Numbers
Arithmetical Test Operators Logical
Test Operators
The Object Test Operator
Testing Using The Not Operator
Using Parentheses With Tests
Testing Using The Not Operator
String Tests If..Then
Statements
Do..Loop Statements
For..Next Statements
For Each..Next Statements Goto
Statements
While..Wend Statements
Stopping Macros That Won't Stop
With..End With Statements
The Selecionar Case Statement
Nesting Commands
Condition Statements For Objects
EXPRESSES TESTES
Lies de VBA do Excel 189

Muitos dos comandos de controles do Visual Basic exigem que voc construa um
teste ou especifique uma condio que retorne um resultado True ou False. Por exemplo,
in the seguinte macro the expresso ActiveCell.Value > 0 is a teste:

Sub TestExample
If ActiveCell.Value > 0 Then
MsgBox ActiveCell.Value
End If
End Sub

Se a clula ativa contm o valor 5, ento a caixa de mensagem aparecer. Se o


valor zero ou negativo a declarao MsgBox seguinte a declarao IF acima ser
pulada.

Existem vrias maneiras bsicas que voc pode escrever uma expresso teste:

Expresso 1 operador teste Expresso 2


Especificar uma propriedade Boolean
Especificar uma varivel Boolean
Usar um mtodo ou funo que retorna True ou False

O que segue ilustra os testes Expresso 1 operador teste Expresso 2:

ActiveCell.Value > 0
X >= Y
ActiveCell.Offset(1, 0) = ""

O primeiro teste, ActiveCell.Value > 0, retorna True se o valor na clula ativa


maior do que zero. O segundo teste, X >= Y, retorna True se a varivel X maior que,
ou igual, a varivel Y. O ltimo teste, ActiveCell.Offset(1, 0) = "", retorna true se a
clula uma linha abaixo da clula ativa estiver vazia.
Quando o Visual Basic encontrar um teste, ele primeiro avalia as expresses e da
determina se o teste ou no True ou False. O que segue mostra um exemplo do uso de
um teste para determinar se o boto No selecionado numa mensagem caixa:

Dim response As Integer


response = MsgBox(prompt:="Selecionar Um Boto", Buttons:=vbYesNo)
If response = vbNo Then
MsgBox "Voc selecionou o Boto No"
Else
MsgBox "Voc selecionou o Boto Sim"
End If
Exit Sub

O teste no exemplo acima "response = vbNo". Se o usurio selecionar o boto No


quando a caixa de mensagem for mostrada, a varivel response definida igual a vbNo.
Lio #02 Trabalhando com Declaraes 190

O Visual Basic vai ento a prxima declarao e avalia a expresso teste. Desde que a
response igual a vbNo, o teste avalia para True e a declarao seguinte ao Then
executada. Se voc clicar o boto Yes, ento o VB pula para a declarao Else e roda o
cdigo seguinte a ele.
TESTES BOOLEAN
A propriedade Boolean uma propriedade que tem um valor True ou False. O
que segue so exemplos de propriedades Boolean que podem ser usados como um teste:

Propriedade If True
ActiveCell.Font.Bold Clula est negritada
ThisWorkbook.Saved Arquivo no tiver sido modificado

O que segue ilustra o uso de um valor Boolean como um teste. O teste a


expresso ActiveCell.Font.Bold.

If ActiveCell.Font.Bold Then
ActiveCell.Font.Underline = xlSingle
Else
ActiveCell.Font.Underline = xlNone End
If

Se a clula negritada, ActiveCell.Font.Bold, retornar True. Isto torna o teste true


e a prxima declarao executada. Se ela no for negritada, ActiveCell.Font.Bold retorna
False e o Visual Basic salta para a declarao Else e executa the cdigo seguinte a ela
em vez disso.

Uma varivel Boolean como uma propriedade Boolean no que ela tambm tem
um valor True ou False. Se voc declarou uma varivel como uma varivel Boolean, a
ela dado um valor inicial de False. Geralmente um teste de alguma sorte usado para
definir a varivel Boolean para True ou False. Ento a varivel Boolean usada mais
tarde na macro. Isto est ilustrado na seguinte macro:

Dim fazerCorrees As Boolean


Dim clula As Range
For Each clula In Range("A1:A20")
If IsError(clula.Value) Then
fazerCorrees = True Else
fazerCorrees = False
End If
If fazerCorrees Then
'declaraes
End If
Next clula
Lies de VBA do Excel 191

As "declaraes" acima podem ser quaisquer declaraes que voc queira. Por
exemplo, elas podem ser declaraes que mostrem caixas de mensagem ou mudem os
valores de outras clulas. Coloque ai sua prpria declarao no lugar de "declaraes"
como um exerccio.
Existem dois testes nas declaraes acima. O primeiro teste para ver se a clula
um valor erro. Se ela for a varivel Boolean doCorrections definida para True caso
contrrio ela definida para False. Posteriormente na macro o valor doCorrections
testado numa declarao If para determinar se certas declaraes adicionais deveriam ser
executadas.
TESTES BOOLEAN E NMEROS
Testes usando valores Boolean, True ou False, so quase sempre simples e fceis
de se usar. Entretanto, o Visual Basic considera True ser igual a menos um e False ser
igual a zero. Se voc inadvertidamente comparar um nmero a um valor Boolean, voc
pode end up with your macro doing o oposto do que voc quer fazer.
Variveis Boolean podem ser comparadas somente com outras variveis Boolean
ou s variveis declaradas como Variant. Comparar com uma varivel string resultaria
num erro de execuo.
OPERADORES DE TESTES ARITMTICOS
O que segue so os operadores de testes aritmticos que voc pode usar nos
testes de expresses: Expresso1 Operador Expresso2, onde o Operador pode ser
qualquer um dos seguintes:

Operador resultado do Teste


= > True se a primeira expresso for igual segunda
< True se a primeira expresso for maior que a segunda
True se a primeira expresso for menor que a segunda
>= True se a primeira expresso maior que ou igual segunda
<= True se a primeira expresso menor que ou igual
<> segunda True se a primeira expresso no for igual a
segunda

Por favor note que o sinal de igual numa expresso teste no o mesmo que o
sinal de igual quando se define uma varivel igual a um valor. Quando uma varivel
estiver sendo definida para um valor, ela est normalmente como uma palavra mais a
esquerda numa linha. Se um teste estiver sendo feito, existe uma palavra chave do
Visual Basic como If, Do, ou While na frente da primeira varivel. No seguinte,

If X = 5 Then
'declaraes
End If

a declarao X = 5 um teste para ver se X 5. No definir X igual a 5.


Lio #02 Trabalhando com Declaraes 192

Se voc escrever os testes >=, <= e <> na ordem errada ( =>, =< ou ><), o Visual
Basic automaticamente corrigir a ordem quando voc mover para uma outra linha.
OPERATORES DE TESTES LGICOS
Os operadores lgicos And, Or, Eqv, Imp, e Xor podem ser tambm usados para
construir testes complexos. Por exemplo, the seguinte uses the And operador to join
duas testes. If both testes are true (the ativa clula contains an entry e the clula below it
also contains an entry) the equivalent of pressionar End down arrow para mover-se para
o final de um bloco de clulas executado.

If ActiveCell <> "" And ActiveCell.Offset(1,0) <> "" Then _


ActiveCell.End(xlDown).Select

O uso de Offset(row, column) e End(direction) so cobertos no captulo sobre


trabalhando com range de clulas.
O que segue ilustra o uso mais complexo dos operadores lgico. Neste exemplo,
as variveis Boolean X, Y, e Z j foram definidas anteriormente numa macro.

If X And Y And Z Then declaraes


End If

No que est acima, a expresso teste

X And Y And Z

retornar True somente se todas trs variveis Boolean forem True. Se o teste fosse

X Or Y Or Z

Ento ela retornar True se qualquer uma das trs variveis for True.

A sintaxe para uma expresso teste usando um operador lgico :

expresso 1 operador lgico expresso 2

O que segue o que a expresso acima retorna para cada um dos operadores
lgicos
:
Operador
Lgico Resultado doTeste
And Retorna True se a expresso 1 e 2 forem ambas True. Caso contrrio False
retornado.
Or Retorna True se a expresso 1 ou 2 forem True. Caso contrrio False retornado.
Xor Retorna False se as expresses 1 e 2 forem ambas True ou ambas False. Retorna
True se uma expresso True e a outra False.
Lies de VBA do Excel 193

Eqv Retorna True se as expresses 1 e 2 forem ambas True ou ambas False. Retorna
False se uma expresso True e a outra False.
Imp Retorna True se a expresso 1 True e a Expresso 2 False. Caso contrrio
False retornado.
O OPERADOR DE TESTE DE OBJETO
O operador Is usado para comparar variveis objeto. Se voc usar Is para
comparar variveis no-objeto, voc provavelmente travar o Microsoft Excel. Um teste
Is retorna True se ambas expresses referirem ao mesmo objeto. Voc tambm pode
usar o operador Is para ver se uma varivel objeto fora atribuida a um objeto. Por
exemplo, o seguinte usa a expresso teste "cellToUse Is Nothing" para ver se o usurio
selecionou uma clula ou um range de clulas quando a caixa de entrada de dados for
mostrada:

Dim cellToUse As Range


On Error Resume Next
Set cellToUse = Application.InputBox _
(prompt:="Selecionar a clula range", _
type:=8) On
Error GoTo 0
If cellToUse Is Nothing Then
MsgBox "Nenhum range selecionado"
Exit Sub
End If
'declaraes a executarem se um range foi selecionado

Isto testa para ver se um range de clulas fora atribuido a uma varivel cellToUse.
A palavra chave Nothing representa a ausncia de um objeto. Set usado pois um objeto
est sendo atribuido a uma varivel.
A razo para a declarao On Error Resume Next (chamada de uma cilada de erro)
no que est acima para impedir uma mensagem de erro de aparecer se cancelar for
selecionado na caixa de entrada de dados.
Note que uma declarao On Error GoTo 0 imediatamente usada para remover
esta cilada de erro de modo que ela no se aplica s declaraes futuras. Manipuladores
de erros discutido em detalhes num captulo posterior.
USANDO PARNTESES COM TESTES
Quando voc construir testes, voc pode use combinaes dos testes acima. E,
voc pode usar parnteses para controlar como os testes so avaliados. Sem parnteses,
os testes so avaliados da esquerda para a direita. Por exemplo:

Expresso 1 And (Expresso 2 Or Expresso 3)

faria o Visual Basic avaliar a expresso no primeiro parnteses. Sem os parnteses, o


Visual Basic avaliaria o primeiro teste
Lio #02 Trabalhando com Declaraes 194

Expresso 1 And Expresso 2

Ele avaliar ento este resultado primeiro com o operador Or e Expresso 3. Por
exemplo, se Expresso 1 False, Expresso 2 True e Expresso 3 True, o teste
acima com os parnteses avaliaro para False. Sem os parnteses ele avaliar para True.
Escrever o teste com e sem parnteses e substituir estes valores para provar esta
declarao.
TESTANDO O USO DO OPERADOR NOT

O operador Not usado para converter um resultado True para um valor False e
vice versa. Por exemplo, se a varivel X tem o valor 7, o teste Not X > 0 retorna False.
O teste

ActiveCell.Value = ""

retorna True se a clula est vazia. O teste

Not ActiveCell.Value = ""

retorna True se a clula no est vazia. Uma clula pode parecer vazia e conter espaos.
Neste caso o que est acima retornar True, pois espaos so os mesmos que letras. Voc
pode use parnteses with the Not operador. Por exemplo:

Not (X = 0 And Y = 0)

o Visual Basic avaliar primeiro (X = 0 And Y = 0). Se este avaliar para False,
ento Not False retorna True. Se ele avaliar para True, ento Not True retorna False. Se
no existise parnteses no que est acima,

Not X = 0 And Y = 0

o Visual Basic primeiro avaliar X = 0. Da ento ele aplicar o operador Not ao


resultado antes de continuar avaliando a declarao. Se X fosse 1 e Y fosse 1, a
expresso com os parnteses avaliar para True. A expresso sem os parnteses avaliar
para False.
TESTES DE STRING
Testes no so limitados a testes numricos. Voc tambm pode fazer testes de
string. Entretanto, testsusing strings are mais complex than numeric testes. Os testes
numricos so muito fceis de se entender pois nmeros so fceis de se lidar. Entretanto,
testes de string devem tambm levar em conta o seguinte:

Uma capitalizao da string.


Lies de VBA do Excel 195

ou no final
da string.

A definio default no Visual Basic fazer os testes string em case sensitive. Isto significa
que os seguinte testes

"ABC" = "abc"
"Linda" = "linda"

retornam False, no True. Para tornar um teste string case insensitive, voc pode fazer
uma das duas coisas:

Colocar a declarao opo Option Compare Text no topo do seu mdulo, antes de
quaisquer macros ou funes.
Converter as expresses para o mesmo case usando o UCase, LCase, ou
Application.Proper para converter o case para maisculas, minsculas ou proper case
quando voc escrever o teste. Por exemplo:

UCase(string) = UCase(string)

converte as strings para maisculas e ento faz o teste.

Se as strings so do mesmo case, mas de diferentes tamanhos, um teste string tambm


retornar False. Por exemplo o teste seguinte

"ABC" = "ABC "

retornar False pois a primeira expresso de tamanho 3 caracterees e a segunda de


tamanho quatro caracterees. You will find that many of the text strings given to your
macros via caixas de entrada ou read from clulas include extra spaces. To remove extra
spaces, included extra spaces in between palavras, use the function Application.Trim. A
Application.Trim remove quaisquer leading e trailing spaces e quaisquer espaos extra
numa string texto. Por exemplo:

" May 1 " becomes "May 1". O que segue mostra you could use it to remove extra spaces
from user input:

textEntered = InputBox("Entrar com a descrio do produto")


textEntered = Application.Trim(textEntered) If textEntered =
"" Then Exit Sub

Voc pode evitar o uso de variveis e usar as funes Application.Trim e Ucase


diretamente num teste como o teste seguinte ilustra:
Lio #02 Trabalhando com Declaraes 196

Application.Trim(Ucase(string1)) = _
Application.Trim(Ucase(string2))

Se voc usar comparaes tais como > ou < num teste de string, o Visual Basic
compara a string alfabeticamente. Se as duas strings so as mesmas exceto o
comprimento, a string mais curta considerada menor que a string mais longa. Se as
strings forem idnticas exceto o case, strings minsculas so consideradas maiores que as
strings maisculas.
O operador Like usado para comparar strings e ver se um string pattern
encontrada dentro de uma string. A sintaxe de um teste Like :

string Like pattern

O caracteree "*" pode ser usado para representar mltiplos caracterees na pattern string.
O caracteree "?" pode ser usado para representar caracterees nicos e "#" pode ser usado
para representar nmeros nicos. O que segue ilustra vrios testes Like:

Teste Resultado
"abc" Like "a*c" True
"abdc" Like "a?c" False

O segundo teste False porque o ponto de interrogao representa um nico


caracteree. Which means that a?c is just three caracterees e est sendo comparado a
quatro caracterees, "abcd"".
Por favor note que os testes sero case sensitive a menos que a declarao Option
Compare Text esteja no topo do mdulo.
Informao detalhada sobre o operador Like pode ser mostrada colocando o cursor
sobre o operador Like e pressionando F1 para mostrar a informao de ajuda do Visual
Basic sobre este operador.
DECLARAES IF..THEN
A declarao If..Then permite uma macro tomar decises como qual comando
dever ser executado. Por exemplo, voc pode querer to carry out uma srie de
declaraes somente se um teste particular for true. Ou parar a macro ou fazer um
conjunto diferente de declaraes se o teste no for true.

O que segue ilustra a sintaxe da declarao If..Then:

Syntax 1 If Test Then declarao se true Else declarao se false


Syntax 2 If Test1 Then declaraes If Test1 True ElseIf Test2 Then
declaraes If Test2 True ElseIf testN Then declaraes If TestN
True Else
declaraes se nenhum teste True
End If

As declaraes ElseIf e Else so opcionais. O que segue ilustra a primeira sintaxe:


Lies de VBA do Excel 197

If Y = 0 Then X = 0 Else X = 1

Sintaxe 1 acima a forma de linha nica da declarao If..Then e usada para testes
simples e curtos. A declarao Else expresso opcional. O que segue ilustra em linha
nica as declaraes If..Then que no usam a declarao Else:

If ActiveCell.Value > 20 Then ActiveCell.Font.Bold = True ou


If ActiveCell.Value > 20 Then _
ActiveCell.Font.Bold = True

Note que a forma de linha nica no termina com uma End If, mesmo se um
caracteree continuao for usado. Tambm, o uso de um caracteree continuao no muda
de uma forma de linha nica para uma forma de mltiplas-linhas. Um End If no exigido
na forma linha nica, e se entrado causar uma mensagem de erro.
O que segue ilustra a other sintaxe para uma declarao If, a forma multi-linha.

If teste Then
declaraes a executar se o teste acima true
End If ou: If teste Then
declaraes a executar se o teste acima true Else
declaraes a executar se o teste acima false
End If ou: If teste Then
declaraes a executar se o teste acima true ElseIf teste
Then
declaraes a executar se o teste acima true ElseIf
teste Then
declaraes a executar se o teste acima true Else
declaraes a executar if nenhum teste for true
End If

Na forma de linha mltipla da declarao IF..Then a palavra Then imediatamente


segue cada teste e a ltima palavra da linha . Voc achar que uma declarao multi-
linha If..Then muito mais robusta que a forma linha nica e lhe d muito mais poder
para decidir que aes tomar. Voc pode tantas declaraes ElseIf quanto voc precisar .
Tambm, a declarao final Else opcional.
Se uma declarao seguir o Then numa declarao multi-linha If..Then, ento o
Visual Basic pensa que voc est usando a forma de linha nica da declarao If..Then.
Quando ela ento encontrar um Else, ElseIf ou End If um erro ocorrer. Por exemplo,
the cdigo seguinte resultar num erro porque o Visual Basic no sabe o que fazer com
o Else pois a primeira linha uma declarao completa.

If X > 5 Then Exit Sub


Else declaraes
End If
Lio #02 Trabalhando com Declaraes 198

O que segue a mensagem de erro que voc ver se voc rodar a macro acima:

A ordem em que voc escreve uma declarao multi-linha If..Then muito


importante. O Visual Basic executar as declaraes para o primeiro teste que true e
ento pular para a primeira declarao aps a declarao End If. Por exemplo, a macro
que segue projetada para negritar clulas maiores que 20, sublinhar aquelas entre 15 e
20, e mudar a fonte daquelas entre 10 e 15 para azul. Entretanto, ela no funciona
corretamente. Por que voc ver?

Sub IfTestDemo()
Dim X As Variant
X = ActiveCell.Value
'remover qualquer formatao sobre a clula ativa:
ActiveCell.ClearFormats
'Testar e mudar o formato da clula
If X > 10 Then
ActiveCell.Font.ColorIndex = 5
ElseIf X > 15 Then
ActiveCell.Font.Underline = xlSingle ElseIf X
> 20 Then
ActiveCell.Font.Bold = True
End If
End Sub

O que acontece que todas as clulas maiores do que 10, mesmo aquelas com
valores maiores do que 15 ou maior que 20, tm suas cores de fontes mudadas para azul.
Entretanto, nenhuma das clulas so negritadas ou esto sublinhadas. O que acontece
que o primeiro teste If true no somente para clulas cujos valores esto entre 10 e 15,
mas tambm para clulas com valores maiores que 15. Assim os outros dois testes nunca
sero atingidos. Somente as declaraes para o primeiro teste true so executadas num
conjunto de declaraes If..End If.
Uma maneira alternativa de se escrever o que est acima to insure qua a ao
correta tomada e que a inteno da macro facilmente entendida est ilustrada pela
seguinte macro. Esta usa testes de ligao pelo operador And.

Sub IfTestDemo() Dim X


As Variant
X = ActiveCell.Value
'remover qualquer formatao sobre a clula ativa:
ActiveCell.ClearFormats
Lies de VBA do Excel 199

'Testar e mudar o formato da clula


If X > 10 And X <= 15 Then
ActiveCell.Font.ColorIndex = 5 ElseIf X
> 15 And X <= 20 Then
ActiveCell.Font.Underline = xlSingle
ElseIf X >20 Then
ActiveCell.Font.Bold = True
End If
End Sub
DECLARAES DO..LOOP

Um Do..Loop usado para repetir uma srie de declaraes over e over again.
Ela comea com a palavra Do e termina com a palavra Loop. Entre as palavras Do e
Loop voc entra com um conjunto de declaraes para realizar as aes que voc quiser.
O que segue ilustra a forma mais simples de um Do..Loop:

Do declaraes If
teste Then Exit Do
declaraes
Loop

Tal como um Do..Loop repetir as declaraes at que o teste seja true e a


instruo Exit Do seja executada para parar o lao. Quando o Exit Do for executado, o
comando continua na primeira declarao seguinte declarao Loop.
O que segue ilustra usando o estilo Do..Loop acima para inserir linhas em branco
a cad cinco linhas, at que uma clula em branco seja encontrada:

Sub InsertRowsExample1()
Dim cellToUse As Range
Set cellToUse = ActiveCell.Offset(5, 0)
'Set is usado to assign a Range varivel to its objeto,
'neste caso a clula 5 rows pertence clula ativa
Do
If cellToUse.Value = "" Then Exit Do cellToUse.EntireRow.Insert
Set cellToUse = cellToUse.Offset(5, 0)
Loop
End Sub

Voc tambm pode usar as palavras chave While e Until com um Do..Loop para
especificar um teste que checado quando o Do..Loop for rodado. O que segue ilustra o
uso desta abordagem:

Do While teste true


declaraes Loop ou:
Do Until teste true declaraes
Loop
Lio #02 Trabalhando com Declaraes 200

Na sintaxe acima, o teste primeiro verificado e ento as declaraes estando entre


as declaraes Do e o Loop so rodadas se o teste for true. Se voc quiser rodar as
declaraes entre as declaraes Do e o Loop no mnimo uma vez antes de verificar o
teste, coloque as declaraes While e Until no final do loop. Por exemplo:

Do declaraes
Loop While teste true
ou: Do declaraes
Loop Until teste true

Also, voc pode include an If declarao among the declaraes between the Do
and the Loop declaraes that triggers an Exit Do declarao in a Do..Loop that uses a
While ou Until declarao. This allows you to exit the Do..Loop based on a diferente
teste declarao.
O que segue macro also inserts blank rows every five rows, but uses a While
declarao to determine when to stop instead of an If declarao.

Sub InsertRowsExample2()
Dim cellToUse As Range
Set cellToUse = ActiveCell.Offset(5, 0) Do
While cellToUse.Value <> ""
cellToUse.EntireRow.Insert
Set cellToUse = cellToUse.Offset(5, 0)
Loop
End Sub
DECLARAES FOR..NEXT
Um dos problemas com o Do..Loops determinar quantas vezes os comandos
faro o lao. A declarao For..Next resolve este problema especificando o nmero de
iteraes que ocorrer. O que segue ilustra uma simples declarao For..Next:

Sub ForDemo()
Dim I As Integer For I
= 1 To 5
MsgBox "Al " & I
Next
End Sub

Quando esta macro rodar ela mostrar uma caixa de mensagem que diz al cinco
vezes. A varivel "I" atua como um contador. Ela definida inicialmente para um, e da
atravs de cada iterao do For..Next ela incrementada por um. O For..Next pra de
fazer o lao depois que I ficar igual a 5 (mas as declaraes so rodadas quando I for
igual a 5).
O que segue a sintaxe tpica da declarao For..Next

For counter = start nmero To end nmero


declaraes Next counter
Lies de VBA do Excel 201

Counter uma varivel que serve como um contador de lao. Geralmente, uma
varivel chamada "Counter", ou uma nica letra varivel tal como "I", "J", ou "K" so
usadas para a varivel counter. Colocar o nome da varivel counter aps a declarao
Next opcional, mas uma boa maneira de documentar qual lao For..Next que o Next
pertence. Se voc colocar o nome counter aps a declarao Next, o Visual Basic
confirmar que existe um correspondente For que usa aquele nome particular de counter
e mostra uma mensagem de erro se no puder encontr-lo.
O nmero Start o nmero que voc gostaria de usar como ponto de partida do
lao For..Next. Normalmente, o nmero "1". O nmero End o valor final para o
Counter.
Se voc quiser, voc pode especificar quanto incrementar o contador usando a
palavra chave Step como parte da declarao For:

For I = 1 To 10 Step 2 declaraes


Next

Se Step for deixado de fora, a varivel counter incrementada por um em cada


lao. Voc tambm pode usar um valor negativo para o Step iniciar com um grande
nmero inicial para o contador que decresce para um pequeno nmero final. Por exemplo:

For I = 10 To 1 Step -1 declaraes


Next

Se voc quiser, voc pode especificar variveis que tenham sido atribuidas
valores para comear com nmero, terminar com nmero, e step nmeros ao contrrio
das entradas de nmeros para estes valores. Ou voc pode usar a propriedades que
retorna nmeros tais como a propriedade Count ou a propriedade Rows. Desta maneira,
sua macro pode determinar o nmero de vezes a repetir o procedimento For..Next. Por
exemplo:

iStart = 5 iEnd
= 22
For I = iStart To iEnd declaraes
Next I

Se voc quiser permitir um lao anterior For..Next, ento voc pode fazer isto
usando a declarao Exit For. Geralmente, isto feito com uma declarao If..Then. Por
exemplo:

For I = 1 To 10 declaraes
If teste is true Then Exit For
declaraes Next I
DECLARAES FOR EACH..NEXT
Lio #02 Trabalhando com Declaraes 202

A declarao For Each..Next lhe permite repetir um conjunto de aes sobre os


elementos individuais de uma coleo ou array. Por exemplo, se voc selecionar um
range de clulas, ento este comando lhe permitir repetir um conjunto de comandos em
cada clula no range. Um outro exemplo seria repetir um conjunto de aes sobre as
planilhas numa pasta.
O que segue a sintaxe tpica para a declarao For Each..Next:

For Each elemento In a coleo


declaraes Next counter

Por exemplo um range de clulas uma coleo de clulas. O que segue far o
lao por cada clula na sua seleo e mostrar seu valor numa caixa de mensagem:

Sub ShowConstantValue()
Dim clula As Range
For Each clula In Selection
MsgBox clula.Value
Next
End Sub

Uma coleo um grupo de objetos parecidos. Por exemplo, um range de clulas


ou the planilhas numa pasta. Um elemento um nome varivel que usado para
identificar um indivduo numa coleo. Por exemplo, uma clula ou planilha individual
pode ser um elemento. A varivel nome que voc der ao elemento pode ser descritivo,
por exemplo "clula" quando se referir a uma clula individual. Ou o nome pode ser
genrico, por exemplo "X" ou "item". Por favor note que certas palavras no podem ser
usadas, tais como Sheet ou Workbook pois estas so palavras chaves do Visual Basic. A
tabela que segue lista alguns dos nomes que eu prefiro usar para as diferentes colees:

Variable Name for A


Nome da Coleo Membro da Coleo
WorkSheets wkSheet range of clulas
clula
Sheets oSheet
Charts oChart ou cht
WorkBooks wkBook ou oBook
ChartObjects oChart ou cht

Se voc quiser deixar o lao anterior For Each..Next, ento voc pode fazer isto usando a
declarao Exit For. Geralmente, isto feito com uma declarao If..Then. Por exemplo:

If teste true Then Exit For

Quando uma declarao Exit For executada, o Visual Basic salta para a primeira
declarao seguinte declarao Next.
Lies de VBA do Excel 203

Se voltar e olhar a macro MathAction do captulo 4, voc ver que ela usou o
comando For Each..Next para circular por cada clula na seleo. O que segue ilustra
um comando For Each..Next que torna em negrito todas as clulas que tenham um valor
maior do que 20 e desenha uma caixa pontilhada ao redor delas. Se o valor for menor do
que ou igual a 20, qualquer negrito e bordas sero removidos.

Sub BoldCells()
Dim clula As Range
'fazer o lao por cada clula na seleo
For Each clula In Selection
If clula.Value > 20 Then
'fazer a fomatao se o teste for true
clula.Font.Bold = True clula.Borders.LineStyle
= xlThin
Else
'remover a formatao se o teste for false
clula.Font.Bold = False
clula.Borders.LineStyle = xlNone End If
Next
End Sub

A macro que segue define o zoom em todas as planilhas numa pasta para a
mesma definio de zoom, e retorna voc folha que voc estava quando a macro
comeou. Ela tambm ilustra o uso da coleo de planilhas na pasta ativa.

Sub SetZoom()
Dim currentSheet As WorkSheet Dim desiredZoom
Dim wkSheet As Worksheet
'armazenar a folha ativa atual
Set currentSheet = ActiveSheet
'prompt para o zoom desejado. Mostrar a
'definio do zoom atual na caixa de entrada
'obter o zoom desejado. desiredZoom
= InputBox _ (prompt:="Enter
Desired Zoom", _
default:=ActiveWindow.Zoom)
'sair se nenhum valor entrado ou cancelar selecionado
If desiredZoom = "" ou desiredZoom = 0 Then End
'fazer o lao em cada planilha na pasta
For Each wkSheet In ActiveWorkbook.Worksheets
If wkSheet.Visible Then
'faa isto se a folha estiver visvel wkSheet.Selecionar
ActiveWindow.Zoom = desiredZoom
End If
Next
'retornar folha inicial currentSheet.Selecionar
End Sub
Lio #02 Trabalhando com Declaraes 204

Se voc quiser rodar a macro acima numa folha de grficos, ento voc muda a
linha For Each para para ler:

For Each chtSheet In ActiveWorkbook.Charts

A macro que segue ilustra o uso de um lao For Each..Next para selecionar cada
grfico que est embutido numa planilha e visualizar o grfico de modo que voc possa
decidir se voc quer imprimir ou no.

Sub PreviewCharts()
Dim oChart As Object
For Each oChart In ActiveSheet.ChartObjects
oChart.Activate ActiveChart.PrintPreview
Next
End Sub

Se voc quiser imprimir os grficos sem visualizao, ento mude o PrintPreview


para o PrintOut. Se voc deparar com um problema onde voc obtem uma mensagem de
erro "Printout Method of Application Class Failed" aps imprimir 4 a 5 grficos, coloque
a seguinte declarao dentro do lao:

Application.Wait Now + TimeValue("00:00:10")

Isto adiciona um atraso de dez segundos entre os grficos para permitir a limpeza
do buffer da impressora..
DECLARAES GOTO
Uma declarao GoTo permite-se desviar uma macro para qualquer linha
daquela macro. Voc no pode us-la para sair de uma macro. A sintaxe da declarao
GoTo muito simples:

GoTo Line Number ou


GoTo Line Label
Por exemplo:
GoTo 100
ou GoTo NextStep

Uma linha nmero um nmero nico que voc usa para identificar um linha no
seu mdulo. Ela no se refere ao nmero real de linhas quando voc contar do topo. Nem
tem as linhas de nmeros que estarem em ordem. Ela apenas um identificador numrico
de uma localizao. Uma linha rtulo pode ser qualquer combinao de caracterees
(exceto caracterees especiais como *, $, etc..) que comecem com uma letra e terminem
com dois pontos. Linhas de rtulo so usadas muito mais freqentemente do que linhas
de nmeros, pois elas conduzem mais significado. O que segue so exemplos de linhas
de nmeros e linhas de rtulos:
Lies de VBA do Excel 205

100
200
ErrorMsg:
ExitCommands:

Cada linha rtulo e linha de nmero deve ser nica dentro de um mdulo. Lihas
de rtulos no so case sensitive e seguem as mesmas regras de nomeao que as
variveis.
O uso mais comum de uma declarao GoTo desviar para uma linha de rtulo
quando um erro ocorrer. O que segue ilustra este uso de uma declarao GoTo:

Sub SuaMacro()
'especificar qual rtulo ir se existir um erro On
Error GoTo ErrorRoutine
'executar as declaraes da macro
'sair da macro se nenhum erro ocorrer
Exit Sub
'venha pr c se um erro ocorrer
ErrorRoutine:
MsgBox "Ocorreu um Erro. Atividade paralizada"
End Sub

Rotinas de erros que voc escrever podem ser muito mais elaboradas do que
aquela acima. Manipulao de erros discutida em detalhes no ltimo captulo.
Por favor saiba que muitas declaraes GoTo tornaro uma macro difcil de
entender e de se removerem erros se alguma coisa estiver errada. Voc geralmente
ficar numa situao melhor usando declaraes If..Then, Do..Loops, e comandos
For..Next.
DECLARAES WHILE..WEND
A declarao While..Wend muito semelhante ao Do While..Loop. O que segue a
sintaxe para esta declarao

While teste declaraes


Wend

Para sair de um lao While..Wend, o teste deve tornar-se falso ou uma declarao
GoTo deve ser usada. Por exemplo:

Sub WhileExample()
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
If ActiveCell.Row > 100 Then GoTo nextStep
Wend nextStep:
'Macro continua daqui
End Sub
Lio #02 Trabalhando com Declaraes 206

PARANDO MACROS QUE NO QUEREM PARAR

Mais cedo ou mais tarde voc escrever um Do..Loop ou a For..Next que nunca
pra a execuo do lao. Isto acontece se o teste parar o nunca for encontrado, ou se
alguma coisa no lao est reiniciando o contador de lao. Quando isto acontecer, sua
macro kfica rodando e rodando at um erro run-time ocorrer ou voc interromp-lo. O
modo mais simples de interromper um lao infinito pressionar a tecla ESC. (Voc pode
precisar pressionar repetidamente se a macro emitir o comando recalcular). Isto far a
seguinte caixa aparecer:

At este ponto, voc pode:


acro selecionando o End .
Fazer a macro continuar selecionando o boto Continue.
Ir para mode debug e ir dando os passos pela macro selecionando o boto Debug.
Selecionar o boto Goto e ir linha que era para ser executada quando voc parou a
macro.
Mostrar a informao ajuda que realmente no ajudar voc com o problema com a
sua macro.

Por favor note que se seu lao mostrar continuamente uma caixa de mensagem,
voc no dever ser capaz de pressionar a tecla ESC rpido o suficiente para interromper
o lao (Eu sei, isto tem acontecido comigo!). Se isto acontecer, voc deve fechar o Excel,
o qual dever exigir desligar seu computador. Assim, antes de voc testar uma macro
contendo um lao, voc dever salvar o seu arquivo. Se voc tiver uma macro "run away"
que no ir parar de executar, e pressionar o ESC e ele no funcionar, voc tem uma
alternativa: Se o Visual Basic editor est aberto, voc pode ir para ele e clicar o boto
reiniciar (aquele um com o cone quadrado) para parar a macro.
Isto para a macro. Ele fecha tambm os user forms que no quer fechar.
DECLARAES WITH..END WITH
Lies de VBA do Excel 207

A declarao With..End With usada para executar uma srie de declaraes sobre
um nico objeto sem ter que digitar nome do objeto em cada declarao Tais declaraes
simplificam o cdigo e torna as macros ligeiramente mais rpidas.

No captulo 5 voc viu as declaraes With..End With usadas com as propriedades


de PageSetup. Its use avoided having escrever a palavra PageSetup 34 vezes. O que
segue a sintaxe tpica de uma declarao With..End With:

With objeto declaraes


End With

O que segue ilustra como usar uma declarao With..End para especificar a propriedade
fonte de uma clula:

With ActiveCell.Font
.Name = "Courier New"
.FontStyle = "Bold"
.Size = 12
.Underline = xlSingle
.ColorIndex = 5
End With

O que segue atinge o mesmo resultado, mas exige muito mais digitao:

ActiveCell.Font.Name = "Courier New"


ActiveCell.Font.FontStyle = "Bold"
ActiveCell.Font.Size = 12
ActiveCell.Font.Underline = xlSingle
ActiveCell.Font.ColorIndex = 5

Declaraes With..End With podem ser muito mais complexas do que aquelas acima, e
podem ter declaraes Do..Loops, If e outras declaraes entre as declaraes With e a
End With. Por exemplo:

With ActiveCell
If .Value > 1000 Then
.Borders.Weight = xlThin
ElseIf .Value > 100 Then
.Borders.Weight = xlMedium
ElseIf .Value > 1 Then
.Borders.Weight = xlThick End
If
End With

Por favor note que voc pode embutir um With..End With dentro do outro.
Entretanto, voc deve ser cuidadoso!
Lio #02 Trabalhando com Declaraes 208

A DECLARAO SELECT CASE

A declarao Selecionar Case freqentemente usada em vez de uma


declarao If..Else. A Selecionar Case um teste If no formato de tabela, e
perfeitamente ajustado para selecionar de um conjunto de opes dependendo do valor
de uma nica varivel. O que segue a sintaxe tpica da declarao Selecionar Case:

Selecionar Case Variable Value


Case Value Range 1
declaraes Case
Value Range 2
declaraes Case
Value Range n
declaraes Case
Else declaraes
End Selecionar

As palavras Selecionar Case e End Case so exigidas para iniciar e parar uma
declarao Selecionar Case. Somente uma declarao Case Simples exigida. A
declarao Case Else opcional. Declaraes mltiplas podem ser colocadas entre cada
declarao Case. Por favor note que voc no pode misturar valores numa declarao
case se voc misturar nmeros e strings, co obter uma mensagem de erro "Tipos
incompatveis" quando voc executar a sua macro.

Voc tambm pode escrever a declarao Selecionar Case no seguinte formato,


se voc tiver apenas uma declarao que voc queira executar para um dado caso. Note
que dois pontos so usados para separar o teste case da declarao da macro que ser
executada.

Selecionar Case Variable Value


Case Value Range 1: Statement
Case Value Range 2: Statement
Case Value Range n: Statement
Case Else: Statement
End Selecionar

Usando dois pontos permite voc colocar duas ou mais declaraes numa linha.
O Visual Basic remover quaisquer espaos na frente dos dois pontos.
A declarao que est acima pode ser muito simples, tal como definir um valor
para uma varivel. Ou ela pode ser a declarao que chama uma outra macro. Esta
segunda abordagem permite voc manter a suas declaraes Selecionar Case compactas,
mas permite tambm que elas sejam muito poderosas.
A tabela que segue ilustra as declaraes de range de valor usadas com a
declarao Selecionar Case:
Lies de VBA do Excel 209

Um Range de Valor pode ser por exemplo: Um


nico valor - Case 3
Uma srie de valores separados por vrgulas - Case 4,5,6
Um range de valores expressos como valor1 At valor2 - Case 7 To 11
Um range teste expresso como teste Is de operador de valor - Case Is >12
Qualquer combinao destas expresses
Os valores Case podem tambm estar em ordem alfabtica:

Case "Level 1"


Case "Level 2B", "Level 3"

Testes com valores alfabticos sero case sensitive a menos que voc tenha
posto uma declarao Option Compare Text no topo do mdulo ou voc converter todas
as strings e valores case para o mesmo case. Somente o primeiro teste que a match is
that one that ser usado pelo Visual Basic, even if a match possvel num teste
subseqente numa declarao Case. A palavra chave Is exigida para testes range, os
quais so testes que usam operadores aritmticos tais como >, <, >=, < =, ou =.
O que segue ilustra using a declarao Selecionar para determinar a multa que se
deve pagar por ultrapassar 100 km/h:

Sub DetermineFine()
Dim carSpeed As Integer Dim
multa As Integer
carSpeed = Val(InputBox("Entrar com a velocidade do carro")) If
carSpeed = 0 Then Exit Sub
'determinar a multa usando a declarao case
Selecionar Case carSpeed - 100 Case
Is < 1: multa = 0
Case 1 To 5: multa = 10
Case 6 To 15: multa = 50
Case 16 To 25: multa = 100
Case Is >= 26: multa = 200
End Selecionar
MsgBox "A multa $" & multa End
Sub
COMANDOS ANINHADOS
Neste captulo foram ilustrados vrios comandos de controles principais do
Visual Basic. Entretanto, estas ilustraes tiveram somente um nico comando de
controle por vez. Voc tambm pode usar mltiplos comandos de controle, aninhados
um dentro do outro. Por exemplo:

For I = 1 To 5
declaraes For J
= 1 To 10
declaraes Next
J declaraes
Lio #02 Trabalhando com Declaraes 210

Next I

ilustra o aninhamento de um For..Next dentro de outro. O que segue ilustra o aninhamento


de declaraes If:

If Test2 then
If Test2
If Test3
.
.
End If
End If
End If

Voc pode aninhar tantos comandos dentro de outro quanto voc queira. E, voc
pode aninhar diferentes comandos dentro de cada outro. Por exemplo, voc pode aninhar
um Do..Loop dentro de um lao For..Next. Quando aninhar comandos, cuidado que o
contador para cada loop seja nico.
DECLARAES CONDITION PARA OBJETOS
Volta e meia voc precisar escrever uma expresso teste envolvendo um objeto.
Um caso tpico seria ver se o usurio tem selecionado uma clula ou range de clulas
quando prompted a fazer isto por um controle InputBox ou uma refEdit num userform.
Um outro caso tpico seria ver se a declarao Find tem retornado uma clula contendo
a string procurada.
Comparaes de objetos no podem usar operadores de comparao normal tais
como =, >, <, etc.. A palavra chave Is deve ser usada em vez disto. E para ver se uma
varivel objeto tem sido atribuida a um objeto, a palavra chave Nothing deve ser usada.
O que segue ilustra o uso do mtodo Find e um objeto comparao. Voc deveria
escrever a seguinte macro e test-la numa planilha contendo vrias entradas:

Sub Find_A_Match()
Dim textToBeFound As String, msg As String
Dim clula As Range
'mostrar uma aplicao caixa de entrada para obter texto a ser
'encontrado
msg = "Entrar com o texto a ser encontrado" textToBeFound
= Application.InputBox(msg)
'Sair sem uma mensagem se cancelar for selecionado If
textToBeFound = False Then Exit Sub
'determinar se qualquer texto foi entrado
If textToBeFound = "" Then
MsgBox "Nenhum texto foi entrado. Atividade parada."
Exit Sub
End If
'usar o mtodo Find para fazer uma procura. Resultados so
' armazenados na varivel chamada Cell
'Note que voc no precisa especificar um argumento "After"
Lies de VBA do Excel 211

Set clula = Cells.Find(What:=textToBeFound, _


LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
'teste para ver se qualquer texto compatvel foi encontrado
'usando um teste IS
If clula Is Nothing Then
MsgBox textToBeFound & " no encontrado."
Exit Sub
Else 'Se o texto for encontrado, v clula onde est o texto
clula.Select
MsgBox textToBeFound & " encontrado em " & _
cell.Address End If
End Sub

Pontos chaves sobre a macro acima e o mtodo Find:


A sada do mtodo Find um objeto clula. Assim ela pode ser atribuida a uma
varivel usando o comando Set.
Para testar se nada foi encontrado, o que significa que a varivel objeto clula no for
a atribuida, uma comparao usando a palavra chave comparao Is e a palavra
Nothing que representa um no atribuido objeto usado.
Desde que a sada do mtodo Find um objeto clula, as propriedades da clula pode
ser mostrada como ilustrado na ltima caixa de mensagem.
A InputBox Microsoft Excel usada em vez da InputBox Visual Basic porque a
InputBox Microsoft Excel retorna o valor False se o usurio selecionar o boto
cancelar. Se o usurio selecionar o boto cancelar da InputBox do Visual Basic, ela
retorna uma string de tamanho zero (""). Desde que isto o mesmo que no entrar
com qualquer texto e selecionar OK, a InputBox Microsoft Excel permite a macro
diferenciar e aconselhar o usurio do erro. A InputBox Microsoft Excel chamada pela
declarao Application.InputBox. Ambas so cobertas em detalhes no captulo sobre
comandos teis.
O mtodo Find tem argumentos adicionais que podem ser mexidos e acima apenas o
argumento What. Voc poder normalmente definir todos os argumentos. Para mais
informao sobre o mtodo Find, coloque o cursor nele e pressione a tecla F1. Voc
encontrar tambm uma cobertura adicional no captulo sobre comandos teis. O
argumento After clula opcional
SUMRIO
Voc encontrar que quanto mais voc usar os comandos de controle acima,
menores e menores as suas macros vo ficando. Its far mais eficiente e menos trabalho
para escrever macros que usam declaraes Do..Loops, For..Next, e declaraes If than
not using such comandos de controle. Adicionando tais comandos s macros que voc
gravar aumentaro tremendamente para voc as suas utilidades. Sempre que voc
escrever uma macro, voc dever procurar maneiras de usar os comandos acima.
Lio #02 Trabalhando com Declaraes 212

Exatamente como til usar uma macro para eliminar trabalhos repetitivos, usar um
comando de controle tambm til pois ele elimina declaraes desnecessrias de
macros.
213
Fase #3: VBA do Excel Avanado

Lio 3: Trabalhando com Funes


Cdigo VBA do Excel para Funes

Trs tpicos nesta lio:


- usar funes Excel dentro de macros,
- criar novas funes Excel com VBA do Excel e, - usar
funes VBA dentro de macros.
Funes Existentes no Excel
Existem centenas de funes disponveis no VBA. A maioria das funes que voc
encontra no Excel so disponveis nas macros desta forma:
Range("C1").Value=
Application.WorksheetFunction.Sum(Range("A1:A32"))
esta sentena soma os valores da clula A1 a A32 e armazena o total na clula C1. Usar
funes do Excel pelo VBA reduz substancialmente o tempo de clculo e cria folha de
planilha sem frmulas que voc pode mais facilmente enviar aos outros. Novas
Funes Excel
Voc pode criar novas funes no Excel. Por exemplo, a funo criada pelo cdigo abaixo
simplesmente multiplicar o valor de uma clula por 2.

Function fctDouble(varInput)
fctDouble = varInput * 2 End
Function

Uma vez o cdigo desta funo esteja num mdulo da sua pasta voc acessa esta
nova funo da mesma maneira que voc acessa as outras funes do Excel clicando
sobre o cone da funo na barra de ferramenta ou da barra de menu
"Inserir/Funes". Na caixa de dilogo selecione a categoria "Definida pelo usurio" e
selecione sua nova funo ("fctDouble" neste exemplo) e siga as instrues.
Funes VBA
Aqui esto algumas funes VBA que eu uso nas minhas macros Excel: LCase,
Ucase
As declaraes IF, a SELECT CASE e DO WHILE so todas case sensitive.
Quando voc testar uma string de caracterees e voc no souber se o usurio entrar com
letras minsculas, use as funes LCase ou UCase dentro de seu teste e escreva a string
no case apropriado:

If LCase(Selection.Value)= "toto" then... ou


Select Case LCase(Selection.Value) ou
Do While LCase(Selection.Value)<>"toto"
If UCase(Selection.Value)= "TOTO" then... ou
Lio #03 Trabalhando com Funes 214
Select Case UCase(Selection.Value) ou
DO WHILE UCase(Selection.Value)<>"TOTO"

NOW()
NOW () uma funo Excel mas tambm uma funo VBA. Com o seguinte cdigo a
frmula Excel NOW () inserida na clula A1. A clula "A1" mostrar a data do dia e esta
data mudar cada vez que a pasta for aberta:
Range("A1").Formula = "=Now()"
Com o seguinte cdigo, a clula "A1" pegar a data quando o procedimento for executado
e manter este valor at voc executar o procedimento novamente. Ela no mudar cada
vez que voc abrir a pasta.
Range("A1").Value = Now()
Lies de VBA do Excel 215

CRIANDO
FUNES

As funes Definidas pelo usurio (UDF = User Defined Functions) so como as


macros pois elas consistem de declaraes e tambm so chamadas de procedimentos.
Porm, uma funo diferente de uma macro, pois ela retorna com um valor. Uma
funo Definida pelo usurio pode ser usada exatamente como as funes do Microsoft
Excel, quer dizer, includa em suas planilhas eletrnicas e macros para fornecer as
respostas que voc precisa. Voc dever escrever e usar uma funo Definida pelo
usurio toda vez que voc precisar de uma frmula complexa que usada em clulas
mltiplas e est sujeita a mudanas. Uma funo Definida pelo usurio muito fcil de
se manter e pode ser documentada com declaraes de comentrio.

O seguinte so os tpicos deste captulo:

Sobre Funes
Funes Versus Macros
Nomes de Funo
Um Exemplo de Funo Definida pelo Usurio
Sintaxe E Projetos de Funo

Usando Variveis e Matrizes Em Funes


Especificando Um Tipo Para Uma Funo
Especificando Tipos Para Argumentos de Funo
Tornando Opcionais os Argumentos de Funo

Usando Tipos Usurio Como Argumentos


MAnipulando Um Nmero Desconhecido de Argumentos Retendo
Valores Aps Rodar Uma Funo
Tornando as Funes Private
Tornando as Funes Volteis Garantir o Re-Clculo

Determinando A Clula Que Chama Uma Funo

Determinando Uma Clula de Argumentos


Chamando Funes De Uma Outra Pasta
Funes Que Atuam Como Macros

Usando o Assistente de Funo


Lio #03 Trabalhando com Funes 216
Recalculando Funes
Um Monitoramento de Funo
SOBRE FUNES

Uma funo um nome para um conjunto de declaraes que retornam um valor. Por
exemplo, SUM(), AVERAGE(), IRR() so funes embutidas que voc poder ter que
usar. Uma funo normalmente usada numa frmula numa clula da planilha.
Entretanto, uma funo pode ser tambm usada numa macro ou numa outra funo. Se
voc for a uma planilha e selecionar Inserir do menu Microsoft Excel, e depois Funo,
o painel seguinte ser mostrado:

Como voc pode ver folheando o painel anterior, a Microsoft Excel tem muitas, muitas
funes. As funes que voc criar so adicionadas na categoria de funo Definidas
pelo usurio e so chamadas de funes Definidas pelo usurio.

As funes Definidas pelo usurio so escritas em mdulos exatamente como as macros.


Se uma funo Definida pelo usurio for uma funo de propsito especial, ento voc
dever pr esta funo em um mdulo na pasta que a usar. Se voc tiver vrias funes
de propsitos gerais, voc dever mant-las em um mdulo no seu arquivo de
Pessoal.Xls.
FUNES VERSUS MACROS

A lista seguinte compara e contrasta as Funes Definidas pelo Usurio e as macros:


Lies de VBA do Excel 217

Funes comeam com a palavra Funo e terminam com End Function. Macros
comeam com Sub e terminam com End Sub.

Funes podem ser usadas em clulas de frmulas. Macros no podem.

Macros podem ser atribudas a botes, menus e objetos. Funes no podem ser assim
atribudas.

Ambas podem chamar outras funes, usar testes If, usar os laos Do..Loops, For..Next
e outros comandos do Visual Basic.

Funes retornam um valor quando elas terminarem de rodar suas declaraes. Macros
no retornam um valor.

Funes tm uma varivel nelas com o mesmo nome que a funo. Seu valor que
retornado. Macros no.

Macros podem mudar as propriedades das clulas e outros objetos, deletar e adicionar
objetos. Funes no podem a menos que chamadas por uma macro.

Ambos macros e funes podem obter propriedades de informaes de qualquer objeto,


tais como valores de clulas em qualquer planilha.

Nomes de Funo e nomes de macro seguem as mesmas regras.

Funes podem ser encerradas a qualquer momento usando a declarao Exit Function.
Macros podem ser encerradas a qualquer momento, usando a declarao Exit Sub.

A exigncia bsica de uma funo que ela contenha uma varivel que tenha o mesmo
nome que a funo. Seja qual for o valor colocado nesta varivel pela funo, o valor
que a funo retorna.
NOMES DE FUNES

O nome que voc d uma funo segue as mesmas convenes daquelas de nomes
de variveis e macros. Tambm, voc no deveria fazer seu nome de funo igual a uma
referncia de clula. Em algum lugar na sua funo voc precisa incluir uma linha que
fixa uma varivel pelo mesmo nome que a funo para o valor que voc quer que a funo
retorne. Caso contrrio, a funo retornar um valor default para o seu tipo. (Que seria
zero quando as funes forem do tipo Variant a menos que declaradas o contrrio).
UM EXEMPLO DE FUNO DEFINIDA PELO USURIO
Lio #03 Trabalhando com Funes 218
Para ilustrar uma funo Definida pelo usurio, digamos que voc precise calcular
o preo de um item, e o preo dependente da quantidade que ele comprado, como
ilustrado na tabela seguinte:

Quantidade Comprada Preo


0-100 $10 101-300 $9
301-700 $8
701 ou mais $7

Uma maneira de manipular isto seria escrever uma frmula If numa clula. Por exemplo,
se a quantidade estivesse na clula C7, a frmula seguinte calcularia o preo para aquela
entrada:

=If(C7<101,10,IF(C7<301,9,IF(C7<701,8,7)))

Esta frmula seria fcil de manter se voc s precisasse isto em uma cela. Mas, se voc
precisasse determinar preo em vrias celas diferentes, ou se a tabela de preo for mais
complexa, ento voc teria dores de cabea. Especialmente, se voc tiver de mudar os
preos.

O seguinte um exemplo de uma funo que calcula preo:

Function CalcPreo(quantidade As Integer)


If quantidade < 101 Then
CalcPreo = 10
ElseIf quantidade < 301 Then
CalcPreo = 9
ElseIf quantidade < 701 Then
CalcPreo = 8
Else CalcPreo = 7
End If
End Function

Para usar esta funo, voc apenas digitar =CalcPreo(quantidade) numa clula.
Quantidade pode ser um nmero ou uma referncia de cela. Insira um mdulo em branco
e crie a funo anterior e da teste-a em uma folha na mesma pasta. Como voc v, voc
obtm o mesmo resultado que a declarao Se, mas a entrada mais compacta. E, voc
poderia usar esta funo em muitas clulas da planilha apenas precisando manter seu
cdigo no mdulo.

A funo anterior pode tambm ser escrita usando uma declarao Select Case, que
tambm foi discutida em um captulo anterior. A declarao Select Case um ajuste
melhor para funes tal como esta. O seguinte o que a funo se pareceria se fosse
escrita com uma declarao Select Case:
Lies de VBA do Excel 219

Function CalcPreo(quantidade As Integer)


Select Case quantidade
Case 0 To 100: CalcPreo = 10
Case 100 To 300: CalcPreo = 9
Case 300 To 700: CalcPreo = 8
Case Is >= 701: CalcPreo = 7
End Select
End Function

SINTAXE E DESIGN DE FUNO

Segue a sintaxe tpica para uma funo definida pelo usurio:

Function nomedafuno (lista de argumentos) As Type


declaraes
nomedafuno = expresso End
Function

Uma funo tipicamente tem uma lista de argumentos que ela espera receber.
Os argumentos esto separados por virgules e entre parnteses. Os nomes dos
argumentos so tambm os nomes das variveis que a funo usar nos seus clculos.

Como ilustra a sintaxe acima, em algum ponto na funo voc assume uma
varivel que tenha o mesmo nome que a funo para um valor. No h restries no
valor que voc pode ter para a funo retornar. Por exemplo, voc pode escrever a
funo que retorna um nmero, uma outra que retorne um texto string e uma outra que
retorne True ou False. Uma funo pode mesmo retornar uma referncia a objeto.

Para usar a funo numa planilha, voc digitaria um sinal de igual, o nome da
funo, e fornecer valores para os argumentos entre os parnteses. Voc no pode
nomear os argumentos na equao. Os valores fornecidos devem estar na ordem que a
funo aguarda receb-los. Voc pode usar referncias de clulas para fornecer os
valores. Tambm, voc pode usar a funo como parte de uma frmula complexa.

Quando voc usar a funo numa macro, voc dever escrever a declarao que
faz uso do valor retornado. Por exemplo, voc pode ajustar a varivel igual ao valor
retornado, usar o valor retornado num clculo, ou usar o valor retornado como uma
expresso teste.

Para usar a funo num procedimento voc digita o nome da funo seguida por
parnteses. Se voc precisar passar valores para a funo, ento aqueles valores
devero estar dentro dos parnteses e separados por virgulas. Se os parnteses no so
usados, a funo no retornar um valor. A ordem em que voc passa valores a uma
funo deve ser a ordem que a funo aguarda receb-los a menos que voc especifique
os nomes dos argumentos. Se voc quiser, voc pode especificar os nomes dos
argumentos seguidos por dois pontos e um sinal de igual (:=). Por exemplo, voc pode
Lio #03 Trabalhando com Funes 220
passar uma nica clula, uma seleo de clulas, um valor numrico, ou um valor string.
O que segue ilustra a chamada de funes de uma macro:

FunctionName(12, 88, 33)


FunctionName(primeiroNome:="Joo", idade:=35)

Por favor, lembre-se que voc no pode misturar as duas aproximaes de


fornecer valores a uma funo quando usada em suas macros. E, se voc fornecer valores
e no precisar fornecer todos os valores, voc deve usar virgulas como placeholders a
menos que voc fornea os nomes do argumento.
USANDO VARIVEIS E ARRAYS EM FUNES
As funes no so restringidas ao uso das variveis declaradas na lista de
argumentos da funo. Voc pode declarar e usar tantas variveis e arrays que voc
precisar numa funo, exatamente como voc faz em macros. E, funes podem usar
nvel de mdulo e variveis de nvel global. A lista de argumentos apenas um modo de
passar valores para certas variveis numa funo. Voc pode tambm ter arrays na lista
de argumentos de uma funo. O que segue ilustra isto:

Function FaaAlgumaCoisa(X As Integer, _ listadeCustos(1


To 5) As String, _
infoNovas() As String, _
doTeste As Boolean)
Dim Preos(1 To 12), J As Integer, respostadoUsurio As Boolean
'declaraes
End Function

No exemplo acima, dois arrays so partes da lista de argumentos da funo,


listadeCustos e infoNovas. O array listadeCustos tem declarado a sua dimenso. Isto
significa que a macro solicitante deva usar um array que tenha o mesmo nmero de
elementos, neste caso 5. O array infoNovas no tem suas dimenses declaradas. Isto
significa que a macro solicitante pode usar um array de qualquer tamanho quando ela
chamar esta funo. H tambm um terceiro array nesta funo, Preos, o qual criado
pela funo juntamente com duas variveis a serem usadas na funo, J e
respostadoUsurio.

Tome cuidado de no usar uma palavra chave restrita numa lista de argumentos da
funo. O Excel a detectar como um erro de sintaxe. Por exemplo, a seguinte funo
declarao (a qual usa a palavra chave do tipo restrita) ser destacada usando a fonte de
erro de sintaxe (normalmente vermelho)

Function ChecarTipo(tipo)

A menos que voc perceba que o argumento seja uma palavra chave restrita, voc
se convencer que Visual Basic est quebrado! Se voc ligar a checagem de sintaxe e re-
digitar parte da declarao, o Visual Basic mostrar a mensagem de erro "Expected:
identifier" para esta mensagem e destacar a palavra "tipo". Ligando a checagem sintaxe
Lies de VBA do Excel 221

quando voc no puder compreender um problema de sintaxe da expresso um modo


de se obter conhecimento adicional ao problema de sintaxe.

Quando uma funo permite uma macro solicitante passar um array de qualquer tamanho
a ela, ento ela pode usar as funes UBound e LBound para determinar o tamanho do
array. A sintaxe :

UBound(arrayname, nmero de dimenso)


LBound(arrayname, nmero de dimenso)

Por exemplo, UBound(NewInfo, 1) retorna o nmero de elementos da primeira dimenso


de um array chamado NewInfo. LBound(NewInfo, 1) retorna o nmero de elementos
iniciais do array. Se um nmero de dimenso no fornecido, assumido ser um.
ESPECIFICANDO UM TIPO PARA UMA FUNO
Voc pode declarar a funo, e assim o valor que ela retorna ser um tipo particular
(Boolean, Integer, Long, String, etc..) se voc quiser. Para fazer isto, usar a notao
Quando tipo seguido de parnteses. Declarar um tipo para uma funo opcional. Se
voc no declarar um tipo para uma funo, seu tipo considerado como Variant. O que
segue, ilustra a declarao de uma funo tipo:

Function PreoComputador(quantidade) As Integer

ou Function ChecarValor(nomedoEmpregado) As Boolean

Declarar um tipo para uma funo no s uma boa prtica como tambm ela
ajuda evitar erros ao se usar uma funo. Tambm, ela ajusta o valor inicial para a funo
baseada no tipo declarado. Por exemplo, a funo seguinte:

Function ChecarData(valorData) As Boolean


If valorData > 100 Then ChecarData = True
End Function

retornar False, a menos que o teste seja true. A varivel ChecarData no precisa ser
ajustada para False pois a funo declarada como Boolean e o valor inicial da varivel
ChecarData ento False.

Por favor, note que se voc tiver uma funo retornar uma data, ento voc dever
declarar o tipo da funo como Date.

ESPECIFICANDO TIPOS PARA ARGUMENTOS DE FUNO


uma boa idia declarar os tipos dos argumentos de uma funo. Declarar os
tipos para os argumentos numa funo uma prtica muito boa, pela mesma razo que
Lio #03 Trabalhando com Funes 222
voc declara os tipos de variveis numa macro. Entretanto, no dever usar Range como
um dos tipos se voc estiver usando a funo numa planilha. Voc obter um #NAME?
como resultado de sua funo se voc us-la numa planilha. Ao investir nisso, usar Object
ou Variant como o tipo para uma varivel que realmente uma varivel range.

O seguinte declara as variveis na lista de argumento da funo ChkValues:

Function ChkValues(testResults As Boolean, _


Y As Integer, _
Z As String) As Boolean

Note que a declarao Function pode ser declarada atravs de linhas mltiplas
usando um espao seguido pelo caracteree sublinhado, ( _ ). Tambm, o tipo da funo
por si s declarado.

Se uma outra macro chamar a funo e as variveis usadas para fornecer valores
macro solicitante so de tipos diferentes daqueles dos argumentos da funo, a
mensagem de erro seguinte aparecer:

Para resolver, voc precisa ou tornar os tipos iguais ou prefixar o argumento da


funo com a palavra chave ByVal se a varivel tem o valor propriedade. Por exemplo:

Function TestarValor(ByVal qualquerNmero As Single) TORNANDO


OS ARGUMENTOS DA FUNO OPCIONAL

Se voc quiser tornar um argumento opcional, inclua a palavra chave Opcional na


frente do argumento na lista argumento. Por exemplo:

Function TipoCusto(orderNum As Integer, _


Optional costCode As Variant)

Uma vez tendo definido a varivel como tima, todas variveis subseqentes
devero ser declaradas opcionais tambm. Tambm, todas variveis opcionais devem ser
do tipo Variant.
Para determinar se um argumento optional foi fornecido, voc dever usar a funo
IsMissing (argumento). Se o argumento no foi fornecido, IsMissing retorna True. Se
ele foi fornecido, IsMissing retorna False. O que segue ilustra o teste para um argumento
opcional.

If IsMissing(costCode) Then costCode = "Unknown"


USANDO ARGUMENTOS DO TIPO USURIO
O Visual Basic permite voc usar tipos como argumentos numa funo usurio. Por
exemplo
Function DoMore(tireCenter As infoClientes)
Lies de VBA do Excel 223

declara a varivel tireCenter como do tipo infoClientes, a qual uma do tipo usurio,
criada usando uma declarao Type.
MANIPULANDO UM NMERO DESCONHECIDO DE ARGUMENTOS
Se voc no souber quantos argumentos uma funo receber, voc pode tornar
o ltimo argumento de uma funo um array, e colocar a palavra chave ParamArray na
frente do nome array. Tambm, voc deve declar-la como sendo do tipo Variant. Por
exemplo
Function CheckData(descriodaData, ParamArray aData() As
Variant)
Declara o ltimo argumento, aData, como um array. Ele preenchido com quaisquer
valores que forem fornecidos seguindo a descrio que est armazenada na varivel
descriodaData. Se ParamArray usada, voc no pode especificar nomes de
argumento quando voc chamar a funo. Voc deve fornecer valores para que a
funo aguarda receber os valores.

O que segue ilustra a chamada da funo acima:


dataOk = CheckData("Info Junho", 23, 44, 55, 21, -43)
Neste exemplo, varivel dataDescrip atribudo o valor " Info Junho". Ao array
aData atribudo os valores 23 at -43, e acaba sendo um array de uma nica dimenso
com cinco elementos.

Note que o tamanho do array no foi declarado. O array resultante ser um


array de uma nica dimenso. Para determinar o tamanho do array, usar as funes
LBound e Ubound (discutidas anteriormente neste captulo). Por favor, note que se
voc tem uma declarao Option Base 1 no topo do seu mdulo, o Visual Basic
assumir o primeiro valor do array como o elemento 1. Entretanto, o primeiro
elemento no array ainda ser 0, e ele no ser assumido como um valor. Isto pode
causar problemas a menos que voc escreva suas declaraes para manipular esta
situao.

Ilustraes do uso ParamArray encontrada no captulo anterior sobre macros.


RETENDO VALORES APS RODAR UMA FUNO

Se voc quiser ter uma varivel exceto um argumento retendo seu valor aps a funo
rodar, declare-a com a palavra chave Static em vez da palavra chave Dim.

Se voc colocar a palavra Static na frente da palavra Function, isto faz quaisquer
variveis declaradas na funo reter seus valores entre chamadas da funo. Por favor,
note isto aplica s variveis declaradas na funo, no aos argumentos. O que segue
ilustra isto:

Static Function CheckData(X As Integer)


Lio #03 Trabalhando com Funes 224
Existem vrias situaes que fazem as variveis serem reset numa funo que usa a
palavra chave Static para reter valores de varivel:

A declarao End por si s usada para parar a atividade da macro.

O cdigo Visual Basic na pasta editado.

A pasta fechada.
TORNANDO AS FUNES PRIVATE
Colocando a palavra Private na frente da palavra Funo, voc pode restringir a
funo de modo que ela pode somente ser usada no mdulo onde ela est armazenada.
Funes private no podem ser usadas em planilhas nem aparecero no coringa de
funes. O que segue ilustra o uso da palavra Private:
Private Function CheckData(X, Y)
Voc pode colocar ambas Static e Private na frente da Funo. Private vai primeiro,
mas se voc esquecer, o Visual Basic automaticamente re-arranjar as palavras na
ordem certa! O que segue ilustra uma tal declarao:
Private Static Function CheckData(Y, Y)
TORNADO AS FUNES VOLTEIS - INSERIR RECALCULATION
Se voc escrever uma funo que obtenha um ou mais valores indiretamente, tal
como referir a uma clula via a declarao na funo, a funo normalmente no
recalcular quando aquelas clulas mudarem. O que segue ilustra a funo que obtm
um valor indiretamente:
Function PreodeDesconto(preoInicial) As Single
If Range("A1").Value = 0 Then
PreodeDesconto = preoInicial * 0.9
Else
PreodeDesconto = preoInicial * Range("A1").Value

End If
End Function

Na funo acima, a referncia indireta a clula A1. Se a seguinte frmula for colocada
na clula G5
= PreodeDesconto (E5)
A funo acima recalcular sempre que clula E5 mudada. Isto porque o E5
referenciada diretamente pela funo. Entretanto, se a clula A1 mudada a funo
no recalcular. Isto porque a funo se refere clula A1 indiretamente. Qualquer
referncia a uma clula atravs da lista de argumento uma referncia direta. Qualquer
outra referncia uma referncia indireta.

Para ter a funo recalculate quando qualquer clula numa pasta variar, voc
precisa incluir a seguinte declarao no topo da funo, logo abaixo da declarao da
funo:
Lies de VBA do Excel 225

Application.Volatile
Escreva a funo acima num mdulo e teste-a com e sem a declarao
Application.Volatile seguinte funo declarao.
DETERMINANDO A CLULA SOLICITANTE PARA UMA FUNO
possvel determinar qual clula chamada (usada) a funo usando uma das
seguintes expresses:

Chamando o objeto clula: Application.Caller endereo de clula somente:


Application.Caller.Address endereo com arquivo & folha:
Application.Caller.Address(External:=True)

A segunda forma acima retornar "$B$4" se a funo estivesse na clula B4. A


terceira forma retornar "[Book1.XLS]Sheet1!$B$4" se a clula B4 estiver na pasta
Book1.Xls e na folha Sheet1.
DETERMINANDO UM ARGUMENTO DE CLULA
Declarando um argumento de uma funo como do tipo Object ou tipo Variant,
voc pode usar o argumento para no somente obter valor dos argumentos de clula,
mas tambm us-lo para obter outros valores nas clulas relacionadas. A seguinte
funo ilustra isto:
Function DataDescrip(qualquerClula As Object)
Application.Volatile
DataDescrip = qualquerClula.Value & " " & _
qualquerClula.Offset(0,1).Value
End Function
Se a clula A1 contm o nome "Joo" e clula B1 contm "Eduardo",
=DataDescrip(A1) retornar "Joo Eduardo". Note que a funo foi declarada Volatile
de modo que ela recalcula quando referncias indiretas so mudadas. A referncia
indireta acima qualquerClula.Offset(0,1).Value.

CHAMANDO FUNES DE UMA OUTRA PASTA


Se a funo que voc quer usar numa planilha clula est numa outra pasta, voc
deve colocar o nome da pasta da funo (tipo e nome de arquivo) na frente do nome da
funo. Um ponto de exclamao separar o nome da pasta do nome da funo. Por
exemplo, se a funo CalcPreo estivesse localizada na sua pasta Personal.XLS e voc
precisa to us-la numa pasta diferente, voc poder entrar com o seguinte numa clula de
planilha:
=Personal.Xls!CalcPreo(valor)
se o nome do arquivo for comprido, ento o nome do arquivo ficaria entre aspas. Se voc
usar esta aproximao e o arquivo que contm a funo no estiver aberto (ou pegar
fechado), ento a funo retornar #NAME?.
Lio #03 Trabalhando com Funes 226

Um modo de se evitar a declarar a localizao do arquivo de uma funo seria criar o


que chamado de um arquivo add-in que contenha a funo. Criao de add-ins
discutida no ltimo captulo. Um outro modo de se evitar a declarar o nome da pasta
ajustar uma referncia pasta contendo a funo. Isto elimina tambm o problema
#NAME? se o arquivo da funo est fechado.

Para ajustar uma referncia:

V para a pasta solicitante


V para qualquer mdulo naquela planilha. Se nenhum existir adicione um. Enquanto
na folha de mdulo, selecione Ferramentas, Referncias. Isto mostrar o seguinte menu
(Por favor, note que suas referncias podem ser diferentes daquelas mostradas abaixo).
Clique na caixa ao lado do arquivo que voc quer se referir a ele . Uma marca
(checkmark) aparecer. Se a funo est no seu arquivo Personal.XLS, ento voc clicar
neste um. Se o arquivo contendo a funo no est carregado no Excel, ento usar o boto
Browse para especificar o arquivo.
Feche o painel selecionando OK

Se voc re-locate ou renomear um file que fez uma referncia, voc precisar to
reestablish a referncia ou else Microsoft Excel ser incapaz de avaliar as funes pois
ele no pode encontr-las e retornar o valor erro #NAME?. Veja a descrio minuciosa
no Captulo xxxx para mais detalhes sobre como manipular referncias.
FUNES QUE ATUAM COMO MACROS

Funes que so usadas numa clula de planilha no pode modificar a planilha. Por
exemplo, elas no podem formatar a clula, nem mudar o valor numa clula. Entretanto,
funes que so chamadas por uma macro podem modificar as planilhas e outros objetos
no Excel. Por exemplo, elas podem deletar linhas, mudar a folha ativa, e selecionar uma
clula diferente. Na essncia, se a funo foi chamada por uma voc pode ter que fazer
qualquer coisa que uma macro possa fazer.

A habilidade para ter funes que atuam como se fossem macros adiciona um poder
tremendo ao Visual Basic. Voc pode escrever uma funo que faa um nmero de
tarefas tais como adicionar ou deletar linhas, abrir planilhas, e validar dados. E quando
a funo feita, ela pode retornar um valor macro solicitante para indicar seu sucesso
ao trmino de suas tarefas. Por exemplo, ela pode retornar True para todas as tarefas que
foram feitas com sucesso, ou False se um problema ocorreu. Tambm, a funo pode
parar a atividade da macro usando a declarao End. Se voc no quiser uma funo para
retornar um valor, no coloque os argumentos nos parnteses. Se uma funo usada
sem parnteses, ento ela tratada como uma declarao stand alone exatamente como
uma chamada a uma macro.
Lies de VBA do Excel 227

Uma vantagem de se usar funes que atuam como macros que elas no aparecem na
lista de macro quando voc selecionar Ferramentas, Macro. Entretanto, elas aparecem na
lista de funes definidas pelo usurio.
USANDO O ASSISTENTE DE FUNES
Se voc criou uma funo e no a declarou Private, voc a encontrar listada sob
as funes definidas pelo usurio no assistente de Funes. Se voc estiver numa
planilha, voc pode acessar o assistente de funes selecionando Inserir, Funo dos
menus Microsoft Excel. O seguinte painel aparecer:

Quando voc selecionar Definida pelo usurio na caixa pop up categoria,


aparecero as funes que voc criou em qualquer pasta ou suplemento (pasta ou addin).
Quando voc selecionar uma funo de usurio, o assistente levar voc s necessidades
de entrada. Assim,
Lio #03 Trabalhando com Funes 228

Uma vez preenchidos todos os campos de entrada exigidos, selecione OK.


O Microsoft Excel inserir a frmula para a funo selecionada na caixa de edio. Por
favor, note que quando voc entrar com os dados nos campos de entrada, o valor mostrado
no canto superior direito do painel acima par a funo alterado. Initialmente, ela
configurada como #VALUE.
RECALCULANDO FUNES
Se voc modificar a funo, voc precisar re-calcular sua planilha para que a
modificao seja refletida em quaisquer frmulas de clulas, mesmo se o clculo
ajustado para ser automtico. Faa isto pressionando Ctl-Alt-F9 (no apenas F9) todas
ao mesmo tempo. Esta aproximao tambm funciona se voc abrir um arquivo contendo
clulas com funo frmulas que foram corretamente calculadas quando voc fechou o
arquivo, mas elas mostraro #VALUE! Quando voc reabrir o arquivo.
UM MONITORAMENTO DE FUNO
O que segue uma funo que eu escrevi par monitorar um valor chave em uma
das minhas planilhas. Eu no quero mudar o valor do lado de fora de um intervalo
estreito. Como eu poderei usar esta funo em outro lugar, eu a escrevi de um jeito
genrico, de modo que eu posso us-la para monitorar outras clulas chaves. Quando a
funo detectar uma condio for a dos limites, uma caixa de mensagem pops up, dizme
que eu tenho um problema. A razo porque eu uso a funo em vez de uma macro que
uma funo re-avaliada pelo Microsoft Excel toda vez que os valores clula monitoradas
variarem (se calcular for ajustado para automtico).

O que segue a funo:

Function EncontrarValor(CelulaObservada As Object, _


valorSuperior As Single, _ valorInferior
As Single, _ MsgDeAdvertencia As String)
EncontrarValor = "Nos Limites"
Lies de VBA do Excel 229

If CelulaObservada.Value > valorInferior Or _


CelulaObservada.Value < valorInferior Then
EncontrarValor = "Fora Dos Limites"
MsgBox MsgDeAdvertencia
End If
End Function

Para usar a funo para auditor a clula B5, eu entrarei com a seguinte frmula numa
clula prxima:

=PESSOAL.XLS! EncontrarValor(B5, 80, 90, "Clula B5 est


Fora dos Limites")

Eu sugiro que voc escreva a funo acima num mdulo e prove-a com um valor teste.
Ela pode ser uma funo que voc pode fazer uso dela! Por favor, note que voc somente
obter a mensagem de advertncia quando o valor variar e quando ele est fora dos
limites.
. Se outras variaes na pasta no mudarem o valor que est sendo observado, mensagens
de advertncias adicionais no aparecem, mesmo quando o valor esteja fora dos limites.
Como Fazer Aparecer a Funo Criada Na Caixa de Dilogo Inserir
Funes do Excel
Como j sabemos , as funes podem ser adicionadas caixa de dilogo Inserir Funes.
Tambm sabemos que podemos construir uma funo, escrevendo os seus cdigos no
VBEditor. Neste caso elas so chamadas pela sigla inglesa UDF (userdefined function)
Entretanto, observe que uma funo no a mesma coisa que uma sub-rotina
quando o assunto macro executvel. Portanto, na lista da janela Macro quando
escolhemos Ferramentas/Macro/Macros, no aparecem as funes criadas pelo usurio,
as UDF. Mas l na caixa de dilogo Inserir funo elas esto presentes na categoria UDF.
Como edit-las, ento?
Lio #03 Trabalhando com Funes 230
Ao digitar o nome da funo na janela Macro abaixo, porm, o Excel reconhece
e habilita as opes relacionadas funo que digitamos.

Clicando em Opes uma nova janela de dilogo (a da direita) aberta. Nesta


janela voc tem a opo de inserir a descrio de sua funo.
Para adicionarm os as funes caixa de dilogo Inserir Funes , por meio de
cdigos, basta inserir a seguinte linha de comando no seu cdigo:
Application.MacroOptions Macro:=MinhaFuno, Category:=1

A category:=1 refere-se categoria Financeira, por exemplo. Uma outra


caracterstica importante refere-se descrio da funo. A descrio auxilia o usurio
quanto ao objetivo da funo. Na janela da direita da figura acima s entrar com a
descrio.
Para fazer isto por meio de cdigo, fazemos:
Application.MacroOptions Macro:=MinhaFuno, _
Desciption:=Esta funo soma os itens selecionados.,
Category:=1
Para que o cdigo acima funcione importante que ele esteja em uma sub-rotina que seja
executada antes de utilizarmos a funo. Se ele for colocado diretamente na funo nada
ocorrer.

RESUMO

Voc achar que escrever funes para usar me suas planilhas adiciona uma nova
dimenso no seu uso do Microsoft Excel. Em vez de escrever complexas expresses If
que voc deve manter em muitas clulas numa planilha, voc pode agora criar e manter
funes para suas planilhas. Funes tm tambm benefcios semelhantes quando usadas
em macros. Isto um outro significado do poder de adicionar e simplificar as suas
macros.
231

Fase #3: VBA do Excel Avanado

Lio 4: Trabalhando com Databases

P ara realmente conseguir a maioria das coisas do VBA funcionando com databases
voc deve habilitar estas funcionalidades no Excel. Visite o website on Excel e
estude os captulos sobre databases e funcionalidades do databases. Quando voc
trabalhar num database Excel voc deve primeiro verificar que todos os filtros
esto desligados. Para este fim voc iniciar seu procedimento com estes dois conjuntos
de linhas de cdigo. Primeiro selecione qualquer clula dentro do database.

Range("A3").Select
If ActiveSheet.AutoFilterMode = True Then
Selection.AutoFilter
End If
If ActiveSheet.FilterMode = True Then
ActiveSheet.ShowAllData
End If

Sabendo que um database um conjunto de linhas e colunas conectadas voc pode


selecion-las todas com:

Range("A3").Select
Selection.Currentregion.Select

Uma vez feito isto, voc pode contar o nmero de linhas (registros) e o nmero de colunas
(campos) com o seguinte cdigo:

varNbRows=Selection.Rows.Count
varNbColumns=Selection.Columns.Count

De fato o nmero de registros o nmero de linhas menos um (a linha de ttulo) e aqui


est o cdigo:

varNbRecords=Selection.Rows.Count 1

Classificando Dados com VBA

Existe um pedao de cdigo que o Gravador de Macros pode escrever para voc e para
classificao de dados. O GM escrever alguma coisa como esta:

Range("J3").Select
Lio #03 Trabalhando com Funes 232
Range("A2:U3").Sort Key1:=Range("J3"), Order1:=xlAscending,
Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

A linha 2 a linha de ttulo e a linha 3 aquela uma de muitos registros. O GM est


somente filtrando o primeiro registro porque eu no selecionei todos eles. Para corrigir
esta situao, eu modifiquei o cdigo para isto

Range("J3").Select
Selection.CurrentRegion.Sort Key1:=Range("J3"),
Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Eu poderia tambm mudar a ordem de classificao e eu geralmente modifico o


argumento cabealho e removo o DataOption porque verses mais antigas do Excel
cometero erros com ela. Assim o cdigo final :

Range("J3").Select
Selection.CurrentRegion.Sort Key1:=Range("J3"),
Order1:=xlDescending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom
233

Fase #3: VBA do Excel Avanado

Lio 5: Criando Formulrios do Usurio (Userforms)

O
formulrio (form) ou userForm tambm conhecido como um GUI (Graphical
User Interface). O form usado para requerer valores, parmetros e informao
do usurio para empregar nos procedimentos VBA. Isto so usados para fazer
o interfaceamento entre a pasta de trabalho Excel e o usurio da aplicao,
visando facilidade e controle.
Atravs de um userform podemos fazer com que o usurio da nosa aplicao
trabalhe apenas em um ambiente personalizado, sem precisar digitar nas planilhas. A
vantagem disso que podemos criar pequenos e inteligentes sistemas que solicitem dados
aos usurio, trate esses dados e devolva os resultados, armazenando informaes
necessrias em planilhas Excel. Em outras palavras, servem muitas vezes para despoluir
as planilhas.
Lio #03 Trabalhando com Funes 234
Doze controles diferentes podem ser adicionados ao userform. Eles so

chamados: Label, TextBox, ComboBox, ListBox, CheckBox, OptionButton,


Les sobre Macros em VBA do Excel 235

Na lista de componentes do seu projeto o nome do seu userform aparece toda

vez que voc quiser trabalhar no seu userform voc d um


duplo clique no seu nome na janela VBAProject.
Como voc pode ver, no h controles num userform novo. Os objetos so
adicionados ao userform usando a barra de ferramentas chamada Caixa de Ferramentas,
discutida posteriormente. A configurao default para um userform aquela de um
instantneo em forma de grade. Quaisquer objetos tais como botes ou listas que voc
adicionar a ficaro ancoradas na grade do formulrio. Para dilogos simples, isto timo.
Entretanto, se voc tiver de colocar um grande nmero de objetos sobre um userform,
voc pode ou desligar a grade, ou mudar o seu tamanho, e/ou ocult-la, mas manter o
instantneo habilitado. Para fazer qualquer coisa desta, selecione Ferramentas, Opes,
e a guia Geral:

Use as configuraes da grade do formulrio para mudar o tamanho da grade ou


para remov-la. Uma unidade de grade pequena, como 3, permite uma colocao muito
boa de objetos. E, voc pode desligar a grade, e ainda reter o alinhamento na propriedade
grade (Alinhar controles grade). Isto o melhor de ambos mundos.

Voc pode fechar a barra Caixa de ferramentas clicando no seu "X" e cham-la
de volta clicando no cone da caixa de ferramentas na barra de ferramentas
Para deletar um userform, primeiro selecione o form (d um duplo clique no seu
nome l no Project Explorer). Da, selecione Arquivo, Remover UserForm. Se voc
mudou o nome do userform, o nome aparecer como parte do item de menu remover no
lugar da palavra UserForm.
Lio #05 Criando Userforms 236

Testando o Userform
Toda vez que voc quiser ver seu userform (produto acabado ou funcionando em
progresso) em ao ou quando voc quiser test-lo esteja seguro de que o userform est
selecionado (e no um dos controles) clique no boto "Executar" na barra de
ferramentas ou tecle F5. Seu userform se mostrar com o Excel no fundo (background).
Para retornar ao VB Editor apenas clique no "X" do userform.
Tab Order
Quando as pessoas usam um form elas precisam mover de um controle para o
prximo entrando com um valor num deles e clicando "Enter" ou "Tab". Para se assgurar
que o usurio move de um controle ao prximo voc precisa definir a tab order. Para
fazer isto, clicar com o boto direito do mouse no prprio form e selecionar o item "Tab
Order". Siga as instrues. O primeiro controle na lista ser aquele um que est ativo
(cursor brilhante) quando o form est ativado. Levando os controles que no sero usados
pelo usurio para o final da lista. Na seo "Controles e suas Propriedades" abaixo ver
como desativar um controle tab ". Carregando um Userform
Para carregar um formulrio em sua planilha, precisamos gerar uma macro que tenha os
comandos de inicializao do userform, e devemos executar essa macro pelas formas j
vistas anteriormente (por botes de controles e eventos).
Para carregarmos um formulrio, usamos o comando Load e, para exib-lo, usamos o
mtodo Show. Vejamos o exemplo a seguir, que carrega o Userform1 na inicializao da
pasta de trabalho xxxxx.xls. Para isso, usamos o evento Open da Pasta de trabalho:
Private Sub Workbook_Open( )
Load UserForm1
UserForm1.Show
End Sub
Da mesma forma, podemos ocultar um formulrio pelo mtodo Hide e descarregar um
formulrio da memria com o comando Unload. No necessrio ocultar um formulrio
antes de descarreg-lo da memria.
Poderamos fazer um outro exemplo em que o formulrio carregado e exibido atravs
de botes de controle, por exemplo o boto de comando . As Propriedades do
Userform
Como um objeto Excel, um userform possui propriedades, mtodos e eventos.
Quando voc der um duplo clique no nome do form na janela VBAProject do
VBE o form aparece e a janela Propriedades lhe mostra as propriedades do form.
Para mudar o nome ou outra propriedade de um userform, selecione o form e
pressione F4, ou selecione Exibir, Propriedades. Um dilogo como o que segue
Les sobre Macros em VBA do Excel 237

aparecer. Clicando no seu boto direito superior fecha o dilogo.


janela de propriedades

Este drop down permite voc mudar


para outros objetos e rever e/ou mudar suas
propriedades.

Do Excel 2000 em diante passou a existirem duas propriedades de userform


adicionais: ShowModal e RightToLeft. A propriedade ShowModal pode ser configurada
para False, o que permite voc mostrar um userform e permite que a sua macro continue
a rodar. Por favor note que se voc usar estas propriedades e trocar a macro com algum
que esteja rodando o Excel 97, um erro ocorrer.
A janela de propriedades acima mostra a lista Alfabtico, isto , em ordem
alfabtica. Clicando na guia Categorizado ela agrupa as propriedades relacionadas e lhe
permite comprimir ou expandir as propriedades que so mostradas, usando o pequeno +
ou caixas que aparecem esquerda das categorias.
Propriedade (Name)
Voc pode mudar o nome "(Name)" do form. Quando voc nomeia um form
sempre use o prefixo "frm" como em "frmDatabase" e seja to descritivo para voc
quanto possa ser de modo que seu cdigo ser fcil para ler. Sempre use uma ou mais
letras maisculas no nome. Quando voc escrever "frmDatabase.Show" em letras
minsculas, o Excel colocar em maisculo quaisquer letras deixando voc saber que o
nome est com ortografia errada.
Por favor note que os espaos no so permitidos.
Propriedade BackColor
Essa propriedade define a cor do fundo (background) do formulrio. Abrindo a
flecha da caixa de combinao, aparece as cores da paleta do sistema. Propriedade
BorderColor
Lio #05 Criando Userforms 238

Define a cor da borda do formulrio. Propriedade


BorderStyle

Determina o estilo da borda.


Pode ser : frmBorderStyleNone ou frmBorderStyleSingle. Propriedade
Caption

O nome que vai aparecer na faixa azul no topo do formulrio.


Propriedade Enabled
Ativa ou desativa o formulrio. Desativar um formulrio significa no poder fazer
coisa alguma com ele; portanto, tome cuidado com essa propriedade.
Voc pode desabilitar o "X" do form com a propriedade "Enable" definida como
"False".
Propriedade Font
Exibe a caixa padro de fontes do sistema, configurando como os textos sero
exibidos nos outros objetos adicionados ao formulrio. Propriedade ForeColor
Define a cor daquilo que ser impresso no formulrio. Propriedade
Height

Determina a altura do formulrio. Propriedade


Left

Demarca a distncia do formulrio ao canto esquerdo da tela. Propriedade


MouseIcon

Define um ponteiro do mouse personalizado quando estiver sobre o formulrio.


Para que esse cursor fique ativo, na propriedade MousePointer, voc deve escolher a
opo 99 frmMousePointerCustom.
Propriedade MousePointer
Voc pode ter o ponteiro do mouse mudado quando estiver sobre o form com esta
propriedade.
Propriedade Picture
Opta por uma figura como fundo do formulrio.
Propriedade PictureSizeMode
Determina a forma que a figura ser disposta no formulrio
Propriedade StartPosition
Les sobre Macros em VBA do Excel 239

Indica a posio inicial do formulrio. Por default o userform aparece no centro


da tela. Se voc quiser ver ele mostrado em algum outro lugar defina a "Start" para
"0Manual" e use as propriedades "Top" e "Left" para definir a nova posio.
Propriedade Top
Define a distncia entre o topo do formulrio e o topo da planilha. Propriedade
Width

Delimita a largura do formulrio.


Propriedade Zoom
Aumenta ou diminui a distncia de visualizao dos componentes do formulrio.

A seguir apresentadaremos os MTODOS a serem usados para este objeto Userform:


Mtodo Hide
Como dissemos anteriormente, ele oculta um formulrio sem descarreg-lo da memria.
Mtodo Show
Exibe um formulrio quando j carregado na memria. Mtodo
PrintForm

Imprime a imagem do formulrio na impressora padro do sistema.

A seguir apresentadaremos os EVENTOS a serem usados para este objeto


Userform. Os eventos que sero mostrados na seqncia servem para uma gama de outros
controles e, portanto, podemos, mais frente, apenas expandir o conceito. Evento
Activate
Ocorre quando o formulrio for ativado. Evento
Click

D-se toda vez que o formulrio for clicado. Evento


DoubleClick

Acontece sempre que o formulrio receber um clique duplo. Evento


Deactivate

Ocorre quando um formulrio for desativado. Evento


Initialize

Sucede-se toda vez que um formulrio for carregado para a memria.


Evento KeyDown
Lio #05 Criando Userforms 240

Ocorre quando uma tecla pressionada. Sua declarao possui dois argumentos:
KeyCode As MSForms.ReturnInteger e Shift As Integer. KeyCode retorna o cdigo da
tecla pressionada; Shift retorna 1 caso a tecla Shift esteja pressionada e 0, caso contrrio.
Evento KeyUp
Ocorre quando uma tecla solta. Os argumentos se comportam como no evento
KeyDown.
Evento KeyPress
Ocorre quando uma tecla presionada tambm, mas retorna o cdigo da tabela
ASCII da tecla.
Evento MouseDown
Acontece quando um boto do mouse pressionado. Possui os seguintes
argumentos: Button As Integer, Shift As Integer, X As Single, Y As Single, onde Button
representa o boto clicado; Shift representa o estado da tecla Shift; X e Y representam a
posio atual do mouse.
Evento MouseUp
D-se quando um boto do mouse solto. Possui os mesmos parmetros de
MouseDown.
Evento MouseMove
Ocorre quando o mouse movimenta-se pelo formulrio.
Evento QueryClose
Realiza-se antes que o formulrio seja fechado. Possui o argumento Cancel para
cancelar o evento caso seja desejado.
Evento Resize
Ocorre sempre que o formulrio seja redimensionado Evento
Terminate

Sucede-se aps o formulrio ser fechado.


Evento Zoom
Ocorre quando h uma mudana da propriedade Zoom do formulrio.
241
Fase #3: VBA do Excel Avanado

Lio 6: Adicionando Controles aos UserForms


A Caixa de Ferramentas do Userform
A Caixa de Ferramentas para userforms chamada barra de ferramentas Caixa de
ferramentas. Ela se parece com o que segue:

O que segue so o que os diferentes controles fazem:


Linha Um: Selecionador de Objetos
Inserir um Rtulo (Label)
Inserir uma Caixa de Texto
Inserir uma Caixa de Combinao (Combo)
Inserir uma Caixa de Listagem
Linha Dois Inserir uma Caixa de Verificao
(Check)
Inserir um Boto de Opo
Inserir um Boto Alternncia
Inserir um Moldura (Frame)
Inserir um Boto
Linha Trs Inserir uma Tab Strip
Inserir uma Multi-pgina
Inserir uma Barra de Rolamento
Inserir um Boto de rotao
Inserir uma Imagem
Linha Quatro Inserir um ReferenceEdit
Caixa
Adicionando Controles
Para adicionar controles ao form voc clica com o boto esquerdo do mouse sobre
aquele controle que voc quiser na caixa de ferramentas, segure o boto apertado e arraste
o controle sobre o form. Voc pode agora expandir o controle para o tamanho desejado.
Uma vez que todos os seus controles estejam no form voc clica com o boto esquerdo do
mouse neles e na janela propriedades voc pode mudar as propriedades do controle
selecionado. Voc tambm pode clicar com o boto direito do mouse neles e selecionar
"Propriedades".
Gerenciando Controles
Lio #07 Cdigo VBA do Excel para UserForms 242
Voc pode mover os controles clicando neles segurando-os e movendo-os ao redor.
Voc pode redimension-los selecionando-os e usando os diferentes identificadores ao
redor deles. Voc pode copi-los e col-los clicando com o boto direito do mouse sobre
eles e escolhendo o item de menu certo.
Uma vez tendo adicionado seus controles voc poder querer alinhar alguns deles
ou redimensionar alguns de modo que eles fiquem todos do mesmo tamanho. Para fazer
isto voc primeiro precisa selecionar muitos controles ao mesmo tempo. Para fazer isto
clique com o boto esquerdo do mouse no form prximo a um dos controles que voc
quiser selecionar. Segure e arraste desenhando uma moldura que inclua muitos controles.

Quando soltar o boto todos os controles que voc tocou pela moldura estaro
selecionados.

Clique com o boto direito do mouse em qualquer um dos controles e este menu contextual
aparece:

Voc pode ento alinhar os controles ou torn-los do mesmo tamanho


Os Controles e suas propriedades
Existem 12 diferentes controles que podem ser adicionados ao userform ou a uma
planilha regular. Aqui esto aqueles mais importantes e suas propriedades.
Quando voc selecionar um controle sobre o userform suas propriedades esto
mostradas na Janela de propriedades. As propriedades e o nmero de propriedades diferem
dependendo do tipo de controles que voc selecionou. Estas propriedades podems ser
Lies de VBA do Excel 243

mudadas na Janela de propriedades do VB editor ou pode ser mudada programaticamente


num procedimento VBA.
Defina a propriedade "Name" de todos os controles que voc se referir nos seus
procedimentos VBA. Eu o encorajo a usar prefixos e algumas letras maisculas nos seus
nomes (cbxCitx, txbNomeCidade). Seja to descritivo quanto possvel para tornar seu
cdigo mais claro. Os prefixos que eu uso so: boto de comando (cmb), rtulos (lbl),
caixas de combinao (cbx), caixas de texto (txb), caixa de listagens (lbx), caixas de
verificao (check boxes) (ckb), boto de rdio (rdb), botes de alternncia (toggle) (tbt),
molduras (frames) (fra), tab strips (tsp), multi pginas (mpg), barras de rolamento (scroll
bars) (scb), botes de rotao (spin) (spb), imagens (img) e ref edits (rfe). Os controles
que particularmente precisam ser bem chamados so os controles cujos valores eventuais
voc estar usando nos seus procedimentos como as caixas de texto, as caixas de listagens,
as caixas de combinao, os botes de opo e as caixas de verificao. Por exemplo:
Range("A1").Value = txbNomeCidade.Value
tomar o valor entrado pelo usurio na caixa de texto chamada tbxNomeCidade e entrar
com ele na clula A1 da folha ativa.
Para a maioria dos controles existem estas propriedades gerais que lhe permitem
definir a fonte, a cor da fonte, a cor do fundo (background), o tipo de background, o tipo
de borda e outras caractesticas de design.
A propriedade "Caption" contm o texto que mostrado num rtulo, num boto
de comando, numa check box, num boto de opo, num frame, numa tab strip ou numa
multi pgina.
Abaixo esto as outras propriedades interessantes que eu uso com diferentes
controles.
Rtulos
Os rtulos so controles passivos significando que o usurio nunca realmente atua
nele. Est l para informar ao usurio e para rotular outros controles como caixas de texto,
caixas de combinao ou caixa de listagens. As outras propriedades interessantes do rtulo
so:
- TabStop para tornar o controle invisvel para as teclas "Tab" e "Enter" (Ver Tab Order
acima).
- WordWrap para habilitar a escrever mais que uma linha num rtulo.
Botes de Comando
Os botes de comando so geralmente colocados no fundo do form e servem
para completarem a transao para a qual o formulrio foi criado. Os captions dos
botes so geralmente "Ir", "Executar", "Submeter", "Cancelar". As outras
propriedades interessantes do boto de comando so:
- WordWrap para ser capaz de escrever mais que uma linha sobre um boto, -
ControlTipText que gera uma pequena caixa de comentrio quando o usurio mover o
mouse sobre o controle. Voc pode usar esta propriedade para dar explicaes e
instrues sobre o boto de comando,
Lio #07 Cdigo VBA do Excel para UserForms 244
- Enabled e Visible so propriedades que voc pode mudar programaticamente para
desabilitar ou desenhar um boto comando invisvel seguinte a uma seleo anterior
num outro controle do userform,
- TabIndex a propriedade que voc muda pela functionalidade "Tab Order" como
mostrado acima na seo "Tab Order".
Caixas de Texto (Text Boxes)
A caixa de texto o controle mais simples para exigir uma entrada do usurio. O
usurio digita alguma coisa nela e este valor pode ento ser usado no seu procedimento
VBA.
As outras propriedades interessantes das caixas de texto so:
- WordWrap habilitar a escrever mais do que uma linha num boto, - ControlTipText que
gera pequenas caixas de comentrio quando o usurio move o mouse sobre o controle.
Voc pode usar esta propriedade para dar explicaes e instrues a respeito do boto
de comando,
- Enabled e Visible so propriedades que voc pode mudar programaticamente para
desbilitar ou desenhar um boto de comando invisvel seguido de uma seleo prvia
num outro controle do userform,
- TabIndex uma propriedade que voc muda pela functionalidade "Tab Order" como
mostrado acima na seo "Tab Order".
- PasswordChar aquela que lhe permite escolher um caractere para os usurios
submeterem passwords,
- MaxLength para limitar o nmero de caracterees entrados pelo usurio,
- Value ou Text que o texto mostrado na caixa de texto quando o userform for ativado
("Entrar com seu Nome" por exemplo)
Molduras (Frames)
Os Frames so tambm um controle passivo. Frames so usados para melhorarem
o layout do userform. Voc pode us-los ao redor de um grupode botes de opo ou
caixas de verificao ou ao redor de um grupo de caixas de texto ou caixas de combinao
que tenham alguma coisa em comum.
Se voc tiver dois conjuntos de 3 botes de opo num userform e voc no coloc-
los dentro de um frame eles todos funcionanro juntos e voc pode escolher somente um
dos seis. Se voc colocar cada conjunto num frame voc pode escolher um dos trs em
cada conjunto.

Caixas de Verificao (Check Boxes) e Botes de Opo (Option Buttons)


As caixas de verificao e os botes de opo so ambos usados para oferecer ao
usurio uma escolha. A principal diferena entre caixas de verificao e botes de opo
que se voc tiver 5 de cada num form um usurio pode marcar todas as 5 caixas de
verificao mas pode somente selecionar um dos botes de opo. Veja a nota acima sobre
Lies de VBA do Excel 245

frame e botes de opo. Se voc no quiser usar frame para criar grupos de botes de
opo voc precisar usar a propriedade "GroupName" dos botes de opo.
Todos os botes de opo dentro do mesmo GroupName funcionam juntos.
As outras propriedades interessantes das caixas de verificao e botes de opo so:
- WordWrap ser capaz de escrever mais do que uma linha na caption,
- ControlTipText a qual gera uma pequena caixa de comentrio quando o usurio mover
o mouse sobre o controle. Voc pode usar esta propriedade para dar explicaes e
instrues a respeito do boto de comando,
- Enabled e Visible so propriedades que voc pode mudar programaticamente para
desabilitar ou renderizar invisvel um boto de opo ou uma caixa de verificao
seguida de uma slelo prvia num outro controle do userform,
Caixas de Combinao (Combo Boxes) e Caixas de Listagens (List Boxes)
A diferena entre a caixa combo e a caixa de listagem que a caixa combo uma
lista drop-down e o usurio pode submeter um nico valor um dos valores da lista drop-
down ou qualquer outro valor. A caixa de listagem mostra um certo nmero de valores
com ou sem a barra de rolamento (scroll bar) e o usurio pode selecionar nela um ou
mais valores mas no um valor que no est na lista.

Combo Box List Box

Caixas Combo
As propriedades interessantes das caixas de combinao so:

- RowSource Os valores que devero aparecer na lista drop-down da caixa combo so


submetidos na propriedade RowSource. Por exemplo Sheet1!A1:A12 contratar a lista
com os valores residindo nas clulas A1 at A12 da folha com o Caption "Sheet1". As
regras para submeter a propriedade RowSource a caption da folha onde a lista reside
seguida por um ponto de exclamao (!), os endereos da primeira clula, dois pontos
e os endereos se a ltima clula.

NOTA IMPORTANTE: Se houver um espao ou um caractere especial na caption da folha


onde a lista reside voc deve cerc-lo com aspas simples como em 'Esta folha'!A1:A12.
- ListRows o nmero de valores mostrados na lista drop-down. Se voc mostrar menos
do que a lista complete uma barra de rolamento (scroll bar) adicionada
automaticamente.
Lio #07 Cdigo VBA do Excel para UserForms 246

- MatchRequired por default definida para false significando que o usurio pode
submeter qualquer valor na caixa combo. Se voc quiser que o usurio fique limitado
aos valores da lista defina esta propriedade para True.
- Text dever conter um valor mostrado na caixa combo quando o userform estiver
ativado (Selecione uma Cidade, por exemplo).
- ControlTipText que gera uma pequena caixa de comentrio quando o usurio mover o
mouse sobre o controle. Voc pode usar esta propriedade para dar explicaes e
instrues a respeito da caixa combo.
- ColumnCount o nmero de colunas de valores que voc quiser mostrar na drop-down
lista. Por exemplo se voc quiser mostrar parte nmero e parte nome na lista voc
submeter uma RowSource como Sheet1!A1:B12 com a parte nmeros na coluna A e
a parte nomes na coluna B
- ColumnWidth a largura de todas as colunas quando mostrada na lista drop-down da
caixa combo.
- BoundColumn a coluna da qual o valor desenhado para o valor final da caixa combo.
Por exemplo se a parte nmero estiver na coluna A do RowSource e a parte nome
estiver na coluna B do RowSource quando o usurio selecionar um valor somente a
coluna A ou coluna B ser igual ao final valor da caixa combo. Assim se voc definir
o valor de BoundColumn para 1 a parte nmero torna-se o valor final. Se voc definir
BoundColumn para 2 a parte nmero torna-se o final valor.
Caixas Combo em Cascata
Aqui est um simples form exigindo do usurio selecionar um tipo de madeira
para seu revestimento de cho e da uma cor. Nem todas as cores esto disponveis para
todos os tipos de madeira. Quando o tipo de madeira for selecinado na primeira caixa
combo o usurio dever somente ser capaz de selecionar uma cor que est disponvel
para o tipo de madeira selecionado. Estas so as caixas de combinao em cascata.

Voc define a lista de valores para a primeira caixa combo na propriedade


RowSource como descrito acima. Para a lista de valores na segunda caixa combo alguma
programao necessria. Com o cdigo apropriado voc pode mesmo evitar o boto
"Selected". O procedimento move to logo o usurio tenha selecionado uma cor.
Voc tambm pode validar a entrada para ficar certo que o usurio selecionou
ambos um tipo de madeira e a cor.
Veja o captulo sobre o cdigo VBA para userforms e controles. Caixas
de Listagens
Lies de VBA do Excel 247

As propriedades interessantes das caixas de listagens so:


- RowSource Os valores que devero aparecer na lista drop-down da caixa combo
so submetidas na propriedade RowSource. Por exemplo Sheet1!A1:A12 empregar a
lista com os valores residindo nas clulas A1 at A12 da folha com o Caption "Sheet1".
As regras para submeter a propriedade RowSource a caption da folha onde a lista reside
seguida por um ponto de exclamao (!), os endereos da primeira clula, dois pontos e
os endereos se a ltima clula.

NOTA IMPORTANTE: se houver um espao ou um caractere especial na caption da


folha onde a lista reside voc deve cera-lo com aspas simples como em 'Esta
folha'!A1:A12.

- MultiSelect definida para 1 se voc quiser que o usurio seja capaz de selecionar
muitos valores da lista.
- Height O nmero de valores mostrados na lista dependero da altura da caixa de
listagem. Voc pode definir a altura aqui ou no prprio userform esticando-o. Se o nmero
de valores no seu RowSource for maior que aquele que pode ser mostrado na caixa de
listagem uma barra de rolamento adicionada automaticamente. - Text dever conter o
valor mostrado na caixa combo quando o userform estiver ativado (Selecione uma Cidade,
por exemplo).
- ControlTipText que gera uma pequena caixa de comentrio quando o usurio move
o mouse sobre o controle. Voc pode usar esta propriedade para dar explicaes e
instrues a respeito da caixa combo.
- ColumnCount o nmero decolunas de valores que voc quiser mostrar na caixa
de listagem. Por exemplo se voc quiser mostrar parte nmero e parte nome na lista
submeter umaa RowSource como Sheet1!A1:B12 com a parte nmeros na coluna A e a
parte nomes na coluna B
- ColumnWidth a largura de todas as colunas mostradas na lista drop-down da
caixa combo.
- BoundColumn a coluna da qual o valor desenhado para o valor final da caixa
combo. Por exemplo se a parte nmero est numa coluna A do RowSource e a parte nome
est na coluna B do RowSource quando o usurio selecionar um valor somente a coluna
A ou coluna B ser iguala o valor final da caixa combo . Assim se voc definir o valor da
BoundColumn par 1 a parte nmero torna-se o valor final. Se voc definir BoundColumn
para 2 a parte nmero torna-se o valor final Multi Pginas
O controle multi pginas usado para desenvolver userforms mais elaborados
onde o usurio pode ver um diferente conjunto de controles em cada uma das multiplas
pginas. No exemplo abaixo o usurio pode escolher um conjunto de parmetros primrios
numa pgina e a conjunto de parmetros secundrios na segunda pgina.
Lio #07 Cdigo VBA do Excel para UserForms 248

BOTES DE COMANDO NOS USERFORMS E MOSTRAR/OCULTAR


USERFORMS
Para demonstrar como mostrar um userform e como os botes funcionam, crie um
userform em branco e desenhe dois botes nele usando a ferramenta boto na barra de
ferramentas caixa de ferramentas. Quando voc fizer isto, o dilogo dever se parecer
como este:

Se os seus botes no estiverem alinhados, clique num boto e pressione F4 para


mostrar a janela de propriedades. Da ento verifique os valores da posio. Use o drop
down no topo para saltar entre os botes. Ou, clique no boto flecha na barra de
ferramentas e selecione ambos os botes clicando e desenhando uma caixa de seleo ao
redor dos botes. Ento, com o boto direito do mouse selecione Formatar, Alinhar e
escolha as margens de alinhamento.
Lies de VBA do Excel 249

Voc pode tambm selecionar Formatar, Criar mesmo tamanho para o tamanho
dos objetos.

O prximo passo mudar o texto nos botes para OK e Cancelar. Voc pode fazer
isto ou clicando na caixa, ou mudando o texto da Caption na janela de propriedades. Aps
mudar os nomes, mudar a fonte em cada caixa selecionando um boto de cada vez, mostre
a janela propriedades (F4), e d um duplo clique na propriedade fonte. Isto mostra um
Lio #07 Cdigo VBA do Excel para UserForms 250
dilogo que lhe permite mudar a fonte. Mude a fonte para 14 pontos, negrito. O que segue
agora com o que o userform se parece:

A seguir, mude os nomes dos botes na caixa propriedades para Boto_OK e


Boto_Cancelar. Isto os torna mais simples de se trabalhar ao invs dos seus nomes
default.
O prximo passo criar um mdulo que mostrar o dilogo. Para fazer isto
selecione Inserir, Mdulo no menu do VB editor. Inserir o seguinte cdigo neste mdulo:
Sub Mostrar_Meu_UserForm()
UserForm1.Show
'cdigo que armazena a informao do userform
Unload UserForm1
'o que est acima remove o userform da memria
End Sub

Se o nome do seu userform no for "userform1", use seu nome dado ao userform
no cdigo acima. Voc pode mudar o nome de um userform daquele que fora atribuido a
ele pelo VB editor selecionando o userform, mostrando a janela de propriedades e mudar
a propriedade Name. Nenhum espao ou caracteree especial so permitidos.
Execute esta macro pressionando F5, ou
clicando no boto Executar. O userform ser
mostrado.
Lies de VBA do Excel 251

Porm, os botes OK e Cancelar no funciona m! Isto porque nenhum a m acro


fora atribuida a eles. Para liberar o userform neste caso, voc deve clicar no boto
fechar (o pequeno boto X) no canto superior direito do dilogo mostrado. Voc pode
tambm fechar um userform indo ao Visual Basic editor e clicando no boto Redefinir
(o quadradinho em azul na barra de ferramentas do VB editor se ela estiver aberta).
Para fazer os botes OK e Cancelar responderem, voc precisa fazer o seguinte:

D um duplo clique no boto OK. O Excel designar uma macro ao boto chamada de
macro " Boto_OK_Click", e coloca voc no mdulo contendo a nova macro de modo
que voc possa edit-la. (Este mdulo diferente de um mdulo normal, ver discusso
no Cdigo de Mdulo abaixo).
Coloque o seguinte cdigo nesta macro:

Sub Boto_OK_Click ()
'Definir uma varivel pblica para indicar que boto foi clicado
bResposta = True 'ocultar o form
UserForm1.Hide
End Sub

D um duplo clique no boto Cancelar. O Excel atribuir uma macro ao boto


chamada de macro " Boto_Cancelar_Click". Coloque as seguintes declaraes nesta
macro:

Sub Boto_Cancelar_Click ()
Lio #07 Cdigo VBA do Excel para UserForms 252
'definir a varivel pblica para indicar qual boto foi clicado
bResposta = False 'ocultar o form
UserForm1.Hide
'Voc pode tambm usar a declarao " Me.Hide"
End Sub
Modique a macro Mostrar_Meu_UserForm para o seguinte:

Sub Mostrar_Meu_UserForm()
UserForm1.Show
'remover o form da memria (se valores do forem
'necesrios voc primeiro consultar o objeto do form para
'definir a propriedade e da remover o form.
Unload UserForm1
If Not bResposta Then
MsgBox "Selecionou Cancelar"
End
End If
If bResposta Then
MsgBox "selecionou OK"
End If
End Sub

Finalmente, coloque a seguinte declarao no topo do mdulo contendo a macro


Mostrar_Meu_UserForm. Ela poder ficar logo abaixo de quaisquer declaraes
Option.

Public bResposta As Boolean

Agora, quando voc rodar a macro Mostrar_Meu_UserForm e clicar no boto OK ou


Cancelar, o cdigo associado com o clique do boto executar. Neste caso, o boto
oculta o form e ajusta a varivel para pblica. Na macro principal, o userform
removido da memria e o cdigo determina qual ao tomar baseado no valor da
varivel pblica
Um Exemplo
A seguir mostramos como criar um formulrio e como program-lo:
1. Pressione as Teclas Alt + F11, para entrar no editor de Visual Basic.
2. Ative as seguintes opes:
D um clique no menu Exibir e escolha a opo Project Explorer
D um clique no menu Exibir e escolha a opo Janela propriedades
Lies de VBA do Excel 253

2. No menu Inserir escolha a opo UserForm. Isto insere o Formulrio que


programaremos com controles. No Project Explorer se observar que se inseriu
o UserForm.
Lio #07 Cdigo VBA do Excel para UserForms 254
Tambm d um clique no Formulrio USERFORM1 que dever ativar a Caixa de
Ferramentas, se ele no se ativar d um clique no menu Exibir e escolha a opo Barras
de ferramentas e clique na opo Caixa de ferramentas de controle.

1. Escolha na Caixa de Ferramentas o Controle Rtulo, aquele tem um A, e arraste-o


desenhando no Formulrio USERFORM1 o rtulo. Ele ganhar o nome Label1,
depois d um clique no rtulo desenhada e poder modificar o nome de dentro e
coloquemos a Nome. Se por erro deres um duplo clique no rtulo, voc ser enviado
janela de programao do rtulo, da ento d um duplo clique em UserForm1 que
se encontra no Project Explorer.

2. Escolha na Caixa de ferramentas o controle Caixa de texto, o que tem ab e arraste-o


desenhando no formulrio USERFORM1 a caixa de texto ao lado do rtulo Nome.

A caixa de texto deve de estar vazia e seu nome ser Textbox1, o nome somente
aparecer na janela de propriedades do controle.

3. Faa os dois passos anteriores igualmente, colocando Endereo na Label2 e


Telefone na Label3 e tambm redimensione a sua Textbox. Isto ficar assim depois
de fazer isto
Lies de VBA do Excel 255

Se tiveres algum problema ao desenhar os rtulos ou as caixas de texto, somente


troque o nome do Rtulo ou da Caixa de texto na Janela propriedades. A opo se
chama (Name).
O Erro que marcar pode ser Nome Ambguo, mas se se trocar o Nome do controle
se resolver o erro. Podes por qualquer nome no lugar de Label1.

Somente altere isto se marcar erro, se NO deixe assim.


Os controles como as Rtulos e Caixas de textos podem modificar algunas opes
na Janela Propriedades. Para fazer isto necessrio ter conhecimento sobre as
propriedades dos controles. No altere as propriedades se no as conhece.
4. Escolha na Caixa de ferramentas o controle Boto de Comando e arraste-o desenhando
no Formulrio USERFORM1 um boto. Ser criado a um boto de comando rotulado
CommandButton1. Depois d um clique no nome do boto desenhado e poder
modificar este nome. Coloquemos a Inserir. Se por erro deres um duplo clique no
boto, sers enviado janela de programao do boto, para voltar, somente d um
duplo clique em UserForm1 que se encontra no Project Explorer.
Assim ficar o Formulrio formado pelos controles:
Lio #07 Cdigo VBA do Excel para UserForms 256

Agora d um duplo clique sobre o controle Textbox1 para program-lo e depois


inserir o seguinte cdigo:
Private Sub TextBox1_Change()
Range("A9").Select
ActiveCell.FormulaR1C1 = TextBox1
End Sub
Isto indica que se v A9 e escreva o que h no Textbox1
Nota.-O que esta em azul (Claro e escuro) foi gerado automticamente pelo Excel, voc somente
escrever o que esta em Negrito.
Para voltar ao Formulrio e programar o Textbox seguinte d um duplo clique
em UserForm1 que se encontra no Project Explorer, ou simplemente d um clique em
Exibir Objeto no mesmo Project Explorer.

Agora d um duplo clique sobre o controle Textbox2 para program-lo e depois


inserir o seguinte cdigo:
Private Sub TextBox2_Change()
Range("B9").Select
ActiveCell.FormulaR1C1 = TextBox2
End Sub
Isto indica que se v B9 e escreva o que h no Textbox2
Para voltar ao Formulrio e programar o Textbox seguinte d um duplo clique
em UserForm1 que se encontra no Project Explorer, ou simplemente d um clique em
Exibir Objeto no mesmo Project Explorer.
Agora d um duplo clique sobre o controle Textbox3 para program-lo e depois
inserir o seguinte cdigo:
Private Sub TextBox3_Change()
Range("C9").Select
ActiveCell.FormulaR1C1 = TextBox2
End Sub
Isto indica que se v C9 e escreva o que h no Textbox3
Para voltar ao Formulrio e programar o Boto de Comando Inserir d um
duplo clique em UserForm1 que se encontra no Project Explorer, ou simplemente d
um clique em Exibir Objeto no mesmo Project Explorer.
Agora d um duplo clique sobre o controle Boto de Comando para programlo
e depois inserir o seguinte cdigo:
Private Sub CommandButton1_Click()
Rem inserir uma linha
Selection.EntireRow.Insert
Rem o Empty Limpa os Textbox
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
Lies de VBA do Excel 257

Rem A declarao Textbox1.SetFocus Enva o cursor ao Textbox1


para voltar a capturar os dados
TextBox1.SetFocus
End Sub
Nota.-O comando Rem empregado para colocar comentrios dentro da programao, o comando Empty
empregado para esvaziar as Textbox.
Agora pressione o boto Executar Sub/UserForm que se encontra na barra de
ferramentas ou simplemente a tecla de funo F5.

Ativar-se- o Userform1 e tudo o que se escrever nas Textbox se escrever no Excel e


quando pressionares o boto Inserir, se inserir uma linha, esvaziaro as Textbox e depois
se mostrar o cursor no Textbox1.
Lio #07 Cdigo VBA do Excel para UserForms 258
TRABALHANDO COM FRMULAS
de suma importncia saber aplicar Frmulas em Macros do Excel, j que a
maioria das folhas de clculos as envolvem, por exemplo os Inventrios, as Normas ou
qualquer outro tipo de folha as levam, por isso que nesta lio se mostra como manejar
Frmulas em Macros de Excel.

Pressione as Teclas Alt + F11, para entrar no editor de Visual Basic.


1. Ative as seguintes opes:
D um clique no menu Exibir e escolha a opo Project Explorer
D um clique no menu Exibir e escolha a opo Janela propriedades
1. No menu Inserir escolha a Opo UserForm. Isto insere o Formulrio que
programaremos com controles. No Project Explorer se observar que se inseriu o
UserForm.
Agora criars um formulrio com o seguinte aspecto:

o formulrio ter:
Trs rtulos
Trs Textbox
Um Boto de Comando
Os dados que se perguntaro sero Nome e Idade, os Dias Vividos sero gerados
automaticamente quando se inser a idade. A seguir se mostra como se devem de programar
estes Controles: Programao dos Controles:

Private Sub CommandButton1_Click()


Selection.EntireRow.Insert
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus End
Sub

Private Sub TextBox1_Change()


Range("A9").Select
ActiveCell.FormulaR1C1 = TextBox1 End
Sub

Private Sub TextBox2_Change()


Range("B9").Select
ActiveCell.FormulaR1C1 = TextBox2
Lies de VBA do Excel 259

Rem aqu se criar a Formula


TextBox3 = Val(TextBox2) * 365
Rem O Textbox3 guardar o total da multiplicao do Textbox2 por
365
Rem O Comando Val permite convertir um valor de Texto a um Vaor
Numrico
Rem Isto se deve a que os Textbox no so Numricos e devemos de
Convert-los
End Sub

Private Sub TextBox3_Change()


Range("C9").Select
ActiveCell.FormulaR1C1 = TextBox3
End Sub
Isto vai permitir que quando se executar o formulrio e se der a idade o resultado
dos dias vividos aparecer no Textbox3 e se escrever tambm em Excel. O comando
Val um comando de Visual Basic que te permite converter um valor de texto a um
valor numrico. Lembrem-se que o Comando Rem se utiliza para colocar comentrios
nicamente e no afeta programao.
Este Arquivo desta Macro se chama Macros de Idade e est incluido aqu.
Geraremos outro exemplo, crie o seguinte Formulrio com os seguintes dados:

5 Rtulos
5 Textbox
1 Boto de Comando
Os dados que se perguntaro sero Nome, Dias Trabalhados, Pagamento Dirio,
Bonos e Saldo Lquido.

Gere o seguinte cdigo:

Private Sub CommandButton1_Click()


Selection.EntireRow.Insert
TextBox1 = Empty TextBox2
= Empty
TextBox3 = Empty
TextBox1.SetFocus
Lio #07 Cdigo VBA do Excel para UserForms 260
End Sub
Private
Sub
TextBox1
_Change(
)
Range("A9").Select
ActiveCell.FormulaR1C1 = TextBox1
End Sub

Private Sub TextBox2_Change()


Range("B9").Select
ActiveCell.FormulaR1C1 = TextBox2
End Sub

Private Sub TextBox3_Change()


Range("C9").Select
ActiveCell.FormulaR1C1 = TextBox3
End Sub

Private Sub TextBox4_Change()


Range("D9").Select
ActiveCell.FormulaR1C1 = TextBox4
Rem aqui se criar a formula
TextBox5 = Val(TextBox2) *Val(TextBox3) + Val(TextBox4)
Rem O TextBox5 guardar o total
End Sub

Private Sub TextBox5_Change()


Range("E9").Select
ActiveCell.FormulaR1C1 = TextBox5 End
Sub

Quando se introduzir os bonos, automaticamente se gerar o Saldo Lquido.


Este exemplo vem no Arquivo Macros de Saldo Lquido
USANDO INFORMAO COM UMA TEXTBOX
Pode-se buscar informao com uma Textbox programando-a da seguinte forma:

Desenhe uma Rtulo, um Textbox e um Boto de Comando e agregue o seguinte


Cdigo:
Private Sub TextBox1_Change()
Lies de VBA do Excel 261

Range("A9").Select
ActiveCell.FormulaR1C1 = TextBox1 End
Sub

Private Sub CommandButton1_Click() Sub


Cells.Find(What:=TextBox1, After:=ActiveCell, BaloDoOffice()
LookIn:=xlFormulas, LookAt _ Assistant.On =
False
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, If
MatchCase:= _ MsgBox("
False).Activate Habilita
r o
End Sub Assisten
Observe que foi incluido na programao do boto Buscar Agora que buscar o te do
que est no Textbox1 na hora que se pressionar. Office?"
, _
TRABALHANDO COM O ASSISTENTE vbYesNo,
"Assista
O assistente o personagem do Office nte est
Desligad
que se ativar e nos ajudar com suas
o") =
vbYes
Then
Assistant.On
= True
janelas que podemos manipul-las, por exemplo, pode-se dar animao, mover-
Assistant.Visibl
se, fazer perguntas, etc. e = True

Assistan
t.Animat
ion = _
msoAnima
A seguir se mostram alguns cdigos do Assistente: tionGetA
Este cdigo permite tornar visvel o ajudante ou seja mostr-lo. Se desejares ttention
ocult-lo somente troque a opo True por False. Assistant.Visible = True Major
End If
Este cdigo permite Mover o Asistente a um novo lugar, somente troque os
With
valores numricos e trocar de posio. Assistant.NewBal
Assistant.Move 430, 230 loon
Este cdigo permite ativar um efeito de animao, quando escrever o sinal de .Text = "Desejas
Igual depois de Assistant.Animation =, aparecer um menu com diferentes efeitos de Apagar este
animao Registro?"
Assistant.Animation = msoAnimationListensToComputer .
B
Este exemplo permite criar um Novo Asistente para poder manipular com uma pergunta u
e que tu a contestes. A varivel t guardar o valor da resposta, se o valor -3 significa t
que Sim e portanto apagar a linha. t
Lio #07 Cdigo VBA do Excel para UserForms 262

on = msoButtonSetYesNo
.Heading = "Advertncia" t =
.Show
Assistente do Office - chamado Clip

Outro Assistente do
Office - chamado Mimi

End With
If t = -3 Then
Assistant.Animation = msoAnimationEmptyTrash
Selection.EntireRow.Delete
End If
End Sub

Outros Assistentes ( Pingo, F1, Office Logo, Merlin, Natureza, Rex) encontram-se na
Galeria de Assitentes do Office.
263

Lio 7: Cdigo VBA do Excel para UserForms

O
l amigos, estamos de novo aqu para mostrar como se manipularo Consultas
nos Formulrios, acessos s Macros do Excel sem necesidade de entrar no
Visual Basic e alguns mtodos mais fcil de trabalhar.
ELABORANDO UMA CONSULTA
Todo Registro de informao deve de ter sua prpria Consulta, Baixa e
Modificao, por isso que neste novo captulo nos concentraremos nele,
primeiramente em poder consultar a informao que j se escreveu na Folha do Excel,
obviamente desde uma Macro combinada com Visual Basic, observemos o seguinte
exemplo:
1. Pressione as Teclas Alt + F11, para entrar no editor de Visual Basic.
2. Ative as seguintes opes:
D um clique no menu Exibir e escolha a opo Project Explorer
D um clique no menu Exibir e escolha a opo Janela propriedades
No menu Inserir escolha opo UserForm. Isto insere o Formulrio que
programaremos com controles. No Project Explorer se observar que se inseriu o
UserForm.
Agora criars um formulrio com o seguinte aspecto:

o formulrio ter:
Trs rtulos
Trs Textbox
Trs Botes de Comando
Os dados que se perguntaro sero Nome, Endereo e Telefone. Os trs botes nos
serviro para o seguinte:

Consultar - consultar a informao que tenhamos inserido com o boto inserir. Baixa -
poder eliminar algum dado que se consultou e no o queremos.
Inserir - ter a fun-o de inserir os registros, como os exerccios anteriores. A seguir
se mostra como se devem de programar estes Controles:
Programao dos Controles: BOTO
DE CONSULTA
Private Sub CommandButton1_Click()
Cells.Find(What:=TextBox1, After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
Lio #07 Cdigo VBA do Excel para UserForms 264

MatchCase:= _
False).Activate
ActiveCell.Offset(0, 1).Select
TextBox2 = ActiveCell
Rem linha que contm o ActiveCell.Offset(0, 1).Select permite
mover-se uma coluna direita, portanto depois da busca das
primeiras linhas com Cell.Find se encontra o Nome da pessoa se
move seguinte coluna e a linha TextBox2 = ActiveCell Permite
capturar o valor da clula ao Textbox2 e asim mostrar o dado da
clula no TextBox2.
ActiveCell.Offset(0, 1).Select
TextBox3 = ActiveCell
Rem Cada vez que se escrever linha ActiveCell.Offset(0,
1).Select significa que se tem que mover-se uma coluna
direita.
Rem Se o nome que tratas de consultar no se encontra poderia
gerar um erro porque falhara o Cell.Find isto pode ocorrer no
Word 97, eu trabalho com o Word 2007 e no tenho esse problema.
Mas isto se solucionara com uma rotina de erro.
End Sub

BOTO BAIXA
Private Sub CommandButton2_Click()
Selection.EntireRow.Delete
Range("A9").Select
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus
End Sub

BOTO INSERIR
Private Sub CommandButton3_Click()
Range("A9").Select
Selection.EntireRow.Insert
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus
End Sub

CAIXAS DE TEXTO
Private Sub TextBox1_Change()
Range("A9").FormulaR1C1 = TextBox1
Rem esta primeira linha trocar estas duas que te parece
todava mas curta Range("A9").Select
ActiveCell.FormulaR1C1 = TextBox1
End Sub

Private Sub TextBox2_Change()


Range("B9").FormulaR1C1 = TextBox2
Lies de VBA do Excel 265

End Sub

Private Sub TextBox3_Change()


Range("C9").FormulaR1C1 = TextBox3
End Sub
Se com o Boto Consulta tens um erro quando no encontra pessoa, ento ters de
agregar isto a teu cdigo do Boto Consultar
BOTO DE CONSULTA
Private Sub CommandButton1_Click() On
Error Goto aoencontro
Rem esta linha gera uma rotina de erro se Excel encontrar um
erro se o disser que se v rtulo aoencontro que est definida
mais adiante no cdigo. No use a janela de erro se no tiveres
problemas hora que no encontrares a pessoa. Lembre-se se voc
cometer qualquer erro o Excel se dirigir ao rtulo a noencontro
e ignorar qualquer erro,at um que voc cometer na programao.
Cells.Find(What:=TextBox1, After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False).Activate
ActiveCell.Offset(0, 1).Select
TextBox2 = ActiveCell
ActiveCell.Offset(0, 1).Select
TextBox3 = ActiveCell
Rem Tambm se pode utilizar este cdigo para ler a informao
das clulas ou que est em azul. A diferena que se atribuam
os valores s variveis e depois se descarregam os TextBoxs.
ActiveCell.Offset(0, 1).Select
Endereo = Activecell
ActiveCell.Offset(0, 1).Select
Telefone = Activecell
TextBox2 = endereo TextBox3
= Telefone aoencontro:
Rem Aqu se esquiva o erro
End Sub
O que lhe aparece incrvel como uma Macro combinada com Visual Basic pode
fazer at o impossvel
Bom j que temos elaborado um exerccio de consultas de dados, agora
acessaremos ao formulrio do Excel sem necesidade de entrar no Editor de Visual
Basic.
Para realizar este exerccio devemos permanecer dentro do Editor de Visual Basic
para poder introduzir o cdigo em um Mdulo, portanto devers seguir os seguintes
passos:
D um clique no menu Inserir e escolha a opo Mdulo
Escreva dentro do Mdulo o nome do mdulo em este caso Sub Entrada
Quando voc escrever Sub Entrada aparecer da seguinte manera:
Sub Entrada()
Load UserForm1
Lio #07 Cdigo VBA do Excel para UserForms 266

UserForm1.Show End
Sub

Voc dever escrever as duas linhas que esto no meio que so:
Load UserForm1
UserForm1.Show
A primeira linha significa que carregue na memria o formulrio que se chama
UserForm1, a segunda linha significa que o mostre, isto quer dizer que no mdulo
estamos escrevendo o cdigo de uma macro que permitir carregar o formulrio do
Excel sem necessidade de entrar no Editor de Visual Basic. Veja se no Project
Explorer aparece o Mdulo que criamos.
Lies de VBA do Excel 267

Se quisermos voltar ao formulrio somente d um duplo clique em UserForm1


Bom j est visto, agora salvamos do Editor de Visual Basic e voltemos ao Excel.
D um clique no menu Arquivo do Editor de Visual Basic
Escolha a opo Fechar e voltar ao Microsoft Excel
Agora que estamos no Excel, podemos inserir uma imagem, ou um boto, ou qualquer
grfico, por exemplo:
D um clique no menu Inserir
Escolha a opo Figura, seguido por Figura Do Arquivo Inserir qualquer
Figura e d a ela o tamanho que voc desejares.
D um clique no boto direito do mouse sobre a Figura
Escolha a opo Atribuir macro
D um clique na Macro que se chama Entrada, fcil, foi a nica que fizemos
De um clique em OK
D um clique fora da imagem em qualquer clula e dai se pressionar a imagen
carregar o formulrio.
COMO AGREGAR INFORMAO A UMA CAIXA DE COMBINAO E UMA
CAIXA DE LISTAGEM
Bem, comearemos com como agregar informao a uma Caixa de Combinao
(ComboBox) e a uma Caixa de listagem (ListBox).
Primeiramente devers criar o seguinte formulrio dentro de Visual Basic.
Lio #07 Cdigo VBA do Excel para UserForms 268

Lembre-se de que do Excel se


utiliza a tecla ALT + F11 para
entrar no Visual Basic,
seguido do menu Inserir e
depois Userform, bem creio
que j o sabes.

Insira uma Caixa de Combinao (Combox), uma Caixa de Listagem (Listbox)


e um Boto.

Agora que j criastes a interface, vamos programar ao boto, e veremos como se


lhe podem agregar informao por meio de cdigos a estes dois novos controles. D um
duplo clique no boto e escreva as seguintes linhas dentro do procedimento.

Private Sub CommandButton1_Click()


ComboBox1.AddItem "Joo Jos"
ComboBox1.AddItem "Pedro da Fonte"
ComboBox1.AddItem "Salvador da Luz"
ListBox1.AddItem "Joo Jos"
ListBox1.AddItem "Pedro da Fonte"
ListBox1.AddItem "Salvador da Luz"
End Sub

Bem vamos analizar o significado destas linhas:


ComboBox1.AddItem "Joo Jos "
A opo AddItem significa que vais agregar um dado de texto, portanto se entende como
vais agregar a Joo Jos ao Combobox1, logo eu posso agregar os dados que quiser a um
Combobox ou a uma Listbox com a opo AddItem, ento ao se pressionar o boto
aparecero os dados que se encontram escritos e poders selecionar qualquer um deles,
lembre-se que a informao vai se agregar segundo tuas necessidades.
Agora se desejares agregar nmeros a um Combobox ou ListBox escreva o seguinte
cdigo em um boto:
Private Sub CommandButton1_Click()
For X=1 to 50
Listbox1.AddItem str(x)
Next
End Sub

A instruco For-Next um ciclo contador que te permite contar de um nmero at


um outro. Por exemplo, digo-lhe que conte desde o 1 at 50 e o que se encontrar dentro
do ciclo For-Next, o executar o que estiver dentro o nmero de vezes, a X uma varivel
Lies de VBA do Excel 269

numrica em que se guarda o valor, cada vez que o ciclo d uma volta aumenta um
nmero, portanto X vai valer desde 1 at 50, e a instruo Str para converter o valor
numrico da X em valor de texto, j que a opo AddItem guarda somente texto, claro
esta que tambm pode funcionar sem esta instruo em alguns casos.
Portanto o Listbox1 vai guardar os nmero do 1 ao 50, sem necesidade de ires
pondo de um por um, imagine. Listbox1.AddItem 1
Listbox1.AddItem 2
Listbox1.AddItem 3
J te quero ver no cdigo para que chegues ao 50, hahahahahahaha.
Bem, isto para se introduzir os dados a um ListBox e ComboBox, mas como
posso usar estes dados para envi-los para uma clula? No exemplo seguinte eu te
explico:
D um duplo clique na Listbox e escreva o seguinte cdigo:
Private Sub ListBox1_Click()
Range("A9").Select
ActiveCell.FormulaR1C1 = ListBox1
End Sub
Assim fcil, cada vez que escolher um dado que se encontre em um Listbox1
ele o enviar clula A9, escrevendo-o a. Se desejares, podes fazer em um Combobox,
somente trocando a Listbox1 por Combobox1 e se acabou.
Agora se desejares agregar os dados ao Listbox ou Combobox sem nenhum boto a
pressionar, escreva o seguinte cdigo:
Private Sub UserForm_Activate()
ComboBox1.AddItem "Joo Jose"
ComboBox1.AddItem "Pedro da Fonte"
ComboBox1.AddItem "Salvador da Luz"
ListBox1.AddItem "Joo Jos"
ListBox1.AddItem "Pedro da Fonte"
ListBox1.AddItem "Salvador da Luz End
Sub
A chave est no procedimento UserForm_Activate(), isto quer dizer que quando se
ativar o formulrio carregar o que tu o indicares, neste caso procures introduzir os dados
ao Listbox1 e Combobox1 automaticamente, veja o que te aparece.
Lio #07 Cdigo VBA do Excel para UserForms 270

Agora se desejares tomar informao de uma clula e envi-la a um Combobox


ou Listbox escreva o seguinte cdigo num Boto: Private Sub
CommandButton1_Click()
Range("A9").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
ListBox1.AddItem ActiveCell
Loop
End Sub
Percebestes bem, primeiramente movo ao range (clula) A9 porque a est o incio de
minha informao, depois a linha Do While Activecell<> Empty significa Fazer enquanto
as clulas no se encontrem vazias, a seguinte linha que ActiveCell.Offset(1, 0).Select,
significa abaixar uma Linha, a seguinte linha ListBox1.AddItem ActiveCell, agrega a
informao desta nova clula ao Listbox1 e a linha Loop parte do ciclo Do While, ela
sempre encera o ciclo, como o For-Next. Portanto todos os nomes que estiverem depois
de A9 sero enviados ao Listbox1 e quando o ciclo topar com a clula A14 que se encontra
vazia, a condio do Do While parar a execuo de seu cdigo. Isto funciona caminhando
linhas abaixo, mas se desejares mover direita, por colunas, somente trocar a linha
ActiveCell.Offset( 1, 0).Select, por ActiveCell.Offset( 0, 1).Select, quer dizer que se
mova por coluna, no por linha.
ActiveCell.Offset( Range, Column).Select .
Se se troca o 1 por outro nmero se mover o numero de vezes que tu indicar, por
exemplo, se quero baixar 10 linhas num golpe:
ActiveCell.Offset(10, 0).Select
Se quiser mover-me 20 colunas direita
ActiveCell.Offset(0, 20).Select Assim
funciona isto.
COMO SE EXECUTA UMA MACRO NA HORA DE ABRIR UMA PASTA
Agora veremos como se executa uma macro na hora de abrir uma pasta
Lies de VBA do Excel 271

Primeiramente insira um Mdulo do menu Inserir dentro do Visual Basic e escreva o


seguinte cdigo:
Sub Auto_open()
Load UserForm1
UserForm1.Show
End Sub
A magia est no procedimento Auto_open() que permite executar
automaticamente o que se encontrar dentro, quando abrires uma pasta que contenha este
cdigo, neste exemplo quando se abre o pasta deve-se ativar o formulrio 1 que
programamos. Assim tudo o que agregares dentro deste procedimento se executar
automaticamente quando abrires uma pasta, o que achas?.
A seguir veremos como ordenar uma informao por ordem alfabtica ascendente,
um cdigo muito completo e bom que te permite localizar os dados e orden-los, sem
passar uma linha em branco.
Observemos o seguinte exemplo e aprendamos dele:
Percebe-se na janela seguinte que tenho dados em uma folha que comea na linha
A10 e termina na C16, o seguinte cdigo detectar donde se deve parar para poder ordenar
os dados. necessrio criar o cdigo para ordenar dados, mas aqu eu te mostro:

Programar isto num boto1


Private Sub CommandButton1_Click()
Rem este cdigo localiza o ltimo registro por meio da regio
Lio #07 Cdigo VBA do Excel para UserForms 272

Range("A10").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Loop
Rem chega at o A17 donde no h informao e se volte uma
regio para ser exato com a seguinte linha.
ActiveCell.Offset(-1, 0).Select
Rem este cdigo localiza a ltima coluna do ltimo dado
Do While ActiveCell <> Empty
ActiveCell.Offset(0, 1).Select
Loop
ActiveCell.Offset(0, -1).Select
Rem esta linha guarda a varivel clulaativa na clula exata
donde est o ltimo dado da ltima coluna de informao, neste
caso C16.
clulaativa = ActiveCell.Address
Rem este cdigo toma o range desde A10 donde comea a
informao, at onde encontrou o ltimo dado C16, que o guardar
varivel clulaativa. Seleciona de A10 at C16.
Range("A10:" + clulaativa).Select
Rem este cdigo ordena os dados norden ascendente, o cdigo foi
gerado em Excel, assim que se no sabes ger-lo apenas copie-o
daqui.
Selection.Sort Key1:=Range("A10"), Order1:=xlAscending,
Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
Assim como funciona este cdigo de Macros do Excel ordenando exatamente
desde A10 at onde esto os dados finais.
Bem, agora para converter a informao a Minscula ou Maiscula, o cdigo
muito parecido, somente observ-lo:
Private Sub CommandButton2_Click()
Range("A10").Select
Do While ActiveCell <> Empty
ActiveCell.FormulaR1C1 = LCase(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Lies de VBA do Excel 273

Assim a magia de Lcase que converte Minsculas e Ucase Maisculas,


comea em A10 e at que no encontra dados deixa de converter a Minsculas.
O seguinte Formulrio e cdigo mostrar fora de como se pode consultar e
modificar o dado que se encontrou.

Crie a seguinte Interface, 4 Rtulos, 3 Caixas de Textos (Textbox) e 3 Botes


No Rtulo 4, escreva o nmero 9 dentro dele. Copie o seguinte cdigo:
Private Sub CommandButton1_Click()
Rem no se escreva nada nos Textboxs na hora de inserir escreva
No Tem
If TextBox1 = EmptyThenRange("A9").FormulaR1C1 = "No tem"
If TextBox2 = EmptyThenRange("B9").FormulaR1C1 = "No tem"
Lio #07 Cdigo VBA do Excel para UserForms 274

If TextBox3 = EmptyThenRange("C9").FormulaR1C1 = "No tem"


Range("A9").Select
Selection.EntireRow.Insert
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus
End Sub
Private Sub CommandButton2_Click()
On Error GoTo noencontro
Rem Cdigo para buscar, j o conhecemos
Cells.Find(What:=TextBox1, After:=ActiveCell,
LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext,
MatchCase:= _
False).Activate
ActiveCell.Offset(0, 1).Select
TextBox2 = ActiveCell
ActiveCell.Offset(0, 1).Select
TextBox3 = ActiveCell
Rem o rtulo 4 toma o valor da regio ativa e permite modificar
a informao que encontrou, j que modifiques a informao
pressionas o boto atualizar. Label4 = ActiveCell.Row
noencontro: End Sub

Private Sub CommandButton3_Click()


Rem Volte a indicar a regio 9 para escrever nos Textboxs
Label4 = "9"
Range("a9").Select
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus
End Sub
Private Sub TextBox1_Change()
Rem se nos damos conta o rtulo 4 serve para levar regio donde
introduzimos os dados os modificamos, assim que cada textbox que
programemos deve levar estas linhas. Range("A" +
Label4).FormulaR1C1 = TextBox1
End Sub

Private Sub TextBox2_Change()


Range("B" + Label4).FormulaR1C1 = TextBox2
End Sub
Private Sub TextBox3_Change()
Range("C" + Label4).FormulaR1C1 = TextBox3
End Sub

MDULOS DE CDIGOS DE USERFORM


Lies de VBA do Excel 275

Quando voc der um duplo clique num objeto sobre um userform, o VB editor
atibuir automaticamente uma macro para o objeto, e criar o que chamado um mdulo
de cdigo que contm as macros atribuidas para aqueles objetos do userform. Este mdulo
de cdigo no est mostrado na janela do Explorer. Voc pode acessar o mdulo de cdigo
por um duplo clique num objeto sobre o userform, d um clique com o boto direito do
mouse sobre o userform ou em um objeto sobre ele e selecione ver cdigo, ou d um
clique com o boto direito do mouse sobre o userform mostrado na janela de projeto e
selecione ver cdigo. Para retornar ao userform, d um clique com o boto direito do
mouse sobre a janela de cdigo e selecione ocultar. Voc pode tambm alternar para trs
e para frente selecionando o menu Exibir e selecionando ou o Cdigo ou o Objeto.
Por favor note que embora voc possa criar variveis pblicas dentro um mdulo
de cdigo de userform, estas variveis pblicas no esto disponveis para os outros
mdulos. Para uma varivel pblica ficar disponvel a outras macros e mdulos, elas
devem ser criadas num mdulo normal.
PONTOS PRINCIPAIS SOBRE USERFORMS E BOTES
A seo anterior ilustra os seguintes pontos principais:
Para ver previamente um form, v folha de userform e pressione a tecla F5
O mtodo Show quando usado com um userform no retorna True ou False como faz
com uma folha de dilogo. Se voc tiver tentado a seguinte declarao,

bResponse = userform1.Show

A declarao ter sido destacada como contendo um erro de sintaxe desde que um
userform no retorna com um valor.
As macros atribuidas a um boto so armazenadas em separado daquelas macros que
voc criou para os seus mdulos.
Voc no pode atribuir macros a botes; por outro lado o VB editor faz isto para voc,
e dita o nome que ser usado. Se voc mudar o nome do boto, ento a macro atribuida
anteriormente no mais atribuida ao boto.
Voc poder minimizar o cdigo nas macros atribuidas aos botes e objetos. O que
voc dever fazer usar uma varivel global, tal como bResponse na seo acima,
para armazenar a resposta do usurio. Da ento, quando o controle retornar da
chamada da macro, aquela macro determina que ao dever ser tomada.

Um userform mostrado usando o mtodo Show. Entretanto, ela liberada usando o


comando Unload. Note que Show est presa ao nome do userform com um ponto, e
que Unload uma palavra solitria, com o nome userform seguindo-a (o que segue
assume o userform ser chamado de "userform1":

userform1.Show
'declaraes que obtm informaes do userform
Unload userform1
Lio #07 Cdigo VBA do Excel para UserForms 276

Se voc fosse usar a declarao userform1.Hide, isto ocultaria o dilogo, mas no


remova-o (unload) da memria. Se sua macro posta em ao como um resultado de
selees sobre o userform, ento voc poder usar Hide ao invs de Unload. Isto
discutido mais tarde neste captulo.
USANDO FRAMES NUM USERFORM
Um frame sobre um userform usado para agrupar botes de opes, de modo
que somente um boto num grupo possa ser selecionado. E tambm usado para fornecer
alguma ordem ao userform, enquadrando objetos relacionados no userform.
Se voc colocar um frame num userform aps voc ter colocado outros objetos, o
frame fica na frente, e ele oculta os outros objetos. O modo mais fcil para ocultar os
objetos visveis arrast-los para fora da rea do frame, e ento voltar completamente
sobre o frame. Se somente parte do item est no frame, ento somente a no coberta
visvel. Mudar o frame de lugar freqentemente exigido para se ver os objetos ocultos.
USANDO BOTES DE OPES NUM USERFORM
Para ilustrar os botes de opo num userform, expanda o userform criado
anteriormente para ter trs botes de opes:

Os Botes de Opo podem ter um valor True ou um valor False. Sabendo isto,
o que segue a verso modificada da macro Show_Meu_UserForm que ilustra o uso dos
botes de opes:

Sub Show_Meu_User_Form()
'defina os valores iniciais do boto de opo
UserForm1.OptionButton1.Value = True
UserForm1.Show
If Not bResponse Then End
'determina qual boto foi selecionado
With UserForm1
Select Case True
Case .OptionButton1.Value:
MsgBox "Boto 1 selecionado "
Case .OptionButton2.Value:
MsgBox "Boto 2 selecionado "
Case .OptionButton3.Value:
Lies de VBA do Excel 277

MsgBox "Boto 3 selecionado"


End Select
End With
Unload UserForm1 End
Sub

Pontos chaves no uso dos botes de opo:


A macro sabe quais botes de opes esto sendo questionados pois eles so
qualificados com o objeto chamado UserForm1. A declarao With...End With usada
para minimizar a digitao e tornar o cdigo mais eficiente vs. qualidade de cada boto
de opo com "UserForm1".

O valor inicial de um dos botes de opo configurado pela macro. Isto uma boa
tcnica de programao.
Numa aplicao real, voc pode mudar o texto do boto de opo, sua fonte, seu
nome, e quaisquer de suas outras propriedades.
USANDO CAIXAS DE LISTAGEM (LISTBOXES) NOS USERFORMS
Uma caixa de listagem (listbox) uma grande maneira de mostrar uma lista de
seleo a um usurio que ter de selecionar um ou mais itens da lista. Se a um usurio
permitido pegar somente um dos itens de uma listbox, ento voc pode obter o texto e a
posio na listbox do item selecionado (menos um quando o primeiro item for
0, o segundo 1, etc.) usando o cdigo como o que segue:

Dim listText As String


Dim listNumber As Integer
If UserForm1.ListBox1.ListIndex = 1 Then
MsgBox "Nenhuma seleo foi feita" Else
listText = UserForm1.ListBox1.Value & "selecionado" listNumber
= UserForm1.ListBox1.ListIndex
MsgBox listNumber & " " & listText
End If

Se a um usurio for permitido pegar mltiplas selees numa lista (configure-as


mudando a propriedade MultiSelect da listbox), da o que segue como voc retornaria
os itens selecionados e suas posies na caixa de listagem:

Dim listText As String


Dim listNumber As Integer
Dim I As Integer
UserForm1.Show
With UserForm1.ListBox1
For I = 0 To ListCount1 If
.Selected(I) Then listText =
.List(I) listNumber = I
MsgBox listNumber & " " & listText
Lio #07 Cdigo VBA do Excel para UserForms 278

End If
Next
End With
Unload UserForm1

Existem vrias maneiras para especificar a lista-fonte a uma listbox:


Selecione a caixa de listagem no Visual Basic editor e mostre a janela de propriedades.
Da ento configure a propriedade RowSource para referir a um range na pasta
contendo o userform. Se voc estivesse especificando a linha fonte numa pasta
diferente, ento voc teria de estabelecer um link para aquela pasta, o que pode ser
bastante irritante. Tambm muito difcil especificar um range manualmente. Voc
precisa digitar nas declaraes como "'Plan1'!A1:A12".
Especificar um range numa planilha como lista usando a declarao no seu cdigo.
Por exemplo:

UserForm1.ListBox1.RowSource = "'Plan1'!A1:A12"

Ou

UserForm1.ListBox1.RowSource = Selection.Address(External:=
True)

A segunda abordagem bem mais fcil e engloba que os nomes da planilha e da pasta
estejam incluidos na string endereo passada a RowSource. Tambm, voc pode usar
qualquer range, ele no tem de ser selecionado.
Se voc quiser fornecer a RowSource manualmente na janela de propriedades, o modo
mais fcil usar um nome do range para especificar a lista. Este modo, voc pode
mudar o range e no precisa modificar o RowSource. Por favor note que voc no
pode deletar um item de uma lista se ela est configurada por uma referncia a um
range. Voc precisar mudar os contedos do range e ento especificar a propriedade
RowSource se ela est no estilo A1.
Se voc especificar a propriedade RowSource e configurar a propriedade
ColumnHeads para True, a linha imediatamente acima da RowSouce torna-se uma
linha de ttulo na caixa de listagem.
Voc pode especificar uma propriedade RowSource que a largura das colunas
mltiplas. Se voc fizer isto, voc tambm precisar especificar o nmero de colunas
na propriedade ColumnCount. E, voc pode mudar o tamanho das colunas que so
mostradas digitando nelas nmeros seguidos por uma virgula na propriedade
ColumnWidths. A propriedade BoundColumns especifica o valor coluna que
retornado para uma seleo de lista. Por exemplo, voc pode mostrar apenas uma
coluna, mas ter outros valores de colunas retornados pela seleo da lista. Para mais
ajuda em como estas propriedades funcionam, selecione qualquer uma destas
propriedades e pressione a tecla F1.
Use o mtodo Additem na sua macro:
Lies de VBA do Excel 279

With UserForm1.ListBox1
.AddItem ("Jan")
.AddItem ("Fev")
.AddItem ("Mar")
End With
Crie um array, e da especifique que o array para a lista:

Dim MeuArray(1 To 3)
MeuArray(1) = "Jan"
MeuArray(2) = "Fev"
MeuArray(3) = "Mar"
UserForm1.ListBox1.List() = MeuArray

Se voc usar a abordagem array, este pode ser um array uni ou bidimensional. Se
for um array unidimensional, o resultado uma simples lista. Se for um array
bidimensional, o primeiro elemento do array determina o nmero de linhas. O segundo
elemento do array determina o nmero de colunas. Por favor note que ele est numa
aparncia somente; voc pode somente selecionar linhas inteiras na lista.
Voc pode se quiser especificar manualmente o range lista quando criar uma caixa
de listagem. Voc dever fazer isto primeiro selecionando a caixa de listagem e e da
mostrando a janela de propriedades. Selecione a propriedade RowSource e digite no
endereo do range. O endereo poder identificar folha e a pasta. Entretanto, se voc mais
tarde mudar o nome da pasta ou da planilha, a entrada manual no atualizada, e a lista
no ser atualizada.
Por favor note que voc poderia limpar a caixa de listagem antes de voc preench-
la. Por outro lado, a lista anterior pode ser retida e a nova lista adicionada antiga. O
mtodo Clear limpa um userform. Por exemplo, UserForm1.ListBox1.Clear
Para determinar o nmero de items in a caixa de listagem, use a propriedade
ListCount. Para determinar o nmero do item selecionado numa caixa de listagem, use a
propriedade ListIndex. E para determinar o texto do que foi selecionado, use a propriedade
Value. ENTRETANTO, voc deve obter os valores do dilogo antes de voc remov-lo
da memria. Se voc no fizer, voc obter a seguinte mensagem de erro quando voc
tentar obter um valor do userform:
Lio #07 Cdigo VBA do Excel para UserForms 280

Portanto, voc poder primeiro liberar o dilogo com um boto que usa a propriedade
Hide. Da ento, depois de voc ter obtido os valores do dilogo, use a propriedade Unload
para remover o dilogo da memria. O que segue ilustra isto, usando o seguinte userform:

Neste dilogo as macros seguintes so atribuidas aos botes OK e Cancelar. Note


que o boto OK agora usa o mtodo Hide, no o mtodo Unload.

Private Sub Boto_Cancelar_Click() bResponse


= False
Unload UserForm1
End Sub

Private Sub Boto_OK_Click() bResponse


= True
UserForm1.Hide
End Sub

O que segue a macro que preenche a caixa de listagem e da mostra os valores


selecionados pelo usurio. Por favor note que o valor ListIndex 1 se nada for selecionado,
Lies de VBA do Excel 281

0 se o primeiro item selecionado e o nmero de items menos um se o ltimo item for


selecionado

Public bResponse As Boolean


'a declaro acima deve estar no topo do mdulo
Sub User_Form_Demo1()
'limpar e preencher a caixa de listagem
UserForm1.ListBox1.Clear
With UserForm1.ListBox1
.AddItem ("Jan")
.AddItem ("Fev")
.AddItem ("Mar")
.AddItem ("Abr")
.AddItem ("Mai")
.AddItem ("Jun")
.AddItem ("Jul")
.AddItem ("Ago")
.AddItem ("Set")
.AddItem ("Out")
.AddItem ("Nov")
.AddItem ("Dez")
'mostrar o userform
UserForm1.Show
'determine se OK foi selecionado
If Not bResponse Then
MsgBox "cancelar selecionado"
Exit Sub
End If
'confirmar que aquela seleo foi feita
If .ListIndex = 1 Then
MsgBox "Nenhuma seleo feita"
Exit Sub
End If
'mostrar o nmero e o texto da seleo
MsgBox "Nmero do item selecionado na lista: " & _
.ListIndex + 1
MsgBox "texto do item selecionado: " & .Value
End With
Unload UserForm1
End Sub

Se a propriedade MultiSelect da caixa de lista configurada para ou Multi ou


Extended, ento mltiplos itens podem ser selecionados na lista. Entretanto, quando isto
feito, ento se deve usar a propriedade Selected (nmero) para ver se um item da lista
foi selecionado. E, dai a Lista (nmero) para retornar a descrio do item. O que segue
ilustra isto.

Public bResponse As Boolean


'Se este exemplo for copiado para a mesma pasta, declare
Lio #07 Cdigo VBA do Excel para UserForms 282

'a varivel bResponse somente uma vez, no topo do mdulo


Sub User_Form_Demo2()
Dim I As Integer
Dim bSelectionMade As Boolean
'limpe e preencha a caixa de listagem
UserForm1.ListBox1.Clear
With UserForm1.ListBox1
.AddItem ("Jan")
.AddItem ("Fev")
.AddItem ("Mar")
.AddItem ("Abr")
.AddItem ("Mai")
.AddItem ("Jun")
.AddItem ("Jul")
.AddItem ("Ago")
.AddItem ("Set")
.AddItem ("Out")
.AddItem ("Nov")
.AddItem ("Dez")
'mostrar o userform
UserForm1.Show
'determina se OK foi selecionado
If Not bResponse Then
MsgBox "cancelar selecionado"
Exit Sub
End If
'retorna o nmero total de itens na caixa de listagem
MsgBox .ListCount
'mostra o item selecionado
For I = 0 To .ListCount 1
If .Selected(I) Then MsgBox .List(I) bSelectionMade
= True
Next
End With
'remove o userform da memria
Unload UserForm1 if Not
bSelectionMade Then MsgBox "Nenhuma
seleo foi feita"
Exit Sub
End If
End Sub
ADICIONANDO RTULOS (TEXTO) NUM USER FORM
Para adicionar texto a um userform muito simples: apenas clique no boto Rtulo
(Label) (o boto " ") na barra de ferramentas Caixa de ferramentas, desenhe uma caixa
do tamanho que voc precisar, e digite o texto. Se voc tiver a caixa de rtulo selecionada,
voc pode mostrar a caixa de propriedades e mudar as propriedades. Por exemplo, voc
pode mudar o tamanho e cor da fonte, a cor de background e muitas outras propriedades.
A melhor maneira para aprender mais acerca de adicionar rtulos tentar as diferentes
propriedades no userform teste. Rtulos nos userforms so tipicamente entradas de texto
Lies de VBA do Excel 283

que do direes ao usurio. Voc pode ter o texto empacotado na caixa de rtulo, e voc
pode especificar a fonte a ser usada no rtulo. O que segue so algumas das principais
propriedades de uma caixa de rtulo:

Caption - O texto que entrado na caixa. Este pode ser configurado quando voc criar
manualmente a caixa de edio, ou pode ser mudado interativamente:

UserForm1.Label1.Caption = "123"

Se a mudana for feita por uma macro, o ttulo (caption) ou texto que aparece no
userform no VB editor no muda. Entretanto, o texto do rtulo que est mostrado aquele
especificado pela macro.

WordWrap - Permite empacotar palavras na caixa de texto

Visible - Permite o rtulo ocultar se configurado para False, mostrado se configurado


para True.
USANDO CAIXAS DE TEXTO (TEXT BOXES) NOS USERFORMS
Uma caixa de texto (text box) um modo rpido e fcil de se obter as entradas do
usurio. O que segue ilustra uma caixa de texto onde o usurio deve entrar com um
nmero vlido, que neste caso definido como um nmero entre um e dez. Se o usurio
no entrar com um nmero vlido, ento uma mensagem dizendo que a entrada no foi
vlida mostrada e da ento o dilogo reapresentado.
O userform se parece com isto. A caixa de texto (textbox) foi adicionada usando
o boto caixa de texto da barra de ferramentas Caixa de ferramentas (ele o boto que
se parece com " ").

Os dois botes foram chamados de Boto_OK e Boto_Cancelar, e a eles foram


atribudos as seguintes macros:

Private Sub Boto_Cancelar_Click()


Unload UserForm1
End
End Sub
Lio #07 Cdigo VBA do Excel para UserForms 284

Private Sub Boto_OK_Click()


UserForm1.Hide
End Sub

O que segue a macro principal que mostra o dilogo userform e valida a entrada.

Sub Obter_Entrada_Usuario()
Dim entradaUsuario As Long
'Limpar a caixa de texto antes de mostrar pela primeira vez
UserForm1.TextBox1.Value = ""
Do
UserForm1.Show
entradaUsuario = Val(UserForm1.TextBox1.Value) 'uma
entrada em branco torna-se um valor zero
If entradaUsuario > 0 And entradaUsuario <= 10 _
Then Exit Do
MsgBox "O valor que voc entrou no estava " & _
"entre 0 e 10."
Loop
Unload UserForm1
MsgBox entradaUsuario & " foi entrado."
End Sub

Como quase todos os objetos userform que se pode usar, existe um tremendo
nmero de propriedades para uma caixa de texto. Par mostrar as propriedades, clique no
boto janela de propriedades da barra de ferramentas Padro do Microsoft Visual
Basic, ou selecione Exibir, Janela Propriedades, ou pressione F4. Para ver a informao
de uma dada propriedade, clique na propriedade e dai pressione o boto F1. As vrias
propriedades principais que so teis so:

Value A entrada feita na caixa


Multiline Permite linhas mltiplas de dados serem entradas.
Scrollbars Mostra barras de rolamento se so feitas entradas longas.
PassWordChar Especifica o uso de placeholders em vez de entradas reais quando
um password est sendo entrado.
Visible Mostra ou oculta a caixa. til se voc somente quiser editar a caixa
para aparecer se outras condies so encontradas.
Font Pemite-lhe especificar o tamanho e a fonte a serem usadas.

A maioria das propriedades de uma caixa de edio de texto destinada a serem


configuradas quando voc est desenvolvendo a caixa de edio de texto e permanecem
com aquelas configuraes. Algumas, tais como as propriedades Value e Visible so
destinadas a serem configuradas interativamente pelo seu cdigo.
COMBO EDIT NO USERFORM, CAIXAS DE LISTAGENS DROP DOWN
Lies de VBA do Excel 285

O que segue ilustra o preenchimento de uma caixa de combinao , lista


dropdown com os meses do ano e da ento determina o que foi selecionado:

Sub combo_box_demo()
'limpa os contedos da combobox
UserForm2.ComboBox1.Clear
'preenche a caixa de um range de uma planilha
UserForm2.ComboBox1.RowSource = _
ThisWorkbook.Sheets("plan1") _
.Range("a1:a12").Address(external:=True) 'mostra
o userform
UserForm2.Show
'mostra a entrada de usurio ou a seleo
With UserForm2.ComboBox1
MsgBox "item nmero " & .ListIndex & " selecionado." & _
" Ele " & .Text
End With
End Sub

Se o valor da ListIndex 1, ento isto indica que o usurio fez uma entrada na
caixa de texto ao contrrio de pegar um valor da lista. Tambm, a ListIndex comea no
zero para o primeiro item na lista, no um.
A lista numa caixa de combinao drop down exatamente como uma caixa de
listagem regular. Isto significa que voc pode usar arrays para atribuir valores lista, e o
array pode ser bidimensional.
BOTES DE ALTERNNCIA E CAIXAS DE VERIFICAO DE USERFORM
Quando um boto de alternncia for clicado, ele alterna de selecionado
(aparncia pressionado) para no selecionado (aparncia de boto normal). Ele, como uma
CheckBox, tem um valor ou True ou False. Para configurar o valor inicial destes objetos
numa macro, especifique o userform, o nome do controle, e o valor a ser usado. Por
exemplo:

UserForm1.ToggleButton1.Value = True
UserForm1.CheckBox1.Value = False

Para determinar o valor do boto alternncia, pea seu valor antes de descarregar
o userform.
BARRAS DE ROLAMENTO (SCROLLBARS) E BOTO DE ROTAO
(SPINNERS) NO USERFORMS
O melhor modo de mostrar como as Barras de rolamento (Scrollbars) e Boto
de rotao (Spinners) funcionam por meio de um exemplo. O userform seguinte
contm um rtulo, um boto de rotao, uma barra de rolamento, e um boto de
comando.
Lio #07 Cdigo VBA do Excel para UserForms 286

Neste exemplo, quando voc usar ou o boto de rotao ou a barra de rolamento,


o valor na caixa de texto (textbox) muda. Limites tm sido impostos de modo que o valor
fique limitado entre 0 e 100. As propriedades seguintes da barra de rolamento foram
configuradas manualmente selecionando a barra de rolamento e mostrando a janela de
propriedades :

Propriedade valor
LargeChange 10
Min 0
Max 100

Configurando estas propriedades manualmente reduz a necessidade de se fazer via


cdigo.
O que segue o cdigo que foi colocado num mdulo regular:

'Declarar no topo do mdulo. Usado pelo cdigo userform


Public spinValue As Integer
Sub ScrollAndSpinnerDemo()
'Descarrega o form apenas no caso da macro crashed anteriormente
'e ela no fora descarregada
UnLoad Userform1
'Inicializa a varivel pblica, a barra de rolamento, e o rtulo
spinValue = 50
UserForm1.ScrollBar1.Value = spinValue
UserForm1.Label1.Caption = spinValue
'Mostra o form, e da descarrega quando o controle retornar
'macro
UserForm1.Show
Unload UserForm1
End Sub

O cdigo seguinte foi colocado no mdulo de cdigo do userform (acessvel por


um duplo clique sobre o userform). Clicando no boto de comando apenas fecha o form.
Clicando nas setas para cima ou para baixo do boto de rotao, aumenta-se ou diminui-
se os valores da spinValue. E, ento o rtulo alterado e o valor da barra de rolamento
Lies de VBA do Excel 287

alterado. Mudando a barra de rolamento, clicando ou na rea de rolamento, sobre as setas


para cima ou para baixo, ou arrastando a barra de posio muda o valor da spinValue e
tambm altera o rtulo.

Private Sub CommandButton1_Click()


Me.Hide
End Sub

Private Sub ScrollBar1_Change()


'Trata de clicar na barra ou topo ou fundo
spinValue = ScrollBar1.Value Me.Label1.Caption
= spinValue
End Sub

Private Sub ScrollBar1_Scroll()


'Trata de mover a barra de rolamento por si s
spinValue = Me.ScrollBar1.Value Me.Label1.Caption
= spinValue
End Sub

Private Sub SpinButton1_SpinDown()


'Trata de clicar parte de baixo do boto de rotao
spinValue = spinValue - 1 If spinValue < 0 Then
spinValue = 0
Me.ScrollBar1.Value = spinValue
Me.Label1.Caption = spinValue
End Sub

Private Sub SpinButton1_SpinUp()


'trata de clicar na parte superior do boto de rotao spinValue
= spinValue + 1
If spinValue > 100 Then spinValue = 100
Me.ScrollBar1.Value = spinValue
Me.Label1.Caption = spinValue
End Sub
USANDO UMA CAIXA REFEDIT NUM USERFORM
Uma caixa RefEdit usada para permitir o usurio especificar um range.
Entretanto, voc no pode selecionar Janela e mudar de uma janela para outra o usurio
deve usar a tecla CTL+Tab para se mover de uma pasta a outra. Para superar esta
limitao, adicione uma caixa de listagem (listbox) no seu userform que permita o
usurio ativar qualquer pasta. O que segue mostra como fazer isto:

Sub ExampleWBRangeSelection()
Dim wb As Workbook
For Each wb In Workbooks
UserForm1.ListBox1.AddItem wb.Name
Next
UserForm1.Show
Lio #07 Cdigo VBA do Excel para UserForms 288

Unload UserForm1
End Sub

No mdulo cdigo para o form, coloque o seguinte cdigo, que limpa a caixa
refedit quando uma pasta for selecionada.

Private Sub ListBox1_Change()


Workbooks(Me.ListBox1.Value).Activate
Me.RefEdit1.Text = ""
Me.RefEdit1.SetFocus
End Sub

O cdigo seguinte ilustra como configurar o valor de uma caixa RefEdit, e como
perguntar seu valor. Por favor note que Application.ScreenUpdating deve ser configurado
para True para o usurio selecionar um range.

Sub RefEdit_Demo()
'define a referncia inicial na RefCaixa de edio
UserForm1.RefEdit1.Value = Selection.Address
'mostra o userform contendo a RefCaixa de edio
UserForm1.Show
'mostra a seleo do usurio
MsgBox UserForm1.RefEdit1.Text
'Define um objeto para se referir entrada do userform:
dim anyR As Range
'o que segue assume que o usurio fez uma seleo Set
anyR = Range(UserForm1.RefEdit1.Text) anyR.Select
'Remova o Userform somente aps a informao ser armazenada
'pelo ltimo usurio.
Unload UserForm1
End Sub

Por favor note que voc precisar de um boto de comando no seu userform que oculte o
userform.
CRIANDO UM USERFORM MULTI-PGINA
O que segue ilustra um userform com um controle Multi-pgina nele:
Lies de VBA do Excel 289

Voc cria um dilogo Multi-pgina criando um userform, clicando num boto


Multi-pgina na Caixa de Ferramentas, e da desenhando-o no userform. Da voc pode
adicionar objetos a cada uma das pginas. Voc pode tambm ter mais do que duas
pginas num userform Multi-pgina. O truque para adicionar uma nova pgina primeiro
clicar na pgina, e da ento dar um clique com o boto direito do mouse na guia da pgina.
Isto faz com que o dilogo seguinte aparea:

Se voc no clicar na guia, um popup diferente aparecer. Use o item de menu


Nova pgina no popup acima para adicionar uma nova pgina. Voc pode tambm usar
as opes deste popup para deletar, renomear, ou mover uma pgina. Finalmente, um
objeto Multi-pgina no precisa incluir o dilogo todo. Voc pode coloc-lo em apenas
uma parte do dilogo se voc quiser.
USANDO UMA GUIA STRIP NUM USERFORM
A guia nua est essencialmente na parte superior de um objeto multipginas.
Basicamente, voc tem um conjunto de objetos, tais como caixas de listagens (ListBoxes)
e botes de opo no seu userform. Quando voc clicar sobre uma dada guia da guia
strip, a macro atribuida a strip determina qual guia est ativa agora, e ativa as propriedades
dos objetos do userform. Por exemplo, voc pode ativar quatro guias e atribuir a cada uma
delas uma regio diferente de um pas. Clicando numa guia altera a caixa de listagem
(listbox) contendo os clientes daquela regio.
Para adicionar guias adicionais guia nua ligeiramente manhoso. Voc deve
clicar uma vez na guia nua, esperar cerca de um segundo, e clicar novamente. Se bem
sucedido, a banda de seleo ao redor da guia nua fica mais escura. Da ento, d um
clique com o boto direito na guia nua, e um popup como aquele para um objeto
Multipgina aparece.
O cdigo seguinte ilustra uma macro que poderia ser atribuida guia strip para
fazer a ao de atualizar a informao sobre uma userform quando uma guia for
selecionada:

Private Sub TabStrip1_Change()


UserForm2.Label1.Caption = _
"Guia " & UserForm2.TabStrip1.Value & " selecionado."
End Sub

O cdigo acima muda o rtulo num userform para estabelecer o nmero da guia
selecionada. Voc pode tambm escrever o cdigo no lugar de mudar qualquer objeto
userform e seu contedo. Por favor note que a primeira guia 0, a segunda 1, e assim
por diante. Tambm, em vez de combinar o cdigo na macro atribuida guia nua, voc
Lio #07 Cdigo VBA do Excel para UserForms 290

pode ter atribuido uma macro para chamar a macro do seu mdulo. Isto torna mais fcil
de manter este cdigo, acess-lo, e imprim-lo. Voc pode usar uma declarao IF ou uma
declarao Select Case para fazer isso. Por exemplo:

Select Case UserForm2.TabStrip1.Value


Case 1: macro1
Case 2: macro2
Case 3: macro3
End Select
INSERINDO IMAGENS NUM USERFORM
Para colocar uma figura num userform, simplesmente clique no boto Caixa de
Ferramentas aquele que parece uma cena de montanha e desenhe uma caixa sobre o
userform. Da ento, mostre janela de propriedades e usando a propriedade figura,
selecione uma figura para o interior da caixa. Voc pode mudar outras opes, tais como
o tamanho da figura para ajust-la na caixa. Voc pode tambm atribuir uma macro
imagem por um duplo clique nela. Uma vantagem de se usar uma figura que voc pode
colocar um design complexo na sua folha, tal como uma trademark ou logo.
CONFIGURANDO A GUIA ORDEM
Para configurar a guia ordem dos objetos num userform, simplesmente selecione
o userform e da ento selecione Exibir, Tab Order. No dilogo que aparecer, voc pode
mover os controles para cima e para baixo na guia order. Se voc no quiser mudar a guia
order dos controles no UserForm, use o mtodo SetFocus para especificar que objeto ter
foco quando voc mostrar o UserForm. Por exemplo, se voc quiser uma caixa de listagem
chamada ListBox1 como tendo o foco quando voc mostrar o UserForm, use o seguinte
modelo de cdigo para o evento Initialize do UserForm:

Private Sub UserForm_Initialize()


ListBox1.SetFocus
End Sub

Este cdigo colocado na folha de cdigo do userform, o qual voc pode acessar
selecionando o userform e selecionando Exibir, Cdigo. Da ento selecione Initialize no
drop down do lado direito com o userform selecionado no dropdown do lado esquerdo.
Quando voc mostrar o UserForm, o ponto de isero aparece dentro da caixa de listagem,
a despeito da guia order no userform
USANDO VARIVEIS PARA SE REFERIR AOS OBJETOS DO USERFORM
No seu cdigo voc pode se referir aos objetos sobre um userform pela
combinao do Nome do userform e o nome do objeto. Isto reduz a necessidade de se
criar variveis de objeto para userform objetos. Entretanto, existiro instances onde
variveis de objeto so teis. Qualquer das abordagens seguintes lhe permite declarar a
varivel e configurla igual a um objeto num userform:

Dim myObject
Dim myObject As Variant
Lies de VBA do Excel 291

Dim myObject As MSForms.objeto tipo

A ltima abordagem acima melhor pois ela especifica o tipo de objeto. Por exemplo

Dim lBox As MSForms.ListBox


Set lBox = UserForm1.Listbox1

Como informao, se voc no usar MSForms para qualificar o tipo de objeto,


voc obter um erro de sintaxe quando voc tentar executar sua macro. Se voc estiver
editando o cdigo num mdulo de userform, voc pode usar a varivel Me para se referir
ao userform. Isto simplifica grandemente a escrita do cdigo.
USANDO DUPLOS CLIQUES PARA FECHAR UM USERFORM
Dando um duplo clique num objeto userform tal como um boto opo ou um item
numa lista no fecha o dilogo. O default no fazer nada i. e., o userform permanece
mostrado. Entretanto, voc pode atribuir uma macro a cada objeto sobre um userform que
voc queira dando um duplo clique nele. Por exemplo, Se voc quiser que o userform
feche quando um usurio der um duplo clique num boto opo. Cada objeto deve ter a
sua prpria macro. Para criar macros que fecham quando num objeto dado um clique
duplo, voc deve primeiro ir ao mdulo que mantm o cdigo para objetos num userform.
O modo mais fcil de obter este mdulo dar um duplo clique em qualquer objeto no
userform. Por exemplo, se voc der um duplo clique num boto opo, aparecer o cdigo
como o seguinte:

Private Sub ListBox1_Click()


End Sub

A menos que voc j tenha criado o cdigo do objeto que voc deu o duplo clique
nele, a macro estar vazia. O prximo passo selecionar no drop down do lado esquerdo
da folha de macro o objeto para o qual voc quer atribuir uma macro duplo clique. No
drop down do lado direito, selecione a propriedade para a qual voc quer atribuir uma
macro. Neste caso, a propriedade a propriedade "DblClick". Quando voc clicar nele, o
cdigo seguinte aparecer:

Private Sub OptionButton1_DblClick _


(ByVal Cancel As MSForms.ReturnBoolean)
End Sub

Assumindo que seu userform seja chamado de "UserForm1", voc dever


modific-lo para incluir a declarao seguinte:

Private Sub OptionButton1_DblClick _


(ByVal Cancel As MSForms.ReturnBoolean)
UserForm1.Hide
End Sub
Lio #07 Cdigo VBA do Excel para UserForms 292

Este cdigo far o userform ficar oculto. Isto lhe permite determinar as selees
do usurio no userform. Por favor note que voc no libera o userform no cdigo acima.
Se voc liberar o userform, voc no ser capaz de determinar qualquer das selees do
usurio no userform.
CENTRALIZANDO USERFORMS NA TELA
A propriedade que centraliza um userform a propriedade StartUpPosition. Se ela
for configurada para 1CenterOwner ou 2CenterScreen, ento voc obter resultados de
centralizaes. Se voc tiver o Excel configurado como uma janela na sua prpria tela do
computador, ento CenterOwner centralizar o dilogo na janela do Excel. O
CenterScreen centralizar o dilogo no meio da tela, no importa para qual tamanho voc
configurou para a janela do Excel. A configurao default 1CenterOwner.
SOBRE AS FOLHAS DE DILOGOS DO EXCEL 5/7
Excel 5/7 usa folhas de dilogos em vez de userform. As Folhas de dilogos so
um pouco diferentes dos userforms. Poe exemplo,no h mdulos de cdigo ou cdigo
associados com objetos. No h vantagem de se usar folhas de dilogos do Excel 5/7
versus userforms. E, em muitos casos, so mais difceis de se usarem.
SUMRIO
Existem vrias chaves de trabalhar com objetos num userform. Uma delas
reconhecer que cada objeto tem um conjunto de propriedades que voc pode configurar,
mudar e interrogar. O nmero de propriedades de objeto tem aumentado dramaticamente.
O melhor modo de entender as propriedades de um objeto mostrar a janela de
propriedades do objeto e mudar as propriedades e observar o resultado. Um outro ponto
para os objetos que voc no precisa dizer tudo ao VB, qual coleo um objeto pertence.
Por outro lado, o VB sabe qual coleo um objeto pertence, assim simplifique seu
trabalho. Finalmente, embora existam muitos objetos e propriedades, importante manter
seu uso de userforms simples e focado. Evite userforms complexos e manipulaes
complexas dos objetos sempre que possvel.
293

Fase #3: VBA do Excel Avanado

Lio 8: Cdigo VBA do Excel para Grficos e Arquivos Seqenciais


Grfico no Excel
em vindos amigos a mais esta lio de cdigo VBA do Excel, agora nos toca a

B aprender mais uma coisa interessante sobre macros, trata-se dos grficos em Excel
que trabalharemos agora.
Um dos poderes do Microsoft Excel a habilidade de se criar
grficos. Com a verso 5 e a introduo de assistentes de grfico, criar grficos tornou-se
muito fcil. Voc pode criar grficos nas suas prprias folhas ou embutir os grficos nas
planilhas. A abordagem de embutir tem a vantagem de agrupar grficos relacionados
numa nica localizao.
Quanto mais grficos voc criar, mais trabalho manual voc deve ter que fazer
para modificar cada um deles. E, se os grficos forem grficos embutidos vs. folhas de
grfico separadas, voc deve selecionar cada grfico embutido antes de voc poder
imprim-los individualmente. Estas tarefas podem facilmente serem automatizadas por
uma macro.
O propsito desta lio mostrar-lhe como trabalhar com ambos, folhas de grfico
separadas e grficos embutidos. E, esta lio tambm fornecer vrias macros de
aplicaes a grficos.
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 294

Se observarmos os dados que vamos a graficar nos damos conta que na coluna A
se encontram os valores dos eixos (X) e na coluna B os valores sries (Y), estes dados
so necessrios para efetuar uma grfico que poder ficar assim

Este grfico mostra as idades de 5 pessoas, os nomes esto no eixo valores e a


idade no eixo sries, agora veremos como se pode detectar estes dados por meio de uma
Macro
Ao graficar estes dados se gerou o seguinte cdigo:
Sub Macro1()
Range("A5:B10").Select
Charts.Add
ActiveChart.ChartType = xlColumnClustered Esta a linha 3
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), _
PlotBy:= xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Plan1"
End Sub
1. A primeira linha indica o range donde esto os dados, eixos de valores e series
de valores,
2. A segunda linha indica que se agrega um grfico
3. A terceira linha indica o tipo de grfico que se deseja
4. A quarta linha indica como se acomodam os dados no grfico
5. A quinta linha indica onde se mostra o grfico, se na mesma folha ou em uma
folha separada.
A seguir se mostram alguns dos diferentes tipos de grficos Lnha 3:
Lies de VBA do Excel 295

Idade

80
60
40 Idade
20
0
Liliana B et h Dani Ros a Joana

ActiveChart.ChartType = xlColumnClustered

Idade

Joana

Dani Idade

Liliana

0 20 40 60 80

ActiveChart.ChartType = xlBarClustered

Idade

80
60
40 Idade
20
0
Liliana B et h Dani Ros a Joana

ActiveChart.ChartType = xlLineMarkers
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 296

Idade

Liliana
Be th
Dani
Ros a
Joana

ActiveChart.ChartType = xlPie

Idade

80
60
40 Idade
20
0
0 2 4 6

ActiveChart.ChartType = xlXYScatter

Idade

80
60
40 Idade
20
0
Liliana B et h Dani Ros a Joana

ActiveChart.ChartType = xlAreaStacked
Lies de VBA do Excel 297

Idade

Liliana
Be th
Dani
Ros a
Joana

ActiveChart.ChartType = xlDoughnut

Idade

Liliana
100
Joana 50 Be t h
0 Idade

Ros a Dani

ActiveChart.ChartType = xlRadarMarkers

Idade

80
60
40
20 Idade
0

ActiveChart.ChartType = xlCylinderColClustered
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 298

Idade

80
60
40
20 Idade
0

ActiveChart.ChartType = xlConeColClustered

Idade

80
60
40
20 Idade
0

ActiveChart.ChartType = xlPyramidColClustered

Se tu agregas ao final do cdigo principal alguma linha do tipo de grfico que


gostas, este se ativar, por exemplo:

Sub Macro1()
Range("A5:B10").Select
Charts.Add
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Plan1"
ActiveChart.ChartType = xlPyramidColClustered End
Sub
Este cdigo se pode programar num boto ou qualquer outro controle do Visual Basic.
A seguir se mostra como se acomodam os dados Lnha 4:
Lies de VBA do Excel 299

70
60 Liliana
50 Be th
40
Dani
30
20 Ros a
10 Joana
0
Idade

ActiveChart.SetSourceData Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= _ xlRows


Nesta linha se mostra o grfico por Intervalos (Range)

Idade

80
60
40 Idade
20
0
Liliana B et h Dani Ros a Joana

ActiveChart.SetSourceData Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= _ xlColumns

Nesta linha se mostra o grfico por Coluna


Esta a forma em que se mostram os dados do que fala a linha 4.
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 300

A linha 5 fala de que se o grfico ficar na mesma folha ou simplemente pega uma folha
separada para ela, por exemplo:

ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Grfico 1"

Esta linha indica que o grfico tenha sua prpria folha e que seu nome seja
Grfico 1. Neste exemplo executo um cdigo com cada uma das caracteresticas
explicadas nas 5 linhas.

Range("A5:B10").Select
Charts.Add
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= _xlColumns
ActiveChart.Ocation Where:=xlLocationAsObject, Name:="Plan1"

ActiveChart.ChartType = xlPyramidColClustered
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= xlColumns
ActiveChart.Location Where:=xlOcationAsNewSheet, Name:="Grfico
1"
Tipo de Grafico
Como se acomodam os dados
Como se mostra o grfico, neste caso em uma s folha
Lies de VBA do Excel 301

Elabore o seguinte formulrio com o seguinte cdigo, para observar os diferentes


tipos de grficos e a forma em que se acomodam os dados:

Desenhe duas Listbox e um Boto e cole o cdigo seguinte dentro do formulrio:


Private Sub CommandButton1_Click()
Rem este cdigo gera o Grafico na plan1
Range("A5:B10").Select
Charts.Add
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= _ xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Plan1"
Rem agregue os diferentes tipos de grficos Listbox1
ListBox1.AddItem "xlColumnClustered"
ListBox1.AddItem "xlBarClustered"
ListBox1.AddItem "xlLineMarkers"
ListBox1.AddItem "xlPie"
ListBox1.AddItem "xlXYScatter"
ListBox1.AddItem "xlAreaStacked"
ListBox1.AddItem "xlDoughnut"
ListBox1.AddItem "xlRadarMarkers"
ListBox1.AddItem "xlCylinderColClustered"
ListBox1.AddItem "xlConeColClustered"
ListBox1.AddItem "xlPyramidColClustered"
Rem Agregue as diferentes formas de acomodar os dados Listbox2
ListBox2.AddItem "Linha"
ListBox2.AddItem "Coluna"
End Sub

Private Sub ListBox1_Click()


Rem este cdigo d o tipo de grfico ao dar clique na Listbox1
If ListBox1 = "xlColumnClustered" Then ActiveChart.ChartType =
xlColumnClustered
If ListBox1 = "xlBarClustered" Then ActiveChart.ChartType =
xlBarClustered
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 302

If ListBox1 = "xlLineMarkers" Then ActiveChart.ChartType =


xlLineMarkers
If ListBox1 = "xlPie" Then ActiveChart.ChartType = xlPie
If ListBox1 = "xlXYScatter" Then ActiveChart.ChartType =
xlXYScatter
If ListBox1 = "xlAreaStacked" Then ActiveChart.ChartType =
xlAreaStacked
If ListBox1 = "xlDoughnut" Then ActiveChart.ChartType =
xlDoughnut
If ListBox1 = "xlRadarMarkers" Then ActiveChart.ChartType =
xlRadarMarkers
If ListBox1 = "xlCylinderColClustered" Then
ActiveChart.ChartType = xlCylinderColClustered
If ListBox1 = "xlConeColClustered" Then ActiveChart.ChartType =
xlConeColClustered
If ListBox1 = "xlPyramidColClustered" Then ActiveChart.ChartType
= xlPyramidColClustered
End Sub
Private Sub ListBox2_Click()
If ListBox2 = "Linha" Then
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= _
xlRows End If
If ListBox2 = "Coluna" Then
ActiveChart.SetSourceData
Source:=Sheets("Plan1").Range("A5:B10"), PlotBy:= _
xlColumns End If
End Sub
Antes de executar esta Macro tenhas os dados anteriores na Plan1 do Excel
Lies de VBA do Excel 303

Espero que o cdigo acima seja de utilidade.


ESPECIFICANDO CHARTS
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 304

A maneira de voc especificar um grfico numa macro depende da sua localizao.


Se um grfico estiver na sua prpria folha voc pode especific-lo usando a seguinte
sintaxe, pois ele um membro da coleo Charts:

Charts("nome da folha de grfico") ou


Charts(nmero)

Se o grfico est numa pasta diferente daquela pasta ativa, voc dever tambm
especificar a pasta. Por exemplo:
Workbooks("MeusGrficos.XLS").Charts("Preo de Aes")
O nome da folha de grfico o nome que aparece na guia da folha. O nmero
ndice um nmero do um ao nmero de grficos na planilha. O nmero ndice referese
s folhas de grfico baseadas em sua ordem na Pasta. Voc pode also especificar uma
folha de grfico como um membro da coleo Sheets. Por exemplo:
Workbooks("MeusGrficos.XLS").Sheets("Preo de Aes")
Se o grfico est embutido numa planilha, ento voc dever usar a seguinte
sintaxe para especific-lo:
Workbook.sheet.ChartObjects("nome do grfico ") ou
Workbook.sheet.ChartObjects(nmero)
Na sintaxe acima, voc deve fornecer uma folha de referncia. Exemplos tpicos de folhas
de referncias so:
ActiveSheet
Worksheets("nome da folha ")
Worksheets(nmero)
Sheets("noda da folha")
Sheets(nmero)

A pasta objeto referncia opcional se o grfico embutido estiver numa pasta ativa. Por
exemplo:

Worksheets("Reps Vendas").ChartObjects("Grfico 1")


Sheets("Reps Vendas").ChartObjects("Grfico 2")

Se voc gravou uma macro que funciona com grficos embutidos, voc encontrar
que o Microsoft Excel se refere aos grficos como membros da coleo DrawingObjects.
Como grficos embutidos numa folha de planilha so tambm considerados parte da
coleo DrawingObjects, eles podem tambm ser especificados usando a seguinte sintaxe:

Workbook.sheet.DrawingObjects("nome do objeto")
ou Workbook.sheet.DrawingObjects(nmero)
Lies de VBA do Excel 305

Por favor note que a coleo DrawingObjects inclui qualquer objeto embutido
numa planilha. Por exemplo, caixas de textos, retngulos, flechas, crculos, etc.. Se voc
quiser se referir a apenas grficos embutidos, ento use a coleo ChartObjects, no a
coleo DrawingObjects.
NOMEANDO CHARTS EMBUTIDOS
Quando voc criar um grfico embutido, o Microsoft Excel atribui a ele um nome
default tal como "Chart 1", "Chart 2", etc.. Uma coisa que voc deve no ter percebido
que voc pode mudar o nome dos grficos embutidos. Para fazer isto, primeiro mostre a
barra de ferramentas de desenho (Exibir, Barra de ferramentas). Da ento selecione os
objetos com a ferramenta seleo clicando no boto que parece com a ponta de uma
flecha. Quando voc clicar num grfico embutido com esta ferramenta, voc pode ento
clicar na caixa de nome e mudar o nome do grfico.
UMA MACRO PARA SELECIONAR GRFICOS EMBUTIDOS
Se voc tiver vrios grficos embutidos em uma folha de trabalho, a macro
seguinte mostrar uma lista de seleo para voc selecionar com qual grfico embutido
voc quer trabalhar. Para criar esta macro, primeiro crie um userform (o nosso chamado
UserForm1). Ele dever ter uma caixa de listagem (chamada ListBox1) junto com os
botes OK e Cancelar. O que segue o que esta folha dever se parecer:

A propriedade caption do userform foi mudada para dizer "Selecionar Um Grfico


Embutido". Para voc fazer isto selecionar o userform e da eles so CommandButton1 e
CommandButton2:

Private Sub CommandButton1_Click()


Me.Hide bResponse = True
End Sub

Private Sub CommandButton2_Click()


Me.Hide bResponse = False
End Sub

O que segue a macro que voc precisa entrar. Por favor note que a varivel global
chamada no topo do mdulo, e que ela usada para armazenar o valor Boolean
indicando qual boto foi clicado.
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 306

Global bResponse As Boolean

Sub SelectAnEmbeddedChart()
'Declarar variveis:
Dim I As Integer
Dim chartName As String
Dim response As Boolean
'certificar-se que o userform est descarregado.
Unload UserForm1
'Ou, apenas limpar a listbox:
UserForm1.ListBox1.Clear
'atualizar a lista listbox
For I = 1 To ActiveSheet.ChartObjects.Count chartName
= ActiveSheet.ChartObjects(I).Name
UserForm1.ListBox1.AddItem chartName
Next
'tornar o 1 grfico da lista a seleo inicial
UserForm1.ListBox1.ListIndex = 0
'mostrar o form
UserForm1.Show
'mostrar o dilogo e selecionar o grfico
If bResponse = False Then
'descarregar e sair se cancelar for selecionado
Unload UserForm1
Exit Sub
End If
'Obter o nome da listbox do item selecionado chartName
= UserForm1.ListBox1.Value
'remover o userform da memria
Unload UserForm1
'Ativar o grfico
ActiveSheet.ChartObjects(chartName).Activate
End Sub

Pontos chaves sobre a macro acima:

A declarao "ChartObjects.Count" usada para obter o nmero de grficos embutidos


na folha.
Como cada ChartObject identificado por ambos, um nmero e um nome, a macro
circula pela coleo ChartObject e usa o nmero de um objeto grfico para determine
seu nome.
A expresso UserForm1.ListBox1.Value a string texto na caixa de listagem do
item selecionado.
O comando Activate usado em vez do comando Select na macro acima. O
comando Activate torna o grfico no objeto embutido ativo. Deste modo, voc
pode usar a declarao ActiveChart.PrintOut para imprimir o grfico. Se voc
somente selecionar o objeto embutido, voc precisar ainda ativar o grfico de
modo que voc possa trabalhar com ele ou imprim-lo.
Lies de VBA do Excel 307

Se voc quiser modificar a macro acima para primeiro classificar a lista dos
objetos embutidos em ordem alfabtica voc precisar de:
Armazenar os nomes dos grficos numa array
Classificar o array em ordem alfabtica como ilustrado no captulo de arrays.
Definir a propriedade List da caixa de listagem igual ao array classificado.
IMPRIMINDO E VISUALIZANDO GRFICOS
Uma das coisas freqentes que as pessoas fazem com grficos imprim-los! O
mtodo que se usa para imprimir um grfico chamado PrintOut. Se voc quer visualizar
um grfico, ento voc dever usar o mtodo PrintPreview. Se a folha de grfico for uma
folha ativa, ento voc pode usar a seguinte declarao para imprimir um grfico:
ActiveChart.PrintOut
Se a folha de grfico no for uma folha ativa, voc pode usar a seguinte declarao
para imprimir o grfico sem ativar a folha de grfico:
Workbook.Charts("grfico sheet nome").PrintOut
O objeto referncia da pasta no exigido se a pasta contm o grfico a pasta
ativa. Um nmero de folha de grfico pode ser usado em vez do nome. Por exemplo, a
declarao que segue imprime uma folha de grfico rotulada de "Previso de Vendas"
localizada na pasta 1996Fcst.XLS:

Workbooks("1996Fcst.Xls").Charts("Previso de Vendas").PrintOut

Quando voc usar o comando acima, voc notar que o Microsoft Excel ativar a
folha de grfico, imprimir o grfico, e da ento ativar a folha que estava ativa
anteriormente ao comando ser emitido.
Esta mesma aboragem no funciona para grfico embutidos. Se voc tentar usar a
sintaxe acima para imprimir um grfico embutido, voc obter uma mensagem de erro.
Em vez disso, voc precisa primeiro ativar o grfico embutido e da ento enviar uma
declarao do Visual Basic para imprimir o grfico. O que segue ilustram as declaraes
do Visual Basic exigidas:

Workbook.sheet.ChartObjects("nome").Activate
ActiveChart.PrintOut

Voc tambm tem a opo de entrar com um nmero para o ChartObject em vez
de um nome. A macro que segue ilustra como voc imprimir todos os grficos
localizados em folhas de grfico individuais:

Sub PrintCharts()
Dim chtSheet As Object For
Each chtSheet In Charts
chtSheet.PrintOut
Next
End Sub
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 308

A macro acima imprimir todos os grficos localizados em folhas de grfico


individuais porque eles so membros da coleo Charts. Cada pasta tem sua prpria
coleo Charts.
Se voc quiser imprimir todos os grficos embutidos numa planilha, ento voc
dever usar a coleo ChartObjects em vez da coleo Charts. Tambm, voc dever
ativar cada grfico embutido antes de imprimir. Por exemplo:

Sub PrintEmbeddedCharts()
Dim embeddedCht As Object
For Each embeddedCht In ActiveSheet.ChartObjects
embeddedCht.Activate ActiveChart.PrintOut
Next
End Sub

Note que ChartObjects tem sido qualificado como um objeto folha. Neste caso
ActiveSheet foi usada. Entretanto, voc no tem que estar na folha ativa para ativar e
imprimir o grfico embutido. Por exemplo, voc poderia ter usado
Workbook("Forecast.Xls").Sheets("grfico Sheet") em vez de ActiveSheet:

Sub PrintEmbeddedCharts()
Dim embeddedCht As Object
Set containingSheet = _
Workbooks("Forecast.Xls").Sheets("grfico Sheet")
For Each embeddedCht In containingSheet.ChartObjects
embeddedCht.Activate ActiveChart.PrintOut
Next
End Sub

Entretanto, quando as declaraes so executadas, voc acabar numa folha


contendo os grficos, mesmo se voc no estivesse nesta folha originalmente. E, o ltimo
grfico embutido na coleo ser o objeto selecionado, em oposio a uma clula na
planilha.
As macros acima imprimiro os grficos na ordem que o Microsoft Excel os tm
em suas colees. Se voc quiser controlar a ordem de impresso, ento voc precisa usar
declaraes print individuais para cada grfico ou objeto embutido: Para folhas de grfico
voc dever usar a seguinte sintaxe:

pasta.Charts("grfico 1 nome").PrintOut pasta.Charts("grfico


2 nome").PrintOut

O objeto pasta lhe permite especificar uma folha de grfico numa pasta diferente.
Para grficos embutidos voc dever usar a seguinte sintaxe:

sheet.ChartObjects("grfico embutido 1 nome").Activate


ActiveChart.PrintOut
Lies de VBA do Excel 309

sheet.ChartObjects("grfico embutido 2 nome").Activate


ActiveChart.PrintOut

Uma referncia de folha deve qualificar ChartObjects para grficos embutidos.


Ela pode identificar uma folha em uma pasta diferente daquela da folha ativa.
OBJETOS E PROPRIEDADES DE UM CHART
Existem muitos objetos diferentes num grfico. Por exemplo existem linhas,
bordas, backgrounds, etc.. O modo mais fcil, e freqentemente o melhor modo, para se
determinar o nome do objeto grfico e as propriedades que voc quer trabalhar com elas
usar o gravador de macro. Examinando a macro resultante voc pode facilmente
determinar o nome do objeto grfico e suas propriedades. Para obter informaes
adicionais sobre um objeto grfico e suas propriedades, coloque o cursor na palavra chave
e pressione a tecla F1. Isto mostrar a ajuda do Visual Basic sobre este assunto.
Se voc precisar fazer a mesma modificao a uma srie de grficos, uma macro
uma maneira fcil de fazer isto. O modo mais fcil de se criar uma tal macro usar o
gravador de macro e gravar as mudanas do grfico para cada. Then, you would edit the
resulting macro, eliminando o cdigo extra que o Microsoft Excel grava, e usar um For
Each..Next para fazer o lao por todos os grficos. A macro que segue loops through all
the grfico embutidos numa planilha e muda a linha 1 em cada grfico para uma linha
pontilhada:

Sub ChangeEmbeddedCharts()
Dim E As Object
For Each E In ActiveSheet.ChartObjects
E.Activate
'selecionar a series 1
ActiveChart.SeriesCollection(1).Select
'modificar para uma linha fina pontilhada
With Selection.Border
.ColorIndex = 1
.Weight = xlThin
.LineStyle = xlDot
End With
Next
End Sub
SOBRE AS SRIES NO GRFICO
O objeto mais importante num grfico so as sries que esto sendo plotadas.
Sries so referidas com a seguinte sintaxe:
Chart.SeriesCollection(nmero)
A referncia Chart exigida. Freqentemente voc dever usar ActiveChart como
a referncia grfico. Para determinar o nmero de uma srie, clique na srie e o nome da
srie aparecer na caixa nome. O nome ser como S1, S2, etc.. O nmero representa o
nmero que voc dever usar para identificar a srie usando a plavra chave
seriesCollection.
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 310

Para modificar uma srie (linha, barra, etc..), voc dever definir a propriedade
Formula da linha igual a uma nova frmula usando a frmula Series. A frmula Series
deve ter a seguinte sintaxe:

"=Series(series nome, X axis categories, Y axis values, series nmero)"

Por exemplo:

=SERIES(Sheet3!$C$8, Sheet3!$D$6:$G$6,Sheet3!$D$8:$G$8, 1) ou =SERIES("Test


Data", Sheet3!$D$6:$G$6,Sheet3!$D$7:$G$7, 2)

Se voc clicar numa srie num grfico voc ver a frmula Serie na caixa de
edio. Qualquer frmula que voc construir via uma macro deve se parecer com as
frmulas que voc v na caixa de edio. Os pontos principais sobre a sintaxe Series
numa macro:

O sinal de igual e aspas so exigidos.


O nome series e categorias do eixo X so opcionais. Os valores do eixo Y e nmero
srie so exigidos. Se o nmero de srie for o mesmo que aquele de uma srie
existente, ento a srie existente tocada.
Vrgulas so usadas como placeholders.
O nome da srie pode ser ou uma referncia a uma clula nica na planilha ou uma
entrada de texto entre aspas duplas.
As categorias eixo X so ou os valores de X para grficos de scatter charts ou rtulos
do eixo X para todos os outros grficos.
As entradas para as categorias do eixo X e valores do eixo Y so normalmente
entradas de endereos no estilo A1. Por exemplo, Sheet1!$C$3:$G$3
Se voc estiver criando uma entrada de endereo, voc pode usar a propriedade Address
para obter as referncias de clulas, e da ento concatenar as entradas, incluindo
quaisquer aspas simples necessrias, pontos de exclamao, parnteses, e colchetes

As declaraes Visual Basic que seguem mostram como fazer isto para uma
srie de clulas que tenham sido destacadas e so necessrias para especificar series 2
num grfico chamado "Key Data". Por favor note que um grfico numa folha separada,
e no um grfico embutido.

Sub AddressExample()
Dim yCells As String, sheetName As String
'Esta macro assume que voc a tenha executado de uma planilha
'e tenha destacado o novo range Y 'Obter o
endereo do address para a seleo yCells =
Selection.Address 'Obter o nome da folha
sheetName = ActiveSheet.Name
'Ir ao grfico - note que o nome foi definido pelo usurio
Charts("Key Data").Select
Lies de VBA do Excel 311

'especificar a new formula for the series


ActiveChart.SeriesCollection(2).Formula = _
"=SERIES(,,'" & sheetName & "'!" & yCells & ",4)"
End Sub

Note que na construo da declarao Formula acima que aspas simples foram
usadas para cercar o noma da folha. Esta uma exigncia se o nome da folha tem
espaos, e no causar problema se o nome no tiver qualquer espao. Se voc precisar
adicionar uma nova srie a um grfico, ento voc dever usar o mtodo Add. A
sintaxe :
grfico.SeriesCollection.Add _
source:= range address, _ RowCol:=
xlRows or xlColumns, _
seriesLabel:= True or False, _
categoryLabel:= True or False, _
replace:=True or False

Se o grfico for um grfico embutido, voc deve primeiro ativar o grfico e da


ento usar ActiveChart para se referir ao grfico na declarao acima. Para certificar de
que voc obteve o conjunto correto de declaraes, use o gravador de macro.

O que segue so os argumentos do mtodo Add para a SeriesCollection:

fonte - exigido. Isto normalmente umendereo de range no text form dos dados a
serem plotados. O que segue ilustra este argumento: Source:= "Sheet1!$C$4:$G$5".
Se X labels and a series label forem necessrios, eles esto incluidos nesta string.
rowCol - opcional. Isto indica se os dados esto em linhas (xlRows) ou colunas
(xlColumns). Se omitido, o Microsoft Excel tenta compreender a resposta correta.
seriesLabel - opcional. Se a primeira clula no range especificado range contm o
nome da srie de dados, este parmetro definido como True. Se no for, ento ele
dever ser definido como False. Se omitido, o Microsoft Excel tenta compreender a
resposta correta.
categoryLabel - opcional. Se a primeira clula no range especificado range contm
os valores X, este parmetro definido como True. Se no for, ento ele dever ser
definido como False. Se omitido, o Microsoft Excel tenta compreender a resposta
correta.
replace - opcional. Se os rtulos da categoria so fornecidos e esta varivel
definida como True, ento os novos rtulos trocam aqueles j em uso no grfico.

Caso contrrio os rtulos devero ser rtulos adicionais.


Para deletar uma srie num grfico, voc dever primeiro selecionar o grfico e dai ento
especificar o ActiveChart e usar o mtodo Delete. Por exemplo:

Sheets("Chart3").Select
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 312

ActiveChart.SeriesCollection(2).Delete
UM EXEMPLO DE MACRO QUE DESENHA GRFICO A PARTIR DE DADOS
Se sua base de dados consistir de apenas umas poucas linhas de dados, ela ,
bastante fcil de criar grficos para cada linha de dados. Mas se seus dados estiverem em
muitas linhas para tornar a criao de grficos individuais uma possibilidade razovel,
ento voc pode usar uma macro para plotar uma linha selecionada (ou mltiplas linhas)
de dados no comando.
O truque para ser capaz de plotar seletivamente uma linha de dados o design da
sua planilha. Voc precisar de trs folhas:
Uma folha de grfico

Uma planilha que tenha seus dados.

Para ilustrar uma tal macro, vamos assumir que seus dados representem shipments
por cliente. O que segue ilustra a planilha de dados:

A folha acima dever ser chamada "The Data". Por favor note que voc pode usar
nomes diferentes se voc mudar a macro. Apesar da ilustrao acima ter somente 4 linhas
de dados, por favor assuma que existam centenas de clientes. Tambm, esta abordagem
funcionar se os perodos forem meses, anos, etc..
A segunda folha na sua planilha dever consistir de duas linhas: os rtulos que
voc quer usar para o eixo X, e uma linha de dados. O que segue ilustra esta folha:

Esta folha dever ser chamada "Chart Data". Por favor note que o que est acima
so amostras de dados. Mais tarde, a macro os trocar com os dados reais.
O prximo passo criar o grfico que ser usado. Isto feito simplesmente
destacando as clulas acima (A1:E2) na folha "Chart Data" e selecionar Inserir, Chart,
As New Sheet. O que segue o grfico que eu construi dos dados acima. Ele um
grfico de linha usando format 4, o qual d linhas pontilhadas para cada valor do eixo
Y.
Lies de VBA do Excel 313

O nome que a macro usar para a folha de grfico acima "Customer Shipments".
A macro que ns escreveremos ser executada da planilha contendo os dados.
Sempre que a clula for a ativa, a macro determinar a linha de dados a serem plotados.
A macro selecionar a linha de dados incluindo o nome do cliente, e o copiar para a
folha "Graph Data". Ela ento atualizar o ttulo do grfico e mostrar o grfico. O que
segue o cdigo da macro que alcana este resultado:

Sub PlotData()
Dim customerNameCell As Object, endCell As Object
'tenha certeza de estar na folha correta If ActiveSheet.Name
<> "The Data" Then
MsgBox "Voc no est na planilha correta."
End
End If
'definir a varivel objeto igual a primeira clula na linha, a
qual est o nome do cliente
Set customerNameCell = Cells(ActiveCell.Row, 1)
'Confirmar se ela tem uma entrada
If customerNameCell = "" Then
MsgBox "Voc no est numa linha de dados."
End
End If
'determinar a ltima clula, comeando da clula nome do
'cliente
Set endCell = customerNameCell.End(xlToRight)
'selecionar e copiar os dados para ser plotados
Range(customerNameCell, endCell).Copy _
destination:=Sheets("Chart Data").Range("A2") 'recalc
Microsoft Excel no caso calc manual.
'Isto atualiza o grfico se calc ajustado para manual
If Application.Calculation = xlManual Then Calculate
'Ir para o grfico e fixar o ttulo
Sheets("customer Shipments").Select
ActiveChart.ChartTitle.Text = _ customerNameCell.Value
& " CARREGAMENTOS"
End Sub

Para testar sua cpia da macro acima, selecione qualquer clula contendo dados
na folha chamada "The Data" e execute a macro. Se voc quiser, voc pode ocultar a
folha "Chart Data" desde que ela nunca esteja selecionada. Uma coisa que voc deve
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 314

querer fazer to montar um boto na folha "The Data" que automaticamente chame a
macro. Isto eliminar de ter que selecionar manualmente Ferramentas, Macros para
executar a macro.
Para criar um boto na planilha de dados:
Selecionar Exibir, Barra de ferramentas e mostrar a barra de ferramentas Drawing.
Sair dos menus.

A1 e desenhar um boto nas clulas A1:A2. Quando prompted para a


macro rodar, selecione a macro entitulada "PlotData".
a a palavra "Plot".

Se voc precisar fixar o rtulo do boto por qualquer razo, apenas mantenha
apertada a tecla CTRL e clique no boto para selecion-lo. Se voc precisar checar ou
mudar a macro, d um clique com o boto direito e selecione atribuir uma macro.

O ltimo item que voc poderia fazer congelar as linhas e colunas de cabealho
na folha de dados. Para congel-los, selecione a clula B3 e selecione Janela, Congelar
painis. Isto mantm os ttulos sem deslocar na tela, e mantm tambm o boto visvel
todo o tempo. O que segue o que a folha agora se parece:

Um dos problemas com a abordagem acima que voc tem de retornar


continuamente folha de dados da folha de grfico para plotar o prximo cliente. Uma
maneira de contornar isto criar duas macros adicionais e colocar botes que as chamem
da folha de grfico . Uma move uma linha para baixo e chama a macro PlotData acima.
A outra move uma linha para cima e chama a macro. Se tambm se encontrar uma linha
em branco, ela d a mensagem que se est no topo ou no fundo dos dados. O que segue
so estas duas macros:

Sub MoveDown()
'ir para a folha de dados. Activate usado no caso da folha
estar oculta.
Sheets("Os Dados").Activate
'mover para baixo uma linha e chamar a macro plotdata
ActiveCell.Offset(1, 0).Select
If Cells(ActiveCell.Row, 1) = "" Then
'retorne ao plot se estiver no fundo
ActiveCell.Offset(-1, 0).Select
Charts("customer Shipments").Select
MsgBox "Voc est no fundo dos dados"
Exit Sub
Lies de VBA do Excel 315

End If
'plot a prxima linha chamando a macro PlotData
PlotData
End Sub
'*****************************************************
Sub MoveUp()
'ir a folha de dados. Activate usado no caso da folha estar
oculta.
Sheets("The Data").Activate
'mover para cima uma linha e toda macro plotdata macro
ActiveCell.Offset(-1, 0).Select
If Cells(ActiveCell.Row, 1) = "" Then
'retornar ao plot se estiver no topo
ActiveCell.Offset(1, 0).Select
Charts("customer Shipments").Select
MsgBox "Voc est no topo dos dados"
Exit Sub
End If
'plot a prxima linha chamando a macro PlotData
PlotData
End Sub
'*****************************************************
Da mesma maneira que voc adicionou um boto folha de dados para chamar a
macro PlotData, voc poder adicionar dois botes folha de grfico para chamar as
macros acima. Isto lhe permitir rodar pelos dados sem ter que retornar planilha de
dados. O que segue com que aquela folha de grfico modificada se parece:

Por favor note que os botes na ilustrao acima so grandes em relao ao grfico
para ilustrar botes num grfico. Na sua aplicao real, eles podem ser muito pequenos.
Tambm, voc pode ocultar uma folha de dados quando as macros MoveUp e MoveDown
usarem Activate em vez de Select para ir folha de dados. O mtodo Activate permite-
lhe ir s folhas ocultas e trabalhar com elas como se elas estivessem visveis. Como se
mencionou anteriormente, a folha "Chart Data" pode tambm ocultar quando ela nunca
for selecionada.
Uma outra melhoria que voc poderia adicionar seria um boto that mostra uma
lista das linhas de dados, permitindo o usurio escolher qual linha de dados mostrar no
grfico.
COMO EVITAR A SELEO DE UM GRFICO EMBUTIDO
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 316

Meus agradecimentos a Tom Ogilvy pelo exemplo que ilustra como evitar
selecionar uma ativao de um grfico embutido. Evitar a seleo e ativao torna seu
cdigo mais eficiente e mais fcil de escrever.

Sub ChartExample()
Dim cht As Object
Set cht = ActiveSheet.ChartObjects("Chart 1").Chart
With cht.PlotArea
With .Border
.Weight = xlThin
.LineStyle = xlAutomatic
End With
.Interior.ColorIndex = xlNone
End With
End Sub
APRENDENDENDO A TRABALHAR COM ARQUIVOS SEQENCIAIS NO
VISUAL BASIC

Bem vindos amigos sexta parte de Macros em Excel e Visual Basic, estamos prontos
para ver mais sobre este interessante curso, neste caso veremos como se pode arquivar os
dados de uma folha em um arquivo aparte. Aprenderemos a trabalhar com arquivos
seqenciais em Visual Basic. Os arquivos seqenciais so aqueles que ao registrar seus
dados estes entram numa seqncia, por exemplo se registro 5 nomes, levaro uma ordem
de 1 ao 5, em troca existem tambm os arquivos aleatrios, mas eles no respeitam a
seqncia, por exemplo os 5 nomes poderiam ficar em qualquer posio do 100 em
diante, do 300 em diante, do 10 em diante, de onde quiseres p-los, tu indicas aonde
queres que fiquem os 5 nomes, podem ficar at separados e no respeitar uma seqncia.
O problema dos arquivos seqenciais que ao se introduzirem alguns smbolos na busca
podem alterar o arquivo e este no funcionar corretamente, por isso se recomenda filtrar
os dados com algum cdigo ou simplemente no procurar por smbolos.
Lies de VBA do Excel 317

Nesta folha podemos observar 5 nomes, a inteno ser arquiv-los em separado


e faz-los desaparecer da folha, para depois voltarmos fazer aparecer na folha. A isto se
chamar Registro de dados e Consulta de dados.

Iremos ao Visual Basic com Alt+F11 e Inseriremos um UserForm, no qual


desenharemos dois botes, um com o nome de Registro e o outro com o Nome de
Consulta.
Agora vamos programar o boto Registro, para poder arquivar os nomes.
Private Sub CommandButton1_Click()
Rem se translada clula A8
Range("A8").Select
Rem se no h nenhum dado na A8 que no se arquive de novo
If ActiveCell = Empty Then GoTo salte
Rem abre um arquivo na unidade c com o nome de dados.txt
Rem em forma de Temporal (Output) na rea de armazenamento #1
Open "c:\dados.txt" For Output As 1 Rem
ativa um rtulo para poder regressar
volte:
Rem escreva o dado da clula ativa no arquivo
Write #1, ActiveCell
Rem apaga o dado da clula
ActiveCell = Empty
Rem baixa um range para o nome seguinte
ActiveCell.Offset(1, 0).Select
Rem se a clula esta vazia que no regresse agora
If ActiveCell = Empty Then GoTo salte Rem volte
a escrever o seguinte nome no arquivo
GoTo volte:
salte: Rem
acabou-se
Rem fechar o arquivo
Close #1
End Sub
Os dados ficaro arquivados na unidade e sero devolvidos quando pressionares
o boto consulta. O que a seguir se mostra:
Agora vamos programar o boto consulta:
Private Sub CommandButton2_Click()
Rem transladar clula A8
Range("A8").Select
Rem Abre um arquivo na unidade C com o nome de dados.txt
Rem na forma de Leitura (input) na rea de armazenamento #1
Open "c:\dados.txt" For Input As 1
Rem isto significa lao, embora no seja final do arquivo
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 318

Rem isto quer dizer que no deixe de ler os dados


Rem at que no se chegue ao ltimo deles
Do While Not EOF(1)
Rem L um dado
Input #1, nome
Rem escreve na clula
ActiveCell.FormulaR1C1 = nome
Rem baixa um range para o seguinte nome
ActiveCell.Offset(1, 0).Select
Rem ativa o ciclo Do While - que regressa at
Rem que se cumpra a condio.
Loop
Rem fecha o arquivo
Close #1
End Sub
O que voc acha de arquivar os dados em separado sem que ningum possa
observ-los? Esta a magia dos arquivos seqenciais.
Este exemplo vem indexado em um arquivo com o nome de Macros VI.
O seguinte cdigo arquiva o nome, o endereo e o telefone no arquivo, cria um
formulrio igual com dois botes.
Private Sub CommandButton1_Click()
Rem trasladar clula A8
Range("A8").Select
Rem se no h nenhum dado em A8 que no se arquive de novo
If ActiveCell = Empty Then GoTo salte
Rem abre um arquivo na unidad c com o nome de dados.txt
Rem em forma de aadir Temporal(output) no rea de armazenamento
#1
Open "c:\dados.txt" For Output As 1 Rem
ativa um rtulo para poder regresar
volte:
Rem captura o nome em uma varivel
nome = ActiveCell Rem apaga o dado
da clula
ActiveCell = Empty
Rem move-se uma coluna direita
ActiveCell.Offset(0, 1).Select Rem
captura o endereo em uma varivel
endereo = ActiveCell Rem apaga o dado
da clula
ActiveCell = Empty
Rem move-se uma coluna direita
ActiveCell.Offset(0, 1).Select Rem
captura o telefone em uma varivel
telefone = ActiveCell Rem apaga o dado
da clula
ActiveCell = Empty
Rem escreva os dados nome, endereo e telefone no arquivo
Write #1, nome, endereo, telefone
Rem baixa um range para o seguinte nome
ActiveCell.Offset(1, 0).Select
Lies de VBA do Excel 319

Rem retrocede duas colunas


ActiveCell.Offset(0, -2).Select
Rem se a clula esta vazia que no regresse ainda
If ActiveCell = Empty Then GoTo salte Rem volte
a escrever o nome seguinte no arquivo
GoTo volte:
salte: Rem se
acabou
Rem fecha o arquivo
Close #1
End Sub

Private Sub CommandButton2_Click()


Rem transladar clula A8
Range("A8").Select
Rem abre um arquivo na unidade c com o nome de dados.txt
Rem em forma de Ler (input) na rea de armazenamento #1
Open "c:\dados.txt" For Input As 1
Rem isto significa lao embora no seja final do arquivo
Rem isto quer dizer que no deixe de ler os dados
Rem at que no se chegue ao ltimo deles
Do While Not EOF(1)
Rem l os dados
Input #1, nome, endereo, telefone
Rem escreva na clula o nome
ActiveCell.FormulaR1C1 = nome
Rem move-se uma coluna direita
ActiveCell.Offset(0, 1).Select
Rem escreva na clula o endereo
ActiveCell.FormulaR1C1 = endereo
Rem move-se uma coluna direita
ActiveCell.Offset(0, 1).Select
Rem escreva na clula o telefone
ActiveCell.FormulaR1C1 = telefone
Rem baixa um range para o seguinte nome
ActiveCell.Offset(1, 0).Select
Rem retrocede duas colunas
ActiveCell.Offset(0, -2).Select
Rem ativa o ciclo Do While - que regresse at
Rem que se cumpra a condio.
Loop
Rem fecha o arquivo
Close #1
End Sub
Este exemplo vem no arquivo Macros VI-2.
Tambm se pode consultar sem necessidade de ler os dados na folha, isto quer
dizer lendo direto do arquivo e trazendo os dados ao formulrio, no seguinte exemplo, se
programa o boto consulta em formulrio.
Lio #08 Cdigo VBA do Excel para Grficos e Arquivos Seqenciais 320

Desenhe o formulrio acima, os dois primeiros botes o mesmo cdigo anterior,


mas o terceiro boto inclui o seguinte cdigo:

Private Sub CommandButton3_Click() Open


"c:\dados.txt" For Input As 1
Do While Not EOF(1)
Input #1, nome, endereo, telefone
If nome = TextBox1 Then
TextBox2 = endereo
TextBox3 = telefone
End If
Loop
Close #1
End Sub
Este exemplo vem no arquivo Macros VI-3
Somente rode o formulrio e escreva o nome que deseja consultar e pressione o
terceiro boto.
Voc poder consultar qualquer dos nomes que se encontrem dentro do arquivo,
sem necessidade de que existam na folha, claro est que primeiro necessrio
pressionar o boto registro para arquiv-los, mas depois se podem manipular.
Bem espero que seja de seu agrado esta parte e que pratiquen muito os arquivos
seqenciais.
321

Fase #3: VBA do Excel Avanado

Lio 9: Criando e Modificando Menus

O Microsoft Excel tem mais de 30 menus que ajudam voc no uso do Microsoft
Excel. possvel aumentar ainda mais a barra de menus adicionando novos
menus e itens de menu a eles. E, voc pode adicionar itens de menus que
aparecem somente quando um dado arquivo aberto. De fato, voc pode remover
os menus Microsoft Excel e troc-los com menus personalizados se voc estiver criando
uma aplicao personalizada no Microsoft Excel.

O que segue so os tpicos deste texto:

Sobre Os Menus Excel Menus


Usando Macros Para Se Referir A Menus
As CommandBars
Adicionando, Mostrando E Deletando Sistema de Menu
Mais sobre CommandBars

Adicionando Um Novo Sistema de Menu


Um Exemplo de Adicionar/Remover Item de Menu
Propriedades do Item de Menu E Aparncia
Itens de Menu Especiais
Como Ocultar Todas as Coisas - Menus, Barras de Rolamentos, Etc..
Lio #09 Criando e Modificando Menus do Excel 322

Barra de Menu Menus

Barra Separadora
Itens de Menu
Sub-menu

Itens de Sub-menu

SOBRE OS MENUS EXCEL

Existem dois tipos bsicos de sistema de menu do Microsoft Excel: Sistemas de


menu que mostram uma barra de menu e menus pop-up (que no mostram uma barra de
menu) que aparecem quando voc clica no boto direito do mouse. O que segue ilustra
os diferentes componentes de um sistema de menu do Microsoft Excel que tem na barra
de menu:

A barra de menu mantm os nomes dos menus. Estes nomes so chamados captions
(ttulos). Os menus em fila mantm os nomes dos itens de menu. Um item de menu
pode mostrar um sub-menu, rodar um comando Microsoft Excel ou rodar uma macro.
Itens de sub-menus so usados para rodar comandos do Microsoft Excel ou macros. As
barras separadoras atuam para separar visivelmente os menus em grupos lgicos.

O que segue ilustra um menu pop-up e seus componentes:


Lies de VBA do Excel 323

Itens de Menu

Barras Separadoras

possvel fazer o seguinte a um sistema de menu do Microsoft Excel:

Criar novos sistemas de menu que tenham sua prpria barra de menus, menus,
itens de menu, e sub-menus.

Ocultar ou mostrar sistemas de menu que tenham barra de menus

Deletar ou resetar (un-delete) sistemas de menu criados pelo usurio

Adicionar ou delete menus numa barra de menu

Adicionar ou deletar itens de menu num menu

Habilitar e desabilitar itens num menu

Colocar marcas de verificao para itens num menu

Adicionar barras separadoras a menus

Criar menus pop-up

O que segue ilustra itens de menu que foram adicionados ao menu Inserir da planilha. O
>> que aparece na frente de cada adio era parte do texto que foi entrado para o item de
menu:

FIGURA
Lio #09 Criando e Modificando Menus do Excel 324

USANDO MACROS PARA SE REFERIR AOS MENUS

O sistema de menu no Microsoft Excel que tem barra de menus so tambm partes da
coleo CommandBars. Voc tambm pode usar CommandBars("Worksheet Menu
Bar") para referir ao sistema de menu da planilha. Os sistemas de barra de menu que
voc criou pode ser referenciado pelo seu nome. Por exemplo, se voc criou um chamado
Especial, ento voc se referir a ele como CommandBars("Especial").

Os menus de atalho, que no tem barra de menus, so parte da coleo commandbars.


CommandBars("clula") faz referncia ao menu popup clula.

AS COMMANDBARS

O que segue a lista dos nomes commandbars:

Worksheet Menu Bar Nondefault Drag e Drop Order


Chart Menu Bar AutoFill Nudge
Standard Button Align ou Distribute
Formatting Dialog Rotate ou Flip
PivotTable Series Lines
Chart Plot Area Connectors
Reviewing Floor e Walls AutoShapes
Forms Trendline Callouts
Stop Recording Chart Flowchart
External Data Formula Bar Block Arrows
Auditing PivotTable Context Menu Stars & Banners
Full Screen Query Basic Shapes
Circular Reference Query Layout Shapes

Visual Basic AutoCalculate Inactive Chart


Web Object/Plot Excel Control
Control Toolbox Title Bar (Charting) Curve
Exit Design Mode Layout Curve Node
Drawing WordArt Curve Segment
Query e Pivot Picture Pictures Context

Menu

Workbook tabs Shadow Settings OLE Object


Column 3-D Settings ActiveX Control
Lies de VBA do Excel 325

Row Borders WordArt Context

Menu

Cell Chart Type Rotate Mode


Ply Pattern Connector
XLM Cell Font Color Built-in Menus
Document Fill Color System
Desktop Line Color

Os nomes acima so usados para se referirem aos diferentes menus, barras de ferramentas
e menus pop-up. Por exemplo,

CommandBars("Clula")

Refere-se ao menu pop-up clula. Infelizmente, nem todas as commandbars tm um


ttulo que aparece quando voc mostr-las, e voc deve deduzir o nome da commandbar
pela ao que ela fornece e da lista acima.

ADICIONANDO, MOSTRANDO E DELETANDO SISTEMA DE MENU

Para criar um sistema de menu, voc poder usar o mtodo Adicionar. A sintaxe :

CommandBars.Adicionar "nome do menu"

Por exemplo, o comando

CommandBars.Adicionar "Pessoal"

Adicionar um sistema de menu. Uma vez criado uma nova barra de menu, voc pode
ento adicionar menus e itens de menu a ela. E, voc pode tambm adicionar botes
barra de ferramentas, como discutido no texto sobre barras de ferramentas.

Para mostrar um sistema de menu personalizado que voc criou, use a seguinte sintaxe:

CommandBars("nome domenu").Visible = True

Voc tem a opo de trocar o sistema de menu ativo, ou fazer seu novo sistema de menu
aparecer e no trocar o sistema ativo.
Lio #09 Criando e Modificando Menus do Excel 326

Para retornar aos menus da Microsoft Excel normais voc deve ativar o menu padro que
ser mostrado para a folha ativa ou ento fechar o Microsoft Excel. Assim se a folha
ativa for uma planilha, voc poder enviar o comando

MenuBars(xlWorksheet).Activate

Se a folha ativa for um grfico, voc poder enviar o comando

MenuBars(xlChart).Activate.

Para deletar um sistema de menu que voc adicionou, voc poder usar o seguinte tipo de
declarao:

CommandBars("menu name").Delete

Por exemplo, se voc criou um sistema de menu chamado Pessoal, ento voc poder
delet-lo usando a declarao MenuBars("Pessoal").Delete.

MAIS SOBRE COMMANDBARS

Como mencionado anteriormente, os menus so realmente parte da coleo


CommandBars. Isto basicamente significa que um commandbar um recipiente que
pode conter menus, ou botes, ou uma mistura dos dois.

O que segue a sintaxe completa para se criar uma commandbar:

CommandBars.Add Name:="nome da barra de comando", _


Position:=vbconstant
MenuBar:= True ou False,
Temporary:= True ou False

Todos os argumentos so opcionais, e se no usados, os defaults sero usados.

O que segue so os valores do argumento Position:

Constante Descrio

msoBarLeft, msoBarTop, Indica as posies esquerda, topo,


msoBarRight, msoBarBottom direita e fundo da nova barra de comando

msoBarFloating Indica que a nova barra de comando ser uma


barra flutuante
Lies de VBA do Excel 327

msoBarPopup Indica que a nova barra de comando ser um menu


de atalho

Se o argumento MenuBar ajustado para True, ento ele troca a commandbar ativa. Se
o argumento Temporary ajustado para True, ento a commandbar suposta removida
quando o arquivo que a criou fechado. Entretanto, a prtica atual mostra que esta
caracterstica no funciona. Voc dever ter a sua macro para remover o menu quando
fizer um.

ADICIONANDO UM NOVO SISTEMA DE MENU

O seguinte ilustra como adicionar um novo sistema de menu com um menu, itens de
menu, e sub menus. Voc pode modificar este exemplo quando necessrio para criar e
adicionar sua prpria estrutura e adies de menu.

Sub Cria_Um_Novo_Sistema_De_Menu()
Dim Meu_Menu As CommandBar, novoControle, novoItem, subMenu
'remove menus personalizados se existirem
On Error Resume Next
CommandBars("Sistema Novo Menu").Delete
On Error GoTo 0
'cria e mostra um novo menu
Set Meu_Menu = CommandBars.Adicionar(Name:="Sistema Novo
Menu", _ Position:=msoBarFloating, _ MenuBar:=False)
Meu_Menu.Visible = True
'adiciona um menu nova CommandBar
Set novoControle = _ Meu_Menu
.Controls.Adicionar(Type:=msoControlPopup)
novoControle.Caption = "Menu1"
'adicionar um item de menu ao novo menu
With novoControle
Set novoItem =
.Controls.Adicionar(Type:=msoControlButton)
Set subMenu =
.Controls.Adicionar(Type:=msoControlPopup)
End With
With novoItem
.Caption = "Isto Diz Hello"
.OnAction = "Al"
End With
'adicionar um sub menu ao novo menu e adicionar itens
a ele
With subMenu
.Caption = "Escolhas Adicionais"
Lio #09 Criando e Modificando Menus do Excel 328

Set novoItem =
.Controls.Adicionar(Type:=msoControlButton)
novoItem.Caption = "Examinar Pescaria"
novoItem.OnAction = "FishingStatus"
Set novoItem = _
.Controls.Adicionar(Type:=msoControlButton)
novoItem.Caption = "Examinar Jogo de Golfe"
novoItem.OnAction = "GolfingStatus"
End With
'adicionar um item de menu que restaurar os menus
originais
Set novoItem = _
novoControle
.Controls.Adicionar(Type:=msoControlButton)
With novoItem
.Caption = "Remove the Sistema Novo Menu"
.OnAction = "RemoveCustomMenu"
'Esta prxima declarao adiciona uma barra separadora
.BeginGroup = True
End With
'adiciona um menu nova CommandBar
Set novoControle = _
Meu_Menu
.Controls.Adicionar(Type:=msoControlPopup)
novoControle.Caption = "Menu2" Set
novoItem = _ novoControle
.Controls.Adicionar(Type:=msoControlButton)
With novoItem
.Caption = "Diga Tchau"
.OnAction = "DigaTchau"
End With End
Sub

Sub SayHello()
MsgBox "Al Mundo" End
Sub

Sub SayGoodBye()
MsgBox "Tchau!"
End Sub

Sub fishingStatus()
MsgBox "Pescar maravilhoso em todo momento!!!" End
Sub

Sub golfingStatus()
MsgBox "Quem se importa? Seria melhor estar pescando!" End
Sub

Sub RemoveCustomMenu()
Lies de VBA do Excel 329

CommandBars("Sistema Novo Menu").Visible = False End


Sub

Pontos chaves sobre a adio de menus, itens de menu, e sub menus:

Itens de menu so adicionados usando um Type de msoControlButton

Menus e sub-menus so adicionados usando um Type de msoControlPopup quando


o mtodo Adicionar usado com o mtodo Controls.

O texto de menu ajustado pela propriedade Caption.

Uma macro atribuda a um item de menu usando a propriedade OnAction.

Ajustando a propriedade Visible da commandbar para False, a commandbar fica


oculta. Para deletar a commandbar, use o mtodo Delete. Voc poder ocultar uma
commandbar se voc quiser torn-la visvel mais tarde.

Ajustando a propriedade BeginGroup de um item de menu para True adiciona uma


barra separadora acima do item de menu.

UM EXEMPLO DE ADIO/REMOO DE ITEM DE MENU

O que segue so duas macros que adicionam e removem um item de menu com uma barra
separadora do menu Ferramentas do Excel.

A primeira macro chamada "Auto_Open" e adiciona o item de menu quando o arquivo


for aberto. A segunda chamada "Auto_Close" e remove o item de menu quando o
arquivo for fechado. As macros com os nomes Auto_Open e Auto_Close so rodadas
automaticamente pelo Excel. Elas sero cobertas em mais detalhes num texto posterior.
Para evitar as macros de rodarem quando o arquivo est aberto ou fechado, mantenha
pressionada a tecla shift quando o arquivo aberto ou fechado.

Sub Auto_Open()
'isto adiciona a item de menu ao menu Ferramentas da
planilha quando o arquivo aberto
Dim mItem, novoItem
With CommandBars("Worksheet Menu
_Bar").Controls("Ferramentas")
For Each mItem In .Controls
'se o item de menu j est presente, pule a mensagem
If mItem.Caption = "NOVO ITEM DE MENU" Then _
GoTo displayMessage
Lio #09 Criando e Modificando Menus do Excel 330

Next
'adiciona um novo item de menu
Set novoItem =
.Controls.Adicionar(Type:=msoControlButton)
End With
'ajusta caption, atribui macro, adiciona barra separadora
With novoItem
.Caption = "NOVO ITEM DE MENU"
.OnAction = "Calcular_TIR"
.BeginGroup = True
End With
'mostra a caixa de mensagem dizendo ao usurio como usar
displayMessage:
MsgBox "Para usar a NOVO ITEM DE MENU, selecione 'NOVO ITEM
DE MENU' " & _
"sob o menu Ferramentas" End
Sub

Sub Auto_Close()
'isto remove o item de menu adicionado pela macro acima
quando o arquivo for fechado
Dim mItem, I As Integer
With CommandBars("Worksheet Menu Bar").Controls("Tools")
For Each mItem In .Controls
I = I + 1
'verifique o item de menu; delete se encontrado
If mItem.Caption = "NOVO ITEM DE MENU" Then
.Controls(I).Delete
'saia do lao quando o item for removido
Exit For
End If
Next
End With End
Sub

PROPRIEDADES e APARNCIA do ITEM DE MENU

Um item de menu tem trs propriedades que voc pode mudar aps o item de menu ter
sido adicionado a um menu. Elas so:

Caption
Enabled
State (usado para adicionar ou remover marcas de verificao pelo item de menu)

As propriedades Caption permitem-lhe entrar com um texto de descrio diferente para


o item de menu. A propriedade State pode ser ajustada para msoButtonDown para
mostrar um checkmark (visto) pelo item. Se ajustado para msoButtonUp, que o default,
no h checkmark. Se a propriedade Enabled ajustada para True, que o default, o
Lies de VBA do Excel 331

item de menu rodar a macro associada com o item. Se a propriedade Enabled ajustada
para False, ento o item de menu aparecer prateado e no rodar a macro associada.

Por exemplo, o que segue adiciona dois itens de menu ao menu Data. Ela tambm
desabilita o Segundo item de menu de modo que somente o primeiro pode ser rodado:

Sub Menu_Item_Exemplo()
Dim oMenu, novoItem
'adiciona o primeiro item de menu ao menu data
With CommandBars("Worksheet Menu Bar").Controls("Data")
Set novoItem =
.Controls.Adicionar(Type:=msoControlButton)
End With
'atribui nome e macro ao item de menu. Tambm, coloca uma
'linha separadora acima dele ajustando o BeginGroup para
True
With novoItem
.Caption = "Load Data - Step 1"
.OnAction = "Load_Data_Step1"
.BeginGroup = True
End With
'adiciona um segundo item de menu, mas desabailita-o
With CommandBars("Worksheet Menu Bar").Controls("Dados")
Set novoItem =
.Controls.Adicionar(Type:=msoControlButton)
End With
With novoItem
.Caption = "Load Data - Step 2"
.OnAction = "Load_Data_Step2"
.Enabled = False
End With
End Sub

Voc pode ento usar as declaraes seguintes na macro Load_Data_Step1 chamada pelo
primeiro item de menu para colocar um check mark no seu item de menu, desabilitar o
item de menu, e habilitar o passo 2 do item de menu:

With CommandBars("Worksheet Menu Bar").Controls("Data")


.Controls("Load Data - Step 1").Enabled = False
.Controls("Load Data - Step 1").State = msoButtonDown
.Controls("Load Data - Step 2").Enabled = True
End With

Se voc precisar fazer a propriedade Enabled mudar dependendo de qual folha est ativa,
ento voc pode criar uma macro que roda cada vez uma folha diferente seja ativada. Esta
macro poder ento ser ajustada nas propriedades Checked e Enabled dos itens de menu
aps ela determinar qual folha est ativa. A sintaxe par este comando :
Lio #09 Criando e Modificando Menus do Excel 332

Application.OnSheetActivate = "nome da macro"

A macro especificada ser tambm rodada se voc trocar de uma pasta para outra. Para
desabilitar este comando, ajuste-o igual a uma string vazia, (duas aspas duplas, "")

Application.OnSheetActivate = ""

ITENS DE MENUS ESPECIAIS

Voc colocar trs novos itens de menu ou botes na sua barra de ferramentas ou menus.
Estes novos itens so uma caixa de edio, uma caixa de lista drop-down, e a lista de
edio drop-down combinada. Elas comportam-se exatamente como os mesmos itens
sobre um formulrio de usurio (userform). Por exemplo, voc pode atribuir valores,
ajustar macros OnAction, e voc pode pedir pelos ajustes e contedos. Isto ilustrado
melhor no seguinte exemplo de macros:

Sub New_Menu_Item_Exemplo()
Dim newBar, newMenu, novoItem
'remove a antiga command bar se existir
On Error Resume Next
CommandBars("Exemplo Novo Menu").Delete
On Error GoTo 0
'cria nova barra
Set newBar = CommandBars.Add("Exemplo Novo Menu") newBar.Visible
= True
'Adicionar um item de menu a ela
Set newMenu = newBar.Controls.Add(Type:=msoControlPopup)
newMenu.Caption = "Exemplo Novo Menu"
'Adicionar um item de menu caixa de edio ao menu e atribuir
uma macro OnAction
Set novoItem = newMenu.Controls.Add(Type:= _ msoControlEdit)
novoItem.OnAction = "Display_Edit_Box_Entry" novoItem.Caption
= "Entre com a Descrio: "
'Adicionar um item de menu dropdown, atribuir valores, e uma
macro OnAction
Set novoItem = newMenu.Controls.Add(Type:=msoControlDropdown)
With novoItem
.Caption = "Selecione Um Item"
.OnAction = "Display_Drop_Down_Selection"
.AddItem Text:="Primeiro Item", Index:=1
.AddItem Text:="Segundo Item", Index:=2
.AddItem Text:="Terceiro Item", Index:=3
.AddItem Text:="Quarto Item", Index:=4
.AddItem Text:="Quinto Item", Index:=5
.AddItem Text:="Sexto Item", Index:=6
.DropDownLines = 5
.DropDownWidth = 75
Lies de VBA do Excel 333

.ListHeaderCount = 2
End With
'Adicionar um item de menu combo edio drop-down, 'atribuir
valores, e uma macro OnAction
Set novoItem = newMenu.Controls.Add(Type:= _
msoControlComboBox)
With novoItem
.Caption = "Selecionar ou Entrar com Um Ms"
.OnAction = "Display_Combo_Box_Selection"
.AddItem Text:="Janeiro", Index:=1
.AddItem Text:="Fevereiro", Index:=2
.AddItem Text:="Maro", Index:=3
.AddItem Text:="Abril", Index:=4
.AddItem Text:="Maio", Index:=5
.AddItem Text:="Junho", Index:=6
.DropDownLines = 5
.DropDownWidth = 75
.ListHeaderCount = 0
End With End
Sub

Sub Display_Edit_Box_Entry()
'mostra os contedos da caixa de edio
MsgBox CommandBars("Novo menu Exemplos") _
.Controls(1).Controls(1).Text
End Sub

Sub Display_Drop_Down_Selection()
'mostra o contedo da caixa drop down
With CommandBars("Novo menu Exemplos") _
.Controls(1).Controls(2)
MsgBox "Item " & .ListIndex & " selecionado. " & _
"Seu texto : " & .List(.ListIndex)
End With
End Sub

Sub Display_Combo_Box_Selection()
'mostra os contedos da caixa de edio drop-down
With CommandBars("ExemploNovo Menu") _
.Controls(1).Controls(3)
If .ListIndex = 0 Then
MsgBox .Text
Else
MsgBox "Item " & .ListIndex & " selecionado. " & _
"Seu texto : " & .List(.ListIndex)
End If
End With End
Sub
Lio #09 Criando e Modificando Menus do Excel 334

COMO OCULTAR TODAS AS COISAS - MENUS, BARRAS DE


ROLAMENTO, ETC..

Menus so partes da coleo commandbar. Voc pode ajustar a propriedade Enabled de


uma commandbar para False par ocult-la. Se o menu que mostrado a Worksheet
Menu Bar, o que segue a ocultar:

CommandBars("Worksheet Menu Bar") .Enabled


= False

Ou voc pode usar um comando For..Next e laar todas as commandbars e ajustar a


propriedade Enabled para False, ocultando ambos os menus e barras de ferramentas.
Ajustando a propriedade Enabled para True mostrar quaisquer menus e commandbars
que eram visveis inicialmente.

Outras aes que voc pode querer que sua macro faa so:

Ocultar a barra de frmula Ocultar a barra de status


Ocultar as alas das folhas
Ocultar as barras de rolamento
Ocultar os cabealhos de linhas e colunas
Ajustar a viso de tela cheia para ocultar a barra de ttulos da aplicao, ou atribuir
seu prprio nome barra (Application.Caption a propriedade)

Se voc ajustou a Application.DisplayFullScreen para True, voc poder tambm ajustar


ThisWorkbook.Protect Windows para True para eliminar o boto minimizar, maximizar,
restaurar e a linha que os mantm.

Se voc ocultar estes itens, voc precisa armazenar os ajustes originais de modo que voc
possa restaurar quando voc quiser. melhor armazenar os ajustes numa planilha (como
feito com as macros em ocultar as barras de ferramentas). Este modo, se uma de suas
macros encontrar uma declarao End, os ajustes no sero perdidos. Tambm, ele faz a
depurao e edio de seu cdigo mais facilmente, desde que a edio reajusta os valores
de quaisquer variveis do Visual Basic usadas para armazenar ajustes.

Voc tambm pode querer ocultar todas as linhas e colunas que voc no quer que o
usurio tenha acesso. E, voc pode querer ocultar todos os itens no menu pop-up clula e
desabilitar todas as combinaes de teclas CTRL atribuindo-as a uma macro muda que
no faa nada.

O que segue ilustra os conceitos acima, e usa as macros para ocultar barra de ferramentas
discutidas num texto anterior. Por favor ela deve ser rodada de uma planilha ou um erro
ocorrer.
Lies de VBA do Excel 335

Sub DemoRun()
StoreOptionSettings
HideOptionItems
HideCommandbars
Application.ScreenUpdating = True
MsgBox "Est Tudo Oculto"
ShowCommandbars
ShowOptionItems
End Sub

Sub StoreOptionSettings()
With ActiveWindow
Cells(1, 2) = .DisplayHorizontalScrollBar
Cells(2, 2) = .DisplayVerticalScrollBar
Cells(3, 2) = .DisplayWorkbookTabs
End With
With Application
Cells(4, 2) = .DisplayFormulaBar
Cells(5, 2) = .DisplayStatusBar
End With
Cells(6, 2) = ActiveWindow.DisplayHeadings End
Sub

Sub HideOptionItems()
Application.ScreenUpdating = False
ActiveWindow.WindowState = xlMaximized
ThisWorkbook.Protect Windows:=True
With ActiveWindow
.DisplayHorizontalScrollBar = False
.DisplayVerticalScrollBar = False
.DisplayWorkbookTabs = False
End With
With Application
.DisplayFormulaBar = False
.DisplayStatusBar = False
End With
ActiveWindow.DisplayHeadings = False
End Sub

Sub ShowOptionItems()
ActiveWindow.WindowState = xlMaximized
ThisWorkbook.Protect Windows:=False
With ActiveWindow
.DisplayHorizontalScrollBar = Cells(1, 2)
.DisplayVerticalScrollBar = Cells(2, 2)
.DisplayWorkbookTabs = Cells(3, 2)
End With
With Application
Lio #09 Criando e Modificando Menus do Excel 336

.DisplayFormulaBar = Cells(4, 2)
.DisplayStatusBar = Cells(5, 2)
End With
ActiveWindow.DisplayHeadings = Cells(6, 2) End
Sub

Sub HideCommandbars()
Dim cBar As CommandBar
For Each cBar In CommandBars
cBar.Enabled = False
Next
Application.DisplayFormulaBar = False
End Sub

Sub ShowCommandbars()
Dim cBar As CommandBar
For Each cBar In CommandBars
cBar.Enabled = True
Next End
Sub

SUMRIO

Embora este texto forneceu alguns comandos muito complexos , voc precisa so-mente
usar aqueles que vo de encontro s suas necessidades. Por exemplo, freqentemente eu
uso apenas o editor de menu editor para adicionar um novo item de menu ao menu. Desde
que eu use o editor de menu, este novo item aparece somente quando a pasta em que ele
foi criado aberta.

Exemplos de CommandBar e Menus


Usando Dilogos Built-In do Excel

Microsoft Excel tem mais de 200 dilogos embutidos (built-in) que voc pode usar em
suas macros. Para mostrar um dilogo embutido (built-in), voc usar uma declarao
como a seguinte:

Application.Dialogs(vb constant).Show ou
resposta = Application.Dialogs(vb constant).Show

Por exemplo, o que segue mostra o dilogo de seleo de impressora embutida:

Application.Dialogs(xlDialogPrint).Show ou
resposta = Application.Dialogs(xlDialogPrint).Show
Lies de VBA do Excel 337

A primeira declarao apenas mostra a caixa. A segunda declarao mostra a caixa e


determina varivel resposta o valor True se o boto OK foi selecionado, e o valor False
se o boto Cancel foi selecionado. O que est acima no somente mostra a caixa de
dilogo, mas emprega a ao que a caixa foi planejada a fazer se OK selecionado na
caixa. Por favor note que nem todas as constantes "xlDialog" mostraro um dilogo
embutido.
Ambas declaraes usam uma constante Visual Basic para indicar qual caixa de dilogo
mostrar. As constantes do Visual Basic que iniciam com "xlDialog" so aquelas para se
usarem.
Por favor note que nem todas as constantes "xlDialog" mostraro um dilogo
embutido. Para ver uma lista das constantes, faa o seguinte:

Mostre o Object Browser, selecione "<All Librarys>". Na lista Classes, selecione


"xlBuiltInDialog". Uma lista das constantes aparecer na caixa de listagem
membros.

Por exemplo, se voc quiser que a caixa de dilogo aparea quando voc gravar um novo
arquivo, voc poder usar a seguinte declarao:

Application.Dialogs(xlDialogOpen).Show

Para mostrar o dilogo Salvar Como e garantir que o seu uso salvou o arquivo, voc
poder usar as seguintes declaraes:

Do resposta = Application.Dialogs(xlDialogSaveAs).Show
Loop Until resposta = True

Exemplos Adicionais do uso de Salvar Como e dilogos embutidos DialogOpen so


encontrados na seo arquivos.

O que segue uma lista de apenas umas poucas constantes do Visual Basic e a caixa de
dilogos que elas mostram.

Constante Caixa de Dilogo

xlDialogOpen A caixa para abrir arquivo


xlDialogSaveAs A caixa Salvar Como
xlDialogSetPrintTitles A caixa set print titles (do Excel 4)
xlDialogChartWizard O assistente (wizard) de diagramas
xlDialogCreateNames A caixa para criar nomes
xlDialogFont A caixa fonte de clula
xlDialogGoalSeek A caixa goal seek
Lio #09 Criando e Modificando Menus do Excel 338

xlDialogUnhide A caixa para ocultar um arquivo


xlDialogZoom A caixa de zoom

Um cuidado ao se usar a caixa de dilogos Microsoft Excel: Se voc tentar mostrar uma
caixa de dilogo embutido numa folha onde ela no pode ser usada, ela falhar. Por
exemplo, a caixa zoom no pode ser usada numa folha de mdulo. Mas ela funciona bem
se a folha ativa uma planilha ou uma folha de diagramas.

CommandBar.Add Produz Err 91 na Workbook_Open

Quando se referir ao objeto CommandBars num procedimento evento tal como o cdigo
abrir pasta num mdulo de objeto pasta, voc precisa preced-lo pelo Application:

Set cbarMine = Application.CommandBars _


.Add("My Toolbar", msoBarTop, True, True)

se voc no fizer, voc pode obter uma mensagem Err 91.

Adicionando Um tem de Menu A Um Menu

O que segue so quatro macros que adicionam e removem um item de menu com uma
barra separadora de um menu. A primeira chamada "Auto_Open" e chama uma rotina
chamada AddMenuItem que adiciona um novo item de menu a um menu nos menus de
planilha. A segunda chamada "Auto_Close" e chama uma rotina chamada
RemoveMenuAddition que remove o item de menu quando o arquivo fechado. Voc
pode chamar AddMenuItem e RemoveMenuAddition repetidamente para adicionar
mltiplos tens de menus. Macros com os nomes Auto_Open e Auto_Close, so rodadas
automaticamente pelo Excel, quando um arquivo aberto ou fechado.

Sub Auto_Open()
'Chama a rotina que adiciona o item, especificando o menu da planilha para
' o novo item de menu, o nome a aparecer no menu, a macro a ser rodada,
'e se adiciona uma barra separadora acima ou no ao novo item
AddMenuItem "Ferramentas", "Converter Arquivos", _
"Main_Procedure_For_Converting_Files", True
End Sub

Sub Auto_Close()
'Chama a rotina que remove um item de menu do menu da planilha
'especificando o nome do menu e o nome do item de menu.
RemoveMenuAddition "Ferramentas", "Converter Arquivos"
End Sub
Lies de VBA do Excel 339

Sub AddMenuItem(menuName As String, itemName As String, _


macroName As String, bAddSeperator As Boolean) Dim
mItem, newItem
'isto remove item se ele estiver num menu
RemoveMenuAddition menuName, itemName
'adiciona novo item de menu; setting uma propriedade temporria para
' verdadeiro (true) garantindo que o item de menu desaparece quando o Excel
fechado
With CommandBars("Worksheet Menu Bar").Controls(menuName)
Set newItem = .Controls.Add(Type:=msoControlButton, _
temporary:=True)
End With
'configura o caption, associa uma macro, adiciona barra separadora
With newItem
.Caption = itemName
.OnAction = macroName
.BeginGroup = bAddSeperator
End With
End Sub

Sub RemoveMenuAddition(menuName As String, itemName As String)


Dim mItem, I As Integer
'isto remove o item de menu adicionado pela macro acima quando o arquivo
fechado
With CommandBars("Worksheet Menu Bar").Controls(menuName)
For Each mItem In .Controls
I = I + 1
'verifica um item de menu; delete se encontra
If mItem.Caption = itemName Then
.Controls(I).Delete
'sai do lao quando o item tiver sido removido
Exit For
End If
Next
End With
End Sub

Adicionando Um Menu e Sub Menus ao Menu Da Planilha

O que segue ilustra como adicionar um novo menu ao menu de planilha, e da ento como
adicionar item de menus e sub menus ao novo menu. Por simplicidade, todos os tens de
menus que tem uma propriedade OnAction so configurados para rodar a mesma macro,
"AlMundo". Na sua aplicao, voc pode usar diferentes OnActions.

Sub AddingMenusAndSubMenus()
Dim c
'deleta o novo menu se ele existir - chama todas as sub-rotinas listadas abaixo
Lio #09 Criando e Modificando Menus do Excel 340

Remove_New_Menu
'adiciona o novo menu ao menu da planilha antes do menu ajuda
With Application.CommandBars(1).Controls. _
Add(msoControlPopup, , , 9, True)
.Caption = "MeuMenu"
'adiciona um item de menu ao novo menu
Set c = .Controls.Add(msoControlButton)
c.Caption = "Item 1"
c.OnAction = "AlMundo"
'adiciona um sub menu ao novo menu
With .Controls.Add(msoControlPopup)
.Caption = "Item 2"
'adiciona um item de menu ao menu sub
Set c = .Controls.Add(msoControlButton)
c.Caption = "Sub 1 Item 1"
c.OnAction = "AlMundo"
'adiciona um sub menu ao menu sub
With .Controls.Add(msoControlPopup) .Caption
= "Sub 1 Item 2"
'adiciona trs itens de menu ao sub menu mais baixo
Set c = .Controls.Add(msoControlButton)
c.Caption = "Sub 2 Item 1"
c.OnAction = "AlMundo"
Set c = .Controls.Add(msoControlButton)
c.Caption = "Sub 2 Item 2"
c.OnAction = "AlMundo"
Set c = .Controls.Add(msoControlButton)
c.Caption = "Sub 2 Item 3"
c.OnAction = "Al Mundo"
End With
'adiciona a menu item to first sub menu
Set c = .Controls.Add(msoControlButton)
c.Caption = "Sub 1 Item 3"
c.OnAction = "AlMundo"
End With
'adiciona a menu item to the menu
Set c = .Controls.Add(msoControlButton)
c.Caption = "Item 3"
c.OnAction = "AlMundo"
End With
End Sub

Sub AlMundo()
MsgBox "al mundo"
End Sub

Quando a pasta fechada, o que segue roda e remove o novo menu.


Lies de VBA do Excel 341

Sub Auto_Close()
Remove_New_Menu
End Sub

Sub Remove_New_Menu()
Dim c
'deleta o novo o novo menu se ele existir
For Each c In Application.CommandBars(1).Controls
If c.Caption = "MeuMenu" Then c.Delete
Next
End Sub

Como Adicionar Uma Nova Barra de Menu Semelhante Barra de Menu da


Planilha

O que segue adiciona uma barra de menu como a barra de menu da planilha, exceto que
os menus so chamados Menu1 e Menu2.

Sub Create_A_New_Menu_System()
Dim My_Menu As CommandBar, newControl, newItem, subMenu
'remove menus personalizados se existirem
On Error Resume Next
CommandBars("New Menu System").Delete
On Error GoTo 0
'cria um novo menu e mostra-o
Set My_Menu = CommandBars.Add(Name:="New Menu System", _
Position:=msoBarTop, _
MenuBar:=False)
My_Menu.Visible = True
'adiciona um menu nova CommandBar
Set newControl = My_Menu.Controls.Add(Type:=msoControlPopup)
newControl.Caption = "Menu1"
'adiciona um item de menu ao novo menu
With newControl
Set newItem = .Controls.Add(Type:=msoControlButton)
Set subMenu = .Controls.Add(Type:=msoControlPopup)
End With
With newItem
.Caption = "Isto diz Al"
.OnAction = "SayHello"
End With
'adiciona um sub menu ao novo menu e adiciona items a ele
With subMenu
.Caption = "Escolhas Adicionais"
Set newItem = .Controls.Add(Type:=msoControlButton)
newItem.Caption = "Conferir a Pesca"
newItem.OnAction = "FishingStatus"
Set newItem = _
Lio #09 Criando e Modificando Menus do Excel 342

.Controls.Add(Type:=msoControlButton)
newItem.Caption = "Conferir o Jogo de Golfe" newItem.OnAction
= "GolfingStatus"
End With
'adiciona um item de menu que restaura os menus originais
Set newItem = _
newControl.Controls.Add(Type:=msoControlButton)
With newItem
.Caption = "Remover o novo sistema de menu"
.OnAction = "RemoveCustomMenu"
'Esta prxima declarao adiciona uma barra separadora
.BeginGroup = True
End With
'adiciona um menu nova CommandBar
Set newControl = My_Menu.Controls.Add(Type:=msoControlPopup)
newControl.Caption = "Menu2" Set newItem =
newControl.Controls.Add(Type:=msoControlButton)
With newItem
.Caption = "Diz Tchau"
.OnAction = "DizTchau"
End With
End Sub Sub
SayHello()
MsgBox "Al Mundo"
End Sub

Sub DizTchau()
MsgBox "Tchau!"
End Sub

Sub fishingStatus()
MsgBox "Pescar maravilhoso o tempo todo!!!"
End Sub

Sub golfingStatus()
MsgBox "Quem se importa? Seria melhor pescar!"
End Sub

Sub RemoveCustomMenu()
CommandBars("New Menu System").Delete
End Sub

Boto Como Controle Sobre Um Menu

O que segue cria uma barra de comando flutuante que tem boto como item de menu alm
de um menu de item drop down:
Lies de VBA do Excel 343

Sub Floating_New_Menu_System()
Dim newMenu As CommandBar, newControl, newItem, subMenu
'remove menu personalizado se ele existir On Error
Resume Next
CommandBars("New Menu System").Delete
On Error GoTo 0
'cria novo menu e mostra-o
Set newMenu = CommandBars.Add(Name:="New Menu System", _
Temporary:=True, _
MenuBar:=False)
newMenu.Visible = True
'adiciona um menu ao novo CommandBar
Set newControl =
newMenu.Controls.Add(Type:=msoControlPopup)
newControl.Caption = "Menu1"
'adiciona um item de menu ao novo menu
With newControl
Set newItem = .Controls.Add(Type:=msoControlButton)
End With
With newItem
.Caption = "This Says Hello"
.OnAction = "SayHello"
End With
'adiciona um segundo controle que atua como um boto Set newItem
= newMenu.Controls.Add( _
Type:=msoControlButton, Temporary:=True)
With newItem
.Caption = "Control Text"
.Style = msoButtonCaption
.TooltipText = "Control Tool Tip"
.OnAction = "SayHello"
End With
End Sub

Sub SayHello()
MsgBox "Hello"
End Sub

Ocultando O Menu Da Planilha

Voc pode ocultar o menu de planilha Excel usando a seguinte declarao

Application.CommandBars(1).Enabled = False
Lio #09 Criando e Modificando Menus do Excel 344

Entretanto, se voc pressionar a tecla ALT e da as teclas setas, o menu mostrado


novamente. Existe um modo fcil para resolver o acesso s teclas ALT para desabilitar
menus:

Application.CommandBars(1).Enabled = False MenuBars.Add.Activate

A segunda linha evita a tecla ALT de funcionar criando e ativando uma barra de menu em
branco. Como ela no tem menus, ela no visvel ou acessvel.

Para recuperar os menus, use as declaraes seguintes:

Application.CommandBars(1).Enabled = True
MenuBars(xlWorksheet).Activate

Colocando Um DropDown Numa Barra de Comando (CommandBar)

O que segue cria uma barra de comando com um dropdown nela e responde com a seleo
do usurio.

Sub CommandBarDemo()
Dim cBar As CommandBar
Dim I As Integer
'delete a barra se ela existir
On Error Resume Next
CommandBars("Combo Bar").Delete
On Error GoTo 0
'cria a barra de comando e a torna visvel
Set cBar = CommandBars.Add("Combo Bar", msoBarFloating)
cBar.Visible = True
'adiciona um controle dropdown
With cBar.Controls.Add(msoControlDropdown)
'atribui uma macro ao drop down
.OnAction = ThisWorkbook.Name & "!DropDownOnAction"
'make wider:
.Width = 200
'adiciona items caixa drop down
For I = 1 To 10
.AddItem "item drop down " & I
Next
End With
End Sub

Sub DropDownOnAction()
'isto mostra o que foi selecionado
With CommandBars.ActionControl
Lies de VBA do Excel 345

MsgBox "Voc selecionou " & .Text


End With
End Sub

Criando Um Menu Que Aparece Somente Quando Uma Pasta Particular


Est Ativa

O que segue code ilustra como ter um nico menu adicionado ao menu de planilha
sempre que uma pasta particular est ativa. Para fazer isto, coloque o cdigo seguinte no
mdulo de cdigo da pasta:

Private Sub Workbook_Deactivate()


'chama a rotina que remove o menu para esta workbook
Remove_Workbook_Menu
End Sub

Private Sub Workbook_Activate()


'chama a rotina que adiciona o menu para esta workbook
Add_Workbook_Menu_And_Items
End Sub

Voc pode acessar o mdulo de cdigo da workbook clicando o boto direito


sobre o objeto workbook no Project Explorer e selecionando exibir cdigo

Num mdulo de cdigo regular, coloque o seguinte cdigo:

Sub Remove_Workbook_Menu()
'isto remove o menu se ele estiver presente
On Error Resume Next
CommandBars("Worksheet Menu
Bar").Controls("OPTIONS").Delete
On Error GoTo 0
End Sub

Sub Add_Workbook_Menu_And_Items()
Dim newMenu
Dim newMenuItem
'deleta o menu se ele existir chamando esta subroutina
Remove_Workbook_Menu
'adiciona um novo menu ao menu de planilha. O menu temporrio e
'desaparecer quando o Excel fechar
With CommandBars("Worksheet Menu Bar")
Set newMenu = .Controls.Add( _
Type:=msoControlPopup, _
before:=.Controls("Window").Index, _
temporary:=True)
Lio #09 Criando e Modificando Menus do Excel 346

End With
'd um nome ao novo menu newMenu.Caption =
"OPTIONS"
'adiciona um item de menu ao novo menu
Set newMenuItem =
newMenu.Controls.Add(Type:=msoControlButton)
'd um nome ao novo menu e atribui uma macro a ele
newMenuItem.Caption = "Menu Item 1"
newMenuItem.OnAction = "MenuItem1OnAction"
'adiciona um segundo item de menu ao novo menu
Set newMenuItem =
newMenu.Controls.Add(Type:=msoControlButton)
'd um nome ao novo menu e atribui uma macro a ele
newMenuItem.Caption = "menu Item 2"
newMenuItem.OnAction = "MenuItem2Onaction" End Sub

Finalmente, cria uma macro Auto_Close que chama a macro Remove_Menu quando a
pasta fechada e uma macro Auto_Open que mostra o menu quando a pasta aberta
inicialmente.

Sub Auto_Close()
Remove_Workbook_Menu
End Sub

Sub Auto_Close()
Add_Workbook_Menu_And_Items
End Sub

Adicionando Um Menu E Itens de Menu Ao Menu da Planilha

O que segue adiciona um menu no final do menu da planilha, e da adiciona itens de menu
e sub menus a ele.

Sub AddMenu()
With Application.CommandBars(1).Controls _
.Add(msoControlPopup)
.Caption = "NovoMenu"
.Controls.Add(msoControlButton)
.Caption = "Item 1"
With .Controls.Add(msoControlPopup)
.Caption = "Item 2"
.Controls.Add(msoControlButton)
.Caption = "Sub1Item2"
With .Controls.Add(msoControlPopup)
.Caption = "Sub2Item2"
.Controls.Add(msoControlButton) _
.Caption = "Sub1Sub2"
.Controls.Add(msoControlButton) _
Lies de VBA do Excel 347

.Caption = "Sub2Sub2"
.Controls.Add(msoControlButton) _
.Caption = "Sub3Sub2"
End With
.Controls.Add(msoControlButton)
.Caption = "Sub3Item2"
End With
.Controls.Add(msoControlButton)
.Caption = "Item3"
End With
End Sub

Adicionando Um Novo Menu Ao Menu De Planilha

O cdigo que segue um outro exemplo que adiciona um novo menu personalizado ao
menu da planilha, exatamente antes do menu Ajuda, e coloca dois comandos nele. A
propriedade OnAction especifica a macro que cada comando roda:

Public Sub AddCustomMenu()


Dim barWS As CommandBar
Dim mnuCustom As CommandBarControl
Dim HelpIndex As Integer
Set barWS = CommandBars("Worksheet Menu Bar")
HelpIndex = barWS.Controls("Ajuda").Index
Set mnuCustom = barWS.Controls.Add(Type:=msoControlPopup, _
Before:=HelpIndex)
With mnuCustom
.Caption = "&Personalizado"
With .Controls.Add(Type:=msoControlButton)
.Caption = "&Mostrar o Formulrio de Dados"
.OnAction = "MostrarFormularioDados"
End With
With .Controls.Add(Type:=msoControlButton)
.Caption = "&Imprimir Lista de Dados"
.OnAction = "ImprimirListaDados"
End With
End With
End Sub
Desabilita o Menu Salvar Como

O que segue desabilitar o item de menu Salvar Como no menu da planilha:

Sub DesabilitaItemMenuSaveAs()
With CommandBars("Worksheet Menu Bar")
With .Controls("Arquivo")
.Controls("Salvar Como...").Enabled = False
End With
Lio #09 Criando e Modificando Menus do Excel 348

End With
End Sub

Colocando de volta a propriedade Enabled para True ela liga o item de menu Salvar
Como.

Recompondo Os Menus

O que segue restaurar os menus da planilha:

MenuBars(xlWorksheet).Reset

Por favor note que isto remover toadas as modificaes feitas por quaisquer add-in.

Protegendo Commandbars

Para proteger uma commandbar de modificao, use uma declarao como a que segue:

CommandBars("Worksheet Menu Bar").Protection = msoBarNoCustomize

Para remover a proteo, use:

CommandBars("Worksheet Menu Bar").Protection =


msoBarNoProtection

O valor da Protection pode ser feito com uma das ou soma das seguintes:

MsoBarNoProtection
MsoBarNoCustomize
msoBarNoResize msoBarNoMove
msoBarNoChangeVisible
msoBarNoChangeDock
msoBarNoVerticalDock
msoBarNoHorizontalDock.

Como Adicionar Uma Barra Separadora de Item de Menu

Configure a propriedade BeginGroup para True para adicionar uma barra


separadora antes de um novo item de menu ou um boto na barra de comando.

O que segue ilustra como adicionar uma barra separadora acima de um item de menu
adicionado ao menu Ferramentas:

Dim menu_Item
'adiciona um item de menu temporrio ao menu Ferramentas
Lies de VBA do Excel 349

'ele desaparece quando o Excel fechado mas no quando o


'arquivo fechado a menos que a macro remover abaixo seja chamada.
With CommandBars("Worksheet Menu
Bar").Controls("Ferramentas")
Set menu_Item = _
.Controls.Add(Type:=msoControlButton,
Temporary:=True)
End With
'atribui nome e macro ao item de menu. Tambm, coloca uma linha
'separadora acima dele configurando BeginGroup para True
With menu_Item
.Caption = "Isto Diz Al"
.OnAction = "SayHello"
'this puts the barra separadora above the item de menu
.BeginGroup = True
End With

Determinando Qual Boto Foi Clicado Numa Barra de Ferramentas

O que segue ilustra como determinar qual boto foi clicado numa barra de
ferramentas. Cria uma barra de ferramentas personalizada chamada TestBar1, adiciona
trs controles personalizados a ela, e configura seus captions para One, Two, e Three.
Atribui esta macro a cada boto:

Sub WhichButtonWasPressed()
With CommandBars("TestBar1")
'retorna o caption ou nome do boto que foi
Select Case CommandBars.ActionControl.Caption
'adapta o caption declarao case
Case "One"
MsgBox "Voc pressionou Um"
Case "Two"
MsgBox "Voc pressionou Dois"
Case "Three"
MsgBox "Voc pressionou Trs"
End Select
End With
End Sub

Por favor note que as declaraes Case acima so case sensitive a menos que voc
coloque a Option Compare Text no topo do seu mdulo ou converta todo o texto mesma
case.

Um outro modo de se determinar qual boto foi clicado usar a propriedade Tag ou
Parameter do controle:

MsgBox CommandBars.ActionControl.Parameter
Lio #09 Criando e Modificando Menus do Excel 350

CommandBars E Nmeros de Controles

O que segue ilustra como modificar um menu usando o nmero de controle de menus ao
invs de seu nome. Os nomes so especficos da linguagem.

Sub Add_Menu_Item()
Dim ctlMenu As CommandBarControl
Dim ctlMenuItem As CommandBarControl
'remove antes de adicionar!
RemoveMenuItem
'
'o nmero 30007 o menu Ferramentas
'
Set ctlMenu = _
Application.CommandBars(1).FindControl(, 30007)
Set ctlMenuItem = _
ctlMenu.Controls.Add(Type:=msoControlButton)
ctlMenuItem.Caption = "QuickTable" ctlMenuItem.OnAction =
ThisWorkbook.Name & "!QuickTable"
End Sub

Sub RemoveMenuItem()
Dim ctlMenu As CommandBarControl
On Error Resume Next
Set ctlMenu = _
Application.CommandBars(1).FindControl(, 30007)
ctlMenu.Controls("QuickTable").Delete
End Sub

Como Adicionar Um Atalho de Menu

Com respeito sintaxe, voc acessa atalhos de menus exatamente da mesma maneira que
voc adiciona-os aos menus regulares. O truque conhecer qual deles se referir, pois
existem 40 deles. O que artigo que segue com base no MS Knowledge de
aproximadamente 19 pginas, e uma boa referncia sobre as barras de comando em
geral. A pgina 12 contm uma lista dos nomes das barras de atalhos embutidas.

"XL97: WE1183 "Customizing Menu Bars, Menus and Menu Items"


http://support.microsoft.com/support/kb/articles/q166/7/55.asp

Caixas de Texto Na CommandBars


Lies de VBA do Excel 351

Caixas de Textos sobre CommandBars funcionam exatamente como caixas de texto


normais. O modo mais fcil par ler o texto no procedimento de voc atribuir ao controle
caixa de texto colocar o cdigo seguinte:

Dim szText As String


szText = CommandBars.ActionControl.Text

Listagem Dos Atalhos de Menus

O que segue macro cria a lista na folha ativa de todos os menus de atalho e itens de menus
em cada um.

Sub List_Short_Cut_Command_Bars_And_Menus()
Dim cell As Range
Dim R As Integer
Dim c As Integer
Dim ctlBar As CommandBar
R = 2
Range("a1").Value = "Index #"
Range("b1").Value = "Commandbar Name"
Range("c1").Value = "item de menu captions"
For Each ctlBar In CommandBars
If ctlBar.Type = msoBarTypePopup Then
Cells(R, 1) = ctlBar.Index
Cells(R, 2) = ctlBar.Name
For c = 1 To ctlBar.Controls.Count
Cells(R, c + 2) = _
ctlBar.Controls(c).Caption
Next
R = R + 1
End If
Next ctlBar
Cells.EntireColumn.AutoFit
MsgBox "All done"
End Sub

Cdigos de Menu Disponveis Na Internet

Se voc j ouvir falar sobre o Baarns web site, voc pode pegar o seu arquivo Developer
Jumpstart. Ainda mais para muitos outros modelos de cdigos, este arquivo contm uma
tabela de driven para construir CommandBar. Tudo o que voc tem a fazer preencher a
tabela e incluir nela um mdulo de cdigo extra no seu projeto, ela construir qualquer
das commandbars que voc especificou na tabela automaticamente. Ele construir
menubars, barras de ferramentas e menus popup todos da mesma tabela.
Lio #09 Criando e Modificando Menus do Excel 352

Voc pode encontrar vrios exemplos de fazer de cdigos de menu no site de John
Walkenbach,

http://www.j-walk.com/ss

Procure a seo Excel Developer Tips. Tambm, examine a seo downloads. Vrios dos
arquivos incluem cdigos que adicionam um item de menu ao manu Ferramentas.
Artigos na Internet Sobre Como Mudar Os Menus

Para maiores informaes de como mudar os menus Excel, download e rodar os seguintes
arquivos. Quando voc rodar os arquivos, eles instalaro um documento word que voc
pode ento abrir e ler.

Customizing Menu Bars, Menus, e Menu Items

Como Evitar Customization de Menus e Toolbars

Desabilitando a Personalizao da Commandbar

Se voc estiver usando o Excel 2002, possvel evitar que um usurio modifique as
commandbars. A declarao :

CommandBars.DisableCustomize = True

Para habilitar a personalizao use:

CommandBars.DisableCustomize = False

Se a sua aplicao ainda precisar rodar sob uma verso anterior, use a seguinte abordagem
(approach):

Dim cBars As Object


Set cBars = Application.CommandBars
If Val(Application.Version) >= 10 Then
cBar.DisableCustomize = True
End If
353

Fase #3: VBA do Excel Avanado

Lio 10: Usando Controles ActiveX nas Planilhas e Grficos

As lies 5, 6 e 7 mostraram-lhe como criar userforms e colocar neles objetos tais


como as barras de rolamento, as caixas de listagem, e os botes de comando. O Microsoft
Excel tambm lhe permite colocar tais objetos diretamente numa planilha ou grfico. Se
o objeto for um boto de comando, uma macro pode ser especificada a executar quando
o boto for clicado. Se o objeto for uma caixa de listagem, um boto de rotao ou uma
barra de rolamento, ento estes podem estar vinculados s frmulas ou clulas nas suas
planilhas.
CRIANDO BOTES E USANDO A BARRA DE FERRAMENTAS
FORMULRIO
O modo mais fcil de se criar um boto e atribuir uma macro a ele usar o seguinte
boto da barra de ferramentas Formulrio.
Para mostrar a barra de ferramentas Formulrio, selecione Exibir, Barra de
ferramentas, e clique na barra de ferramentas Formulrio. Voc pode ocultar esta barra
de ferramentas quando acabar. Os botes criados deste modo podem ser colocados nas
planilhas e nos grficos.

Este boto ser


criado agora

Quando voc clicar neste boto, um serrilhado aparecer e lhe permitir desenhar
o boto. Simplesmente clique com o boto da esquerda do mouse onde voc quer o canto
superior daquele boto que estamos criando, mantenha o boto do mouse apertado, e
arraste para onde voc quiser o canto inferior e solte.
Voc pode fazer o seu boto to grande quanto voc queira. Quando voc soltar o
boto do mouse, a caixa de dilogo Atribuir Macro seguinte surge e solicita-lhe especificar
a macro a ser associada ao boto.
Lio #10 Usando Controles ActiveX nas planilhas e grficos 354

As macros aparecero em ordem alfabtica, qualificadas pelos nomes das pastas


se elas existirem em pastas diferentes.

Depois de voc selecionar OK, a caixa acima fecha e seu boto mostrado. dado
um nome default como "Boto 1". Tambm, voc notar que o boto est selecionado,
como islutrado pela aparncia seguinte:

Quando o boto est selecionado, voc pode clicar no boto e editar o texto que
aparece nele. Se voc pressionar enter enquanto voc estiver digitando o texto no boto,
voc ir para a prxima linha. Quando voc estiver terminado de digitar o texto,
deselecione o boto, apenas clicando em qualquer clula na folha. Para selecionar
novamente um boto, mantenha apertado a tecla CTRL e clique nele usando o boto
esquerdo do mouse.
Se voc clicar num boto com o boto direito do mouse, o boto ser selecionado
e o painel seguinte mostrado:
Lies de VBA do Excel 355

O item de menu Formatar controle... permite-lhe mudar a aparncia da fonte. Por


exemplo, voc pode negritar o texto e mudar a sua cor e o seu tamanho. A mudana afeta
todo o texto, no apenas parte dele. O item de menu Atribuir Macro... permite-lhe mudar
a macro que foi atribuida ao boto.
Uma vez assumida uma macro para o seu boto e editado o texto no boto para
descrever sua funo, clique em qualquer clula na planilha para de-selecionar o boto.
Agora, quando voc clicar no boto, a macro atribuida a ele executada.
Se voc quiser que o boto seja visvel no importando onde voc rolar na planilha,
ento coloque o boto na clula A1, selecione uma clula cujo canto esquerdo superior
esteja logo abaixo e direita do boto, e ento selecione Janela, Congelar painis.
CRIANDO UM BOTO ActiveX
O outro modo de se criar um boto numa barra de ferramentas fazer o seguinte:
Selecione Exibir, Barras de ferramentas e mostre a barra de ferramentas de Controle. A
barra de ferramentas seguinte aparecer:

O 6 boto da direita tem uma dica de ferramenta "Boto de comando". Voc


pode clicar neste boto e da desenhar um boto na planilha. Entretanto, voc no pode
desenhar botes de comando ou qualquer outro controle desta barra de ferramentas nas
folhas de grfico. Voc deve usar os objetos da barra de ferramentas formulrios em
vez disso.
Depois que voc desenhar um boto na planilha, voc notar que o boto est
selecionado, e que o primeiro boto da barra de ferramentas acima est destacado. Isto
significa que voc est no modo design, e pode mudar as propriedades do boto. Para
mudar as propriedades, clique no segundo boto, cuja dica de ferramenta
"Propriedades". Por exemplo, voc pode mudar o ttulo (caption) do boto, a fonte, e o
background.
Lio #10 Usando Controles ActiveX nas planilhas e grficos 356

Voc dever quase sempre mudar a propriedade do boto TakeFocusOnClick para


False. O valor default True. Entretanto, isto causa problemas freqentemente, quando
o cdigo freqentemente se referir s clulas, e no existem clulas num boto!
Para atribuir cdigo ao boto, d um duplo clique nele enquanto estiver no modo
design (primeiro boto selecionado/destacado). Isto colocar voc no mdulo de cdigo
para a planilha, com o evento clique do boto pronto par editar. Por exemplo, se o nome
do boto for CommandButton1, voc ver o seguinte cdigo:

Private Sub CommandButton1_Click() End


Sub

Voc dever encaixar seu cdigo na sub-rotina acima, ou entrar com o nome da
sub-rotina num mdulo regular a ser rodado. A segunda a abordagem preferida.
Quando voc terminar de criar um boto, clique primeiro no boto na barra de
ferramentas para desligar o modo design. Isto lhe permite ao clicar no boto, fazer o seu
cdigo ser executado. Se voc precisar editar o boto no futuro, apenas mostre novamente
a barra de ferramentas de Controle e clique primeiro no boto que o colocar de volta ao
modo design.
Se voc precisar editar o cdigo de um boto no futuro, voc pode apenas ir
diretamente ao cdigo clicando o boto direito do mouse na guia da folha e selecionar
Exibir Cdigo.

USANDO OUTROS OBJETOS DA BARRA DE


FERRAMENTAS FORMULRIO

O que segue ilustra uma folha povoada com muitos objetos que podem ser
colocados numa planilha, ou grfico, usando a barra de ferramentas Formulrios:
Lies de VBA do Excel 357

A B C D E F G H I
4 Isto um Rtulo
5 Isto uma Caixa de Verificao

7 Boto de opo 4
Isto um Boto Boto de opo 5
8
9
10 Isto uma Caixa de grupo

11
12 Boto de opo 7

13 Boto de opo 8

14
15
16

17 Caixa de texto
18
19

Note que os botes de opo podem ser incluidos numa caixa de grupo ou
colocados na planilha do lado de fora de uma caixa de grupo. Voc ter de criar a caixa
de grupo primeiro.
Para selecionar um objeto que tenha sido inserido numa planilha da barra de
ferramentas Formulrios, mantenha apertada a tecla de controle e clique com o boto
esquerdo do mouse no objeto. Isto lhe permite ento editar seu texto e dimensionar o
tamanho e rodar a macro atribuida. Geralmente, voc no vai querer atribuir uma macro
aos objetos de dilogo como a caixa de listagem, pois isto faria a macro ser executada
no momento que voc clicar nela, provavelmente impediria voc de usar o objeto de
dilogo para a sua real funo.
Se voc clicar com o boto direito num objeto de uma folha e selecionar Formatar
controle, seu painel de controle mostrado. Voc pode tambm mostrar este painel
selecionando o objeto e da selecionando Formatar, Controle (CTRL+1) do menu
Microsoft Excel. O que segue ilustra o painel de controle para uma caixa de listagem
criada da barra de ferramentas Formulrios:
Lio #10 Usando Controles ActiveX nas planilhas e grficos 358

O range que voc especificar num range de entrada de caixa de listagem controla
o que est mostrado na caixa de listagem. O nmero da seleo retornado na clula
vinculada. Voc deve tambm ter notado que o controle da caixa de listagem acima tem
uma caixa de verificao Sombreamento 3D. Usando o valor que um dado objeto
retorna sua clula vinculada, voc pode ter a sua ao em quaisquer dos objetos de
dilogo refletida na sua pasta. Por exemplo, voc poderia usar um boto de rotao ou
uma barra de rolamento vinculada clula mudando o valor de uma clula chave na sua
folha de modo que voc possa ver o efeito de diferentes valores sem ter que digitar os
nmeros. E outras frmulas na sua planilha podem referir-se clula vinculada, afetando
assim seus valores. Um outro modo de se usar clulas vinculadas com a funo ndice
(index). A funo ndice seleciona um dado valor num range baseado na sua posio no
range. Por exemplo, digamos que voc tenha uma planilha contendo os dados seguintes:
A B C D E
1 Ano 2004 2005 2006 2007
2
3 Vendas 344 472 407 422
4 Carregamentos 563 745 601 655
5 Preo 0,61 0,63 0,68 0,64

Se voc usar a frmula =NDICE(B3:B5, nmero) numa clula, a frmula retornar


344 se o nmero for 1, retornar 563 se o nmero for 2, e retornar 0,61 se o nmero for
3. Se o nmero for realmente de uma clula de referncia, e o valor na clula referncia
for controlado por um controle do userform, tal como uma caixa de listagem, a ao
seleo no userform muda o resultado da frmula. Para ilustrar esta abordagem e como
Lies de VBA do Excel 359

ela pode ser usada para graficar diferentes dados, entre com os dados acima numa folha.
Da ento com as vrias linhas abaixo, construa o seguinte:

A B C D E
8 1
9 Ano 2004 2005 2006 2007
10 Vendas 344 472 407 422

onde as seguintes frmulas ou entradas so usadas:

Clula Entrada
A8 1
A9..E9 2004..2007 (ou frmulas referindo-se a A1..E9)
A10 = NDICE (A3:A5;$A$8)
B10 = NDICE (B3:B5;$A$8)
C10 = NDICE (C3:C5;$A$8) D10
= NDICE (D3:D5;$A$8)
E10 = NDICE (E3:E5;$A$8)

Note que quando voc mudar o valor da clula A8, que o rtulo da clula A10 e os
valores das clulas B10 at E10 mudam para refletirem os diferentes dados das vendas,
carregamentos e preo de tabela. O prximo passo construir um grfico destacando as
clulas A9 at E10. O grfico pode ser um grfico encaixado ou uma folha de grfico
nica. Quando voc fizer isto usando o assistente de grfico, certifiquese de especificar
que a primeira linha de dados para ser usada para a categoria de rtulo X. Caso contrrio,
voc obter os nmeros 1,2,.. como os rtulos de X em vez de anos. Tambm, certifique-
se de especificar a primeira coluna de dados como a legenda de texto. O que segue o
grfico resultante. Note que eu deletei a legenda para somente uma srie ser plotada.

V e nda s

50 0
40 0
30 0
V e n das
20 0
10 0
0
2004 2005 2006 2007

O ltimo passo inserir uma caixa de listagem na folha contendo o grfico


encaixado ou na folha de grfico se voc escolheu usar uma folha de grfico ao invs
disso. A caixa de listagem dever usar as clulas A3:A5 para o range de entrada (estes so
as vendas contendo as palavras Vendas, Carregamentos, Preos). E ela dever usar a
Lio #10 Usando Controles ActiveX nas planilhas e grficos 360

clula A8 como a clula vinculada. O que segue com o que caixa de listagem terminada
se parece:

Agora, quando voc selecionar um dos itens na caixa de listagem, o grfico


automaticamente atualizado, incluido seu rtulo de ttulo.

USANDO OUTROS CONTROLES ACTIVEX

Se voc quiser, voc pode usar os controles ActiveX que esto na Barra de
ferramentas Controle para criar controles na sua planilha ao invs de usar os objetos da
barra de ferramentas Formulrios. Somente objetos da barra de ferramentas Formulrios
podem ser colocados num grfico. Se voc fizer isto, voc dever quase sempre mudar a
propriedade de boto TakeFocusOnClick para False. O valor default True. Entretanto,
isto frequentemente causa problemas, como o cdigo frequentemente se referir s clulas
, e no existirem clulas no objeto controle!
Voc dever editar as propriedades controle enquanto estiver no modo design
(primeiro boto est apertado) selecionando o objeto e dai clicando no boto Properties.
Para editar o cdigo atrs do objeto, primeiro d um duplo clique no controle. Isto cria a
sub-rotina default do controle e coloca voc no mdulo de cdigo da planilha. Se voc
precisar editar o cdigo do controle no futuro, voc pode apenas ir diretamente ao cdigo
clicando com o boto direito do mouse na guia da folha e selecionando Exibir Cdigo. Os
exemplos de cdigos no captulo sobre userforms ilustram comocriar cdigo para os
diferentes objetos. Por favor note que voc no pode criar uma caixa refEdit na planilha
nem colocar qualquer controle ActiveX num grfico.
USANDO UMA MACRO PARA MUITOS BOTES
Se voc colocar uma poro de botes de comando numa folha (usando o boto
barra de ferramentas formulrios), voc deve querer fazer o seguinte:

Atribuir a mesma macro a todos os botes de comando


Application.Caller para determinar quais botes foram selecionados.

Isto tem a vantagem que somente uma macro precisa ser mantida em vez de muitas.
Tambm, as macros chamadas por esta macro podem ser do tipo Private, assim no
aparece na lista Ferramentas, Macro.

Para ilustrar esta abordagem, crie a seguinte macro:

Sub ExemploDeBoto()
Dim NomeDoBoto As String
NomeDoBoto = Application.Caller
MsgBox "Boto " & NomeDoBoto & " selecionado."
End Sub
Lies de VBA do Excel 361

Da adicione um nmero de botes de comando numa folha, e atribua a todos eles


a macroa cima. Quando voc clicar num boto, a macro acima mostra o nome do boto.
Por favor note que o nome no o texto que aparece na face do boto, mas o nome que
aparece na Caixa Name quando o boto for selecionado (mantendo a tecla shift apertada
quando voc clicar nele). Voc pode mudar o nome do boto editando o nome na Caixa
Name. Tambm, voc pode determinar que boto est selecionado usando testes If ou a
declarao Select Case e rodar as macros baseadas nestes testes.

ATRIBUINDO MACROS A OUTROS OBJETOS NUMA FOLHA

Acima foi ilustrado a insero de um boto numa planilha ou num grfico e


atribuir uma macro ao boto. possvel atribuir uma macro a qualquer objeto que se
colocar numa planilha ou folha de grfico. Por exemplo se voc colar uma figura numa
folha, voc pode atribuir uma macro a executar quando a figura for clicada.
Para atribuir uma macro a um objeto, primeiro clique com o boto direito do mouse
no. O seguinte menu ento aparecer:

Selecionando Atribuir macro... permite-lhe especificar a macro a atribuir ao


objeto.

SUMRIO

Adicionar objetos s suas folhas Excel, especialmente botes de comando que


ligam macros ou barras de rolamento que mudam valores das clulas, adiciona um poder
tremendo. Por exemplo, se voc solicitado a criar uma planilha que modele preo e
volume e seu impacto nos rendimentos, pense na reao que voc obteria se adicionasse
um grfico com barras de rolamento que automaticamente mudam o preo e o volume vs
oferecer apenas uma planilha cheia de equaes!
362
Fase #3: VBA do Excel Avanado

Lio 11: Trabalhando com Barras de Ferramentas

possvel com o Microsoft Excel modificar as barras de ferramentas de modo que as

ferramentas que voc precisar so aquelas que esto nas suas barras de ferramentas.
No somente se pode atribuir qualquer um dos muitos botes ferramenta s suas
barras de ferramentas, voc pode tambm atribuir macros aos seus botes que podem
ser adicionados a uma barra de ferramenta existente ou a uma nova barra de ferramenta.
E, voc pode ter macros para criar barras de ferramentas e botes quando uma pasta for
aberta e remov-los quando ela for fechada.

Esta lio compartilha voc com tcnicas e macros para executar as adaptaes
acima.

PERSONALIZANDO BARRAS DE FERRAMENTAS

Para personalizar suas barras de ferramentas, escolha Exibir, Barras de ferramentas,


Personalizar do menu Microsoft Excel. Dai ento selecione a guia Comandos:

Nas muitas categorias que esto disponveis nestas caixas, existem mais de 200
botes diferentes disponveis. Para ver o que um boto faz, apenas clique no boto para
ver uma descrio daquele boto. A descrio do boto aparecer no fundo do dilogo.

Para adicionar um boto a uma barra de ferramenta, clique no boto e, enquanto mantiver
clicado pressione o boto esquerdo do mouse para baixo, arraste o boto localizao
Lies de VBA do Excel 363

desejada na barra de ferramenta e libere o boto do mouse. Se voc quiser mover um


boto para uma localizao diferente, clique e arraste-o. Para remover um boto da barra
de ferramenta, clique no boto e arraste-o para fora da barra de ferramenta e libere-o. Ele
desaparecer. Se voc quiser adicion-lo de volta, apenas encontre-o entre os botes
disponveis na caixa acima eadicione-o de volta.

Para atribuir um boto sua prpria barra de ferramenta, voc deve primeiro
selecionar a primeira ala ("Barras de ferramentas") e clicar no boto "Nova..." para criar
uma nova barra de ferramenta. Isto mostrar o dilogo seguinte que lhe permite criar uma
nova barra de ferramenta, e atribuir a ela ao mesmo tempo um nome:

Isto cria uma barra de ferramenta vazia. Voc pode ento adicionar botes a ela. Para
ocultar uma barra de ferramenta, voc pode fazer qualquer uma das coisas seguintes:

Se a barra de ferramenta uma barra de ferramenta flutuante, clique no pequeno boto


no canto esquerdo superior da barra de ferramenta.
Se a barra de ferramenta est ancorada s outras barras de ferramentas suas, arraste-a
para fora que a tornar uma barra de ferramenta flutuante. Da ento faa a ao acima.
Se voc souber o nome da barra de ferramenta, selecionar Exibir, Barras de ferramentas
e de-selecionar a caixa de verificao barra de ferramenta.

As Barras de ferramentas que voc criar podem ser deletadas. Para deletar uma
barra de ferramenta, selecionar Exibir, Barras de ferramentas, Personalizar. Selecione a
primeira ala, rotulada de "barras de ferramentas". Clique sobre a barra de ferramenta que
voc quiser deletar e da ento sobre o boto delete.

As barras de ferramentas que vem com o Microsoft Excel no podem ser deletadas.
Entretanto, elas podem ser reconfiguradas ao seu projeto original selecionando Exibir,
Barras de ferramentas, Personalizar e clicando no boto reset depois de voc ter
selecionado a barra de ferramenta.

Em muitas das barras de ferramentas, os botes esto muito prximos uns dos
outros, o que torna o seu uso de certa forma difcil. O que segue ilustra isto:

Entretanto, possvel separar os botes clicando e arrastando cada boto direita um


pouco. O que segue ilustra o espaamento melhorado que resulta:
Lio #11 Trabalhando com Barras de Ferramentas 364

ATRIBUINDO MACROS AOS BOTES DA BARRA DE FERRAMENTA

Para atribuir macros a um boto, selecionar Exibir, Barras de ferramentas,


Personalizar e selecionar a ala Comandos. Role para baixo a seleo Categorias at
voc chegar aquela uma chamada "Macros". Selecionando-a, o seguinte lhe ser
mostrado:

Selecione e arraste o item da lista Comandos entitulado "Personalizar Boto" barra de


ferramenta de sua escolha.
Para atribuir uma macro a este boto, ou mudar a sua face, basta clicar com o boto direito
do mouse no boto ou selecionar o boto e da ento usar o boto "Modificar seleo" no
dilogo acima. Ambos faro o seguinte pop-up aparecer:
Lies de VBA do Excel 365

Para atribuir uma macro ao boto, selecionar o item de menu "Atribuir Macro". Para mudar
a face do boto, ou use o item de menu "Editar imagem de boto" ou o item "Alterar
imagem de boto". Este segundo item mostrar a seguinte lista de seleo das faces.

Selecione a face que voc quer usar e da ento saia do painel. Com esta informao, o
Excel no gravar a face que voc usou se voc estiver gravando uma macro para criar
uma barra de ferramentas.

RESOLVENDO O PROBLEMA MACRO CANNOT BE FIND

Se voc atribuiu uma macro a um boto, clicando no boto automaticamente abrir


o arquivo macro se o arquivo no estiver aberto. Se voc renomeou a macro ou moveu ou
renomeou o arquivo, voc obter uma mensagem como a seguinte quando voc clicar no
boto:
Lio #11 Trabalhando com Barras de Ferramentas 366

Para resolver este problema, voc ter de atribuir novamente a macro ao boto. Par fazer
isto, selecionar Exibir, Barras de ferramentas, Personalizar. Depois clicar no boto.
Neste momento voc pode selecionar Ferramentas, Atribuir Macro e escolher uma macro
para o boto se o arquivo contendo a macro estiver aberto. Voc pode also clicar com o
boto direito do mouse no boto e selecionar Atribuir Macro do menu de atalho que
aparece.

EDITANDO BARRA DE FERRAMENTA IMAGENS DE BOTO

Muito freqentemente, a imagem dos botes personalizados no representam a


macro que voc atribuiu ao boto. possvel editar a imagem do boto para dar a ele a
aparncia que voc quiser.

Para editar um a imagem de boto, selecionar Exibir, Barras de ferramentas, Personalizar


se a caixa de dilogo personalizar no estiver visvel. Da ento clicar com o boto direito
do mouse no boto. Isto far o seguinte menu popup aparecer:

Para mudar a dica da ferramenta associada com o boto, mude o nome do boto.
Lies de VBA do Excel 367

Para editar o boto, selecione Editar imagem de boto. Isto far o seguinte editor de
boto aparecer. Por favor note que a imagem que aparecer ser aquela do seu boto.

Para usar este editor, voc seleciona a cor que voc gostar e da ento clique nas pequenas
caixas na rea da figura para mudar a imagem. Os botes Move permitem voc posicionar
a imagem no boto.

TRABALHANDO COM BARRAS DE FERRAMENTAS

Barras de ferramentas so membros da coleo CommandBars:

CommandBars(nmero)

ou CommandBars("nome da barra de ferramenta ")

A coleo commandbars inclui no somente a coleo barras de ferramentas, mas tambm


a coleo menus.
Por exemplo, as declaraes seguintes escrevero uma lista de todos objetos na coleo
commandbars junto com seu nmero ndice:

For i = 1 To Commandbars.Count
Cells(i, 1) = i
Cells(i, 2) = Commandbars(i).Name Next

Se voc quiser deletar uma barra de ferramenta que voc criou, ento voc apenas
se refira a ela e use o mtodo Delete. Por exemplo:

CommandBars(33).Delete
Lio #11 Trabalhando com Barras de Ferramentas 368

ou CommandBars("Custom 20")
.Delete

No possvel deletar as barras de ferramentas que vem com o Microsoft Excel.


Se voc quiser ocultar uma barra de ferramenta, ento voc pode configurar a
propriedade Visible da barra de ferramenta para False. Para mostrar novamente, voc
configuraria a propriedade Visible para True. Por exemplo:

CommandBars("Special Task").Visible = True

Para adicionar uma barra de ferramenta, voc usa o mtodo Adicionar que tem um
argumento Name. Por exemplo:

CommandBars.Add Name:="Minha Nova Barra"


CommandBars("Minha Nova Barra").Visible = True

A barra de ferramenta aparecer no to afastada do canto esquerdo superior da tela. Isto


no to notvel. Voc pode superar isto adicionando o seguinte a sua macro:

With CommandBars("Gerenciador de dados)


.Left = 200
.Top = 200
End With

Voc pode tambm simplificar isto acima numa declarao:

CommandBars.Add (Name:="Data Manager") .Visible


= True

Se voc precisar mudar o nome numa barra de ferramentas personalizada, voc pode fazer
isto com a propriedade Name:

CommandBars("Barra de Ferramentas 33").Name = "Financial Info"

Para determinar o nmero de barras de ferramentas que existem, voc pode usar a
propriedade Count:

MsgBox "Voc tem " & CommandBars.Count &


" comandbars."

TRABALHANDO COM BOTES DA BARRA DE FERRAMENTAS

Os botes na barra de ferramenta pertencem coleo CommandBarControls. Para


trabalhar com um dado boto, voc deve especificar a commandbar e o nmero do
controle (boto):
Lies de VBA do Excel 369

CommandBars(nmero ou "nome").Controls( nmero)

Para adicionar um boto a uma barra de ferramenta, voc usar o mtodo Add e especificar
o boto a usar. Por exemplo:

CommandBars("Barra de Ferramentas 1").Controls.Add _


Type:=msoControlButton, Id:=23

Note que voc especificou um argumento Type e configurou-o igual ao valor. Isto
porque o Excel inclui menu e item de menus como parte de uma commandbar. Assim o
argumento Type permite-lhe especificar o que est sendo adicionado. Tambm, em vez
de se usar um argumento chamado Boto, voc usa um chamado Id para identificar o
boto. Como informao, se voc no especificar um Type ou um Id , ento um boto
vazio adicionado.

Os exemplos acima adicionaram botes que j esto associados com comandos


embutidos do Excel. Neste caso ambas declaraes adicionar o boto que mostra o painel
abrir arquivo, embora o boto e nmeros Id sejam diferentes. A melhor maneira par obter
os nmeros para um boto embutido gravar uma macro que adiciona um boto a uma
barra de ferramenta. A prxima seo cobre como criar suas prprias barras de
ferramentas personalizadas com botes personalizados atribuidos s suas macros
personalizadas.

Existem tambm outras coisas que voc pode especificar quando voc adicionar um
boto. Por exemplo, voc pode especificar sua posio na barra de ferramenta com o
argumento Before.

A propriedade Name de um boto tambm a ToolTip que aparece quando voc manter o
ponteiro do mouse sobre um boto. Voc pode mud-lo para qualquer texto que voc
queira. Por exemplo:

Barras de ferramentas("Barra de Ferramentas


25").ToolbarBotes(1) .Name
= _

"Print Reports"

O intervalo que voc colocar entre os botes realmente considerado um boto e


identificado como boto zero! O que segue ilustra como adicionar um boto (a face
smiley) e da um espao de boto na frente deste boto (esta declarao assume que exista
j um boto na barra de ferramenta, que voc no colocar um intervalo na frente do
primeiro boto):

CommandBars("New ToolBar").Controls.Add _
Lio #11 Trabalhando com Barras de Ferramentas 370

Type:=msoControlButton, _
Id:=2950, Before:=1, BeginGroup:=True

a propriedade BeginGroup adiciona a distncia entre os botes.

Para maiores informaes sobre a commandbars, mostrar o Pesquisador de objetos,


selecionar "<Todas Bibliotecas">" na caixa seleo, e role para baixo at commandbars
no painel classes. Voc pode ento selecionar uma das listagens e selecionar a
propriedade ou mtodo e mostrar a ajuda clicando no boto question mark.

USANDO UMA MACRO PARA CRIAR UMA BARRA DE FERRAMENTA

De tempo em tempo, voc deve precisar de uma barra de ferramenta especializada


e boto par uma tarefa particular. Por exemplo, voc deve ter de fazer um trabalho
particular uma vez por ms e mais fcil fazer se a barra de ferramenta est configurada
com botes atribuidos s macros que voc usar. Voc poderia criar esta barra de
ferramenta manualmente cada ms. Entretanto, uma macro pode criar barras de
ferramentas com uma dica descritiva para cada boto.

O que segue macro ilustra o cdigo necessrio par criar uma barra de ferramenta com dois
botes nela, com dicas de ferramentas descritivas.

Sub SpecialToolBar()
Dim tBar, newButton
'Deletar CommandBar se ela existir
On Error Resume Next
CommandBars(" Tarefa Especial ").Delete
On Error GoTo 0
'criar CommandBar
CommandBars.Add Name:=" Tarefa Especial "
'definir uma varivel objeto para se referir CommandBar
Set tBar = CommandBars("Tarefa Especial")
'adicionar primeiro boto
Set newButton = tBar
.Controls.Add(Id:=2950)
'especificar dica de ferramenta (nome), macro para rodar, e
texto da barra de status para a macro
With newButton
.OnAction = "AddInfo"
.Caption = "Adicionar Info"
End With
'adicionar o prximo boto. Note que o uso da propriedade
FaceId
Set newButton = tBar.Controls.Add
With newButton
.Caption = "Remover Informao"
.OnAction = "RemoveInfo"
Lies de VBA do Excel 371

.FaceId = 278
.BeginGroup = True
End With
'mostrar CommandBar, posio na planilha
tBar.Visible = True
With CommandBars("Tarefa Especial")
.Left = 200
.Top = 200
End With End
Sub

Pontos chaves na macro acima:

Nenhum qualificador especial necessrio para adicionar um boto; apenas usando


.Controls.Add adiciona um boto vazio. Isto usa o Type default de msoControlButton.
Outros tipos adicionariam item de menus ou menus.

A propriedade FaceId usada para configurar o boto face

Um espao adicionado entre os dois botes configurando a segunda propriedade


BeginGroup do boto para True.

Se voc quiser que a macro acima seja rodada quando a pasta for aberta, ento
apenas chame-a de uma macro Auto_Open. Por exemplo:

Sub Auto_Open()
SpecialToolBar
End Sub

Far a macro SpecialToolBar rodar quando o arquivo for aberto. Uma macro Auto_Open
aquela que rodada automaticamente quando uma pasta for aberta.

USANDO SUAS PRPRIAS IMAGENS DE BOTO

A macro acima lhe permite usar quaisquer imagens de boto do Microsoft Excel
para a face do seu boto de macro. Entretanto, voc pode querer usar um boto face que
voc criou em vez disso. Para fazer isto, voc primeiro precisa fazer o seguinte:

V Caixa de Dilogo Personalizar - Selecione Exibir, Barras de ferramentas,


Personalizar
Crie um boto contendo a face de boto que voc quiser.
Com o boto selecionado, clicar com o boto direito do mouse no boto e selecionar
a Face Copy Boto
Lio #11 Trabalhando com Barras de Ferramentas 372

Sair do dilogo personalizar e ir planilha onde voc pode armazenar o boto face.
A folha que eu uso eu chamo de "Boto Faces", e parte da minha pasta
PERSONAL.XLS.
Nesta folha, apenas faa uma Editar, Colar normal. O boto face ser colado na
planilha como um objeto figura. Ele ser muito pequeno, o que OK.
Quando voc selecionar o boto face, voc ver o nome que o Microsoft Excel deu
a este objeto figura na caixa Nome. Por exemplo, ele pode ser chamado "Figura 1".
Clique na caixa nome (adjacente caixa de edio de frmula) e renomeie a figura
digitando um novo nome e pressionando enter. O nome pode conter espaos. Para
ajud-lo no futuro, entre com este nome numa clula adjacente ao boto face.

Neste ponto, voc pode usar agora o boto face que voc armazenou na planilha
acima e ter uma macro para colar no seu prprio boto. O que segue macro ilustra criando
a nova barra de ferramenta com um boto face chamado "Graph Face" localizado na folha
"Boto Faces" na PERSONAL.XLS:

Sub CreateGraphButton()
Dim tBar, newButton
'remover CommandBar se ela existir e criar uma CommandBar
vazia
'com o mesmo nome
On Error Resume Next
CommandBars("Barra de Grfico").Delete
CommandBars.Add Name:=" Barra de Grfico "
'configurar uma varivel para se referir CommandBar
Set tBar = CommandBars("Barra de Grfico")
'adicionar um boto vazio CommandBar
Set newButton = tBar.Controls.Add
'especificar uma tooltip e macro para rodar
With newButton
.Caption = "Grfico dos dados sobre as vendas"
.OnAction = "PERSONAL.XLS!graphdata"
End With
'selecionar a face a ser usada, copi-la, e da colar no
boto
Workbooks("Personal.Xls").Worksheets("
Boto Faces") _
.DrawingObjects("Graph Face").Copy
newButton.PasteFace 'torne a CommandBar visvel
With tBar
.Visible = True
.Left = 200
.Top = 200
End With
End Sub

CRIANDO BOTES COM TEXTO NA BARRA DE FERRAMENTAS


Lies de VBA do Excel 373

Os exemplos at agora ilustraram como criar botes de barras de ferramentas que


tenham uma face do tipo figura. Entretanto, voc pode tambm criar um boto que tenha
texto em vez de uma figura. O texto que aparece idntico tooltip do boto. O que segue
ilustra a criao de um simples boto commandbar com um text boto.

Sub TextButtonExample()
Dim newBar, newbutton
On Error Resume Next
CommandBars("barra exemplo ").Delete
On Error GoTo 0
Set newBar = CommandBars.Add(Name:="
Barra Exemplo ")
Set newbutton = newBar.Controls _
.Add(Type:=msoControlButton, Id:=2949)
With newbutton
.Style = msoButtonCaption
.Caption = "Isto um Texto de Boto"
.OnAction = "Al"
End With
newBar.Visible = True End
Sub

Sub Al()
MsgBox "Al Mundo"
End Sub

A chave para criar um boto na barra de ferramentas com uma face de texto
configurar a propriedade Style para msoButtonCaption. Voc pode tambm configurar a
propriedade Style para msoButtonIconAndCaption que mostra ambos um cone e um texto
descrio.

CRIANDO BARRAS DE FERRAMENTAS POP-UP

Uma outra caracterstica que voc pode criar so commandbars pop-up. Tais
commandbars so mostradas por um comando numa macro. O benefcio das
commandbars pop-up que elas tm o foco. Isto , o usurio deve escolher nas selees
pop-up e no pode fazer outras aes. Neste sentido, elas so como dilogos, mas so
muito mais fceis de serem construidas e podem ser to complexas quanto for necessrio.
O que segue ilustra como criar e mostrar uma commandbar pop-up que se parece com o
seguinte:

Sub POPUP_EXAMPLE()
Dim popUpBar As CommandBar
Lio #11 Trabalhando com Barras de Ferramentas 374

Dim newButton As CommandBarControl


On Error Resume Next
CommandBars("Barra Pop UP").Delete
On Error GoTo 0
Set popUpBar = CommandBars _
.Add(Name:=" Barra Pop UP", Position:=msoBarPopup)
Set newButton = popUpBar.Controls _
.Add(Type:=msoControlButton, Id:=1)
With newButton
.FaceId = 67
.OnAction = "Macro1_To_Run"
.Caption = "Esvaziar a Lixeira"
End With
Set newButton = popUpBar.Controls _
.Add(Type:=msoControlButton, Id:=1)
With newButton
.FaceId = 69
.OnAction = "Macro2_To_Run"
.Caption = "Assistir a TV"
End With popUpBar.ShowPopup
End Sub

Sub Macro1_to_Run()
MsgBox "Esvaziar a lixeira!"
End Sub

Sub Macro2_to_Run()
MsgBox "vez da TV!"
End Sub

O mtodo ShowPopup faz o popup ser mostrado. As macros OnAction associadas com
os controles na barra determinam qual ao tomar quando um boto clicado. O popup
automaticamente desaparecer quando um comando selecionado. Tambm, o popup
pode ser to elaborado quanto voc queira - voc pode adicionar menus, sub menus, e
muitas outras caracteresticas de a um commandbar popup.

BOTO FACE ID'S

A macro que segue cria uma barra de ferramenta gigante com os primeiros 250 FaceID's
que se pode encontrar noExcel. Se voc quiser mais, ento voc pode rodar esta macro e
mostrar cerca de 1000 faces diferentes! Se voc fizer, voc poder querer modificar um
pouco a macro par criar barras de ferramentas mltiplas. Como informao, gravando uma
macro mudar a face de um boto no grava a face usada! Assim esta macro pode ser de
uso para voc!

Sub DisplayFaces()
Dim tBar As Object, newButton As Object
Lies de VBA do Excel 375

Dim Y As Integer Dim


startNum As Integer
startNum = Val(InputBox("Entrar com o nmero para o primeiro"
& _
" boto: nmero (1, 251, 501, etc.)"))
If startNum = 0 Then Exit Sub
'liga o modo de erro daquela macro e continua se a barra de
ferramenta no existir se deletada
'deixa ligado o modo erro e reiniciar tambm necessrio
para evitar colises com algum boto
'nmeros so pulados pelo Microsoft Excel
On Error Resume Next
CommandBars("Todos os Botes!!!").Delete
'cria a barra de ferramenta
CommandBars.Add Name:="Todos os Botes!!!"
Set tBar = CommandBars("Todos os Botes
!!!")
'Microsoft Excel tem cerca de 1000 faces.
For Y = startNum To startNum + 249
Application.StatusBar = "criando face " & Y
Set newButton = tBar.Controls.Add
With newButton
.Caption = "FaceId = " & Y
.FaceId = Y
End With
Next Y
Application.StatusBar = False
'mostra a barra de ferramenta e a torna wider
tBar.Visible = True tBar.Width = 504
'limpa a mensagem da barra de status
Application.StatusBar = False End
Sub

UMA MACRO PARA ADICIONAR UM BOTO

Embora voc possa escrever uma macro que cria uma barra de ferramenta
personalizada e boto a cada vez que voc precisar de um, a macro seguinte adicionar
um boto a qualquer barra de ferramenta e tambm adicionar uma tooltip ao boto. Se
voc entrar com o nome de uma nova barra de ferramenta esta macro criar uma nova
barra de ferramenta. Ela usa o userform seguinte:
Lio #11 Trabalhando com Barras de Ferramentas 376

O nome na lista drop down DropDown1. As duas caixas de texto so TextBox1 e


TextBox2. Os botes command foram configurados, e o seguinte cdigo coloca o
userform no mdulo cdigo (facilmente atingida dando um duplo clique sobre um
boto:

Private Sub CommandButton1_Click()


'Boto OK
Me.Hide bResponse
= True
End Sub

Private Sub CommandButton2_Click()


'Boto Cancelar
Me.Hide bResponse
= False
End Sub

A primeira caixa uma combinao das caixas lista edit-dropdown. Quando voc criar o
userform, assegure-se de configurar a ala ordem para ser pela ordem das caixas.

Para usar, voc precisa preencher todas as trs caixas. Use a barra de ferramenta Todos
os Botes!!! Para obter o nmero do boto que voc quer usar. Qualquer boto pode ser
usado. Aps um novo boto ter sido adicionado, voc pode atribuir uma macro a ele
apenas clicando sobre ele e selecionando uma macro do dilogo pop-up que aparece.

O que segue o cdigo da macro:

Global bResponse As Boolean

Sub ButtonAdder()
Dim item As Object
Dim I As Integer
Dim cBar As CommandBar
Dim bOK As Boolean
Lies de VBA do Excel 377

Dim barName As String


Dim barExists As Boolean
Dim sToolTip As String
Dim FaceIdNum As Integer
Dim newButton As Object
'multiplique a lista drop down
For Each cBar In CommandBars
'commandbars do tipo 0 so barras de boto
If cBar.Type = 0 Then
I = I + 1
UserForm1.ComboBox1.AddItem cBar
.Name
End If
Next cBar
'configure o nmero do boto face happy como o default
UserForm1.TextBox1.Text = 59
Do
'Mostrar o userform
UserForm1.Show
If bResponse = False Then
'se o boto cancel for clicado, descarregue e saia
Unload UserForm1
Exit Sub
End If
'Confirmar todas as informaes que foram preenchidas
nele:
With UserForm1
If .ComboBox1.Text = "" Or _
.TextBox1.Text = "" Or _
.TextBox2.Text = "" Then
MsgBox _
"Todas as caixas no dilogos devem estar
preenchidas" Else
bOK = True
End If
End With
'isto far um lao todas caixas serem preenchidas
Loop Until bOK
'obtenha os valores do userform
barName = UserForm1.ComboBox1.Text
sToolTip = UserForm1.TextBox2.Text
FaceIdNum = Val(UserForm1.TextBox1.Text)
'descarregue o form quando o info tiver sido armazenado
Unload UserForm1
'Determine se a barra de ferramenta existe e se no, cri-la
barExists = False
For Each cBar In CommandBars
If UCase(cBar.Name) = UCase(barName) Then _
barExists = True
Next
Lio #11 Trabalhando com Barras de Ferramentas 378

If Not barExists Then


CommandBars.Add barName
End If
'criar uma varivel para se referir barra de ferramenta
Set cBar = CommandBars(barName)
'adicionar o boto barra de ferramenta e obter seu nmero
Set newButton = cBar.Controls.Add
'atribuir o boto face ao novo boto
On Error GoTo BadButtonNumber
newButton.FaceId = FaceIdNum
On Error GoTo 0
'atribuir tooltip e macro ao boto
newButton.Caption = sToolTip
'adicionar um espao entre o novo boto e os botes
'existentes
newButton.BeginGroup = True
'tornar a barra de ferramenta visvel
cBar.Visible = True
MsgBox "Para atribuir uma macro ao boto, selecionar " &
"Exibir, Personalizar e clicar com o boto direito do mouse no
boto." Exit Sub
'Isto manipula um mal nmero de boto BadButtonNumber:
MsgBox "O nmero do boto que voc especificou " & _
"no existe. Atividade paralizada." End
Sub

ATRIBUINDO UMA BARRA DE FERRAMENTA A UMA PASTA

Se voc for a uma pasta e selecionar Exibir, Barras de ferramentas, Personalizar ,


e clicando no boto "Atribuir...". O painel que segue aparece.

Barras de ferramentas que voc criou esto listadas na caixa esquerda. Se voc
selecionar uma barra de ferramenta, voc pode copi-la para a pasta. Isto lhe permite
distribuir uma pasta com uma barra de ferramenta personalizada sem ter que re-criar uma
macro para a barra de ferramenta. Voc pode querer incluir uma macro Auto_Open na
pasta de modo que a barra de ferramenta seja mostrada quando o arquivo for aberto. Uma
Lies de VBA do Excel 379

macro Auto_Open aquela que roda automaticamente quando uma pasta manualmente
aberta.

Um dos problemas com esta abordagem que as barras de ferramentas com o mesmo nome
tm precedncia sobre as barras de ferramentas atribuidas a uma pasta. Isto significa que
as barras de ferramentas antigas aparecero em vez daquelas barras de ferramentas novas
se a pasta for movida. Assim a melhor abordagem ter suas pastas criando suas barras de
ferramentas e evitar o uso desta caracterstica.

OCULTANDO E RESTAURANDO AS BARRAS DE FERRAMENTAS

Voc pode algum dia querer desenvolver uma aplicao onde voc oculta todas as
barras de ferramentas do usurio, junto com objetos como os menus, a caixa de edio, e
as barras de rolamento. Ocultar as barras de ferramentas relativamente fcil. Entretanto,
quando sua aplicao feita, voc precisar restaurar as barras de ferramentas de volta de
modo que o usurio as tenha outra vez. Isto no to simples quanto parece, desde que
voc precisa saber quais barras de ferramentas sero mostradas, e a ordem que voc
mostrar essas barras de ferramentas afetam a sua localizao. O que exigido que voc
armazene informao nas barras de ferramentas, e da ento quando mostr-las novamente,
voc comea no topo esquerdo da barra de ferramenta. Deste modo, as barras de
ferramentas terminaro exatamente onde elas estavam antes de sua aplicao rodar.
Ocultar e restaurar as barras de ferramentas e menus muito fcil. O que segue
oculta os menus, barras de ferramentas e a barra de edio de frmula e da ento restaur-
las:

Sub MainHideShow
HideCommandbars
MsgBox "Pressione OK para restaurar as barras"
ShowCommandbars
End Sub

Sub HideCommandbars()
Dim cBar As CommandBar
For Each cBar In CommandBars
cBar.Enabled = False
Next
Application.DisplayFormulaBar = False
End Sub

Sub ShowCommandbars()
Dim cBar As CommandBar For
Each cBar In CommandBars
cBar.Enabled = True
Next
Application.DisplayFormulaBar = True
End Sub
Lio #11 Trabalhando com Barras de Ferramentas 380

SUMRIO

Os botes que esto nas suas barras de ferramentas so aqueles da maioria das ferramentas
mais importantes que voc tem no Excel. Eles salvaro voc, toda vez que voc os usar.
Por esta razo, voc dever personalizar suas barras de ferramentas e colocar nelas as
ferramentas que voc mais gosta de usar, e remover aquelas que voc no gosta de usar.
381
Fase #3: VBA do Excel Avanado

EXEMPLOS DE BARRAS DE FERRAMENTAS


Usando Barras de Ferramentas Anexadas

No Excel voc pode criar sua prpria barra de ferramentas selecionando Exibir, Barra de
ferramentas, e usar a opo Nova barra de ferramentas disponvel no dilogo que
aparece. E, voc pode atribuir botes barra de ferramentas selecionando a opo
Personalizar. Se voc escolher uma macro categoria de botes, voc pode atribuir sua
prprias macros aos botes na barra de ferramentas.

Uma tal barra de ferramentas personalizada tipicamente til somente para uma pasta
particular. Voc pode anexar a barra de ferramentas a uma pasta fazendo o seguinte:

Escolher Exibir, Barra de ferramentas, Personalizar


Clique no boto Anexar e selecione a barra de ferramentas personalizada e copie a barra
de ferramentas personalizada para a pasta

Se voc modificar uma barra de ferramentas anexada, voc precisa repetir os passos acima
para anexar a nova verso. Caso contrrio, as modificaes sero perdidas.

H vrios problemas com barras de ferramentas anexadas:

A barra de ferramentas no desaparece quando voc fechar a pasta


A barra de ferramentas no aparece quando voc abrir a barra de ferramentas
Se voc distribuir a pasta aos outros, mudar a barra de ferramentas, e a re-distribuir, os
usurios podem no ver a nova barra de ferramentas.

Para resolver estes problemas, use macros como a seguinte, assumindo que sua barra de
ferramentas seja chamada "MinhaBarradeFerramentas", e que ela tenha dois botes nela:

Sub Auto_Open()
SetUpButtons End
Sub

Sub SetUpButtons()
With CommandBars("MinhaBarradeFerramentas ")
.Visible = True
.Controls(1).OnAction = "PrimeiraMacro"
.Controls(2).OnAction = "SegundaMacro"
End With
End Sub
382

Sub Auto_Close()
On Error Resume Next
CommandBars("MinhaBarradeFerramentas ").Delete
End Sub

Recompondo As Macros Numa Barra de Ferramentas Personalizada

O Excel permite-lhe criar uma barra de ferramentas personalizada e anex-la a uma pasta.
Entretanto, se voc der esta pasta a algum, os botes da barra de ferramentas se referiro
de novo ao path da pasta original. O resultado uma caixa asquerosa de erro dizendo
que uma macro no pde ser encontrada. A propriedade botes' OnAction apontar ainda
para o local original da pasta, quando as macros forem feitas. O cdigo seguinte ilustra
um modo elegante para resolver isto, e ainda funciona com qualquer barra de ferramentas
personalizada.

Sub Fix_Toolbar
'o nome da macro acima seria incluido na sua macro
Auto_Open
'de modo que ela execute cada vez que a pasta for aberta.
Dim tToolbar As String
Dim i As Integer
'coloque o nome da sua barra de ferramentas no lugar do
Nome da barra de ferramentas
tToolbar = "Nome da barra de ferramentas"
'rode por cada um dos botes na barra de ferramentas
For i = 1 To CommandBars(tToolbar).Controls.Count
'obtenha a OnAction atual, que inclui o path
nName = CommandBars(tToolbar).Controls(i).OnAction
're-atribuir o nome da macro excluindo o path
CommandBars(tToolbar).Controls(i).OnAction = _
Right(nName, Len(nName) - InStr(nName, "!"))
Next i
End Sub

Se voc fizer as correes a uma barra de ferramentas anexada, voc ter de anex-la
novamente, ou as correes no sero salvas

Usando Uma Macro Para Criar Uma Barra De Ferramentas

A macro seguinte ilustra os cdigos necessrios para se criar uma barra de ferramentas
com vrios botes nela, com dicas de ferramentas descritivas. A face na barra de
ferramentas est configurada pela propriedade FaceID. A macro aps isto lhe mostra
como encontrar as Ids para mais de 2000 faces de boto.

Sub CreateAToolbar()
Const tBarName As String = "Nome da Barra de Ferramentas"
'Deletar CommandBar se ela existir
Lies de VBA do Excel 383

On Error Resume Next


CommandBars(tBarName).Delete
On Error GoTo 0
'criar CommandBar
CommandBars.Add Name:=tBarName
Lio #11 Trabalhando com Barras de Ferramentas

'definir uma varivel objeto para se referir a CommandBar


With CommandBars(tBarName)
'adicionar o boto use 1 para especificar uma face
personalizada vazia With .Controls.Add(ID:=1)
.OnAction = "AddInfo"
'this adds the smiley FaceID
.FaceID = 59
.Caption = " Adicionar as Informaes do
Relatrio"
End With
'adicionar o prximo boto com uma barra separadora
With .Controls.Add(ID:=1)
.OnAction = "RemoveInfo"
'isto adiciona a borracha FaceID
.FaceID = 47
.Caption = "Remover as Informaes do Relatrio"
'isto adiciona a barra separadora
.BeginGroup = True
End With
'mostrar a barra de ferramentas
.Visible = True
End With
End Sub

Usando FaceIDs para especificar um ButtonFace da Barra de


Ferramentas

A propriedade FaceID de um controle especifica o boto face ou imagem. Por exemplo:

CommandBars("Minha barra de ferramentas).Controls(1).FaceID = 80

Coloca um boto face com a letra "A" no controle.

A macro seguinte cria uma pasta que lista todos os botes FaceIDs disponveis:

Sub DisplayControlFaces()
Const tBarName As String = "Temp barra de ferramentas"
'adiciona uma nova Pasta para as faces
Workbooks.Add
384

'Deleta a CommandBar se ela existir


On Error Resume Next
CommandBars(tBarName).Delete
'cria a CommandBar
CommandBars.Add Name:=tBarName
'define uma varivel objeto para se referir a CommandBar
With CommandBars(tBarName)
'use uma armadilha de erro para manejar as FaceIDs
perdidas no cdigo abaixo On Error GoTo eTrap
'especificar uma ID de um para uma face de boto
personalizada vazia
With .Controls.Add(ID:=1)
'muda a imagem do boto atravs de todos aqueles que
estiverem disponveis
For i = 1 To 5500
.FaceID = i
'copia a face e cola na planilha
.CopyFace
ActiveSheet.Paste
'grava a face ID
With ActiveCell.Offset(1, 0)

.Value = i
.HorizontalAlignment = xlLeft
End With
'aumenta o contador e seleciona a prxima
clula destino
J = J + 1
If J <= 5 Then
ActiveCell.Offset(0, 1).Select
Else
ActiveCell.Offset(3, -5).Select
J = 0
End If donext:
Next
End With
End With
'remova a commandbar quando ela no for necessria
CommandBars(tBarName).Delete
Exit Sub eTrap:
'nem todas as FaceIDs existem. Isto maneja qualquer uma
perdida Resume donext
End Sub

Colocando Faces de Botes Personalizados Numa Barra de Ferramentas

A macro seguinte cria uma barra de ferramentas personalizada e da adiciona botes a ela
usando faces boto personalizadas e que tenham sido salvas numa folha chamada "Faces
de Boto". Para criar faces personalizadas:
Lies de VBA do Excel 385

V para a Caixa de Dilogo Personalizar - Selecione Exibir, Barra de ferramentas,


Personalizar

Selecione o boto que voc quer editar. Da clique com o boto direito do mouse nele
para mostrar o menu de boto popup. Selecione a opo Editar e modifique a face de
boto.

Lio #11 Trabalhando com Barras de Ferramentas

Com o boto selecionado clique com o boto direito do mouse no boto e selecione
Copiar Face de Boto

Saia da caixa de dilogo personalizar e v par uma planilha onde voc possa armazenar
a face do boto. O nome da folha usado neste exemplo "Faces de Boto" e faz parte da
pasta contendo o cdigo da macro.

Nesta folha, apenas faa um normal Editar, Colar. A face de boto ser colada na
planilha como uma figura objeto. Ela ser muito pequena, que OK. Com o boto
selecionado, selecione Formatar, Selecione Estilo... e remova o frame ao redor do objeto
se existir algum.

Quando voc selecionar a face do boto, voc ver o nome que o Microsoft Excel deu a
esta figura de objeto na caixa Nome. Por exemplo, ela pode ser chamada "Figura 1".
Clique na caixa nome (adjacente caixa de edio de frmula) e re-nomear a figura
digitando no novo nome e pressionando entrar. O nome pode ter espaos. Para ajud-lo
no futuro, entre com este nome numa clula adjacente ao boto face.

At este ponto, voc agora pode usar uma face de boto que voc armazenou na planilha
acima e ter uma macro colada a ela no seu prprio boto. A macro seguinte ilustra a
criao de uma nova barra de ferramentas com dois botes personalizados e um boto
regular. As faces para os botes personalizados so chamadas "adicionar boto" e "mudar
boto", e esto localizadas numa folha chamada "faces de boto" na pasta contendo este
cdigo.

Sub ToolBarWithCustomFace()
Const tBarName As String = "Nome da Barra de Ferramentas"
'Deletar a CommandBar se ela existir
On Error Resume Next
CommandBars(tBarName).Delete
On Error GoTo 0
'cria a CommandBar
CommandBars.Add Name:=tBarName
'defina um objeto varivel para se referir CommandBar
With CommandBars(tBarName)
386

'adicione boto use 1 para especificar uma face


personalizada vazia With .Controls.Add(ID:=1)
.OnAction = "Adicionar Info"
.Caption = "Adiciona Informao de Relatrio"
'isto adiciona uma face personalizada ao boto
ThisWorkbook.Sheets("Faces de Boto")
.Shapes("Figura").Copy
.PasteFace
End With
'mostra a barra de ferramentas
.Visible = True
End With
End Sub
387

Lies de VBA do Excel

Ocultando E Restaurando As Barras De Ferramentas E Menus

O cdigo seguinte ocultar todas as barras de ferramentas e menus:

Dim c
For Each c In CommandBars
c.Enabled = False Next

O cdigo acima no somente ocultar todas as barras de ferramentas e menus, ele


desabilitar todos os menus, com uma exceo. Isto a barra de ferramentas que aparece
se clicar com o boto direito do mouse num boto da barra de ferramentas se o usurio
no fez upgrade ao Excel SR-2.

Para mostrar uma barra de ferramentas especfica ou menu, voc primeiro tem de
configurar sua propriedade Enabled de volta para True. Se no estiver visvel, voc
tambm ter de configurar a propriedade Visible para True. Por exemplo:

With CommandBars("Meu Menu Personalizado")


.Enabled = True
.Visible = True
End With

Para mostrar novamente os menus e as barras de ferramentas quando o usurio as tiver,


use o cdigo seguinte:

Dim c
For Each c In CommandBars
c.Enabled = True
Next

Voc pode tambm desabilitar menus especficos referindo-se a eles pelo nome:

CommandBars("Worksheet Menu Bar").Enabled = False

Como Evitar Seus Botes da Barra de Ferramentas Personalizada De


Aparecerem Desbotados

Se voc construir uma barra especial de ferramentas de botes usando o editor de boto
da barra de ferramentas, os botes podem aparecer desbotados na mquina de outros
388

usurios. Este fenmeno ocorre quando os botes da barra de ferramentas forem


construdos com o conjunto de cores do Windows para "milhes de cores" e o usurio
com a barra de ferramentas desbotada, tiver o seu conjunto de cores do Windows numa
configurao mais baixa. A soluo usar uma configurao de cores mais baixa para
mostrar.

Adicionando Dicas das Ferramentas Aos Botes


Lio #11 Trabalhando com Barras de Ferramentas

Quando voc criar uma barra de ferramentas, a dica do boto ferramenta o caption que
est atribudo ao boto. Por exemplo:

With CommandBars("Minha Barra de Ferramentas")


.Controls(1).Caption ="Carregar novos dados"
End with
389

Fase #3: VBA do Excel Avanado

Lio 12: Os Suplementos

S e voc quiser distribuir macros e aplicaes que voc escreveu, voc


provavelmente vai querer considerar em distribu-las como um arquivo
suplemento em vez de um arquivo pasta. A principal vantagem de um arquivo
suplemento que ele mais fcil para usar funes. Uma outra vantagem, um
suplemento pode ser armazenado em qualquer diretrio e ajustado para ser carregado
quando o Microsoft Excel iniciar. Isto elimina a necessidade de colocar o arquivo
no diretrio de incio do Microsoft Excel (tipicamente o Excel\Xlinicio). E, os
suplementos no solicitam se sero ou no gravados quando se fecha o Microsoft
Excel. Tambm, arquivos suplementos podem ter neles as macros AUTO_OPEN e
AUTO_CLOSE. Tais macros podem ser usadas para se criarem e removerem itens
de menu e barras de ferramentas.

Se voc quiser trocar macros com muitos outros usurios e que esto numa LAN
ou sistema de redes, voc provavelmente vai querer usar um suplemento em vez de uma
pasta. Um suplemento pode ser aberto por muitos usurios sem qualquer problema.
Entretanto, uma pasta pode somente ser aberta por um usurio de cada vez ao mesmo
tempo sem aparecer uma mensagem de advertncia.

Existem algumas desvantagens com suplementos. A maior o sofrimento de


descarregar, editar a pasta fonte, recriar o suplemento, descarregar a pasta, e recarregar o
suplemento. Por favor, note que voc pode evitar isto se voc mudar as propriedades da
pasta suplemento para True ao invs de criar um suplemento da sua pasta.

Um outro que a maioria dos usurios no est familiarizada com eles e tambm
como carreg-los. Um outro ainda que as macros no suplemento no aparecem em
qualquer lista de macros, o que torna difcil atribuir manualmente uma macro suplemento
a um boto ou rodar. Assim seu suplemento dever adicionar itens de menu ou criar barra
de ferramentas automaticamente via um Auto_Open ou uma macro Workbook_Open.
Tambm, voc no pode mostrar qualquer uma das folhas num suplemento. Assim, voc
no pode mostrar grficos ou editar manualmente uma planilha num suplemento. Se voc
precisar modificar freqentemente suas macros ou adicionar algumas outras novas sua
coleo, voc no dever usar um suplemento, pois voc no pode modificar as macros
de um suplemento. Voc necessitaria carregar o arquivo contendo o cdigo toda vez que
voc precisar modificar as macros e da recriar o arquivo suplemento para ele ser alterado.
390

Por favor, note que criar um suplemento no evita um usurio de ver seu cdigo macro.
Torna-se apenas mais difcil de obt-lo.

COMO CRIAR UM ARQUIVO SUPLEMENTO


Lies de VBA do Excel 391

Existem dois modos de se criar suplementos que eu chamei de Suplemento


Aproximao Um e Dois. Entretanto, para evitar que os outros vejam o seu cdigo
suplemento, voc dever fazer o seguinte:

No editor de VB, selecione Ferramentas, Propriedades de VBAProject...

Selecionar a ala Proteo da janela Propriedades do projeto.

Clicar na caixa Bloquear projeto par exibio.


Especificar uma Senha (password) e aps confirm-la.

Por favor note que uma pessoa pode comprar um cracker de senhas e abrir seu cdigo.

Suplemento - Aproximao Um
Lio #12 Os Suplementos 392

V para uma planilha na pasta e lance os comandos Arquivo, Salvar como....

Da selecione Salvar como tipo: Suplemento do Microsoft Excel . Por favor, note que
voc precisa compilar seu arquivo primeiro no Editor VBE, quando estiver salvando o
arquivo como um arquivo XLA no o verifique se tm erros. Voc acabar com dois
arquivos, um do tipo XLS e um do tipo XLA.
Lies de VBA do Excel 393

O prximo passo especificar o diretrio para o arquivo suplemento. Voc pode salvar
um suplemento em qualquer diretrio. Voc provavelmente vai querer iniciar um
diretrio especial para suplementos ou salvar seus suplementos no diretrio C:\Documents
and Settings\nome do usurio principal do Windows\Dados de
aplicativos\Microsoft\Suplementos. Este o diretrio default que a Microsoft Excel
dispe para voc selecionar suplementos.

Uma vez tendo especificado o nome do arquivo e o diretrio, selecionar Salvar. O


Microsoft Excel criar ento o arquivo suplemento que eu denominei Pastateste. Ele ser
ligeiramente menor em tamanho que o arquivo fonte. Tudo que se faz para criar um
suplemento tornar um arquivo em suplemento. Ele no carrega o arquivo no Microsoft
Excel.

Suplemento - Aproximao Dois


Lio #12 Os Suplementos 394

Na janela Project Explorer do Editor VB, aparece o ttulo Projeto


TESTETEXTO. Nela selecione o objetoTESTETEXT (Pasta1):

e mostre tambm a janela de propriedades.

Na janela de propriedades, ajuste o valor da propriedade "IsAddin" para True. Isto far
qualquer planilha ficar oculta. Salve o arquivo. Por favor note que o tipo de arquivo no
mudar.

A vantagem desta segunda aproximao que voc no precisa manejar dois arquivos,
um do tipo XLS e um do tipo XLA. Para converter o arquivo de volta para um arquivo
tipo XLS, simplesmente mude a propriedade IsAddin para False. A desvantagem
que o tipo de arquivo no XLA, o qual o que o gerenciador de suplemento reconhece.
Lies de VBA do Excel 395

Para ilustrar a criao de um arquivo suplemento, crie uma pasta com um modulo que
contenha a seguinte macro e funo. Este suplemento tambm ser usado em vrios outros
exerccios neste texto. O cdigo para a macro e funo :

Function LbsToKg(lbs)
LbsToKg = lbs / 2.2046 End
Function

'*****************************************************

Sub ItIsNow()
MsgBox "O dia e o tempo " & Now End
Sub

'*****************************************************

Salve o arquivo como EXEMPLO.XLS em Meus Documentos (se voc salvar de outro
lugar, anote o path). Agora, v para uma nova pasta e selecione Ferramentas, Macro, e
rode a macro ItIsNow. Voc a ver listada na lista das macros disponveis.

Finalmente, v a uma clula numa pasta diferente e teste a funo. Voc precisar
especificar a pasta para usar a funo. Assumindo que voc queira ver quantos kilogramas
so100 lbs, a frmula seria:

=EXEMPLO.xls!LbsToKg(100)

Como um lembrete, para evitar ter que colocar na pasta uma referncia para um arquivo
voc pode configurar uma referncia ao arquivo funo. Isto feito indo para uma folha
de modulo na pasta e selecionando Ferramentas, Referncias e especificando o arquivo.
No faa isto neste exerccio. Isto foi apenas um lembrete!
Lio #12 Os Suplementos 396

O prximo passo neste exerccio criar o arquivo suplemento.

COMPILANDO SUAS MACROS

Compilar seu cdigo muito fcil - apenas selecione Depurar, Compilar


VBAProject. O nome do seu projeto de pasta ser mostrado imediatamente aps a palavra
Compilar VBAProject no menu. Uma tcnica muito til nomear cada um dos projetos,
e no deix-los para serem nomeados pelo "VBAProject". O Visual Basic quando
necessrio ajustar o cdigo a ser compilado para outro alm daquela pasta cujos cdigos
so mostrados na janela ativa. Se todas as suas pastas tem o nome do projeto default, voc
no pode ter certeza que voc est compilando a pasta certa.
MODIFICANDO SUAS MACROS PARA USAR NO SUPLEMENTO
Se suas macros fizerem referncias s suas pastas fontes, ento elas devem ser modificadas
antes do suplemento ser criado ou ento resultaro erros destas referncias.
Por exemplo, se houver uma macro no EXEMPLO.XLS que tenha a referncia
Pasta("Exemplo.XLS"), e voc criou um suplemento com um tipo de XLA, quando esta
declarao rodada o suplemento vir com uma mensagem de erro. Para evitar tais erros,
voc precisar modificar as macros para ou especificar o arquivo suplemento ou usar a
palavra chave ThisWorkbook ao invs disso. ThisWorkbook um comando que se refere
ao arquivo que contm a macro em execuo. Se o Exemplo.XLA teve este problema,
ento as referncias tero de serem mudadas ou para Workbooks("Exemplo.XLA") ou
ThisWorkbook. O uso do ThisWorkbook , obviamente, o melhor caminho.

Tambm, se voc tem botes ou itens de menu numa pasta que se refira ao arquivo XLS
e uma de suas macros, voc precisar mudar o link naquela pasta para se referir ao arquivo
suplemento. Voc pode fazer isto manualmente selecionando Editar, Vinculos e
especificando o arquivo XLA para o arquivo XLS. Por favor note que voc precisar
movimentar-se nestes links para trs e para frente quando voc editar no arquivo XLS.
Assim, voc provavelmente vai querer gravar macros que faam estas mudanas para
voc.

CARREGANDO UM ARQUIVO SUPLEMENTO

Existem vrios modos de se carregar um arquivo suplemento. O modo mais rpido


selecionar Arquivo, Abrir e especificar o arquivo suplemento. Entretanto, ele tem vrias
pequenas desvantagens:

Voc ter que abrir manualmente o arquivo cada vez


Voc no pode fechar manualmente o arquivo sem fechar o Microsoft Excel
Lies de VBA do Excel 397

A principal vantagem desta aproximao que ela no exige que voc tome ao para
evitar o suplemento de ser carregado na prxima vez que voc carregar o Microsoft Excel.
Se voc usar somente um arquivo suplemento no freqentemente, ento voc
provavelmente vai preferir esta aproximao.

Voc tambm pode ter uma macro abrindo e fechando um arquivo suplemento. Voc usar os
mesmos comandos que voc usa com pastas regulares. Por exemplo:

Workbooks.Open "\ESPECIAL.XLA" Workbooks("ESPECIAL.XLA").Close

Por favor, note que voc precisa especificar o path para o arquivo suplemento, caso
contrrio o Excel enxergar somente o diretrio atual e um erro ocorrer se o arquivo no
estiver l.

Voc pode tambm usar argumentos com o mtodo Open. Por exemplo, se o suplemento
tem vnculos a outros arquivos que voc no quer alterar quando o suplemento for
carregado, voc pode adicionar o argumento updatelinks:=0 para evitar atualizao. E,
rodar qualquer macro Auto_Open no suplemento, voc usar uma declarao como:

Workbooks("SPECIAL.XLA").RunAutoMacros xlAutoOpen

Se o suplemento tem uma macro Workbook_Open, ele roda automaticamente quando aberto via
cdigo.

Um outro modo para abrir um arquivo suplemento selecionar Ferramentas, Suplementos do menu
Microsoft Excel. Isto mostra a seguinte caixa de dilogo:
Lio #12 Os Suplementos 398

Voc ver vrios suplementos listados. Sua lista pode ser diferente. Uma curta descrio
de cada suplemento mostrada na lista de rolamento. Voc no encontrar o
EXEMPLO.XLA se ainda estiver na pasta exemplo. bom sair dela primeiro e da
executar os passos acima de outra pasta. Ao clicar num suplemento sero feitas duas
coisas:

Ele muda o suplemento de desligado para ligado ou de ligado para desligado

Ele mostra uma longa descrio do suplemento, o qual vem da informao do arquivo resumo.

Se voc clicou num suplemento e ele no for um selecionado previamente, ele ser
carregado quando voc selecionar OK, e cada vez que voc carregar o Microsoft Excel
da pra frente. Clicando num suplemento numa segunda vez reverte o efeito da primeira
seleo.

Para adicionar um suplemento lista, voc precisa selecionar Procurar... e da encontrar


e clicar no arquivo suplemento. Quando voc selecionar o arquivo suplemento, ele ser
adicionado lista e a caixa ativa ser checada.

Se voc criou o arquivo EXEMPLO.XLA anteriormente, ento voc pode adicion-lo


lista usando a opo Procurar.... Quando voc selecionar OK, o arquivo EXEMPLO.XLA
ser carregado. Note que somente o nome do arquivo aparece na lista de suplementos e
que no h uma longa descrio associada com o suplemento. Uma seo mais tarde deste
texto ilustra como fornecer estas descries.
Lies de VBA do Excel 399

Para ilustrar a diferena entre suplementos e pastas de arquivos, feche o EXEMPLO.XLS.


Neste ponto do exerccio, voc deve ainda ter um arquivo teste para abrir. Se no, abrir
um novo arquivo. Para demonstrar a funo chamada LbsToKg que est no
EXEMPLO.XLA, v para uma clula vazia e digite =LbsToKg(100) e pressione enter.
Note que voc no precisou especificar o nome do arquivo nem configurar uma referncia.
Tambm, se voc selecionar Inserir, Funo, e clicar na categoria Definida pelo usurio,
voc ver LbsToKg listada l.

Agora, selecione Ferramentas, Macro e procure a macro ItIsNow que voc criou no EXEMPLO.XLS, e que
est no suplemento, EXEMPLO.XLA. Embora o
EXEMPLO.XLA esteja carregado a macro no aparece na lista de seleo.
Lio #12 Os Suplementos 400

Entretanto, se voc digitar seu nome na caixa de nome de macro e pressionar enter, a macro roda
e diz a voc a hora do dia.

Se voc quiser atribuir uma macro suplemento a um boto da barra de ferramentas,


voc tambm ter de digitar no nome da macro, como macros suplemento no so
mostrados na lista de seleo da macro. Porque a Microsoft mostra as funes dos
suplementos e no as macros, no tem lgica. Entretanto, este o modo como os
suplementos funcionam.
Lies de VBA do Excel 401

DESCARREGANDO UM ARQUIVO SUPLEMENTO

Voc pode descarregar um arquivo suplemento que voc carregou selecionando a barra de
ferramentas, Suplementos, e clicar na macro que voc quiser descarregar. Isto remover
a marca na caixa de opo pelo seu nome ou descrio. Voc no pode descarregar
manualmente um suplemento que voc carregou usando Arquivo, Abrir.

Se voc descarregar um suplemento e voc tiver que abrir arquivos que esto usando uma
funo que est armazenada no suplemento, a funo no funcionar. Em vez disso, o
Microsoft Excel mostrar #NAME? como o valor daquela clula contendo a funo e em
qualquer clula que se referir a ela. Se a funo exclusiva da pasta que usar, ento voc
dever armazenar a funo naquela pasta em vez de um arquivo suplemento ou uma outra
pasta.

ALTERANDO UM ARQUIVO SUPLEMENTO

Suponha que voc queira modificar as macros ou funes que voc tem num arquivo suplemento. Para
fazer isto, voc precisa

descarregar o arquivo suplemento,


abrir a pasta contendo as macros,
modificar as macros,
re-criar o arquivo suplemento. recarregar o arquivo suplemento

Se voc tentar recriar o arquivo suplemento sem primeiro descarreg-lo, o Microsoft Excel
mostrar uma mensagem.

ADICIONANDO DESCRIES PARA OS SEUS SUPLEMENTOS

Se voc quiser mudar ou a descrio curta que aparece na lista de seleo suplemento ou
na longa descrio que aparece na caixa descrio abaixo na lista de seleo suplemento,
voc precisa:

Descarregar o suplemento se ele estiver carregado


Abra o XLS arquivo que criou o suplemento
Selecionar Arquivo, Propriedades do menu Microsoft Excel
Preencha a caixa de ttulos e a caixa de comentrios.
Lio #12 Os Suplementos 402

Salvar o arquivo XLS


Re-criar o arquivo suplemento
Re-load o arquivo suplemento
Encerre o Microsoft Excel e retorne

A entrada caixa de ttulos a descrio que aparece na lista de seleo suplemento. A


entrada comentrio a longa descrio. Afim de novas descries aparecerem no dilogo
seleo suplemento, voc deve primeiro sair do Microsoft Excel e da carreg-lo
novamente.

SUPLEMENTOS E BOTES DA BARRA DE FERRAMENTAS

Se voc criou botes da barra de ferramentas que se refiram a macros num arquivo
XLS, e voc criou um suplemento, os botes continuaro a se referirem ao arquivo XLS.
Voc precisar mudar manualmente os botes para referirem ao arquivo XLA. Por outro
lado, quando voc clicar num boto, o Excel abrir o arquivo XLS, e ignorar a macro
suplemento.

DELETANDO SUPLEMENTOS DA LISTA DE SUPLEMENTO


Lies de VBA do Excel 403

Embora o Microsoft Excel fornea um significado ao adicionar suplementos para


a lista de suplementos disponveis, ele no fornece uma maneira para delet-los desta lista.
A nica maneira que eu encontrei para fazer isto fechar o Microsoft Excel, deletar o
arquivo suplemento usando Gerenciador de Arquivo, e reiniciar o Microsoft Excel.
Quando o Microsoft Excel inici-lo de volta remova qualquer suplementos ele pode no
se encontrar na lista. Se o suplemento selecionado para ser carregado, voc ser
estimulado a remov-lo da lista.

RESUMO

Suplementos podem ser muito teis se voc precisar distribuir funes. Se voc
usar suplementos, voc dever ter o suplemento ou criar uma barra de ferramentas ou
adicionar um menu ou itens de menu aos menus do Excel de modo que o usurio possa
rodar as macros. Isto necessrio desde que as macros num suplemento no aparecem na
caixa de dilogo de execuo de macro (Barra de ferramentas, Macros, ).