Você está na página 1de 0

PARCERIA JLIO BATTISTI - DIGERATI

Este e-book uma parceria entre o meu site


www.juliobattisti.com.br e a Editora Digerati,
com a qual eu mantenho contrato para
revenda deste e-book, em formato PDF,
atravs do meu site.
Nota sobre direitos autorais:

IMPORTANTE: Nas propriedades do E-book esto gravados o nome completo, e-mail e
demais dados do comprador. Se for repassada cpia para outros usurios e este E-book for
parar em um site ou Blog, para download gratuito, quem ser responsabilizado
Criminalmente, conforme previsto nas Leis 9118 e 9610, ser o comprador do E-book, que
foi quem repassou cpias para outros usurios, O QUE PROIBIDO. Seja honesto. Este E-
book de uso pessoal, individual, no compartilhado. NO REPASSE CPIAS!!!

Ao adquirir este E-book voc tem o direito de l-lo na tela do seu computador e de imprimir
uma cpia para o seu uso pessoal. vetada a distribuio deste arquivo, mediante cpia ou
qualquer outro meio de reproduo, para outras pessoas.

Se voc recebeu este E-book atravs do e-mail ou via ftp de algum site da Internet, ou
atravs de um CD de Revista ou via e-mail recebido de um amigo, saiba que voc
est com uma cpia pirata, no autorizada. A utilizao de uma cpia pirata, no
autorizada, crime de Violao de Direitos Autorais conforme Leis 9118 e 9610, sujeita
a pena de 2 a 5 anos de Cadeia. Denuncie o site ou revista que est disponibilizando a
cpia, atravs do e-mail webmaster@juliobattisti.com.br

Se voc tiver sugestes sobre novos cursos que gostaria de ver disponibilizados, entre em
contato pelo e-mail: webmaster@juliobattisti.com.br. Visite periodicamente o site
www.juliobattisti.com.br para ficar por dentro das novidades:

Mais de 900 cursos e vdeos-aula em diversos assuntos.
Artigos e dicas sobre Certificaes da Microsoft.
Artigos sobre Carreira e Trabalho.
Centenas de Livros sobre os mais Variados Assuntos.
Dicas de livros e sites sobre diversos assuntos.
Simulados gratuitos, em portugus, para os exames da Microsoft.

PARCERIA JLIO BATTISTI - DIGERATI

Captulo 1
Introduo lgica de programao
cap01.indd 11 1/11/2006 15:46:34
12 universidade VBA
Cdigo e programao
Imagine que voc precisa fazer muitos clculos at amanh, para apresent-los
de forma organizada em uma reunio bem cedo. estafante, mas nada que o Excel
no consiga fazer, no verdade?
No entanto, no meio da tarde algum liga para o seu ramal. Querem que as
planilhas no apenas contenham dados e sejam bem formatadas, mas tambm que
sejam dinmicas, pois a empresa pretende adotar uma soluo definitiva para a
forma como dados so inseridos em uma planilha, criando uma interface e rotinas
para salvamento do contedo. Ou seja, querem um sistema de planilhas dinmicas
e programveis.
E agora? Fazer planilhinhas no Excel, com frmulas simples, uma coisa. Ago-
ra, trabalho de programador, com funes e sistemas de armazenamento de dados
parecidos com os feitos em bancos de dados outra bem diferente...
Porm, na verdade no . Ao trabalhar com o Excel, temos nossa disponibili-
dade uma interface de programao amigvel, o VBA (Microsoft Visual Basic for
Applications), a forma mais simples de trabalhar com componentes do Microsoft
Office especialmente com as planilhas do Word e com os bancos de dados do Excel,
construindo mini-aplicaes ou solues de automao.
Trabalhar com o VBA simples: possvel utilizar tanto o sistema de gravao
direta de macros (que veremos com detalhes no Captulo 2, Macros e VBA) quanto
o editor de cdigo. No entanto, se deseja um trabalho realmente profissional, ter
de aprender algumas coisas sobre como criar e administrar um cdigo, a chamada
lgica de programao.
Em vista disso, nessa introduo daremos alguns pilares da lgica de programao,
para que voc aprenda a se organizar no momento de montar uma aplicao VBA.
Alm disso, a leitura necessria para a compreenso integral tanto dos conceitos
como das ferramentas de criao de cdigos do VBA.
Algoritmos
Para resolver o problema indicado no tpico anterior, devemos encontrar uma
seqncia de passos que conduzam sua resoluo; seqncia que deve facilitar a
resoluo do problema, e no complic-lo. A essa ordem de execuo do trabalho
damos o nome de algoritmo.
De um modo geral, define-se algoritmo como uma descrio, passo a passo, de
um mtodo que conduz resoluo de um problema ou execuo de uma tarefa,
cap01.indd 12 1/11/2006 15:46:34
Introduo lgica de programao 13
1
captulo
ou seja, consiste na diviso de um problema em problemas (ou etapas) menores,
procurando a resoluo de micro-tarefas, cada uma em separado.
Programao consiste na codificao precisa de um algoritmo, segundo uma
linguagem de programao especfica. Existem, portanto, trs fases distintas na
elaborao de programas:
Anlise do problema (especificao do problema, anlise de requisitos, pres-
supostos etc.);
Concepo do algoritmo;
Traduo desse algoritmo na linguagem de programao, ou seja, em uma lin-
guagem inteligvel para a mquina (computador), para um determinado aplicativo
ou para um determinado servio.
O exemplo mais simples que podemos utilizar para demonstrar o funcionamento
de algoritmos o clssico exemplo da receita de bolo, que voc j deve ter visto em
alguma aula de Matemtica do ensino mdio.
Uma receita a descrio de um conjunto de passos, ou aes, que integram a
combinao de um conjunto de ingredientes para que possamos obter um produto
em particular. A combinao no aleatria, por isso os passos devem ser cumpridos
em uma determinada ordem para alcanarmos um resultado final satisfatrio. Da
mesma maneira, todas as etapas do processo devem ser mantidas: a substituio de
etapas, alm de acabar com a noo de algoritmo como exerccio dividido em etapas
mais simples, redundaria em fracasso, pois os ingredientes seriam misturados ao
acaso, sem mtodo. A representao grfica do algoritmo para a receita de bolo
pode ser observada na Figura 1.1:
Manteiga
Farinha de trigo
Acar Leite RECEITA
Fermento
Ovos
Sal
Figura 1.1.
cap01.indd 13 1/11/2006 15:46:34
14 universidade VBA
A elaborao da receita trabalha com um conjunto de entradas (os ingredientes)
de forma a obter um resultado agradvel ou til (o bolo). Supondo que esto sendo
utilizadas as entradas corretas para alcanar o objetivo, a partir delas, trabalhamos na
montagem das instrues dos algoritmos, representados aqui pelos passos da receita.
1. Quebrar dois ovos (primeiras entradas utilizadas).
2. Separar a clara da gema.
3. Bater duas claras em neve.
4. Adicionar duas gemas.
5. Adicionar uma xcara de acar.
6. Adicionar duas colheres de manteiga.
7. Adicionar uma xcara de leite.
8. Adicionar farinha e fermento.
9. Misturar tudo.
10. Colocar em uma forma e levar ao forno em fogo brando.
Traduzindo o modelo apresentado em regras tcnicas, obtemos um modelo or-
denado de como preciso construir um algoritmo:
1. Compreender o problema: alguns ingredientes devem ser misturados para
produzir um bolo.
2. Identificar os dados de entrada: quais ingredientes devem ser usados?
3. Identificar os dados de sada: o que resultar da mistura dos ingredientes?
4. Determinar o que preciso fazer para transformar os dados de entrada em
dados de sada. Observe:
Usar a estratgia de dividir para conquistar;
Observar regras e limitaes;
cap01.indd 14 1/11/2006 15:46:34
Introduo lgica de programao 15
1
captulo
Identificar todas as aes a realizar;
Eliminar ambigidades (o algoritmo deve ser simples).
5. Construir o algoritmo.
6. Testar o algoritmo.
7. Executar o algoritmo.
O mtodo para conquistar
Tambm conhecido como mtodo cartesiano (foi Ren Descartes quem o inven-
tou), mtodo descendente (top-down method) ou, ainda, mtodo de refinamento passo
a passo, esse conjunto de procedimentos define com clareza como um algoritmo deve
se portar. Por meio dele, um problema de grande porte deve ser dividido em partes
menores (ou sub-problemas) de modo que seja mais fcil atingir sua resoluo. Como
exemplo, suponha que o problema maior seja a necessidade de consertar uma parte do
telhado de casa. Assim, temos a proposio geral ou objetiva consertar o telhado,
que, por sua vez, seguida da pergunta como consertar?, que pode ser resolvida
com a diviso do problema em tarefas menores. Observe a figura seguinte:
Como consertar o telhado da casa?
|
Comprar material
|
Posicionar escada
|
Subir no telhado
|
Retirar telhas quebradas
|
Substituir por telhas inteiras Descer da escada e finalizar a tarefa
Figura 1.2.
Esse mtodo passo a passo, ou seja, cada ponto do problema completado
antes do incio do prximo. Tomando o exemplo da Figura 1.2, no podemos subir
no telhado sem antes posicionar a escada, e no podemos retirar a telha estragada
sem subir no telhado.
cap01.indd 15 1/11/2006 15:46:35
16 universidade VBA
Caractersticas de um
algoritmo de programao
Com base na utilizao do mtodo cartesiano, definimos que um algoritmo deve
ter cinco caractersticas fundamentais:
Finitude: um algoritmo deve terminar sempre aps um nmero finito de
passos. Uma boa dica definir que esse nmero de passos no pode ser maior do
que a capacidade que uma pessoa normal tem de se lembrar de todas as etapas
de um processo sem a ajuda de lpis e papel, computadores etc. Alm disso, o al-
goritmo deve ser to curto quanto simples, a ponto de ser repetido diversas vezes
sem dificuldade;
Definio: cada passo de um algoritmo deve ser precisamente definido. As
aes devem ser fixadas rigorosamente e sem ambigidades;
Entradas: um algoritmo deve ter zero ou mais entradas, ou seja, quantidades
ou parmetros que lhe so fornecidas antes do algoritmo iniciar;
Sadas: um algoritmo deve ter uma ou mais sadas, ou quantidades relacionadas
especificamente com as entradas;
Eficincia: um algoritmo deve ser eficiente. Isso significa que todas as opera-
es devem ser suficientemente bsicas de modo que possam ser executadas com
preciso em um tempo finito por um ser humano comum.
Traduo do algoritmo
Criado o algoritmo, devemos traduzi-lo para uma linguagem inteligvel. No
nosso caso, para os parmetros de uma linguagem de programao. A maioria das
linguagens de programao trabalha com os algoritmos, transformando-os matema-
ticamente em equaes ou instrues. Cada linguagem de programao, por sua vez,
possui uma forma prpria de codificao de instrues. Essa seqncia chamada
de estrutura de controle.
Em meados da dcada de 1960, alguns matemticos provaram que qualquer progra-
ma poderia ser construdo por meio da combinao de trs estruturas bsicas: seqncia,
seleo e repetio. Tambm foi definido que essas estruturas devem ter um incio e um
final, que passou a ser chamado de mdulo. Um conjunto de mdulos ou funes (so
a mesma coisa) pode ser chamado, para fins de separao do cdigo, de bloco.
Estruturas de montagem de um algoritmo
Os comandos ou mdulos do algoritmo fazem parte de uma seqncia, em que
relevante a ordem na qual eles se encontram, pois sero executados um de cada
cap01.indd 16 1/11/2006 15:46:35
Introduo lgica de programao 17
1
captulo
vez, estritamente, de acordo com essa ordem. De uma forma genrica, poderamos
expressar uma seqncia da seguinte maneira:
Comando-1
Comando-2
Comando-3
:
Comando-12
Comando-13
Temos aqui uma seqncia de n comandos, na qual os comandos sero executados
na ordem em que aparecem, ou seja, o comando de ordem i+1 (veja o tpico seguinte)
s ser implementado aps a execuo do de ordem i. Utilizando a ordem natural
(nmeros ordinais), diramos que o terceiro comando s ser executado aps a reali-
zao do segundo, o quarto aps a finalizao do terceiro, e assim por diante.
Notao lgica
Para fins de representao, tanto no processo da montagem de algoritmos como
na passagem do algoritmo para uma linguagem de programao, costuma-se utilizar
uma notao prpria, muito semelhante empregada em lgebra, para definir a
inter-relao entre comandos e demais elementos de um algoritmo.
Essa notao chamada de notao lgica, e determina que a localizao de
um comando ou elemento pode ser representada pela letra i. Graficamente, essa
notao poderia ser exemplificada como algo semelhante ao ponto em que o cursor
do computador est posicionado na tela, ou ao ponto desenhado em uma folha de
papel com o auxlio de uma rgua e um lpis.
Assumindo que i a posio atual de um elemento, possvel movimentar-se para
frente utilizando a notao i+1, que indica que devemos avanar um comando em
relao ao comando atual. Para avanar dois comandos na seqncia do algoritmo,
podemos utilizar a notao i+2, e assim por diante. A notao lgica ser muito
utilizada neste livro ao trabalharmos, tanto em sua forma corrente, que apresentamos
aqui, quanto em modelos de notao baseados em clulas, linhas, colunas e planilhas,
elementos especficos do Excel.
Estrutura de deciso ou seleo
Alm de estruturas puramente cumulativas, que nos permitem avanar para
um novo comando, como em i+1, possvel utilizar outros tipos de estruturas na
traduo de um algoritmo para uma linguagem de programao.
cap01.indd 17 1/11/2006 15:46:35
18 universidade VBA
Em alguns casos, por exemplo, pode ser necessrio fazer com que o algoritmo
se divida em dois caminhos, de acordo com a seqncia de comandos apresentada.
Como s possvel adotar uma soluo para cada seqncia de comandos, deve-se
adotar uma forma de representar a continuidade que ser dada a uma determinada
seqncia de aes. Esse tipo de notao chamado de estrutura de deciso ou
seleo, mas tambm pode ser chamada de estrutura condicional, j que o caminho
que ser adotado pelo algoritmo ser traado de acordo com a veracidade de uma
condio. Observe seu funcionamento:
Se <condio>
ento <seq. de comandos-1>
seno <seq. de comandos-2>
Em notao lgica, utilizamos as alneas ( ou ) para definir uma estrutura
condicional:
Se x>1
ento <i=i+1>
seno <i=i+2>
Se a <condio> for verdadeira ser executado <seq. de comandos-1>. Em
caso contrrio, teremos a execuo da <seq. de comandos-2>.
A deciso deve ser tomada quando h necessidade de testar alguma condio e,
em funo dela, tomar uma atitude. Em nosso dia-a-dia, estamos sempre tomando
decises com base em condies. No caso das aplicaes VBA em planilhas do
Excel, as decises podem ser tomadas com base em condicionais representadas por
elementos prprios ao Excel, como pastas, planilhas, linhas, colunas etc.
Repetio ou iterao
Uma estrutura muito utilizada em programao a da repetio, ou iterao,
tambm conhecida como looping. O looping existe praticamente em todas as lin-
guagens de programao, pois com ele possvel declarar em um cdigo a repetio
de tarefas individuais por um nmero determinado de vezes, ou quantas vezes uma
condio lgica permitir. Observe alguns exemplos:
cap01.indd 18 1/11/2006 15:46:35
Introduo lgica de programao 19
1
captulo
Virarei as pginas do livro at que terminem;
Escolherei cinco figuras do livro;
Enquanto o livro possuir pginas no lidas, eu o lerei.
No primeiro exemplo, repetimos a ao de virar as pginas do livro, obedecen-
do ordem seqencial (i+1) at que seja satisfeita a condio para que as pgi-
nas terminem.
No segundo exemplo, h a repetio da atitude de escolher uma figura por um
nmero determinado de vezes (cinco). Note que, aqui, o comando ser associado,
provavelmente, a uma estrutura de deciso, pois no ficou determinado que sejam
escolhidas, por exemplo, as cinco primeiras figuras do livro (i+1, i+2, i+3, i+4, i+5),
mas sim que seja satisfeita a condio de se ter cinco figuras, no importa quais.
No terceiro exemplo, temos uma condio mais claramente atrelada ao looping:
para continuarmos a ler o livro, devem existir pginas ainda no lidas. Quando no
existirem mais tais pginas, o processo ser interrompido.
cap01.indd 19 1/11/2006 15:46:35
cap01.indd 20 1/11/2006 15:46:35
Macros e VBA 21
2
captulo
Captulo 2
Macros e VBA
cap02.indd 21 1/11/2006 15:46:51
22 universidade VBA
O VBA
A introduo apresentada no captulo anterior serve no s para os estudos de
VBA, mas para qualquer linguagem de programao. Por isso, salientamos que
importante se familiarizar com os conceitos ali apresentados se deseja se tornar
um especialista em VBA, capaz de criar suas prprias macros e cdigos, e no um
simples compilador (no sentido de quem copia mesmo) de cdigos tirados de livros
ou de sites da Internet.
O VBA (Visual Basic for Application) uma implementao do Visual Basic da
Microsoft incorporada em todos os programas do Microsoft Office, bem como em
outras aplicaes da Microsoft, como o Visio. Tambm possvel encontr-la, pelo
menos parcialmente, em programas de terceiros, como o AutoCAD.
O VBA substitui e estende o potencial das linguagens de programao para ma-
cros anteriores incluindo as implementaes para gravadores de macros presentes
no Office antes da verso 2000.
O VBA pode ser utilizado, primariamente, para controlar os aspectos relacionados
com a aplicao anfitri, incluindo a manipulao da interface do usurio, tais como
menus, barras de ferramentas, formulrios desenhados pelo usurio e caixas de dilogo.
No entanto, indo um pouco alm, o VBA tambm pode ser utilizado para criar scripts de
automao das aplicaes, mediante o VBA Script, a resposta da Microsoft ao JavaScript.
O VBA Script trabalha com uma janela de criao de cdigos, j incorporada interface
de criao de aplicaes no VBA, o VBA Editor, nas novas funes do Office.
Como o nome sugere, o VBA muito parecido com o Visual Basic; uma escolha
bvia, j que boa parte do Office criado a partir de cdigos do Visual Basic. No
entanto, o VBA s pode correr um cdigo dentro da aplicao, no lugar de operar
como aplicao separada. Porm, pode ser usado para controlar uma aplicao a
partir de outra.
O VBA, assim como o Visual Basic, uma linguagem orientada a objetos. Definindo
de forma simples, uma linguagem orientada a objetos uma tcnica de programao que
se concentra nos dados (ou objetos), e nas interfaces que tm esse objeto. Conceitual-
mente, a linguagem orientada a objetos trabalha com a noo de que tudo que existe
nossa volta, incluindo ns mesmos, pode ser estruturado como objeto. Alguns, como
carros, bancos e cadeiras so objetos concretos. J outros, como a conta bancria, uma
opinio ou uma dvida com algum so classificados como objetos abstratos.
O importante em uma linguagem orientada a objetos construir objetos confi-
veis, ou seja, que correspondam finalidade para a qual foram criados. Os meios
utilizados para a criao desse objeto so de importncia secundria.
cap02.indd 22 1/11/2006 15:46:52
Macros e VBA 23
2
captulo
Procedimentos para
gravao de macros
Uma macro um programa escrito ou gravado por um usurio capaz de armaze-
nar uma srie de comandos de Excel para que possam ser utilizados posteriormente
como um nico comando. Com as macros, podemos automatizar tarefas complexas,
assim como possvel reduzir o nmero de passos necessrios para a execuo de
uma tarefa (o conceito de algoritmo, no Captulo 1, Introduo lgica de progra-
mao) executada com freqncia.
Macros so o meio de trabalho padro em VBA. Uma macro, dentro do Micro-
soft Office, pode ser gravada de duas maneiras: mediante o gravador de macros
opo rudimentar, baseada no antigo gravador de macros do Office 97 ou com
o Editor de Visual Basic, embutido no Microsoft Office. A utilizao do grava-
dor boa o suficiente para a montagem de pequenas rotinas, ou para entender
o funcionamento de algumas funcionalidades do VBA, mas no a ferramenta
mais adequada para a produo de aplicativos complexos. Nesses casos, deve ser
utilizado o Editor de VBA.
Utilizao do gravador de macros
1. Para empregar o gravador de macros, defina, antes de tudo, qual funo ser
criada. Lembre-se de toda a nossa conversa sobre algoritmos, no Captulo 1, Intro-
duo lgica de programao, e voc ver como ela ser importante a partir de
agora. Podemos at mesmo utilizar o expediente muito prtico de abrir o Microsoft
Excel para anotar, em uma folha de papel ou no Bloco de notas, quantas operaes
ou etapas so necessrias para finalizar a tarefa. Lembre-se do mtodo cartesiano:
divida o problema em problemas menores, para resolv-lo da melhor forma, e orga-
nize-o no formato passo a passo, ou seja, uma etapa s deve ser iniciada quando a
anterior for terminada.
2. Isso feito, abra o Microsoft Excel. Siga o menu Arquivo > Novo ou utilize o
atalho Ctrl + O se quiser criar a macro em um novo documento. Se quiser criar a
macro a partir de uma planilha existente, clique em Arquivo > Abrir e escolha a
planilha desejada, ou utilize o atalho Ctrl + A.
Para gravar a macro, clique no menu Ferramentas > Macro > Gravar no-
va macro.
cap02.indd 23 1/11/2006 15:46:52
24 universidade VBA
Figura 2.1.
3. Ser aberta a janela Gravar macro. Clique na linha Nome da macro para dar
um nome macro que ser gravada. D-lhe um nome coerente; de preferncia um
que faa sentido no momento da documentao, ou para algum que acaba de chegar
na empresa e precise utiliz-la. Nomes padres, como Macro1 e Macro2 no ajudam
muito, mas so melhores do que apelidos e palavres. O ideal que o nome da macro
inclua uma brevssima descrio do que ela faz. Uma macro que seleciona colunas,
por exemplo, pode tranqilamente chamar-se SelecColuna.
4. Se voc deseja que a macro possua um atalho de teclas, selecione a caixa ao
lado da linha Ctrl + e digite uma letra, um nmero ou um smbolo. Se quiser que
alm de Ctrl o atalho tambm contenha a tecla Shift, aperte-a no momento em que
digitar a letra na caixa.
Figura 2.2.
cap02.indd 24 1/11/2006 15:46:52
Macros e VBA 25
2
captulo
5. No espao Armazenar macro em, podemos escolher entre trs opes:
Esta pasta de trabalho: a macro ser gravada na mesma pasta que armazena
as planilhas atualmente utilizadas, e passa, portanto, a fazer parte do projeto;
Nova pasta de trabalho: armazena a macro em uma pasta diferente da pasta
com as planilhas atualmente manipuladas;
Pasta pessoal de macros: indicamos ao Office que a macro deve ser armazenada,
juntamente com outras macros, em uma pasta personalizada, apenas para macros.
Aqui, vamos supor que tenhamos escolhido a ltima opo.
6. Na linha Descrio, d algumas informaes sobre a funo da macro. pos-
svel utilizar as indicaes algortmicas formuladas, caso as tenha especificado. O
importante no deixar de documentar o que est sendo feito. Mantenha a indicao
da data e do usurio no comentrio original. Clique em OK.
7. Agora, preciso gravar as aes da macro. Note que no meio da planilha surgir
uma pequena barra de ferramentas. Nela, encontramos um boto quadrado que se
chama Parar gravao; e ele que voc deve utilizar para interromper a gravao
da macro aps realizar todas as tarefas.
Vamos supor que a ao diga respeito seleo das colunas A, B e C de uma pla-
nilha do Excel. Aps selecionar as trs colunas, clique no boto Parar gravao.
8. Para visualizar o resultado da macro, utilize a combinao de teclas Alt + F8
para acessar a janela Macro. Nela, voc ter listadas todas as macros do sistema,
incluindo a gravada agora h pouco.
Figura 2.3.
9. Em seguida, clique na macro criada anteriormente e, depois, em Executar. Se
a ao for realizada, obtivemos sucesso na criao da macro. Tambm faa um teste
com o atalho atribudo macro.
cap02.indd 25 1/11/2006 15:46:53
26 universidade VBA
10. Agora vem a parte realmente interessante. Alm de criar uma macro simples,
podemos aprender como o editor de macros se comporta, descobrindo, inclusive,
quais elementos foram utilizados para criar a macro. Para tanto, clique na macro
criada e aperte o boto Editar. Aparecer o Editor do Microsoft Visual Basic, que
veremos com detalhes mais adiante. Nele, estar inscrito todo o cdigo VBA Script
utilizado pela macro gravada anteriormente.
Figura 2.4.
11. O cdigo ficar parecido com o que vemos a seguir:
Sub Macro3()

Macro3 Macro
Macro gravada em 12/1/2006 por Teste

Atalho do teclado: Ctrl+Shift+H

Range(A:C,A:C).Select
cap02.indd 26 1/11/2006 15:46:53
Macros e VBA 27
2
captulo
Range(A15).Activate
End Sub
Sub Macro4()

Macro4 Macro
Macro gravada em 12/1/2006 por Teste

Atalho do teclado: Ctrl+Shift+S

Columns(A:F).Select
Range(A15).Activate
End Sub
H vrios elementos dignos de nota. Vejamos:
Observe que o sistema das macros uma cpia quase literal da ordem do algo-
ritmo, em que ela se baseia. A macro tem um incio, sempre definido pela abertura
de uma sub-rotina (Sub). Logo aps, so declaradas as informaes referentes
macro, incluindo as teclas de atalho que podem ser utilizadas para ativ-la;
Note que essas informaes so declaradas como comentrios; partes do cdigo
que no so lidos pelo interpretador do Visual Basic, sendo encarados como coment-
rios do cdigo. No VBA, o caractere utilizado como indicador de comentrio;
Quando declaramos a ao de selecionar as colunas (o escopo do nosso
exemplo) sempre deve ser obedecida a seguinte ordem: propriedade parmetros
evento. Na primeira linha aps os comentrios, por exemplo, temos a estrutura
Range(A:C,A:C).Select, em que utilizamos, primeiramente, a propriedade
Range para mostrar que ser definido um intervalo (range) de clulas, linhas ou
colunas, justamente declarado a seguir, entre parnteses; elemento utilizado para
isolar parmetros no VBA. O ponto aps o parntese de fechamento utilizado
para separar a declarao do parmetro da chamada do evento, que no caso
Select;
Por ltimo, preciso observar que, quando falamos em uma planilha de Ex-
cel, estamos falando de um documento sempre ativo. No existem planilhas 100%
estticas: se a planilha est aberta, mesmo que no esteja sendo editada, ela possui
ao menos um elemento (uma clula, linha, coluna ou um intervalo de clulas) ativo.
o que o final do nosso cdigo de macros mostra quando utiliza a propriedade
Range novamente, mas, desta vez, aplicada a um parmetro que representada uma
coordenada do Excel ((A15)) seguido do evento Activate. De acordo com uma
conveno informal, quando a posio de uma clula ou coordenada aps a execuo
cap02.indd 27 1/11/2006 15:46:53
28 universidade VBA
de uma macro ou script no relevante, costuma-se ancorar o final do comando no
incio da planilha, na clula A1.
Edio de macros
Como j dissemos, o gravador de macros uma boa forma de criar macros simples
sem a necessidade de editar scripts, ou mesmo sem precisar criar macros para, depois,
com o auxlio do boto Editar, observar como elas so processadas em formato de
cdigo pelo VBA (como fizemos anteriormente).
Porm, no podemos fazer a mesma observao com relao criao de scripts
complexos, com vrios parmetros ou seqncias de eventos. O que dizemos ainda
mais verdadeiro ao considerarmos (lembre-se da montagem de algoritmos) que uma
seqncia de eventos no necessariamente esttica, e pode evoluir para duas ou
mais variveis.
Mostraremos a seguir, a utilizao do editor, criando logo aps, com seu auxlio,
uma macro ainda relativamente simples.
Iniciando o uso do editor de macros
1. Abra o Microsoft Excel e selecione uma planilha. Em seguida, abra o menu
Ferramentas > Macro > Editor do Visual Basic. Tambm podemos utilizar a com-
binao de teclas Alt + F11 para abrir o Editor.
2. Ser aberta uma janela do Microsoft Visual Basic, como podemos ver na Fi-
gura 2.5. Existem, acopladas, duas janelas esquerda. janela superior chamamos
de Projeto VBAProject, e janela inferior damos o nome de Propriedades. Na
primeira, esto os elementos que fazem parte do projeto. Na segunda janela so
listadas as propriedades dos objetos que porventura podem ser incorporados s
nossas macros.
IMPORTANTE
A partir de agora, projeto deve ser entendido como o grupo de macros e de
planilhas de Excel utilizados para uma determinada funcionalidade.
cap02.indd 28 1/11/2006 15:46:53
Macros e VBA 29
2
captulo
Figura 2.5.
3. Apresentada a interface do editor, vamos dar incio sua utilizao. Para tanto,
vamos clicar no menu Inserir > Mdulo.
Observe que na janela Projeto VBAProject surge um novo diretrio, chamado
Mdulo1, ou Mdulo2, se voc est utilizando um projeto que j havia sido iniciado.
Dentro desse mdulo, sero armazenadas as macros que criaremos, a partir de
agora, para o projeto.
4. Note que tambm ser aberta, na janela central, uma janela em branco, de-
nominada Pasta1 MduloX (Cdigo). Em que X o nmero do mdulo aplicado
e a denominao Pasta1 pode ser substituda pelo nome da planilha que est sendo
utilizada. Essa janela a interface para a insero dos comandos, onde inscreveremos
os cdigos que faro parte de nossa macro.
cap02.indd 29 1/11/2006 15:46:54
30 universidade VBA
Figura 2.6.
5. Agora, vamos criar uma macro simples, que ter como funo mudar a planilha
ativa presente na tela do Excel (a conhecida planilha Plan1).
Na tela central do editor de macros, escreva o seguinte cdigo:
Sub Alterar _ Folha de dados()
Worksheets(2).Activate
End Sub
6. Entre o princpio e o final da macro, escrevemos as instrues que desejamos
que se realizem. No nosso caso, como j foi explicado, desejamos que a segunda
planilha da pasta (Plan2) torne-se a planilha ativa.
Se quisermos simplesmente guardar a macro, preciso salvar a planilha ativa com
o nome que desejamos dar macro, seguindo o menu Arquivo > Salvar <Nome da
planilha>, ou utilizando a combinao de teclas Ctrl + B.
Criamos, assim, nossa primeira macro. preciso prestar ateno, porm, a um
detalhe: ao transplantar a planilha para outro computador, ou mesmo quando tenta-
cap02.indd 30 1/11/2006 15:46:54
Macros e VBA 31
2
captulo
mos executar a macro nela contida em nosso Excel, possvel no obtermos sucesso.
O que estar acontecendo?
Esse problema ocorre devido s opes de segurana do Microsoft Office. H
no muito tempo atrs (na verdade, at meados do ano 2000), a principal forma de
contaminao de computadores por vrus e softwares maliciosos era, depois dos dis-
quetes, os documentos do Microsoft Office e suas macros. Sabendo disso, a Microsoft
criou opes de segurana para execuo de macros, que podem ser acessadas, em
qualquer programa do Office, por meio do menu Ferramentas > Macro > Segu-
rana. Em seguida, escolha a opo Baixo. A prpria opo vem inscrita como No
recomendvel, e ela o realmente: voc s deve habilit-la para testar suas prprias
macros em seu computador, ou ao se deparar com problemas para rodar macros ab-
solutamente necessrias em outros computadores tambm de sua responsabilidade.
Salvo isso, mantenha a opo de segurana em Alto.
Figura 2.7.
Vamos conferir, agora, mais alguns exemplos simples de macros. Esses exemplos
serviro como exerccios de fixao, para que voc se familiarize com a produo
de macros e botes e se prepare para os prximos captulos, em que abordaremos
macros de produo reais.
Primeiro exemplo
O objetivo da macro ser abrir uma pasta de planilhas j existente. Saiba como
constru-la:
cap02.indd 31 1/11/2006 15:46:54
32 universidade VBA
1. Abra o editor de macros clicando em Ferramentas > Macro > Editor do
Visual Basic.
2. Clique no menu Inserir > Mdulo e, depois, clique na tela de escrita do cdigo.
3. Inscreva o seguinte cdigo:
Sub AbrirPasta()
Workbooks.Open (E:\Documents and Settings\Admi-
nistrador\Meus documentos\Monitores.xls)
End Sub
Observe que colocamos o caminho do arquivo entre parnteses e aspas duplas,
justamente para mostrar para a funo Workbooks.Open que o parmetro corres-
ponde a uma coordenada que deve ser acessada; no caso, um arquivo que deve ser
aberto. Esse arquivo deve ser obrigatoriamente uma planilha de Excel. Portanto,
bancos de dados DBF, formulrios do FoxPro e mesmo outros formatos de planilha,
como o Quattro Pro, ainda que salvos no Excel e convertidos para seu formato, no
sero abertos por essa macro VBA, pois a extenso de arquivos no corresponde ao
padro do Excel (extenso .xls)
Alm disso, tanto o arquivo quanto o caminho devem existir, ou a macro nos
retornar erro (Figura 2.8):
Figura 2.8.
Dessa forma, se o arquivo for movido desse diretrio, ou se o prprio diretrio
mudar de nome, a macro deve ser atualizada manualmente. Se voc tiver dvidas
sobre o erro apresentado na macro, utilize o boto Depurar para que o erro no cdigo
seja realado em amarelo (Figura 2.9):
cap02.indd 32 1/11/2006 15:46:54
Macros e VBA 33
2
captulo
Figura 2.9.
Segundo exemplo
O objetivo dessa macro ativar uma pasta j aberta. Vejamos como estrutur-la:
1. Repita o primeiro e o segundo passos do primeiro exemplo, ou utilize a mesma
planilha do exemplo anterior para criar essa nova macro.
2. Inscreva na tela de edio do cdigo as seguintes instrues:
Sub AtivarPasta()
Workbooks(Monitor.xls).Activate
End Sub
Observe que, nessa macro, no indicamos o caminho em que se encontra o ar-
quivo, pois ele deve estar aberto (portanto, dentro da memria RAM) para que a
macro funcione.
cap02.indd 33 1/11/2006 15:46:55
34 universidade VBA
3. Como esse apenas mais um exemplo, para uma melhor organizao o ideal
seria juntar as macros do primeiro exerccio em uma nica macro, j que Activate,
obrigatoriamente, deve ser utilizado para ativar um elemento da planilha.
Terceiro exemplo
O objetivo da macro criar uma nova pasta de planilhas. Saiba como faz-la:
1. Repita o primeiro e o segundo passos do primeiro exemplo, ou utilize a mesma
planilha do exemplo anterior para criar essa macro.
2. Inscreva na tela de edio do cdigo as seguintes instrues:
Sub NovaPasta()
Workbooks.Add
End Sub
3. Se voc alterar uma planilha criada por essa macro, o Excel perguntar se deseja
salvar as alteraes. Note, portanto, que tanto a funo quanto o comportamento dessa
macro e das pastas de planilhas por ela criadas so exatamente as mesmas do boto
Novo da barra de ferramentas padro do Excel, ou da opo Novo do menu Arquivo.
Botes na barra de ferramentas
At aqui, criamos diversas macros e vimos como coloc-las em funcionamento
com o comando Macro, localizado no menu Ferramentas. Em algumas ocasies,
no entanto, pode ser necessria uma forma mais simples de acessar a macro recm-
criada, seja por sua importncia, seja pela necessidade freqente de ativ-la. Por
isso, terminaremos este captulo criando uma barra de ferramentas personalizada,
na qual ser possvel inserir todas as nossas macros.
Criao de uma nova barra de ferramentas
1. Abra o menu Exibir > Barras de ferramentas e selecione a opo Personalizar.
2. Ser aberta a janela Personalizar. Clique na aba Barra de Ferramentas e
depois em Nova.
cap02.indd 34 1/11/2006 15:46:55
Macros e VBA 35
2
captulo
3. Aparecer uma janela chamada Nova barra de ferramentas, na qual preciso
especificar o nome que daremos nossa barra. Como exemplo, podemos citar Minhas
macros ou Macros de trabalho.
4. Clique em OK e observe que a lista de barras de ferramentas disponveis
acrescida do nome que demos nossa barra. direita do nome surgir uma indica-
o, na caixa de verificao, de que essa barra est visvel.
5. Clique na aba Comandos. Na lista de categorias, selecione a opo Macros. Na
parte direita dessa mesma janela surgiro duas opes: Personalizar item de menu
e Personalizar boto. Clique em Personalizar boto.
Figura 2.10.
6. Arraste esse boto at a nova barra de ferramentas. Os botes arrastados at
ela sero anexados em tempo real barra.
7. Na janela Personalizar, clique no boto Modificar seleo e selecione a opo
Alterar imagem do boto, escolhendo, a seguir, o cone que desejar.
Figura 2.11.
cap02.indd 35 1/11/2006 15:46:55
36 universidade VBA
8. Clique novamente no boto Modificar seleo e, em seguida, na opo Nome.
D o nome que desejar ao boto de macro.
9. Clique novamente no boto Modificar seleo e selecione a opo Atribuir
macro. Aparecer uma nova janela chamada Atribuir macro. Escolha a macro que
deseja atribuir ao boto (pode ser uma das que criamos). Selecionada a macro, cli-
que em OK e feche a janela Personalizar. Nossa barra de macros est pronta, sendo
possvel adicionar outros botes, se assim desejarmos.
cap02.indd 36 1/11/2006 15:46:55
Captulo 3
Elementos e base do VBA
cap03.indd 37 1/11/2006 15:47:10
38 universidade VBA
Elementos e base do VBA
O VBA (Visual Basic for Applications) , como o prprio nome diz, um kit de criao
de scripts e aplicaes baseado no Visual Basic. Por script entendemos um conjunto
de procedimentos que conduz a uma determinada ao. Por aplicao, entendemos
um conjunto de scripts voltados para uma ou mais aes e suas facetas. Pode-se, por
exemplo, criar um script para ativar a correo ortogrfica de uma tabela, o que di-
ferente de se criar uma ferramenta de correo ortogrfica utilizando-se um conjunto
de scripts sob a tutela de uma estrutura grfica.
E ao falar em estrutura grfica que adentramos no reino do Visual Basic. O
Visual Basic uma linguagem de programao dirigida por eventos (event driven)
e um ambiente de desenvolvimento integrado (IDE Integrated Development En-
vironment). O Visual Basic permite o desenvolvimento rpido de aplicaes (RAD
Rapid Application Development) utilizando-se, para isso, da movimentao de
objetos via interface grfica (GUI Graphical User Interface). Alm disso, pos-
svel utilizar o Visual Basic para a criao de ActiveX controls. Um programador
moderadamente talentoso pode fcil e rapidamente construir uma aplicao simples
usando os componentes fornecidos com o VB.
O Visual Basic for Applications (VBA) uma linguagem baseada no Visual Basic
e voltada para a criao de macros, e est integrada a todos os produtos da famlia
Microsoft Office.
Uma macro se assemelha muito a um script: ela uma seqncia de instrues
simples cujo objetivo automatizar tarefas de pequena complexidade, enquanto
existem scripts que podem ser complexos e realizar tarefas de grande complexidade.
Podemos citar como utilidades tpicas das macros:
Abrir e fechar tabelas, perguntas, formulrios e relatrios;
Imprimir dados;
Fazer uma pergunta;
Definir valores;
Procurar dados;
Construir um menu personalizado e executar comandos de menus;
Controlar a apresentao e o foco;
Executar outra aplicao.
O VBA trabalha com a criao de macros de duas maneiras diferentes: pelo ar-
mazenamento do cdigo da macro em mdulos, ou como parte de um Formulrio
ou Relatrio.
cap03.indd 38 1/11/2006 15:47:10
Elementos e base do VBA 39
3
captulo
Mdulos e seus elementos
Um mdulo um conjunto de declaraes seguido de procedimentos. As instrues
de declarao so utilizadas para nomear e definir procedimentos, variveis, matrizes
e constantes estas, portanto, declaram que algo vai ser evocado, de forma direta,
pelo cdigo. A declarao costuma ser direcionada, via de regra, para procedimentos,
porque so eles os responsveis diretos pelo movimento de finalizao a seqncia de
aes lgicas para que um cdigo ou programa atinja o fim para o qual foi criado.
Um procedimento uma seqncia lgica de instrues executadas como uma
unidade. Um nome de procedimento sempre definido em termos de mdulo, como
por exemplo quando um mdulo iniciado, e ao mesmo tempo nomeado, por Sub.
Todo cdigo executvel deve estar contido em um procedimento. Procedimentos no
podem ser aninhados dentro de outros procedimentos.
O exemplo a seguir contm trs declaraes:
Sub ApplyFormat()
Const limite As Integer = 33
Dim minhaClula As Range
Mais instrues
End Sub
A instruo Sub (com a instruo End Sub correspondente) declara um procedimen-
to nomeado ApplyFormat. Todas as instrues entre as instrues Sub e End Sub sero
executadas sempre que o procedimento ApplyFormat for chamado ou executado.
Variveis
Em algumas situaes e cdigos mais complexos, uma instruo pode conter uma
varivel. As variveis so, do ponto de vista lgico, um local de armazenamento no-
meado que pode conter dados, os quais podem ser modificados durante a execuo
do programa. Do ponto de vista lgico, as variveis funcionam como potncias: elas
armazenam situaes ou recursos que podem ser utilizados, mas que s se transformam
em atos quando evocados pelo interpretador da linguagem de programao.
Cada varivel possui um nome que a identifica com exclusividade dentro de seu escopo.
Convencionou-se que os nomes de variveis devem comear com um caractere alfabtico,
devem ser exclusivos dentro do mesmo escopo, no podem ter mais de 255 caracteres e
tambm no podem conter um ponto ou caractere de declarao de tipo incorporado.
cap03.indd 39 1/11/2006 15:47:10
40 universidade VBA
O tempo durante o qual uma varivel retm o seu valor conhecido como a sua
vida til. O valor de uma varivel pode mudar no decorrer da sua vida til, mas ela re-
tm algum valor. Quando uma varivel perde o escopo, ela deixa de ter um valor.
Quando voc declara uma varivel de objeto, o espao reservado na memria,
mas o seu valor definido como Nothing at voc atribuir uma referncia de objeto
a ele atravs da instruo Set.
Caso o valor de uma varivel no seja alterado durante a execuo do seu cdigo,
ela reter o valor inicial at perder o escopo. Caso os procedimentos chamem outros
procedimentos, a varivel reter o seu valor enquanto esses procedimentos tambm
estiverem sendo executados.
Quando tem incio a execuo de um procedimento, todas as variveis so inicia-
das. Uma varivel numrica iniciada como zero, uma seqncia de caracteres de
comprimento varivel iniciada como uma seqncia de caracteres de comprimento
zero () e uma seqncia de caracteres de comprimento fixo preenchida com o
caractere representado pelo cdigo de caractere ASCII 0 ou Chr(0).
Se existirem muitos dados a se trabalhar dentro de um cdigo, pode-se utilizar o
sistema de matriz. Uma matriz uma varivel nica com muitos compartimentos para
armazenar valores, enquanto uma varivel tpica tem somente um compartimento
de armazenamento, no qual pode armazenar somente um valor. Uma matriz pode
ser declarada para trabalhar com um conjunto de valores do mesmo tipo de dados,
assim como pode ser utilizada para fazer referncia a todos os valores que contm,
assim como a valores individuais. Cada elemento de uma matriz possui um nmero
de ndice identificador exclusivo. As alteraes feitas em um elemento de uma matriz
no afetam os outros elementos.
Formulrios
Um formulrio um tipo de objeto de banco de dados usado principalmente
para inserir ou exibir dados em um banco de dados, e funciona, portanto, como uma
interface entre o banco de dados ao qual est ligado e a aplicao que sua usuria.
Em alguns casos, formulrios tambm podem ser utilizados para manipular um
conjunto de dados esparsos (nomes de funcionrios em uma planilha, uma lista de
cores) e no um banco de dados na concepo exata do termo.
Um formulrio tambm pode ser usado como um menu de controle que abre outros
formulrios e relatrios no banco de dados, ou como uma caixa de dilogo personalizada
que aceita entrada de usurio e executa uma ao com base nessa mesma entrada. Boa
parte das implementaes para VBA feita seguindo esses dois ltimos modelos.
Cada formulrio deve possuir, portanto, uma base ou fonte de registro. A fonte
do registro de um formulrio refere-se aos campos nas tabelas e consultas base. Um
cap03.indd 40 1/11/2006 15:47:10
Elementos e base do VBA 41
3
captulo
formulrio no precisa conter todos os campos de cada uma das tabelas ou consultas
em que se baseia.
O vnculo entre um formulrio e sua respectiva fonte de registro d-se atravs de
objetos grficos chamados controles. O tipo mais comum de controle utilizado para
exibir e inserir dados a caixa de texto.
Controles
Quando criamos uma aplicao VBA utilizando formulrios, inserimos nesta
os controles que facilitaro a entrada e sada de dados ou informaes criamos,
portanto, uma interface de comunicao. Dentro do arsenal de recursos do VBA, a
coleo de objetos responsvel pela construo de controles chama-se Controls.
Nessa coleo cada objeto possui um ndice exclusivo cujo valor pode ser um
nmero inteiro ou uma seqncia. O valor de ndice do primeiro controle de uma
coleo 0, o do segundo controle 1, e assim por diante. Esse valor indica a ordem
na qual os controles foram adicionados coleo.
Se o ndice for uma cadeia, representar o nome do controle. A propriedade Name
de um controle especifica tambm um nome de controle.
Voc pode utilizar a coleo Controls para enumerar ou contar controles indivi-
duais e para definir suas propriedades. Por exemplo, voc pode enumerar a coleo
Controls de um determinado formulrio e definir a propriedade Height de cada
controle com um valor especfico.
No VBA a manipulao de controles feita de forma mista, ou seja, arranjando
os dados graficamente, ao mesmo tempo em que se faz ajustes finos na estrutura de
alguns controles com o auxlio de cdigo escrito e scripts.
O conjunto de controles disponveis no VBA forma a entidade chamada Caixa
de Ferramentas, de onde podemos retirar as unidades. Uma Caixa de Ferramentas
diferente de um conjunto de controles conceitual ou logicamente relacionado:
controles conceituais geralmente so visualizados juntos, mas no necessariamente
afetam uns aos outros, enquanto os controles logicamente relacionados afetam uns
aos outros. Por exemplo, configurar um boto em um grupo de botes de opo con-
figura o valor de todos os outros botes no grupo como Falso. Da mesma maneira,
escolher uma cor dentre uma lista proposta em uma caixa de listagem com opo
nica faz com que todas as outras cores sejam descartadas do processo.
No decorrer deste livro sero implementados projetos utilizando tanto a estrutura
de mdulos (sobretudo quando se tratar do Microsoft Excel) quanto a de formulrios
(ao lidarmos com o Microsoft Access e o Outlook).
cap03.indd 41 1/11/2006 15:47:11
cap03.indd 42 1/11/2006 15:47:11
Recursos de programao VBA 43
4
captulo
Captulo 4
Recursos de programao VBA
cap04.indd 43 1/11/2006 15:47:25
44 universidade VBA
Estrutura
Estando familiarizado com os conhecimentos tericos que um programador deve
ter, e tambm com os mecanismos de produo de macros e cdigos do VBA, chegou
o momento de trabalhar diretamente com os comandos de VBA.
A estrutura dos cdigos VBA, como j dissemos anteriormente, organizada na
forma propriedade parmetros evento. Ou seja, em toda a linha do VBA so de-
finidas, em primeiro lugar, as propriedades que vamos utilizar, depois os parmetros
com os quais ser aplicada a propriedade e, por ltimo, o evento que deve resultar
da juno dos dois elementos anteriores.
Porm, tambm podemos pensar o VBA como uma estrutura modular (formada
por mdulos). A estrutura de mdulos, ou modulada, consiste na construo de
programas ou cdigos extensos por meio da diviso em etapas menores, que so os
mdulos ou subprogramas.
A primeira dessas etapas, por onde comea a execuo do trabalho, recebe o
nome de programa principal, ao passo que as outras so os subprogramas propria-
mente ditos, executados sempre que ocorre uma chamada, o que feito por meio
da especificao de seus nomes. Utilizar subprogramas, como faz o VBA, traz
inmeras vantagens:
Economia de cdigo;
Desenvolvimento modular, em que se pensa no algoritmo por partes;
Facilidade de depurao (correo e acompanhamento);
Facilidade para alterao do cdigo;
Generalidade de cdigo com o uso de parmetros: algoritmos so escritos para
situaes genricas.
H duas espcies de subprogramas: o procedimento e a funo.
Procedimento
Um subprograma do tipo procedimento um programa que tem vida prpria,
mas que, para ser processado, tem que ser solicitado pelo programa principal que o
armazena, por outro subprograma, ou por ele mesmo. Basicamente, um procedimento
funciona da seguinte maneira:
Public Static Sub <nome do procedimento()
declarao dos objetos locais ao Procedimento
cap04.indd 44 1/11/2006 15:47:26
Recursos de programao VBA 45
4
captulo
comandos do Procedimento
End Sub
Funes
Alm dos procedimentos, temos as funes. As funes so, na verdade, micro-
programas evocados dentro de um programa maior (no nosso caso, um cdigo VBA)
e so utilizados para adicionar funcionalidades a um cdigo, sem carreg-lo com
divises de cdigo. Isso possvel, pois as funes funcionam como materiais pr-
fabricados empregados na construo de casas: eles esto ali, mo, prontos para
serem utilizados, e basta combin-los da forma desejada para que eles funcionem.
Observe, a seguir, a estrutura de uma funo:
Function Nom(..) As ..



End Function
No parntesis ao lado do nome da funo, temos de inserir os argumentos da
funo e declar-los. Tais argumentos so sempre nmeros ou conjuntos de vari-
veis numricas.
Os argumentos de uma funo so os valores necessrios para que ela possa ser
executada. Se executssemos uma funo parecida com Media(2,3) habilitaramos
a funo Media para indicar a utilizao dos valores n1=2 y n2=3 como argu-
mentos de execuo.
Uma funo sempre retorna algum valor como resultado, sendo que o valor que
desejamos obter deve ser declarado no cdigo da funo. Se quisssemos, por exemplo,
criar uma funo que nos desse o produto de dois nmeros multiplicados por dois, seria
preciso declarar essa inteno utilizando o argumento As Double ( o dobro).
Para que isso ocorra, a construo da funo deve conter a relao entre os argu-
mentos de entrada e o valor de sada (a mdia, em nosso caso). Esse tipo de trabalho
pode ser feito utilizando a seguinte expresso matemtica:
Media = (n1 + n2) / 2
No decorrer do livro,entraremos em contato com exemplos mais prticos de
procedimentos e funes.
cap04.indd 45 1/11/2006 15:47:26
46 universidade VBA
Criao de variveis no Visual Basic
Uma varivel um objeto criado pelo usurio no qual podemos introduzir valores
que sero utilizados em clculos ou em outros tipos de procedimentos.
Para criar uma varivel em um programa VBA, no Editor do Visual Basic, siga
o menu Ferramentas > Opes > Editor. Em seguida, selecione a opo Requerer
declarao de varivel e, logo aps, clique em OK.
A partir desse momento, a primeira linha de cada mdulo passar a se chamar
Option Explicit e ser preciso declarar a varivel a ser criada mediante o
seguinte cdigo:
Dim varMinhaVarivel as String
Esse cdigo far com que o VBA reconhea todas as variveis criadas, indi-
cando, ao mesmo tempo, uma instruo que contenha um erro de ortografia ou
de execuo.
Tipos de variveis
Para declarar uma varivel no incio de cada procedimento, deve-se definir o tipo
de varivel, escrito apenas com letras maisculas. Existem, essencialmente, quatro
tipos principais de variveis: String, Double, Date e Variant. importante frisar
que elas podem conter diversas outras variveis especializadas.
String
Para conjuntos com at 65.000 caracteres (texto). Utiliza-se esse tipo de varivel
para conjuntos de caracteres, incluindo a definio de repositrios locais (C:\. D:\)
ou de rede (\\192.168.1.20, \\josejoaquim), nomes de arquivos (gastos.xls), endereos
de clulas ($A$1$) e todos os elementos de texto ou sobre os quais no efetuaremos
clculo. o equivalente VBA das strings que definem as propriedades das clulas de
uma planilha do Excel: no possvel fazer clculos com clulas de texto, ao mesmo
tempo em que no se pode utilizar funes de texto em clulas numricas.
Double

Varivel aplicada em nmeros com ou sem casas decimais. Double uma vari-
vel genrica capaz de comportar muitas outras variveis especializadas, que sero
vistas adiante.
cap04.indd 46 1/11/2006 15:47:26
Recursos de programao VBA 47
4
captulo
Bytes

As variveis Byte so armazenadas como nmeros de 8 bits (1 byte), sem sinal,
nicos, que variam, em valor de 0 a 255. O tipo de varivel Byte til para conter
dados binrios (0 e 1).
Integer
As variveis Integer so armazenadas como nmeros de 16 bits (2 bytes) com
valor no intervalo de -32.768 a 32.767. O caractere de declarao de tipo para In-
teger o sinal de porcentagem (%).
As variveis Integer tambm podem ser usadas para representar valores enu-
merados. Um valor enumerado pode guardar um conjunto finito de nmeros intei-
ros exclusivos, cada um com um significado especial no contexto em que usado.
Valores enumerados oferecem uma forma conveniente de seleo entre um nmero
conhecido de opes em um formulrio. Por exemplo, preto = 0, branco = 1 e
assim por diante. Pode-se definir constantes mediante a instruo CONST para cada
valor enumerado.
Long
As variveis Long (inteiro longo) so armazenadas como nmeros de 32 bits (4
bytes), sinalizados, no intervalo de -2.147.483.648 a 2.147.483.647. O caractere de
declarao de tipo para Long o e comercial (&).
Single
As variveis Single (vrgula flutuante de preciso simples) so armazenadas
como nmeros de vrgula flutuante com 32 bits (4 bytes), e tm um valor no inter-
valo de -3,402823E38 a -1,401298E-45 para valores negativos e de 1,401298E-45 a
3,402823E38 para valores positivos. O caractere de declarao de tipo para Single
o ponto de exclamao (!). Single a ltima das strings usadas para representar
valores numricos armazenados dentro da varivel Double.
Date
Varivel utilizada para a declarao de datas. As variveis Date so armazenadas
como nmeros de ponto flutuante de 64 bits (8 bytes) responsveis por representar as
datas que variam de 1 de janeiro do ano 100 a 31 de dezembro de 9999, abrangendo
tambm as horas de 0:00:00 a 23:59:59, segundo o modelo internacional de 24 horas.
cap04.indd 47 1/11/2006 15:47:27
48 universidade VBA
Qualquer valor reconhecvel e literal de data (no representado de maneira exclusi-
vamente numrica) pode ser atribudo a variveis Date. Os literais Date devem estar
entre sinais (#), por exemplo, #1 de janeiro de 1993# ou #1 jan 93#.
As variveis Date exibem as datas de acordo com o formato reconhecido por seu
computador, assim como as horas (12 ou 24 horas). Para mais informaes sobre
como operar a configurao de data e hora, leia o tpico Configuraes de data e
hora, neste mesmo captulo.
As datas manipuladas pela varivel esto localizadas, normalmente, nas clulas
das planilhas. possvel, portanto, copiar o contedo das clulas para o interior da
varivel Date sem prejuzo nenhum no desenrolar do cdigo.
Variant
O tipo de varivel Variant utilizado para todas as variveis no explicitamente
declaradas como de algum outro tipo (usando instrues como Dim, Private, Pu-
blic ou Static). O tipo de dados Variant no possui caractere de declarao.
Uma Variant um tipo especial de varivel que pode guardar qualquer dado,
exceto dados String de comprimento fixo. Uma Variant tambm pode conter os
valores especiais Empty, Error, Nothing e Null. possvel determinar como os da-
dos em uma Variant so tratados mediante as funes VarType ou TypeName.
Os dados numricos podem ter qualquer valor de nmero inteiro ou real no
intervalo de -1,797693134862315E308 a -4,94066E-324 para valores negativos e de
4,94066E-324 a 1,797693134862315E308 para valores positivos. Geralmente, os dados
numricos Variant so mantidos em seu tipo original no interior da varivel.
Variant pode ser utilizado em cdigos que guardam uma grande quantidade
de clculos a serem processados, pois essa varivel capaz de trabalhar com mais
de 4000 clculos por vez.
Configuraes de data e hora
Para fazer alteraes na forma como seu sistema operacional trabalha com par-
metros de data e hora, abra o menu Iniciar > Configuraes > Painel de controle >
Opes regionais > Geral. Em seguida, clique em Ingls (Estados Unidos) e, depois,
em Aplicar, se deseja utilizar o modelo americano, que divide o dia em duas partes
iguais, representadas por AM (horas do dia) ou PM (horas da noite).
As configuraes para as horas podem ser feitas por meio das configuraes da
aba Hora. Na seo Formato de hora, podemos especificar de que maneira a hora
atual ser exibida na tela. A programao pode ser feita manualmente, por meio da
digitao de combinaes de letras e smbolos:
cap04.indd 48 1/11/2006 15:47:27
Recursos de programao VBA 49
4
captulo
Tabela 4.1.
No preciso programar configuraes no separador ou no smbolo de visuali-
zao das horas, pois estes so padres internacionais.
Agora, vamos implementar as configuraes de data. Para tanto, ainda em Opes
regionais, selecione a aba Data.
Para
Exibir a hora em um formato
de 24 horas.
Exibir a hora em um formato
de 12 horas.
Suprimir a exibio de zeros
esquerda em segundos, minu-
tos ou horas em um dgito.
Exibir uma nica letra para
indicar AM ou PM.
Exibir duas letras para indicar
AM ou PM.
Exibir texto.
Digite
Digite H ou HH para a hora. Uma s letra H mostrar a hora no
formato de um nico dgito (por exemplo, 9). Duas letras mos-
traro a hora no formato de dois dgitos (por exemplo, 09).
Digite h ou hh para a hora. Uma s letra h mostrar a hora no
formato de um nico dgito (por exemplo, 9). Duas letras mos-
traro a hora no formato de dois dgitos (por exemplo, 09).
Digite um nico H, em letra maiscula ou minscula, como,
por exemplo, em H:m:s.
Digite um t minsculo no final da declarao dos valores,
como por exemplo em HH:mm:ss t.
Digite tt minsculos no final da declarao dos valores, como
por exemplo em HH:mm:s tt.
Digite aspas simples () ao redor do texto.
Figura 4.1.
Na seo Calendrio, possvel configurar como o sistema vai se comportar quan-
do um ano for digitado com apenas dois dgitos. Existe uma limitao de 100 anos
cap04.indd 49 1/11/2006 15:47:27
50 universidade VBA
no complemento de datas abreviadas do Windows, que estabelece, por padro, que
apenas os anos entre 1930 e 2029 so reconhecidos. Para modificar essa configurao,
basta ir segunda caixa da seo em que est o valor 2029, alterando-o por um valor
de sua escolha. Note que o primeiro valor tambm alterado. Dessa forma, se alte-
rarmos 2029 para 2050, o nmero anterior ser imediatamente alterado para 1951.
Na seo Data abreviada, mais precisamente na linha Exemplo de data abreviada,
nos exibida a forma como uma data abreviada ser mostrada no sistema. Esse layout
afeta diretamente a maneira como as datas sero mostradas em um aplicativo VBA.
O modo como a data abreviada exibida pode ser alterado reconfigurando a linha
Formato de data abreviada de acordo com os parmetros seguintes:
Para
Exibir nmeros de um dgito
sem um zero esquerda.
Exibir zeros esquerda com
nmeros de um dgito.
Exibir os dois ltimos dgitos
do ano.
Exibir quatro dgitos para o
ano.
Exibir abreviaes para o dia
ou ms.
Exibir o nome completo do
dia ou ms.
Exibir texto adicional.
Digite
Digite um nico caractere. Digite d para o tipo de configurao
referente ao dia, digite a para a configurao referente ao ano
e M para a configurao referente ao ms. Assim, por exemplo,
para produzir uma data como 9/9/9, digite d/M/a.
Digite dois caracteres. Digite dd para a configurao referente
ao dia, digite aa para a configurao referente ao ano e MM para
a configurao referente ao ms. Por exemplo, para produzir
09/06/06, digite dd/MM/aa.
Digite aa para a configurao referente ao ano.
Digite aaaa para a configurao referente ao ano. Por exemplo,
para obter 10/12/2005, digite dd/MM//aaaa.
Digite trs caracteres. Digite ddd para a configurao referente
ao dia e MMM para a configurao referente ao ms. Dessa
forma, se voc pretende que uma quarta-feira, dia 18 do ms
de janeiro de 2006, surja como quarta 18/jan/2006, digite
ddd/MMM/aaaa.
Digitar quatro caracteres. Digite dddd para a configurao
referente ao dia e MMMM para a configurao do ms. Assim, se
voc deseja que 10/02/2007 seja mostrado como quinta-feira,
10 de fevereiro de 2007, digite dddd/MMMM/aaaa.
Digite aspas simples () ao redor do texto.
Tabela 4.2.
Loops
Com as instrues de estrutura (tambm chamadas de estruturas de controle),
podemos criar cdigos no Visual Basic capazes de tomar decises e repetir aes. No
Captulo 1, Introduo lgica de programao, ao falarmos sobre algoritmos discor-
cap04.indd 50 1/11/2006 15:47:28
Recursos de programao VBA 51
4
captulo
remos sobre a necessidade de utilizar estruturas de repetio na produo de solues
que demandam a repetio contnua de procedimentos ou a escolha entre duas ou
mais variveis, seguida do reposicionamento do cdigo em posio original.
Se precisarmos repetir o cdigo, podemos utilizar o loop, permitindo a execuo
de um grupo de instrues repetidamente. Alguns loops repetem instrues at que
uma condio seja False (Falso), ao passo que outros repetem as instrues at
uma condio ser True (Verdadeiro). Tambm h loops que repetem instrues um
nmero especfico de vezes ou em cada objeto de uma coleo.
Do...Loop

Quando precisamos de um loop que persista at que uma condio seja True,
utilizamos a instruo Do...Loop. Na forma de uma instruo simples, ele pode ser
utilizado para continuar a execuo de uma macro de forma indiscriminada, como
mostramos agora, no tpico Exerccio 1:
Exerccio 1
1. Abra uma planilha do Excel e preencha-a com os seguintes dados:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A
Max
20
22
27
29
25
25
24
23
22
21
27
20
22
26
23
29
27
28
25
B
Min
17
21
23
20
21
16
17
20
26
21
16
17
20
18
23
21
22
20
C
Media
D
Data
01/03/2001
02/03/2001
03/03/2001
04/03/2001
05/03/2001
06/03/2001
07/03/2001
08/03/2001
09/03/2001
10/03/2001
11/03/2001
12/03/2001
13/03/2001
14/03/2001
15/03/2001
16/03/2001
17/03/2001
18/03/2001
19/03/2001
Tabela 4.3.
2. Agora, utilize o atalho Alt + F11 para acessar o editor de VBA em uma pla-
nilha em branco.
cap04.indd 51 1/11/2006 15:47:28
52 universidade VBA
3. Dentro da janela do editor, insira o cdigo de loop que exibimos a seguir. Os co-
mentrios assinalados com (apstrofo simples) so indicaes nossas e as utilizamos
apenas para documentar o cdigo, introduzindo informaes sobre novos conceitos.
Sub Loop1()
O loop ir apenas at a clula seguinte da coluna, de cima
para baixo, caso os parmetros estabelecidos sejam cumpridos
(True). Do contrrio, o processo de migrao para a prxima
coluna ser interrompido.
Do
Do utilizado para especificar o que devemos fazer em um
determinado caso. Em um loop, Do tem a funo de condicional,
sendo utilizado para definir a condio True da estrutura.
ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2])
ActiveCell.FormulaR1C1 indica que a macro comear a ser
utilizada em conjunto com a frmula R!C!, pertencente fun-
o Average (Mdia, na verso em portugus do Excel). A cada
vez que o clculo da mdia for realizado pela presena dos
dados, o looping ser executado, repetindo a utilizao da
frmula na prxima clula da coluna.
ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActiveCell.Offset(0, 1))
estabelecido que deve haver um loop a partir da clula
ativa (ActiveCell) direcionada; utiliza-se a funo Offset
para indicar direcionamento. Os parnteses aps Offset indi-
cam as coordenadas que sero aplicadas no direcionamento. Na
forma (1,0), 1 indica que o looping sempre deslocar a formula
uma linha abaixo da clula atualmente ativa e 0 indica que
o deslocamento ser na mesma coluna.
End Sub
cap04.indd 52 1/11/2006 15:47:28
Recursos de programao VBA 53
4
captulo
4. Inscrito o cdigo ( claro que podemos omitir os comentrios), volte para a
planilha em que voc inseriu os dados, selecione a clula C2 e utilize o atalho Alt +
F8, rodando a macro criada logo em seguida.
possvel utilizar essa macro para criar planilhas que calculem diariamente a
cotao de uma moeda, como por exemplo juros mensais ou os rendimentos de um
determinado conjunto de papis no mercado de aes.
Do...While

Para verificar se a condio verdadeira ou falsa, utilizamos a palavra-chave
While>. A princpio, While era a instruo utilizada para criar sistemas de loop
em programas at que uma opo fosse dada como True. Como loop, no entanto,
uma soluo mais estruturada, convencionou-se empregar While como uma ncora
para a chamada de True. A sintaxe da expresso :
While condition[statements]
Loop
A sintaxe da instruo While possui as seguintes partes:
Parte
condition
statements
Descrio
Obrigatria. Expresso numrica ou expresso de seqncia avaliada como
True ou False. Se condition for Null, ser tratada como False, de acordo
com as regras da lgica da programao, que estabelecem que um valor nulo,
equivalente a 0, costuma ser um valor False.
Opcional. Uma ou mais instrues executadas enquanto a condio for True.
Na verdade, no h muito sentido em criar uma funo While sem a presena
dos statements.
Tabela 4.4.
No tpico seguinte, utilizaremos a funo While para definir um loop at o
ponto em que uma condio no seja mais verdadeira (True), ou seja, aparea como
False. Na prtica, ela faz a mesma coisa que a macro do tpico Exerccio 1, mas,
desta vez, procura por uma condio verdadeira na coluna ao lado, e no na clula
abaixo, localizada na mesma coluna.
cap04.indd 53 1/11/2006 15:47:28
54 universidade VBA
Exerccio 2
1. Abra uma planilha do Excel e preencha-a com os mesmos dados exibidos no
tpico Exerccio 1.
2. Em seguida, abra o editor do Visual Basic e digite o seguinte cdigo (os co-
mentrios, novamente, so nossos):
Sub Loop2()
Este loop roda enquanto existir um valor verdadeiro na
coluna ao lado
Do While IsEmpty(ActiveCell.Offset(0, 1)) = False
Do While utiliza aqui a funo IsEmpty, empregada para
retornar um valor booleano (0 ou 1, Verdadeiro ou Falso) que
indica se uma varivel foi iniciada. No caso anterior, ele s
ser executado se as coordenadas expressas (0,1) equivalerem
mesma linha utilizada atualmente na planilha, conferindo,
porm, os dados presentes na coluna seguinte.
ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2])
ActiveCell.Offset(1, 0).Select
Loop
End Sub
3. Salve a macro. V at a planilha editada anteriormente, posicione o cursor
sobre a clula C2 e rode a macro que acabamos de criar.
For...Next

A funo For...Next utiliza um contador para executar instrues um deter-
minado nmero de vezes. A sintaxe do comando a seguinte:
cap04.indd 54 1/11/2006 15:47:29
Recursos de programao VBA 55
4
captulo
For counter = start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]
Em que:
counter uma instruo obrigatria, empregada como um contador dos loops
que sero realizados. A varivel no pode ser um valor booleano nem uma matriz;
start o valor inicial de counter;
end o valor final de counter, o momento em que o loop ser interrompido;
Step o valor da alterao do contador sempre que passar pelo loop. Se Step
no for especificado, o padro ser 1 (um).
O exerccio seguinte mostra um loop criado com a instruo For...Next e capaz
de avanar por dez clulas at ser interrompido.
Exerccio 3
1. Abra qualquer planilha do Excel como, por exemplo, a planilha em que inse-
rimos os dados dos modelos anteriores. Depois, abra o editor de VBA.
2. Crie um novo mdulo, clicando com o boto direito do mouse na pasta Mdulos,
localizada direita da tela, e seguindo o menu Inserir > Novo mdulo.
3. Escreva na janela do novo mdulo o seguinte cdigo:
Sub Accumulate()
Dim n As Integer
Dim t As Integer
A funo Dim, utilizada para definir e armazenar variveis
define que o valor n um dado Integer. Nesse caso, utilizamos
Integer para especificar um conjunto de valores enumerados.
A mesma observao vale para Dim trabalhando com a varivel
t, na linha seguinte.
For n = 1 To 10
t = t + n
cap04.indd 55 1/11/2006 15:47:29
56 universidade VBA
Note que n, ao mesmo tempo em que uma varivel, ser
utilizado como contador por For. Definimos o Start da conta-
gem como 1, e o End como 10. Na mesma linha, definimos que o
produto ser igual ao valor do produto da linha anterior mais
n. O valor de n iniciado com 1 e vai at 10.
Next n
Next a segunda parte do comando de loop. nele que
estabelecemos em que resultar o loop
MsgBox O total & t
MsBox o objeto padro do VBA utilizado para criar caixas
de texto na tela. Os textos apresentados no box devem ficar
entre parnteses. O & (e comercial) utilizado como aglu-
tinador do texto, ligando-o ao resultado obtido pela soma da
ltima clula contabilizada pelo counter do looping.

End Sub
4. Grave a macro e execute-a em uma planilha qualquer. O resultado ser seme-
lhante ao mostrado na Figura 4.2:
Figura 4.2.
Condies lgicas:
If...Then...Else /Select Case
Todos os loops exibidos anteriormente so artifcios simples, mesmo quando traba-
lham com condicionais. No vimos, mesmo ao trabalhar com For...Next, escolhas
condicionais alm da interrupo de um loop, caso uma coluna no corresponda a
um determinado parmetro.
Muito mais complexo, e muito mais til para uma planilha de dados com o Excel,
fazer com que o loop deixe de lado o preenchimento de clulas que no correspondem
a um determinado requisito, ou que tenham um valor nulo, mas, ao mesmo tempo
cap04.indd 56 1/11/2006 15:47:29
Recursos de programao VBA 57
4
captulo
conte com a opo de continuar se repetindo nas clulas posteriores s clulas com
contedo False. Um looping desse tipo pode ser obtido com o auxlio da instruo
If...Then...Else (traduzindo, Se... Ento... De outra maneira).
Essa instruo executa condicionalmente um grupo de instrues, de acordo com
o valor de uma expresso, e obedece seguinte sintaxe:
If condition Then [statements] [Else elsestatements]
Tambm possvel inserir a sintaxe em forma de bloco:
If condition Then[statements]
[ElseIf condition-n Then[elseifstatements] ...
[Else[elsestatements]]
End If
Em qualquer caso, cada um dos elementos corresponde ao seguinte:
condition um ou mais dos dois tipos de expresso seguintes. Essa expresso
pode ser numrica, avaliada como True ou False. Se condition for Null, ser
tratada como False;
statements opcional na forma de bloco e obrigatria na forma de uma linha
que no tenha clusula Else (De outra maneira). Suporta uma ou mais instrues
separadas por dois-pontos, que sero executadas se condition for True;
condition-n> opcional, j que igual a condition;
elseifstatements opcional e define se uma ou mais instrues sero
executadas se a condition-n associada for True;
elsestatements opcional e define se uma ou mais instrues sero
executadas se nenhuma expresso condition ou condition-n anterior
for True.
No Exerccio 4, veremos uma implementao simples de cdigo utilizando somente
a instruo If. Nele, faremos com que seja retornado erro caso uma clula esteja
vazia, ou seja, caso tenha contedo False ou Null.
Exerccio 4
1. Abra uma nova planilha do Excel e preencha-a com os dados apresentados,
ou com dados parecidos:
cap04.indd 57 1/11/2006 15:47:29
58 universidade VBA
Tabela 4.5.
2. Em seguida, abra o editor de VBA, crie um novo mdulo e digite o seguin-
te cdigo:
Sub Loop4()

Do
If IsEmpty(ActiveCell) Then
Incio da condicional: Se a clula estiver ocupada (com
contedo), ento a condio de prosseguimento ser satisfeita.
ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2])
End If
End If marca o fim da condio
ActiveCell.Offset(1, 0).Select
A clula que deve ser selecionada como ativa a da linha
seguinte clula atual, na mesma coluna.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A
Max
20
22
27
29
25
27
20
22
26
23
29
27
28
25
B
Min
16
17
21
23
20
21
16
17
20
18
23
21
22
20
C
Media
D
Data
01/03/2001
02/03/2001
03/03/2001
04/03/2001
05/03/2001
06/03/2001
07/03/2001
08/03/2001
09/03/2001
10/03/2001
11/03/2001
12/03/2001
13/03/2001
14/03/2001
15/03/2001
16/03/2001
17/03/2001
18/03/2001
19/03/2001
cap04.indd 58 1/11/2006 15:47:30
Recursos de programao VBA 59
4
captulo
Loop Until IsEmpty(ActiveCell.Offset(0, 1))
O loop ser executado se uma clula na mesma linha, mas
na coluna seguinte, estiver ocupada.
End Sub
3. Salve o cdigo e v para a planilha que foi criada no primeiro passo. Selecione
a clula C2 e rode a macro criada (Loop4). O resultado ser parecido com o que
mostramos a seguir:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A
Max
20
22
27
29
25
27
20
22
26
23
29
27
28
25
B
Min
16
17
21
23
20
21
16
17
20
18
23
21
22
20
C
Media
18,00
19,50
24,00
26,00
22,50
#DIV/0!
#DIV/0!
#DIV/0!
#DIV/0!
#DIV/0!
24,00
18,00
19,50
23,00
20,50
26,00
24,00
25,00
22,50
D
Data
01/03/2001
02/03/2001
03/03/2001
04/03/2001
05/03/2001
06/03/2001
07/03/2001
08/03/2001
09/03/2001
10/03/2001
11/03/2001
12/03/2001
13/03/2001
14/03/2001
15/03/2001
16/03/2001
17/03/2001
18/03/2001
19/03/2001
Tabela 4.6.
Como podemos notar, as linhas em que no havia dados apresentaram erro du-
rante o looping. Isso ocorreu porque a condio estabelecida (If...Then) foi a de
que a frmula seria aplicada repetidamente em cada clula ocupada.
Para que as mensagens de erro no surjam na planilha, fazendo com que as c-
lulas vazias simplesmente sejam ignoradas, utilizaremos no Exerccio 5 a instruo
If...Then.
Exerccio 5
1. Com a planilha montada anteriormente, abra o editor do VBA e produza a
macro seguinte. Lembre-se de que os comentrios () so apenas indicaes sobre
determinados pontos do programa e, portanto, no fazem parte do cdigo:
cap04.indd 59 1/11/2006 15:47:30
60 universidade VBA
Sub Loop5()
Do
If IsEmpty(ActiveCell) Then
Se a clula est ativa na mesma linha, mas est ocupada
na coluna anterior, ento...
If IsEmpty(ActiveCell.Offset(0, -1)) And
IsEmpty(ActiveCell.Offset(0, -2)) Then
ActiveCell.Value =
Se a clula est ativa na mesma linha, mas nas duas colunas
anteriores (0,-1) e (0,-2), no est ocupada por dados, ento
a clula preenchida por um espao vazio, definido por .
Note que aqui utilizada uma condio (If) dentro de outra.
Else
ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2])
Aqui, utilizamos a condio Else (De outra maneira). Se
nenhuma das condies do comando anterior for satisfeita,
passa-se para a situao em que se utiliza a funo de cl-
culo da Mdia normalmente.
End If
End If
Terminam aqui as condicinais If.
ActiveCell.Offset(1, 0).Select
Loop Until IsEmpty(ActiveCell.Offset(0, 1))
Enfim, aplica-se o loop mostrado nos exerccios anteriores
para o deslocamento das clulas da coluna seguinte.
End Sub
cap04.indd 60 1/11/2006 15:47:30
Recursos de programao VBA 61
4
captulo
2. Salve a macro e, na planilha, ative a clula C2. Em seguida, ative a macro
Loop5. Note o que ocorre:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A
Max
20
22
27
29
25
27
20
22
26
23
29
27
28
25
B
Min
16
17
21
23
20
21
16
17
20
18
23
21
22
20
C
Media
18,00
19,50
24,00
26,00
22,50
24,00
18,00
19,50
23,00
20,50
26,00
24,00
25,00
22,50
D
Data
01/03/2001
02/03/2001
03/03/2001
04/03/2001
05/03/2001
06/03/2001
07/03/2001
08/03/2001
09/03/2001
10/03/2001
11/03/2001
12/03/2001
13/03/2001
14/03/2001
15/03/2001
16/03/2001
17/03/2001
18/03/2001
19/03/2001
Tabela 4.7.
Como era nossa inteno, as clulas que dependiam de clulas nulas da mesma
linha foram ignoradas (preenchidas com espao em branco) e no marcadas com
uma mensagem de erro, como no exerccio anterior. Essa ttica pode ser utilizada
para montar planilhas que no apresentam mensagens de erro ou que precisem de
mensagens diferenciadas para a ausncia de contedo em cada tipo de clula.
Select Case
Select Case uma expresso lgica utilizada para execuo um entre os di-
versos grupos de instrues presentes em um cdigo. O determinante da execuo
o valor da expresso utilizada. A sintaxe de uma expresso Select Case :
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
cap04.indd 61 1/11/2006 15:47:30
62 universidade VBA

em que:
testexpression corresponde a qualquer expresso numrica, ou de seqn-
cia, necessria para a escolha correta da funo;
expressionlist-n produz uma lista delimitada a partir de algumas das seguintes
formas: expression, expression To expression e Is comparisonoperator
expression. A palavra-chave To especifica um intervalo de valores. Se voc empregar
a palavra-chave To, o valor menor deve aparecer antes dela. Aplique a palavra-chave Is
com operadores de comparao (exceto Is e Like) para especificar um intervalo de
valores. Se no for fornecida, a palavra-chave Is ser inserida automaticamente;
statements-n faz com que uma ou mais instrues sejam executadas se
testexpression coincidir com qualquer parte de expressionlist-n. um
recurso opcional;
elsestatements faz com que uma ou mais instrues sejam executadas se
testexpression no coincidir com qualquer das clusulas Case.
No tpico seguinte, damos um exemplo simples do funcionamento de Select
Case montando uma planilha para o clculo de taxas. Essa pequena planilha pode
ser utilizada de forma isolada ou na montagem de uma planilha de taxas um pouco
mais elaborada.
Exerccio 6
1. Nosso cenrio o seguinte:
Em uma determinada modalidade de taxas, os primeiros R$ 2.500,00 de todo
valor so livres de taxao;
Os valores superiores a R$ 2.500,00 e inferiores a R$ 5.000,00 so taxados
com 5%;
Todo valor maior do que R$ 5.000,00 taxado em 10%.
2. Para representar esse cenrio, vamos utilizar uma planilha em branco do Excel
e preench-la da seguinte maneira:
Na clula A1, digitamos Para o valor de, ao passo que na clula B1 digitamos
R$ 2.000,00;
Na clula A2, digitamos Taxa a pagar, enquanto na clula B2, digitamos
=taxa(B1).
3. Agora, abra o editor de VBA e digite em um novo mdulo o seguinte cdigo
(os comentrios so nossos):

Public Function taxa()
cap04.indd 62 1/11/2006 15:47:31
Recursos de programao VBA 63
4
captulo
Select Case income
Case Is <= 2500
taxa = 0
Se o valor for menor ou igual a R$ 2.500,00, a opo es-
colhida ser taxa=0
Case Is <= 5000
taxa = (5000 - 2500) * 0.05
Se o valor for menor ou igual a R$ 5.000,00, a taxa ser
de 0,05 ou 5%
Case Else
taxa = (income - 5000) * 0.1 + 125
Se o valor for maior que R$ 5.000,00, a taxa dever ser
multiplicada por 0.1 mais 5%
End Select
End Function
4. Salve o mdulo e volte para a planilha. Em seguida, ative a clula B2, onde
inserimos a expresso que ativa a macro, e aperte a tecla Enter. Veja o resultado:
C
R$ 20.000,00
1625
A
1
2
Para o valor de
Taxa a pagar
Tabela 4.8.
5. Com um simples arrastar-e-soltar, podemos tornar a planilha muito mais
interessante, fazendo com que a macro efetue o clculo de vrios valores. uma
operao muito mais simples do que montar uma funo matemtica para cada caso
de taxao (so trs casos diferentes), aplicando-as manualmente ao descobrir em
que caso elas se encaixam. Observe:
Para o valor de
Taxa a pagar
R$ 20.000,00
R$ 1.625,00
R$ 12.000,00
R$ 825,00
R$ 250.000,00
R$ 24.625,00
R$ 1.900,00
R$ 0,00
R$ 25.000,00
R$ 2.125,00
Tabela 4.9.
Caixas de texto TextBox
Caixas de texto so utilizadas para implementar a comunicao entre o programa
e o usurio ou vice-versa. Um TextBox o controle mais utilizado para exibir infor-
maes, inseridas por um usurio, em uma caixa de texto. Alm disso, pode exibir
B
cap04.indd 63 1/11/2006 15:47:31
64 universidade VBA
conjuntos de dados, como tabelas, consultas, planilhas ou o resultado de clculos.
Caixas de texto so objetos dinmicos: se um TextBox estiver ligado a uma fonte
de dados, a alterao do seu contedo vai alterar tambm o valor da fonte de dados
acoplada. Da mesma forma, a formatao aplicada a qualquer parte do texto de um
TextBox afetar todo o texto do controle. Como exemplo, se voc alterar a fonte
ou o tamanho em um ponto de qualquer caractere de um controle, essa alterao
afetar todos os caracteres desse controle.
O TextBox um controle flexvel governado pelas seguintes propriedades: Text,
MultiLine, WordWrap e AutoSize.
Text contm o texto exibido na caixa. Por outro lado, MultiLine controla se Text-
Box pode exibir texto como uma nica linha ou como mltiplas linhas. Os caracteres da
nova linha identificam onde termina uma linha e onde a outra comea. Se MultiLine
for False, o texto ficar truncado em vez de mudar de linha automaticamente.
WordWrap permite que o TextBox mude automaticamente de linha quando as
linhas de texto forem maiores que a largura. Quando no utilizamos WordWrap,
o TextBox iniciar uma nova linha de texto quando encontrar um caractere que
indique o procedimento. Se WordWrap estiver desativado, possvel obter linhas de
texto que no se ajustem completamente ao TextBox. O TextBox exibir as partes
do texto que se ajustarem sua largura e truncar as partes que no se ajustarem.
WordWrap no aplicvel, a no ser que MultiLine seja True.
AutoSize controla se o TextBox ser ajustado para exibir todo o texto. Ao
utilizar AutoSize com um TextBox, a largura deste diminui ou aumenta de acordo
com a quantidade de texto e com o tamanho da fonte utilizada.
Uma TextBox um pouco diferente de uma MsgBox. Se com este comando cria-
mos caixas que mostram mensagens na tela, com aquele somos capazes de inserir dados
no programa, utilizando, portanto, a funcionalidade da caixa no sentido inverso.
No Exerccio 7, criaremos uma caixa de texto simples. Nela, basta teclar Enter
(comportamento quase instintivo para os usurios de computadores) para escrever
algo na caixa. Novamente, os comentrios sero nossos.
Exerccio 7
1. Abra uma planilha em branco e, em seguida, o editor de VBA (Alt + F11).
Logo aps, clique com o boto direito do mouse em Formulrios > Inserir > User-
Form. Utilizamos a opo UserForm em vez de Mdulo, porque, no caso das caixas
de texto, criaremos antes de tudo a estrutura grfica, para depois complementarmos
o objeto com o cdigo.
2. Ser aberta a rea UserForm1 (Figura 4.3). Essa rea utilizada para a insero
de um determinado objeto pr-modelado e sua programao.
cap04.indd 64 1/11/2006 15:47:31
Recursos de programao VBA 65
4
captulo
Figura 4.3.
3. V ao menu Exibir do editor de VBA e clique na opo Caixa de ferramentas.
Essa opo ativa a barra de tarefas homnima com vrios modelos para objetos de
formulrio que podem ser anexados a um projeto de VBA. Para tanto, basta arrastar
e soltar o objeto escolhido. No caso das caixas de texto, clique no objeto (Figura 4.4)
e arraste-o para a rea UserForm1. O resultado ser parecido com o da Figura 4.5,
em que tambm podemos ver a Caixa de ferramentas.
Figura 4.4.
Figura 4.5.
cap04.indd 65 1/11/2006 15:47:32
66 universidade VBA
4. Isso feito, edite a caixa de texto. Para tanto, clique duas vezes no objeto e ser
aberta a janela de insero de cdigo, com o seguinte contedo:
Option Explicit
Private Sub TextBox1 _ Change()
End Sub
Private Sub UserForm _ Click()
End Sub
5. Esse contedo equivale ao delineamento de uma caixa de texto simples. User-
Form _ Click() o objeto do VBA que permite a ativao de um formulrio,
ou de um outro objeto, a partir de uma ao do usurio; um clique do mouse ou o
apertar de uma tecla, por exemplo. Por ltimo, vamos inserir o cdigo que permitir
a habilitao da caixa com a tecla Enter:
Private Sub TextBox1 _ KeyDown(ByVal KeyCode As MSForms.
ReturnInteger, _
ByVal Shift As Integer)
Note que criamos TextBox1 como uma sub-funo. Alm disso,
deve-se substituir TextBox1 _ Change(), do objeto padro, por
_ KeyDown. KeyDown, um tipo de evento que s ocorre quando
um usurio aperta uma determinada tecla.
If KeyCode = 13 Then
13 equivale tecla Enter na tabela VBKey do VBA. Essa
tabela corresponde s constantes, tambm chamadas VBKey, uti-
lizadas para ligar o objeto VBA a eventos de teclado (teclas
pressionadas) ou de mouse (cliques com os botes do dispo-
sitivo). Uma lista completa das strings do VBKey pode ser
encontrada no Apndice 1 deste livro.
Sheet1.Range(A65536).End(xlUp).Offset(1, 0) = TextBox1
TextBox1 = vbNullString
Com Sheet1, indicamos que o comando diz respeito planilha
atualmente ativa. Da mesma forma, a instruo Range(A65536)
cap04.indd 66 1/11/2006 15:47:32
Recursos de programao VBA 67
4
captulo
especifica que todas as clulas dessa planilha sero consi-
deradas ativas. =TextBox1 mostra ao programa que a ativao
de qualquer clula da planilha equivale chamada da caixa
de texto. vbNullString uma constante especial que retorna
uma string nula.
End If
End Sub
Molduras (frames) e botes
de opo (options buttons)
Nesse tpico, continuaremos a trabalhar com objetos grficos. Dessa vez, no en-
tanto, vamos nos concentrar nos frames, ou molduras, parte essencial da manipulao
de objetos grficos no VBA.
O frame, ou moldura, utilizado para montar um grupo de controles. Um grupo
de controles consiste em um conjunto de controles relacionados conceitual ou logi-
camente. Como exemplo, podemos configurar um conjunto de botes, fazendo com
que um deles seja clicado para acionar uma determinada opo ou funcionalidade
de uma planilha, ao passo que o restante ser tratado como False.
Todos os botes de opo em um frame so mutuamente exclusivos, portanto,
podemos utilizar um frame para criar um grupo de opes, todas verdadeiras. Como
exemplo, em um aplicativo que processa pedidos, com nome, endereo e nmero de
conta dos clientes, todas as opes sero True, mas nada impede que elas sejam
agrupadas em um nico frame ou moldura.
Finalmente, podemos definir os frames como formas passivas, utilizadas para
moldar um conjunto de comandos em um determinado layout.
Aqui, vamos mostrar a montagem de uma moldura muito simples, acompanhada
de alguns botes de opes. Utilizaremos as ferramentas grficas do formulrio para
criao de nosso frame.
Exerccio 8
1. Abra o editor do VBA e, na rvore do lado direito da tela, clique com o boto
direito do mouse em Formulrios, selecionando, em seguida, a opo Inserir > User-
Form. Utilize o comando Selecionar objetos (Figura 4.6), da Caixa de ferramentas,
e clique no formulrio criado.
Figura 4.6
cap04.indd 67 1/11/2006 15:47:32
68 universidade VBA
2. Posicione o cursor do mouse na lateral da rea UserForm at ele se transformar
em uma seta com duas pontas. Em seguida, arraste a seta para baixo, para que o
espao til da rea seja aumentado.
Figura 4.7.
3. Logo aps, acesse novamente a Caixa de ferramentas e clique duas vezes na
opo Quadro (Figura 4.8). esse o comando utilizado para a montagem de um
frame. O cursor do computador ser transformado em uma cruz. Arraste-a para criar
um frame do tamanho desejado (Figura 4.9):
Figura 4.8.
Figura 4.9.
cap04.indd 68 1/11/2006 15:47:33
Recursos de programao VBA 69
4
captulo
4. Procure, agora, na Caixa de ferramentas, pelo comando Boto de opo (Fi-
gura 4.10). Clique duas vezes no comando e arraste-o para dentro do frame. Repita
o processo trs vezes, criando uma fileira vertical com trs botes de opo, como
mostramos na Figura 4.11:
Figura 4.10.
Figura 4.11.
5. Clique com o boto direito do mouse sobre a moldura que circunda o frame e
selecione a opo Propriedades. A moldura o quadrado com hachuras que utili-
zamos para movimentar o objeto e alterar seu tamanho. Do lado inferior-esquerdo
da tela, surgir a janela Propriedades, na qual podemos alterar as configuraes do
objeto por meio de um sistema de formulrios em que cada linha equivale a uma das
propriedades do frame utilizado.
Figura 4.12.
cap04.indd 69 1/11/2006 15:47:33
70 universidade VBA
6. Nessa mesma janela, selecione a linha BackColor (Cor de Fundo) e expanda
o menu suspenso que aparece ao lado da opo. Altere a cor do frame para a cor
padro da rea de trabalho do Windows, clicando na opo de cor rea de traba-
lho. Tambm poderamos completar tal atividade com a ajuda de cdigo, e com a
propriedade BackColor, que obedece seguinte sintaxe:
objeto.BackColor [= Longo]
Em que objeto deve ser substitudo pelo nome do elemento atualmente manipu-
lado, como, por exemplo, um frame. Longo deve ser substitudo pelo valor-cdigo da
cor escolhida, com qualquer inteiro que represente uma cor vlida. Tambm podemos
especificar uma cor utilizando a funo RGB com componentes em cores vermelha,
verde e azul. O valor de cada componente de cor um inteiro que varia de zero a
255. Como exemplo, podemos especificar azul turquesa com o valor inteiro 4966415
ou os componentes vermelho, verde e azul como 15, 200 e 75, respectivamente. O
cdigo da cor de fundo do objeto ficaria mais ou menos assim:
TextBox6.BackColor = RGB(0, 255, 0)
Esta combinao de RGB equivale cor verde.
TextBox3.BackColor = RGB(0, 255, 255)
Esta combinao equivale ao ciano
TextBox3.BorderColor = RGB(0, 0, 0)
Aqui criamos um fundo preto
TextBox4.BackColor = RGB(0, 0, 100)
Aqui temos azul marinho
TextBox5.BackColor = RGB(128, 128, 128)
Um cinzento bem pronunciado
7. Na linha Caption, podemos dar ao objeto um nome que ser mostrado para o
usurio. Se nenhum nome for atribudo, o nome padro do objeto ser exibido na
tela. Para nosso frame, atribuiremos a frase: Escolha seu lanche. Tambm possvel
faz-lo com a linha de comando: a propriedade Caption ser sempre a primeira na
declarao de propriedades de um objeto.
Private Sub Frame1()
Frame1.Caption = Escolha seu lanche
cap04.indd 70 1/11/2006 15:47:33
Recursos de programao VBA 71
4
captulo
8. Clique, agora, com o boto direito do mouse no primeiro Boto de opo, no
interior da moldura, e selecione novamente a opo Propriedades. A janela que
antes existia para o objeto Frame ser sobreposta do objeto OptionButton1. A
primeira coisa a ser alterada a cor de fundo do objeto, para que ele acompanhe a
cor de fundo do frame. O resultado final mostrado na figura a seguir:
Figura 4.13.
9. Para testar o comportamento do aplicativo, clique no boto Salvar e, em seguida,
execute o aplicativo apertando o boto Executar Sub/UserForm (Figura 4.14). No
resultado final, voc ver a tela de selees surgir (Figura 4.15):
Figura 4.14.
Figura 4.15.
cap04.indd 71 1/11/2006 15:47:33
72 universidade VBA
Voc deve ter percebido que o objetivo desse exerccio era manipular objetos
visuais do VBA, alterando algumas de suas configuraes, e no criar um aplicativo
acabado. Basta notar que as aes definidas no foram atreladas aos botes e que
no foi criado um boto de OK ou outra forma de sair do aplicativo.
UserForms e objetos
Este projeto ser mais elaborado que o anterior, pois vamos atrelar aes es-
pecficas ListBox e aos demais componentes presentes em nosso frame. Alm
disso, teremos de criar diversas estruturas menores para povoar nossa moldura, o
que comearemos a fazer no tpico Exerccio 9, antes de partirmos para montagem
da ListBox propriamente dita.
Exerccio 9
1. Abra o editor de VBA e, em seguida, clique com o boto direito do mouse
no diretrio Formulrios, localizado na rvore esquerda da tela. Escolha a opo
Inserir > UserForm.
2. Aumente o tamanho da rea da UserForm com o cursor. Logo aps, clique
com o boto direito do mouse, selecione a opo Propriedades. Aparecer a tela de
propriedades da UserForm, em que podemos alterar todos os valores relacionados
ao objeto, como j fizemos no exerccio anterior.
3. Anteriormente, apresentamos algumas propriedades como Caption. Agora,
nos deteremos um pouco mais em algumas delas e no modo de edit-las.
Name: o nome com o qual vamos identificar a UserForm. Tem de ser um
nome nico, sem espaos ou smbolos como separadores. Um bom truque iniciar
o nome do objeto com UF. Assim, sempre que o cdigo fizer referncia a este objeto,
saberemos que se trata de uma UserForm;
Caption: como j vimos, Caption se refere ao ttulo que o usurio ver no
quadro de dilogo. Podemos inserir qualquer tipo de texto, incluindo espaos;
BackColor: a cor de fundo da caixa de dilogo. J vimos como realizar a
alterao da propriedade BackColor no Exerccio 8;
ForeColor: a cor do primeiro plano, ou seja, a cor do texto que aparece na
caixa de dilogo;
Font : a fonte utilizada como padro para a caixa de dilogo, incluindo os
botes de controle presentes na caixa de dilogo;
cap04.indd 72 1/11/2006 15:47:33
Recursos de programao VBA 73
4
captulo
StartupPosition: a posio em que aparecer a caixa de dilogo. Ao utilizar-
mos, por exemplo, o valor CenterScreen, o objeto ser exibido no centro da tela;
SpecialEffect: so efeitos especiais para a borda da caixa de dilogo;
Picture, PictureAlignment, PictureSizeMode e PictureTiling:
so propriedades utilizadas para inserir e formatar as caractersticas de figuras no
interior da UserForm.
4. Agora, vamos inserir uma caixa de texto em nossa UserForm. Para tanto, na
janela Caixa de ferramentas, clique no boto Caixa de texto e arraste o objeto para
a UserForm. possvel utilizar o mouse para alterar a localizao e o tamanho
desse controle.
5. Clique com o boto direito do mouse na caixa de texto e selecione a opo
Propriedades. Aparecer a janela Propriedades do lado direito da tela. Vejamos as
principais propriedades com que trabalharemos:
Name: o nome do objeto. Como j apontamos anteriormente em relao a
UserForm, aqui tambm no permitida a utilizao de espaos ou smbolos. Nomeie
o objeto como TB (iniciais de TextBox) para identific-lo no decorrer do cdigo;
Text: corresponde ao texto no interior da caixa de texto. Podemos inserir um
texto do tipo: Preencha com seus dados, ou Digite um nmero. Essa caixa pode ser
editada pelo usurio com a insero de novos dados;
TextAlign: alinhamento do texto dentro da UserForm. Normalmente, se
quisermos que o usurio introduza uma seqncia de texto, preciso alinhar o tex-
to esquerda (mTextAlignLeft). Se for preciso introduzir nmeros, costuma-se
alinhar o texto direita (fmTextAlignRight). Para alinhar um texto de forma
centralizada, escolha fmTextAlignLeft;
MultiLine: estabelece se os valores possveis so True ou False. Tais va-
lores indicam se ser possvel que o usurio escreva ou no mais de uma linha na
caixa de texto.
Na propriedade TextAlign, vamos escolher fmTextAlignRight, j que
usaremos essa caixa para inserir um nmero.

6. Agora, vamos inserir um texto descritivo do lado do quadro de edio. Para
tanto, vamos novamente para a janela Caixa de ferramentas, em que selecionamos
a opo Rtulo (Figura 4.16), posicionando-a acima da caixa de texto. Todos os
elementos de texto de uma UserForm que no correspondam a objetos editveis
mas somente a textos indicativos ou explicativos devem ser montados com a ajuda
da opo Rtulo:
cap04.indd 73 1/11/2006 15:47:34
74 universidade VBA
Figura 4.16.
7. Clique com o boto direito do mouse sobre o Rtulo e selecione a opo Pro-
priedades. A propriedade utilizada para fazer com que o rtulo mostre um texto
Caption. Preencha-a com o texto Digite um nmero.
Terminamos nosso exerccio com uma bela estrutura: alinhamento, nomes, tudo
estabelecido. Porm, um aplicativo em VBA ou em qualquer outra linguagem de
programao deve possuir uma maneira de ser reiniciado ou finalizado.
Em aplicativos grficos, isso feito por botes de controle. No exerccio seguinte,
vamos construir um boto de controle dentro da UserForm anteriormente criada,
alm de lhe atribuir uma funo.
Exerccio 10
1. Na UserForm em que trabalhamos no exerccio anterior, montaremos um boto
OK e um boto Cancelar. Comeamos pelo Cancelar, de execuo um pouco mais
simples. Comeamos novamente pela Caixa de ferramentas, selecionando o comando
Boto de comando (Figura 4.17):
Figura 4.17.
2. Posicione o boto na parte inferior da UserForm. Em seguida, clique com o
boto direito do mouse e selecione Propriedades. Vamos editar algumas das pro-
priedades do objeto:
Name: no nome do controle, vamos escrever cbCancel, para documentar o
cdigo (cb a sigla para CommandButton);
Caption: no texto mostrado no boto, vamos escrever Cancelar;
Cancel: essa propriedade pode ter o valor True ou False. S pode existir
um controle em uma determinada caixa de dilogo ou UserForm, com a propriedade
Cancel estabelecida como verdadeira. Se dermos Cancel o valor True, basta que
o usurio utilize a tecla Esc para que o boto editado seja ativado, como se houvesse
sido clicado com o mouse. Selecione a opo True;
Default: com valor True ou False, indica se o boto pertence caixa de
dilogo. Se optarmos por definir a propriedade como True, o boto ser ativado,
assim como seria ativado com a tecla do mouse se o usurio apertasse a tecla En-
ter. Como o boto em questo o Cancelar, e, alm disso, pretendemos reservar
cap04.indd 74 1/11/2006 15:47:34
Recursos de programao VBA 75
4
captulo
a propriedade Default para o boto OK, que montaremos mais tarde, optamos
por False.
Se executarmos o projeto agora, veremos que temos um boto acionado com a tecla
Esc, mas que no faz nada alm disso. Para que o boto faa alguma coisa, preciso
operar com um conceito muito importante da programao de objetos: os eventos.
4. Um evento uma ao concreta que ocorre sempre que um objeto ou proprie-
dade ativado por um agente, que pode ser uma tecla, um clique do mouse ou outro
objeto. O comum para um boto Cancelar que o usurio clique com o mouse ou
selecione com o teclado. Esse tipo de evento chamado de Click.
Criaremos um evento Click, chamando-o de cbCancelar _ Click(). Para
tanto, clicamos duas vezes no boto Cancelar, exibindo a janela de cdigo corres-
pondente ao projeto.
5. Vejamos o seguinte cdigo:
Private Sub cbCancelar _ Click()
End Sub
O Excel encarregou-se de criar a estrutura do evento. Agora, temos de preen-
ch-lo. A instruo que utilizamos para fechar uma UserForm Unload, que serve
para limpar um objeto da memria ativa do sistema. A instruo Unload requer um
parmetro, utilizado para indicar qual objeto deve ser retirado da memria.
Em nosso caso, utilizaremos a palavra-chave Me, que aponta o objeto em que
estamos executando o cdigo, ou seja, nossa UserForm.
6. Nosso cdigo, ento, ficar assim:
Private Sub cbCancelar _ Click()
Unload Me
End Sub
Faa o teste. Rode o aplicativo e clique no boto Cancelar (ou aperte a tecla Esc).
Se a janela for fechada, o boto est funcionando.
Com a tcnica de criao de botes, vamos passar para o prximo exerccio. Nele,
criaremos mais um boto, to necessrio quanto o boto Cancelar: o boto OK.
cap04.indd 75 1/11/2006 15:47:34
76 universidade VBA
Exerccio 11
1. Abra a Caixa de ferramentas e clique em Boto de comando. Coloque esse
novo boto na UserForm em que criamos o boto Cancelar. O ideal posicion-lo
do lado esquerdo do boto Cancelar.
2. Clique, com o boto direito do mouse, sobre o comando e selecione a opo
Propriedades. Em Name, digite cbOK, ou o nome que voc quer dar ao boto. Em
Caption, definimos que a mensagem inscrita no boto ser OK.
3. Na propriedade Default, definimos o valor como True. Dessa forma, sempre
que o usurio apertar a tecla Enter, o boto OK ser ativado, da mesma forma que
ocorreria se o mouse tivesse sido utilizado.
4. Clique duas vezes no boto para que surja a janela de cdigo. Dentro da es-
trutura do boto:
Private Sub cbOK _ Click()
End Sub
idntica do boto Cancelar, insira o seguinte cdigo:
Private Sub cbOK _ Click()
ActiveCell.Value = TextBox1.Value
Unload Me
End Sub
Essa funo praticamente igual que inserimos no boto Cancelar, com exceo
de que antes de fechar a caixa de dilogo, temos de escrever uma outra linha, que
se encarrega de copiar a clula ativa da planilha a qual pertence o aplicativo com o
contedo da caixa de texto.
Observe que ativamos a caixa de texto por meio do nome do controle (TextBox1)
e sua propriedade Value:
ActiveCell.Value = TextBox1.Value
Estabelecemos que a clula da planilha igual ao valor da caixa de texto presente
na UserForm. Se no existir nenhum caractere numrico na caixa de texto, o valor
capturado para a clula ser 0.
cap04.indd 76 1/11/2006 15:47:34
Recursos de programao VBA 77
4
captulo
UserForms mais elaboradas
Nesse tpico, vamos construir uma UserForm mais elaborada, aproveitando para
mostrar mais alguns recursos da Caixa de ferramentas. Suponhamos que temos uma
folha de clculo em que h uma clula com o nome de uma pessoa e outra clula com
o sobrenome. Criaremos uma UserForm que permita ao usurio editar o nome e o
sobrenome localizados na planilha, e que, alm de tudo, logo que apertar o boto OK
na caixa de dilogo, transfira os valores inseridos pelos usurios para a planilha.
Exerccio 11
1. Antes de tudo, vamos criar nossa planilha. primeira coluna, que ter os no-
mes, daremos o ttulo de rgNome, e segunda coluna, responsvel pelos sobrenomes,
chamaremos de rgSobrenome.
2. Agora, acessamos o editor de VBA e criamos uma UserForm. Mediante o boto
direito do mouse, abra o menu Inserir > UserForm. Vamos dar a essa UserForm o
nome de ufDadosPessoais, editando a linha Name da janela Propriedades.
3. Clique na Caixa de ferramentas e insira duas caixas de texto, uma para o nome
e outra para o sobrenome, s quais daremos os nomes tbNome e tbSobrenome.
4. Inserimos, agora, dois rtulos, que colocaremos esquerda de cada uma das
caixas de texto. No primeiro rtulo, escreveremos Nome e, no segundo, Sobrenome.
Para tanto, edite as linhas Caption das janelas de propriedades de cada objeto.
Figura 4.18.
cap04.indd 77 1/11/2006 15:47:34
78 universidade VBA
5. Clique, agora, no comando Boto de comando, da Caixa de ferramentas e
arraste um boto para a UserForm. Na janela Propriedades, mude o nome do boto
para a cbCancelar, digite Cancelar na linha Caption e, na propriedade Cancel,
selecione o valor True.
6. Inserimos, ento, um boto OK, nomeando-o como cbOK. Na linha Caption,
setaremos OK e daremos propriedade Default o valor True.
7. Vamos aos eventos: para o boto Cancelar, a funo que devemos escrever
exatamente igual mostrada no exerccio anterior:
Private Sub cbCancelar _ Click()
Unload Me
End Sub
A nica coisa que esse boto faz fechar a caixa de dilogo assim que o boto
Cancelar for pressionado pelo mouse ou acionado pela tecla Esc.
8. A funo para o boto OK tambm bem parecida com a anterior:
Private Sub cbOK _ Click()
Range(rngNome).Value = tbNome.Text
Range(RngSobrenome).Value = tbSobrenome.Text
Unload Me
End Sub
Essa funo executada quando produzimos o evento Click do boto chamado
cbOK. Porm, antes de fechar a caixa de dilogo, a funo guarda nas clulas de nossa
planilha os valores presentes nas caixas de texto. Para tanto, utilizamos um objeto
Range e estabelecemos que sua propriedade Value igual ao valor da propriedade
Text do objeto TextBox.
9. Execute o aplicativo e observe que ele funciona perfeitamente: se alterarmos
os nomes na UserForm e clicarmos em OK, veremos que as clulas da planilha
tambm tero o contedo alterado e agora armazenam novos nomes. No entanto,
algo escapou.
Se acessarmos diretamente a planilha, podemos alterar os nomes contidos nas
clulas e depois, ao executar a UserForm, veremos que os controles de edio no
tm os nomes atualizados, pois no so capazes de recolher as alteraes feitas di-
retamente na folha de clculo.
cap04.indd 78 1/11/2006 15:47:35
Recursos de programao VBA 79
4
captulo
10. Para resolver esse problema, vamos utilizar um evento especfico para a
UserForm. Esse evento chama-se Initialize, e executado antes da UserForm
surgir na tela.
Para criar esse evento, clique com o boto direito do mouse sobre a UserForm
de nosso aplicativo e, depois, em Exibir cdigo.
11. No menu suspenso, localizado no canto superior direito da tela, substitua
Click por Initialize. O Excel criar uma estrutura para essa nova funo:
Private Sub UserForm _ Initialize()
End Sub
12. no miolo dessa funo que temos de escrever o cdigo a ser executado antes
que a UserForm seja exibida. O que vamos fazer inserir, nas duas caixas de texto, o
contedo das clulas com esses dados. Para tanto, utilizaremos o seguinte cdigo:
Private Sub UserForm _ Initialize()
tbNome.Text = Range(rngNome).Value
tbSobrenome.Text = Range(rngSobrenome).Value
End Sub
cap04.indd 79 1/11/2006 15:47:35
cap04.indd 80 1/11/2006 15:47:35
Propriedades 81
5
captulo
Captulo 5
Propriedades
cap05.indd 81 1/11/2006 15:48:32
82 universidade VBA
Eventos seletivos
No captulo anterior, criamos uma UserForm com botes utilizveis, ou seja,
capaz de por em prtica uma instruo simples. No entanto, falta um toque de
inteligncia ao nosso aplicativo. Se, no lugar de nmeros, o pretenso usurio
decidisse preencher as clulas com palavras ou caracteres aleatrios, no haveria
obstculo nenhum.
Para impedir o preenchimento aleatrio de uma caixa de texto, seria preciso
utilizar o evento KeyPress. Esse evento ocorre quando o usurio pressiona uma
tecla que produz um caractere (uma tecla ANSI) em um formulrio executado. O
evento pode ocorrer tanto antes como depois de a tecla ser solta.
Um evento KeyPress pode ser genrico, abrangendo toda a tabela de caracteres
ANSI, ou seletivo objeto de nosso interesse. Se uma determinada tecla confi-
gurada para receber apenas um tipo de caractere ANSI, outros tipos de caracteres
sero barrados como elementos no-aceitveis. As teclas e combinaes aceitas
por KeyPress so:
Qualquer caractere do teclado alfabtico, alm de smbolos de pontuao
presentes no teclado;
Qualquer caractere de teclado numrico;
CTRL combinada com um caractere do alfabeto padro;
CTRL combinada com qualquer caractere especial;
Backspace (barra de espao) e Esc.
As teclas Tab, Enter e todas as teclas funcionais (Insert, Home e Delete, por
exemplo) no so aceitas, alm das teclas direcionais (as setas).
Em nosso prximo exerccio, criaremos um formulrio, ligado a uma planilha,
que ter por objetivo marcar as horas extras de profissionais liberais que recebem
por hora. Nesse aplicativo ser possvel escrever apenas nmeros nas caixas de
texto, para impedir que os usurios preencham os campos com dados em forma-
to texto.
Exerccio 1
1. Abra uma planilha do Excel e, na primeira coluna (A), digite hEntrada, para
representar a hora de entrada no trabalho. Na segunda coluna (B), digite hSada,
para representar a hora de sada. Por ltimo, na terceira coluna (C), digite hTrab
para representar as horas trabalhadas. Na quarta coluna (D), que chamaremos de
nProf sero colocados os nomes dos profissionais donos das horas.
cap05.indd 82 1/11/2006 15:48:32
Propriedades 83
5
captulo
2. Em seguida, acione o editor de VBA (Alt + F11). Clique com o boto direito
do mouse em Formulrios > Inserir > UserForm. Clique na Caixa de ferramentas.
Em seguida, selecione o controle Caixa de texto. Inclua trs caixas de texto em sua
UserForm. Voc tambm pode arrastar uma nica caixa de texto para o interior da
UserForm e, logo aps, dar-lhe um clique com o boto direito, selecionando, ento,
a opo Copiar. Escolha uma rea da UserForm com o boto direito do mouse e
selecione a opo Colar.
3. De volta Caixa de ferramentas, selecione o controle Boto de comando e
arraste-o para a UserForm, posicionando-o abaixo das caixas de texto. Voc pode
criar mais um boto de comando na UserForm; basta clicar no comando criado com
o boto direito do mouse, copiando-o e colando-o em seguida. Posicione os dois
botes lado a lado.
4. Clique duas vezes no boto esquerda, que ser utilizado como boto Cancelar,
ou, com o boto direito do mouse, selecione a opo Exibir cdigo. Aps a linha:
Private Sub CommandButton2 _ Click()
Insira o cdigo que habilita as funes de um boto Cancelar:
Unload Me
5. Edite, agora, o boto OK, repetindo o processo: pressione duas vezes o boto
e, em seguida, escreva na rea correspondente rea do boto o cdigo abaixo,
utilizado para dar funcionalidade ao boto OK:
Private Sub cbOK _ Click()
Range(hEntrada ).Value = hEntrada
Range(hSada ).Value = hSada
Range(hTrab ).Value = hTrab
Range(nProf ).Value = nProf
Unload Me
End Sub
Note que criamos sadas para as quatro colunas presentes em nossa planilha.
Ela tem seus correspondentes nas quatro caixas de texto da UserForm. Assim, as
informaes na planilha sero atualizadas de acordo com o contedo das caixas de
texto, assim que o aplicativo VBA for fechado.
cap05.indd 83 1/11/2006 15:48:32
84 universidade VBA
6. Aqui, travaremos o acesso de outros valores diferentes de nmeros nas
caixas de texto. Clique em cada uma das caixas de texto presentes na UserForm e,
entre as linhas:
Private Sub TextBox1 _ Change()
End Sub
Insira o seguinte cdigo:
Private Sub TextBox1 _ KeyPress()(BeVal KeeAscii As _
MSForms.ReturnInteger)
If KeeAscii < Asc(0) Or KeeAscii > Asc(9) Then
KeeAscii = 0
End If
End Sub
Estabelecemos aqui que se (If) o valor da propriedade KeeAscii for menor
que zero e maior que nove, ento (Then) KeeAscii deve ser tratada como se o seu
valor fosse igual a zero, o que equivale a bloquear a edio da propriedade, pois zero
igual a valor nulo ou fechado.
7. Clique nas demais caixas de texto (salvo a quarta, em que deve constar nomes)
e insira o mesmo cdigo. Salve o projeto.
Caixa de listagem (ListBox)
Uma forma mais sofisticada de produzir um objeto VBA seria criar caixas de
listagem, tambm conhecidas como ListBox.
Uma ListBox um objeto que exibe um ou mais valores, permitindo a seleo
de um deles. Deste objeto so feitas as caixas de verificao ou menus suspensos da
maioria das aplicaes Windows. De uma maneira simplria, uma caixa de listagem
pode ser feita dentro do editor do VBA se selecionarmos, na Caixa de ferramentas,
o objeto Caixa de listagem (Figura 5.1) para, em seguida, empurr-lo para a rea
da UserForm.
Figura 5.1.
cap05.indd 84 1/11/2006 15:48:33
Propriedades 85
5
captulo
Um objeto construdo dessa forma, no entanto, uma caixa vazia, pois no foram
adicionados parmetros (opes) listagem e nem foram definidas propriedades de
ao ao seu manuseio.
Uma ListBox exibe uma lista de valores e nos permite selecion-los. O List-
Box pode aparecer como uma lista (opo padro) ou como um grupo de controles
OptionButton ou CheckBox. A propriedade-padro de um ListBox a Value.
O evento-padro do controle ListBox o Click.
Existem dois estilos possveis para a montagem de uma ListBox. Se optarmos
pelo estilo Plain, temos cada item de uma lista em uma linha separada. O usurio
selecionar um item realando uma ou mais linhas.
Se o estilo for Option, um boto de opo ou uma caixa de verificao aparecer
no incio de cada linha. Com esse estilo, o usurio pode selecionar um item clicando
no boto de opo ou na caixa de verificao.
por isso que, no prximo exerccio, estudaremos a forma de montar uma List-
Box com o auxlio do editor de cdigo. Preste ateno nos comentrios para entender
o processo de desenvolvimento.
Exerccio 2
1. Crie uma nova planilha do Excel e, na coluna A, insira os dados pertinentes a
uma determinada lista. Essa lista pode conter nomes de pessoas, objetos, equipamen-
tos de informtica, livros etc. Em nosso exemplo, utilizaremos uma lista de pases.
2. Utilize o atalho Alt + F11 para abrir o editor do VBA. Crie, depois, uma
UserForm e nela insira o cdigo seguinte (os comentrios so nossos):
Private Sub UserForm _ Initialize()
Initialize o comando utilizado para iniciar um aplicativo
VBA antes que o Excel seja iniciado. Voc pode substituir o
nome UserForm por outro nome qualquer, Pases, por exemplo.
Dim MinhaLista As Variant, i As Long
With Me.ListBox1
Dim a instruo utilizada no VBA para declarar vari-
veis e o local de armazenamento dessas variveis. O nome da
varivel, declarado obrigatoriamente aps a instruo, aqui
definido como MinhaLista.
.Clhear
Limpa o contedo da listbox
MinhaLista = UniqueItemList(Range(A1:A100), True)
cap05.indd 85 1/11/2006 15:48:33
86 universidade VBA
Utilizamos a linha acima para capturar todos os elemen-
tos presentes na coluna A. Estabelecemos que MinhaLista ser
igual uma lista de item nico, que abrange um range vlido
(True) de opes da clula A1 at a clula A100
For i = 1 To UBound(MinhaLista)
.AddItem MinhaLista(i)
Next i
.ListIndex = 0
Selecione sempre o primeiro item da listagem
End With
End Sub
A funo que captura os nomes dos pases listados na
planilha termina aqui.
Private Function UniqueItemList(InputRange As Range, _
HorizontalList As Boolhean) As Variant
A funo aqui iniciada tem por objetivo ordenar os ele-
mentos capturados a partir das coordenadas (range) propostas
no incio do cdigo. HorizontalList estabelece que os dados
devem ser organizados no formato de uma lista horizontal, que
emprega dados booleanos (Verdadeiro ou Falso) para operar.
Dim cl As Range, cUnique As New Collhection, i As Long,
uList() As Variant
Application.Volatilhe
On Error Rume Next
For Each cl In InputRange
If cl.Formula <> Then
cUnique.Add cl.Value, CStr(cl.Value)
End If
Se (If) a frmula de insero de dados se deparar com
uma clula vazia () esse lapso no ser computado como
valor para a listagem, que prosseguir computando os dados
normalmente
Next cl
UniqueItemList =
If cUnique.Count > 0 Then
ReDim uList(1 To cUnique.Count)
For i = 1 To cUnique.Count
uList(i) = cUnique(i)
cap05.indd 86 1/11/2006 15:48:33
Propriedades 87
5
captulo
Aqui estabelecemos que todos os elementos maiores que
0 (portanto, True ou Verdadeiros) sero considerados True ou
Verdadeiro (representados aqui pelo valor booleano 1) e sero
anexados lista.
Next i
UniqueItemList = uList
If Not HorizontalList Then
UniqueItemList = _
Application.WorksheetFunction.Transpose
(UniqueItemList)
End If
End If
Aqui estabelecemos que a lista montada deve ser trans-
posta, pela Propriedade Application.WorksheetFunction.Trans-
pose, para a planilha por ns criada. Lembre-se de que, como
utilizamos Initialize no comeo do cdigo, a aplicao ser
aberta juntamente com a planilha, como se fosse um adendo.
On Error GoTo 0
Essa linha estabelece que, em caso de erro (On Error) o
cdigo deve retornar (GoTo) para o incio, estabelecido pelos
parnteses fechados (). Essa operao evita o travamento ou
suspenso do aplicativo em caso de erro.
End Function
3. Terminado o aplicativo, rode-o e observe o resultado na figura seguinte:
Figura 5.2.
claro que no demos nome caixa de dilogo, nem inserimos botes como OK
e Cancelar. Mas foi simplesmente para no sermos repetitivos: a essa altura, voc
cap05.indd 87 1/11/2006 15:48:33
88 universidade VBA
mesmo pode montar seus botes, se no de olhos fechados, ao menos seguindo os
passos de exerccios anteriores.
Caixas de combinao (ComboBox)
Uma ComboBox combina os recursos de ListBox e TextBox. O usurio pode
inserir um novo valor, como com um TextBox, ou pode selecionar um valor exis-
tente, como em uma ListBox.
Para que seja possvel listar dados ou valores, um ComboBox deve estar ligado
a uma fonte de dados. Nesses casos, a ComboBox vai inserir o valor que o usurio
digitar ou selecionar na fonte de dados.
A lista em um ComboBox consiste em linhas de dados. Cada linha pode ter uma
ou mais colunas, que podem aparecer com ou sem cabealhos. Alguns aplicativos
no suportam cabealhos de colunas, outros, como o Excel, fornecem apenas um
suporte limitado.
A propriedade padro de um ComboBox a Value e o evento padro de um
ComboBox Change.
Para exemplificar a construo de uma ComboBox, vamos construir, no prximo
exerccio, um formulrio ou uma caixa de dilogo para a insero de dados pessoais.
Os primeiros passos sero semelhantes aos mostrados no Exerccio 11 do Captulo 4,
Recursos de programao VBA, com a criao da UserForm e dos botes principais.
Exerccio 3
1. Crie uma planilha para insero de nome, sobrenome, estado civil e idade de
uma srie de pessoas. primeira coluna, que guardar os nomes, daremos o ttulo
de rgNome, e segunda coluna, responsvel pelos sobrenomes, chamaremos de
rgSobrenome, a terceira se chamar rgEstadoCivil e a quarta rgIdade.
2. Acesse o editor de VBA e crie uma UserForm com o boto direito do mouse
e o menu Inserir > UserForm. Vamos dar a essa UserForm o nome de ufDadosPes-
soais2, editando a linha Name da janela Propriedade.
3. Clique, agora, na Caixa de ferramentas e insira quatro caixas de texto, uma
para cada coluna da planilha.
4. Inserimos ento os rtulos correspondentes a cada uma das caixas:
Nome;
Sobrenome;
cap05.indd 88 1/11/2006 15:48:33
Propriedades 89
5
captulo
Estado Civil;
Idade.
5. Isso feito, com a ajuda do Boto de comando da Caixa de ferramentas, criamos
dois botes. Acessamos as propriedades do primeiro boto e, na linha Name, muda-
mos o nome do boto para a cbCancelar. No se esquea de escrever Cancelar na
linha Caption e, na propriedade Cancel, de solucionar o valor True.
Fazemos o mesmo com o boto da direita, que ser nosso boto OK, nomeando-o
como cbOK, definindo a linha Caption como OK e dando propriedade Default
o valor True.
6. Definimos, assim, o nosso evento para o boto Cancelar:
Private Sub cbCancelar _ Click()
Unload Me
End Sub
Alm do boto OK:
Private Sub cbOK _ Click()
Range(rngNome).Value = tbNome.Text
Range(RngSobrenome).Value = tbSobrenome.Text
Unload Me
End Sub
7. Logo aps, inserimos Initialize no incio do cdigo, para que a aplicao seja
aberta juntamente com a planilha. O comando colocado na linha inicial do cdigo:
Private Sub ufDadosPesoais2 _ Initialize()
8. Montada a estrutura bsica, vamos para algo realmente novo: todos os controles
possuem a propriedade ControlSource na lista de atributos. ControlSource
utilizado para indicar ao controle qual a fonte da informao, quer seja uma clula,
um intervalo ou mesmo uma planilha inteira. Como exemplo, na caixa de texto Nome,
podemos assinalar como ControlSource a clula da planilha em que est inserido esse
dado. Como sempre, no entanto, bastante prudente no utilizar referncias absolutas
em clulas e intervalos (por exemplo, Plan1!A5), mas referncias nominais.
Podemos, por exemplo, acessar o editor do VBA, selecionar a caixa de texto Nome
e, na propriedade ControlSource, escrever o nome do intervalo que ser a fonte.
Utilizaremos o intervalo da primeira coluna de nossa planilha, rgNome.
cap05.indd 89 1/11/2006 15:48:34
90 universidade VBA
9. Faa o mesmo com as demais caixas. Por exemplo, clicamos em Sobrenome,
acionamos suas propriedades e, em seguida, escrevemos rgSobrenome em sua
propriedade ControlSource.
10. Para que a propriedade ControlSource funcione, devemos desabilitar, ao
menos temporariamente, o evento Initialize. Isso pode ser feito com um comentrio
(sinal de ) antes de Initialize. A linha deve mudar de cor (verde) para mostrar que
est comentada. Logo aps, clicamos duas vezes no boto OK e em seguida comentamos,
da mesma maneira que fizemos com Initialize, a rotina btnOK_Click().
11. Se testarmos agora a caixa de dilogo, executando o projeto, veremos que a
propriedade ControlSource funciona, e que antes de mostrar o dilogo ela l o
contedo da folha de clculo, colocando-o na Userform. Quando apertamos o boto
OK, a propriedade ControlSource copia o contedo dos controles da Userform
na planilha ativa.
12. No entanto, se fizermos alguma alterao na Userform e apertarmos em segui-
da o boto Cancelar, as alteraes realizadas nos dados so atualizadas na planilha,
quando no deveriam ser. Afinal, apertamos o boto Cancelar, portanto, no deseja-
mos que a operao se concretize. Se, por sua vez, fizermos alguma alterao e depois
apertamos a tecla Esc, as alteraes no sero mostradas na planilha. Este parece um
dos tantos bugs do VBA. Teremos de conviver com ele at que algum profissional, lista
de discusso, ou a prpria Microsoft traga resultados satisfatrios para o caso.
13. Agora vamos adicionar, finalmente, uma ComboBox, tambm chamada, na Caixa
de ferramentas do VBA, de Caixa de combinao. Essa a tpica janela que estamos
fartos de ver em aplicaes do Windows, e que permite ao usurio escolher uma opo
entre vrias apresentadas. No nosso caso, vamos mostrar uma janela para o dado estado
civil. As opes que vamos apresentar so: solteiro, casado, vivo e divorciado.
14. As propriedades mais importantes de uma ComboBox so:
ListRows: um conjunto de cadeias de caracteres (strings) que representam
todos os elementos da lista. Para ter acesso a um elemento, utilizamos Minha-
ComboBox.List( 3 ), que nos devolveria o quarto elemento da lista, pois o pri-
meiro equivale ao nmero zero;
ListCount: o nmero de elementos que h na lista. Se utilizarmos Minha-
ComboBox.List(3)(MiComboBox.ListCount-1), obteremos o ltimo elemento
da lista;
cap05.indd 90 1/11/2006 15:48:34
Propriedades 91
5
captulo
ListIndex: o nmero do elemento atualmente selecionado pelo usurio.
Para obter o texto do elemento selecionado, utilizaramos MinhaComboBox.
List(MinhaComboBox.ListIndex). Se definirmos o controle como multises-
so, o usurio poder escolher mais de um elemento. Essa propriedade no pode
ser utilizada;
RowSource: local a partir do qual desejamos que a ComboBox leia os elemen-
tos. Podemos utilizar essa propriedade, ou introduzir mediante cdigo os elementos
(com o mtodo AddItem);
ControlSource: clula em que a ComboBox l e escreve o elemento selecio-
nado. Funciona de maneira similar a RowSource. Tambm podemos utilizar esta
propriedade para que o ComboBox escreva em uma clula o elemento selecionado,
ou podemos utilizar um cdigo para obtermos o elemento selecionado (utilizando
ListIndex);
Stohe: identifica o tipo de ComboBox que desejamos. Apresenta dois valo-
res possveis:
fmStoheDropDownCombo: o usurio pode escolher um dos valores da lista
ou escrever um distinto;
fmStoheDropDownList: o usurio pode escolher apenas um dos valores
da lista.
ControleTipText: essa propriedade aplica-se a todos os controles. Serve
para mostrar ao usurio um pequeno texto de ajuda sobre o controle quando
posicionamos o mouse, no j clssico quadradinho amarelo.
15. Uma vez vistas as propriedades, vamos manipular os mtodos do objeto
ComboBox:
AddItem: serve para adicionar um elemento lista. A sintaxe :
MeuComboBox.AddItem( Meu texto, 3 )
O primeiro parmetro o texto do elemento, e o segundo (opcional) a posio
dentro da lista que queremos para o novo elemento. Se no utilizarmos o segundo
parmetro, nosso novo elemento ser adicionado ao final da lista;
RemoveItem: serve para apagar um elemento. A sintaxe :
MinhaComboBox.RemoveItem( 3 )
cap05.indd 91 1/11/2006 15:48:34
92 universidade VBA
Se quisssemos, s como exemplo, apagar o elemento nmero trs:
Clear: apaga todos os elementos da lista.
16. Estabelea a propriedade Stohe como fmStoheDropDownList, para que
o usurio possa escolher apenas um dos valores apresentados, ou seja, no vamos
deixar que ele invente um novo estado civil.
17. Agora, v planilha e escreva em uma clula qualquer Solteiro, na clula de
baixo, Casado, na seguinte, Divorciado, e, por ltimo, Vivo. Isso feito, nomeie esse
intervalo, selecionando as quatro clulas e digitando rgEstadoCivil (na parte superior
esquerda).
18. J que estamos aqui, vamos solucionar outra clula para que a ComboBox
armazene o elemento selecionado pelo usurio. Daremos a essa clula o nome
rgValorEstadoCivil.
19. Volte ao editor de Visual Basic (VBE), selecionando, em seguida, uma Com-
boBox. Na propriedade RowSource, escreva rgEstadoCivil. Na propriedade
ControlSource escreva rgValorEstadoCivil.
20. Na propriedade ControleTipText, vamos colocar o texto: Selecione seu
estado civil. Esse o texto que o usurio ver no quadrado amarelo assim que posi-
cionar o mouse sobre o ComboBox. Lembre-se de que essa propriedade existe em
todos os controles.
21. J temos nossa ComboBox. Se a testarmos, veremos que funciona perfeita-
mente. Lembre-se de que a ComboBox colhe os valores do intervalo estabelecido
em RowSource, e armazena o valor selecionado pelo usurio na clula estabelecida
em ControlSource.
22. Note que, se apagamos as propriedades ControlSource e RowSource,
faremos com que o controle funcione da mesma maneira, mas ns mesmos teremos
de nos encarregar de adicionar os valores na lista e, logo depois, identificar a seleo
do usurio, alm de adicionar seu valor na clula desejada. Para isso, teremos que
utilizar as propriedades List e ListIndex, e os mtodos Clear e AddItem. Alm
disso, teremos de fazer retornar ao cdigo os eventos Userform _ Initialize()
e btnAceptar _ Click().
Agora que j dominamos o ComboBox, uma boa notcia: o controle ListBox
funciona praticamente da mesma maneira. O ComboBox o controle em que se v
cap05.indd 92 1/11/2006 15:48:34
Propriedades 93
5
captulo
apenas uma linha e, aps o clique em um boto, surge uma janela com opes dis-
tintas. Ao contrrio, no controle ListBox temos sempre a lista de opes, no h
janela ou menu suspenso. Fora essa diferena visual, os dois tipos de controles so
praticamente iguais. Vamos ao exerccio seguinte.
Exerccio 4
1. Vamos adicionar outro controle, o SpinButton, ou barra de rolagem, (Fi-
gura 5.3):
Figura 5.3.
Normalmente, esse boto utilizado combinado a uma janela de edio. Se clicar-
mos em SpinButton posicionando a seta para cima, aumentaremos o valor do quadro
de edio, e vice-versa. As propriedades mais importantes do SpinButton so:
Value: o valor do SpinButton, que deve ser definido por um nmero;
Min: valor mnimo que pode ter o SpinButton;
Max: valor mximo que pode ter o comando;
SmallChange: o incremento ou decrscimo que sofrer a varivel Value
cada vez que o usurio clicar no SpinButton. Normalmente, definido como um,
mas pode ser alterado.
2. Vamos utilizar o controle SpinButton combinado a um quadro de edio
para armazenar as informaes sobre a idade dos nossos funcionrios. Primeiro,
colocamos uma caixa de texto, que chamaremos de editIdade.
3. Em uma planilha do Excel, daremos o nome rgIdade a uma clula, e a utiliza-
remos para a propriedade ControlSource de nosso controle editIdade.
4. Agora, adicionamos um controle SpinButton. Normalmente, costuma-se
colocar o SpinButton direita do quadro de edio ao qual ser associado. No
quadro de propriedades, vamos definir o valor Min como 15 (idade mnima) e a Max
com o valor 70 (idade mxima). O nome do controle pode ser deixado em sua forma
padro (SpinButton1).
5. Assim, vamos operar um pouco com os eventos. Cada vez que o usurio cli-
car no SpinButton, produz-se o evento Change. Toda vez que produzimos esse
evento, alteramos o valor da caixa de texto editIdade. D um clique duplo em
SpinButton e, assim que aparecer a janela de cdigo, escrevemos:
cap05.indd 93 1/11/2006 15:48:34
94 universidade VBA
Private Sub SpinButton1 _ Change()
editIdade.Text = SpinButton1.Value
End Sub
6. Se o usurio for diretamente caixa de texto e inserir a idade, o valor do Spin-
Button deve ser atualizado, pois tanto o quadro de edio como o SpinButton tm
de ter o mesmo valor. Para tanto, usamos o evento Change do objeto editIdade.
D um clique duplo sobre ele e, na janela de edio de cdigo, escreva:
Private Sub editIdade _ Change()
SpinButton1.Value = editIdade.Value
End Sub
7. Aqui, utilizamos a propriedade Value de editIdade no lugar da proprie-
dade Text, pois queremos o valor numrico, e no a cadeia de caracteres. Se no
controle de edio colocarmos alguma letra no lugar de um nmero, veremos que
a UserForm trava, mostrando-nos uma mensagem de erro, j que no consegue
calcular a propriedade Value de editIdade. Em uma aplicao mais comple-
xa, poderamos escrever algum cdigo para evitar esses erros, tpico que ainda
no estudamos.
8. Ainda falta esclarecer um pequeno detalhe sobre o SpinButton. Quando a
UserForm carregada pela primeira vez, o controle editIdade reconhece a idade
na planilha (afinal, a funo que lhe atribumos ao editar a propriedade Con-
trolSource), porm o controle SpinButton no est atualizado. Temos, ento,
que dar SpinButton o mesmo valor que tem o controle editIdade. Para tanto,
utilizaremos o evento Initialize da UserForm, que j conhecemos de sobra:
Private Sub UserForm _ Initialize()
SpinButton1.Value = editIdade.Value
End Sub
O cdigo o mesmo que foi utilizado no evento editIdade _ Change(). Se
testarmos a caixa de dilogo, veremos que a combinao de editIdade com Spin-
Button1 funciona perfeitamente (salvo a deteco de erros, que veremos adiante).
A seguir, vamos utilizar outros tipos de controle: as caixas de seleo (Check-
Box), e os botes de opo (OptionButtons). Para adicion-los, vamos supor
que o usurio deve nos indicar se utiliza ou no uma planilha de clculo e, em caso
positivo, qual delas.
cap05.indd 94 1/11/2006 15:48:35
Propriedades 95
5
captulo
Exerccio 5
1. preciso criar, antes de tudo, uma planilha com os nomes de programas de
planilha eletrnica. Utilizaremos em nosso exemplo a coluna C. Selecionamos o in-
tervalo em seguida (como j fizemos nos exerccios anteriores) e lhe damos o nome
rngUtilizarPlanilha.
2. A primeira coisa a perguntar se o usurio utiliza uma planilha. Para tanto,
faremos uso de uma caixa de seleo, que pode ter valores verdadeiros ou falsos.
Como sempre, colocamos o controle sobre a UserForm. Em seguida, damos-lhe o
nome cboxUtilizaPlanilha.
3. Na propriedade ControlSource, escreva rngUtilizarPlanilha, que
o nome que demos ao intervalo da planilha. Na propriedade Caption, escrevemos
o texto do controle, algo como: Utiliza planilha. Tambm podemos escrever algo na
propriedade ControleTipText.
4. Alm de todas essas propriedades j conhecidas, as propriedades importantes
de um CheckBox so:
Value: o valor do controle. Pode ser True ou False;
Triplestate: pode ser True ou False, sendo que este ltimo o valor default.
Se dermos o primeiro valor ao controle, este passar a ter trs estados: verdadeiro (quando
est selecionado), falso (quando no est selecionado) e nada (quando ficar cinzento).
Em algumas ocasies, pode ser til, mas normalmente o deixaremos como False.
5. Agora, vamos ver qual o programa de planilha eletrnica preferido pelo usu-
rio. Para tanto, utilize alguns botes de opo, para oferecer a chance de escolhermos
entre Excel, Lotus 1-2-3, ou qualquer outro programa de planilhas.
A primeira coisa que temos de fazer inserir um controle Quadro (Frame,
em ingls). Esse controle s serve para agrupar controles e para melhorar a apre-
sentao da UserForm. Tambm tem propriedades e eventos, mas quase nunca
so utilizados.
6. Coloque um controle Frame na UserForm, e insira dentro deste os trs botes
de opo. Para inserir um controle dentro de um Frame temos de selecionar o quadro
e, sem retirar a seleo, inserir um novo controle.
7. Para guardar os valores dos botes de opo, vamos nomear as trs clulas
de nossa planilha (podemos, por exemplo, utilizar as clulas E16, E17 e E18), que
nomearemos como rngExcel, rngLotus e rngOutros.
cap05.indd 95 1/11/2006 15:48:35
96 universidade VBA
8. Isso feito, voltamos aos trs botes de opo inseridos na UserForm e, na
propriedade ControlSource de cada um deles, escrevemos um dos nomes que
acabamos de criar. Tambm convm alterar a propriedade Caption de cada um
dos botes para mostrar o texto adequado.
As propriedades Value e Triplestate de um boto de opo funcionam de
maneira semelhante s do controle de seleo.
9. Se testarmos a UserForm, esta funcionar perfeitamente, exceto por um
detalhe. Se o usurio informa que no utiliza nenhuma folha de clculo, os botes
de opo continuam perguntando qual o programa de planilha preferido, o que,
evidentemente, no tem nenhum sentido. O que temos de fazer desativar os botes
de opo.
10. Para desativar qualquer controle (no s os botes de opo), utilizamos a
propriedade Enabled. Se essa propriedade for True, significa que o controle est
ativado, se for False, que est desativado (aparece na cor cinzenta), e o usurio
no pode utiliz-lo.
11. O que nos resta agora saber quando foi alterado o estado (verdadeiro, falso)
da caixa de seleo cboxUtilizaPlanilha. Como sempre, podemos faz-lo com a
ajuda de um evento, o evento Change do controle de verificao, executado toda vez
que alteramos o estado do controle. Portanto, no evento Change temos que mudar
o estado (ativado, desativado) dos botes de opo. O cdigo :
Private Sub cboxUtilizaPlanilha _ Change()
Frame2.Enabled = cboxUtilizaPlanilha.Value
OptionButton1.Enablhed = cboxUtilizaPlanilha.Value
OptionButton2.Enablhed = cboxUtilizaPlanilha.Value
OptionButton3.Enablhed = cboxUtilizaPlanilha.Value
End Sub
Observe que damos propriedade Enabled dos botes de opo e ao Frame o
valor da propriedade Value do controle de verificao. Tambm podemos utilizar
o cdigo:
If cboxUtilizaPlanilha.Value = True Then
OptionButton1.Enablhed = True
.....
Ose
cap05.indd 96 1/11/2006 15:48:35
Propriedades 97
5
captulo
OptionButton1.Enablhed = False
.....
End If
Pois o resultado o mesmo.
importante salientar um detalhe importante: quando a UserForm iniciada,
tambm deveramos ativar/desativar os botes de acordo com o valor da caixa
de seleo. Uma soluo rpida para o problema seria escrever dentro do evento
Userform _ Initialize o mesmo cdigo que h em cboxUtilizaPlani-
lha _ Change. Esse artifcio, porm, no adequado, j que escreveramos o mesmo
cdigo em dois lugares distintos, coisa que temos de evitar pois, se tivermos de efetuar
alguma alterao no cdigo, teremos de faz-lo em mais de um lugar.
O melhor utilizar a cboxUtilizaPlanilha_Change() a partir do evento
Userform_Initialize(). A rotina cboxUtilizaPlanilha_Change chama-
da sempre que se produz o evento Change, mas nada nos impede de habilit-la por
nossa conta a qualquer momento, como, por exemplo, quando iniciamos a UserForm. O
evento Userform_Initialize, em uma configurao como essa, ficaria assim:
Private Sub UserForm _ Initialize()
cboxUtilizaHoja _ Change
SpinButton1.Value = editIdade.Value
End Sub
Enfim, aprendemos a utilizar todos os comandos. Como novo exerccio, vamos
fazer outra UserForm, na qual no vamos utilizar nenhum novo comando, mas sim
um evento novo: KeeUp.
Para tanto, faremos um aplicativo em que o usurio poder inserir uma cifra em
dlares para, automaticamente, obter a converso em euro. Assim como, ao contrrio,
se inserirmos um valor em euro, teremos o valor em dlares:
Exerccio 6
1. Primeiro, criamos uma UserForm e, nela, colocamos duas caixas de texto, que
chamaremos de editDoares e editEuros, duas etiquetas ao lado de cada caixa
de texto, e um boto para fechar o aplicativo.
2. Vamos primeiro ao mais fcil. No boto de fechamento do aplicativo (que
chamaremos de btnFechar) temos que inserir o cdigo para fechar a UserForm:
cap05.indd 97 1/11/2006 15:48:35
98 universidade VBA
Private Sub btnFechar _ Click()
Unload Me
End Sub
3. Enfim, vamos s caixas de texto. Sempre que o usurio escrever R$ 2.500,00,
a caixa de texto correspondente aos euros ser atualizada automaticamente, sem
esperar que a entrada dos dados termine. Para tanto, vamos utilizar o evento KeeUp,
realizado toda vez que o usurio apertar uma tecla.
4. Para escrever o cdigo desse evento, vamos janela de cdigo de nossa User-
Form para selecionar o controle editDolares e, na parte direita, o evento KeeUp.
Colocamos no meio do esqueleto do cdigo a declarao do objeto:
Private Sub editDolares _ KeeUp(BeVal KeeCode As MSForms.
ReturnInteger, BeVal Shift As Integer)
If editDolares.Text <> Then
Se a clula apresenta contedo em dlares, a funo no
est vazio representada por <> ento (Then)
editEuros.Text = Format(editDlares.Value / 3, 0.00)
O contedo da caixa de texto Euros deve apresentar o
valor correspondente caixa de texto Dlares dividido por
trs. 0,00 mostra que o resultado da operao deve ser feito
no formato decimal
Ose
editEuros.Text =
End If
End Sub
O If foi utilizado como uma forma de deteco de erros, pois se a caixa de texto
estiver vazia, podem ocorrer muitos erros, sobretudo se o usurio digitar uma letra
no lugar de um nmero. O resto bastante simples. Trata-se de colocar a caixa edi-
tEuros ou o resultado de editDolares divididos por trs (o valor em dlares de
um euro), e utilizar a funo Format para que apresentem apenas os decimais.
Podemos testar o aplicativo e veremos que cada vez que introduzirmos um carac-
tere na caixa de texto editDolares ser atualizada a caixa de texto editEuros.
5. Agora temos que fazer o contrrio: toda a vez em que escrevemos algo em
editEuros o programa deve atualizar a caixa editDolares. O procedimento exa-
tamente o mesmo:
cap05.indd 98 1/11/2006 15:48:35
Propriedades 99
5
captulo
Private Sub editEuros _ KeeUp(BeVal KeeCode As MSForms.Re-
turnInteger, BeVal Shift As Integer)
If editEuros.Text <> Then
Se a clula apresentar um valor em euros (portanto, no
est vazia), a funo no est vazio representada por <>
ento
editDolares.Text = Format(editEuros.Value * 3, 0.00)
O contedo da caixa de texto Dlares deve apresentar
o valor correspondente caixa de texto Euros multiplicado
por trs. 0,00 mostra que o resultado da operao deve ser
feito no formato decimal.
Ose
editDolares.Text =
End If
End Sub
At o momento, todos os botes utilizados em nossas UserForms servem apenas
para fechar o recurso, com a diferena de que um foi chamado de Cancelar e outro
de OK. No prximo exerccio, aproveitando nosso recm-construdo conversor de
euros, vamos criar dois botes, cada um ao lado de uma caixa de edio, capazes de
capturar da clula ativa da planilha o contedo da caixa de texto a ele associada.
Exerccio 7
1. Colocamos os dois botes, um ao lado de cada caixa de texto, e nomeamos
como btnCapturarReal e btnCapturarEuros. Nos valores Caption, inserimos
algo como Pegar. Vamos ao cdigo:
Private Sub btnCapturarReal _ Click()
ActiveCol.Value = editDlares.Value
End Sub
Private Sub btnCapturarEuros _ Click()
ActiveCol.Value = editEuros.Value
End Sub
O evento utilizado o Click, que j conhecemos de sobra. O cdigo tambm
no difcil: simplesmente colocamos em ActiveCol o valor das caixas de texto
editDolares e editEuros.
cap05.indd 99 1/11/2006 15:48:35
100 universidade VBA
2. Observe que, ao apertar esses botes, capturamos o contedo da planilha, mas
no fechamos a UserForm. Se quisssemos que a UserForm fosse fechada depois de
fazer a captura, teramos de acrescentar o clssico Unload Me em cada uma das
rotinas anteriores.
possvel melhorar muito essa aplicao, fazendo com que, por exemplo, seja
possvel modificar o range de busca da opo, ou que sejamos capazes no s de
dividir, mas tambm de somar, subtrair ou multiplicar mediante um boto de opo.
E exatamente isso o que faremos no prximo exerccio.
Exerccio 8
1. Nesse aplicativo, vamos utilizar um controle novo, o RefEdit. Esse controle
serve para que o usurio possa introduzir uma referncia (um range ou intervalo). Ele
poder faz-lo caso escreva uma referncia absoluta ou um nome de intervalo (como
uma caixa de texto), o que aparece direita, que far com que a UserForm desaparea
e o usurio possa selecionar o intervalo desejado com o mouse ou o teclado.
Os controles que vamos utilizar nessa UserForm so exibidos na tabela seguinte.
No mostraremos com detalhes como montar cada um deles, pois tais comandos j
foram apresentados exausto nos decorrer deste livro. Basta seguir os dados da
tabela para conseguir alterar as propriedades Name e Caption:
Tipo de controle
RefEdit
textos
Frame
OptionButton
OptionButton
OptionButton
OptionButton
CommandButton
CommandButton
Name
RefEdit1
tbValor
Frame1
obSomar
obSubtrair
obMultiplicar
obDividir
btnOK
btnCancelar
Caption
N/A
N/A
Operao
Somar
Subtrair
Multiplicar
Dividir
OK
Cancelar
Tabela 5.1.
3. O intervalo que o usurio introduziu em RefEdit deve ser guardado na
propriedade Text. No entanto, Text uma cadeia (string) de caracteres, razo
pela qual, se quisermos fazer referncia a um intervalo determinado, preciso usar
Range(RefEdit1.Text). Observe o cdigo:
Private Sub UserForm _ Initialize()
obSumar.Value = True
cap05.indd 100 1/11/2006 15:48:36
Propriedades 101
5
captulo
RefEdit1.Text = Sohection.Addrs
End Sub
Primeiro, fazemos com que a operao selecionada por default seja soma, de-
finindo-a como True. Na verdade, podemos definir qualquer valor como padro.
Depois, fazemos com que em RefEdit aparea como intervalo a seleo feita pelo
usurio antes de habilitar a caixa de dilogo.
4. Enfim, os botes, que podem ser inseridos na tela de edio do cdigo:
Private Sub btnOK _ Click()
RealizarOperao
Unload Me
End Sub
e
Private Sub btnCancelar _ Click()
Unload Me
End Sub
A nica diferena entre os dois botes que um deles ativa a rotina Realizar-
Operao antes de fechar a UserForm.
5. Vamos montar a rotina RealizarOperao. Obedea ao cdigo seguinte:
Sub RealizarOperao ()
Dim r As Range
Dim c As Object
Dim i As Doublhe

Set r = Range(RefEdit1.Text)
i = tbValor.Value
For Each c In r.Cols
If obSomar.Value = True Then
c.Value = c.Value + i
OseIf obSubtrair.Value = True Then
c.Value = c.Value - i
OseIf obMultiplicar.Value = True Then
c.Value = c.Value * i
cap05.indd 101 1/11/2006 15:48:36
102 universidade VBA
OseIf obDividir.Value = True Then
c.Value = c.Value / i
End If
Next c
End Sub
6. Vamos explicar a construo do cdigo. Primeiro, obtemos o intervalo selecio-
nado e o armazenamos em r, com o auxlio de Dim.
Set r = Range(RefEdit1.Text)

Logo depois, obtemos o valor a ser utilizado, e que o usurio inseriu em tbValor,
e o armazenamos em i.
i = tbValor.Value
Assim, utilizamos For Each - Next, que j conhecemos, para repetir o mesmo
cdigo em todo o intervalo. O If extenso que utilizamos bem mais simples do que
parece: simplesmente comprova qual o boto de opo ativado (Value = True),
efetuando a operao associada a esse boto.
cap05.indd 102 1/11/2006 15:48:36
Captulo 6
Mais recursos de desenvolvimento
cap06.indd 103 1/11/2006 15:49:17
104 universidade VBA
Mais recursos de desenvolvimento
O VBA uma grande caixa de ferramentas: tudo que se possa imaginar para
incrementar uma planilha, banco de dados ou documento baseado nos padres do
Microsoft Office pode ser obtido procurando nas diversas funes e propriedades
escondidas nas bibliotecas do Visual Basic for Applications. Existe alguma coisa
para ser vista alm disso?
Existe, sim. Na verdade, os recursos do VBA podem ser esticados quase que
indefinidamente, j que ele uma linguagem aberta, baseada em objetos grficos
(UserForms), muito semelhantes aos objetos que formam o prprio Windows, alm
de pequenos scripts escritos em cdigo de sintaxe (estrutura) muito simples.
Essa sintaxe, formada por uma infinidade de estruturas, mtodos e propriedades,
que d corpo s solues e programas criados com o auxlio do VBA: as UserForms
so apenas um esqueleto para elas.
Pois bem: existe muita coisa escondida no VBA, desde o advento do Office 2000.
Isso ocorre por causa das opes de segurana do Microsoft Office, como vimos
no Captulo 2 deste livro: Macros e VBA. O uso dessa configurao abre muitos
horizontes e permite que as macros possam ser executadas de verdade dentro de
uma planilha, sem restrio de acesso a macro ter acesso total ao contedo da
planilha, deixando de ter acesso apenas visualizao do contedo (opo Somente
leitura ou Read Only). Uma macro que fosse um vrus poderia, nesses casos, apagar
todos os dados de uma planilha uma macro bem-intencionada e utilizada para fins
profissionais, no entanto, seria capaz de reformular a aparncia ou, melhor ainda, a
disposio dos dados de uma folha de dados ou de um formulrio de banco de dados,
com um simples clique de boto.
Outra restrio que deixa de existir a de usurio: no ser necessrio ser
administrador do sistema para acessar o sistema. A partir daqui qualquer usurio
do sistema (ou mesmo de uma rede) ser capaz de rodar uma macro ou mesmo de
alter-la com o editor de textos do VBA. claro que a presena de um bom antivrus
na rede ou no computador recomendvel, desde que se deseje dar tal liberdade ao
usurio sem passar por maiores problemas.
Alm de desabilitar a segurana das macros, tambm necessrio abrir o acesso
interno aos projetos do VBA. Assim como a abertura da segurana permite o acesso
dos usurios ao sistema, a realizao dessas configuraes permite o acesso total aos
mdulos VBA e aos cdigos neles transcritos, como se voc desse um upgrade na
linguagem original.
Para fazer isso basta clicar no menu Ferramentas > Macro > Segurana e, em
Fontes confiveis, clicar em Confiar em todos os suplementos e modelos instalados,
e em Confiar no acesso ao projeto do Visual Basic (Figura 6.1). No Excel 2000 clique
cap06.indd 104 1/11/2006 15:49:17
Mais recursos de desenvolvimento 105
6
captulo
Figura 6.1.
Figura 6.2.
Feitas as alteraes, abra o editor de macros (Alt + F11). Ao clicar com o boto
direito do mouse sobre a coluna VBA Project (canto esquerdo da tela) voc notar
que, alm dos objetos Mdulo e Formulrio, passaremos a visualizar tambm os
objetos Mdulo de classe.
Para inserir um mdulo como varivel, utilize o seguinte cdigo dentro do M-
dulo de classe:
Dim cm as CodeModule
Set cm = VBE.ActiveCodePane.CodeModule
ou
With VBE.ActiveCodePane.CodeModule
---
End With
Lembrando que Dim deve ser utilizado sempre para definir variveis. Para trazer
referncias ao mdulo de classe recm-criado dentro de um outro mdulo, utilize:
em Ferramentas > Macro > Segurana e selecione a opo Confiar em todos os
suplementos e modelos instalados (Figura 6.2).
cap06.indd 105 1/11/2006 15:49:17
106 universidade VBA
Dim VBCodeMod As CodeModule
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(Module1).
CodeModule
No caso anterior, pedimos que o mdulo localizado na planilha atualmente ativa
seja aberto.
Para inserir um mdulo de classe diretamente em uma planilha assim que ela for
criada, podemos utilizar a macro seguinte:
Sub AddModule()
Lembre-se de documentar suas macros. Esta macro ser
utilizada para adicionar um mdulo de classe a uma planilha
recm-criada
Note que, na linha abaixo, definimos um componente do
Visual Basic como varivel
Dim VBComp As VBComponent
Definimos agora que o mesmo documento ser adicionado a
uma planilha assim que ela for criada
Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(vbext _
ct _ StdModule)
VBComp.Name = NewModule
Definimos a seguir que a operao deve ser executada de
forma visvel, ou seja, que deve ser possvel visualizar o
Excel em operao no momento em que o mdulo for inserido.
Application.Visible = True
End Sub
Podemos apagar um mdulo do sistema ou de uma determinada planilha utili-
zando uma implementao semelhante:
Sub DeleteModule()
Utilizaremos esta macro ou sub-funo para apagar as ma-
cros de uma planilha ativa
Dim VBComp As VBComponent
Set VBComp = ThisWorkbook.VBProject.VBComponents
(NewModule)
ThisWorkbook.VBProject.VBComponents.Remove VBComp
End Sub
cap06.indd 106 1/11/2006 15:49:18
Mais recursos de desenvolvimento 107
6
captulo
Para inserir um novo procedimento, poderamos utilizar uma sub-funo seme-
lhante mostrada a seguir:
Sub AddProcedure()
Utilizaremos a macro a seguir para inserir um procedi-
mento na planilha atual, sob a forma de um novo mdulo
Dim VBCodeMod As CodeModule
Dim LineNum As Long
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(Novo
Mdulo).CodeModule
With VBCodeMod
LineNum = .CountOfLines + 1
.InsertLines LineNum, _
Sub MeuNovoProcedimento() & Chr(13) & _
Msgbox Este um novo elemento para a planilha &
Chr(13) & _
End Sub
End With
Application.Run MeuNovoProcedimento
End Sub
Em uma implementao mais ousada poderamos, tambm, apagar todo o cdigo
de uma macro utilizando:
Sub DeleteAllCodeInModule()
Dim VBCodeMod As CodeModule
Dim StartLine As Long
Dim HowManyLines As Long
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(NewM
odule).CodeModule
With VBCodeMod
StartLine = 1
HowManyLines = .CountOfLines
.DeleteLines StartLine, HowManyLines
End With
End Sub
cap06.indd 107 1/11/2006 15:49:18
108 universidade VBA
Aplicao dos mdulos
A aplicao de mtodos de classe abre muito o leque de nossas opes: podemos
fazer, por exemplo, com que uma caixa de mensagem exiba data e hora atuais quando
surgir. Isso, na prtica, equivale a criar uma macro dentro da outra:
Call cm.InsertLines (5, Sub ShowTime() & vbCrLf & MsgBox
Now & vbCrLf & End Sub)
Poderamos tambm, de agora em diante, criar eventos a partir de um objeto,
como no caso seguinte. Aqui, criamos um evento que aproxima o cursor do mouse
do boto OK.
Private Sub cmdOK _ MouseMove(ByVal Button As Integer, ByVal
Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
End Sub
Para apagar um procedimento de um mdulo fazendo o reverso do mostrado a
seguir, poderamos utilizar as macros:
Sub DeleteProcedure()
Utilizaremos essa sub-funo para apagar um procedimento
de uma planilha
Dim VBCodeMod As CodeModule
Dim StartLine As Long
Dim HowManyLines As Long
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(NewM
odule).CodeModule
With VBCodeMod
StartLine = .ProcStartLine(MyNewProcedure, vbext _
pk _ Proc)
HowManyLines = .ProcCountLines(MyNewProcedure, vbext _
pk _ Proc)
.DeleteLines StartLine, HowManyLines
End With
cap06.indd 108 1/11/2006 15:49:18
Mais recursos de desenvolvimento 109
6
captulo
Listagem de elementos
via linha de cdigo
Muito mais til para um administrador de sistemas ou programador ser capaz
de listar todos os elementos que esto sendo utilizados em seu projeto, no importa
o tipo. Em tempos em que a administrao de projetos e o desenho de organogramas
de software esto em alta, nada melhor do que fazer com que esses recursos fiquem
ao alcance dos dedos.
O VBA permite isso a partir do momento em que as permisses de acesso direto
ao cdigo so apagadas, como fizemos no incio. Na macro seguinte, por exemplo,
fazemos com que seja possvel listar todos os mdulos existentes no projeto, pouco
importando quantas planilhas e formulrios os constituam:
Sub ListModules()
Esta macro lista mdulos de todo o projeto
Dim VBComp As VBComponent
Dim Msg As String
For Each VBComp In ThisWorkbook.VBProject.VBComponents
Msg = Msg & VBComp.Name & Type: & CompTypeToName(VBComp)
& Chr(13)
Next VBComp
MsgBox Msg
End Sub
Function CompTypeToName(VBComp As VBComponent) As String
A funo a seguir acessa o objeto DirectX, que permite
a publicao da listagem
Select Case VBComp.Type
Case vbext _ ct _ ActiveXDesigner
CompTypeToName = ActiveX Designer
Case vbext _ ct _ ClassModule
CompTypeToName = Class Module
Case vbext _ ct _ Document
CompTypeToName = Document
Case vbext _ ct _ MSForm
CompTypeToName = MS Form
Case vbext _ ct _ StdModule
cap06.indd 109 1/11/2006 15:49:18
110 universidade VBA
CompTypeToName = Standard Module
Case Else
End Select
End Function
Podemos utilizar uma varivel do projeto anterior para listar apenas procedi-
mentos:
Sub ListProcedures()
Lista os procedimentos do projeto
Dim VBCodeMod As CodeModule
Dim StartLine As Long
Dim Msg As String
Dim ProcName As String
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(Save
Module).CodeModule
With VBCodeMod
StartLine = .CountOfDeclarationLines + 1
Do Until StartLine >= .CountOfLines
Msg = Msg & .ProcOfLine(StartLine, vbext _ pk _ Proc)
& Chr(13)
StartLine = StartLine + _
.ProcCountLines(.ProcOfLine(StartLine, _
vbext _ pk _ Proc), vbext _ pk _ Proc)
Loop
End With
MsgBox Msg
End Sub
Manipulao avanada de mdulos
A listagem auxilia no momento de descobrir mdulos redundantes ou que paream
deslocados do projeto. Uma planilha repleta de mdulos redundantes pode tornar-se
demasiado pesada, sobretudo quando utilizada como base de dados para os usurios
de uma rede interna. A macro seguinte ajuda a testar a existncia de um mdulo ou
procedimento listado por meio das implementaes da seo anterior:
cap06.indd 110 1/11/2006 15:49:18
Mais recursos de desenvolvimento 111
6
captulo
Function ModuleExists(ModuleName As String) As Boolean
On Error Resume Next
ModuleExists = Len( _
ThisWorkbook.VBProject.VBComponents(ModuleName).Name) <> 0
End Function

Function ProcedureExists(ProcedureName As String, _
ModuleName As String) As Boolean
On Error Resume Next
If ModuleExists(ModuleName) = True Then
ProcedureExists = ThisWorkbook.VBProject.
VBComponents(ModuleName) _
.CodeModule.ProcStartLine(ProcedureName, vbext _
pk _ Proc) <> 0
End If
End Function
Interveno extrema
A partir do sucesso da funo possvel realizar a alterao dos mdulos, a
comear pelos nomes:
ThisWorkbook.VBProject.VBComponents(Module1).Name = New-
Module

ou
ThisWorkbook.VBProject.VBComponents(ThisWorkbook).Name =
MyWorkbook
Em uma interveno mais extrema podemos utilizar as listagens para referenciar
mdulos de dois projetos diferentes, comparando-os entre si. Uma comparao desse
tipo til para descobrir de que maneira os elementos de dois ou mais projetos pos-
suem correspondncia entre si, e que mdulos podemos importar ou exportar de um
mdulo para outro para incrementar referncias, como feito na funo a seguir:
Sub ExportAllVBA()
Esta funo exporta todos os mdulos de um projeto VBA
para outros projetos existentes
cap06.indd 111 1/11/2006 15:49:18
112 universidade VBA
Dim VBComp As VBIDE.VBComponent
Dim Sfx As String
For Each VBComp In ActiveWorkbook.VBProject.VBComponents
Se a planilha atualmente ativa possuir um projeto do VBA
e componentes VBA
Select Case VBComp.Type
Case vbext _ ct _ ClassModule, vbext _ ct _ Document
Sfx = .cls
Case vbext _ ct _ MSForm
Sfx = .frm
Case vbext _ ct _ StdModule
Sfx = .bas
Case Else
Sfx =
ento cada um dos elementos anteriores mdulos de classe
(cls), forms (frm), mdulos padro (bas) sero copiados
End Select
If Sfx <> Then
e enviados para a planilha ativa no momento, alm da pla-
nilha original
VBComp.Export _
Filename:=ActiveWorkbook.Path & \ & VBComp.
Name & Sfx
End If
Next VBComp
End Sub
A exportao pode ser feita de maneira mais fcil uma simples cpia utilizando
a macro a seguir:
Sub CopyOneModule()
Dim FName As String
With Workbooks(Book2)
Note que, utilizando essa forma de cpia, podemos co-
piar os mdulos para um arquivo de texto e outros tipos de
blocos de informao, e no somente para planilhas, como no
caso anterior
cap06.indd 112 1/11/2006 15:49:19
Mais recursos de desenvolvimento 113
6
captulo
FName = .Path & \code.txt
.VBProject.VBComponents(Module1).Export FName
End With
O envio da informao para blocos de texto no impede que
os mesmos componentes sejam enviados para uma planilha, como
no exemplo seguinte, em que reenviamos os elementos copiados
para a planilha book1
Workbooks(book1).VBProject.VBComponents.Import FName
End Sub
Alertas
O VBA (Visual Basic for Applications), a linguagem de criao de macros e
scripts padro do Microsoft Office, foi criado para adicionar funcionalidades e
automatizar tarefas dentro de documentos do Office. Com o VBA possvel, por
exemplo, formatar automaticamente um documento do Word, criar clulas perso-
nalizadas em uma planilha do Excel, ou incrementar formulrios de um banco de
dados do Access.
Uma das ferramentas mais interessantes em relao ao Excel a que permite a
criao de planilhas e clulas que emitem determinados tipos de alertas ou mensa-
gens de notificao. Esse tipo de recurso permite que uma planilha, por exemplo,
avise ao usurio quando o horrio de trabalho est terminando, ou que o usurio
seja alertado quando o contedo de uma clula ultrapassar uma determinada soma
ou montante.
Como fazer
A primeira coisa a fazer para montar o alarme criar um timer para sua aplicao.
Timer uma funo do VBA que permite a realizao de uma tarefa com base em
uma determinada contagem de tempo.
No exemplo seguinte demonstramos como usar a funo de timer para fazer a
chamada de um procedimento depois da passagem de um determinado intervalo de
tempo. Para realizar o exemplo utilize o Editor do VBA via Excel.
1. Abra o Microsoft Excel e selecione a planilha em que deseja aplicar a macro.
Em seguida clique no menu Ferramentas > Macro > Editor do Visual Basic. Voc
tambm pode utilizar a combinao de teclas Alt + F11 opo muito mais rpida
para abrir o Editor.
cap06.indd 113 1/11/2006 15:49:19
114 universidade VBA
Figura 6.3.
2. Ser aberta uma janela do Microsoft Visual Basic. Existem, acopladas a ela,
duas janelas esquerda. janela superior chamamos de Projeto VBAProject, e
janela inferior damos o nome de Propriedades. Na primeira janela esto os elementos
que fazem parte do projeto projeto, aqui e a partir de agora, ser entendido como
o grupo de macros e planilhas do Excel utilizado para uma determinada funciona-
lidade. Na segunda janela so listadas as propriedades dos objetos que porventura
podem ser incorporados s nossas macros.
3. Clique no menu Inserir > Mdulo. Observe que na janela superior esquerda
(Projeto VBA Project) surge um novo diretrio, chamado Mdulo1. dentro desse
mdulo que sero armazenadas as macros que vamor criar, a partir de agora, para
esse projeto.
4. Note que tambm ser aberta, na janela central, uma janela em branco, de-
nominada Pasta1 Mdulo (ou o nome da planilha que est sendo utilizada para
criar ou mdulo). Essa janela a interface de insero dos comandos, onde vamos
inscrever os cdigos que faro parte da nossa macro.
5. Digite o cdigo a seguir na tela. Os comentrios () servem para orientar voc.
cap06.indd 114 1/11/2006 15:49:19
Mais recursos de desenvolvimento 115
6
captulo
Neste exemplo utilizaremos um timer de cinco segundos para
chamar a funo. A funo que utilizaremos ser Application.
OnTime alertTime. O mtodo OnTime utilizado para fazer com
que o procedimento possa ser executado em um momento espe-
cificado no futuro (seja em uma determinada hora do dia ou
aps uma quantidade especfica de tempo decorrido).
Inicie um sub-procedimento sempre com Sub, acompanhado
do nome que se quer dar ao procedimento.
Sub timerMsg()
Dim utilizado para declarar variveis e espaos de
armazenamento. No nosso caso, alertTime o nosso alerta
que surgir na tela uma varivel porque ele pode ou no
aparecer dentro de um programa maior. bom se acostumar a
formatar alertas e mensagens de texto como variveis.
Dim alertTime
MsgBox a funo utilizada para exibir uma mensagem em
uma caixa de dilogo ou seja, ela cria um objeto predefini-
do (caixa de mensagem) que pode ser visto na tela. Uma caixa
de mensagem, normalmente, aguarda que o usurio clique em um
boto e retorna um Integer que indica qual boto o usurio
clicou. No nosso caso, todavia, a caixa permanecer apenas com
o boto de OK, j que ela ser utilizada apenas como veculo
do alert. A etiqueta (contedo) da caixa deve ser declarada
entre parnteses ().
MsgBox O alarme ser tocado em cinco segundos!
Agora definimos que a varivel alertTime formada pelo
momento atual (Now) mais o valor de cinco segundos. TimeValue
costuma ser utilizado para imprimir um determinado horrio
na tela. Acompanhado do sinal positivo (+), no entanto, pode-
mos utiliz-lo para setar um intervalo para uma determinada
tarefa no caso a sub-tarefa msg, que ensinaremos a montar
logo adiante. Note que o formato utilizado corresponde ao de
um relgio padro (Horas:minutos:segundos). Se quisermos,
portanto, setar a mensagem de alerta para uma hora e meia,
utilizaremos o valor (01:30:00).
alertTime = Now + TimeValue(00:00:05)
cap06.indd 115 1/11/2006 15:49:19
116 universidade VBA
Application.OnTime alertTime, msg
Utilize sempre End Sub para terminar uma sub-funo.
End Sub
Agora criaremos a sub-funo msg, que corresponde ao ob-
jeto (Caixa de mensagens) que deve surgir na tela
Sub msg()
MsgBox Cinco segundos j se passaram! Feche a planilha.
End Sub.
Um segredo a mais
Se voc realizou o teste da macro, deve ter notado que o alerta s foi realizado
depois que colocamos a funo para rodar, utilizando o boto Executar Sub/User
Form. E claro que no adianta nada ter uma macro de alerta de cinco minutos para
o fim do expediente e salvamento da planilha se voc tem de lembrar de acionar a
contagem regressiva.
Esse problema pode ser resolvido com o prprio Application.OnTime, que j
vimos anteriormente, criando um timer para incio do alerta:
Private Sub Alert _ Open()
Application.OnTime TimeValue(17:55:00), timerMsg
End Sub
Sub inventoryDAPs()
Dim myAObject As AccessObject
Dim dap1 As DataAccessPage
Dim rst1 As ADODB.Recordset
Dim cmd1 As ADODB.Command
Open recordset for data access page inventory
Set rst1 = New ADODB.Recordset
rst1.Open dapInventory, CurrentProject.Connection, _
adOpenKeyset, adLockOptimistic, adCmdTable
Empty old inventory before repopulating table
Set cmd1 = New ADODB.Command
With cmd1
cap06.indd 116 1/11/2006 15:49:19
Mais recursos de desenvolvimento 117
6
captulo
.ActiveConnection = CurrentProject.Connection
.CommandText = DELETE dapInventory.* From dapInventory
.CommandType = adCmdText
.Execute
End With
Start loop through pages
For Each myAObject In _
Application.CurrentProject.AllDataAccessPages
With rst1
Start to add a record to the inventory
.AddNew
rst1.Fields(dapLinkName) = myAObject.Name
rst1.Fields(dapFileName) = myAObject.FullName
Collect connect string info
Open (and re-close) any pages that are closed
If myAObject.IsLoaded = True Then
Set dap1 = _
Application.DataAccessPages(myAObject.Name)
rst1.Fields(dapConnectionString) = _
dap1.ConnectionString
Else
DoCmd.Echo False
DoCmd.OpenDataAccessPage myAObject.Name
Set dap1 = _
Application.DataAccessPages(myAObject.Name)
rst1.Fields(dapConnectionString) = _
dap1.ConnectionString
DoCmd.Close acDataAccessPage, _
myAObject.Name, acSaveNo
DoCmd.Echo True
End If
.Update
.MoveNext
End With
Next myAObject
End Sub
cap06.indd 117 1/11/2006 15:49:20
118 universidade VBA
Funes matemticas
Com o cdigo interno do programa disposio, tambm podemos trabalhar
com ferramentas relacionadas a funes matemticas chamadas normalmente de
manipulaes matemticas puras. Algumas dessas manipulaes so possveis em
um cdigo de VBA normal, mas com uma srie de limitaes que no ocorrero
nos exemplos aqui mostrados.
Exemplo 1 Gerador de nmeros aleatrios
Sub rndNo()
Nosso objetivo nessa macro gerar uma fileira de cinco
conjuntos de nmeros aleatrios. Voc pode utilizar essa ma-
cro para gerar jogos de loteria ou da Mega Sena, ou para a
gerao aleatria de senhas ou seqncias numricas.
Dim str As String

For i = 1 To 5
str = str & CStr(Rnd) & vbCrLf
Next i

MsgBox str
As seqncias de nmeros sero retornadas em uma caixa
de mensagem
End Sub
Exemplo 2 Implementao alternativa
do gerador de nmeros aleatrios
Sub rndNo()
Dim str As String

Randomize
For i = 1 To 5
str = str & CStr(Rnd) & vbCrLf
Next i
MsgBox str
End Sub
cap06.indd 118 1/11/2006 15:49:20
Mais recursos de desenvolvimento 119
6
captulo
Exemplo 3 Desvio de curva
Function Mean(Arr() As Single)
Essa macro cria uma Estatstica de Desvio de Curva, base-
ada nos valores presentes na planilha atualmente ativa. Esse
tipo de estatstica utilizado para definir as probabilida-
des reais de um valor frente a um outro valor que lhe serve
como comparao
Dim Sum As Single
Dim i As Integer
Sum = 0
1 igual a 100% de probabilidade ou Verdadeiro em Es-
tatstica
For i = 1 To UBound(Arr)
Sum = Sum + Arr(i)
Next i

Mean = Sum / UBound(Arr)
End Function
Function StdDev(Arr() As Single)
Dim i As Integer
Dim avg As Single, SumSq As Single

avg = Mean(Arr)
For i = 1 To UBound(Arr)
SumSq = SumSq + (Arr(i) - avg) ^ 2
Next i

StdDev = Sqr(SumSq / (UBound(Arr) - 1))
End Function
Exemplo 4 Assimetria de distribuio
Sub compute()
Essa macro pode ser utilizada para desenvolver cdigos
de simetria de distribuio em uma planilha. Isso permite
que se automatize a contagem de valores provveis na diviso
cap06.indd 119 1/11/2006 15:49:20
120 universidade VBA
de nmeros inteiros, uma funo que aplicada na prtica no
mercado financeiro, na distribuio de ttulos financeiros a
um grupo de investidores etc.
Dim Arr(10) As Single
Dim Average As Single
Dim Std _ Dev As Single
For i = 1 To UBound(Arr)
Arr(i) = Sheets(Sheet1).Cells(i, 1)
Next i
Average = Mean(Arr)
Std _ Dev = StdDev(Arr)
MsgBox Total: & vbTab & Average & vbCrLf & StdDev
: & vbTab & Std _ Dev
End Sub
Sub compute()
Dim arr(10) As Single

For i = 1 To 10
arr(i) = Cells(i, 1)
Next i

MsgBox Mean: & vbTab & Format(Mean(arr), 0.0000) &
vbCrLf & _
SD: & vbTab & Format(Var(arr) ^ 0.5, 0.0000) & vb-
CrLf & _
Skew: & vbTab & Format(Skew(arr), 0.0000) & vbCrLf
& _
Kurt: & vbTab & Format(Kurtosis(arr), 0.0000)
End Sub
Function Skew(arr() As Single)
Dim i As Long, n As Long
Dim avg As Single, sd As Single, SumTo3 As Single

n = UBound(arr)
avg = Mean(arr)
cap06.indd 120 1/11/2006 15:49:20
Mais recursos de desenvolvimento 121
6
captulo
sd = (Var(arr)) ^ 0.5

SumTo3 = 0
For i = 1 To n
SumTo3 = SumTo3 + ((arr(i) - avg) / sd) ^ 3
Next i

Skew = SumTo3 * (n / ((n - 1) * (n - 2)))
End Function
Function Kurtosis(arr() As Single)
Dim i As Long, n As Long
Dim avg As Single, sd As Single, SumTo3 As Single

n = UBound(arr)
avg = Mean(arr)
sd = (Var(arr)) ^ 0.5

SumTo4 = 0
For i = 1 To n
SumTo4 = SumTo4 + ((arr(i) - avg) / sd) ^ 4
Next i

Kurtosis = SumTo4 * (n * (n + 1) / ((n - 1) * (n - 2)
* (n - 3))) - (3 * (n - 1) ^ 2 / ((n - 2) * (n - 3)))
End Function
Function Mean(arr() As Single)
Dim Sum As Single
Dim i As Long, k As Long

k = UBound(arr)
Sum = 0
For i = 1 To k
Sum = Sum + arr(i)
Next i

Mean = Sum / k
End Function
cap06.indd 121 1/11/2006 15:49:20
122 universidade VBA
Function Var(arr() As Single)
Dim i As Long
Dim avg As Single, SumSq As Single

k = UBound(arr)
avg = Mean(arr)
For i = 1 To k
SumSq = SumSq + (arr(i) - avg) ^ 2
Next i

Var = SumSq / (k - 1)
End Function
Exemplo 5 Percentual e Intervalo Percentual
Sub GetPercentile()
Percentagem um modo de expressar uma proporo ou uma
relao a partir de uma frao cujo denominador 100. Em
determinados casos, o valor mximo de uma percentagem obri-
gatoriamente 100%, tal qual ocorre na umidade relativa do ar.
Em outros, contudo, o valor pode ultrapassar essa marca, como
quando se refere majorao de um preo. Nesse caso, utili-
zamos intervalos percentuais para arredondar valores.
Dim arr(10) As Single

For i = 1 To 10
arr(i) = Int(Rnd * 50) + 1
Cells(i, 1) = arr(i)
Next i
Cells(10, 2) = u _ percentile(arr, 0.4)
End Sub
Function u _ percentile(arr() As Single, k As Single)
Dim i As Integer, n As Integer

n = UBound(arr)
Call Sort(arr)
x = Application.Max(Application.Min(Int(k * n), n), 1)
u _ percentile = arr(x)
cap06.indd 122 1/11/2006 15:49:20
Mais recursos de desenvolvimento 123
6
captulo
End Function
Sub Sort(ByRef arr() As Single)
Dim Temp As Single
Dim i As Long
Dim j As Long

For j = 2 To UBound(arr)
Temp = arr(j)
For i = j - 1 To 1 Step -1
If (arr(i) <= Temp) Then GoTo 10
arr(i + 1) = arr(i)
Next i
i = 0
10 arr(i + 1) = Temp
If j Mod 100 = 0 Then
Cells(26, 5) = j
End If
Next j
End Sub
Exemplo 6 Gerao de
probabilidades com base numrica
Sub GetProb()
Assim como ocorre na montagem de curvas, a probabilidade
numrica de um evento geralmente representada como um n-
mero real entre 0 e 1. Um evento impossvel tem uma probabi-
lidade de exatamente 0, e um evento dado como certo tem uma
probabilidade de 1, mas a recproca no sempre verdadeira:
eventos de probabilidade 0 no so sempre impossveis, nem
os de probabilidade 1 so sempre certos.
Essa funo representa numericamente as probabilidades
de ocorrncia de um nmero ou grupo de nmeros dentro de um
determinado intervalo.
Dim high As Single, low As Single, profit As Single
Dim counter As Integer
Dim str As String
cap06.indd 123 1/11/2006 15:49:21
124 universidade VBA
high = 500000
low = -100000
profit = 300000

srt =
For j = 1 To 5
counter = 0
For i = 1 To 1000
If profit <= Rnd * (high - low + 1) + low Then
counter = counter + 1
End If
Next i
str = str & counter / 1000 & vbCrLf
Next j

A caixa de mensagem retornar uma string com os valores
MsgBox str
End Sub
Exemplo 7 Histograma
Sub Hist(M As Long, arr() As Single)
Essa funo implementa um histograma. O histograma um
grfico composto por retngulos justapostos, em que a base
de cada um deles corresponde ao intervalo de classe, e a al-
tura, respectiva freqncia. Quando o nmero de dados au-
menta indefinidamente e o intervalo de classe tende a zero,
a distribuio de freqncia passa para uma distribuio de
densidade de probabilidades.
Dim i As Long, j As Long
Dim Length As Single
Cada quebra (break) corresponde a uma alterao na fre-
qncia de probabilidades
ReDim breaks(M) As Single
ReDim freq(M) As Single

For i = 1 To M
freq(i) = 0
cap06.indd 124 1/11/2006 15:49:21
Mais recursos de desenvolvimento 125
6
captulo
Next i
Length = (arr(UBound(arr)) - arr(1)) / M

For i = 1 To M
breaks(i) = arr(1) + Length * i
Next i

For i = 1 To UBound(arr)
If (arr(i) <= breaks(1)) Then freq(1) = freq(1) +
1
If (arr(i) >= breaks(M - 1)) Then freq(M) = freq(M)
+ 1
For j = 2 To M - 1
If (arr(i) > breaks(j - 1) And arr(i) <= breaks(j))
Then freq(j) = freq(j) + 1
Next j
Next i
A partir de agora transformaremos os dados capturados
(freqncias e quebras de probabilidade) em valores aritm-
ticos, que sero impressos nas clulas indicadas
For i = 1 To M
Cells(i, 1) = breaks(i)
Cells(i, 2) = freq(i)
Next i
End Sub
cap06.indd 125 1/11/2006 15:49:21
cap06.indd 126 1/11/2006 15:49:21
Captulo 7
Projetos e implementaes
cap07.indd 127 1/11/2006 15:49:41
128 universidade VBA
Macros de procura e referncia
Neste captulo, vamos montar tipos mais avanados de macros, com especial
ateno s macros de procura e referncia. Essas macros nos permitiro movimentar
clulas, colunas e planilhas, ou realizar de aes. recomendvel trabalhar com
pastas e planilhas que contenham dados, para que possamos conferir os efeitos da
execuo da macro.
A primeira macro que criaremos tem por objetivo buscar o ltimo elemento de uma
lista de objetos, materiais ou outros elementos quaisquer. Interpretaremos que o final
da lista ocorre quando encontramos uma clula vazia. A macro que ser a seguinte:
Sub Final()
While ActiveCell.Value <>
ActiveCell.Offset(1, 0).Range(A1).Select
Wend
End Sub
Observe que, com essa macro, sempre temos a a primeira clula ativad, em bran-
co, (While ActiveCell.Value <> ) depois do final da lista (ActiveCell.
Offset(1, 0).Range(A1).Select).
Buscando o final de uma lista
e inserindo uma ltima entrada
Esta macro igual anterior, com a diferena de que a clula ativada a ltima
com uma entrada vlida da lista (objeto, nmero etc.):
Sub FinalLista()
While ActiveCell.Value <>
ActiveCell.Offset(1, 0).Range(A1).Select
Wend
cap07.indd 128 1/11/2006 15:49:41
Projetos e implementaes 129
7
captulo
ActiveCell.Offset(-1, 0).Range(A1).Select
End Sub
Note que, nessa macro, efetua-se uma varredura at encontrarmos a clula vazia
aps o final da lista (ActiveCell.Offset(1, 0).Range(A1).Select), mas,
logo em seguida, ordenamos macro que suba uma linha (ActiveCell.Offset(-
1, 0).Range(A1).Select), encontrando, portanto e por aproximao, a ltima
linha com contedo.
Buscar uma entrada na lista
e apagar toda a linha da entrada
Imagine que temos uma planilha de dados na qual nos interessa procurar um ele-
mento determinado e apagar todos os dados que apaream na mesma linha. Suponha
que a tabela tenha nome, telefone e endereo do conjunto de clientes de uma casa de
materiais de construo. A busca ser realizada a partir de parmetros guardados
na linha em que esto as informaes sobre o endereo de cada cliente.
Para criar uma macro com essas caractersticas, abra o editor do Visual Basic
e digite:
Sub ApagarLinhas()
While ActiveCell.Value <>
If ActiveCell.Value <> So Paulo Then
ActiveCell.Offset(1, 0).Range(A1).Select
Else
Selection.EntireRow.Delete
End If
Wend
End Sub
cap07.indd 129 1/11/2006 15:49:41
130 universidade VBA
importante notar que, ao executar a macro, no possvel recuperar a linha
apagada, como acontece se apagarmos uma linha manualmente, a partir do atalho
Ctrl + Z.
Buscando o final de uma
lista com espaos em branco
Imagine que temos uma lista de dados dentro da qual existem espaos em branco
(clulas e linhas inteiras). Se utilizssemos a primeira macro criada neste captulo, ela
interpretaria tais espaos em branco como o final da lista, e no leria o restante do
contedo. Ento, criaremos uma macro que interpretar como final da lista apenas
dois espaos em branco consecutivos. Observe:
Sub FinalListaEspecial()
Sair = No
While Sair = No
While ActiveCell.Value <>
ActiveCell.Offset(1, 0).Range(A1).Select
Wend
ActiveCell.Offset(1, 0).Range(A1).Select
If ActiveCell.Value <> Then
Sair = No
Else
Sair = Sim
End If
Wend
End Sub
cap07.indd 130 1/11/2006 15:49:41
Projetos e implementaes 131
7
captulo
Elementos repetidos
Nas macros criadas anteriormente, vimos que possvel automatizar funes de
busca e movimentao por clulas e linhas, sendo possvel tambm eliminar registros
que no nos interessarem mais.
Agora, criaremos uma macro que, alm de procurar e retirar elementos em branco,
seja capaz, tambm, de retirar os elementos repetidos de uma lista. Se o elemento
da clula for igual a outro ou se a clula for vazia, obedecendo aos padres de for-
matao, vamos exclu-la e subir uma posio na lista para, assim, eliminar todas as
reas em branco da lista.
Algumas macros, como as funes, devem obedecer a alguns pr-requisitos. No
caso dessa macro especfica a lista deve estar ordenada para que a macro funcione
corretamente. O cdigo para criao da macro o seguinte:
Sub EliminarRepetidos()
contador = 0
valor = ActiveCell.Value
ActiveCell.Offset(1, 0).Range(A1).Select
While ActiveCell.Value <>
If ActiveCell.Value = valor Then
Selection.Delete Shift:=xlUp
contador = contador + 1
Else
valor = ActiveCell.Value
ActiveCell.Offset(1, 0).Range(A1).Select
End If
Wend
cap07.indd 131 1/11/2006 15:49:42
132 universidade VBA
Resposta = MsgBox(Foram encontrados & contador
& elementos repetidos, 1, Nmero de repetidos)
End Sub
Nessa macro, empregamos uma varivel chamada contador, que nos ser til
para contabilizar o nmero de elementos repetidos encontrados na lista. O valor
do contador inicialmente zero, e aumenta em uma unidade sempre que clulas
duplicadas so encontradas.
Eliminando elementos repetidos
Eliminar elementos repetidos em uma lista e fazer um registro. Na macro anterior,
eliminamos todos os elementos repetidos de uma lista, para que restasse apenas um
dos elementos.
No entanto, poderamos criar elementos que nos permitissem contabilizar quantas
vezes um determinado elemento repetido encontrado, controlando o que foi digitado
inicialmente na tabela, bem como do que foi apagado pela macro anterior.
O script da macro ser o seguinte:
Sub EliminarRepetidoseRegistro()
contador = 1
valor = ActiveCell.Value
ActiveCell.Offset(1, 0).Range(A1).Select
While ActiveCell.Value <>
If ActiveCell.Value = valor Then
ActiveSheet.Next.Select
If ActiveCell.Value <> valor Then
ActiveCell.Offset(1, 0).Range(a1).Select
ActiveCell.Value = valor
cap07.indd 132 1/11/2006 15:49:42
Projetos e implementaes 133
7
captulo
End If
ActiveSheet.Previous.Select
Selection.Delete Shift:=xlUp
contador = contador + 1
Else
If contador <> 1 Then
ActiveSheet.Next.Select
ActiveCell.Offset(0, 1).Range(a1).Select
ActiveCell.Value = contador
ActiveCell.Offset(0, -1).Range(a1).Select
ActiveSheet.Previous.Select
End If
contador = 1
valor = ActiveCell.Value
ActiveCell.Offset(1, 0).Range(A1).Select
End If
Wend
If contador <> 1 Then
ActiveSheet.Next.Select
ActiveCell.Offset(0, 1).Range(a1).Select
cap07.indd 133 1/11/2006 15:49:42
134 universidade VBA
ActiveCell.Value = contador
ActiveCell.Offset(0, -1).Range(a1).Select
ActiveSheet.Previous.Select
End If
End Sub
Comparao entre colunas
Depois de procurar e excluir dados em uma determinada lista utilizando as linhas
em branco como coordenadas, criaremos uma macro que compare as diferentes
colunas, eliminando, por exemplo, da primeira coluna elementos que porventura
sejam encontrados tambm na segunda.
Assim, construiremos uma planilha com as seguintes caractersticas: na primeira
linha ser colocada a nossa lista, que pode ser a mesma utilizada nos demais exemplos
deste captulo. Na segunda coluna, vamos inserir os elementos que sero encontrados
e excludos da primeira.
Criada a tabela, escrevemos a macro, explicando mais tarde cada uma das linhas
que a compe.
ATENO
Os nmeros presentes no cdigo servem apenas de referncia para a expli-
cao posterior e no devem ser inseridos no cdigo da macro.
1 Sub Repetidos()
2 Range(B1).Select
3 Position = 1
4 While ActiveCell.Value <>
5 valorcomparao = ActiveCell.Value
6 Range(a1).Select
cap07.indd 134 1/11/2006 15:49:42
Projetos e implementaes 135
7
captulo
7 Sair = no
8 While ActiveCell.Value <> And Sair = no
9 If ActiveCell.Value = valorcomparaco Then
10 resposta = MsgBox(Deseja apagar essa entrada?, 4,
Encontrado!)
11 If resposta = vbYes Then
12 Selection.Delete Shift:=xlUp
13 End If
14 Sair = sim
15 Else
16 ActiveCell.Offset(1, 0).Range(A1).Select
17 End If
18 Wend
19 Position = Position + 1
20 Range(b1).Select
21 ActiveCell.Offset(Posio - 1, 0).Range(a1).Select
22 Wend
23 End Sub
Escrita a macro, salve-a e confira o funcionamento, linha a linha:
Linha 2: com essa instruo, nos situamos na primeira clula da coluna B para
iniciar a busca dos dados que desejamos apagar;
Linha 3: criamos uma varivel chamada Position para controlar a fila em
que nos encontramos na segunda coluna;
cap07.indd 135 1/11/2006 15:49:42
136 universidade VBA
Linha 4: aqui, criamos um looping que se repetir at que no existam mais
elementos a a serem buscados;
Linha 5: criamos uma varivel chamada valorcomparao, com a qual
trabalharemos para comparar os elementos da primeira coluna com os da segunda.
O valor da clula em que nos encontramos na coluna B passa a estar na varivel
valorcomparao;
Linha 6: passamos para a coluna A para iniciar o processo de comparao;
Linha 7: criamos uma nova varivel chamada Sair, com a qual controlamos
a sada (interrupo) ou no do looping criado na linha 4. Sairemos apenas no
momento em que encontrarmos um elemento que esteja na segunda e na primei-
ra colunas;
Linha 8: aqui, comeamos um looping que se repetir at chegarmos ao final
da primeira coluna, caso no existam elementos comuns, ou at que se encontre um
elemento comum que ser indicado na varivel Sair;
Linha 9: nesta linha, perguntaremos se a clula em que nos encontramos (pri-
meira coluna) igual ao valor que temos dentro da varivel valorcomparao;
Linha 10: se encontrarmos coincidncia de elementos, faremos a pergunta sobre
se realmente preciso excluir os resultados;
Linha 11: observamos se a resposta do usurio foi afirmativa;
Linha 12: se o usurio responde afirmativamente, eliminamos a clula com
a coincidncia e encurtamos a lista at a linha acima. Dessa forma, no teremos
espaos em branco no meio da lista;
Linha 13: terminamos a estrutura Sim, iniciada na Linha 11;
Linha 14: como foi localizado um elemento coincidente, varivel Sair ser
atribudo o valor sim:
Linha 15: aqui, iniciamos o caso em que o valor selecionado na primeira coluna
no coincidente com o valor inscrito na varivel valorcomparao;
Linha 16: se no coincidirem os dados de ambas as colunas, avanaremos uma
posio dentro da primeira;
Linha 17: aqui, terminamos a estrutura If iniciada na Linha 9;
Linha 18: terminamos o looping iniciado na Linha 8;
Linha 19: incrementamos em (+ 1) o valor da varivel Position, j que avan-
amos uma posio dentro da segunda coluna;
Linha 20: passamos segunda coluna para continuarmos comparandoos ele-
mentos;
Linha 21: avanamos na segunda coluna o nmero de vezes que nos indicado
na varivel Position, para iniciar novamente a comparao entre os elementos de
ambas as colunas;
Linha 22: terminamos o script principal dessa macro;
Linha 23: terminamos a macro.
cap07.indd 136 1/11/2006 15:49:42
Projetos e implementaes 137
7
captulo
Essa macro bastante completa, e recomendamos que repita seu estudo quantas
vezes forem necessrias, at absorver todos os seus conceitos. Para testar a macro,
lembre-se de que basta criar uma lista na primeira coluna de uma planilha e inserir
os elementos que deseja apagar na segunda coluna.
Lista de planilhas abertas
e com clulas ativas
Com a macro seguinte, pretendemos capturar informaes das planilhas atual-
mente ativas, bem como das clulas ativas em cada planilha. Essa uma implementa-
o simples e com fins puramente didticos. Uma aplicao real e capaz de cumprir
a funo de abertura de ndice de documentos abertos e ativos pode ser encontrada
no final deste captulo:
Aplicao para captura de planilhas e clulas ativas
Sub SheetNamesDownRows()
Dim iSheet As Long
A varivel Dim utilizada para alocar informaes sobre
a planilha em memria
For iSheet = 1 To ActiveWorkbook.WorkSheets.Count
Estabelecemos que iSheet ser considerado verdadeiro
(expresso lgico-booleana 1) sempre que existir uma plani-
lha ativa
ActiveCell.offset(iSheet - 1,0) = & WorkSheets(iSheet).
Name
Next iSheet
End Sub
Em uma aplicao um pouco diferente na mesma planilha, podemos fazer com
que os nomes das planilhas ativas em um sistema sejam atribudos s colunas de
uma planilha utilizada como ndice. As colunas utilizadas vo de B1 a IV1. O limite
de 255 planilhas listadas (uma planilha Excel tem por padro 256 colunas), mas
descartamos a coluna A:
Sub SheetNamesAcrossTop()
Dim iSheet As Long
For iSheet = 1 To ActiveWorkbook.WorkSheets.Count
Range(B1).offset(0,iSheet - 1) = & WorkSheets(iSheet).
Name
cap07.indd 137 1/11/2006 15:49:42
138 universidade VBA
Next iSheet
End Sub
Em uma implementao mais til, podemos montar uma macro capaz de listar
(comando Sort) todas as planilhas ativas, seguindo uma determinada ordem. Para
tanto, basta abrir uma planilha em branco e inserir o seguinte cdigo:
Esta planilha lista todas as planilhas ativas no sistema
e as organiza em ordem crescente, utilizando como critrio os
nomes e dividindo o resultado por linhas (rows)
Sub SheetNamesSortedDownRows()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim Rng As Range
Dim WS As Worksheet
Set Rng = Range(A1)
For Each WS In ActiveWorkbook.Worksheets
Rng.Value = & WS.Name
Set Rng = Rng(2, 1)
Next WS
Cells.Sort Key1:=Range(A1), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
Range(A1).Select
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Em uma implementao mais simples, podemos criar, a partir de uma planilha
vazia, uma macro que funcione como um contador das clulas preenchidas em todas
as planilhas de uma pasta. Alm de mais simples so utilizados apenas objetos
da planilha e elementos de formatao o resultado visual tambm mais simples
e vistoso.
Sub ContagemTodasasPlanilhasd umaPasta()
Dim wkBook As Workbook, wkSheet As Worksheet 2006-02-01
Dim iRow As Long, iSheet As Long: iRow = 1
Worksheets.Add After:=Sheets(Sheets.Count)
Set wkSheet = ActiveSheet
cap07.indd 138 1/11/2006 15:49:42
Projetos e implementaes 139
7
captulo
Criamos automaticamente uma nova planilha aps as pla-
nilhas ativas, para nela inserir os dados de contagem das
demais planilhas
Columns(A:B).NumberFormat = @
Columns(C).NumberFormat = #,###S
Aqui formatamos as colunas, atribuindo a cada uma delas
um formato de nmero
Range(a1:g1) = Array(Pasta, Planilha, _
pos, linhas, colunas, Clulas, Valor em
A1)
Aqui atribumos rtulos a cada uma das colunas. Defini-
mos primeiro o intervalo utilizado (Range) e estabelecemos
que ele corresponde (=) a um Array (rtulo) para cada clula
do intervalo.
Rows(1:1).Font.Bold = True
For Each wkBook In Workbooks
iSheet = 0
For Each wkSheet In wkBook.Worksheets
iRow = iRow + 1: iSheet = iSheet + 1
Cells(iRow, 1) = wkBook.Name
Cells(iRow, 2) = wkSheet.Name
Cells(iRow, 3) = iSheet placement
Estabelecemos que no se deve contar clulas espe-
ciais caso elas estejam protegidas.
Cells(iRow, 4).Value = wkSheet.UsedRange.Rows.Count
Cells(iRow, 5).Value = wkSheet.UsedRange.Columns.Count
Cells(iRow, 6) = Cells(iRow, 4) * Cells(iRow, 5)
Cells(iRow, 7) = wkSheet.Cells(1, 1).Text
On Error GoTo 0
Next wkSheet
Next wkBook
Cells.EntireColumn.AutoFit
If Columns(G).ColumnWidth > 45 Then _
Columns(G).ColumnWidth = 43
Com o objeto, Sort definimos a maneira pela qual os re-
sultados sero listados
Cells.Sort Key1:=Range(A2), Order1:=xlAscending, _
Key2:=Range(B2), Order2:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False,
_
cap07.indd 139 1/11/2006 15:49:43
140 universidade VBA
Orientation:=xlTopToBottom
Range(A1).Select
End Sub
O resultado final da aplicao da macro pode ser visto na tabela seguinte:
Pasta
Pasta1
Pasta1
Pasta1
Pasta1
PESSOAL.XLS
Programao planilhas
em VBAl.xls
Programao planilhas
em VBAl.xls
Programao planilhas
em VBAl.xls
Programao planilhas
em VBAl.xls
Programao planilhas
em VBAl.xls
Programao planilhas
em VBAl.xls
Planilha
Plan1
Plan2
Plan3
Plan4
Plan1
Plan1
Plan2
Plan3
Plan4
Plan5
Plan6
Posio
1S
2S
3S
4S
1S
1S
2S
3S
4S
5S
6S
Linhas
9
1
1
12
1
44
1
1
1
1
1
Colunas
7
1
1
7
1
256
1
1
1
3
3
Clulas
63
1
1
84
1
11264
1
1
1
3
3
Valor em A1
workbook
Pasta
Redes de
Computadores
Tabela 7.1.
Vale notar que Sort, sem nenhum parmetro extra, organiza as informaes da
primeira coluna em ordem crescente.
Poderamos tornar esse aplicativo ainda mais interessante, pois, como no utili-
zamos uma UserForm para mont-lo, ele tambm no ter botes. Porm, podemos
incluir uma macro no aplicativo, fazendo com que todas as planilhas, salvo a planilha
ativa, sejam fechadas aps a contabilizao de suas propriedades:
Sub FecharPlanilhas ()
Dim wkbk As Workbook
For Each wkbk In Application.Workbooks
If wkbk.Name <> ActiveWorkbook.Name Then
cap07.indd 140 1/11/2006 15:49:43
Projetos e implementaes 141
7
captulo
If Windows(wkbk.Name).Visible = True Then
MsgBox wkbk.Name & & Windows(wkbk.Name).Visible
wkbk.Close SaveChanges:=False or make it true
End If
End If
Next
End Sub
Colecionando planilhas
O cdigo seguinte lista planilhas ou folhas de dados ativas, organizando-as em
uma nica janela. Mais simples do que a implementao anterior, esse cdigo pode
ser empregado para criar visualizadores ou gerenciadores de arquivos. Note que
Dim continua sendo utilizado para alocar informaes na memria e transform-
las em variveis:
Dim wkBook As Workbook
Dim wkSheet As Worksheet
Dim x As Long, cSht As Long
For Each wkBook In Workbooks
x = x + 1: cSht = 0
Cells(1, x) = wkBook.Name
For Each wkSheet In wkBook.Worksheets
cSht = cSht + 1
Cells(cSht + 1, x) = & wkSheet.Name
Next wkSheet
Next wkBook
Em uma implementao semelhante, podemos ver os nomes, e tambm a quanti-
dade de planilhas abertas. Para tanto, utilize o objeto wkBook.Worksheets.Count
(um contador) no lugar do visualizador de nomes da verso anterior, representado
por wkBook.Worksheets:
Dim wkBook As Workbook
Dim wkSheet As Worksheet
Dim x As Long, cSht As Long
For Each wkBook In Workbooks
x = x + 1
Cells(1, x) = wkBook.Name
cap07.indd 141 1/11/2006 15:49:43
142 universidade VBA
For cSht = 1 To wkBook.Worksheets.Count
Cells(cSht + 1, x) = & wkBook.Worksheets(cSht).Name
Next cSht
Next wkBook
Em outra implementao interessante, aproveitando de modo mais prtico os
dois exemplos apresentados, podemos criar um aplicativo capaz de colecionar os
nomes das planilhas abertas, dispondo os nomes capturados verticalmente, a partir
da clula abaixo da clula ativa, se esta possuir contedo, ou a partir (inclusive) da
clula ativa, se ela no tiver contedo:
Sub ListarNomesPlanilhas2()
Dim iSheet As Long
For iSheet = 1 To ActiveWorkbook.WorkSheets.Count
ActiveCell.offset(iSheet - 1,0) = & WorkSheets(iSheet).
Name
Next iSheet
End Sub
Macros de formatao
Formatar uma planilha nunca muito agradvel, principalmente quando o tempo
curto: um trabalho braal, repetitivo e que traz poucos resultados concretos a um
projeto, apesar do aspecto visual ajudar muito.
A primeira macro de formatao que vamos explorar uma macro de busca que,
ao mesmo tempo, consegue alterar aspectos de formatao. Ela far com que a cor
de uma clula com frmula passe a ser azul, ao mesmo tempo em que apagar todas
as formataes de cor nas clulas que no tm frmula:
Sub ColorFormulas()
Cells.FONT.ColorIndex = xlAutomatic
Selection.SpecialCells(xlcelltypeformulas).FONT.Colo-
rIndex = 5
End Sub
Em algumas verses do Excel, as clulas com frmulas so um pouco instveis.
Para sermos especficos, as verses posteriores ao Excel 97, utilizadas na maioria
dos computadores. A macro anterior pode no funcionar nessas verses, razo pela
qual apresentamos uma implementao alternativa:
cap07.indd 142 1/11/2006 15:49:43
Projetos e implementaes 143
7
captulo
Sub ColorFormulas()
Utilize para verses posteriores ao Microsoft Excel 97
Cells.FONT.ColorIndex = xlAutomatic
Selection.SpecialCells(xlFormulas).FONT.ColorIndex = 5
End Sub
De maneira semelhante, podemos colorir de azul as clulas desprotegidas contra
edio de usurios:
Sub FormatDesprotegido()
For Each Item In Intersect(ActiveSheet.UsedRange, Se-
lection.Cells)
If Item.Locked = False Then
Se o item selecionado no estiver protegido (locked),
segundo a expresso booleana False, ento (Then)
Item.Font.colorindex = 32
Quando utilizamos o Item.Font.colorindex, pedimos que o
objeto Item.Font procure referncias sua configurao na
tabela colorindex
End If
Next
End Sub
Mudanas automticas
de formatao
As duas pequenas macros apresentadas ajudam na formatao geral de uma
planilha, mas no fazem nada muito extraordinrio no sentido genrico.
Ao contrrio do que fizemos at agora, a macro seguinte capaz de fazer com que
sejam executadas mudanas na formatao, utilizando como critrio cores internas
da fonte e das colunas. No exemplo, faremos com que todas as clulas com contedo
em azul claro (41 na tabela de cores do Excel) sejam transformadas em contedo
com fonte branca e colunas amarelas:
Sub brancoParaazul()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim cell As Range
---Range(A3:N100).Select
cap07.indd 143 1/11/2006 15:49:44
144 universidade VBA
For Each cell In Selection
If cell.Interior.colorindex = 41 And cell.Column = 4 Then
cell.Font.colorindex = 2 2=white, 6=yellow
End If
Next cell
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = False
End Sub
Podemos fazer mais truques com cores, inserindo, por exemplo, uma formatao
condicional em nossas planilhas por meio de macros VBA. A formatao condicional
faz alteraes na aparncia do Excel com base em determinados parmetros preesta-
belecidos. mais ou mais o que fizemos at agora, com a ressalva de que utilizamos
Dim para reservar as variveis equivalentes a cada caso presente na planilha. Os casos
a que nos referimos so os diferentes tipos de formatao que podem ser aplicadas
a uma planilha, utilizando como parmetro os valores apresentados em cada linha,
que sero transformados em uma cor:
Sub CordaLinhanaClula()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim cell As Range
For Each cell In Intersect(Selection, ActiveCell.Entire-
Column, _
ActiveSheet.UsedRange)
Select Case cell.Value
Case Is >= 50
cell.EntireRow.Interior.colorindex = 20
Se o valor na linha for maior que 50, seu contedo ser
pintado de azul claro
Case Is >= 40
cell.EntireRow.Interior.colorindex = 37
Se o valor encontrado for menor que 40, a linha ser co-
lorida com outra tonalidade de azul
Case Is >= 20
cell.EntireRow.Interior.colorindex = 38
Se o valor for maior que 20, a linha ser pintada com a
cor salmo
Case Is >= 0
cap07.indd 144 1/11/2006 15:49:44
Projetos e implementaes 145
7
captulo
cell.EntireRow.Interior.colorindex = 36
Se o valor for maior que 0, a cor da linha ser amarelo
Case Else
cell.EntireRow.Interior.colorindex = 44
Em outras situaes, a cor da linha ser amarelo ouro
End Select
Next cell
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = False
End Sub
Em outro exemplo de macro que utiliza formatao condicional, podemos fazer
com que elementos como clulas, linhas e colunas sejam excludos com base em uma
cor ou outro tipo de formatao. Montaremos, a seguir, uma macro que far com
que todas as linhas em vermelho de uma planilha sejam apagadas:
Sub DeleteLinhasemVermelho()
A macro s funcionar com a cor preestabelecida. Para
outros tipos de cores, faa a alterao da identificao da
cor no cdigo.
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim rng As Range, ix As Long
Set rng = Intersect(Range(A:A), ActiveSheet.UsedRange)
For ix = rng.Count To 1 Step -1
If rng.Item(ix).Interior.ColorIndex = 3 Then
rng.Item(ix).EntireRow.Delete
End If
Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Ligao com outros elementos
Os cdigos de VBA tambm podem ser utilizados para interligar planilhas do
Excel com dispositivos de hardware, como impressoras, HDs portteis e escneres.
No exemplo seguinte, vamos montar um sistema de impresso direta. Esse sistema
ideal para a impresso de notas fiscais, sendo que a impressora deve ser iniciada por
cap07.indd 145 1/11/2006 15:49:44
146 universidade VBA
meio do comando Open, e os dados sero enviados por meio do comando Print.
Observe:
Open Lpt1 For Output As #1
Em que:
Open um mtodo que pede a abertura de um objeto;
Lpt1 o objeto que deve ser aberto. Lpt equivale a uma porta paralela ins-
talada no computador, e 1 nos diz que a impressora est na primeira porta paralela
(o default da configurao);
For Output indica que o objeto aberto por Open deve ser retornado para
uma determinada sada.
Com a utilizao desse comando, podemos personalizar a forma como as consultas
a partir de uma planilha sero impressas. Vejamos:
Muda o passo para 8 LPP, imprimindo caracteres especiais.
Open Lpt1 For Output As #1
Print #1, Chr(27) & 0
Imprime o texto de forma condensada.
Open Lpt1 For Output As #1
Print #1, Chr(15)
Salta uma linha para cada linha impressa.
Open Lpt1 For Output As #1
Print #1,
Comentrios
Existem muitas coisas para imprimir em uma planilha do Excel, alm dos con-
tedos das clulas. Podemos, por exemplo, imprimir os comentrios presentes nas
clulas de uma planilha. Esses comentrios so inseridos por meio da ferramenta
Comentrio, localizada no menu Inserir do Excel.
Crie ou abra uma planilha que j tenha comentrios e, em seguida, utilize o editor
do VBA para inserir o cdigo:
Aqui, selecionamos todas as clulas que tm comentrios
Sub SelectComentrios()
cap07.indd 146 1/11/2006 15:49:44
Projetos e implementaes 147
7
captulo
Selection.SpecialCells(xlCellTypeComments).Select
End Sub
Agora, habilitamos a impresso das clulas
Dim mycomment As Comment, filename As String
Dim mySht As Worksheet
Dim IEpath As String, Netscapepath As String
filename = C:\temp\ccomment.txt
Enviamos os textos de todos os comentrios para o arquivo
temporrio comment.txt
Open filename For Output As #1
Print #1, FormatDateTime(Date, vbLongDate)
For Each mySht In Worksheets
For Each mycomment In Worksheets(mySht.Name).Comments
Print #1,
Print #1, mycomment.Parent.Parent.Name & ! _
& mycomment.Parent.Address(0, 0) _
& comment: & Trim(mycomment.Text)
If mycomment.Parent.Column > 1 Then _
Print #1, cell & mycomment.Parent.offset(0, -1). _
Address(0, 0) & on left has value: _
& mycomment.Parent.offset(0, -1).Value
Print #1, cell & mycomment.Parent.Address(0, 0) & _
has value: & mycomment.Parent.Value
Next mycomment
Next mySht
Close #1
Netscapepath = _
H:\program files\netscape\Communicator\program\nets-
cape.exe
IEpath = C:\program files\internet explorer\iexplore.exe
Shell IEpath & & filename, vbNormalFocus
Shell Netscapepath & & filename, vbNormalFocus
Shell Notepad & filename, vbNormalFocus
End Sub
Em uma implementao mais ousada em relao construo do cdigo, mas
voltada para objetivos menos prticos, podemos criar uma macro que imprima
comentrios no em uma impressora, mas sim em uma planilha, atribuindo a cada
cap07.indd 147 1/11/2006 15:49:44
148 universidade VBA
uma das colunas presentes um comentrio. Vale lembrar que, como uma planilha
tem apenas 256 colunas, sero impressos at 256 comentrios:
Sub PrintComentriosporColuna()
Dim cell As Range
Dim myrange As Range, myrangeC As Range
Dim col As Long
Dim RowOS As Long
Dim wsSource As Worksheet
Dim wsNew As Worksheet
If ActiveSheet.Comments.Count = 0 Then
MsgBox No h comentrios na planilha
Exit Sub
A sub-rotina anterior estabelece que se (If) o nmero de
comentrios presentes em uma planilha igual a zero, ento
(Then) deve ser exibido a caixa de mensagem (MsgBox) avisando
que no existem comentrios na planilha.
End If
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual xl95 uses
xlManual
Set wsSource = ActiveSheet
Sheets.Add
Set wsNew = ActiveSheet
wsSource.Activate
With wsNew.Columns(A:C)
.VerticalAlignment = xlTop
.WrapText = True
End With
wsNew.Columns(B).ColumnWidth = 15
wsNew.Columns(C).ColumnWidth = 60
wsNew.PageSetup.PrintGridlines = True
RowOS = 2
wsNew.Cells(1, 3) = & Application.ActiveWorkbook.Full-
Name & -- & _
Application.ActiveSheet.Name
For col = 1 To ActiveSheet.UsedRange.Columns.Count
Set myrangeC = Intersect(ActiveSheet.UsedRange,
Columns(col), _
cap07.indd 148 1/11/2006 15:49:44
Projetos e implementaes 149
7
captulo
Cells.SpecialCells(xlCellTypeComments))
If myrangeC Is Nothing Then GoTo nxtCol
For Each cell In myrangeC
If Trim(cell.Comment.Text) <> Then
RowOS = RowOS + 1
wsNew.Cells(RowOS, 1) = & cell.Address(0, 0)
& :
wsNew.Cells(RowOS, 2) = & cell.Text
wsNew.Cells(RowOS, 3) = & cell.Comment.Text
End If
Next cell
nxtCol:
Next col
wsNew.Activate
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Mais alguns comentrios
Os comentrios de clulas do Excel podem ser um laboratrio interessante para
macros que trabalham com formatao. Alm de ser simples (como j mostramos)
capturar o texto dos comentrios de uma ou mais planilhas, esses textos podem ser
facilmente manipulados ou alterados assim que so enviados para a memria ou para
um arquivo de armazenamento.
Para alterar o tipo de fonte presente em um comentrio. Podemos utilizar a
seguinte macro:
Sub (AlteraoComentrios)
With ActiveCell
.Comment.Shape.TextFrame. _
Characters.Font.Size = 14
Selecionamos o objeto e pedimos na linha seguinte que a
fonte seja alterada para o tamanho (Font.Size) 14.
.Comment.Shape.TextFrame. _
Characters.Font.Bold = False or True
Estabelecemos que a fonte no est em negrito (False)
inserindo um comentrio antes de or. Poderamos adicionar
negrito mantendo apenas True como valor da propriedade.
cap07.indd 149 1/11/2006 15:49:44
150 universidade VBA
.Comment.Shape.TextFrame. _
Characters.Font.ColorIndex = 3 Red
Definimos a cor da fonte.
End With
End Sub
No exemplo seguinte, uma variao da macro anterior, possvel definir o tipo
da fonte:

Sub ChgAllCommentsF14()
Dim Cell As Range
For Each Cell In Cells.SpecialCells(xlCellTypeComments)
With Cell.Comment.Shape.TextFrame
.Characters.Font.Name = Terminal
Alteramos o tipo de fonte, seja ele qual for, manipulando
o objeto .Characters.Font.Name e setando-o como
Terminal.
.Characters.Font.Size = 14
.AutoSize = True
End With
Cell.Comment.Shape.TextFrame.AutoSize = True
Next
End Sub
Frmulas nos comentrios
Os comentrios podem ser utilizados para registrar mais do que as impresses
do usurio ou operador da planilha. Em planilhas financeiras, comum que o resul-
tado de uma frmula seja colocado na clula, mascarando a frmula em si. Nesses
casos, no seria til remover a mscara da clula (os valores resultantes no seriam
vistos), e muito menos ficar sem a informao, afinal, a coerncia das frmulas e a
capacidade de visualiz-las uma parte importante do trabalho com planilhas.
A soluo seria fazer com que as frmulas de uma planilha fossem anexadas
como comentrios nas clulas em que elas so utilizadas. Para tanto, desenvolvemos
a macro seguinte:
Sub FrmulasnosComentrios()
Dim cell As Range
Selection.ClearComments
cap07.indd 150 1/11/2006 15:49:45
Projetos e implementaes 151
7
captulo
For Each cell In Selection
If cell.HasFormula Then
Se a clula tem uma frmula, ento
cell.AddComment cell.Formula
adicionado um comentrio clula, com a frmula nela
inscrita.
cell.Comment.Visible = False
A expresso anterior, com o valor booleano False, nos diz
que o comentrio no deve permanecer visvel na planilha.
cell.Comment.Shape.TextFrame.AutoSize = True
O mecanismo apresentado importante. Nele, definimos
que o comentrio adequar seu tamanho ao contedo da clula,
conforme permitido pela expresso booleana True.
End If
Next cell
End Sub
Segurana
Por uma questo de segurana, planilhas manipuladas com freqncia, ou em
domnio pblico, podem ter de esconder informaes sobre seus criadores ou man-
tenedores. O Excel no tem opes que permitem a retirada de informaes do
usurio, mas possvel camuflar essas informaes utilizando aplicaes de VBA,
como a que vemos a seguir:
Sub RemoveUserNameComentrio()
Dim cmt As Comment DMcRitchie, misc, 2006-02-01
Dim LUSR As Long
Dim USR As String
USR = LCase(Application.UserName) & : & CHR(10)
LUSR = Len(USR)
For Each cmt In ActiveSheet.Comments
Para cada vez que uma planilha contiver comentrios
If Left(LCase(cmt.Text), LUSR) = USR Then
Se (If) existir um nome de usurio no comentrio, ento
(Then)
cmt.Text Mid(cmt.Text, LUSR + 1)
O nome do usurio ser apagado do texto
End If
cap07.indd 151 1/11/2006 15:49:45
152 universidade VBA
Next
End Sub
Macro para criao
de ndice de hiperlinks
A macro que vamos criar ser utilizada para fazer um ndice remissivo de hyper-
links com o contedo de todas as planilhas ativas. Muito mais complexa do que todas
as macros feitas at o momento, possvel utiliz-la para testar seus conhecimentos
com VBA. Observe:
A utilizao de Dim para alocar memria e recursos;
A perfeita diviso das partes da clula, utilizando Sheet (folha de dados da
planilha), SheetName (nome da folha de dados), ActiveCell (clula ativa), Row
(linha) e Range (intervalo).
Antes de escrever o cdigo VBA propriamente dito, vamos criar as planilhas que
sero utilizadas como referncia.
1. Crie uma planilha como a que vemos a seguir:
1
2
3
4
5
6
7
8
9
10
11
A
Worksheet
$$TOC
~HELP~
1999-01-31
1999-04-04
1999-06-15
1st 2nd 3rd
4hdr rows
Abuse
AddinsSheet
Address
B
Tipo
Worksheet
Worksheet
Worksheet
Worksheet
Worksheet
Worksheet
Worksheet
Worksheet
Worksheet
Worksheet
C
CodeName
Sheet94
Sheet85
Sheet6
Sheet7
Sheet1
Sheet8
Sheet9
Sheet10
Sheet11
Sheet12
Tabela 7.2.

Em que:
Coluna A (Worksheet): exibe o nome dado planilha pelo Windows;
Tipo: define o tipo do arquivo. Todos os arquivos listados so conjuntos de
planilhas (Worksheet);
CodeName: exibe o nome com o qual as planilhas sero conhecidas no cdi-
go VBA.
cap07.indd 152 1/11/2006 15:49:45
Projetos e implementaes 153
7
captulo
2. Criada a planilha principal, preciso gerar cada uma das planilhas listadas
na coluna Worksheet da planilha de ndice, atribuindo-lhes, obviamente, os nomes
indicados. possvel alterar os nomes apresentados na planilha principal por nomes
de seu interesse, ou que representem planilhas existentes, j que a referncia vlida
est nos valores da coluna CodeName, e no nos nomes reais da planilha; algo que
ajuda muito por no ser necessrio reescrever o cdigo no caso de movimentar ou
apagar uma planilha.
3. De volta planilha de ndice, devemos criar hiperlinks para cada uma das
planilhas listadas. Isso pode ser feito por meio de um clique com o boto direito do
mouse em cada uma das clulas, para habilitar a opo Hiperlink.
Na janela Inserir hiperlink, v para a coluna esquerda, chamada de Vincular a,
e selecione a opo Pgina da Web, ou arquivo existente. Na janela direita, escolha
o documento para o qual ser criado o link e aperte OK. Repita o processo em todas
as planilhas indexadas.
4. Terminado o trabalho com a planilha, podemos criar a nossa macro no editor
de VBA. Observe:
Sub BuildTOC()
Esta macro tem por objetivo listar todas as planilhas
ativas no momento em nosso sistema, bem como as ltimas c-
lulas preenchidas de cada planilha.
Dim iSheet As Integer, iBefore As Integer
Dim sSheetName As String, sActiveCell As String
Dim cRow As Long, cCol As Long, cSht As Integer
Dim lastcell
Dim qSht As String
Dim mg As String
Dim rg As Range
Dim CRLF As String
Dim Reply As Variant
Dim utilizado para alocar espao em memria para as
variveis. Nas quatro primeiras linhas do cdigo, porm, o
comando utilizado para armazenar informaes capturadas
nas planilhas ativas e nas clulas.
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
cRow = ActiveCell.Row
cap07.indd 153 1/11/2006 15:49:45
154 universidade VBA
cCol = ActiveCell.Column
sSheetName = UCase(ActiveSheet.Name)
sActiveCell = UCase(ActiveCell.Value)
mg =
CRLF = Chr(10) Actually just CR
Set rg = Range(Cells(cRow, cCol), Cells(cRow - 1 + Acti-
veWorkbook.Sheets.Count, cCol + 7))
rg.Select
If sSheetName <> $$TOC Then mg = mg & Sheetname is
not $$TOC & CRLF
If sActiveCell <> $$TOC Then mg = mg & Selected cell
value is not $$TOC &
CRLF
definido que se (If) um link para uma planilha (sShee-
tName) no existir na tabela de ndice, mesmo que ela esteja
aberta no computador, a mensagem Sheetname is not $$TOC
deve ser mostrada. A mesma observao vlida para as clu-
las ativas nessas planilhas.
If mg <> Then
mg = Warning BuildTOC will destructively rewrite the
selected area _
& CRLF & CRLF & mg & CRLF & Press OK to proceed, _
& the affected area will be rewritten, or & CRLF & _
Aqui, criamos uma rotina de mensagens de interao com o
usurio. Essa rotina estabelece que se deve avisar o usurio
que alteraes na planilha de ndice podem sobrescrever as
prprias planilhas listadas, alm de que preciso apertar
OK se desejarmos prosseguir com a operao.
Press CANCEL to check area then reinvoke this macro
(BuildTOC)
Uma outra mensagem estabelece que o usurio deve apertar
o boto Cancel se desejar abortar a operao.
Application.ScreenUpdating = True make range visible
Reply = MsgBox(mg, vbOKCancel, Create TOC for &
ActiveWorkbook.Sheets.Count _
& items in workbook & Chr(10) & revised will now
occupy up to 10 columns)
Application.ScreenUpdating = False
If Reply <> 1 Then GoTo AbortCode
End If
cap07.indd 154 1/11/2006 15:49:45
Projetos e implementaes 155
7
captulo
rg.Clear Clear out any previous hyperlinks, fonts,
etc in the area
For cSht = 1 To ActiveWorkbook.Sheets.Count
Cells(cRow - 1 + cSht, cCol) = & Sheets(cSht).Name
If TypeName(Sheets(cSht)) = Worksheet Then
hypName = & Sheets(csht).Name
Os nomes das planilhas sero substitudos pelos
nomes de referncia.
qSht = Application.Substitute(Sheets(cSht).Name,
, )
If CDbl(Application.Version) < 8.0 Then
ActiveSheet.Cells(cRow - 1 + cSht, cCol).Formula = _
=hyperlink([ & ActiveWorkbook.Name _
& ] & qSht & !A1, & qSht & )
End If
Else
Cells(cRow - 1 + cSht, cCol + 2) = & Sheets(cSht).
Name
End If
Cells(cRow - 1 + cSht, cCol + 1) = TypeName(Sheets(cSht))
Cells(cRow - 1 + cSht, cCol + 6) = Sheets(cSht).ScrollA-
rea .Address(0, 0)
Cells(cRow - 1 + cSht, cCol + 7) = Sheets(cSht).Page-
Setup.PrintArea
If TypeName(Sheets(cSht)) <> Worksheet Then GoTo
byp7
Set lastcell = Sheets(cSht).Cells.
SpecialCells(xlLastCell)
Cells(cRow - 1 + cSht, cCol + 4) = lastcell.Address(0,
0)
Cells(cRow - 1 + cSht, cCol + 5) = lastcell.Column *
lastcell.Row
byp7: xxx
On Error GoTo 0
Next cSht
A partir daqui, utilizamos a funo Sort Key para orga-
nizar os resultados obtidos a partir das capturas efetuadas
pela tabela de ndice.
cap07.indd 155 1/11/2006 15:49:45
156 universidade VBA
rg.Sort Key1:=rg.Cells(1, 2), Order1:=xlDescending,
Key2:=rg.Cells(1, 1) _
Order2:=xlAscending, Header:=xlNo, OrderCustom:=1,
MatchCase:=False, _
Orientation:=xlTopToBottom
rg.Columns.AutoFit
rg.Select optional
If cRow > 1 Then
If = Trim(Cells(cRow - 1, cCol) & Cells(cRow - 1,
cCol + 1) & Cells(cRow - 1, cCol + 2)) Then
Cells(cRow - 1, cCol) = Worksheet
Cells(cRow - 1, cCol + 1) = Type
Cells(cRow - 1, cCol + 2) = CodeName
Cells(cRow - 1, cCol + 3) = [opt.]
Cells(cRow - 1, cCol + 4) = Lastcell
Cells(cRow - 1, cCol + 5) = cells
Cells(cRow - 1, cCol + 6) = ScrollArea
Cells(cRow - 1, cCol + 7) = PrintArea
End If
End If
Application.ScreenUpdating = True
Reply = MsgBox(Table of Contents created. & CRLF & CRLF
& _
Would you like the tabs in workbook also sorted, _
vbOKCancel, Option to Sort & ActiveWorkbook.Sheets.
Count _
& tabs in workbook)
Application.ScreenUpdating = False
If Reply = 1 Then SortALLSheets Invoke macro to Sort
Sheet Tabs
Sheets(sSheetName).Activate
AbortCode:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Sub BuildTOC _ A3()
Cells(3, 1).Select
BuildTOC
End Sub
Aqui termina o cdigo.
cap07.indd 156 1/11/2006 15:49:45
Captulo 8
Conexo remota e banco de dados
cap08.indd 157 1/11/2006 15:59:04
158 universidade VBA
Conexo remota e banco de dados
Utilizamos conexo remota para acessar um banco de dados, desktop de um
computador ou qualquer outra aplicao que no esteja localizada diante de ns.
No VBA e nas aplicaes de dados so utilizados os drivers ODBC para interligar
os programas a bancos de dados. Os drivers ODBC so fornecidos pela Microsoft e
instalados quando voc instala o Microsoft Excel e o Microsoft Access.
O ODBC (ou Open Data Base Connectivity) uma tecnologia padro de programao
para o acesso a banco de dados por meio de uma biblioteca de funes predefinida, criada
pelo SQL Access Group. Basicamente, o ODBC oferece uma interface padronizada de
funes, uma API, ao programador, suportada por meio de um driver apropriado.
Exemplificaremos a utilizao de drivers ODBC mostrando como realizar a insta-
lao de drivers compatveis com o padro do banco de dados MySQL (www.mysql.
com) no Windows. Instalar esse driver serve para que desde um sistema Microsoft
Windows possamos ter acesso a uma base de dados MySQL o mesmo se aplica a
bancos de dados Oracle, dBase ou Access.
A instalao dos drivers permite que uma outra aplicao um programa VBA,
no nosso caso, tenha acesso, utilizando um front-end grfico (Access, por exemplo)
base de dados MySQL, sendo capaz, inclusive, de exportar ou importar dados
(migrar os dados de Access para MySQL ou vice-versa).
1. A primeira coisa que temos de fazer abrir o Access da mquina do Windows
que servir como cliente e atualizar a verso 6 de Microsoft jet: http://support.mi-
crosoft.com/default.aspx?scid=KB;EN-US;Q239114&.
2. A seguir, temos de fazer download da ltima verso de Myodbc da pgina de
MySQL: http://www.mysql.com/downloads/api-myodbc-2.50.html.
3. Com tudo isso feito, instalamos a atualizao de Microsoft Jet e instalamos os
drivers OBDC de MySQL. Na janela Data Sources clicamos Close para terminar.
4. Com o driver ODBC instalado, vamos at o painel de controle OBDC de 32 bits
(Incio > Configuraes > Painel de Controle > Fontes de dados ODBC 32 bits).
Neste momento, teremos de escolher se queremos utilizar o driver para um usurio
(DSN de usurio) ou para qualquer usurio do computador (DSN de Sistema). Uma
vez escolhida uma opo, clique no boto Add para acrescentar uma nova fonte de
dados e, a seguir, selecione o driver de MySQL.
5. Teremos agora de preencher os seguintes campos:
cap08.indd 158 1/11/2006 15:59:05
Conexo remota e banco de dados 159
8
captulo
Windows DSN name: nome da fonte de dados que estar disponvel desde
o Windows;
Mysql host (name or IP): nome ou endereo IP do computador onde se encontra
instalado o servidor MySQL;
Mysql Database Name: nome da base de dados com a que se trabalhar desde
a fonte de dados;
User: nome de usurio com o qual se acessar o servidor de bases de dados;
Password: palavra-chave do usurio;
Port: serve para especificar a porta na qual se encontra o servidor MySQL.
Devemos colocar um valor diferente do predefinido, que o 3306.
6. Uma vez que essas opes estejam configuradas, clicamos em OK para fechar
as janelas e finalizar o processo.
Trabalho com o VBA
e com o Registro
Feito o trabalho de instalao do driver, est na hora de trabalhar com a outra
ponta do processo: o cdigo do VBA. Qualquer planilha do Excel ou formulrio
do Access capaz de se conectar corretamente a um banco de dados, considerando
como remota qualquer base de dados que no se encontre na mesma mquina em
que o front-end rodado. Convencionou-se, no entanto, chamar de banco de dados
remoto apenas as bases localizadas fora da rede local da empresa ou do usurio, e
que possam ser acessadas quer via Internet, quer via acesso dedicado.
Uma implementao de VBA que utilize os drivers ODBC costuma utilizar o
Registro do Windows para acesso direto aos drivers. O registro a espinha dorsal do
Windows, o controle do sistema. Do ponto de vista fsico, est espalhado por diversos
arquivos dos diretrios System e System 32 do Windows XP. Para a visualizao e
administrao de sua estrutura que o que nos interessa o Windows XP utiliza,
todavia, uma estrutura de rvore de dados bem parecida, ao menos visualmente,
com a apresentada no Windows Explorer.
Como funciona o registro
Ao mesmo tempo em que mostramos a estrutura do registro, conveniente que
voc faa um reconhecimento visual. Para isso, v at o menu Iniciar > Executar e
digite o comando regedit. Esse reconhecimento essencial para que voc saiba
programar corretamente em VBA utilizando os drivers ODBC.
cap08.indd 159 1/11/2006 15:59:05
160 universidade VBA
O regedit o utilitrio padro para manipulao do registro do Windows.
Apesar da sua interface simples e voltada para o usurio, no entanto, o regedit no
um brinquedo: as alteraes realizadas em sua estrutura, sobretudo em relao
alterao e apagamento de chaves, so capazes de desestabilizar ou fazer com que
o sistema operacional simplesmente deixe de funcionar.
A rvore do registro formada pro cinco diretrios, na verdade chamados de
chaves, que podem ser vistos esquerda do diretrio do registro. Trata-se da estrutura
bsica do registro do Windows: cada uma das chaves coordena um dos elementos do
sistema operacional. Um elemento de hardware instalado no computador, por exem-
plo, deve procurar seu lugar no registro, alojando-se na chave correspondente. Essa
chave passar a ser responsvel por esse hardware, tendo sempre cincia da sua relao
com o kernel, das DLLs adicionadas ao sistema, da verso de seus drivers entre outras
coisas. O hardware, por sua vez, dever se reportar sempre ao registro quando alguma
alterao for feita em suas relaes com o Windows se isso no ocorrer, o elemento
barrado de suas relaes com o kernel e os demais arquivos do sistema. Ou seja,
se seu nome no constar no registro ele no ser nem mesmo reconhecido como um
cliente do sistema, e no ter acesso nem mesmo aos manobristas, quanto mais
ao staff do chef kernel.
Uma outra caracterstica das chaves de registro, que perceberemos mais a seguir: as
chaves s trocam informaes sobre seu funcionamento inteiro (o que elas contm, que
caractersticas do sistema controlam) entre si. Isso significa que uma chave de registro no
repassa informaes para programas externos ao registro quando no so solicitadas.
Vamos dar uma olhada agora em cada uma das chaves presentes no registro,
enumerando suas utilidades dentro do sistema.
HKEY _ CLASSES _ ROOT
Essa chave, na verdade, um atalho para a chave HKEY_LOCAL_MACHINE\SOFT-
WARE\Classes, e sua finalidade manter a compatibilidade com programas antigos,
que rodam a 16 bits. Tanto essa chave quanto HKEY_CURRENT_USER so aliases de
outras chaves do Registro, em uma tentativa tanto de criar atalhos que facilitem a
edio do registro por usurios quanto facilitem a prpria comunicao interna do
registro. Assim, ao procurar por regras para permitir a abertura de um programa do
antigo MS-DOS, por exemplo, o registro cai diretamente nessa chave em vez de ler
a subchave contida em HKEY_LOCAL_MACHINE\SOFT-WARE\Classes.
cap08.indd 160 1/11/2006 15:59:05
Conexo remota e banco de dados 161
8
captulo
HKEY _ CURRENT _ USER
Essa chave um atalho para a chave HKEY _ USERS\<nome do usurio>, em
que <nome do usurio> corresponde identificao do usurio de sistema que est
logado no momento e utilize o sistema. Essas informaes dizem respeito ao usurio
de uma conta local, e no a um usurio remoto, e incluem configuraes relacionadas
e informaes do usurio atual do sistema, como configuraes personalizadas.
Usurios locais so todos os usurios que possuem uma conta configurada no
sistema Windows e a acessam localmente, ou seja, digitando seu login e senha em
frente tela do computador onde o sistema est instalado.
Os usurios remotos, por sua vez, so usurios que possuem uma conta local
configurada em outra mquina, mas podem utilizar os recursos de uma determinada
mquina Windows remotamente, ou seja, sem estar presentes diante do teclado. O
Windows XP possui diversas opes que permitem a configurao de acesso remoto,
inclusive via rede local (LAN) ou Internet. Vrios usurios remotos podem acessar
uma mquina ao mesmo tempo e um mesmo usurio remoto pode acessar vrias
mquinas que lhe permitam acesso ao mesmo tempo.
HKEY _ LOCAL _ MACHINE
Trata-se da chave mais importante do registro, nela que esto contidas as in-
formaes sobre programas e hardware. Clicando no sinal positivo (+) ao lado desta
chave (Figura 8.1) temos acesso s suas subchaves, que so montadas no formato de
uma rvore de dados organizada segundo o tipo de cada dado. Daremos uma ateno
especial chave HARDWARE logo a seguir.
Figura 8.1.
cap08.indd 161 1/11/2006 15:59:05
162 universidade VBA
Em HARDWARE esto informaes relativas ao hardware do computador, como
o chipset utilizado pela placa-me, endereamento das portas seriais e paralelas,
perifricos (teclado, mouse) anexos ao sistema entre outros. HARDWARE, assim como
outras chaves do registro, possui vrios nveis de subchaves, uma dentro da outra.
s subchaves dentro de HARDWARE chamaremos, para fins didticos, de subchaves
de segundo nvel. As subchaves mais profundas sero tratadas citando seu caminho
dentro do registro, ou teramos de falar de subchaves tercirias, quaternrias e assim
por diante.
Outra chave de importncia vital para o sistema a chave SOFTWARE. Nela voc
consegue encontrar informaes sobre todos os programas instalados no Windows,
inclusive algumas aplicaes auxiliares aos drivers de hardware.
Nessa subchave cada uma das subchaves secundrias tem o nome de um desen-
volvedor de software. Alm da Microsoft de longe a empresa com maior nmero
de chaves representadas temos a Macromedia, a Intel e at o Google.
No registro dos Windows 2000/XP/2003 existem outras subchaves que so intoc-
veis. Uma delas a chave SAM (Security Accounts Manager) que faz o gerenciamento
dos logins de usurios remotos e locais do Windows. A subchave SAM a responsvel
pela montagem do login dos usurios, contendo uma parte da chave de criptografia
utilizada para a armazenagem da senha. Ao contrrio do que ocorria com o Windows
98/ME, o Windows XP no guarda as senhas em um arquivo comum e legvel, mas
monta um arquivo temporrio que mascara a senha de maneira diferente a cada
login, e representado no registro, justamente, pela chave SAM. Essa subchave
to protegida que voc no pode alter-la e nem apag-la.
Projeto de cdigo para
interligao ODBC
Veremos a seguir como proceder ligao de cdigo VBA com diversos tipos
de bancos de dados remotos. Genericamente, o cdigo a seguir (que voc pode ler
seguindo os comentrios) pode ser utilizado para interligar qualquer aplicao VBA
a qualquer base de dados.
Private Const REG _ SZ = 1
Note que a primeira constante, justamente, evoca o editor
de registro, utilizando o valor booleano True (Verdadeiro),
numericamente equivalente a 1.
A seguir passa-se a operar de forma direta com as chaves
do Registro e seus valores auto-atribudos.
Private Const HKEY _ LOCAL _ MACHINE = &H80000002
cap08.indd 162 1/11/2006 15:59:06
Conexo remota e banco de dados 163
8
captulo
Private Const HKEY _ CURRENT _ USER = &H80000001
Definimos o local em que est a string que d acesso s
configuraes genricas de drives ODBC do sistema
Private Const REG _ ODBCINI As String = SOFTWARE\ODBC\ODBC.
INI\
Private Const REG _ ODBCINI _ DS As String = SOFTWARE\ODBC\
ODBC.INI\ODBC Data Sources
A partir de agora passamos a ter acesso s funes de
criao de chaves do registro e sua configurao.
Private Declare Function RegCreateKey Lib advapi32.dll
Alias RegCreateKeyA (ByVal hKey As Long, ByVal lpSubKey As
String, phkResult As Long) As Long
Private Declare Function RegOpenKey Lib advapi32.dll Alias
RegOpenKeyA (ByVal hKey As Long, ByVal lpSubKey As String,
phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib advapi32.dll
Alias RegSetValueExA (ByVal hKey As Long, ByVal lpValueNa-
me As String, ByVal Reserved As Long, ByVal dwType As Long,
lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib advapi32.dll
(ByVal hKey As Long) As Long

Private Sub Set _ ODBC _ DSN(UserDSN As Boolean, _
DataSourceName As String, DatabaseName As String, _
Description As String, DriverPath As String, _
DriverName As String, Server As String)
Dim lResult As Long
Dim hKeyHandle As Long
Dim HKEY _ XX As Long
HKEY _ XX = IIf(UserDSN, HKEY _ CURRENT _ USER, HKEY _ LO-
CAL _ MACHINE)
Criao de uma nova chave na rvore do registro
lResult = RegCreateKey(HKEY _ XX, REG _ ODBCINI & Data-
SourceName, hKeyHandle)
Definindo os valores da chave
lResult = RegSetValueEx(hKeyHandle, Database, 0&,
REG _ SZ, ByVal DatabaseName, Len(DatabaseName))
lResult = RegSetValueEx(hKeyHandle, Description, 0&,
REG _ SZ, ByVal Description, Len(Description))
cap08.indd 163 1/11/2006 15:59:06
164 universidade VBA
lResult = RegSetValueEx(hKeyHandle, Driver, 0&, REG _
SZ, ByVal DriverPath, Len(DriverPath))
lResult = RegSetValueEx(hKeyHandle, LastUser, 0&,
REG _ SZ, ByVal user, Len(user))
lResult = RegSetValueEx(hKeyHandle, Server, 0&, REG _
SZ, ByVal Server, Len(Server))
Fechando a chave.
lResult = RegCloseKey(hKeyHandle)
Ao abrir a chave ODBC Data Sources geramos entra-
das equivalentes dentro do diretrio de administrao dos
drivers ODBC.
Agora adicionamos um valor.
E fechamos a chave de novo.
lResult = RegCreateKey(HKEY _ XX, REG _ ODBCINI _ DS,
hKeyHandle)
lResult = RegSetValueEx(hKeyHandle, DataSourceName, 0&,
REG _ SZ, ByVal DriverName, Len(DriverName))
lResult = RegCloseKey(hKeyHandle)
End Sub
SQL Server
O SQL Server um servidor de banco de dados de propriedade da Microsoft. O
SQL trabalha com as tabelas em que so enviadas as listagens de dados, chamadas
de consultas, e as tabelas geradas a partir de filtros, chamadas de selees.
Em relao aos clientes, o SQL se utiliza de strings, como uma linguagem de pro-
gramao baseada em scripts, para fazer a garimpagem e retirada de dados enviados
pelos clientes. Esses scripts podem ser inseridos no corpo de pginas ASP, JAVA ou
PHP sem afetar a utilizao da pgina por parte do usurio.
Antes de comear a trabalhar a interao do VBA com as tabelas QL, vamos
mostrar como criar essas mesmas tabelas. Supomos aqui que voc j possui um ser-
vidor SQL Server (ao menos na verso 2000) instalado em sua mquina.
Vamos, ao mesmo tempo, criar uma tabela que armazene todos os logins feitos
em nossa pgina ASP. Basta acessar a pgina e abrir uma nova entrada do cdigo
no meio do cdigo HTML, como:
<%@ LANGUAGE=VBSCRIPT
dim StrSql Varivel que arquiva o comando de sql a exe-
cutar
cap08.indd 164 1/11/2006 15:59:06
Conexo remota e banco de dados 165
8
captulo
StrSql =CREATE TABLE dbo.logins (nome VARCHAR, senha INT
NOT NULL)
# o prefixo dbo mostra que a base de dados a ser utilizada
SQL Server
set conn=server.createobject(adodb.connection)
#este comando cria um objeto no caso a tabela que j foi
declarada acima no servidor
conn.open DsnName,userName,Password
set rs = conn.execute(StrSql)
response.write(Query feito! & StrSql)
%>
Para executar o cdigo basta abrir o browser e introduzir a URL: www.meu site.
com.br/New_Table.asp
Criao de usurios
Criada nossa base de dados SQL, provavelmente vamos querer inserir alguns
usurios no sistema. Para isso digite:
CREATE USER nome _ do _ usurio [ [ WITH ] opo [ ... ] ]
onde opo pode ser:
PASSWORD (digite uma senha para o usurio)
IN GROUP nome _ do _ grupo do usurio se no houver nenhum,
digite o comando CREATE GROUP
VALID UNTIL data _ hora
Para atribuir todos os privilgios de bancos de dados a um novo usurio, digite:
GRANT ALL PRIVILEGES ON meuBD.* TO usuario@localhost
IDENTIFIED BY hello WITH GRANT OPTION;
FLUSH PRIVILEGES;
Esse comando atribui todos os privilgios a todas as tabelas do banco de
dadosmeuBD ao usurio , a partir da mquina localhost, cuja senha hello. O
comando FLUSH PRIVILEGES atualiza as novas alteraes na tabela SQL em uso.
Caso o usurio no exista, um novo usurio ser criado.
cap08.indd 165 1/11/2006 15:59:06
166 universidade VBA
Aps criar uma base de dados e utilizar consultas, por exemplo, como as mos-
tradas anteriormente, pode ser necessrio filtrar os dados armazenados. Afinal de
contas, bancos de dados servem para que os dados inscritos neles sejam utilizados.
Podemos fazer uma seleo, a partir da interface do cliente do SQL, utilizando o
seguinte comando:
SELECT * FROM table WHERE MONTH(data)=05;
Em que 05 seleciona todos os registros da tabela onde o campo data possui
uma data localizada no ms de maio.
Tambm podemos utilizar o seguinte comando:
SELECT DISTINCT DAYOFMONTH(data),MONTH(data),YEAR(data);
Esse comando seleciona dia, ms e ano localizados na tabela. Basta inserir os
respectivos dados, na forma de nmeros 1 a 30 para dias; 1 a 12 para meses, nmeros
de quatro dgitos para anos nas respectivas strings.
Importando e exportando arquivos
Mas nem s de consulta vive a administrao de bancos de dados SQL. Alguns
bancos e tabelas particulares costumam inchar tanto que se torna necessrio migrar
os dados para o formato texto e esvaziar a tabela original. Nesse caso, podemos
utilizar o comando:
LOAD DATA INFILE data.txt INTO TABLE tbl _ name
FIELDS TERMINATED BY , ENCLOSED BY
LINES TERMINATED BY \n;
Que carrega os registros em formato txt do arquivo data.txt para a tabela
tbl_name, em que os campos esto separados por , (vrgula), delimitados por
(aspas) e as linhas delimitadas por \n (quebra de linha). Para selecionar todas as
ocorrncias encontradas na tabela e migr-las para o arquivo txt, podemos utilizar
o comando:
SELECT * INTO OUTFILE eu.txt FROM table;
cap08.indd 166 1/11/2006 15:59:06
Conexo remota e banco de dados 167
8
captulo
No precisamos, necessariamente, apelar para um arquivo txt podemos fa-
zer um backup da tabela original em uma nova tabela. Basta digitar no Cliente
do SQL:
INSERT INTO table1 (nome) SELECT nome FROM table2
No necessrio criar a tabela previamente ela criada no instante em que
solicitada uma cpia de tabela pr-existente tendo-a como arquivo de sada.
Outros comandos
Prosseguiremos mostrando mais alguns comandos de administrao, que podem
ser utilizados tanto localmente, a partir de um terminal SQL (acessando pelo ter-
minal do MS-DOS o diretrio onde est salvo o SQL Server e digitando o comando
SQL) ou remotamente, pelo cliente SQL que acompanha o SQL Server, ou qualquer
cliente de sua preferncia. Lembrando que aqui passamos apenas conceitos gerais
de SQL: aprofundar-se em criao e administrao de bancos de dados SQL requer
muito mais tempo do que o necessrio para ler este livro, e provavelmente dez vezes
o nmero de pginas que ele contm.
O Comando JOIN
s vezes, os dados que necessitamos esto dispostos em mais de uma tabela.
Nesses casos usa-se o comando JOIN, que utiliza campos de dados em comum para
unir mais de uma tabela.
Suponhamos, por exemplo, possuirmos uma tabela com a listagem de e-mails e
outra de contra-senhas essa segunda possui todas as senhas de compra que devem
ser fornecidas a cada usurio todas as vezes que este inserir sua conta de e-mail em
um formulrio. Essa lista pode utilizar o seguinte cdigo:
USE testesenha;
SELECT e-mails.nome,contrasenha.resposta FROM e-
mails,contrasenhas WHERE e-mails.contrasenhas = e-mails.
contrasenhas;
Pode-se tambm usar o JOIN de forma implcita, utilizando a clusula de condio
WHERE para mostrar to somente campos em que os registros sejam correspondentes.
O cdigo este:
cap08.indd 167 1/11/2006 15:59:06
168 universidade VBA
USE testesenha;
SELECT e-mails.nome,contrasenha.resposta FROM e-mails
INNER JOIN contrasenhas ON e-mails.contrasenha = e-mails.
contrasenha;
Existem mais algumas variaes de JOIN que podem ser utilizadas. Em LEFT
JOIN, os registros da primeira tabela so exibidos RIGHT JOIN faz o mesmo com
a segunda tabela.
Aliases e contagem
Um recurso que torna a criao de um cdigo SQL mais rpida so os aliases ou
codinomes dados a uma determinada tabela ou funo. Basta colocar o alias desejado
em frente ao nome dos campos na clusula SELECT e depois dos nomes das tabelas
FROM. Veja o cdigo:
USE testesenha;
SELECT f.e-mail FROM contrasenhas f, contrasenhas d WHERE
d.contrasenhas = f.contrasenhas AND d.resposta = Recebido;
Note no cdigo anterior que, aps a implementao do alias, podemos, em vez de
digitar contrasenhas. resposta, digitar simplesmente d.descrio.
Com o comando GROUP BY, por sua vez, podemos utilizar algumas das novas
utilidades trazidas pelo comando alias. Utilizando GROUP BY ainda possvel fazer
vrios tipos de estatsticas e contagens o que muito til para contabilizar os acessos
e acertos de um website. Se voc possuir um servidor de e-mails em uma rede interna
e quiser conhecer as contas de e-mails dos funcionrios de cada departamento, por
exemplo, pode usar o seguinte cdigo:
USE servidorl;
SELECT d.conta departamento, CONT(f.e-mail) total FROM e-
mails f, departamentos d WHERE d.departamento = f.departamento
GROUP BY f.departamento
Voc tambm pode utilizar o comando SUM:
USE servidorl;
SELECT d.conta departamento, CONT(f.e-mail) total FROM e-
mails f, departamentos d WHERE d.departamento = f.departamento
SUM f.departamento
cap08.indd 168 1/11/2006 15:59:07
Conexo remota e banco de dados 169
8
captulo
Este soma os resultados agrupados de todos os departamentos. Tambm podemos
utilizar o comando SELECT, como neste caso, em que ele retorna todos os e-mails,
localizados na tabela E-E-Mails que pertenam ao provedor Hotmail:
select e-mail, rg
from E-MAILS
where provedor = hotmail;
Trabalhando com o SQL
Depois de termos tabelas e ligaes corretamente configuradas, fica muito fcil
interligar um sistema de bancos SQL a um aplicativo VBA. Na implementao se-
guinte ligamos uma planilha Excel a um servidor SQL, utilizando para isso as contas
de usurio remotos (DNS) desse servidor:
Sub Revenue _ Report()
Monta um relatrio baseado nas tabelas de um servidor
SQL
Dim conn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Dim sql As String, sql1 as string, sql2 as string

conn.Open DSN=ACCOUNTS
sql = SELECT INVOICE _ HEADER.Territory, INVOICE _ DETAIL.
ProductGroup, INVOICE _ DETAIL.TaxableAmt & _
FROM ((CUSTOMER _ MASTER INNER JOIN & _
(INVOICE _ DETAIL INNER JOIN INVOICE _ HEADER ON
(INVOICE _ DETAIL.DocType = INVOICE _ HEADER.DocType) AND &
_
(INVOICE _ DETAIL.InternalDocNum = INVOICE _ HEADER.
InternalDocNum)) ON CUSTOMER _ MASTER.Code = INVOICE _ HEADER.
Code) & _
INNER JOIN PRODUCT _ MASTER ON INVOICE _ DETAIL.
Code = PRODUCT _ MASTER.Code) & _
INNER JOIN PRODUCTGROUP _ NAME ON PRODUCT _ MAS-
TER.ProductGroup = PRODUCTGROUP _ NAME.Code & _
WHERE (((INVOICE _ DETAIL.LineType) <> 9) And
((INVOICE _ DETAIL.DocType) <= 3)) & _
cap08.indd 169 1/11/2006 15:59:07
170 universidade VBA
ORDER BY INVOICE _ HEADER.Territory, INVOICE _ DE-
TAIL.ProductGroup

sql1 = SELECT INVOICE _ HEADER.Territory, INVOICE _ DETAIL.
ProductGroup, INVOICE _ DETAIL.TaxableAmt & _
FROM INVOICE _ DETAIL & _
INNER JOIN INVOICE _ HEADER ON (INVOICE _ DETAIL.
DocType = INVOICE _ HEADER.DocType AND INVOICE _ DETAIL.Inter-
nalDocNum = INVOICE _ HEADER.InternalDocNum) & _
WHERE INVOICE _ DETAIL.DocType <> 9 And INVOI-
CE _ DETAIL.LineType <= 3 & _
ORDER BY INVOICE _ HEADER.Territory, INVOICE _ DE-
TAIL.ProductGroup

sql2 = SELECT INVOICE _ DETAIL.ProductGroup, INVOICE _
DETAIL.TaxableAmt, INVOICE _ HEADER.Territory & _
FROM INVOICE _ DETAIL INVOICE _ DETAIL, INVOI-
CE _ HEADER INVOICE _ HEADER & _
WHERE INVOICE _ DETAIL.InternalDocNum = INVOI-
CE _ HEADER.InternalDocNum And INVOICE _ HEADER.DocType = IN-
VOICE _ DETAIL.DocType & _
And ((INVOICE _ DETAIL.DocType <> 9) And (INVOI-
CE _ DETAIL.LineType <= 3)) & _
ORDER BY INVOICE _ HEADER.Territory, INVOICE _ DE-
TAIL.ProductGroup

rec.Open SplitToArray(sql1, 255), conn

Definimos que planilha e clulas do Excel recebero o
relatrio dos dados
Sheets(Sheet2).Cells(1, 1).CopyFromRecordset rec

rec.Close
conn.Close
End Sub
cap08.indd 170 1/11/2006 15:59:07
Conexo remota e banco de dados 171
8
captulo
Oracle
Oracle um SGBD (sistema gerenciador de banco de dados) que surgiu no final
dos anos 1970, quando Larry Ellison vislumbrou uma oportunidade que outras
companhias no haviam percebido ao encontrar a descrio de um prottipo fun-
cional de um banco de dados relacional e descobrir que nenhuma empresa tinha se
empenhado em comercializar essa tecnologia.
O Oracle tambm suporta a ligao via Access ou Excel, utilizando drivers
ODBC, em uma implementao que pode ser mais simples do que a utilizada pelos
demais tipos de bancos de dados, j que pode ser iniciada diretamente no editor de
cdigo do VBA.
1. Abra o editor do VBA e digite a macro seguinte. Ela ser utilizada para criar
uma chamada para o banco de dados Oracle a que se tenha acesso:
Function CallSProc() As Boolean
Dim db As Database
Dim LSProc As QueryDef
On Error GoTo Err _ Execute
Set db = CurrentDb()
Set LSProc = db.CreateQueryDef()
Agora vamos utilizar o {Microsoft ODBC for Oracle}
ODBC connection. Confira em Iniciar>Configuraes>Painel de
Controle>Configuraes>Drivers ODBC.
LSProc.Connect = ODBC;DSN=AAAA;UID=BBBB;PWD=DDDD;SE
RVER=CCCC
LSProc.SQL = BEGIN application _ program _ interface;
END;
LSProc.ReturnsRecords = False
LSProc.ODBCTimeout = 0
cap08.indd 171 1/11/2006 15:59:07
172 universidade VBA
LSProc.Execute
Set LSProc = Nothing
CallSProc = True
Exit Function
Criaremos uma caixa de texto para nos avisar caso no
seja possvel nos conectarmos ao banco
Err _ Execute:
MsgBox A chamada ao banco de dados Oracle falhou.
CallSProc = False
End Function
2. A mesma coisa pode ser feita abrindo o Microsoft Access e, em seguida, o
editor de VBA, criando um novo mdulo e inserindo o seguinte cdigo:
Function CallSProc() As Boolean
Cria um meio de acesso a um banco de dados Oracle uti-
lizando o Microsoft Access
Dim db As Database
Dim LSProc As QueryDef
Dim LSQL As String
On Error GoTo Err _ Execute
Set db = CurrentDb()
Set LSProc = db.CreateQueryDef()
Faz a chamada utilizando padres do Microsoft SQL
LSQL = BEGIN application _ program _ interface ( &
member _ id & ,
LSQL = LSQL & provider _ id & ,
LSQL = LSQL & to _ date( & Format(service _ date, mm/
dd/yyyy) & ,mm/dd/yyyy))
LSQL = LSQL & ; END;
cap08.indd 172 1/11/2006 15:59:07
Conexo remota e banco de dados 173
8
captulo
Faz a chamada de forma direta, utilizando {Microsoft
ODBC for Oracle} ODBC connection. a melhor opo, por ser
mais direta, mas pode apresentar problemas em redes em que
servidores SQL e Oracle, com tabelas replicadas, coexistam.
LSProc.Connect = ODBC;DSN=AAAA;UID=BBBB;PWD=DDDD;SE
RVER=CCCC
LSProc.SQL = LSQL
LSProc.ReturnsRecords = False
LSProc.ODBCTimeout = 0
LSProc.Execute
Set LSProc = Nothing
CallSProc = True
Exit Function
Err _ Execute:
MsgBox A chamada ao banco de dados Oracle falhou.
CallSProc = False
End Function
3. Para customizar o bloco do cdigo interligado ao SQL Server, proceda da
seguinte forma:
LSProc.Connect = ODBC;DSN=AAAA;UID=BBBB;PWD=DDDD;SERVER
=CCCC
em que:
AAAA o nome do banco de dados (ODBC Data Source) que se deseja acessar;
BBBB o nome do usurio que far login no banco de dados;
CCCC o nome do servidor de banco de dados;
DDDD a senha que ser utilizada para ter acesso ao servidor Oracle.
cap08.indd 173 1/11/2006 15:59:08
cap08.indd 174 1/11/2006 15:59:08
Access 175
9
captulo
Captulo 9
Access
cap09.indd 175 1/11/2006 15:59:38
176 universidade VBA
Access
Falamos o bastante sobre bancos de dados de alto desempenho mas no falamos
muito do Acces, o front-end que o VBA normalmente utiliza para ter acesso s in-
formaes das tabelas desses bancos. Pretendemos corrigir essa lacuna agora.
O Microsoft Access, tambm conhecido por MSAccess, um banco de dados
relacional que permite o desenvolvimento rpido de aplicaes que envolvem tanto
a modelagem e estrutura de dados como tambm a interface a ser utilizada pelos
usurios. Como o nome indica, foi desenvolvido pela Microsoft.
O desenvolvimento da estrutura de dados se d de forma muito intuitiva, bastan-
do que o desenvolvedor possua conhecimentos bsicos em modelagem de dados e
lgica de programao. Geralmente uma aplicao desenvolvida com o Access pela
linguagem de programao VBA (Visual Basic for Applications) consiste em dois
arquivos, um que se denomina BackEnd, onde ficam armazenadas todas as tabelas
com seus respectivos relacionamentos, e outro denominado FrontEnd, onde ficam
armazenados os cdigos fontes, formulrios, mdulos, consultas e macros.
Para rodar os aplicativos desenvolvidos necessrio que o usurio possua em sua
estao de trabalho o MSAccess instalado ou pelo menos o seu Runtime, que vem
a ser uma verso enxuta do MSAccess que servir apenas para rodar os aplicativos
sem a possibilidade de desenvolvimento.
Depois do Excel, o Acces , muito provavelmente, o programa que melhor se
integra com recursos VBA. essa integrao a responsvel pela alta taxa de quali-
dade das aplicaes Access produzidas a partir do Access, e pela grande variedade
de recursos possveis.
Para iniciar de onde paramos no captulo anterior ou ao menos a partir da mesma
linha de desenvolvimento vamos projetar o acesso de uma base de dados interna ao
Access, utilizando VBA. Aqui utilizaremos ADODB em vez do padro ODBC:
Este primeiro exemplo conecta o Access a um banco de
dados interno
Iniciamos definindo o driver de ligao ADODB como a
varivel
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open Select * from Snippets, CurrentProject.Connection,
adOpenKeyset, adLockOptimistic
Em uma implementao levemente diferenciada, poderamos
acessar tambm bancos de dados externos
cap09.indd 176 1/11/2006 15:59:38
Access 177
9
captulo
Dim gcnPrimary as New ADODB.Connection Setting up the ob-
ject (optional)
Set gcnPrimary = New ADODB.Connection ADO Connection --
creating a new instance
gcnPrimary.Provider = Microsoft.Jet.OLEDB.4.0
gcnPrimary.ConnectionString = gstrPrimaryDB
gcnPrimary.Open
Dim grsPrimary as ADODB.Recordset Setting up the object
(optional)
Set grsPrimary = New ADODB.Recordset ADO Recordset -- crea-
ting a new object
grsPrimary.Source = SELECT * FROM Snippets Pulling from
Snippets table
Set grsPrimary.ActiveConnection = gcnPrimary
grsPrimary.Open
If grsPrimary.EOF = True Then GoTo BYE We have a blank
database and need to skip some code
Dim lngIndex As Long
lngIndex = -1
Do Until grsPrimary.EOF Filling a zero-based array
lngIndex = lngIndex + 1
ReDim Preserve aryCodeList(3, lngIndex)
aryCodeList(0, lngIndex) = grsPrimary.Fields(id)
aryCodeList(1, lngIndex) = grsPrimary.Fields(Language _
Major)
ary CodeList(2, lngIndex) = grsPri m ary.
Fields(Category)
ar y CodeList(3, lngIndex) = grsPri m ar y.
Fields(Description)
grsPrimary.MoveNext
Loop
grsPrimary.Close When done we eliminate Recordset
Set grsPrimary = Nothing Leaving connection open
Ou, em uma implementao mais simples:
Public Sub CompleteDatabaseExample()
cap09.indd 177 1/11/2006 15:59:38
178 universidade VBA
Dim dbMain as New ADODB.Connection Declaring the Con-
nection
Dim rsCustomer as New ADODB.Recordset Declaring the
Recordset
Dim SQL as String Declaring a simple variable
dbMain.Open Provider=Microsoft.Jet.OLEDB.4.0; & _
Connecting to the Database
Persist Security Info=False; & _
Data Source=C:\WINDOWS\Desktop\training.mdb
SQL = SELECT * FROM Customer Setting up our SQL
Command statement
rsCustomer.Open SQL, dbMain, adOpenDynamic, adLockOp-
timistic Opening the Recordset (see Recordset Options)
Do While Not rsCustomer.EOF Loop until we reach the
End-Of-File marker
MsgBox The Customers Name is: &
rsCustomer(Name)
MsgBox The Customers City is: &
rsCustomer(City)
rsCustomer(Country) = United States
rsCustomer(Name) = rsCustomer(Name) & Jr.
rsCustomer.Update Updating the Records (see also
Recordset (Working With))
rsCustomer.MoveNext Moving to the next record
(necessary to reach the EOF)
Loop
rsCustomer.Close Closing the recordset
dbMain.Close Closing the database connection
End Sub
Acesso a SQL
Para o acesso do Access como front-end do SQL Server, por sua vez, podemos
no necessitar nem de drivers ODBC nem ADODB, ao menos diretamente. Via de
regra, o Access capaz de trabalhar de forma transparente (sem configuraes extras
e sem visualizao do drive de ligao). Para conferir como isso possvel, vamos a
seguir interligar o Access a um servidor SQL e criar uma tabela sem apertar nenhum
boto, apenas utilizando cdigos VBA:
cap09.indd 178 1/11/2006 15:59:38
Access 179
9
captulo
Sub PickRandom()
Definio das variveis
Dim db As Database
Dim tdf As TableDef
Dim fld As Field
Dim rst As Recordset
Dim strSQL As String
Dim strTableName As String
1: Criamos uma tabela SQL temporrio que ir possuir os
campos requeridos
strSQL = SELECT tblStaff.Firstname, tblStaff.Lastname
& _
INTO tblTemp & _
FROM tblStaff;
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

2: Adicionamos um campo a nova tabela
Set db = CurrentDb()
Set tdf = db.TableDefs(tblTemp)
Set fld = tdf.CreateField(RandomNumber, dbSingle)
tdf.Fields.Append fld
3: Atribumos um valor aleatrio a cada novo campo cria-
do.
Set rst = db.OpenRecordset(tblTemp, dbOpenTable)
rst.MoveFirst
Do
Randomize
rst.Edit
rst![RandomNumber] = Rnd()
rst.Update
rst.MoveNext
Loop Until rst.EOF
rst.Close
Set rst = Nothing

cap09.indd 179 1/11/2006 15:59:39
180 universidade VBA
4: Listamos os dados de acordo com os valores aleatrios
anteriormente atribuidos, e repassamos os 25 primeiros valo-
res para a nova tabela.
strTableName = tblRandom _ & Format(Date,
ddmmmyyyy)
strSQL = SELECT TOP 25 tblTemp.Firstname, tblTemp.Last-
name & _
INTO & strTableName & & _
FROM tblTemp & _
ORDER BY tblTemp.RandomNumber;
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
5: Apagamos a tabela temporria
db.TableDefs.Delete (tblTemp)
End Sub
Criada uma tabela, seria possvel adicionar novos dados a
ela utilizando o VBA:
Dim rs As New ADODB.Recordset
Com esta varivel adicionamos novos elemnetos, via front-
end Access,a uma tabela SQL
rs.Open SELECT * FROM tblBarCode, CurrentProject.Connec-
tion, adOpenKeyset, adLockOptimistic
Adicionamos novas linhas tabela-alvo do banco de da-
dos
For i = LBound(aryBarCodes()) To UBound(aryBarCodes())
rs.AddNew
rs![BarcodeNum] = aryBarCodes(i)
rs![PDFFileName] = empty
rs![NumTIFFsRenamed] = 0
rs![RenamedTIFFsDate] = 0
rs.Update
lngCount = lngCount + 1
Next
rs.Close
cap09.indd 180 1/11/2006 15:59:39
Access 181
9
captulo
Nota: evite usar a opo setrecord em bancos de dados
multi-usurios ou em que mltiplos usurios tm acesso si-
multneo as tabelas.
Dim strSQL as String
For i = LBound(aryBarCodes()) to UBound(aryBarCodes())
strSQL = INSERT INTO tblBarCode (BarcodeNum, PDFFile-
Name, NumTIFFsRenamed, RenamedTIFFsDate)
strSQL = strSQL & VALUES ( & aryBarCodes(i) & ,
empty, 0, 0)
CurrentProject.Connection.Execute strSQL
Next
Outra maneira de adicionar dados pode ser vista a se-
guir...
INSERT INTO tblName (FieldName1, FieldName2, FieldName3)
VALUES (value1, value2, True)
Note: (a) Campos no devem ser delimitados por vrgu-
las
Agora vamos mostrar como fazer o update de um determi-
nado campo via VBA
UPDATE tblName SET FieldName1= value1, FieldName2= num2,
FieldName3= True WHERE field = value
E tambm como apagar uma linha de dados
DELETE FROM tblName WHERE FieldName1= value
Observe o exemplo abaixo para perceber como o commando
DELETE opera
strSQL = DELETE from tblCustomers WHERE Name = Smith,
John
CurrentProject.Connection.Execute strSQL
Option Compare Database
Option Explicit
Public booCompactTime As Boolean
Function Autoexec()
---------------------------------------------------------
cap09.indd 181 1/11/2006 15:59:39
182 universidade VBA
Purpose:
1. Compiles all code in the database if it is uncompiled
2. Writes usage info to custom database properties
3. Writes usage info to the Registry
4. Sets flag to indicate if db is due for compacting
---------------------------------------------------------
On Error GoTo Autoexec _ Err
Dim strModule As String
Dim strProperty As String
Dim dtLastOpened As Date
Dim db As Database
Dim pty As Property
Dim lngDBTimesOpened As Long
Dim lngProfileTimesOpened As Long
Dim intRetVal As Integer
Set db = CurrentDb
If the db is not compiled then open a module and
force recompilation
If Not Application.IsCompiled Then
Display a message indicating we are compiling
DoCmd.OpenForm frmCompile, , , , acFormReadOnly
Turn off screen updating
Application.Echo False
Get the name of any module
strModule = db.Containers(Modules).Documents(0).
Name
Open the module so we can use the Compile Modules menu
command
DoCmd.OpenModule strModule
Compile and save all modules
Application.RunCommand acCmdCompileAndSaveAllModules
Set a database property to indicate last compile time
MarkCompileTime
Give audible confirmation
Beep
Close the module we opened
DoCmd.Close acModule, strModule
cap09.indd 182 1/11/2006 15:59:39
Access 183
9
captulo
Turn screen updating back on
Application.Echo True
Remove the warning form
DoCmd.Close acForm, frmCompile
End If
Find out how many times this particular database has
been opened
IncrementTimesOpened
lngDBTimesOpened = db.Properties(TimesOpened) If this
is the first time for this database, then show the greeting
form
If lngDBTimesOpened = 1 Then
DoCmd.OpenForm frmGreeting, , , , , acDialog
Else
Else open the greeting form unless the user has deselected
the re-view check box
If GetSetting(MWSDB, Preferences, StartUpDialog,
True) Then
DoCmd.OpenForm frmGreeting, , , , , acDialog
End If
End If
Write information to the Registry to indicate usage for
this user
lngProfileTimesOpened = GetSetting(MWSDB, Statistics,
UsageCount, 1)
SaveSetting MWSDB, Statistics, UsageCount,
lngProfileTimesOpened + 1
SaveSetting MWSDB, Statistics, LastUsed, Format$(Now(),
yyyy.mm.dd hh:nn:ss)
And finally open the switchboard form
DoCmd.OpenForm frmSwitchboard This form would contain
a cmdCompactDatabase control
Autoexec _ Exit:
Exit Function
Autoexec _ Err:
Turn screen updating back on
cap09.indd 183 1/11/2006 15:59:39
184 universidade VBA
Application.Echo True
Now handle the error
Select Case Err.Number
Case Else
Call GlobalErr(Autoexec, Err.Number)
Resume Autoexec _ Exit
Resume
End Select
End Function
Sub GlobalErr(strProcName As String, intErr As Integer)
---------------------------------------------------------
Purpose: To display a message box providing details of
a given error
Parameters: strProcName - the name of the procedure
calling GlobalErr intErr - an Error code
Returns: Nothing
---------------------------------------------------------
Dim strMsg As String
strMsg = The following error occurred in the & strProc-
Name & procedure
strMsg = strMsg & Chr$(10) & Chr$(10)
strMsg = strMsg & Error Number: & Format$(intErr) &
Chr$(10)
strMsg = strMsg & Error Description: & Error$
MsgBox strMsg, 48, Unexpected Error
GlobalErr _ Exit:
Exit Sub
End Sub
Sub MarkCompileTime()
---------------------------------------------------------
Purpose: To set a db property indicating when the data-
base was last programmatically compiled
cap09.indd 184 1/11/2006 15:59:39
Access 185
9
captulo
Parameters: None
Returns: Nothing
---------------------------------------------------------
On Error GoTo MarkCompileTime _ Err
Dim pty As Property
CurrentDb.Properties(LastCompiled) = Now
MarkCompileTime _ Exit:
Exit Sub
MarkCompileTime _ Err:
Select Case Err.Number
Case 3270 Error code for Property not found
Set pty = CurrentDb.CreateProperty(LastCompi
led, dbDate, Now())
CurrentDb.Properties.Append pty
Resume
Case Else
Call GlobalErr(MarkCompileTime, Err.Number)
Resume MarkCompileTime _ Exit
Resume
End Select
End Sub
Sub IncrementTimesOpened()
---------------------------------------------------------
Purpose: To set a db property indicating the number of
times the database has been opened
Parameters: None
Returns: Nothing
---------------------------------------------------------
On Error GoTo IncrementTimesOpened _ Err
Dim pty As Property
Dim lngDBTimesOpened As Long
cap09.indd 185 1/11/2006 15:59:39
186 universidade VBA
lngDBTimesOpened = CurrentDb.Properties(TimesOpened)
CurrentDb.Properties(TimesOpened) = lngDBTimesOpened + 1
Warn the user to re-compact every five opens
If lngDBTimesOpened Mod 5 = 0 Then
booCompactTime = True
End If
IncrementTimesOpened _ Exit:
Exit Sub
IncrementTimesOpened _ Err:
Select Case Err.Number
Case 3270 Error code for Property not found
Set pty = CurrentDb.CreateProperty(TimesOpened,
dbDate, 0)
CurrentDb.Properties.Append pty
Resume
Case Else
Call GlobalErr(IncrementTimesOpened, Err.
Number)
Resume IncrementTimesOpened _ Exit
Resume
End Select
End Sub
Access x Excel
Seguindo o padro de integrao dos programas, perfeitamente possvel fazer
a interligao de dados de um banco de dados Access para planilhas do Excel ou
vice-versa. O prprio Office permite esse tipo de transferncia, conforme mostrado
a seguir:
1. Na janela Banco de dados no Microsoft Access, clique na tabela, consulta,
formulrio ou relatrio que voc deseja usar no Excel.
2. No menu Ferramentas, aponte para Vnculos do Office, e clique em Analisar
com o MS Excel.
O Access salva o contedo da tabela, consulta, formulrio ou relatrio como um
arquivo (.xls) de pasta de trabalho do Excel e abre o arquivo no Excel. O arquivo
cap09.indd 186 1/11/2006 15:59:40
Access 187
9
captulo
salvo com o nome da tabela, consulta ou outro objeto de banco de dados na pasta
de atual.
Observao: se voc tiver um formulrio principal com um ou mais sub-formu-
lrios, ou um relatrio principal com um ou mais sub-relatrios, o Access salvar na
pasta de trabalho apenas os dados contidos no formulrio ou relatrio principal.
3. Para copiar apenas os registros selecionados, v at o Microsoft Access, abra a
tabela, consulta ou formulrio que contm os registros que voc deseja copiar.
4. No menu Exibir, clique em Modo folha de dados. Selecione os registros que
deseja copiar.
5. Se desejar selecionar colunas especficas, arraste pelos cabealhos de coluna
adjacentes. Clique em Copiar.
6. Alterne para o Excel. Clique no canto superior esquerdo da rea da planilha
onde voc deseja que o primeiro nome de campo seja exibido.
7. Para garantir que os registros copiados no substituam registros existentes,
certifique-se de que a planilha no tem dados abaixo ou direita da clula em que
voc clicar. Clique em Colar.
Apesar de no ser uma operao complexa, a ao anterior um pouco traba-
lhosa, sobretudo ao se operar com bases de dados ou planilhas de grande porte.
Por isso, vamos mostrar como realizar as mesmas alteraes, mas utilizando uma
macro VBA:
Sub intro()
Permite a transferncia de dados em uma base de dados do
Access para uma planilha Excel
Dim conn As New Connection
Dim rec As New Recordset
Dim ws As Worksheet
Dim sql$, i&
Set ws = ThisWorkbook.Worksheets(intro)
conn.Open Provider=microsoft.jet.oledb.4.0; + _
Data Source= + ThisWorkbook.Path + \nwind.
mdb;
sql = SELECT LastName, FirstName & _
cap09.indd 187 1/11/2006 15:59:40
188 universidade VBA
FROM employees ORDER BY LastName, FirstName
rec.Open sql, conn
While Not rec.EOF
i = i + 1
ws.[a1].Cells(i) = rec!LastName + , +
rec!FirstName
rec.MoveNext
Wend
rec.Close: conn.Close
End Sub
Sub rec _ fields()
Dim conn As New Connection
Dim rec As New Recordset
Dim f As Field
Dim ws As Worksheet
Dim i&
Set ws = ThisWorkbook.Worksheets(fields)
conn.Open Provider=microsoft.jet.oledb.4.0; + _
Data Source= + ThisWorkbook.Path + \nwind.
mdb;
rec.Open employees, conn
For Each f In rec.Fields
i = i + 1
ws.[a1].Cells(i) = f.Name
ws.[b1].Cells(i) = f.Type
ws.[c1].Cells(i) = TypeName(f.Value)
Next
rec.Close: conn.Close
End Sub
Sub command _ parameters()
Dim conn As New Connection
Dim rec As New Recordset
Dim comm As New Command
Dim ws As Worksheet
Dim i&, countryname$
Set ws = ThisWorkbook.Worksheets(command)
conn.Open Provider=microsoft.jet.oledb.4.0; + _
cap09.indd 188 1/11/2006 15:59:40
Access 189
9
captulo
Data Source= + ThisWorkbook.Path + \nwind.mdb;
Set comm.ActiveConnection = conn
comm.CommandText = SELECT companyname FROM customers
WHERE country = ?
countryname = InputBox(Please type in a country name
(i.e. germany).)
comm.Parameters(0) = countryname
rec.Open comm
ws.[a1].CopyFromRecordset rec
rec.Close: conn.Close
End Sub
Comparao entre bases de dados
Voc pode utilizar qualquer operador SQL padro como critrio de pesquisa
ou comparao entre duas bases de dados. Quando voc utiliza operadores em um
critrio de pesquisa, as regras a seguir se aplicam:
Os tipos de informaes dos dados utilizados na comparao devem corres-
ponder. Ou seja, apenas texto pode ser comparado a texto, nmeros a nmeros e
assim por diante. Voc pode utilizar uma funo ou palavra-chave (como CAST),
para converter temporariamente os dados para um outro tipo;
Ao comparar os dados do tipo texto, o resultado depende do conjunto de ca-
racteres em uso no momento. Por exemplo, se uma tabela tiver sido criada utilizando
caracteres escandinavos, os resultados da pesquisa podem diferir, dependendo do
conjunto de caracteres atual (pgina de cdigo) ser escandinavo ou outro conjunto
de caracteres;
Se um valor de comparao for nulo, o resultado desconhecido. Os nulos no
so combinados a qualquer valor, incluindo outras ocorrncias de nulo. Por exemplo,
se voc estiver procurando um nome que se inicia com a letra "M" ou acima (nome
>= "M") e algumas das linhas no contm valor, essas linhas no aparecem, no
importa que operador de comparao voc utiliza.
O VBA permite a criao de um aplicativo de comparao entre dois bancos
de dados diferentes, utilizando comandos SQL. Observe a seguir a implementao
desse aplicativo.
Option Compare Database
Iniciamos a criao de nosso comparador de bancos de
dados
Option Explicit
cap09.indd 189 1/11/2006 15:59:40
190 universidade VBA
Public booCompactTime As Boolean
Function Autoexec()
On Error GoTo Autoexec _ Err
Dim strModule As String
Dim strProperty As String
Dim dtLastOpened As Date
Dim db As Database
Dim pty As Property
Dim lngDBTimesOpened As Long
Dim lngProfileTimesOpened As Long
Dim intRetVal As Integer
Set db = CurrentDb
Se o banco de dados no foi compilado, abre o mdulo e
fora a compilao
If Not Application.IsCompiled Then
Mostra mensagem indicando que o banco de dados foi com-
pilado
DoCmd.OpenForm frmCompile, , , , acFormReadOnly
Atualzia a tela do banco de dados
Application.Echo False
D um nome a um novo mdulo
strModule = db.Containers(Modules).Documents(0).Name
Abre os mdulos e os compila manualmente
DoCmd.OpenModule strModule
A seguir, compilamos e salvamos todos os mdulos
Application.RunCommand acCmdCompileAndSaveAllModules
Registra a data e hora em que a base de dados foi com-
pilada
MarkCompileTime
Emite um sinal sonoro que confirma o envio
Beep
Fecha os mdulos que proventura estejam abertos
DoCmd.Close acModule, strModule
Atualiza a tela do banco de dados novamente
Application.Echo True
cap09.indd 190 1/11/2006 15:59:40
Access 191
9
captulo
Remove formers que no estejam sendo utilizados
DoCmd.Close acForm, frmCompile
End If
Encontra as ltimas alteraes e mambas as bases de da-
dos comparadas
IncrementTimesOpened
lngDBTimesOpened = db.Properties(TimesOpened) If this
is the first time for this database, then show the greeting
form
If lngDBTimesOpened = 1 Then
DoCmd.OpenForm frmGreeting, , , , , acDialog
Else
If GetSetting(MWSDB, Preferences, StartUpDialog,
True) Then
DoCmd.OpenForm frmGreeting, , , , , acDialog
End If
End If
Escreve as informaes encontradas no Registro (Captulo
3) da mquina que est sendo usada como cliente das compa-
raes
lngProfileTimesOpened = GetSetting(MWSDB, Statistics,
UsageCount, 1)
SaveSetting MWSDB, Statistics, UsageCount, lngProfi-
leTimesOpened + 1
SaveSetting MWSDB, Statistics, LastUsed, Format$(Now(),
yyyy.mm.dd hh:nn:ss)
DoCmd.OpenForm frmSwitchboard This form would contain
a cmdCompactDatabase control
Autoexec _ Exit:
Exit Function
Autoexec _ Err:
Application.Echo True
Select Case Err.Number
Case Else
cap09.indd 191 1/11/2006 15:59:41
192 universidade VBA
Call GlobalErr(Autoexec, Err.Number)
Resume Autoexec _ Exit
Resume
End Select
End Function
Sub GlobalErr(strProcName As String, intErr As Integer)
Dim strMsg As String
strMsg = The following error occurred in the & strProc-
Name & procedure
strMsg = strMsg & Chr$(10) & Chr$(10)
strMsg = strMsg & Error Number: & Format$(intErr) &
Chr$(10)
strMsg = strMsg & Error Description: & Error$
MsgBox strMsg, 48, Unexpected Error
GlobalErr _ Exit:
Exit Sub
End Sub
Sub MarkCompileTime()
On Error GoTo MarkCompileTime _ Err
Dim pty As Property
CurrentDb.Properties(LastCompiled) = Now
MarkCompileTime _ Exit:
Exit Sub
MarkCompileTime _ Err:
Select Case Err.Number
Case 3270 Error code for Property not found
Set pty = CurrentDb.CreateProperty(LastCompi
led, dbDate, Now())
CurrentDb.Properties.Append pty
cap09.indd 192 1/11/2006 15:59:41
Access 193
9
captulo
Resume
Case Else
Call GlobalErr(MarkCompileTime, Err.Number)
Resume MarkCompileTime _ Exit
Resume
End Select
End Sub
Sub IncrementTimesOpened()
On Error GoTo IncrementTimesOpened _ Err
Dim pty As Property
Dim lngDBTimesOpened As Long
lngDBTimesOpened = CurrentDb.Properties(TimesOpened)
CurrentDb.Properties(TimesOpened) = lngDBTimesOpened + 1
Warn the user to re-compact every five opens
If lngDBTimesOpened Mod 5 = 0 Then
booCompactTime = True
End If
IncrementTimesOpened _ Exit:
Exit Sub
IncrementTimesOpened _ Err:
Select Case Err.Number
Case 3270 Error code for Property not found
Set pty = CurrentDb.CreateProperty(TimesOpened,
dbDate, 0)
CurrentDb.Properties.Append pty
Resume
Case Else
Call GlobalErr(IncrementTimesOpened, Err.
Number)
Resume IncrementTimesOpened _ Exit
Resume
End Select
End Sub
cap09.indd 193 1/11/2006 15:59:41
194 universidade VBA
Compactao de bases de dados
Dependendo da configurao do computador e do ambiente de trabalho, h vrias
maneiras de melhorar o desempenho do Microsoft Access.
Se voc excluir dados ou objetos de um banco de dados do Access, ou se excluir
objetos de um projeto do Access, o arquivo pode ficar fragmentado e utilizar o es-
pao em disco de forma ineficiente. A compactao do arquivo do Access copia o
arquivo e reorganiza a forma como armazenado em disco. A compactao de um
banco de dados de uma verso anterior do Access no o converter em formato do
Access 2002 - 2003.
A compactao otimiza o desempenho dos bancos de dados e dos projetos do
Access. Entretanto, em um projeto do Access, ela no afeta os objetos de banco de
dados como, por exemplo, tabelas ou modos de exibio que residem no banco
de dados do Microsoft SQL Server em vez de no prprio projeto do Access.
A compactao no tem efeito algum sobre a auto-numerao em um projeto do
Access. Entretanto, em um banco de dados do Access, se voc excluir registros do
fim de uma tabela que possui um campo AutoNumerao, a compactao do banco
de dados redefine o valor da AutoNumerao; o valor da AutoNumerao do prximo
registro adicionado ser um nmero maior que o valor da AutoNumerao do ltimo
registro no excludo da tabela.
O projeto a seguir implementa uma macro que compacta uma base de dados de
maneira no excludente, ou seja, sem apagar linhas, colunas ou chaves em branco.
Utilizamos drivers ADODB para fazer a interligao entre o front-end Access e a
base de dados onde esto armazenadas as planilhas.
Public Sub CompactWithADO()
On Error GoTo BYE
Dim JRO As New JRO.JetEngine
Dim cnnSrc As New ADODB.Connection
Dim strSource As String
Dim strDestDB As String
Dim strPassword As String
Dim iFileStart As Integer
With frmSnippetBrowser.CommDlg1
.DialogTitle = Select Database to Compact
.Filter = Access 97/2000 (*.mdb)|*.mdb
.CancelError = False
.InitDir = gDbasePath
cap09.indd 194 1/11/2006 15:59:41
Access 195
9
captulo
.ShowOpen
End With
strSource = frmSnippetBrowser.CommDlg1.FileName
If strSource = Then
MsgBox Cancel clicked
Exit Sub
End If
Fecha a base de dados
Dim blnMeFlag As Boolean
blnMeFlag = False
If strSource = gstrPrimaryDB Then
Btn = MsgBox(Youve selected the Active Database!
& vbCrLf & vbCrLf & _
Compactaa est sendo realizada! Reiniice o
aplicativo aps a finalizao do processo. & vbCrLf & vbCrLf
& _
Voc realemnte quer realizar a compactao?,
vbOKCancel + vbQuestion, _
Compactao da base de dados ativa inicia-
da)
If Btn = vbNo Then Exit Sub
gcnPrimary.Close
Set gcnPrimary = Nothing
blnMeFlag = True
End If
Determina o tamanho do arquivo
Dim intReadChan As Integer
Dim lngInitialFileSize As Long
intReadChan = FreeFile
Open strSource For Input As intReadChan
Faz a referencia ao arquivo de destino
lngInitialFileSize = LOF(intReadChan)
Mostra o tamaho do arquivo
Close intReadChan
cnnSrc.ConnectionString = Provider=Microsoft.Jet.
OLEDB.4.0;Data Source= & strSource & _
cap09.indd 195 1/11/2006 15:59:41
196 universidade VBA
;Persist Security Info=False
cnnSrc.Open
Fecha a conexo corrente entre o banco de dados e o front-
end, se um deles utilizar conexo remota
cnnSrc.Close
Set cnnSrc = Nothing
define o caminho do diretrio e do arquivo, e adiciona
Backup of ao nome do arquivo compactado
LastSlashPos = InStrRev(strSource, \)
strPath = Left(strSource, LastSlashPos)
strFilename = Right(strSource, Len(strSource) - Last
SlashPos)
strDestDB = strPath & Backup of & strFilename
Encerra o Backup
JRO.CompactDatabase Provider=Microsoft.Jet.OLEDB.4.0;Data
Source= & strSource & _
;Jet OLEDB:Database Password= & strPassword, _
Provider=Microsoft.Jet.OLEDB.4.0;Data Source= &
strDestDB & _
;Jet OLEDB:Database Password= & strPassword
Deleta o arquivo original
Kill strSource
DoEvents
renomeia o arquivo original
Name strDestDB As strSource
Dim lngFinalFileSize As Long
intReadChan = FreeFile Get first open file number
(i.e., free channel)
Open strSource For Input As intReadChan Can now refer
to input file by this
lngFinalFileSize = LOF(intReadChan) Gives us our fi-
lesize
Close intReadChan
Dim lngResult As Long
cap09.indd 196 1/11/2006 15:59:41
Access 197
9
captulo
lngResult = lngInitialFileSize - lngFinalFileSize
MsgBox strSource & vbCrLf & vbCrLf & Compactado com
sucesso! & vbCrLf & vbCrLf & _
Initial Filesize = & Str(lngInitialFileSize) &
. . . . & _
Final Filesize = & Str(lngFinalFileSize) & vb-
CrLf & vbCrLf & _
Str(lngResult) & bytes were recovered!., vbOKOnly
+ vbInformation, _
Resultados do processo de compactao
Set JRO = Nothing
If blnMeFlag = True Then
End
End If
BYE:
End Sub
Se a base de dados parece apresentar problemas durante a
compactao, experimente criar a macro a seguir e execut-la.
Ela realiza a leitura da base por etapas:
Public Sub ChangeTitle()
Dim strName As String, strMessage As String, strPrompt
As String
Dim wspDefault As Workspace, dbsNorthwind As Database
Dim rstEmployees As Recordset
strPrompt = Alterar o ttulo da tabela atual?
Set wspDefault = DBEngine.Workspaces(0) Get default
Workspace.
Set dbsNorthwind = wspDefault.Databases(0) Get current
database.
Voc pode substituir o nome das tabelas pelos que bem
desejar
Set rstEmployees = dbsNorthwind.OpenRecordset(Emprega-
dos, dbOpenTable) Open table.
wspDefault.BeginTrans Start of transaction.
rstEmployees.MoveFirst
Do Until rstEmployees.EOF
cap09.indd 197 1/11/2006 15:59:42
198 universidade VBA
If rstEmployees![Title] = Sales Representative Then
strName = rstEmployees![LastName] & _
, & rstEmployees![FirstName]
strMessage = Employee: & strName & vbCrLf & vbCrLf
If MsgBox(strMessage & strPrompt, vbQuestion + vbYesNo, _
Altere o nome da funo) = vbYes Then
rstEmployees.Edit Enable editing.
rstEmployees![Title] = Account Executive
rstEmployees.UPDATE Save changes.
End If
End If
rstEmployees.MoveNext Move to next record.
Loop
If MsgBox(Salvar todas as alteraes?, vbQuestion +
vbYesNo, _
Salvar as alteraes) = vbYes Then
wspDefault.CommitTrans Commit changes.
Else
wspDefault.Rollback Undo changes.
End If
rstEmployees.Close Close table.
dbsNorthwind.Close
End Sub
Aplicativo de folha de pagamento
Vamos criar agora um aplicativo de folha de pagamento, utilizando o que apren-
demos sobre o Access. Utilizaremos algumas das UserForms do Access, mas voc
no precisa se assustar: utilizaremos o prprio modo de formulrio do Access para
realizar nossa tarefa.
1. Inicie o Microsoft Access e crie um banco de dados em branco, nomeando-o
como Payroll1.
2. Clique no menu Inserir > Forma. Na caixa de dilogo Nova Forma, selecione
a opo Design View.
3. Salve a forma como Payroll. Em seguida, desenhe um formulrio que contenha
todas as linhas e botes citados na tabela a seguir. Voc pode utilizar a disposio
que desejar e/ou achar mais funcional, desde que a calculadora funcione.
cap09.indd 198 1/11/2006 15:59:42
Access 199
9
captulo
Voc deve utilizar a tabela da seguinte maneira:
Crie um objeto para cada respectivo controle;
Defina uma caption ou nome para cada objeto;
Defina a propriedade correspondente para cada objeto.
4. A tabela a seguinte:
Control
Option Group
Text Box
Text Box
Option Group
Label
Label
Label
Label
Label
Label
Label
Label
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Text Box
Option Group
tton
Label
Label
Label
Text Box
Text Box
Text Box
Label
Text Box
Text Box
Button
Caption
Identificao do funcionrio
Nome do funcionrio
Salrio por hora
Folha de horas
Segunda
Tera
Quarta
Quinta
Sexta
Sbado
Domingo
Primeira semana:
Processo de pagamento
Pague:
Horas:
Total:
Horas regulares
Pague
Total trabalhado
Fechar
Name
txtEmployeeName
txtHourySalary
txtMonday1
txtTuesday1
txtWednesday1
txtThursday1
txtFriday1
txtSaturday1
txtSunday1
txtMonday2
txtTuesday2
txtWednesday2
txtThursday2
txtfriday2
txtSaturday2
txtSunday2
cmdProcesslt
txtRegularHours
txtRegularAmount
txtNetPay
txtOvertimeHours
txtOvertime Amount
cmdClose
Tabela 9.1.
5. Clique com o boto direito do mouse sobre o boto Processo de Pagamento e
selecione a opo Construir Evento.
cap09.indd 199 1/11/2006 15:59:42
200 universidade VBA
6. Na janela Escolher construtor, selecione a opo Construtor de cdigo. Na
janela do editor do VBA que ser aberta, implemente o seguinte cdigo:
Private Sub cmdProcessIt _ Click()
Dim monday1 As Double
Dim tuesday1 As Double
Dim wednesday1 As Double
Dim thursday1 As Double
Dim friday1 As Double
Dim saturday1 As Double
Dim sunday1 As Double
Dim monday2 As Double
Dim tuesday2 As Double
Dim wednesday2 As Double
Dim thursday2 As Double
Dim friday2 As Double
Dim saturday2 As Double
Dim sunday2 As Double
Dim totalHoursWeek1 As Double
Dim totalHoursWeek2 As Double
Dim regHours1 As Double
Dim regHours2 As Double
Dim ovtHours1 As Double
Dim ovtHours2 As Double
Dim regAmount1 As Currency
Dim regAmount2 As Currency
Dim ovtAmount1 As Currency
Dim ovtAmount2 As Currency

Dim regularHours As Double
Dim overtimeHours As Double
Dim regularAmount As Currency
Dim overtimeAmount As Currency
Dim totalEarnings As Currency
Dim hourlySalary As Currency
cap09.indd 200 1/11/2006 15:59:42
Access 201
9
captulo
Descobre o salrio por hora
hourlySalary = CDbl(Me.txtHourlySalary)
Descobre as horas trabalhadas em cada dia til
Primeira semana de trabalho
monday1 = CDbl(Me.txtMonday1)
tuesday1 = CDbl(Me.txtTuesday1)
wednesday1 = CDbl(Me.txtWednesday1)
thursday1 = CDbl(Me.txtThursday1)
friday1 = CDbl(Me.txtFriday1)
saturday1 = CDbl(Me.txtSaturday1)
sunday1 = CDbl(Me.txtSunday1)

Segunda semana. Pode-se implementar uma calculadora
que faa o calculo de quatro semanas ou um ms completo
bastando configurar mais jogos de objetos como os mostra-
dos na tabela e repetir mais duas vezes o cdigo de contagem
por semanas.
monday2 = CDbl(Me.txtMonday2)
tuesday2 = CDbl(Me.txtTuesday2)
wednesday2 = CDbl(Me.txtWednesday2)
thursday2 = CDbl(Me.txtThursday2)
friday2 = CDbl(Me.txtFriday2)
saturday2 = CDbl(Me.txtSaturday2)
sunday2 = CDbl(Me.txtSunday2)

Calcula o nmero total de horas por semana.
totalHoursWeek1 = monday1 + tuesday1 + wednesday1 +
thursday1 + _
friday1 + saturday1 + sunday1
totalHoursWeek2 = monday2 + tuesday2 + wednesday2 +
thursday2 + _
Calcula o pagamento de expedientes de meio perodo
Dim ovtSalary As Double
ovtSalary = hourlySalary * 1.5
Calcula o trabalho de funcionrios que trabalharem
mais de 40 horas em uma semana
cap09.indd 201 1/11/2006 15:59:42
202 universidade VBA
If totalHoursWeek1 < 40 Then
regHours1 = totalHoursWeek1
regAmount1 = hourlySalary * regHours1
ovtHours1 = 0
ovtAmount1 = 0
Se o empregado trabalhou mais de 40 horas, a funo a
seguir calcula as horas excedentes que devem ser pagas
ElseIf totalHoursWeek1 >= 40 Then
regHours1 = 40
regAmount1 = hourlySalary * 40
ovtHours1 = totalHoursWeek1 - 40
ovtAmount1 = ovtHours1 * ovtSalary
End If

If totalHoursWeek2 < 40 Then
regHours2 = totalHoursWeek2
regAmount2 = hourlySalary * regHours2
ovtHours2 = 0
ovtAmount2 = 0
ElseIf totalHoursWeek2 >= 40 Then
regHours2 = 40
regAmount2 = hourlySalary * 40
ovtHours2 = totalHoursWeek2 - 40
ovtAmount2 = ovtHours2 * ovtSalary
End If

regularHours = regHours1 + regHours2
overtimeHours = ovtHours1 + ovtHours2
regularAmount = regAmount1 + regAmount2
overtimeAmount = ovtAmount1 + ovtAmount2
totalEarnings = regularAmount + overtimeAmount
Me.txtRegularHours = regularHours
Me.txtOvertimeHours = overtimeHours
Me.txtRegularAmount = CCur(regularAmount)
Me.txtOvertimeAmount = CCur(overtimeAmount)
Me.txtNetPay = CCur(totalEarnings)
End Sub
cap09.indd 202 1/11/2006 15:59:43
Access 203
9
captulo
Undelete
Mas, e se voc perder a base de dados das suas folhas de pagamento, ou qualquer
um dos seus bancos de dados? Existem diversos programas de recuperao de dados
a disposio e o autor dessas pginas at adepto de um ou dois deles mas na
maioria das vezes eles no so capazes de recuperar as informaes da forma dese-
jada. No caso de tabelas SQL, Access ou formulrios, no raro que apenas uma
parte das informaes consiga ser recuperada, o que, em se tratando de aplicaes
complexas, equivale a nada.
O projeto a seguir ajuda a criar uma ferramenta de recuperao de tabelas e filtros
do Excel, semelhante ao antigo Undelete do MS-DOS. Para quem no lembra, o
Undelete um aplicativo que recupera arquivos apagados pela tecla Delete do
teclado ou pelo comando Ren.
Para criar o aplicativo basta possuir qualquer verso do Access acima do 2000,
abrindo o Editor do VBA (Alt + F11) embutido.
Option Compare Database
Option Explicit
VBA MODULE: Undelete

R EQ UIR E M E N TS: V B A DAO R efe r e nc e, Ac c e ss


97/2000/2002(XP)/2003
Public Function FnUndeleteObjects() As Boolean
On Error GoTo ErrorHandler:
Dim strObjectName As String
Dim rsTables As DAO.Recordset
Dim dbsDatabase As DAO.Database
Dim tDef As DAO.TableDef
Dim qDef As DAO.QueryDef
Dim intNumDeletedItemsFound As Integer
Set dbsDatabase = CurrentDb
For Each tDef In dbsDatabase.TableDefs
cap09.indd 203 1/11/2006 15:59:43
204 universidade VBA
This is actually used as a Deleted Flag
If tDef.Attributes And dbHiddenObject Then
strObjectName = FnGetDeletedTableNameByProp(
tDef.Name)
strObjectName = InputBox(Uma tabela deletada
foi descoberta. & _
vbCrLf & vbCrLf & _
Para recuperar o
objeto, digite seu nome:, _
Access Undelete Ta-
ble, strObjectName)
If Len(strObjectName) > 0 Then
FnUndeleteTable CurrentDb, tDef.Name,
strObjectName
End If
intNumDeletedItemsFound = intNumDeletedItems-
Found + 1
End If
Next tDef
For Each qDef In dbsDatabase.QueryDefs
If InStr(1, qDef.Name, ~TMPCLP) = 1 Then
note que no possvel recuperar tabelas com seu nome
original. O mesmo no se aplica aos filtros
strObjectName =
strObjectName = InputBox(Um filtro deletado
foi descoberto. & _
vbCrLf & vbCrLf & _
Para recuperar o
objeto, digite seu novo nome:, _
cap09.indd 204 1/11/2006 15:59:43
Access 205
9
captulo
Access Undelete
Query, strObjectName)
If Len(strObjectName) > 0 Then
If FnUndeleteQuery(CurrentDb, qDef.Name,
strObjectName) Then
Renomeia o objeto recuperado
qDef.Name = ~TMPCLQ & Right$(qDef.
Name, Len(qDef.Name) - 7)
End If
End If
intNumDeletedItemsFound = intNumDeletedItems-
Found + 1
End If
Next qDef
If intNumDeletedItemsFound = 0 Then
MsgBox Terminado o processo de recuperao de
tabelas e filtros perdidos!
End If
Set dbsDatabase = Nothing
FnUndeleteObjects = True
ExitFunction:
Exit Function
ErrorHandler:
MsgBox Um erro ocorreu na recuperao dos objetos()
- & _
cap09.indd 205 1/11/2006 15:59:43
206 universidade VBA
Err.Description & ( & CStr(Err.Number) &
)
GoTo ExitFunction
End Function
Private Function FnUndeleteTable(dbDatabase As DAO.Data-
base, _
strDele-
tedTableName As String, _
strNewTa-
bleName As String)
Dim tDef As DAO.TableDef
Set tDef = dbDatabase.TableDefs(strDeletedTableName)
Remove as flags dos objetos excludos
tDef.Attributes = tDef.Attributes And Not dbHiddenOb-
ject
Renomeia a tabela recuperada
tDef.Name = strNewTableName
dbDatabase.TableDefs.Refresh
Application.RefreshDatabaseWindow
Set tDef = Nothing
End Function
Private Function FnUndeleteQuery(dbDatabase As DAO.Data-
base, _
strDeletedQueryName As String, _
strNewQueryName As String)
If FnCopyQuery(dbDatabase, strDeletedQueryName,
strNewQueryName) Then
cap09.indd 206 1/11/2006 15:59:43
Access 207
9
captulo
FnUndeleteQuery = True
Application.RefreshDatabaseWindow
End If
End Function
Private Function FnCopyQuery(dbDatabase As DAO.Database, _
strSourceName As String, _
strDestinationName As String)
On Error GoTo ErrorHandler:
Dim qDefOld As DAO.QueryDef
Dim qDefNew As DAO.QueryDef
Dim Field As DAO.Field
Set qDefOld = dbDatabase.QueryDefs(strSourceName)
Set qDefNew = dbDatabase.CreateQueryDef(strDestinatio
nName, qDefOld.SQL)
Copia as propriedades de um filtro que for a excludo
e que foi considerado apto para recuperao
FnCopyLvProperties qDefNew, qDefOld.Properties,
qDefNew.Properties
For Each Field In qDefOld.Fields
Copia as propriedades de cada campo individual-
mente
FnCopyLvProperties qDefNew.Fields(Field.Name), _
Field.Properties, _
qDefNew.Fields(Field.Name).Properties

Next Field
dbDatabase.QueryDefs.Refresh
FnCopyQuery = True
cap09.indd 207 1/11/2006 15:59:43
208 universidade VBA
ExitFunction:
Set qDefNew = Nothing
Set qDefOld = Nothing
Exit Function
ErrorHandler:
MsgBox Erro. Recriando o filtro & strDestination-
Name & : & vbCrLf & _
Err.Description & ( & CStr(Err.Number) & )
GoTo ExitFunction
End Function
Private Function PropExists(Props As DAO.Properties, _
strPropName As String) As Boolean
O mdulo a seguir ignora os erros
On Error Resume Next
Dim Prop As DAO.Property
For Each Prop In Props
If Prop.Name = strPropName Then
PropExists = True
Exit Function Short circuit
End If
Next Prop
PropExists = False
End Function
Private Sub FnCopyLvProperties(objObject As Object, _
OldProps As DAO.Properties, _
cap09.indd 208 1/11/2006 15:59:44
Access 209
9
captulo
NewProps As DAO.Properties)
On Error Resume Next
Dim Prop As DAO.Property
Dim NewProp As DAO.Property
For Each Prop In OldProps
If Not PropExists(NewProps, Prop.Name) Then
If IsNumeric(Prop.Value) Then
NewProps.Append objObject.CreateProperty(Prop.
Name, _

Prop.Type, _

CLng(Prop.Value))
Else
NewProps.Append objObject.CreateProperty(Prop.
Name, _

Prop.Type, _

Prop.Value)
End If
Else
With NewProps(Prop.Name)
.Type = Prop.Type
.Value = Prop.Value
End With
End If
Next Prop
cap09.indd 209 1/11/2006 15:59:44
210 universidade VBA
End Sub
Private Function FnGetDeletedTableNameByProp(strRealTable
Name As String) _
As String
On Error Resume Next
Dim i As Long
Dim strNameMap As String
strNameMap = CurrentDb.TableDefs(strRealTableName).
Properties(NameMap)
strNameMap = Mid(strNameMap, 23) Offset of the table
name...
i = 1
If Len(strNameMap) > 0 Then
While (i < Len(strNameMap)) And (Asc(Mid(strNameMap,
i)) <> 0)
i = i + 1
Wend
End If
FnGetDeletedTableNameByProp = Left(strNameMap, i - 1)
End Function
Option Explicit
Atribuio de IPs via Access
O endereo IP um nmero de 32 bits em IPv4 (verso 4 do IP) e est associado
a um nico sistema ligado rede. Para simplificar, esses nmeros so divididos em
cap09.indd 210 1/11/2006 15:59:44
Access 211
9
captulo
quatro octetos e escritos em formato decimal (com ponto). Todas as mquinas loca-
lizadas em uma rede possuem endereos IP, assim como as mquinas que acessam
a Internet.
No projeto a seguir desenvolvemos uma ferramenta que permite a atribuio de
um endereo IP mquina local utilizando VBA, a partir de um front-end Access.
Option Compare Database
Option Explicit
Type IPINFO
dwAddr As Long IP address
dwIndex As Long interface index
dwMask As Long subnet mask
dwBCastAddr As Long broadcast address
dwReasmSize As Long assembly size
Reserved1 As Integer
Reserved2 As Integer
End Type
Public Function ConvertIPAddressToString(longAddr As Long)
As String

Dim IPBytes(3) As Byte
Dim lngCount As Long

Converte um endereo IP no formato longo ou hexade-
cimal para a string to a string formatada 255.255.255.255

CopyMemory IPBytes(0), longAddr, 4 IP Address is sto-
red in four bytes (255.255.255.255)

Converte o valor de 4 bytes para o mesmo formato de
string
While lngCount < 4

ConvertIPAddressToString = ConvertIPAddressToString + _
CStr(IPBytes(lngCount)) + _
IIf(lngCount < 3, ., )
lngCount = lngCount + 1
cap09.indd 211 1/11/2006 15:59:44
212 universidade VBA
Wend

End Function
Public Sub GetIPAddresses(Optional blnFilterLocalhost As
Boolean = False)
Dim Ret As Long, Tel As Long
Dim bytBuffer() As Byte
Dim IPTableRow As IPINFO
Dim lngCount As Long
Dim lngBufferRequired As Long
Dim lngStructSize As Long
Dim lngNumIPAddresses As Long
Dim strIPAddress As String
On Error GoTo ErrorHandler:

Call GetIpAddrTable(ByVal 0&, lngBufferRequired, 1)
If lngBufferRequired > 0 Then

ReDim bytBuffer(0 To lngBufferRequired - 1) As Byte

If GetIpAddrTable(bytBuffer(0), lngBufferRequired, 1)
= 0 Then

Mostra detalhes do endereo de IP atual e
da troca de IP

lngStructSize = LenB(IPTableRow)

CopyMemory lngNumIPAddresses, bytBuffer(0), 4

While lngCount < lngNumIPAddresses

CopyMemory IPTableRow, _
bytBuffer(4 + (lngCount *
lngStructSize)), _
lngStructSize
cap09.indd 212 1/11/2006 15:59:44
Access 213
9
captulo
strIPAddress = ConvertIPAddressToString
(IPTableRow.dwAddr)

If Not ((strIPAddress = 127.0.0.1) _
And blnFilterLocalhost) Then

Debug.Print strIPAddress

End If

lngCount = lngCount + 1

Wend

End If

End If
Exit Sub
ErrorHandler:
MsgBox Ocorreu um erro em GetIPAddresses(): & vbCrLf
& vbCrLf & _
Err.Description & ( & CStr(Err.Number) & )
End Sub
Option Explicit
Interligando Access
e Outlook via VBA
Nosso ltimo projeto interliga o Access ao Outlook, permitindo o envio de e-mails
de dentro da interface deste ltimo. O Outlook o servio de agenda e gerencia-
mento de e-mails do Office, sendo talvez o aplicativo desse tipo mais utilizado no
planeta. O problema do Outlook, no entanto e justamente, est na sua aplicao em
conjunto com bancos de dados: para quem trabalha com uma base de dados para a
qual precisa enviar e-mails, torna-se complexo abrir o Outlook e digitar cada e-mail.
Alm disso, o Outlook no auto-gerencivel: se voc no configurar as pastas cor-
cap09.indd 213 1/11/2006 15:59:44
214 universidade VBA
retamente, os e-mails enviados e recebidos caem em qualquer lugar. Um pequeno
problema para quem utiliza e-mails em casa, mas uma grande confuso para quem
precisa trabalhar.
Private Sub Application _ Startup()
End Sub
FnSendMailSafe o nome que daremos engine de criao
e envio de e-mails
Public Function FnSendMailSafe(strTo As String, _
strCC As String, _
strBCC As String, _
strSubject As String, _
strMessageBody As String, _
Optional strAttachments As String)
As Boolean
On Error GoTo ErrorHandler:
Dim MAPISession As Outlook.NameSpace
Dim MAPIFolder As Outlook.MAPIFolder
Dim MAPIMailItem As Outlook.MailItem
Dim oRecipient As Outlook.Recipient

Dim TempArray() As String
Dim varArrayItem As Variant

Dim blnSuccessful As Boolean
Criamos o objeto MAPI NameSpace
Set MAPISession = Application.Session

If Not MAPISession Is Nothing Then
Logon na sesso MAPI
MAPISession.Logon , , True, False
Criamos um ponto de acesso a um diretrio do Outlook
cap09.indd 214 1/11/2006 15:59:44
Access 215
9
captulo
Set MAPIFolder = MAPISession.GetDefaultFolder(olFolder-
Outbox)
If Not MAPIFolder Is Nothing Then
Criamos um novo objeto (e-mail) no diretrio
Outlook, anteriormente criado
Set MAPIMailItem = MAPIFolder.Items.Add(olMailItem)
If Not MAPIMailItem Is Nothing Then

With MAPIMailItem
Criao do destinatrio TO
TempArray = Split(strTo, ;)
For Each varArrayItem In TempArray

Set oRecipient = .Recipients.Add(CStr(
Trim(varArrayItem)))
oRecipient.Type = olTo
Set oRecipient = Nothing

Next varArrayItem

Criao dos destinatrios CC
TempArray = Split(strCC, ;)
For Each varArrayItem In TempArray

Set oRecipient = .Recipients.Add(CStr(
Trim(varArrayItem)))
oRecipient.Type = olCC
Set oRecipient = Nothing

Next varArrayItem

Criao dos destinatrios BCC
TempArray = Split(strBCC, ;)
For Each varArrayItem In TempArray

Set oRecipient = .Recipients.Add(CStr(
Trim(varArrayItem)))
cap09.indd 215 1/11/2006 15:59:45
216 universidade VBA
oRecipient.Type = olBCC
Set oRecipient = Nothing

Next varArrayItem

Definimos o assunto ou SUBJECT
.Subject = strSubject

Definimos o corpo da mensagem ou BODY (HTML
ou texto plano)
If StrComp(Left(strMessageBody, 6), <HTML>,
vbTextCompare) = 0 Then
.HTMLBody = strMessageBody
Else
.Body = strMessageBody
End If
Adiciona anexos mensagem, se assim for
especificado
TempArray = Split(strAttachments, ;)
For Each varArrayItem In TempArray

.Attach m ents.Add
CStr(Trim(varArrayItem))

Next varArrayItem
.Send
Set MAPIMailItem = Nothing

End With
End If
Set MAPIFolder = Nothing

End If
MAPISession.Logoff
cap09.indd 216 1/11/2006 15:59:45
Access 217
9
captulo
End If

Se tudo funcionou cortretamente, basta apertar OK.
blnSuccessful = True

ExitRoutine:
Set MAPISession = Nothing
FnSendMailSafe = blnSuccessful

Exit Function

ErrorHandler:
MsgBox Um erro ocorreu em Outlook VBA function
FnSendMailSafe() & vbCrLf & vbCrLf & _
Error Number: & CStr(Err.Number) & vbCrLf
& _
Error Description: & Err.Description,
vbApplicationModal + vbCritical
Resume ExitRoutine
End Function
cap09.indd 217 1/11/2006 15:59:45
cap09.indd 218 1/11/2006 15:59:45
Apndice
ap01.indd 219 1/11/2006 16:00:37
220 universidade VBA
Referncias a clulas e intervalos
Comando: Range(A1).
Sintaxe: Range (Clula).
Utilizao: define uma nica clula como objeto de um comando ou proprie-
dade.
Variveis: no h variveis.
Exemplo: com Range(A1).Value = 1, definimos que a clula A1 ter
valor True (Verdadeiro) ou 1.
Veja tambm: Range(A1:B5).
Comando: Range(A1:B5).
Sintaxe: Range(clula:clula).
Utilizao: define um intervalo de clulas como objeto de um comando ou pro-
priedade.
Variveis: no h variveis.
Exemplo: em Range(A1:C12).Value = 1 definimos que o intervalo de clulas
entre A1 e C12 True (Verdadeiro) ou 1.
Veja tambm: Range(1:5) e AllowEditRanges.
Comando: Range com seleo de vrias reas.
Sintaxe: Range(clula:clula,clula:clula).
Utilizao: define uma seleo de vrias reas (clulas) como objeto de um
comando ou propriedade.
Variveis: no h variveis.
Exemplo: Range(A1:C12,C118:D27,E1:F18).
Veja tambm: Range de linhas alternado e Range(A1:B5).
Comando: Range de coluna.
Sintaxe: Range(Letra da Coluna:Letra da Coluna).
Utilizao: define um intervalo de colunas para utilizao de um comando ou
propriedade.
Variveis: no h variveis.
Exemplo: Private Sub CommandButton1 _ Click()
Columns(D:D)
End Sub
Esse comando define que ser criado um boto para ativar a coluna D.
Veja tambm: Range(A:A) e Range de linhas.
ap01.indd 220 1/11/2006 16:00:37
Apndice 221
apndice
Comando: Range de linha.
Sintaxe: Range(Nmero da linha:Nmero da linha).
Utilizao: define uma nica linha para utilizao de um comando ou pro-
priedade.
Variveis: no h variveis.
Exemplo: Range(1:1).
Veja tambm: Range de linhas alternado e Range de linha.
Comando: Range para intervalo de colunas.
Sintaxe: Range(coluna inicial:coluna final).
Utilizao: define um intervalo de colunas como objeto de um comando ou pro-
priedade.
Variveis: no h variveis.
Exemplo: Sub Teste()
Range(A:E).End(xldown).Select
End Sub
Esse comando seleciona todas as colunas de A at E presentes em uma planilha
do Excel.
Veja tambm: Range de linhas.
Comando: Range de intervalo de linhas.
Sintaxe: Range(coluna 1:coluna 2).
Utilizao: define um intervalo de vrias linhas como objeto de um comando,
propriedade ou mtodo.
Variveis: no h variveis.
Exemplo: Sub Linhas()
Range(1:10).End(xlup).Select
End Sub
Esse comando seleciona todas as linhas de 1 a 10 presentes em uma planilha
do Excel.
Veja tambm: Range de colunas e Sub.
Comando: Range de linhas avulsas.
Sintaxe: Range(primeiro intervalo de linhas,segundo intervalo
de linhas,terceiro intervalo de linhas).
Utilizao: define diversos intervalos de linhas, ou de linhas avulsas, como objeto
de um comando, varivel ou mtodo.
Variveis: no h variveis.
ap01.indd 221 1/11/2006 16:00:37
222 universidade VBA
Exemplo: Sub Range de linhas avulsas()
Range(1:19,23, 30:45).End(xlToRight).Select
End Sub
Veja tambm: Range de intervalo de linhas.
Comando: Range de colunas avulsas.
Sintaxe: Range(coluna 1,coluna 2,coluna 3).
Utilizao: define diversos intervalos de colunas, ou de colunas avulsas, como
objeto de um comando, varivel ou mtodo.
Variveis: no h variveis.
Exemplo: Sub LastCellInColumn()
Range(A:C,F:S).End(xlToLeft).Select
End Sub
Esse comando indica qual foi a ltima coluna utilizada nos intervalos de colunas
de A a C e de F a S.
Veja tambm: Range de linhas avulsas.
Comando: Range de clulas pelo nmero de ndice.
Sintaxe: Worksheets(Nome da Planilha).Cells(<linha>, <co-
luna>).
Utilizao: utilizada para fazer com que um intervalo de clulas seja definido por
meio de um nmero de ndice, em vez de se utilizar coordenadas exatas.
Variveis: no h variveis.
Exemplo: Sub ndice()
Worksheets(Digerati)).Cells(2,5)
End Sub
Esse comando faz com que a clula dois da coluna E da planilha Digerati seja
selecionada.
Veja tambm: Worksheets.
Comando: Rows.
Sintaxe: [Worksheets(<Nome da Planilha)].Rows[(<Nmero da
Linha>)] = True
End Sub
Utilizao: seleciona, para a operao, uma, vrias ou todas as linhas da pla-
nilha.
Variveis:
(<nmero da linha>): define uma linha especfica para a aplicao do
comando;
ap01.indd 222 1/11/2006 16:00:37
Apndice 223
apndice
Worksheets: se Worksheet no definido antes de Rows, o comando ser
utilizado na planilha ativa, e no em uma planilha especfica.
Exemplos:
1. Sub RowBold()
Worksheets(Digerati).Rows(2).Font.Bold = True
End Sub
Com esse comando, transformamos o contedo de toda a segunda linha em
negrito.
2. Sub Rows()
Worksheets(Digerati).Rows.Font.Bold = True
End Sub
Esse comando transforma todas as linhas da planilha Digerati em negrito.
Veja tambm: Columns.
Comando: Columns.
Sintaxe: [Worksheets(<Nome da Planilha)].Columns [(<nmero
da coluna ou letra da coluna>)].
Utilizao: seleciona todas as colunas de uma planilha, ou uma determinada
coluna.
Variveis:
(<nmero ou letra da coluna>): define uma determinada coluna para
aplicao do comando;
Worksheets: se Worksheet no for definido antes de Columns, o comando
ser utilizado na planilha ativa, e no em uma planilha especfica.
Exemplo: Private Sub CommandButton1 _ Click()
Columns(D)
End Sub
Com esse comando, criamos um boto que ativa a coluna D da planilha atual.
Veja tambm: Worksheets e Rows.

Comando: Union.
Sintaxe: Union([Rows/Columns](numero-coordenada do elemento),
([Rows/Columns] (numero-coordenada do elemento), ([Rows/
Columns] (numero-coordenada do elemento)).
Utilizao: para trabalhar com vrias linhas ou colunas ao mesmo tempo, crie
uma varivel de objeto e use o mtodo Union, combinando vrias chamadas
para as propriedades Rows ou Columns.
ap01.indd 223 1/11/2006 16:00:38
224 universidade VBA
Variveis:
Row: define que uma linha ser selecionada;
Column: define que uma coluna ser selecionada
Exemplo: Sub TestUnion()
Worksheets(Digerati).Activate
Dim myUnion As Range
Set myUnion = Union(Rows(1), Rows(3), Rows(5))
myUnion.Font.Bold = True
End Sub
Com esse comando, ativamos a planilha Digerati e formatamos em negrito as
linhas 1, 3 e 5.
Veja tambm: Column e Rows.
Comando: atalho de Range.
Sintaxe: [(clula inicial:clula final].
Utilizao: Pode-se usar o estilo de referncia A1 ou um intervalo nomeado entre
colchetes como um atalho para a propriedade Range.
Pode-se, tambm, selecionar as clulas na planilha atual e criar a referncia no
cdigo, atribuindo-lhe um nome entre colchetes.
Variveis: no h variveis.
Exemplo: Sub ClearRange()
Worksheets(Digerati).[A1:B5].ClearContents
End Sub
Esse comando limpa o contedo das clulas A1 e B5 da planilha Digerati.
Veja tambm: Range.
Comando: intervalos nomeados.
Sintaxe: Range(Nome da Planilha.xls!Nome do range).
Utilizao: nomeia um intervalo selecionado substituindo as coordenadas
de clulas por um nome fantasia. Para efetuar a ao, selecione as clulas da
planilha e, em seguida, clique na caixa na extremidade esquerda da barra de
frmulas. Digite um nome e, logo aps, pressione Enter. Para evocar o intervalo
nomeado, utilize o nome deste entre colchetes no cdigo.
Variveis: no h variveis.
Exemplo:
1. Sub SetValue()
[MyRange].Value = 1
End Sub
ap01.indd 224 1/11/2006 16:00:38
Apndice 225
apndice
Esse comando define o valor do Range com nome fantasia (lembre-se de co-
locar entre colchetes) como 1.
2. Sub FormatRange()
Range(Digerati.xls!MyRange).Font.Italic = True
End Sub
Esse comando acessa o valor de Range a partir do intervalo selecionado na
planilha Digerati.xls.
Veja tambm: Ranges.
Comando: Offset.
Sintaxe: [coordenada atual] Offset([-][linha],[-][coluna]) .
Utilizao: faz com que o contedo da clula que est em um determinado
nmero de linhas ou colunas de uma coordenada fixa, ou da clula atualmente
ativa, sofra uma determinada ao.
O padro impe que as coordenadas so definidas de cima para baixo e da
esquerda para a direita.
Variveis:
[coordenada atual]: define a localizao que deve ser estabelecida como
ponto de partida para a montagem da coordenada;
linha: indica que a coordenada ser definida aps um certo nmero de
linhas;
coluna: indica que a coordenada ser definida aps um certo nmero de
colunas;
- (sinal de menos): indica que a coordenada ser acessada de baixo para cima,
ou da direita para a esquerda.
Exemplo: ActiveCell.Offset(-3, -2).Range(A1:C4).Select.
Esse comando faz com que seja selecionada a clula localizada trs linhas acima
e duas colunas direita da clula ativa, se ela estiver no intervalo de clulas A1:
C4; o que faz com que o comando no seja executado se a clula-coordenada no
pertencer a esse intervalo.
Veja tambm: Worksheets.
Comando: Select.
Sintaxe: Sheets [(Nome da planilha)][Range (valor do ran-
ge)].Select.
Utilizao: o mtodo Select ativa planilhas e objetos em planilhas, incluindo
clulas e intervalos.
ap01.indd 225 1/11/2006 16:00:38
226 universidade VBA
Variveis:
Nome da planilha: preciso especificar um nome de planilha para que
a seleo seja efetuada, mesmo se desejar selecionar algo na planilha atual;
Range: define o intervalo que ser selecionado na planilha.
Exemplo: Sub Macro1()
Sheets(Digerati).Select
Range(A1).Select
Range(B1).Select
End Sub
Esse comando seleciona as clulas A1 e B1 da planilha Digerati.
Veja tambm: Sheets e Range.
Comando: Selection.
Sintaxe: Selection.[varivel].[mtodo].
Utilizao: a propriedade Selection retorna um objeto que representa a seleo
atual na planilha ativa da pasta de trabalho atual. Antes de utilizar a propriedade
Selection, necessrio ativar uma pasta de trabalho, ativar ou selecionar uma
planilha e, em seguida, selecionar um intervalo. Selection costuma ser utilizado
em conjunto com Select.
Variveis:
varivel: define a varivel de um determinado objeto e que ser alterada pela
aplicao de Selection ;
mtodo: define o mtodo que ser aplicado em uma determinada varivel.
Exemplo: Sub TesteSelection()
Sheets(Digerati).Select
Range(A1).Select
Range(C1:D10).Select
Range(E1:E10).Select
Selection.Font.Italic = True
End Sub
Esse comando faz com que todos os intervalos declarados para a planilha Digerati
sejam selecionados e, e em seguida, estabelece que o contedo dessa seleo ser
formatado em itlico.
Veja tambm: Range e Sheets.
Comando: Areas.
Sintaxe: Selection.Areas.[propriedade] [condicional].
Utilizao: retorna uma coleo Areas do tipo somente leitura (no pode
ser gravada ou alterada no cdigo do aplicativo ou no script), representando
ap01.indd 226 1/11/2006 16:00:38
Apndice 227
apndice
todos os intervalos em uma seleo de vrias reas. Para uma nica seleo
retornado o prprio Range original.
Variveis:
propriedade: define a propriedade que ser aplicada ao comando;
condicional: em alguns casos, deve-se definir uma condio para a aplica-
o da propriedade atrelada ao comando. Essa condicional pode utilizar funes
booleanas, como True (Verdadeiro) ou False (Falso) e 0 ou 1, ou utilizar
parmetros de comparao utilizando smbolos matemticos (<, >, =).
Exemplo: If Selection.Areas.Count < 1 Then
MsgBox Copie o contedo dessas clulas.
End If
O exemplo exprime uma condio utilizando If (se). Se a seleo de determi-
nadas reas da planilha possuir algo (ou seja, se existir uma seleo com vrios
intervalos e estes estiverem ocupados) enviada para a tela a caixa de mensagem
(MsgBox) avisando que esse contedo deve ser copiado.
Veja tambm: Selection e MsgBox.
Comando: For...Next.
Sintaxe: For
[CDIGO] Cells
Next
Utilizao: utilizado para criar loops (repeties de um comando) em um mesmo
intervalo de clulas. O retorno feito combinando uma instruo de loop com um
ou mais mtodos para identificar as clulas, uma de cada vez.
Usando a propriedade Cells, voc pode substituir o contador do loop (ou outras
variveis e expresses) pelos nmeros de ndice das clulas.
Variveis: no h variveis.
Exemplo: Sub CheckValues1()
Dim rwIndex As Integer
Dim colIndex As Integer
For rwIndex = 1 To 10
For colIndex = 1 To 5
If Cells(rwIndex, colIndex).Value <> 0 Then _
Cells(rwIndex, colIndex).Value = 0
Next colIndex
Next rwIndex
End Sub
Esse comando checa os valores de um determinado grupo de clulas todas as
localizadas entre as linhas um e dez e as colunas um a cinco da planilha atual.
ap01.indd 227 1/11/2006 16:00:39
228 universidade VBA
Note que foram criados os ranges rwIndex e collIndex com os intervalos de
linhas e colunas, e foi esse o valor atribudo a Cells.
Veja tambm: Range, Column e Rows.
Comando: For Each...Next.
Sintaxe: For Each
[CDIGO] Range
Next
Utilizao: efetua um loop por um intervalo, fazendo com que a coleo de
clulas seja retornada pela propriedade Range. O Visual Basic define auto-
maticamente uma varivel de objeto para a prxima clula sempre que o loop
executado.
Variveis: no h variveis.
Exemplo: Sub Teste2()
For Each c In Worksheets(Digerati).Range(A1:
D10).Cells
If Abs(c.Value) < 0.01 Then c.Value = 0
Next
End Sub
Esse comando faz um loop a partir do intervalo A1:D10, definindo como 0
qualquer valor menor que 0.01.
Veja tambm: Sub e For...Next.
Comando: CurrentRegion.
Sintaxe: For [CDIGO]ActiveCell.CurrentRegion.Cells
If [CONDICIONAL]
Next
Utilizao: se voc no souber os limites do intervalo no qual deseja fazer o loop,
pode usar a propriedade CurrentRegion para retornar o intervalo que envolve
a clula ativa na planilha.
Variveis: no h variveis.
Exemplo: Sub TestedeLoop
Dim i AsInteger
For i = 1 To Selection.CurrentRegion.Rows.Count - 1
ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2])
ActiveCell.Offset(1, 0).Select
ap01.indd 228 1/11/2006 16:00:39
Apndice 229
apndice
Next i
End Sub
Veja tambm: Worksheets.
Comando: Activate.
Sintaxe: Worksheet [(Nome da planilha)]. Activate
Range [Intervalo de Range].Select
Range(Clula de range).Select
Utilizao: pode-se utilizar o mtodo Activate para ativar uma clula em
uma seleo. Apenas uma clula por vez pode ser ativada.
Variveis:
Nome da planilha: preciso definir um nome para a planilha, entre
aspas, para ativ-la;
Intervalo de Range: deve-se definir um intervalo de clulas entre
aspas, no estilo A1:A40 (clula inicial, dois pontos, clulas finais);
Clula de Range: a clula (nica) que ser ativada utilizando Se-
lect.
Exemplo: Worksheet(Digerati.xls).Activate
Range(A1:A100).Select
Selection.End(xlDown).Select
Activate Range(A1:A100).Select
Veja tambm: Range e Worksheet.
Comando: ActiveCell.
Sintaxe: Worksheets(Nome da planilha).Activate
ActiveCell.Value = [VALOR DA CLULA]
Utilizao: essa propriedade retorna um objeto Range representando a clula
ativa. possvel aplicar qualquer propriedade ou mtodo de um objeto Range
clula ativa.
Variveis: no h variveis.
Exemplo: Sub TestInRange()
If InRange(ActiveCell, Range(A1:D100)) Then
MsgBox Clula ativa!
Else
MsgBox Clula no est ativa!
End If
End Sub
ap01.indd 229 1/11/2006 16:00:39
230 universidade VBA
Esse comando define que deve ser mostrada a primeira mensagem caso exista uma c-
lula ativa no intervalo entre A1 e D100. Se h uma clula ativa, mas fora desse intervalo,
ou no h clula alguma, deve ser retornada a mensagem Clula no est ativa!.
Veja tambm: MsgBox e Sub.
Procedimentos
Comando: Sub.
Sintaxe: Sub [NOME DO PROCEDIMENTO] [( )]
[CDIGO]
End Sub
Utilizao: um procedimento Sub uma srie de instrues do Visual Basic,
colocada entre Sub e End Sub, capaz de executar aes (comear e terminar
uma instruo), mas no de retornar um valor. Um procedimento Sub pode
utilizar argumentos, como constantes, variveis ou expresses, submetidos a um
procedimento de chamada. Caso um procedimento Sub no tenha argumentos,
a instruo Sub deve incluir um conjunto de parnteses vazios.
Variveis: ( ): utilizada para indicar que um procedimento Sub no possui
argumentos.
Exemplo: Sub VerSub()
Charts.Add
ActiveChart.ChartType = xlXYScatterLines
ActiveChart.SetSourceData Source:=Sheets
(Sheet1).Range(A3:G14)
ActiveChart.Location Where:=xlLocationAsObject,
Name:=Sheet1
End Sub
Veja tambm: Function.
Comando: Function.
Sintaxe: Function [NOME DA FUNO] [( )]
[FUNO]
End Function
Utilizao: um procedimento Function uma srie de instrues do Visual
Basic colocadas entre as instrues Function e End Function. Um procedi-
mento Function semelhante a um procedimento Sub, com a diferena de que
uma funo pode retornar um valor. Um procedimento Function pode utilizar
argumentos, como constantes, variveis ou expresses, transmitidos a ele por um
ap01.indd 230 1/11/2006 16:00:39
Apndice 231
apndice
procedimento de chamada. Caso um procedimento Function no tenha argu-
mentos, sua instruo Function deve incluir um conjunto de parnteses vazio.
Variveis: ( ): utilizada para indicar que a funo no possui argumentos.
Exemplos:
1. Function Area()
End Function
Esse comando define que a funo Area ser utilizada no meio do cdigo, sem
a adio de argumentos.
2. Function Area(Length As Double, Width As Double)
Area = Length * Width
End Function
Esse comando declara a funo Area utilizando argumentos, para que seja feita
a multiplicao da largura pelo comprimento.
Veja tambm: Areas e Sub.
Comando: Property>.
Sintaxe: [Public | Private] [Static] Property {Get | Let |
Set} nome _ da _ propriedade (arguments)] [As type]
instrues
End Property
Utilizao: o procedimento Property constitui uma srie de instrues do
Visual Basic que permitem que um programador crie e manipule propriedades
personalizadas. Os procedimentos Property podem ser utilizados para criar
propriedades do tipo somente leitura para formulrios, mdulos-padro e
mdulos de classe.
Ao criar um procedimento Property, ele torna-se uma propriedade do mdulo
que contm o procedimento. O Visual Basic fornece trs tipos de procedimentos
Property apresentados a seguir:
Procedimento
Property Let
Property Get
Property Set
Descrio
Procedimento que define o valor de uma propriedade.
Procedimento que retorna o valor de uma propriedade.
Procedimento que define a referncia de um objeto.
Tabela Ap. 1.
Geralmente, os procedimentos Property so utilizados em pares: Property
Let com Property Get e Property Set com Property Get. A decla-
ap01.indd 231 1/11/2006 16:00:40
232 universidade VBA
rao de apenas um procedimento Property Get corresponde declarao
de uma propriedade do tipo somente leitura.
Variveis:
Public: indica que a propriedade poder ser utilizada em todos os proce-
dimentos, em todos os mdulos e em quaisquer aplicativos;
Private: impede que o contedo de um mdulo seja referenciado fora do
projeto;
Static: as variveis declaradas com a instruo Static retm os valores desde
que o cdigo esteja sendo executado;
Get: declara o nome, os argumentos e o cdigo que formam o corpo de um
procedimento Property, que obtm o valor de uma propriedade;
Let: atribui um valor a uma propriedade;
Set: atribui uma referncia de objeto a uma varivel ou propriedade.
Exemplo: Primeiro definimos as constantes que sero uti-
lizadas no cdigo.
Dim CorAtual As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3
Retorna a cor como uma seqncia
Property Get TestColor() As String
Select Case CorAtual
Case RED
TestColor = Vermelho
Case GREEN
TestColor = Verde
Case BLUE
TestColor = Azul
End Select
End Property
Veja tambm: Select.
Propriedades
Comando: AddIns.
Sintaxe: If AddIns(Nome do objeto).Installed = [VALOR]
Then.
ap01.indd 232 1/11/2006 16:00:40
Apndice 233
apndice
Utilizao: retorna uma coleo AddIns representando todos os suplementos
listados na caixa de dilogo Suplementos (menu Ferramentas do Excel). do tipo
somente leitura, ou seja, a listagem no pode ser alterada por cdigo VBA.
Variveis:
valor: utilizam-se aqui os valores booleanos. possvel utilizar True (Verda-
deiro) ou False (Falso).
Exemplo: If AddIns(Analysis ToolPak).Installed = True Then
MsgBox Analysis ToolPak add-in est instalado
Else
MsgBox Analysis ToolPak add-in no est instalado
End If
Veja tambm: MsgBox.
Comando: AllowEditRanges.
Sintaxe: [expresso].AllowEditRanges.
Utilizao: depois que a coleo AllowEditRanges retornada, podemos
usar o mtodo Add para adicionar um intervalo que pode ser editado em uma
planilha protegida.
Variveis: expresso, que retorna um dos objetos da lista utilizada.
Exemplo: Sub UseAllowEditRanges()
Dim wksOne As Worksheet
Dim strPwd1 As String
Set wksOne = Application.ActiveSheet
strPwd1 = InputBox(Enter Password)
Desprotege a planilha.
wksOne.Unprotect
Estabelece o intervalo que ser editado na plani-
lha protegida.
wksOne.Protection.AllowEditRanges.Add _
Title:=Classified, _
Range:=Range(A1:A4), _
Password:=strPwd1
ap01.indd 233 1/11/2006 16:00:40
234 universidade VBA
Notifica ao usurio o ttulo e o endereo do in-
tervalo.
With wksOne.Protection.AllowEditRanges.Item(1)
MsgBox Ttulo do intervalo: & .Title
MsgBox Endereo do intervalo: & .Range.Address
End With
End Sub
Veja tambm: MsgBox e Areas.
Comando: Border.
Sintaxe: expresso.Border.
Utilizao: representa as opes de visibilidade da borda do objeto.
Variveis: expresso, necessria para a execuo do comando. Ela retorna
um objeto CallFormat, caso esteja operando com ele, ou ainda qualquer outro
que esteja sendo utilizado.
Exemplo: Charts(Chart1).ChartArea.Border.ColorIndex = 3.
Veja tambm: FormatCondicitions.
Comando: CalculatedMembers.
Sintaxe: expresso.CalculatedMembers.
Utilizao: retorna uma coleo CalculatedMembers, que representa todos
os membros e medidas calculados para uma tabela dinmica OLAP.
Variveis: expresso, necessria para a execuo do comando. Expresso
que retorna um objeto PivotTable, que por sua vez apresenta um relatrio
de tabela dinmica em uma planilha.
Exemplo: Sub UseCalculatedMember()
Dim pvtTable As PivotTable
Set pvtTable = ActiveSheet.PivotTables(1)
Adiciona o clculo de um membro planilha.
pvtTable.CalculatedMembers.Add Name:=[Beef], _
Formula:={[Product].[All Products].Children}, _
Type:=xlCalculatedSet
End Sub
Veja tambm: AllowEditRanges.
ap01.indd 234 1/11/2006 16:00:40
Apndice 235
apndice
Comando: Caption.
Sintaxe: objeto.Caption [= Seqncia].
Utilizao: texto descritivo que aparece em um objeto para identific-lo ou
descrev-lo.
Variveis:
objeto: varivel obrigatria. Trata-se de um objeto vlido;
Seqncia: varivel opcional. Trata-se de uma expresso de seqncia que
considera o texto exibido como legenda.
Exemplo: Private Sub optEuro _ Click()
lblDevise1.Caption = BEF
lblDevise2.Caption = EUR
Calcul
End Sub
Private Sub optBEF _ Click()
lblDevise1.Caption = EUR
lblDevise2.Caption = BEF
Calcul
End Sub
Sub Calcul()
If IsNumeric(txtMontant) Then
If optEuro Then
lblResultado.Caption = Arrondi(txtMontant / 40.3399, 2)
Else
lblResultado.Caption = Arrondi(txtMontant * 40.3399, 0)
End If
Else
MsgBox O montante no numrico!
txtMontante.SetFocus
End If
End Sub
Esse exemplo mostra a criao de vrias legendas utilizando o comando Caption.
Veja tambm: MsgBox e CustomProperties.
Comando: ChartType.
Sintaxe: expresso.ChartType.
Utilizao: retorna ou define o tipo de grfico XlChartType de leitura/gra-
vao.
ap01.indd 235 1/11/2006 16:00:41
236 universidade VBA
Variveis: expresso, necessria para a execuo do cdigo. Retorna um dos
objetos aplicveis propriedade.
Exemplo: Sub Dia _ top10()
Charts.Add
ActiveChart.ChartType = xlBubble
For i = 1 To 10
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(i).XValues = Tabela1.Cells(1
+ i, 124)
ActiveChart.SeriesCollection(i).Values = Tabela1.Cells(1
+ i, 125)
ActiveChart.SeriesCollection(i).Name = Tabela1.Cells(1 +
i, 123)
ActiveChart.SeriesCollection(i).BubbleSizes = Tabela1.
Cells(1 + i, 126)
Next
End Sub
Veja tambm: Dialogs.
Comando: Chart.
Sintaxe: Objeto(Nome do Objeto).ChartObjects(1).Chart.
Utilizao: retorna um objeto Chart representando o grfico armazenado no
objeto. do tipo somente leitura.
Variveis: no h variveis.
Exemplo: Sub MostraChart()
Set MyChart = ActiveSheet.ChartObjects(1).Chart
Set xv = GetChartRange(MyChart, 2, xvalues)
Set v = GetChartRange(MyChart, 2, values)
SeriesRange = xv.Address
ValuesRange = v.Address
Range(SeriesRange, ValuesRange).Select
End Sub
Veja tambm: PivotTables.
Comando: Comments.
Sintaxe: [CDIGO] ActiveSheet.Comments.
Utilizao: retorna uma coleo Comments representando todos os comentrios
de clulas encontrados na planilha especificada. do tipo somente leitura, ou
seja, no faz alteraes nos comentrios das clulas.
ap01.indd 236 1/11/2006 16:00:41
Apndice 237
apndice
Variveis: no h variveis.
Exemplo: For Each c in ActiveSheet.Comments
If c.Author = Tadeu Carmona Then c.Delete
Next
O exemplo exclui todos os comentrios feitos na planilha ativa que tiveram
como autor o usurio Tadeu Carmona.
Veja tambm: ActiveSheet.
Comando: CubeFields.
Sintaxe: Worksheets(Nome da planilha).[objeto](1).CubeFields.
Utilizao: retorna a coleo CubeFields. Cada objeto CubeField contm as
propriedades do elemento de campo cubo. do tipo somente leitura. Os objetos
CubeFields so representados em um relatrio de tabela dinmica, baseado em
um cubo OLAP. Cada objeto CubeField representa um campo de hierarquia
ou medida do cubo.
Variveis: no h variveis.
Exemplo: Sub Macro1()
With ActiveWorkbook.PivotCaches.Add(SourceType:=xlExter nal)
.Connection = _
OLEDB;Provider=MSOLAP.2;Data Source=sha-tadeu-01;Initial
a contagem de dados comea a ser feita a partir do campo
Tadeu da tabela dinmica atual
Catalog=FoodMart 2000;Client Cache Size=25;Auto Synch Pe-
riod=10000
.CommandType = xlCmdCube
.CommandText = Array(Vendas)
.MaintainConnection = True
.CreatePivotTable TableDestination:=[Book2]Sheet1!R1C1,
TableName:= _
PivotTable1, DefaultVersion:=xlPivotTableVersion10
End With
a seguir, extramos dados da tabela dinmica atual, bus-
cando especificamente os dados de estado civil, contidos
em CubeFields da mesma tabela.
With ActiveSheet.PivotTables(PivotTable1).CubeFields ([Es-
tado Civil])
.Orientation = xlColumnField
.Position = 1
End With
ap01.indd 237 1/11/2006 16:00:41
238 universidade VBA
Ocorre o mesmo, desta vez com as informaes relacionadas
ao Produto.
With ActiveSheet.PivotTables(PivotTable1).CubeFields
([Produto])
.Orientation = xlRowField
.Position = 1
End With
Veja tambm: ActiveSheet e FormatCondictions.
Comando: CustomProperties.
Sintaxe: expresso.CustomProperties.
Utilizao: retorna um objeto CustomProperties, capaz de representar as
informaes do identificador associadas a uma planilha. CustomProper-
ties pode ser utilizado para representar informaes adicionais, incluindo
metadados XML.
Variveis: expresso, necessria para a execuo do comando. preciso utili-
zar uma expresso que retorna um dos objetos vlidos para essa propriedade.
Exemplo: Public Sub GetFileCustomDocumentProperty()
MsgBox CreateObject(DSOleFile.PropertyReader).GetDocum
entProperties(C:\Arquivos\planilha.xls).CustomProperties
(Somente Leitura).Value
End Sub
Veja tambm: Panes.
Comando: DataLabel.
Sintaxe: .HasDataLabel = <valor booleano>
.ApplyDataLabels type:=xlValue
.DataLabel.Font.ColorIndex = <valor numrico>
Utilizao: retorna um objeto DataLabel representando o rtulo de dados as-
sociado ao ponto ou linha de tendncia. do tipo somente leitura.
Variveis:
valor booleano: pode ser True (Verdadeiro) ou False (Falso);
valor numrico: utilizado para definir um valor que corresponda a uma das
cores utilizadas pela paleta do Office.
Exemplo: With Charts(2).SeriesCollection(3).Points(7)
.HasDataLabel = True
.ApplyDataLabels type:=xlValue
.DataLabel.characters.text = Este um exemplo de Data Label
End With
Veja tambm: Panes.
ap01.indd 238 1/11/2006 16:00:41
Apndice 239
apndice
Comando: Dialogs.
Sintaxe: (Objeto).Dialogs(Funo).Show.
Utilizao: retorna uma coleo Dialogs representando todas as caixas de
dilogo internas. A nica utilidade de um objeto Dialog ser usado com o
mtodo Show para exibir a caixa de dilogo correspondente. uma opo do
tipo somente leitura.
Variveis:
objeto: define o objeto (Application, Worksheet) no qual ser utilizada
a propriedade;
Funo: define a funo que ser utilizada em conjunto com a propriedade
Dialogs.
Exemplo: Application.Dialogs(xlDialogOpen).Show
Com esse comando, abrimos uma caixa de dilogo na seo atual do Excel.
Veja tambm: Panes.
Comando: Enabled.
Sintaxe: objeto.Enabled [= Booleano].
Utilizao: utilize a propriedade Enabled para ativar e desativar controles. Um
controle desativado aparece esmaecido, enquanto um controle ativado no. Alm
disso, se um controle exibir um bitmap, este ficar esmaecido sempre que o con-
trole for definido como False (Falso). Se Enabled for False para um Image,
o controle no iniciar eventos, mas tambm no aparecer esmaecido.
Variveis:
objeto: define o objeto que ser ativado pela propriedade;
booleano:
se definido como True, especifica que o controle est ativado; se for definido
como False, especifica que o objeto est desativado.
Exemplo: o exemplo seguinte, ao ser inserido em um formulrio, habilita a caixa
de verificao um e bloqueia a caixa de verificao dois:
Private Sub CheckBox1 _ Change()
TextBox2.Text = TextBox2
TextBox1.Enabled = CheckBox1.Value
End Sub
Private Sub CheckBox2 _ Change()
TextBox2.Text = TextBox2
TextBox1.Locked = CheckBox2.Value
End Sub
ap01.indd 239 1/11/2006 16:00:42
240 universidade VBA
Private Sub UserForm _ Initialize()
TextBox1.Text = TextBox1
TextBox1.Enabled = True
TextBox1.Locked = False

CheckBox1.Caption = Enabled
CheckBox1.Value = True

CheckBox2.Caption = Locked
CheckBox2.Value = False

TextBox2.Text = TextBox2
End Sub
Veja tambm: DataLabel.
Comando: Errors.
Sintaxe: expresso.Errors.
Utilizao: permite que o usurio acesse opes de verificao de erros.
Variveis: expresso, necessria para a execuo do cdigo. Expresso que
retorna um dos objetos da lista Range utilizado em conjunto com a proprie-
dade Errors.
Exemplo: Sub CheckForErrors()
Esta funo checa erros em um determinado intervalo
de clulas e retorna um erro na forma de uma caixa de
mensagem, se o nmero identificado no cdigo no for
True(Verdadeiro).
Range(A1).Formula = 12
If Range(A1).Errors.Item(xlNumberAsText).Value =
True Then
MsgBox O nmero est presente no texto.
Else
MsgBox O nmero est presente no texto.
End If
End Sub
Veja tambm: Range, MsgBox e ListColumns.
ap01.indd 240 1/11/2006 16:00:42
Apndice 241
apndice
Comando: Filters.
Sintaxe: With .AutoFilter.Filters(1)
[condicional]
Utilizao: retorna uma coleo Filters que representa todos os filtros em um
intervalo auto-filtrado. do tipo somente leitura.
Variveis: a varivel condicional exibe a condicional (If), que ativa a utilizao
de um determinado filtro.
Exemplo: o exemplo seguinte define uma varivel com o valor da propriedade do
filtro Digerati para a primeira coluna no intervalo filtrado da planilha Digerati:
With Worksheets(Digerati)
If .AutoFilterMode Then
With .AutoFilter.Filters(1)
If .On Then c1 = .Digerati
End With
End If
End With
Veja tambm: AutoFilter e Worksheets
Comando: FormatConditions.
Sintaxe: Worksheets(nmero/nome da planilha).Range(intervalo
em caixa baixa).FormatConditions(valor) _
Utilizao: retorna uma coleo FormatConditions representando todos os
formatos condicionais para o intervalo especificado. do tipo somente leitura.
Variveis:
Worksheets: indica o nmero da planilha (contando da esquerda para a
direita) no qual est o intervalo que ser utilizado. Tambm podemos utilizar
diretamente o nome da planilha, ainda que a numerao seja mais confivel;
Range: define o intervalo que ser objeto dos formatos condicionais;
FormatConditions: solicita a definio de um valor para utilizao da
propriedade.Utilize 1 se o formato for True (Verdadeiro).
Exemplo: Selection.FormatConditions.Add Type:=xlExpression,
Formula1:==FINDEN(sim C1)
Selection.FormatConditions(1).Font.ColorIndex = 3
Selection.FormatConditions.Add Type:=xlExpression,
Formula1:==FINDEN(no C1)
Selection.FormatConditions(2).Font.ColorIndex = 3
Veja tambm: Comments.
ap01.indd 241 1/11/2006 16:00:42
242 universidade VBA
Comando: HPageBreaks.
Sintaxe: [condicional] [objeto] .[ HPageBreaks].
Utilizao: retorna uma coleo HPageBreaks representando as quebras de
pgina horizontais da planilha. Pode ser utilizado apenas como somente leitura.
Alm disso, h um limite de 1.026 quebras de pgina horizontais por planilha.
Variveis:
condicional: estabelece que para cada objeto especificado de acordo com o
parmetro definido deve ser feita a quebra de pginas;
objeto: define o objeto (Worksheet, na maioria das vezes) no qual ser aplicada
a propriedade. O objeto pode ser contado numericamente, iniciando a contagem
da esquerda para a direita, ou dando-lhe um nome.
Exemplo: Sub Cria _ Quebras()
Dim i As Integer, x As Integer
Ativa uma folha de dados ou planilha e seleciona a pri-
meira clula da planilha como ativa, executando uma quebra
de pgina em seguida.
ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Se-
lect
ActiveWindow.SelectedSheets.HPageBreaks.Add Before: =Acti-
veCell

For i = 1 To ActiveSheet.UsedRange.Rows.Count + 1
If Rows(i).PageBreak <> xlNone Then
x = x + 1
If x Mod 2 <> 0 Then
ActiveWindow.SelectedSheets.PrintOut _
From:=x, To:=x, Copies:=1, Collate:=True
End If
End If
Next i
ActiveSheet.HPageBreaks(x).Delete
End Sub
Veja tambm: ActiveSheet e Points.
Comando: Hyperlinks.
Sintaxe: [condicional] [objeto (Worksheet|Range|Chart) e seu
valor].Hyperlinks
ap01.indd 242 1/11/2006 16:00:42
Apndice 243
apndice
Utilizao: retorna uma coleo Hyperlinks representando os hiperlinks do
intervalo ou da planilha.
Variveis:
expresso: define uma condicional que mostrar ao VBA a situao em
que Hyperlinks ser utilizado;
objeto: define o tipo de objeto, e seu valor (1 True), sobre o qual ser
aplicada a propriedade Hyperlinks. Podemos utilizar os objetos Worksheets
(planilhas), Range (intervalo de clulas) ou Chart (grfico).
Exemplo: Sub HyperlinkXLSFiles()
O script seguinte cria uma coleo de hyperlinks das
planilhas presentes em um determinado diretrio do disco
rgido.
Dim lCount As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
On Error Resume Next
With Application.FileSearch
.NewSearch
Definimos a localizao do diretrio das pla-
nilhas a seguir
.LookIn = C:\MyDocuments\Planilhas
.FileType = msoFileTypeExcelWorkbooks
.Filename = Book*.xls

If .Execute > 0 Then Planilhas no diret-
rio
For lCount = 1 To .FoundFiles.Count Loop
through all.
ActiveSheet.Hyperlinks.Add
Anchor:=Cells(lCount, 1), Address:= _
.FoundFiles(lCount), TextToDisplay:=
_
Replace(.FoundFiles(lCount), C:\MyDo-
cuments\Planilhas\, )
Next lCount
ap01.indd 243 1/11/2006 16:00:42
244 universidade VBA
End If
End With

On Error GoTo 0
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub
Veja tambm: Worksheets.
Comando: ListColumns.
Sintaxe: expresso.ListColumns.
Utilizao: retorna uma coleo ListColumns, que representa todas as colunas
de um objeto ListObject. utilizado como somente leitura.
Variveis: a varivel expresso define uma condicional que mostrar ao VBA
a situao em que ListColumns ser utilizado.
Exemplo: Sub DisplayColumnName
Definimos inicialmente nomes-atalho para os objetos, uti-
lizando o comando Dim.
Dim wrksht As Worksheet
Dim objListObj As ListObject
Dim objListCols As ListColumns
Agora, definimos as aes para cada objeto. Para o
terceiro objeto, ListColumns, definimos que ele deve ser
chamado pelo objeto objListObj.
Set wrksht = ActiveWorkbook.Worksheets(Sheet1)
Set objListObj = wrksht.ListObjects(1)
Set objListCols = oListObj.ListColumns

Debug.Print objListCols(2).Name
End Sub
Veja tambm: Worksheets e Sheets.
Comando: ListObjects.
Sintaxe: expresso.ListObjects.
Utilizao: retorna uma coleo de objetos ListObject, do tipo somente
leitura, na planilha.
Variveis: a varivel expresso define uma condicional que mostrar ao VBA
a situao em que ListObjects ser utilizado.
ap01.indd 244 1/11/2006 16:00:43
Apndice 245
apndice
Exemplo: mySheet.ListObjects.Add(xlSrcRange, rngRange, ,
xlNo).Name = List1.
Veja tambm: Hyperlinks.
Comando: ListRows.
Sintaxe: expresso.ListRows.
Utilizao: retorna um objeto ListRows que representa todas as linhas de
dados do objeto ListObject.
Variveis: a varivel expresso define uma condicional que mostrar ao VBA
a situao em que ListObjects ser utilizado.
Exemplo: Sub Macro2()
Do Until ActiveCell.Value =
Aqui encontramos, com o auxlio de Offset, o valor que
deve ser excludo.
If ActiveCell.Value = PAPER And ActiveCell.Offset(0, 8).Va-
lue = Then
Depois de excluirmos, nos movemos para a prxima linha.
ActiveCell.Rows(1:1).EntireRow.Select
Selection.ListObject.ListRows(1).Delete
ActiveCell.Offset(0, 1).Range(A1).Select
Ou, se no foi feita a excluso, simplesmente nos movemos
para a prxima linha.
Else
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Veja tambm: Offset e Worksheets.
Comando: Names.
Sintaxe: expresso.Names.
Utilizao: para um objeto Application, retorna uma coleo Names re-
presentando todos os nomes na pasta de trabalho ativa (incluindo todos os
nomes especficos). Para um objeto Worksheet, retorna uma coleo Names
representando todos os nomes especficos de planilhas (nomes definidos com o
ap01.indd 245 1/11/2006 16:00:43
246 universidade VBA
prefixo NomeDaPlanilha!). do tipo somente leitura, ou seja, no permite
alterao nos nomes definidos.
Variveis: a varivel expresso define uma condicional que mostrar ao VBA
a situao em que Names ser utilizado.
Exemplo: ActiveWorkbook.Names.Add Name:=teste, RefersTo-
R1C1:= _
=Sheet1!R1C1
Veja tambm: Workbook.
Comando: Nodes.
Sintaxe: expresso.Nodes.
Utilizao: retorna um objeto DiagramNodes, que guarda uma lista simples de
todos os ns no diagrama especificado, quando aplicado a um objeto Diagram.
Pode ser utilizado em conjunto com os objetos Shape ou ShapeRange, que re-
presentam desenhos de forma livre. Nesse caso, retorna uma coleo de objetos
ShapeNodes.
Variveis: a varivel expresso define uma condicional que mostrar ao VBA
a situao em que Names ser utilizado.
Exemplo: Set myDocument = Worksheets(1)
With myDocument.Shapes(3).Nodes
.Insert 4, msoSegmentCurve, msoEditingSmooth, 210, 100
End With
Veja tambm: Names.
Comando: Panes.
Sintaxe: expresso.Panes.[ao].
Utilizao: retorna uma coleo Panes representando todos os painis na janela
especificada. Os objetos do tipo Pane s existem para planilhas e folhas de
macro do Microsoft Excel 4.0, ou para planilhas salvas nesse formato.
Variveis:
expresso: define uma condicional que mostrar ao VBA a situao em
que Names ser utilizado;
ao: ao que ser realizada aps o retorno de Panes.
Exemplo: Workbooks(Digerati1.XLS).Worksheets(Sheet1).
Activate
ActiveWindow.Panes(1).Activate
Esse exemplo ativa o painel do canto superior-esquerdo da janela ativa na
planilha Digerati1.xls.
Veja tambm: Worksheets.
ap01.indd 246 1/11/2006 16:00:43
Apndice 247
apndice
Comando: Paramaters.
Sintaxe: Sheets(nome da folha de dados).QueryTables(valor
booleano do filtro).Parameters(valor do parmetro).
Utilizao: retorna uma coleo Parameters, representando os parmetros da
tabela de consulta. Cada objeto Parameter representa um nico parmetro de
consulta.
Variveis: na varivel valor booleano do filtro, utilizamos 1 para indicar
que um parmetro deve ser utilizado.
Exemplo: With Sheets(Digerati).QueryTables(1).Parameters(1)
If .DataType = xlParamTypeVarChar Then
.SetParam xlPrompt, Entre com apenas um caractere
End If
End With
Veja tambm: Phonetics.
Comando: Phonetics.
Sintaxe: Set objPhon = ActiveCell.Phonetics.
Utilizao: retorna um objeto da coleo Phonetics em uso. Todo objeto
Phonetic guarda informaes sobre uma seqncia especfica de caracteres
de texto fontico.
Variveis: no h variveis.
Exemplo: Set objPhon = ActiveCell.Phonetics
With objPhon
For Each objPhonItem in objPhon
MsgBox Phonetic object: & .Text
Next
End With
O exemplo retorna todos os objetos Phonetics na clula ativa, mostrando os
resultados em uma caixa de texto.
Veja tambm: Dialogs.
Comando: PivotFields.
Sintaxe: expresso.PivotFields.
Utilizao: retorna todos os objetos do grupo PivotFields presentes na planilha
atual. Um objeto PivotField representa um campo em um relatrio de tabela
dinmica.
Variveis: a varivel expresso retorna um dos objetos da coleo Pivot-
Fields.
Exemplo: Set objNewSheet = Worksheets.Add
objNewSheet.Activate
ap01.indd 247 1/11/2006 16:00:43
248 universidade VBA
intRow = 1
For Each objPF In _
Charts(Chart1).PivotLayout.PivotFields
objNewSheet.Cells(intRow, 1).Value = objPF.Caption
intRow = intRow + 1
Next objPF
Veja tambm: Parameters.
Comando: PivotFormulas.
Sintaxe: expresso.PivotFormulas.
Utilizao: retorna um objeto PivotFormulas, que representa a coleo de
frmulas para o relatrio de tabela dinmica especificado.
Variveis: a varivel expresso retorna um dos objetos da coleo Pivot-
Formulas.
Exemplo: For Each pf in ActiveSheet.PivotTables(1).PivotFor-
mulas
r = r + 1
Cells(r, 1).Value = pf.Formula
Next
O exemplo cria uma lista de frmulas para a tabela dinmica um, presente na
planilha atual.
Veja tambm: Filters.
Comando: PivotTable.
Sintaxe: expresso.PivotTable.
Utilizao: retorna um objeto PivotTable representando o relatrio de tabela
dinmica que contm o canto superior esquerdo do intervalo especificado, ou o
relatrio de tabela dinmica associado ao relatrio de grfico dinmico.
Variveis: a varivel expresso retorna um dos objetos da coleo PivotTable.
Exemplo: Set Pt = ActiveSheet.PivotTables(ItemList)
O exemplo define o relatrio de tabela dinmica associada planilha atual.
Veja tambm: ActiveSheet e Charts.
Comando: Points.
Sintaxe: pointsArray = .objeto(valor).Points.
Utilizao: retorna a posio do n especificado como um par de coordenadas.
Coordenadas so pares de valores que representam as coordenadas X e Y de um
ponto armazenado em uma matriz bidimensional e so capazes de armazenar
coordenadas para vrios pontos. Cada coordenada expressa em pontos.
ap01.indd 248 1/11/2006 16:00:44
Apndice 249
apndice
Exemplo: Set myDocument = Worksheets(1)
With myDocument.Shapes(3).Nodes
pointsArray = .Item(2).Points
currXvalue = pointsArray(1, 1)
currYvalue = pointsArray(1, 2)
.SetPosition 2, currXvalue + 200, currYvalue + 300
End With
O exemplo move 200 pontos direita o n dois da forma trs do documento
Digerati coordenada cujo ponto inicial definido por currYValue. Tambm
move o mesmo documento 300 pontos para baixo, coordenada inicial definida
por currXValue. A terceira forma precisa ser um desenho livre.
Veja tambm: Nodes.
Comando: PublishObjects.
Sintaxe: Set [NOME DO OBJETO] = ActiveWorkbook.PublishOb-
jects.
Utilizao: uma coleo de todos os objetos PublishObject na pasta de
trabalho. Cada objeto PublishObject representa um item em uma pasta de
trabalho salva em uma pgina da Web e pode ser atualizado de acordo com os
valores especificados pelas propriedades e mtodos do objeto.
Variveis: no h variveis.
Exemplo: Workbooks(3).PublishObjects(1).FileName = _
\\myserver\public\finacct\statemnt.htm
O exemplo define o local na Web em que salvo o primeiro item da terceira pasta
de trabalho.
Veja tambm: Workbooks.
Comando: QueryTables.
Sintaxe: Objeto [Worksheets(nmero da planilha)], Active-
Sheet].QueryTables.
Utilizao: uma coleo de objetos QueryTable. Cada objeto QueryTable
representa uma tabela da planilha construda a partir de dados retornados de
uma fonte externa.
Variveis:
Worksheet: define o nome da pasta de trabalho da qual sero filtrados os
dados;
ActiveSheet: especifica que os dados sero filtrados a partir da folha de
dados ativa;
ap01.indd 249 1/11/2006 16:00:44
250 universidade VBA
nmero da planilha: identifica a planilha que ser alvo da filtragem,
com a contagem sendo iniciada da esquerda para a direita. Nesse contexto, 1
corresponde primeira planilha localizada esquerda da aba de planilhas.
Exemplo: Sub SetRefreshTime()
With ActiveSheet.QueryTables(1)
.RefreshPeriod = 1
End With
End Sub
O exemplo atualiza os dados da planilha ativa na sesso atual do Excel.
Veja tambm: ActiveSheet e Worksheet.
Comando: Range.
Sintaxe: expresso.Range[(Cell1, Cell2)] [index].
Utilizao: em conjunto com AllowEditRange, retorna um objeto Range, que
representa um subconjunto dos intervalos que podem ser editados em uma planilha
protegida. Quando utilizado em conjunto com Application, Range ou Work-
sheet retorna uma clula ou intervalo de clulas. Ao ser utilizado em conjunto
com Shapes, retorna um objeto ShapeRange representando um subconjunto
de formas em uma coleo do tipo Shapes.
Variveis:
expresso: necessria para a execuo do comando. uma expresso que
retorna um dos objetos descritos;
Cell1: varivel necessria. Trata-se do nome do intervalo. Deve ser uma refe-
rncia no estilo A1 e no idioma da macro. Pode incluir o operador de intervalo
(:), o operador de interseo (espao) ou o operador de unio (,). Tambm pode
incluir cifres de dlar, mas estes so ignorados. Podemos usar um nome definido
de local em qualquer parte do intervalo. Se usarmos um nome, este ser assumido
como linguagem da macro;
Cell2: varivel opcional. Trata-se da clula no canto superior esquerdo e
inferior direito do intervalo. Pode ser um objeto Range que contm uma nica
clula, uma coluna inteira, uma linha inteira ou uma seqncia de caracteres que
nomeia uma nica clula no idioma da macro;
Index: varivel necessria. So as formas individuais includas no intervalo.
Pode ser um nmero inteiro, especificando o ndice da forma, uma seqncia de
caracteres, especificando o nome da forma, uma matriz com nmeros inteiros ou
seqncias de caracteres.
Exemplo: o exemplo seguinte cria um boto que ser utilizado para duplicar os
dados selecionados em uma tabela:
Private Sub CommandButton4 _ Click()
ap01.indd 250 1/11/2006 16:00:44
Apndice 251
apndice
Set r = Worksheets(Sheet1).Range(A16:A29) search this
range
For n = 1 To r.Rows.Count
if today = date in the range then
If Worksheets(sheet1).Range(b4).Value = r.Cells(n,
1) Then

r.Cells(n + IIf([c4] = Days, 0, 1), 3).Value =
Worksheets(sheet1).Range(b7)
r.Cells(n + IIf([c4] = Days, 0, 1), 4).Value =
Worksheets(sheet1).Range(b8)
r.Cells(n + IIf([c4] = Days, 0, 1), 5).Value =
Worksheets(sheet1).Range(b9)
r.Cells(n + IIf([c4] = Days, 0, 1), 6).Value =
Worksheets(sheet1).Range(b10)
r.Cells(n + IIf([c4] = Days, 0, 1), 7).Value =
Worksheets(sheet1).Range(b11)
Exit For

MsgBox Duplica dados em & r.Cells(n,
1).Address

End If
Next n
End Sub
Veja tambm: MsgBox, Worksheets.
Comando: Shapes.
Sintaxe: objeto [Worksheets(nmero da planilha) Active Cell].
Shapes.[novo objeto de desenho].
Utilizao: uma coleo de todos os objetos Shape na planilha especificada.
Cada objeto Shape representa um objeto na camada de desenho, como uma
AutoForma, uma forma livre, um objeto OLE ou uma figura.
Variveis:
objeto: possvel utilizar a propriedade Shapes em uma planilha de dados
(Worksheet) ou na clula ativa da planilha atual (ActiveCell);
nmero da planilha:
ap01.indd 251 1/11/2006 16:00:44
252 universidade VBA
identifica a planilha que ser o alvo da filtragem, com contagem iniciada da
esquerda para a direita. Nesse contexto, 1 corresponde primeira planilha
localizada esquerda da aba de planilhas;
novo objeto de desenho: indica o objeto de desenho que ser inserido
na planilha.
Exemplo: Set myDocument = Worksheets(1)
myDocument.Shapes.SelectAll
Veja tambm: Range e Worksheets.
Comando: SmartTagActions.
Sintaxe: expresso.SmartTagActions.
Utilizao: evoca uma coleo de objetos SmartTagAction, que representa as
aes que podem ser executadas com marcas inteligentes.
Variveis: a varivel expresso define uma expresso que retorna um objeto
SmartTag.
Exemplo: Sub UseSmartTagActions()
Dim strLink As String
strLink = urn:schemas-microsoft-com:office:
smarttags#stockticker
Habilita marcas inteligentes que possam ser reconhe-
cidas na planilha
ActiveWorkbook.SmartTagOptions.EmbedSmartTags = True
Application.SmartTagRecognizers.Recognize = True
Range(A1).Value = Digerati
MsgBox Range(A1).SmartTags.Add(strLink).SmartTagActions.
Item(1).Name
End Sub
Veja tambm: ActiveWorkbook.
Comando: SmartTagRecognizers.
Sintaxe: expresso.SmartTagRecognizers.
Utilizao: retorna uma coleo de objetos SmartTagRecognizer. Esses
objetos representam mecanismos de reconhecimento que identificam os dados
com tipos de informao medida que voc trabalha no Microsoft Excel.
Variveis: a varivel expresso define uma expresso que retorna um objeto
SmartTagRecognizers.
ap01.indd 252 1/11/2006 16:00:45
Apndice 253
apndice
Exemplo: Sub Teste de reconhecimento()
Dim i%
With Application.SmartTagRecognizers
If .Count > 0 Then
For i = 1 To .Count
MsgBox i & & .Item(i).progID & _
& .Item(i).Enabled
Next
End If
End With
End Sub
Veja tambm: MsgBox.
Comando: SmartTags.
Sintaxe: expresso.SmartTags.
Utilizao: retorna um conjunto de objetos SmartTags, que representa os
identificadores atribudos s clulas presentes em uma planilha.
Variveis: a varivel expresso define uma expresso que retorna um objeto
SmartTags.
Exemplo: Sub ReturnSmartTag()
Dim strLink As String
Dim strType As String
Define variveis SmartTag
strLink = urn:schemas-microsoft-com:smarttags#Stoc
kTickerSymbol
strType = stockview
Define a marca inteligente que ser utilizada na
planilha ativa
ActiveWorkbook.SmartTagOptions.EmbedSmartTags =
True
Application.SmartTagRecognizers.Recognize = True
Range(A1).Formula = Digerati
MsgBox Range(A1).SmartTags.Parent
End Sub
ap01.indd 253 1/11/2006 16:00:45
254 universidade VBA
Esse exemplo insere uma marca inteligente na clula A1 e depois,informa ao
usurio o pai do identificador da clula A1, que teste. O exemplo supe
que o sistema host esteja conectado Internet.
Veja tambm: MsgBox e Range de clulas.
Comando: Styles.
Sintaxe: objeto [ActiveWorkbook,ActiveDocument, Workbook
(nome da planilha ou nmero) (.Styles(nome do usurio do
qual ser utilizado o estilo).ao.
Utilizao: uma coleo de todos os objetos Style na pasta de trabalho ativa
ou especificada. Todo objeto Style representa uma descrio de estilo para
um intervalo, mas aqui tratado todo o conjunto de estilos da ferramenta. O
objeto Style contm todos os atributos de estilo (fonte, formato de nmero,
alinhamento etc.) como propriedades.
Variveis:
objeto: possvel utilizar essa propriedade em uma planilha de dados ativa
(ActiveWorkbook) ou em uma planilha nomeada na mesma linha de comando.
Podemos tambm definir o objeto simplesmente como Workbook;
ao: define a ao que ser tomada pelo script frente ao objeto determinado
e ao estilo proposto para a aplicao.
Exemplo: (ActiveDocument)
sParStyle = ActiveDocument.Paragraphs(J).Style
Esse exemplo seta um estilo para definio dos pargrafos do documento
atual.
Veja tambm: Range de coluna e DataLabel.
Comando: Windows.
Sintaxe: objeto [Application, Worksheet, Workbook, ActiveWork-
sheet, Document).Windows(nmero da janela).ao.
Utilizao: faz com que um processo interrompido seja reativado e passe para o
foreground.
Variveis: para um objeto Application, retorna uma coleo Windows repre-
sentando todas as janelas em todas as pastas de trabalho. Para um objeto Work-
book, retorna uma coleo Windows representando todas as janelas na pasta
de trabalho especificada. um objeto do tipo somente leitura, ou seja, no so
possveis modificaes em sua estrutura.
Exemplo: Application.Windows(1).Close.
Veja tambm: Workbooks.
ap01.indd 254 1/11/2006 16:00:45
Apndice 255
apndice
Comando: Workbooks.
Sintaxe: Workbooks(nome da planilha).ao ou Workbooks.
ao:=nome do arquivo.
Utilizao: retorna uma coleo de todos os objetos Workbook que esto
abertos no aplicativo Microsoft Excel. Um objeto Workbook representa uma
pasta de trabalho do Microsoft Excel.
Variveis:
nome da planilha: pode-se utilizar o nome genrico da planilha para
definir a ao que ser executada;
ao: define a ao que ser lanada na planilha;
nome do arquivo: define o arquivo que ser alvo da ao de uma pla-
nilha. Diferente do que ocorre com nome da planilha, preciso utilizar
o nome real do arquivo, como aparece no gerenciador de arquivos.
Exemplos:
1. O exemplo seguinte testa a possibilidade de se abrir um Workbook:
Sub IsWorkBookOpen()
Dim wBook As Workbook
On Error Resume Next
Set wBook = Workbooks(Personal.xls)
If wBook Is Nothing Then Not open
MsgBox Planilha no pode ser aberta, _
vbCritical,OzGrid.com
Set wBook = Nothing
On Error GoTo 0
Else It is open
MsgBox A planilha pode ser aberta, _
vbInformation,OzGrid.com
Set wBook = Nothing
On Error GoTo 0
End If
End Sub
2. O exemplo seguinte executa testes para ver se a planilha existe:
Sub IsWorkBookOpen()
ap01.indd 255 1/11/2006 16:00:45
256 universidade VBA
Dim wBook As Workbook
On Error Resume Next
Set wBook = Workbooks(Personal.xls)
If wBook Is Nothing Then Not open
MsgBox Planilha no pode ser aberta, _
vbCritical,Digerati.com
Set wBook = Nothing
On Error GoTo 0
Else It is open
MsgBox Sim, a planilha pode ser aberta, _
vbInformation,Digerati.com
Set wBook = Nothing
On Error GoTo 0
End If
End Sub
3. Esse exemplo abre todas as planilhas em uma pasta (no caso, a pasta Minhas
Planilhas):
Sub OpenAllWorkbooksInFolder()

Dim i As Integer
With Application.FileSearch
.LookIn = C:\Minhas Planilhas
* represents wildcard characters
.FileType = msoFileTypeExcelWorkbooks
If .Execute > 0 Then Workbook exists
For i = 1 To .FoundFiles.Count
Workbooks.Open (.FoundFiles(i))
Next i
Else There is Not a Workbook
MsgBox A planilha no existe
End If
End With
End Sub
Veja tambm: Worksheets.
ap01.indd 256 1/11/2006 16:00:45
Apndice 257
apndice
Comando: Worksheets.
Sintaxe: Worksheets(Nome da folha de dados).[Range(clula
ou clulas do intervalo)].Value.
Utilizao: para um objeto Application, retorna uma coleo Sheets repre-
sentando todas as planilhas na pasta de trabalho ativa. Para um objeto Work-
book, retorna uma coleo Sheets representando todas as planilhas na pasta
de trabalho especificada.
Variveis:
Nome da folha de dados: define o nome da folha de dados (Worksheet)
na qual ser aplicada a ao;
clula ou clulas do intervalo: define o intervalo de clulas da
folha de dados ativa que ser o alvo da ao. Em alguns casos, aplica-se Work-
sheet de forma direta, sem a definio de um intervalo.
Exemplo:
1. Esse exemplo testa a existncia da folha de dados:
Sub DoesSheetExist()
Dim wSheet As Worksheet
On Error Resume Next
Set wSheet = Sheets(Sheet1)
If wSheet Is Nothing Then Doesnt exist
MsgBox Folha de dados no existe, _
vbCritical,Digerati.com
Set wSheet = Nothing
On Error GoTo 0
Else Does exist
MsgBox Sheet 1existe, _
vbInformation,Digerati.com
Set wSheet = Nothing
On Error GoTo 0
End If
End Sub
2. Esse exemplo cria uma macro que classifica todas as folhas de dados (Work-
sheets) presentes em uma planilha (Workbook) do Excel:
Sub SortSheets()
Dim SheetCount As Integer
ap01.indd 257 1/11/2006 16:00:45
258 universidade VBA
Dim i As Integer
Dim j As Integer
SheetCount = Worksheets.Count
If SheetCount = 1 Then
Exit Sub
For i = 1 To SheetCount - 1
For j = i + 1 To SheetCount
If Worksheets(j).Name < Worksheets(i).Name Then
Worksheets(j).Move Before:=Worksheets(i)
End If
Next j
Next i
End If
End Sub
Veja tambm: Workbooks, Range e Range de intervalo de linhas.
Objetos
Comando: AddIn.
Sintaxe: AddIns(index).ao = valor booleano.
Utilizao: o objeto AddIn um membro da coleo AddIns. A coleo
AddIns contm uma lista de todos os suplementos disponveis do Microsoft
Excel, independente de estarem instalados. Essa lista corresponde lista de
suplementos exibidos na caixa de dilogo Suplementos (menu Ferramentas).
Variveis:
index: nmero de ndice ou ttulo do suplemento para retornar o objeto
escolhido;
ao: define a operao que ser realizada com o suplemento;
valor booleano: indica se o suplemento est ou no ativo. True ativa o
suplemento.
Exemplo: Sub AddIns.Add
Filename:=C:\Hyperion\Essbase\Bin\essexcln.xll
AddIns(Hyperion Essbase OLAP Server
ap01.indd 258 1/11/2006 16:00:46
Apndice 259
apndice
DLL).Installed = True
Veja tambm: Addins (Propriedades).
Comando: Adjustments.
Sintaxe: rac.Adjustments
[valores utilizados no ajuste]
Utilizao: armazena uma coleo de valores de ajuste para um objeto Word-Art,
AutoShape ou algum conector inserido em uma planilha do Excel. Cada valor
representa uma maneira pela qual uma ala de ajuste pode ser posicionada. Algu-
mas alas de ajuste podem ser ajustadas tanto horizontal quanto verticalmente e,
por isso, algumas formas podem ter mais valores de ajuste do que alas de ajuste.
Uma forma pode ter at oito ajustes.
Variveis:
Linear (horizontal ou vertical): geralmente, o valor 0,0 representa a extremi-
dade esquerda ou superior da forma, e o valor 1,0 representa a extremidade direita
ou inferior da forma. Os valores vlidos correspondem aos ajustes vlidos que voc
pode fazer manualmente. Por exemplo, se voc s pode puxar uma ala de ajuste
at metade do caminho da forma, o valor mximo do ajuste correspondente ser
0,5. Para tais formas, como conectores e textos explicativos em que os valores 0,0
e 1,0 representam os limites do retngulo definido pelo pontos iniciais e finais
do conector ou linha de texto explicativo, nmeros negativos e nmeros maiores
que 1,0 so valores vlidos;
Radial: um valor de ajuste de 1,0 corresponde largura da forma. O valor
mximo 0,5, ou a meio caminho da forma;
ngulo: os valores so expressos em graus. Quando voc especifica um valor
fora do intervalo entre 180 at 180, ele normalizado para se situar dentro desse
intervalo.
Exemplo: Set myDocument = Worksheets(1)
Set rac = myDocument.Shapes.AddShape(msoShapeRightArrow
Callout, _
10, 10, 250, 190)
With rac.Adjustments
.Item(1) = 0.5 adjusts width of text box
.Item(2) = 0.15 adjusts width of arrow head
.Item(3) = 0.8 adjusts length of arrow head
.Item(4) = 0.4 adjusts width of arrow neck
End With
Veja tambm: ChartColorFormat e PublishObjects.
ap01.indd 259 1/11/2006 16:00:46
260 universidade VBA
Comando: Application.
Sintaxe: Application.propriedade(objeto).ao.
Utilizao: representa todo o aplicativo Microsoft Excel. O objeto Applica-
tion contm definies e opes para o aplicativo como um todo (muitas das
opes da caixa de dilogo Opes, do menu Ferramentas). Alm disso, todos
os mtodos que retornem objetos de nvel mais alto, como ActiveCell, Ac-
tiveSheet e ActiveWorkbook, dentre outros, dependem desse objeto.
Variveis:
propriedade: define a propriedade que ser manipulada juntamente com
o objeto evocado;
objeto: define o objeto que ser manipulado pelo Excel;
ao: define a ao que ser aplicada sobre o objeto.
Exemplo:
1. O exemplo seguinte cria uma caixa de dilogo utilizando o objeto Appli-
cation:
Sub ChangeFont()
Application.ScreenUpdating = False
Application.Dialogs(xlDialogFormatFont).Show
End Sub
2. Esse exemplo cola o valor de uma frmula em uma clula, e no a frmula
como um todo:
Sub ColarValores()
Application.ScreenUpdating = False
Range(A4).Copy
Range(D4).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End Sub
3. Esse exemplo move duas linhas para baixo e duas colunas para a direita:
Sub MoveToCell()
ap01.indd 260 1/11/2006 16:00:46
Apndice 261
apndice
Application.ScreenUpdating = False
ActiveCell.Offset(3, 2).Select
End Sub
4. O exemplo seguinte seleciona a ltima linha e a ltima coluna da lista Sub
SelecioneFim():
Application.ScreenUpdating = False
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
End Sub
5. Esse exemplo adiciona o nome do arquivo e seu caminho (pathname) no
rodap do documento impresso:
Sub
FilenameInFooter()
Application.ScreenUpdating = False
ActiveSheet.PageSetup.CenterFooter = _
ActiveWorkbook.FullName
End Sub
Veja tambm: Workbook (propriedade) e Worksheet (propriedade).
Comando: AutoCorrect.
Sintaxe: propriedade.AutoCorrect
.mtodo = valor booleano
Utilizao: contm atributos de AutoCorreo do Microsoft Excel, como
colocao de nomes dos dias em maisculas, correo de duas maisculas ini-
ciais, lista de correo automtica entre outras opes encontradas no menu
Ferramentas do Excel.
ap01.indd 261 1/11/2006 16:00:46
262 universidade VBA
Variveis:
propriedade: define a propriedade que ser manipulada junto com o
objeto evocado;
mtodo: define a ao que ser aplicada pela propriedade;
booleano: se o mtodo for True, temos que a AutoCorreo ser aplicada
na planilha atual ou no arquivo escolhido.
Exemplo: With Application.AutoCorrect
.TwoInitialCapitals = True
.ReplaceText = True
End With
Esse exemplo faz o Excel corrigir todas as palavras que esto com duas iniciais
maisculas na planilha atual.
Veja tambm: Styles.
Comando: AutoFilter.
Sintaxe: worksheet.AutoFilter = booleano.
Utilizao: traz para o script VBA o esquema de filtros utilizado na planilha
atual.
Variveis:
booleano: se a varivel for True (verdadeiro), o filtro deve ser aplicado.
Exemplos:
1. O exemplo seguinte inicia um filtro:
Sub TurnAutoFilterOn()
check for filter, turn on if none exists
If Not ActiveSheet.AutoFilterMode Then
ActiveSheet.Range(A1).AutoFilter
End If
End Sub
2. O exemplo seguinte interrompe uma filtragem:
Sub TurnFilterOff()
removes AutoFilter if one exists
Worksheets(Data).AutoFilterMode = False
End Sub
3. Esse exemplo esconde as setas de filtragem da planilha:
Sub HideArrows()
ap01.indd 262 1/11/2006 16:00:47
Apndice 263
apndice
hides all arrows except column 2
Dim c As Range
Dim i As Integer
i = Cells(1, 1).End(xlToRight).Column
Application.ScreenUpdating = False
For Each c In Range(Cells(1, 1), Cells(1, i))
If c.Column <> 2 Then
c.AutoFilter Field:=c.Column, _
Visibledropdown:=False
End If
Next
Application.ScreenUpdating = True
End Sub
Veja tambm: Range e Workbooks.
Comando: AutoRecover.
Sintaxe: propriedade.AutoRecover.objeto (planilha a ser recu-
perada).
Utilizao: representa os recursos automticos de recuperao de uma pasta de
trabalho. As propriedades para o objeto AutoRecover determinam o caminho
e o intervalo de tempo para o backup de todos os arquivos.
Variveis: a varivel propriedade define o aspecto em que AutoRecover ser
utilizado. Application faz com que um objeto AutoRecover ( uma configu-
rao de auto-recuperao, portanto) seja recuperado.
Creator a propriedade utilizada para criar um AutoRecover. Enabled habili-
ta a configurao de auto-recuperao criada com o auxlio da propriedade Create.
Path define o caminho no qual o arquivo de auto-recuperao deve ser salvo.
Time a propriedade utilizada para definir o backup peridico de todos os
arquivos.
Exemplo: Sub SetPath()
Application.AutoRecover.Path = C:\
End Sub
Veja tambm: Application e Workbooks.
ap01.indd 263 1/11/2006 16:00:47
264 universidade VBA
Comando: Border.
Sintaxe: para o estilo de linha, digite: mtodo.Border.LineStyle = es-
tilo de linha utilizado
Para definir a cor de uma borda, utilize: Borders(index).Color =
RGB(valores de cor)
Utilizao: representa a borda de um objeto.
Variveis:
mtodo: define a maneira como a borda ser aplicada;
estilo de linha utilizado: define o estilo de linha que ser utilizado;
index: identifica a borda, para retornar um nico objeto.
Exemplo: Sub NovoObjeto()
Dim N As Byte, L As Byte
Dim Graph As ChartObject
N = 1
With ActiveWorkbook.Worksheets(1)
.Range(A1) = Valeurs X
.Range(B1) = Valeurs Y=X+10
.Range(C1) = Valeurs Y=2X
For L = 2 To 10
.Range(A & L) = X= & N
.Range(B & L) = N + 10
.Range(C & L) = N * 2
N = N + 1
Next L
.Range(A:C).Columns.AutoFit
Set Graph = .ChartObjects.Add(0, 140, 400, 250)
End With
With Graph.Chart
.SetSourceData Worksheets(1).Range(A1:B10)
.ChartArea.Border.LineStyle = xlDashDotDot
.ChartArea.Border.Weight = xlMedium
.HasTitle = True
.ChartTitle.Text = Grfico de teste
.ChartTitle.Characters(0, 9).Font.Bold = True
Definimos as linhas que sero utilizadas
.ChartType = xlLine
With .Legend
ap01.indd 264 1/11/2006 16:00:47
Apndice 265
apndice
.Font.Bold = True
.Font.Italic = True
.Position = xlLegendPositionCorner
.Top = 10
.Height = 20
End With
With .PlotArea
.Interior.ColorIndex = 2
.Left = 0
.Top = 30
.Width = Graph.Chart.ChartArea.Width
.Height = Graph.Chart.ChartArea.Height - 40
End With
End With
End Sub
Sub AjoutSerie()
Dim Graph As Chart
With ActiveWorkbook.Worksheets(1)
Set Graph = .ChartObjects(1).Chart
Graph.SeriesCollection.Add .Range(C1:C10)
End With
End Sub
Veja tambm: ChartObject.
Comando: CalculatedMember.
Sintaxe: propriedade.CalculatedMember.
Utilizao: representa os campos e itens calculados para tabelas dinmicas com
fontes de dados OLAP (Online Analytical Processing).
Variveis: a varivel propriedade define a propriedade que ser manipulada
juntamente com o objeto evocado. Podem ser utilizadas as propriedades Apli-
cation, Creator, Formula, IsValid, Name, Parent, SolveOrder, Sour-
ceName e Type.
Exemplo: Sub CheckValidity()
Dim pvtTable As PivotTable
Dim pvtCache As PivotCache
ap01.indd 265 1/11/2006 16:00:47
266 universidade VBA
Set pvtTable = ActiveSheet.PivotTables(1)
Set pvtCache = Application.ActiveWorkbook.PivotCaches.
Item(1)
On Error GoTo Not _ OLEDB
pvtCache.MakeConnection
End If
If pvtTable.CalculatedMembers.Item(1).IsValid = True
Then
MsgBox O objeto calculado vlido.
Else
MsgBox O objeto calculado no vlido.
End If
End Sub
Nota: com um objeto CalculatedMember, possvel verificar a validade de
um campo ou item calculado em uma tabela dinmica. Para isso, basta utiliz-
lo associado propriedade IsValid.
Veja tambm: Chart (objeto), Chart (Propriedade).
Comando: CalloutFormat.
Sintaxe: objeto.propriedade [ou mtodo].Callout.
Utilizao: contm propriedades e mtodos que se aplicam a textos explicativos
de linhas.
Variveis:
objeto: define o objeto no qual sero aplicadas as caractersticas configu-
radas;
propriedade ou mtodo: define a propriedade ou mtodo que sero
utilizados no objeto.
Exemplo: o exemplo seguinte precisa ser aplicado a um texto explicativo dentro
de uma planilha. As alteraes so explicadas em comentrios internos:
Define a configurao na caixa em um ngulo de 60.
.Angle = msoCalloutAngle60
Define que a caixa explicativa ter borda.
.Border = True
ap01.indd 266 1/11/2006 16:00:47
Apndice 267
apndice
.PresetDrop msoCalloutDropTop
.Type = msoCalloutThree
End With
Veja tambm: ChartArea e Shapes (Propriedades).
Comando: Characters.
Sintaxe: Worksheets(Nome da planilha).Range(Intervalo do
texto utilizado)
[.Value = Texto a ser alterado]
.Characters(incio,comprimento).Font.estilo da fonte
alterada = booleano
Utilizao: representa caracteres em um objeto com textos. Pode ser utilizado
tanto para inserir como para alterar configuraes de texto.
Variveis:
Nome da planilha: aqui, define-se o nome da planilha na qual sero ma-
nipulados os caracteres. Deve ser representada entre aspas. No preciso utilizar
o nome do arquivo um arquivo ou pasta de trabalho do Excel pode conter vrias
planilhas, o que retornaria um resultado nulo para o comando;
Intervalo do texto utilizado:
define em qual intervalo de clulas da planilha escolhida ser aplicada a alterao
ou insero de caracteres;
Value = Texto a ser alterado: ao optar por esse mtodo, inserimos
um texto no intervalo selecionado em uma determinada planilha;
(incio,comprimento): definem, respectivamente, a posio numrica do
caractere inicial (com o texto lido da esquerda para a direita) e o nmero de caracteres
a partir do qual o novo texto ser inserido ou uma nova formatao ser realizada.
Exemplo: With Worksheets(Plan1).Range(A1;B1;C1;D2)
.Value = Isto apenas um texto
a seguir formatamos toda a linha como negrito
.Characters(1, 15).Font.Bold = True
no satisfeitos, definimos toda a linha como itlico
tambm
.Characters(1, 15).Font.Italic = True
End With
O exemplo adiciona um texto formatado ao intervalo de clulas da planilha indica-
da. Utilizando ponto-e-vrgula podemos inserir o mesmo texto em vrias clulas.
Veja tambm: Range(A1), Range com seleo de vrias reas e Work-
sheets.
ap01.indd 267 1/11/2006 16:00:48
Comando: Chart.
Sintaxe: Worksheets(nome da planilha).ChartObjects(ndice).
Chart. _
Em conjunto com o ndice: Charts(nmero do ndice ou nome da
folha de dados).
Para ativar um grfico, com a propriedade ActiveChart:
Charts(1).Activate
With ActiveChart
.Type = xlLine
.HasTitle = valor booleano
.ChartTitle.Text = ttulo do grfico
End With
Utilizao: representa um grfico em uma pasta de trabalho. O grfico pode
ser um grfico incorporado (contido em um ChartObject) ou uma folha de
grfico separada.
Variveis:
nome da planilha: assim como em outros casos, deve ser declarado
o nome inscrito na aba de seleo da folhas de dados, que passa a ser o nome
pelo qual o Microsoft Office reconhece o objeto folha de dados;
ndice: valor que corresponde ao objeto no qual ser aplicada uma ao. Se
uma planilha, por exemplo, possui um nico objeto de grfico em seu interior
e quisermos utilizar esse grfico, declaramos a planilha no incio da linha e,
em seguida, o ndice do grfico como um.
Exemplo:
1. O exemplo seguinte insere um grfico em uma planilha:
Sub RecordedAddChartObject()
Charts.Add
ActiveChart.ChartType = xlXYScatterLines
ActiveChart.SetSourceData Source:=Sheets(Sheet1).
Range(A3:G14)
ActiveChart.Location Where:=xlLocationAsObject,
Name:=Sheet1
End Sub
2. Nesse exemplo, um grfico de srie adicionado planilha:
Sub RecordedAddSeries()
ap01.indd 268 1/11/2006 16:00:48
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(6).XValues = =Sheet1!R4C1:
R14C1
ActiveChart.SeriesCollection(6).Values = =Sheet1!R4C7:
R14C7
ActiveChart.SeriesCollection(6).Name = =Sheet1!R3C7
End Sub
Veja tambm: ChartArea e Shapes (Propriedades).
ap01.indd 269 1/11/2006 16:00:48
ap01.indd 270 1/11/2006 16:00:48
ap01.indd 271 1/11/2006 16:00:48
ap01.indd 272 1/11/2006 16:00:48
PARCERIA JLIO BATTISTI - DIGERATI
Este e-book uma parceria entre o meu site
www.juliobattisti.com.br e a Editora Digerati,
com a qual eu mantenho contrato para
revenda deste e-book, em formato PDF,
atravs do meu site.
Nota sobre direitos autorais:

IMPORTANTE: Nas propriedades do E-book esto gravados o nome completo, e-mail e
demais dados do comprador. Se for repassada cpia para outros usurios e este E-book for
parar em um site ou Blog, para download gratuito, quem ser responsabilizado
Criminalmente, conforme previsto nas Leis 9118 e 9610, ser o comprador do E-book, que
foi quem repassou cpias para outros usurios, O QUE PROIBIDO. Seja honesto. Este E-
book de uso pessoal, individual, no compartilhado. NO REPASSE CPIAS!!!

Ao adquirir este E-book voc tem o direito de l-lo na tela do seu computador e de imprimir
uma cpia para o seu uso pessoal. vetada a distribuio deste arquivo, mediante cpia ou
qualquer outro meio de reproduo, para outras pessoas.

Se voc recebeu este E-book atravs do e-mail ou via ftp de algum site da Internet, ou
atravs de um CD de Revista ou via e-mail recebido de um amigo, saiba que voc
est com uma cpia pirata, no autorizada. A utilizao de uma cpia pirata, no
autorizada, crime de Violao de Direitos Autorais conforme Leis 9118 e 9610, sujeita
a pena de 2 a 5 anos de Cadeia. Denuncie o site ou revista que est disponibilizando a
cpia, atravs do e-mail webmaster@juliobattisti.com.br

Se voc tiver sugestes sobre novos cursos que gostaria de ver disponibilizados, entre em
contato pelo e-mail: webmaster@juliobattisti.com.br. Visite periodicamente o site
www.juliobattisti.com.br para ficar por dentro das novidades:

Mais de 900 cursos e vdeos-aula em diversos assuntos.
Artigos e dicas sobre Certificaes da Microsoft.
Artigos sobre Carreira e Trabalho.
Centenas de Livros sobre os mais Variados Assuntos.
Dicas de livros e sites sobre diversos assuntos.
Simulados gratuitos, em portugus, para os exames da Microsoft.

PARCERIA JLIO BATTISTI - DIGERATI