Você está na página 1de 64

Programao em VBA

Texto Introdutrio
Antnio Silva
DEI-Isep
2009-10-28
1
.
Contedo
1 Introduo 8
2 Conceitos Bsicos 8
2.1 O que um Macro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Tcnicas de construo dum Macro . . . . . . . . . . . . . . . . . . . . . 9
2.3 Gravao de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 A escrita de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 O editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6 Criao de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 Variveis e Tipos de Dados 14
3.1 Conceito de varivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2 Criao das variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 A operao de Atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.5 O uso de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4 Como trabalhar com Objectos 19
4.1 Propriedades, Mtodos e Eventos . . . . . . . . . . . . . . . . . . . . . . 20
4.1.1 Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.2 Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.3 Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2 Os objectos do Excel mais comuns . . . . . . . . . . . . . . . . . . . . . . 23
4.2.1 Como trabalhar com as propriedades dos objectos Excel . . . . . 23
4.2.2 Como aplicar mtodos aos objectos . . . . . . . . . . . . . . . . . 24
4.3 Objectos grcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3.1 MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3.2 InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.3 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.4 Botes de Comando . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.5 Rtulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.6 Caixas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.7 Botes de Opo . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3.8 Caixas de Vericao . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3.9 Quadros (Frames) . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3.10 Caixas de Listagem . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5 Estruturas de controlo do programa 34
5.1 Estruturas de controlo condicional . . . . . . . . . . . . . . . . . . . . . . 34
5.1.1 If...Then...Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.1.2 If...Then . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.1.3 Estruturas condicionais embutidas . . . . . . . . . . . . . . . . . . 37
5.2 Estruturas de controlo repetitivo . . . . . . . . . . . . . . . . . . . . . . 38
5.2.1 Estruturas de Controlo Do...Loop . . . . . . . . . . . . . . . . . . 38
5.2.2 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . 40
3
5.2.3 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . 41
5.2.4 Estrutura de Controlo For..To..Next . . . . . . . . . . . . . . . . . 43
5.2.5 Estruturas de controlo repetitivo imbricadas . . . . . . . . . . . . 44
5.3 Variveis indexadas - vectores e matrizes . . . . . . . . . . . . . . . . . . 46
5.3.1 Declarao de vectores . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.2 Processamento de vectores . . . . . . . . . . . . . . . . . . . . . . 48
6 Funes e Procedimentos 50
6.1 Exemplo de funo criada pelo programador . . . . . . . . . . . . . . . . 51
6.2 Como aceder s funes standard do Excel . . . . . . . . . . . . . . . . . 52
7 Programao do Excel usando VBA 52
7.1 Trabalhar com objectos Workbook . . . . . . . . . . . . . . . . . . . . . . 53
7.2 Trabalhar com objectos Worksheet . . . . . . . . . . . . . . . . . . . . . 53
7.2.1 Propriedades de Worksheet . . . . . . . . . . . . . . . . . . . . . . 53
7.2.2 Mtodos de Worksheet . . . . . . . . . . . . . . . . . . . . . . . . 54
7.3 Trabalhar com objectos Range . . . . . . . . . . . . . . . . . . . . . . . . 54
8 Adicionando uma interface grca 56
8.1 Instalao da Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8.2 Instalao dos Controlos . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
8.3 Incorporao da Form na sub-rotina . . . . . . . . . . . . . . . . . . . . . 58
8.3.1 Como visualizar e terminar uma Form . . . . . . . . . . . . . . . 59
8.3.2 Tratamento de eventos atravs de Event Handlers . . . . . . . . . 59
8.3.3 Como recolher os resultados de uma Form . . . . . . . . . . . . . 60
8.3.4 Exemplo de aplicao . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.4 Exemplo de aplicao mais elaborado . . . . . . . . . . . . . . . . . . . . 62
9 Notas nais 63
4
Lista de Figuras
1 Janela de invocao do ambiente de Gravao de Macros . . . . . . . . . 9
2 Janela de Gesto de Macros . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5 Criao de novo Mdulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6 Diferentes tipos de dados e o seu armazenamento em memria . . . . . . 15
7 Como forar a declarao explcita automaticamente . . . . . . . . . . . 16
8 Uma Form e vrios Controlos . . . . . . . . . . . . . . . . . . . . . . . . 19
9 Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
10 Lista de eventos disponveis . . . . . . . . . . . . . . . . . . . . . . . . . 22
11 Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
12 Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
13 Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
14 Vrios optionButton agrupados numa frame . . . . . . . . . . . . . . . . 30
15 Vrios checkBox agrupadas numa frame . . . . . . . . . . . . . . . . . . 31
16 Uma Frame agrupando trs botes de comando . . . . . . . . . . . . . . 31
17 Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
18 Estrutura de controlo condicional If...Then...Else . . . . . . . . . . . . . 34
19 Estrutura de controlo condicional If...Then . . . . . . . . . . . . . . . . 35
20 Estruturas de controlo condicional imbricadas . . . . . . . . . . . . . . . 37
21 Estrutura de controlo repetitivo Do...While . . . . . . . . . . . . . . . . 39
22 Estrutura de controlo repetitivo Do...Until . . . . . . . . . . . . . . . . 40
23 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . . . . . 41
24 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . . . . . 42
25 Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . . . . 45
26 Um vector uma varivel mltipla . . . . . . . . . . . . . . . . . . . . . 46
27 Um exemplo de vector de strings . . . . . . . . . . . . . . . . . . . . . . 47
28 Porqu usar ciclos para processar vectores? . . . . . . . . . . . . . . . . . 48
29 Funes como caixas pretas . . . . . . . . . . . . . . . . . . . . . . . . . 51
30 Utilizao da funo margemLucro numa frmula . . . . . . . . . . . . . 52
31 Criao de uma Form no VBA . . . . . . . . . . . . . . . . . . . . . . . 57
32 A UserForm para Entrada Mltipla de Dados . . . . . . . . . . . . . . . 61
33 Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5
Lista de Tabelas
1 Tipos de dados suportados pelo VBA . . . . . . . . . . . . . . . . . . . . 17
2 Propriedades mais comuns dos objectos grcos VBA . . . . . . . . . . . 20
3 Valores de congurao das caractersticas de uma Caixa de Mensagem . 26
4 Valores devolvidos por uma Caixa de Mensagem . . . . . . . . . . . . . . 27
6
Listings
1 VericaValor - exemplo de funo denida pelo utilizador . . . . . . . . . 12
2 vericaGama - exemplo de funo denida pelo utilizador . . . . . . . . . 13
3 Exemplo de aplicao de If..Then..Else imbricados . . . . . . . . . . . . 38
4 FormataBordo - exemplo de sub-rotina usando For..Next . . . . . . . . . 44
5 Exemplo usando Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . 45
6 Exemplo de processamento de um vector . . . . . . . . . . . . . . . . . . 49
7 Outro exemplo de processamento de um vector . . . . . . . . . . . . . . . 49
8 Funo margemLucro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
9 Sub-rotina InsereLinhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
10 Handler do objecto cmdFechar para o evento click . . . . . . . . . . . . 59
11 Exemplo de sub-rotina de invocao de uma UserForm . . . . . . . . . . 60
12 Exemplo de sub-rotina de inicializao de uma UserForm . . . . . . . . . 61
13 Handler do objecto cmdFechar para o evento Click . . . . . . . . . . . . 61
14 Sub-rotina de inicializao da UserForm . . . . . . . . . . . . . . . . . . 62
15 Handler associado ao objecto Tabstrip1 para o evento Change . . . . . . 63
7
1 Introduo
Este texto tem como objectivo apoiar o ensino das tcnicas de programao de compu-
tadores, utilizando, como ambiente de aplicao, programas como o gestor de folhas de
clculo Excel.
Destina-se assim aos alunos que j possuem alguns conhecimentos da utilizao e
funcionamento desta aplicao. Concretamente, presume-se que esto j familiarizados
com os conceitos de folha de clculo, de livro de trabalho, de frmulas e funes standard.
A linguagem de programao que vai ser utilizada ser o VBA (Visual Basic for
Applications). uma linguagem que permite acrescentar capacidades adicionais a certo
tipo de aplicaes informticas, concretamente as pertencentes ao Microsoft Oce, entre
as quais o Excel e o Word. Permite ainda automatizar a realizao de muitas tarefas
rotineiras nessas aplicaes.
Como o prprio nome indica, trata-se duma adaptao da linguagem genrica de
programao Visual Basic de modo a poder ser utilizada no ambiente especco das
aplicaes Oce.
2 Conceitos Bsicos
O VBA constitui uma ferramenta poderosa nas mos de programadores experimentados
mas pode, ao mesmo tempo, ser muito til a qualquer utilizador, mesmo inexperiente.
De facto, no dia a dia da utilizao destas aplicaes, defrontamo-nos com a neces-
sidade de repetir a mesma tarefa vrias vezes ao dia ou, de em certas ocasies, ter que
repetir uma determinada tarefa uma srie de vezes de seguida. Seja escrever ou formatar
um certo texto, seja executar uma srie de comandos ou escolher opes de menus, seja
ainda realizar a formatao complexa de um documento, so inmeras as ocasies em
que dava jeito poder automatizar essas tarefas repetitivas.
aqui que entra o VBA, permitindo a construo daquilo que se designa vulgarmente
por macros.
2.1 O que um Macro?
Um macro contem uma lista das instrues a realizar para executar uma determinada
tarefa. No fundo, um programa escrito em VBA, que indica a uma aplicao como o
Excel quais os passos a dar para atingir um objectivo especco. Pode-se dizer que um
macro no mais que uma descrio formalizada das tarefas que se pretende automatizar.
Os macros incluem instrues que interagem com elementos da aplicao. Por exem-
plo, quando, numa aplicao Oce se pretende fechar uma janela, pode-se seleccionar a
opo de menu Close. Um macro escrito em VBA, usar a seguinte instruo para obter
o mesmo efeito:
ActiveWindow.Close
Existem duas formas alternativas de criar um macro mas a forma como ele criado
no muda o seu contedo, continuando a ser um contentor de uma lista de instrues a
realizar pela aplicao em que est instalado.
8
2.2 Tcnicas de construo dum Macro
Se bem que um macro seja um programa em VBA, nem sempre necessrio escrev-lo de
forma explcita, ou seja, escrevendo especicamente as instrues VBA que o compem.
Sobretudo quando os macros so simples, muitas vezes mais prtico cri-los de forma
automtica, gravando a sequncia de passos que ele dever executar na aplicao.
Esta forma de criar um macro corresponde a mostrar ao computador o que fazer
para conseguir obter o resultado pretendido. O utilizador indica ao programa que se
vai entrar num modo de gravao do macro e inicia a execuo da sequncia de aces
que normalmente teria que executar. Quando chega ao m dessa sequncia, indica ao
programa que a gravao terminou. Aps ter atribudo a essa sequncia uma combinao
de teclas especial, esse macro estar pronto a ser executado, substituindo assim o conjunto
de aces que anteriormente seriam necessrias. Tudo se passa como se estivssemos a
ensinar a aplicao pelo exemplo.
Se se investigar, no entanto, o contedo desse macro, vericar-se- que ele composto
precisamente por instrues escritas em VBA, sendo que a cada aco ou comando da
aplicao corresponder uma instruo (ou conjunto de instrues) especca do macro.
A forma alternativa de construir um macro ser assim introduzir essas instrues num
editor de texto apropriado. essa, de facto, a forma de criar um macro quando o seu
mbito algo no trivial.
2.3 Gravao de um Macro
Quando uma dada operao envolvendo uma srie de aces deva ser utilizada frequen-
temente faz sentido tentar automatizar a sua execuo.
Para gravar um macro que seja capaz de efectuar essas aces, haver que invocar o
modo de gravao de macros, mediante o Menu "Tools/Macros/Record a New Macro"
(em Excel), o que far aparecer a janela descrita da Figura 1. Nela se pode especicar o
nome do macro, a localizao em que ser armazenado, uma descrio das suas funes
e ainda a combinao de teclas (Shortcut key) que ser utilizada para arrancar com o
macro, uma vez este construdo.
Figura 1: Janela de invocao do ambiente de Gravao de Macros
9
Figura 2: Janela de Gesto de Macros
Aps se premir a tecla OK, aparecer uma pequena janela que permitir controlar
o processo de gravao e dever-se- dar incio execuo das aces que o macro vai
substituir. Quando se tiver executado a ltima aco a incluir no macro, basta dar a
indicao de que a gravao terminou.
Uma vez tal realizado, esse macro passar a estar disponvel mediante a invocao
da combinao de teclas especicada anteriormente (no caso da Figura 1 na pgina pre-
cedente, seria Ctrl+Shft+M) e realizar, de forma automtica, exactamente a mesma
sequncia de aces que tnhamos realizado manualmente.
Em alternativa, mediante a combinao de teclas ALT-F8, pode ser accionada a janela
de Gesto de Macros (Figura 2), onde, entre outras aces, pode ser escolhido o macro a
ser executado.
Para facilitar o acesso s facilidades de gravao e edio de macros, ser conveniente
tornar visvel de forma permanente a barra de ferramentas de Visual Basic (Figura 3).
No Excel, isto poder fazer-se mediante a opo de Menu "View/Toolbars/Visual Basic".
Figura 3: Barra de Ferramentas de VBA
2.4 A escrita de um Macro
Ensinar pelo exemplo ao Excel como fazer as coisas um mtodo expedito de construir
um macro, mas tem as suas limitaes. J que um macro no mais que um programa
10
escrito em VBA, porque no trat-lo como tal e aceder ao seu cdigo, alterando-o de
forma a melhorar a sua ecincia ou a corrigir problemas. E j agora, porque no cri-los
de raiz, aproveitando todo o poder duma linguagem como o VBA?
2.5 O editor de VBA
Para aceder ao editor especializado de Visual Basic (Figura 4), que se encontra integrado
no prprio Excel, basta utilizar o icone adequado na barra de ferramentas ou usar direc-
tamente a combinao de teclas ALT-F11. Tornando a premir esta combinao de teclas,
voltaremos nossa folha de clculo. A este editor especializado tambm dado o nome de
Integrated Development Environment (IDE) ou Ambiente de Desenvolvimento Integrado
e semelhante aplicao autnoma usada para o desenvolvimento de programas em
Visual Basic.
Figura 4: Editor integrado do VBA
Do lado esquerdo na Figura 4 podem-se ver duas janelas, a primeira das quais
designada por Explorador de Projectos e que serve para mostrar o contedo do projecto
VBA actual. Um projecto em VBA inclui um cheiro duma aplicao Oce (como, por
exemplo, uma folha de clculo do Excel) e todos os cheiros VBA associados, incluindo
os prprios macros e eventuais user forms (janelas de interface prprias utilizadas pelos
11
Figura 5: Criao de novo Mdulo
macros
1
).
Para poder comear a escrever macros usando o VBA necessrio criar um mdulo
que o possa albergar, o que conseguido usando a opo de menu "Insert/Module".
Como consequncia, para alm do novo mdulo aparecer referido na janela do Explora-
dor de Projectos, ser criada uma janela nova onde ser possvel escrever o cdigo que
constitui o novo macro. Se j existir algum mdulo criado, bastar seleccionar o mdulo
pretendido no explorador de projectos, posicionar o cursor na janela correspondente a
esse mdulo, numa rea fora de qualquer macro j existente, e seleccionar a opo de
menu "Insert/Procedure". Aparecer uma janela prpria (Figura 5) onde ser possvel
dar o nome ao novo procedimento (o conjunto de instrues que constituir o macro),
especicar o tipo de macro que vai ser construdo (funo ou procedimento
2
) e qual o
mbito da sua utilizao (privada ou pblica, ou seja, limitada ou no ao cheiro actual).
2.6 Criao de um Macro
Est na hora de construir o primeiro macro em VBA. Suponhamos que se pretende criar
um macro que verique se o valor presente numa determinada clula superior a um
dado limite e que, caso seja, disso notique o utilizador. A sub-rotina em que esse macro
dever assentar poder ter o seguinte contedo:
Listing 1: VericaValor - exemplo de funo denida pelo utilizador
1 Public Sub ve r i f i c a Va l o r ( )
2 I f Ce l l s ( 2 , 2) > 100 Then
3 MsgBox "Val or maximo excedi do ! "
4 End I f
5 End Sub
1
Sobre o assunto, ver Seco 8.
2
A distino entre funes e procedimentos (ou sub-rotinas) ser abordada mais frente.
12
No nos vamos de momento preocupar com os detalhes do cdigo que constitui o
macro. Basta vericar que, em 1
o
lugar, constitudo por uma linha de cabealho que
especica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seu
nome (vericaValor). O corpo do macro composto pela estrutura de controle condici-
onal (If...Then
3
) que vai vericar se o contedo da clula B2
4
ou no maior que o valor
200. Caso essa condio seja verdadeira, o macro apresentar uma mensagem no ecran
dizendo que o valor mximo foi excedido. Finalmente, o macro terminado com uma
linha contendo "End Sub".
O que este simples macro faz, portanto, vericar o contedo de uma clula especca
da folha de clculo e avisar o utilizador caso o valor nela contido ultrapassar um valor
pr-determinado. Sempre que for necessrio fazer esta vericao, bastar invocar a
combinao de teclas que tenha sido associada a este macro.
verdade que sta vericao poderia ter sido realizada colocando numa clula uma
frmula contendo a funo standard do Excel IF. Mas suponhamos agora que se pretende
algo mais complicado, por exemplo, fazer essa vericao num conjunto de clulas e
apenas desencadear o alarme caso mais do que duas dessas clulas ultrapassem o limite
estabelecido. A sub-rotina modicada poderia ser algo como:
Listing 2: vericaGama - exemplo de funo denida pelo utilizador
1 Public Sub veri f i caGama ( )
2 Dim i As Integer , c As Integer
3 c = 0
4 For i = 1 To 5
5 I f Ce l l s ( i , 3) > 100 Then
6 c = c + 1
7 End I f
8 Next
9 I f c > 2 Then
10 MsgBox c & " val or e s s upe r i o r e s ao l i mi t e ! "
11 End I f
12 End Sub
A vericao agora repetida em todas as clulas de C1 a C5 graas aos servios
da estrutura de controlo repetitivo For...To...Next
5
que executar 5 vezes as instrues
contidas nas linhas 5 a 7. Para alm de vericar o contedo da clula em anlise, ainda
actualizado um contador, baseado na varivel c (ver linha 6), sempre que o valor contido
nessa clula ultrapasse o limite. S quando o valor desse contador for maior que 2 ser
gerada a mensagem de alarme.
Estaremos j em posio de perceber a utilidade de construir os macros usando di-
rectamente o VBA. No seria trivial resolver este problema usando apenas frmulas e
certamente impossvel executando comandos e seleccionando menus do Excel.
A um macro criado usando directamente o VBA pode tambm ser associada uma
combinao de teclas que facilite o seu acesso. Isso pode ser feito atravs do boto
3
Ver Seco 5.1.2 na pgina 35.
4
Cells(2,2) refere-se clula B2 (2
a
coluna, 2
a
linha)
5
Ver Seco 5.2.4 na pgina 43.
13
Options na Janela de Gesto de Macros, invocada mediante ALT-F8.
3 Variveis e Tipos de Dados
A informao processada por um macro pode ser de diferente natureza e existir em di-
ferentes formatos. Genericamente um programa pode utilizar, entre outras, informao
numrica e informao chamada alfa-numrica, ou seja texto. A linguagem VBA conse-
gue lidar com informao de diversos tipos, que detalharemos adiante na Seco 3.3 na
pgina 16.
3.1 Conceito de varivel
Uma varivel uma localizao de memria em que a informao pode ser guardada de
modo a ser usada por um macro. Cada varivel caracterizada pelo seu nome e pelo seu
tipo, ou seja, o tipo de dados que pode armazenar. O contedo de uma varivel pode
mudar durante a execuo do macro. Existem algumas regras governando a escolha do
nome duma varivel:
1. Deve obrigatoriamente comear por uma letra;
2. No pode conter espaos nem caracteres como vrgulas ou pontos;
3. No pode exceder 255 caracteres;
4. No pode ser igual a uma palavra reservada para o VBA.
O tipo da varivel especica qual o tipo de dados que pode conter. Uma varivel de um
determinado tipo no est preparada para armazenar dados de um tipo diferente. A razo
para este facto que o espao necessrio para armazenar diferentes tipos de dados no
o mesmo. Enquanto um inteiro simples pode ser guardado em 2 bytes de memria
6
, para
guardar um nmero real podem ser necessrios 8 bytes (ou mesmo mais, dependendo da
preciso requerida). A Figura 6 na pgina seguinte ilustra gracamente esta realidade.
3.2 Criao das variveis
Ao acto de criao de variveis chama-se declarao. Criar uma varivel envolve dar-lhe
um nome e reservar em memria o espao necessrio para que ela possa guardar o tipo de
dados para o qual est a ser criada. O acto de declarar a varivel informa o VBA cerca
do nome pelo qual ela ser conhecida assim como qual o tipo de dados que ela dever
estar preparada para receber.
Como bvio, nenhuma varivel pode ser utilizada antes de ser criada. A declarao
deve, pois, preceder a sua utilizao. Desde que se siga esta regra, possvel inserir
declaraes em qualquer ponto do macro. No entanto, boa prtica agrupar todas as
6
Para armazenar nmeros que podem variar entre -32768 e 32767, ou seja 65536 valores diferentes, h
necessidade de dispor de 16 unidades bsicas de informao (bits), ou seja dois bytes (1 byte = 8 bits).
De facto, se cada bit apenas pode representar um valor binrio (0 ou 1), 16 bits podero representar at
2
16
= 65536 valores diferentes.
14
Figura 6: Diferentes tipos de dados e o seu armazenamento em memria
declaraes necessrias num bloco a colocar no incio, para mais fcil manuteno do
programa.
Em VBA, existem duas formas de declarao de variveis: explcita e implcita. A
declarao explcita exige a utilizao da instruo especca
Dim ... As (Dimensionar ... Como).
Por exemplo, a instruo
Dim Preo As Integer
cria (declara) uma varivel com o nome Preo e do tipo Integer, ou seja, dimensio-
nada para receber dados do tipo integer (inteiro simples
7
).
A declarao implcita resume-se a utilizar pela primeira vez uma varivel sem qual-
quer declarao explcita prvia, dando-lhe um nome e atribuindo-lhe um valor. O VBA
criar automaticamente a varivel do tipo pretendido.
Esta segunda forma de declarar variveis tem, a despeito da sua simplicidade, um
problema grave: possvel, por distraco, criar uma varivel nova indesejada, quando o
que se pretendia era apenas escrever o nome de uma varivel j existente. Suponha, por
exemplo, que havia criado uma varivel "Distancia" mediante a instruo
8
:
7
A discusso dos vrios tipos de dados suportados pelo VBA ser feita na Seco 3.3 na prxima
pgina.
8
Como se ver na seco 3.4 na pgina 17, esta instruo guarda na varivel "Distancia"o valor 1260
15
Distancia=1260
Como a primeira vez que o VBA encontra esta palavra ("Distancia"), partir do
princpio que se trata de uma varivel ainda por declarar e tratar de a criar, substituindo-
se ao programador. Dar-lhe- o nome "Distancia" e dimensiona-la- de forma a poder
guardar inteiros simples, j que essa a utilizao sugerida na instruo.
Agora suponha que adiante no programa, por engano, escrevia "Distncia" ao referir-se
varivel em causa. O VBA no emitir nenhum alerta, j que aceitou tranquilamente
"Distncia" como uma nova varivel. A forma mais prudente de lidar com declaraes de
variveis , pois, utilizar apenas declaraes explcitas, e instruir o VBA para no aceitar
declaraes implcitas, gerando uma mensagem de erro apropriada. Para tal, dever ser
acrescentada a instruo Option Explicit no incio do mdulo contendo o macro.
Figura 7: Como forar a declarao explcita automaticamente
Se se pretender que seja esse o comportamento automtico do VBA em todos os m-
dulos, dever seleccionar-se no Editor do VBA a opo "Require Variable Declaration"no
sub-menu Options do menu Tools.
3.3 Tipos de Dados
Como j vimos, um macro dever poder lidar com diferentes tipos de dados. A lingua-
gem VBA suporta, entre outros, o tratamento dos seguintes tipos de dados descritos na
Tabela 1 na prxima pgina
Quando declaramos variveis dever-se-, em princpio, especicar qual o tipo de dados
que ela ir suportar. No entanto, em VBA possvel omitir a especicao do tipo de
dados na declarao de variveis. O VBA criar uma varivel do tipo Variant capaz de
armazenar qualquer tipo de dados. O que, partida, parece uma boa ideia acaba por
no o ser porque, entre outros motivos, implica um gasto excessivo de memria e torna
a execuo dos macros mais lenta. Ser, portanto, de evitar, na medida do possvel.
16
Tipo Descrio
Integer Inteiro simples, usado para representar inteiros entre -32768 e 32767
Long Inteiro longo, ou seja, compreendido entre -2.147.483.648 e
2.147.483.647
Single Real representado com preciso simples, com valores negativos compre-
endidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca
de 1,4E-45 e 3,4E38
Double Real representado com preciso dupla, usado para representar nmeros
reais muito maiores ou muito mais pequenos que com o tipo single
String Usado para representar texto (informao alfanumrica como letras,
algarismos e smbolos especiais); strings so representadas entre aspas
Boolean Usado para representar valores lgicos (True ou False)
Date Usado para representar datas ou valores de tempo; so representados
entre caracteres #
Object Serve para guardar referncias a objectos
Tabela 1: Tipos de dados suportados pelo VBA
3.4 A operao de Atribuio
A operao de Atribuio permite guardar um dado numa varivel, ou seja, atribuir-lhe
um valor. A sintaxe utilizada por esta operao a seguinte:
Varivel = Valor
O resultado da operao ser, portanto, o de guardar Valor em Varivel. Valor
pode ser um valor constante ou o contedo de outra varivel. Neste caso, a atribuio
consistir na cpia do contedo de uma varivel para outra do mesmo tipo. A instruo
seguinte copia o valor contido na varivel idade para a varivel temp (partimos do
princpio que ambas so do tipo integer):
temp = idade
Pode ainda ser atribudo a um varivel o resultado de uma expresso ou o valor
devolvido por uma funo. Atente-se nos seguintes exemplos:
total = peso1 + peso2
resultado = sqrt(2+peso)
No 1
o
exemplo, o VBA resolver em primeiro lugar a expresso direita do operador
de atribuio (=), somando os contedos das variveis peso1 e peso2, aps o que copiar
esse resultado para a varivel total.
No 2
o
exemplo, a expresso direita composta por uma funo standard do VBA
(sqrt()). Esta funo calcula a raiz quadrada do valor ou expresso que se encontrar
dentro dos seus parntesis. Assim sendo, o VBA calcular em 1
o
lugar o resultado da
expresso 2 + peso, fornecer esse valor funo sqrt(), aps o que copiar o valor
fornecido por essa funo para a varivel resultado.
importante que se perceba que a operao de atribuio uma operao destrutiva.
Se a varivel contiver j um valor, uma operao subsequente de atribuio sobre essa
17
varivel, substituir o valor nela contido pelo novo valor. Convem, assim, lembrar que
nesta operao o uxo da informao se faz sempre da direita para a esquerda e no o
contrrio.
H ainda que ter em ateno o facto de que no normalmente aconselhvel atribuir
um valor de um dado tipo a uma varivel de tipo diferente. Os resultados podem ser a
perda de informao ou o mau funcionamento do programa. O VBA poder gerar uma
mensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentos
anmalos difceis de detectar e corrigir.
3.5 O uso de constantes
Uma constante consiste num nome que dado a um valor numrico ou a uma cadeia de
caracteres, e que pode ser usado dentro do programa na vez desses valores. Funciona
como uma espcie de sinnimo. A utilizao de constantes em substituio dos valores
que representa justica-se pelo seguinte facto: se um dado valor constante fr utilizado
muitas vezes ao longo dum programa, caso ocorra a necessidade de o modicar, seremos
forados a corrigir manualmente todas as ocorrncias desse valor, correndo, alm disso, o
risco de nos enganarmos. Se, ao invs, for denida uma constante com esse valor, bastar
modicar essa denio inicial para que tal mudana automaticamente se repercuta em
todas as ocorrncias dessa constante no decurso do programa. A sintaxe da denio de
constantes a seguinte:
Const Nome As tipo = expresso
Por expresso entende-se um valor numrico, uma cadeia de caracteres, ou uma ex-
presso cujo resultado seja um destes tipos de valores.
Caso, por exemplo, seja necessrio usar ao longo de um macro um mesmo factor em
vrios clculos, faz sentido denir esse factor como constante e usar o seu nome em vez
dele:
Const Factor as Single = 1.347
Sempre que seja subsequentemente necessrio utilizar este factor numa expresso,
usar-se- Factor em vez de 1.347.
18
4 Como trabalhar com Objectos
Para que uma macro possa manipular o ambiente da aplicao, seja modicando a forma-
tao de um documento, modicando opes da aplicao ou introduzindo dados numa
gama de clulas, vai ser preciso interagir com Objectos. Genericamente, pode dizer-se que
um objecto algo que pode ser visto, tocado, sentido. Em VBA, considera-se um objecto
tudo aquilo que pode ser visto e que pode ser manipulado de alguma forma.
Quer o documento, quer uma clula ou gama de clulas, quer a prpria aplicao
so considerados, para os efeitos de programao em VBA, como sendo objectos. Mas
podem ainda existir outros objectos, nomeadamente aqueles que permitem construir uma
interface grca especca do macro. A esses objectos grcos chamamos controlos e so
colocados em janelas especiais chamadas forms.
Na Figura 8 podem ser observados vrios objectos instalados numa form: uma caixa
de texto, dois botes de comando, vrios rtulos ou etiquetas e uma caixa de vericao.
Atravs deles possvel o macro interagir com o utilizador. Veremos em detalhe mais
frente para que servem e como utilizar estes diferentes objectos.
Figura 8: Uma Form e vrios Controlos
Os objectos podem ser manipulados de vrias formas:
podemos mudar as suas propriedades, que traduzem caractersticas prprias dos
objectos;
podemos aplicar um mtodo a um objecto, ou seja, executar uma aco sobre ele;
podemos especicar uma sub-rotina que ser executada sempre que um determinado
evento ocorra nesse objecto.
Vamos agora utilizar a analogia para introduzir estes conceitos. Consideremos um
automvel:
As suas "propriedades" so caractersticas fsicas como o modelo, o peso ou a cilin-
drada;
19
Os seus "mtodos" especicam o que pode ser feito com ele: acelerar, travar, mudar
de direco, etc;
Os seus "eventos" so ocorrncias que provocaro respostas automticas por parte
do automvel, como seja, um alarme que dispara (resposta) caso desliguemos o
carro com as luzes ligadas (evento).
4.1 Propriedades, Mtodos e Eventos
Vamos, de seguida, aprofundar estes conceitos de propriedades, mtodos e eventos.
4.1.1 Propriedades
As propriedades de um objecto so as suas caractersticas fsicas. Como na vida real, cada
objecto possui caractersticas prprias ou propriedades, que podem ser quanticadas ou
especicadas, como sejam as suas dimenses ou o tipo de letra que usa. A cada objecto
est associada uma lista de propriedades a que possvel atribuir valores, determinando
a sua aparncia, localizao e outros detalhes. Pode-se ento dizer que as propriedades
de um objecto denem a forma como ele se apresenta ou se comporta.
Diversos objectos podem partilhar a mesma propriedade. Essa propriedade, no en-
tanto, pode afectar esses objectos de forma diferente.
Caption Dene o texto a axar na barra de ttulo das forms, da legenda
(caption) dos botes de comando, ou nos rtulos (label)
Name Dene o nome pelo qual o objecto identicado
Left Dene o afastamento entre uma form e o limite esquerdo do ecr
ou entre um controlo e o limite esquerdo da form
Top Dene o afastamento entre uma form e o topo do ecr ou entre um
controlo e o topo da form
Height Dene a altura do objecto
Width Dene a largura do objecto
Font Especica qual o tipo de letra a usar nos controlos
Visible Permite controlar o aparecimento de um dado objecto
Tabela 2: Propriedades mais comuns dos objectos grcos VBA
J vimos que quer os elementos do Excel como folhas de clculo ou prprio docu-
mento, quer elementos constituintes de interfaces grcas que os macros possam utilizar,
so considerados objectos. Na Tabela 2 so descritas algumas das propriedades mais
importantes e que so comuns maior parte dos objectos grcos.
Os valores que as propriedades de um dado objecto tomam podem ser consultados ou
modicados usando a janela de propriedades (Figura 9 na pgina seguinte). Nessa janela
aparece a lista de propriedades do objecto que estiver nesse momento seleccionado . Nela
pode observar, entre outras, algumas das propriedades referidas na lista acima (Caption,
Height e Font) e os respectivos valores no momento.
20
Figura 9: Janela de Propriedades
4.1.2 Mtodos
Os mtodos traduzem aces que um macro pode realizar sobre os objectos. Por exem-
plo, aplicar o mtodo Save ao objecto ActiveDocument implica desencadear o processo
de salvaguardar o contedo do documento activo num determinado cheiro. Aplicar o
mtodo Clear a um objecto da classe ListBox ter como consequncia a eliminao de
todas as linhas nele contidas. A cada classe de objectos possvel aplicar um determinado
conjunto de mtodos.
Para vermos como um mtodo aplicado a um objecto, vamos considerar o objecto
Worksheet, que representa uma folha de clculo do Excel. Se pretendermos que o nosso
macro mova essa folha para uma nova posio dentro do Livro de Trabalho (Workbook),
ele dever aplicar o mtodo Move a esse objecto, usando a seguinte sintaxe:
Worksheet.Move([Before][, After])
Exemplicando, se quisermos que o macro desloque a folha de clculo "Dados 2009"para
a posio imediatamente a seguir folha "Dados 2008", o comando a inserir no macro
ser:
Worksheets("Dados 2009").Move Before:=Worksheets("Dados 2008")
Como veremos mais frente, o objecto Worksheet denido como um elemento do
conjunto de folhas de clculo contidas no Livro de Trabalho. Este conjunto de folhas
representado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se folha
de clculo com o nome "Dados 2009".
4.1.3 Eventos
Os eventos so aces que, uma vez exercidas sobre um objecto, implicam a possibilidade
de ocorrer uma resposta automtica por parte dele. Basicamente, um evento algo que
acontece a um objecto. Por exemplo, a abertura de uma folha de um livro de trabalho
(workbook) em Excel um evento. A insero de uma nova folha no livro de trabalho
21
outro exemplo de evento.
Para que um objecto possa reagir a um dado evento dever existir, previamente pro-
gramado, um procedimento especial, chamado event handler, que vai especicar o que
fazer caso esse evento ocorra. Sem isso, o objecto detectar esse acontecimento mas no
saber o que fazer. Nenhuma resposta ser produzida.
Figura 10: Lista de eventos disponveis
Na Figura 10 pode ver-se a janela de escrita de cdigo de macros. Na parte de cima,
direita, pode ser acedida a lista de eventos disponveis para o objecto Worksheet
9
.
Seleccionando um dos eventos, ser possvel construir o procedimento event handler que
permita ao objecto Worksheet reagir a esse evento. O cabealho e o delimitador nal so
criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador
a incluso das instrues necessrias. Na gura so referidos vrios eventos que podem
ocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folha
de clculo se torna activa, ou o Change que desencadeado por qualquer alterao ao
seu contedo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estar
preparada para reagir a diferentes eventos, desde que possua event handlers especcos
para esses eventos.
Para tentar esclarecer melhor o conceito de evento e a questo de como organizar
a resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenas
objectos grcos dispostos numa form. Repare-se na Figura 11 na pgina seguinte: o que
se pretende aqui um macro capaz de vericar se um dado nmero inteiro, introduzido
pelo utilizador usando a interface descrita na gura, ou no um nmero primo. Parte-
se do princpio que todos sabem o que um nmero primo e no nos vamos agora
debruar sobre os detalhes do cdigo que o event handler dever conter para produzir o
efeito desejado. Preocupemo-nos, de momento, apenas com as interaces entre as vrias
entidades que intervm no processo.
Como visvel na Figura 11 na prxima pgina, existem vrios objectos (chamados
controlos) na interface. Entre eles, tm particular interesse para esta discusso a caixa de
texto txt1, o rtulo lbl2 e o boto de comando command1. Quando o utilizador pretende
utilizar o macro, uma vez este invocado, dever introduzir o nmero a testar em txt1 e
pressionar ("clicar") o boto command1. Quando isso acontece, diz-se que ocorreu um
evento click no boto command1. Se esse boto no dispuser de nenhum event handler
para lidar com esse tipo de evento, nada se passar. No entanto, se se tiver previamente
9
Isto porque as diferentes classes de objectos no so necessariamente sensveis aos mesmos tipos de
eventos.
22
Figura 11: Objectos e Eventos
associado a esse objecto (command1) um event handler adequado, o objecto ser j capaz
de responder ao evento e produzir o resultado desejado. Neste caso, esse resultado dever
ser efectuar os clculos necessrios para concluir se o nmero introduzido ou no primo
e apresentar essa concluso no rtulo lbl2.
4.2 Os objectos do Excel mais comuns
J vimos que um documento Word ou Excel , em si mesmo, um objecto. Se bem que no
lhe possamos tocar, podemos claramente v-lo e interagir com ele de mltiplas formas, seja
alterando o contedo de clulas (no caso do Excel), seja mudando formatos ou inserindo
linhas e colunas. Por sua vez, todos estes elementos so, eles tambm, objectos. Nas
aplicaes Oce, os objectos esto organizados de forma hierrquica. O objecto mais
geral o Application, e dentro dele existem mltiplos objectos de nvel progressivamente
inferior.
4.2.1 Como trabalhar com as propriedades dos objectos Excel
Como j vimos, os objectos possuem caractersticas prprias, chamadas propriedades. A
sintaxe genrica para nos referirmos a uma propriedade de um objecto a seguinte:
23
Objecto.Propriedade
Se nos quisermos referir, por exemplo, propriedade ActiveWindow do objecto Ap-
plication, procederemos do seguinte modo:
Application.ActiveWindow
A propriedade ActiveWindow refere-se janela da aplicao com que estamos, de
momento, a trabalhar. No caso do Excel, podemos ainda referirmo-nos, por exemplo,
propriedade ActiveSheet para designar a folha de clculo em que se est a trabalhar ou a
ActiveCell para nos referirmos clula actualmente seleccionada.
Se pretendermos, por exemplo, especicar o tipo de letra da clula activa, usaremos
a seguinte descrio de objecto:
Application.ActiveWindow.ActiveCell.Font.Name
Na prtica, quando nos estamos a referir a uma propriedade da janela activa da
aplicao como seja a ActiveCell, no precisamos de referir que pertence ActiveWindow
e Application. Podemos omitir esses detalhes e apenas escrever:
ActiveCell.Font.Name
Se quisermos utilizar esta propriedade para mudar o tipo de letra da clula activa,
utilizaremos ento uma instruo como a seguinte
10
:
ActiveCell.Font.Name = "Helvetica"
Se, ao contrrio, quisermos obter o valor de uma dada propriedade, a instruo a usar
ser do tipo:
variavel = Objecto.Propriedade
Para obtermos, por exemplo, o contedo da clula activa da folha de clculo, a ins-
truo correcta seria:
conteudo = ActiveCell.Value
Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa proprie-
dade encontra-se armazenado o contedo da clula.
4.2.2 Como aplicar mtodos aos objectos
Vimos na Seco 4.1.2 na pgina 21, que os mtodos de uma classe de objectos descrevem
as aces que podemos executar sobre eles ou, por outras palavras, aquilo que podemos
fazer com eles. A sintaxe usada para aplicar um mtodo a um objecto similar usada
para trabalhar com as suas prorpiedades:
Objecto.Mtodo
Um exemplo da aplicao de um mtodo a um objecto, usando esta sintaxe, o
seguinte:
10
Trata-se de uma operao de atribuio, descrita na Seco 3.4 na pgina 17
24
Worksheets("Leituras").Activate
Estamos aqui a aplicar o mtodo Activate ao objecto Worksheets("Leituras"), o
que tem como consequncia que essa folha de clculo se tornar activa.
No entanto, muitas vezes, os mtodos exigem informao adicional para poderem
executar o seu trabalho. Essa informao adicional ser fornecida atravs de argumentos,
inseridos a seguir ao nome do mtodo aplicado:
Objecto.Mtodo (argumento1, argumento2. ...)
O seguinte exemplo abre um Livro de Trabalho pr-existente com o nome "Dados.xls":
Workbooks.Open("Dados.xls")
Muitas vezes, os argumentos que se podem fornecer a um mtodo so opcionais. Por
exemplo, a instruo abaixo adiciona (insere) uma nova folha de clculo imediatamente
antes da folha com o nome "Dados_Jan":
Worksheets.Add Before:=Worksheets("Dados_Jan")
No entanto, caso seja omitido o argumento Before, a nova folha ser inserida antes da
folha de clculo activa. esse o comportamento por defeito do mtodo Add.
4.3 Objectos grcos
Vo agora ser apresentados de forma mais sistemtica alguns dos objectos e facilidades
necessrios para realizar interfaces grcas simples. Essas interfaces vo permitir que
os macros tenham uma interaco directa com o utilizador, requerendo e fornecendo
informao.
A forma mais simples de o macro interagir com o utilizador atravs de duas funes:
MsgBox e InputBox.
4.3.1 MsgBox
A funo MsgBox permite apresentar no ecran uma Caixa de Mensagem (Msg Box).
Trata-se de uma pequena janela contendo um mensagem, pelo menos um boto de co-
mando e eventualmente um pequeno desenho (cone) ilustrativo do tipo de mensagem.
Na Figura 12 encontra-se um exemplo de uma destas janelas.
Figura 12: Exemplo de MsgBox
25
Uma Caixa de Mensagem destina-se a apresentar ao utilizador uma mensagem com
informao relevante, sejam avisos, resultados, perguntas ou sugestes. Uma janela deste
tipo tem um comportamento peculiar: enquanto no for premido um boto, no ser
possvel qualquer outra interaco com o computador, j que essa janela tomou o controlo.
O utilizador assim obrigado a atender mensagem apresentada.
A sintaxe da funo MsgBox a seguinte:
MsgBox(Mensagem, Caractersticas, Ttulo)
Em que os argumentos so:
Mensagem Texto a apresentar (mximo de 1024 caracteres)
Caractersticas Valor numrico que especica o nmero de botes, o tipo do
cone e o boto de defeito (com o focus), obtido pela soma
de trs valores parciais.
Ttulo Contedo da barra de ttulo da janela (opcional)
O 2
o
argumento ser calculado usando os valores da Tabela 3:
Botes de Comando cone Boto com o focus
0 - OK 0 - Nenhum 0 - 1
o
Boto
1 - OK, Cancel 16 - Mensagem Crtica 256 - 2
o
Boto
2 - Abort, Retry, Ignore 32 - Mensagem de Aviso 1 512 - 3
a
Boto
3 - Yes, No, Cancel 48 - Mensagem de Aviso 2
4 - Yes, No 64 - Mensagem de Informao
5 - Retry, Cancel
Tabela 3: Valores de congurao das caractersticas de uma Caixa de Mensagem
Assim, para obter a MsBox da Figura 12 na pgina anterior o valor a utilizar para
o parmetro caractersticas seria obtido somando 3 valores, um de cada coluna da
Tabela 3, cada um deles especicando uma das caractersticas (Botes de Comando,
cone e qual o boto com o "focus"
11
):
1 + 16 + 0 = 17
A MsgBox serve ento para apresentar uma mensagem ao utilizador. No entanto,
permite tambm recolher informao. Quando a caixa de mensagem apresenta mais
do que um boto, est-se a pedir ao utilizador que escolha uma de entre duas ou trs
alternativas. Dependendo de qual o boto premido pelo utilizador, assim o valor numrico
devolvido pela funo MsgBox ser um de entre 7 valores possveis, descritos na Tabela 4
na pgina seguinte.
De notar que caso a tecla ESC (Escape) seja premida o valor devolvido ser 2, a que
corresponde o boto Cancel (o que indica que as duas aces so equivalentes).
Claro que quando se pretende aproveitar o valor devolvido pela funo MsgBox ser
necessrio us-la com a seguinte sintaxe:
11
O boto com o "focus" ou boto de defeito aquele que ser accionado automticamente caso o
utilizador prima a tecla Enter ou Return.
26
Constante Valor Boto seleccionado
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No
Tabela 4: Valores devolvidos por uma Caixa de Mensagem
Varivel = MsgBox(Mensagem, Caractersticas, Ttulo)
Desta maneira, o valor devolvido pela funo ser guardado (atribudo) em Varivel,
podendo depois ser avaliado por instrues seguintes.
4.3.2 InputBox
A funo InputBox permite apresentar ao utilizador uma mensagem com uma questo,
recolhendo ao mesmo tempo uma string contendo a sua resposta. Assim, ao contrrio
da funo MsgBox (Seco 4.3.1 na pgina 25), esta funo produz um resultado do tipo
string e no do tipo integer.
Figura 13: Exemplo de InputBox
Como pode ser visto na Figura 13, esta funo cria um objecto composto (uma Caixa
de Entrada) incluindo um caixa de texto, dois botes
12
e um rtulo dentro de uma
pequena janela.
A sua sintaxe
Varivel = InputBox (mensagem, ttulo, valor_de_defeito, xpos, ypos)
Em que os argumentos so:
12
Ao contrrio da MsgBox, neste caso os dois botes so xos. Por outro lado, a tecla ESC tem o
mesmo comportamento.
27
Mensagem Texto da mensagem a axar na Caixa de Entrada (mximo
de 1024 caracteres)
Ttulo Contedo da barra de ttulo da janela (opcional)
valor_de_defeito Texto a colocar partida na caixa de texto da Caixa de En-
trada (opcional)
xpos e ypos Coordenadas da Input Box relativamente aos bordos es-
querdo e superior do ecr (opcionais)
4.3.3 Forms
Como vimos no incio da Seco 4 na pgina 19, uma interface grca (em terminolo-
gia VBA, uma DialogBox) construda dispondo os objectos adequados (genericamente
designados por controlos) sobre uma janela especial, a form. Efectivamente uma form
utilizada como um contentor para outros objectos grcos. Um objecto da classe User-
Form pode ser criado no Editor do VBA atravs do Menu "Insert/User Form". Esse
processo ser visto em detalhe na Seco 8 na pgina 56.
A seguir so apresentadas algumas das principais propriedades que podem ser con-
guradas numa Form:
Name - especica o nome pelo qual a Form ser identicada
Caption - especica o ttulo que gura no topo da Form
BackColor - permite seleccionar a cor do fundo
Enabled - controla a utilizao da Form pelo utilizador
ShowModal - permite alterar o comportamento da Form de modo a controlar o
acesso aplicao enquanto a Form estiver activa
Font - controla o tipo e tamanho da letra utilizada
Height - especica a altura da Form
Width - especica a largura da Form
Nas prximas seces, referiremos com algum detalhe os controlos de uso mais comum
na construo de dialogBoxes em VBA. Estes so os objectos que mais frequentemente
so colocados numa form.
4.3.4 Botes de Comando
Um boto de comando (objecto commandButton), como o prprio nome sugere, uti-
lizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se pode
vericar na Figura 11 na pgina 23, a este tipo de controlos que normalmente se asso-
ciam as sub-rotinas que permitem responder a eventos como o clicar de um rato.
As propriedades normalmente referidas em relao a esta classe de objectos so as que
controlam as dimenses (Height e Width) e a propriedade Caption que permite especicar
o texto axado.
28
A instruo seguinte serve de exemplo de como alterar programaticamente o estado
de um boto de comando:
cmdArranque.Enabled = True
O que zemos com a instruo acima foi atribuir o valor booleano (lgico) True pro-
priedade Enabled
13
do boto de comando cmdArranque. Estamos, assim, a tratar uma
propriedade como sendo uma varivel. De facto, uma propriedade pode ser considerada
como uma varivel especial.
4.3.5 Rtulos
Os rtulos, tambm designados por etiquetas (label ) so usados para apresentar texto
na interface. Mais uma vez, a propriedade mais utilizada a propriedade Caption, que
permite especicar o texto a apresentar. Este controlo usado no s para apresentar
informao esttica, que escolhida na fase de concepo da interface, como tambm
informao dinmica, como seja a apresentao de resultados:
lblResultado.Caption = "O valor total 235 metros"
A instruo acima atribui propriedade Caption do rtulo lblResultado a string "O
valor total 235 metros", o que vai ter como consequncia a sua axao na interface.
4.3.6 Caixas de Texto
As caixas de texto (objecto TextBox) so uma classe de controlos muito versteis que
permitem a introduo pelo utilizador de diversos tipos de informao: texto, valores
numricos e, no caso do Excel, referncias a clulas e mesmo frmulas.
Algumas das suas propriedades mais importantes so:
Text - Permite obter ou alterar o texto contido no objecto.
MaxLenght - Especica o tamanho mximo do texto (em caracteres) que o utili-
zador pode introduzir.
MultiLine - Permite escolher entre autorizar ou no a insero de vrias linhas.
Enquanto que os rtulos (Label ) so utilizados pelo programa para aparesentar infor-
mao ao utilizador, j as caixas de texto (Text Box) so maioritriamente usadas para
permitir a leitura de informao pelo programa.
13
Esta propriedade permite controlar o acesso do utilizador ao boto de comando.
29
Funes Val e Str
A linguagem Visual Basic dispe de um grande nmero de funes pr-denidas.
Duas delas, relacionadas com "strings", so particularmente teis para lidar com
objectos da classeTextBox:
Funo Descrio
Val() Retorna como valor numrico um nmero contido dentro duma string
Str() Retorna uma string representando um nmero
Vamos supor que um macro precisa de calcular o peso total custa de dois valo-
res introduzidos pelo utilizador atravs de duas TextBox. A tentao seria usar a
instruo:
pesoTotal = txt1.Text + txt2.Text
No entanto, o que a propriedade Text das TextBox contem apenas texto, ainda
que contendo algarismos. Para extrair a informao numrica de dentro do texto,
haver que utilizar a funo Val():
pesoTotal = Val(txt1.Text) + Val(txt2.Text)
4.3.7 Botes de Opo
Estes objectos permitem ao utilizador efectuar escolhas entre diversas alternativas. So
compostos pelo boto propriamente dito (de forma circular) e um pequeno texto que o
acompanha, controlado pela propriedade Caption do objecto.
Figura 14: Vrios optionButton agrupados numa frame
Os botes de opo so geralmente agrupados em conjuntos de dois ou mais, estando
interligados entre si, j que, ao mesmo tempo, s possvel existir um boto seleccionado
dentro do mesmo grupo de botes de opo. Encontram-se muitas vezes inseridos em
frames (Seco 4.3.9 na pgina seguinte).
Para alm da propriedade Caption, outra propriedade importante dos botes de opo
a propriedade Value, que pode assumir o valor True ou False conforme o boto se
encontre ou no seleccionado.
30
4.3.8 Caixas de Vericao
Estes objectos comportam-se de forma semelhante dos botes de opo mas, neste caso,
possvel encontrar vrios controlos deste tipo activados simultaneamente na mesma
form, visto que tais objectos funcionam de forma independente (isto , no se encontram
relacionados entre si).
Figura 15: Vrios checkBox agrupadas numa frame
Possuem tambm uma propriedade Value que, neste caso, pode apresentar os seguintes
valores:
0 no activada
1 activada
2 no disponvel
O texto a inserir junto de cada caixa de vericao deve ser especicado mediante a
propriedade Caption.
4.3.9 Quadros (Frames)
Tais objectos destinam-se a agrupar outros objectos (controlos). So usados muitas vezes
para organizar um dado conjunto de botes de opo (Seco 4.3.7 na pgina precedente),
tornando-os independentes de outros botes de opo eventualmente existentes na mesma
form.
Figura 16: Uma Frame agrupando trs botes de comando
importante criar o quadro antes de a inserir os controlos. Se o controlo fr criado
antes do quadro, no ser possvel desloc-lo para dentro do quadro aps este ter sido
criado.
31
Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o
contentor desse objecto. Quer isto dizer que a sua localizao passa a ser denida no
em relao form mas em relao ao quadro que o contem.
Outra utilidade dos quadros servir de moldura a um dado conjunto de controlos, de
modo a melhorar a aparncia e a organizao da form em que esto inseridos, agrupando
os diversos controlos de acordo com as suas funcionalidades.
4.3.10 Caixas de Listagem
Este objecto serve para apresentar listas e permite que o utilizador escolha uma ou mais
opes dentro de uma dada lista. Esta lista apresentada numa caixa prpria (com uma
barra de deslocamento vertical direita, no caso de a lista ser mais extensa que o nmero
de linhas disponvel na caixa).
Figura 17: Exemplo de listBox
Os elementos da lista podem ser especicados partida usando a propriedade List,
ou ser acrescentados durante a execuo do programa mediante o mtodo AddItem:
listbox.AddItem elemento
ou
listbox.AddItem elemento, posio
em que
elemento o novo elemento a acrescentar lista
posio refere-se posio na lista em o elemento vai ser inserido
Na primeira variante acima o elemento ser inserido a seguir ltima linha preen-
chida.
A remoo de um elemento da lista pode ser feita mediante o mtodo RemoveItem:
Listbox.RemoveItem posio
As propriedades mais relevantes desta classe de objectos so:
32
ListCount permite conhecer em qualquer momento o nmero de elemen-
tos contidos na lista
Sorted permite especicar se a lista ou no apresentada de maneira
ordenada
ColumnCount especica qual o nmero de colunas em que a lista apresen-
tada
ColumnHeads controla os cabealhos das colunas
MultiSelect permite controlar a forma de seleco de elementos na lista:
0 - s possvel seleccionar um elemento
1 - possvel seleccionar vrios elementos simultaneamente,
pressionando cada elemento
2 - possvel seleccionar vrios elementos simultaneamente,
usando a tecla Ctrl
ListIndex fornece ou especica qual o ndice do item actualmente selec-
cionado (ou 1 caso nenhum esteja). Sintaxe:
objecto.ListIndex [= indice]
List permite aceder aos elementos duma lista, quer para os ler,
quer para os modicar. Sintaxe:
objecto.List(indice) [= string]
Text permite obter o elemento actualmente seleccionado. Sintaxe:
variavel = objecto.Text
RowSource no Excel, especica qual a gama de clulas onde estar a in-
formao a incluir na lista, ou seja, a fonte dos dados a apre-
sentar.
Na especicao de sintaxe, os parntesis rectos indicam que o seu contedo opcional.
No caso das propriedades ListIndex e List descritas acima, a verso curta destina-se a ser
usada do lado direito de uma operao de atribuio, enquanto que na verso completa
o que se pretende atribuir um valor propriedade.
Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox com
uma ListBox. O utilizador pode introduzir um item na TextBox ou seleccion-lo na lista
que, estando normalmente escondida, s aparecer quando se clica num cone prprio.
normalmente utilizado quando se pretende dar a possibilidade de escolher um elemento
de uma lista mas sem ocupar muito espao na form.
4.4 Interface grca sem uma Form
possvel criar uma interface grca para um macro sem ter que usar um form onde se
instalem os diferentes controlos. Nesse caso, os controlos sero instalados directamente
na prpria folha de clculo, numa rea reservada para o efeito. Um exemplo pode ser
observado na Figura ?? na pgina ??.
33
5 Estruturas de controlo do programa
Um macro um programa escrito na linguagem VBA. Vamos agora comear a analizar
mais em detalhe a estrutura de um programa. Um programa composto por um conjunto
de instrues, cada uma delas executando uma tarefa especca. A sequncia de instrues
levar soluo do problema que o programa se prope resolver. Mas essa sequncia no
tem que ser necessariamente linear, i.e., composta por uma lista de instrues que sero
realizadas uma aps outra, de forma imutvel. Isso tornaria o programa inexvel, incapaz
de se adaptar s circunstncias ou aos diferentes desejos do utilizador.
J foi introduzida na Seco 3.4 na pgina 17 a noo de operao de atribuio. Com
essa operao podemos criar instrues simples, mediante as quais possvel copiar valores
entre variveis, ou armazenar resultados do clculo de expresses. Mas um programa
exvel no poder ser construdo apenas com instrues desse tipo. preciso dispor
de instrues que permitam alterar o uxo do programa. Para tal vamos introduzir
estruturas de controlo que possibilitam a alterao desse uxo.
5.1 Estruturas de controlo condicional
Uma estrutura de controlo fundamental a estrutura condicional, ou de seleco. Usando
esta estrutura, as instrues podem ser executadas condicionalmente. Se uma dada con-
dio fr verdadeira, ser executada uma dada sequncia de instrues. Se fr falsa, uma
sequncia diferente ser escolhida.
5.1.1 If...Then...Else
Figura 18: Estrutura de controlo condicional If...Then...Else
34
A Figura 18 na pgina 34 descreve a estrutura condicional If...Then...Else. Como o
seu nome sugere, esta estrutura est baseada no teste de uma condio. Se essa condio
fr verdadeira, desencadear a execuo das instrues representadas na gura por Bloco
de Instrues1. Em caso contrrio, ser executada o Bloco de Instrues 2.
A sintaxe desta estrutura :
1 I f condi cao Then
2 [ i ns t r uc o e s ]
3 Else
4 [ i ns t r uc o e s a l t e r na t i va s ]
5 End I f
Quando a condio verdadeira sero executadas as instrues delimitadas por Then
e Else. Em caso contrrio, ser executado o bloco alternativo de instrues.
A condio pode consistir numa comparao ou outra operao lgica, ou ainda em
qualquer expresso de que resulte um valor numrico: um valor no nulo ser interpretado
como Verdadeiro, enquanto um valor nulo ser considerado como Falso.
A condio , portanto, uma expresso booleana (lgica). Uma expresso booleana
representa um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser cons-
tituda por uma varivel, uma funo ou uma combinao destas entidades atravs de
operadores.
5.1.2 If...Then
Figura 19: Estrutura de controlo condicional If...Then
Quando numa estrutura condicional no existe qualquer aco a executar quando a
35
condio seja falsa, usa-se uma variante simplicada, a If...Then. O seu diagrama est
descrito na Figura 19 na pgina 35. A sua sintaxe ser ento:
1 I f condi cao Then
2 [ i ns t r uc o e s ]
3 End I f
Nesta 2
a
variante, quando a aco a realizar no caso a condio ser verdadeira puder ser
executada com apenas uma instruo, possvel utilizar a seguinte sintaxe simplicada,
sem o delimitador End If :
If condicao Then instrucao
Expresses lgicas
As expresses lgicas, utilizadas nas condies das estruturas de controlo, so cons-
trudas utilizando operadores lgicos especcos. A linguagem VBA prev os seguin-
tes operadores lgicos, utilizveis em expresses:
Operador Descrio
> Maior que
< Menor que
= Igualdade
<= Menor ou igual
>= Maior ou igual
<> Desigualdade
And E
Or Ou
Not Negao
Dos primeiros seis operadores no haver muito a dizer. J do And e do Or haver
alguns detalhes a esclarecer:
AND
Sintaxe: Expr1 And Expr2
Se Expr1 e Expr2 forem ambas verdadeiras, a expresso ser verdadeira
Basta que quer Expr1 quer Expr2 seja falsa, para a expresso ser falsa
OR
Sintaxe: Expr1 Or Expr2
Se Expr1 e Expr2 forem ambas falsas, a expresso ser falsa.
Basta que quer Expr1 quer Expr2 seja verdadeira, para a expresso ser ver-
dadeira
36
5.1.3 Estruturas condicionais embutidas
possvel imbricar estruturas condicionais dentro de outras estruturas condicionais, per-
mitindo, assim, a construo de estruturas de controlo mais complexas. Para inserir uma
estrutura condicional dentro de outra, utilizada a palavra reservada ElseIf.
A sintaxe desta estrutura :
1 I f condi cao1 Then
2 Accao1
3 El seIf condi cao2 Then
4 Accao2
5 El seIf condi cao3 Then
6 . . .
7 Else
8 AccaoN
9 EndIf
Esta estrutura condicional permite a seleco de uma entre vrias alternativas mu-
tuamente exclusivas. As instrues que se seguem palavra reservada Else (aqui re-
presentadas por "AcoN") sero executadas apenas se nenhuma das condies se tiver
vericado.
Figura 20: Estruturas de controlo condicional imbricadas
Na Figura 20 na pgina anterior pode-se ver o uxograma de uma estrutura imbricada
com quatro vias alternativas. A Aco 1 executada caso a 1
a
condio seja verdadeira.
A Aco 3 ser executada caso a Condio 3 for verdadeira e as duas anteriores falsas.
A Aco 4 ser executada caso todas as quatro condies se tiverem vericado falsas.
37
Chama-se a esta aco, a aco por defeito, ou seja, aquilo que se faz quando todo o resto
falha.
muito importante que se compreenda que estamos aqui a tratar de verdadeiras alter-
nativas, i.e., mtuamente exclusivas. Cada vez que uma estrutura deste tipo executada,
s uma das aces ser efectuada.
O exemplo seguinte traduz uma situao em que o programa, confrontado com a
necessidade de classicar uma nota numrica, pode escolher uma de entre seis notas
qualitativas diferentes. S uma estrutura condicional imbricada lhe permitir resolver o
problema.
Listing 3: Exemplo de aplicao de If..Then..Else imbricados
1 I f ( nota < 0) Or ( nota > 20) Then
2 r e s ul t ado = "Nota I nval i da ! "
3 El seIf nota < 6 Then
4 r e s ul t ado = "Mau"
5 El seIf nota < 10 Then
6 r e s ul t ado = "Medi ocre "
7 El seIf nota < 14 Then
8 r e s ul t ado = " Suf i c i e nt e "
9 El seIf nota < 17 Then
10 r e s ul t ado = "Bom"
11 Else
12 r e s ul t ado = "MuitoBom"
13 End I f
possvel imbricar um qualquer nmero de blocos ElseIf dentro de uma dada estru-
tura condicional.
5.2 Estruturas de controlo repetitivo
Como vimos, as estruturas de controlo condicional permitem alterar o uxo do pro-
grama, ou seja, executar diferentes sequncias de instrues conforme as circunstncias
do momento. As estruturas de controlo repetitivo (tambm conhecidas por ciclos)
permitem repetir um dado conjunto de instrues o nmero de vezes que fr necessrio.
Existem diversas variantes de ciclos, diferindo umas das outras pela forma como
controlada a execuo das instrues contidas no corpo do ciclo. Genericamente, pode-se
dizer que uma estrutura de controlo repetitiva (ou ciclo) assegura a execuo repetida de
um dado conjunto de instrues dependendo do resultado do teste de uma determinada
condio de funcionamento. De facto, como veremos, tambm os ciclos dependem da
vericao de uma condio, normalmente de forma explcita, noutros casos implicita-
mente.
5.2.1 Estruturas de Controlo Do...Loop
Esto disponveis quatro variantes deste ciclo: Do...While e Do...Until, ambas com teste
da condio no princpio ou no m. Vejamos em detalhe as diversas variantes. O uxo-
38
grama da primeira encontra-se na Figura 21:
Figura 21: Estrutura de controlo repetitivo Do...While
Analizando esse uxograma, pode-se observar que tudo roda volta do teste a uma
condio, descrita como condio de funcionamento. Se a condio for verdadeira
na altura em que o teste realizado, as instrues que compem o chamado corpo do
ciclo sero executadas, aps o que novo teste condio ser efectuado. Enquanto a
condio se vericar ser verdadeira, o programa no sair deste ciclo. Na 1
a
vez em que
a condio se mostrar falsa, o ciclo terminar e o programa poder continuar com as
instrues seguintes.
Chama-se corpo do ciclo ao conjunto de instrues que sero executadas em cada
iterao (repetio) do ciclo. Esse conjunto pode incluir qualquer nmero de instrues
e de qualquer tipo, mesmo outras estruturas repetitivas. Neste ltimo caso, etaremos
perante o que se designa por ciclos imbricados ou embutidos, que sero tratados em
detalhe na Seco 5.2.5 na pgina 44.
A sintaxe em VBA desta estrutura de controle a seguinte:
1 Do While condi cao
2 [ i ns t r uc o e s ]
3 Loop
A segunda variante muito semelhante primeira. A grande diferena diz respeito
condio de controle. Neste caso, temos a chamada condio de termo (ou de m) o
que faz com que o ciclo funcione enquanto a condio for falsa ou, por outras palavras,
at que a condio de termo seja verdadeira (Figura 22).
A sintaxe da variante Do...Until ser ento:
1 Do
2 [ i ns t r uc o e s ]
3 Loop Unt i l condi cao
Como se pode deduzir do atrs dito, possvel transformar uma estrutura Do...While
numa Do...Until desde que se substitua a palavra While pela Until e se negue a condio
de controlo. Escolher uma ou outra estrutura de controlo depende, no fundo, do jeito
39
Figura 22: Estrutura de controlo repetitivo Do...Until
do programador e, sobretudo quando se usam condies mltiplas, da forma como a
expresso lgica traduz com maior ou menor facilidade a condio em linguagem corrente.
5.2.2 Ciclos controlados por contador
Usando como base estas duas estruturas de controlo repetitivo possvel construir dois
tipos de ciclos: ciclos controlados por um contador e ciclos controlados por aquilo que
se designa como sentinela. Comecemos pelos primeiro.
Um ciclo controlado por contador baseado na estrutura Do..While pode assumir a
seguinte forma genrica:
1 contador = va l o r _i ni c i a l
2 Do While contador <= val or _f i nal
3 Corpo do Ci cl o
4 contador = contador + 1
5 Loop
Decorrendo do que vimos na seco anterior, torna-se claro que igualmente possvel
construir este ciclo usando a estrutura Do..Until.
H que ter em conta as seguintes questes na construo de um ciclo controlado por
contador usando as estruturas de controlo Do...While ou Do...Until :
Inicializar a varivel contadora
Especicar a condio de funcionamento do ciclo
Incluir no corpo do ciclo uma instruo que incremente ou decremente a varivel
contadora.
Quando se usam estas estruturas, ao contrrio do que se passa com a estrutura de
controlo repetitivo For...To...Next, a analizar na Seco 5.2.4 na pgina 43, da respon-
sabilidade do programador assegurar-se de que tais aces so correctamente executadas
40
Figura 23: Ciclos controlados por contador
conforme est espelhado no diagrama de uxo representado na Figura 23 na pgina pre-
cedente.
Um ltimo aspecto a observar o seguinte: s vivel construir um ciclo controlado
por contador quando possvel conhecer partida o nmero de vezes que ele vai funcionar
ou, por outras palavras, o nmero de repeties necessrias. Isso nem sempre possvel.
Nesses casos, a alternativa ser usar ciclos controlados por sentinela.
5.2.3 Ciclos controlados por sentinela
Quando no possvel conhecer antecipadamente o nmero de vezes que o ciclo dever
ser executado necessrio usar uma tcnica diferente: ciclos controlados por sentinela.
Por sentinela deve entender-se um valor limite que assinala o m de uma dada sequncia
de valores, mas que no esteja includo nesse conjunto de valores.
41
Exemplo
Se o utilizador estiver a introduzir os dados referentes a um conjunto de alunos
identicados pelos seus nmeros de matrcula, a introduo de um nmero com
menos de 6 dgitos (no caso do ISEP) como, por exemplo, o valor 1, permitir
indicar ao programa que a presente sequncia de introduo de dados deve
terminar. Seria esse, neste caso, o valor sentinela escolhido.
Figura 24: Ciclos controlados por sentinela
A seleco do valor sentinela da responsabilidade do programador, devendo ser
escolhido fora do intervalo possvel de valores a introduzir, podendo ainda, ter-se em
ateno a eventual ocorrncia de valores fora desse intervalo que possam resultar de
algum eventual erro de digitao. O valor sentinela escolhido no deve pois ser passvel
de facilmente ocorrer por mero acidente.
Conforme pode ser observado na Figura 24 na pgina anterior um ciclo controlado
por sentinela dever ser precedido da leitura de um elemento da sequncia de valores a
introduzir. As leituras dos restantes valores dessa sequncia sero efectuadas dentro do
42
corpo do ciclo, um em cada iterao. Essa leitura dever, no entanto, ser feita no m do
corpo do ciclo, aps o processameento do valor anteriormente lido. Neste tipo de ciclos, a
leitura e o processamento de cada valor lido andam desfasados de uma iterao do ciclo.
No caso de se usar a estrutura Do..While, o ciclo funcionar enquanto o valor lido for
diferente do valor sentinela escolhido.
O exemplo apresentado acima, poderia ser codicado pelo segmento de programa
seguinte:
1 num = InputBox( " Di gi t e onumero" , "ISEP Mat r i cul as " )
2 Do While numero <> 1
3 I f numero <> 1 Then l s t box1 . AddItem num
4 num = InputBox( " Di gi t e onumero" , "ISEP Mat r i cul as " )
5 Loop
Geralmente o valor sentinela um valor preciso. Existem casos, porm, em que a
sentinela pode ser qualquer valor dentro de uma determinada gama, por exemplo, todos
os nmeros negativos. Um exemplo de um ciclo controlado por uma sentinela com estas
caractersticas apresentado na Seco 5.2.5 na prxima pgina.
5.2.4 Estrutura de Controlo For..To..Next
Este ciclo permite repetir um dado conjunto de instrues um nmero pr-determinado de
vezes. Como vimos na seco anterior, nem sempre possvel saber de antemo quantas
vezes as instrues contidas no corpo do ciclo devem ser repetidas. Nesse caso, devero
ser utilizadas as estruturas de controlo repetitivo estudadas na Seco 5.2.1 na pgina 38.
A sintaxe da estrutura For..To..Next :
1 For contador = va l o r _i ni c i a l To val or _f i nal
2 [ i ns t r uc o e s ]
3 Next
Esta estrutura baseia-se na existncia dum contador que incrementa automaticamente
o contedo da varivel contador, chamada varivel de controlo do ciclo, cada vez
que o ciclo funciona, isto , cada vez que as instrues contidas no corpo do ciclo so
executadas. No incio, contador vai conter o valor inicial e aps valornal - valor
inicial iteraes atingir o valor nal. Nesse momento o ciclo terminar.
A inicializao da varivel contadora, o seu incremento/decremento e a vericao da
condio de funcionamento do ciclo (contador <= m) da responsabilidade da prpria
estrutura de controlo. O programador deve, apenas, especicar qual o valor de incio e
de m (ou, de forma indirecta, o nmero de vezes que o ciclo vai funcionar) e quais as
instrues que o ciclo vai repetir (o corpo do ciclo).
O contedo da varivel de controlo do ciclo pode ser utilizado por instrues contidas
no corpo do ciclo, mas no deve, sob pretexto algum, ser modicado por estas instrues,
sob pena de se perder o controlo do funcionamento do ciclo.
A estrutura de controlo verica no incio de cada iterao (repetio) do ciclo se a
condio de funcionamento do ciclo ainda verdadeira. Caso seja falsa, o ciclo terminar,
e o programa passar a executar as instrues que se lhe seguem.
Pode ainda ser utilizada a seguinte sintaxe alternativa:
43
1 For contador = va l o r _i ni c i a l To val or _f i nal Step passo
2 [ i ns t r uc o e s ]
3 Next
A diferena est na utilizao da palavra Step aps a especicao do valor nal. A
sua incluso opcional: caso se pretenda que o contedo da varivel de controlo seja
incrementada uma unidade de cada vez, desnecessrio especicar o passo. Em caso
contrrio, Step passo permitir incrementar o valor de varivel de um valor diferente da
unidade (positivo ou negativo).
Caso o valor de passo seja positivo a varivel contadora ser incrementada. Se pre-
tendermos, no entanto, efectuar um decremento, dever ser utilizado um valor negativo
para passo. Obviamente, nesse caso, a condio implcita de funcionamento do ciclo
passar a ser contador >= m.
Repara-se que nesta estrutura de controlo, ao contrrio das estudadas anteriormente,
o incremento ou decremento da varivel de controle do ciclo automtico. Outro aspecto
interessante que a condio de funcionamento do ciclo implcita. Ela existe e
vericada mas no especicada de forma explcita pelo programador, apenas de forma
indirecta ao xarem-se os valores inicial e nal da varivel de contagem.
Existe ainda em VBA uma estrutura de controlo que uma variante da For..To..Next
e que opera numa coleco de objectos. Uma coleco um conjunto de objectos idnticos,
pertencentes mesma classe, e que so referenciveis mediante um ndice. Por exemplo,
um Workbook constitudo por um conjunto de objectos da classe Worksheet
14
.
A sintaxe desta estrutura a seguinte:
1 For Each el emento In Col eccao
2 [ i ns t r uc o e s ]
3 Next
O bloco de instrues ser aplicada a cada elemento da coleco de objectos em causa.
A seguir apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo:
Listing 4: FormataBordo - exemplo de sub-rotina usando For..Next
1 Public Sub FormataBordo ( )
2 Dim c e l l Obj e c t As Range
3 For Each c e l l Obj e c t In Se l e c t i o n
4 c e l l Obj e c t . BorderAround Col orIndex : =3 , Weight:=xl Thi ck
5 Next
6 End Sub
criada a varivel cellObject para guardar um objecto do tipo Range (que representa
uma gama de clulas - assunto tratado na Seco 7.3). O ciclo For Each...Next aplica
o mtodo BorderAround a cada uma das clulas contidas na gama representada por
cellObject. Com os argumentos fornecidos no exemplo, este mtodo formata o bordo
dessas clulas a vermelho e uma linha grossa.
14
Por sua vez, um workbook tambm um objecto. Um objecto pode assim ser ele prprio uma
coleco de objectos.
44
5.2.5 Estruturas de controlo repetitivo imbricadas
Foi dito anteriormente que o corpo de um ciclo era constitudo pelo conjunto de instrues
que o ciclo ir executar repetidamente. Foi tambm dito que nesse conjunto de instrues
se poderia incluir qualquer tipo de instrues, mesmo constituindo outras estruturas de
controlo repetitivo. Destes ciclos se diz que se encontram imbricados um dentro do
outro.
Considere-se o problema de calcular uma srie de factoriais de nmeros inteiros. O
clculo de um factorial realizado efectuando uma sucesso de multiplicaes. Ser
necessrio usar um ciclo para o efeito. Por sua vez, se pretendermos repetir esse clculo
um certo nmero de vezes, teremos tambm que usar um ciclo. Teremos assim um
ciclo, chamemos-lhe exterior, que se encarrega de produzir uma sequncia de factoriais
e cujo corpo inclui por sua vez um ciclo, dito interior, que responsvel pelo clculo de
cada factorial. O diagrama de uxo da Figura 25 na pgina precedente representa esta
realidade. O cdigo necessrio para traduzir esse diagrama o seguinte:
Listing 5: Exemplo usando Ciclos Imbricados
1 num = InputBox( " I ntroduza um i n t e i r o po s i t i vo " )
2 Do Unt i l num < 0
3 f a c t o r i a l = 1
4 contador = 1
5 Do Unt i l contador > num
6 f a c t o r i a l = f a c t o r i a l contador
7 contador = contador +1
8 Loop
9 num = InputBox( " I ntroduza um i n t e i r o po s i t i vo " )
10 Loop
O ciclo exterior controlado por uma sentinela, no caso qualquer valor inteiro no
positivo. um exemplo de sentinela constitudo no por um valor especco mas por
uma gama de valores possveis. O ciclo interior calaramente controlado por contador,
funcionando tantas vezes quantas o valor do inteiro cujo factorial se pretende calcular.
5.3 Variveis indexadas - vectores e matrizes
At agora, temos trabalhado essencialmente com variveis que podemos classicar como
individuais (isto , cada varivel podendo conter ao mesmo tempo apenas um s valor).
Como essas variveis no podem conter simultaneamente mais que um dado, a atribuio
de um novo valor a essa varivel implica a destruio do valor anteriormente nela contido.
Mediante a utilizao de um novo tipo de variveis, as variveis do tipo Array (Vector),
passa a ser possvel armazenar na mesma varivel mltiplos valores desde que sejam do
mesmo tipo. Estamos, portanto, a utilizar agora variveis que se podem classicar como
variveis mltiplas. Na Figura 26 na pgina anterior podemos observar representaes
de uma varivel simples do tipo integer e de uma varivel mltipla (um vector uni-
dimensional) contendo valores inteiros. Cada elemento do vector identicado por um
valor numrico especco.
45
Figura 25: Exemplo de Ciclos Imbricados
Um vector uma lista ordenada de variveis simples do mesmo tipo. Pode tambm ser
visto como um conjunto de variveis simples agrupadas. Todos as variveis membros desse
vector partilham o mesmo nome (o nome do vector). So identicadas individualmente
mediante o valor dum ndice, que determina qual a sua posio dentro do vector. por
isso que estas variveis so conhecidas por variveis indexadas.
Os valores do ndice devem obrigatoriamente ser do tipo Integer. O primeiro valor do
ndice zero
15
.
Um elemento de um vector identicado utilizando o nome do vector seguido do valor
do ndice dentro de parntesis
nome_vector(indice)
Exemplos:
var_Multipla(3) 4
o
elemento do vector var_Multipla
var_Multipla(7) 8
o
e ltimo elemento do vector var_Multipla
notas(14) 15
o
elemento do vector notas
nomes(0) 1
o
elemento do vector nomes
15
possvel forar que os ndices dos vectores comecem do valor 1 usando a directiva Option Base 1.
46
Figura 26: Um vector uma varivel mltipla
Figura 27: Um exemplo de vector de strings
Os elementos de um vector no tm que ser inteiros, nem sequer valores numricos.
Na Figura 27 na pgina precedente representado um vector contendo strings (texto).
Considerando o vector como armazenado os nomes dos membros de uma equipa de fu-
tebol, os sucessivos valores do ndice podem ser vistos como os correspondentes nmeros
das suas camisolas. Note-se que estamos, neste caso, a forar os valores do ndice a iniciar
em 1.
5.3.1 Declarao de vectores
Como qualquer outra varivel, uma varivel do tipo Array deve tambm ser declarada
(criada) antes de poder ser usada. Para tal, deve ser usada a instruo Dim, que reserva
espao em memria suciente para armazenar o nmero previsto de elementos do vector
16
. Uma das formas de utilizar a instruo Dim para declarar vectores a seguinte:
Dim nome_vector(num_elementos) As Tipo
Exemplos:
Dim var_Multipla(8) As Integer
16
Adicionalmente, a instruo Dim atribui valores iniciais a todos os elementos do vector (zeros no
caso de vectores numricos e strings nulas no caso de vectores alfa-numricos).
47
Dim notas(30) As Single
Dim nomes(100) As String
Nota: num_elementos no se refere ao valor mximo que a varivel ndice pode
assumir (7, no caso do vector var_Multipla) mas sim ao nmero de elementos do
vector (8, neste caso). Por este processo, a declarao do limite inferior faz-se de forma
implcita: por defeito assume-se como limite inferior do ndice o valor zero (ou 1 se tal
for especicado mediante a instruo Option Base 1).
Uma forma alternativa de utilizar a instruo Dim para declarar vectores implica a
utilizao da palavra reservada To, permitindo especicar o menor e o maior valor que o
ndice pode assumir:
Dim nome_vector(menorIndice To maiorIndice) As Tipo
Exemplos:
Dim numeros(100 To 200) As Double
Dim valores(-100 to 100) As Single
5.3.2 Processamento de vectores
Sendo um vector uma varivel mltipla composta de elementos do mesmo tipo agrupados
na mesma estrutura, a forma mais adequada de executar uma mesma aco sobre uma
parte ou a totalidade dos seus elementos utilizar uma estrutura de controlo repetitivo
ou ciclo.
Para perceber de forma mais clara o porqu da armao contida no pargrafo an-
terior, observe-se o problema descrito na Figura 28 na pgina anterior e atente-se nas
diferentes solues propostas.
Quando confrontado com o problema de armazenar e actualizar a informao relativa
ao preo de 100 produtos, um programador poderia ser tentado a criar 100 variveis
individuais para guardar cada um desses preos. Isso, no entanto, obrig-lo-ia a incluir
no seu programa 100 instrues Dim para criar outras tantas variveis individuais. Por
outro lado, quando necessitasse de actualizar os preos em, por exemplo, 5%, teria que
inserir 100 instrues do tipo preoN = preoN * 1,05.
Do atrs exposto facilmente se vericar que esta soluo no tem qualquer exequi-
bilidade prtica. Analizemos ento a soluo alternativa usando uma varivel indexada:
em vez de 100 variveis individuais teremos apenas um vector de 100 elementos, cada ele-
mento capaz de armazenar o preo de um produto. Consequentemente, teremos apenas
uma instruo Dim, no caso, algo como Dim preos As single. E quando necessitar
de actualizar os preos, como o vector uma varivel mltipla indexada, haver apenas
que construir um ciclo que percorra automticamente o vector, actualizando cada um dos
seus elementos.
Listing 6: Exemplo de processamento de um vector
1 Private Sub cmdGo_Click ( )
2 Dim vect or Sqr ( 100) As Double
3 Dim i As Integer
48
Figura 28: Porqu usar ciclos para processar vectores?
4 Dim r e s As Si ngl e
5 l s t Tabe l a . Clear
6 For i = 0 To txtMai or
7 r e s = Sqr( i )
8 vect or Sqr ( i ) = r e s
9 l s t Tabe l a . AddItem Format( res , " 0. 000 " )
10 Next i
11 End Sub
O programa descrito na Listagem 6 na pgina precedente permite calcular e apresentar
sob a forma de uma tabela as razes quadradas de todos os nmeros inteiros compreendidos
entre 0 e um dado limite superior a especicar pelo utilizador na TextBox txtMaior (a
largura do intervalo no deve exceder 100, visto ser esta a dimenso do vector). Os valores
calculados so armazenados num vector para eventual futura utilizao.
Listing 7: Outro exemplo de processamento de um vector
1 Private Sub cmdGo_Click ( )
2 Dim vect or ( 100) As Double
3 Dim i As Integer
4 Dim i ndi c e As Integer
5 Dim r e s As Si ngl e
6 Dim l i nha As String
7 l s t Tabe l a . Clear
8 i ndi c e = 0
49
9 For i = txtMenor To txtMai or
10 r e s = Sqr( i )
11 vect or ( i ndi c e ) = r e s
12 l i nha = Format( Str ( i ) , "##0" ) + "" + _
13 Format( vect or ( i ndi c e ) , " 000. 000 " )
14 l s t Tabe l a . AddItem l i nha
15 i ndi c e = i ndi c e + 1
16 Next i
17 End Sub
Na variante desta sub-rotina, contida no exemplo descrito na Listagem 7 na pgina
anterior, possvel especicar tambm o limite inferior do intervalo, para alm de se
demonstrarem algumas tcnicas de formatao da sada de dados.
De notar que na primeira verso do programa se usou a mesma varivel i para controlar
o ciclo For e para armazenar os valores dos ndices do vector. Tal aconteceu porque foi
possvel estabelecer naquele caso uma correspondncia directa entre os valores da varivel
de controlo do ciclo i e os valores do ndice que controla as posies dos elementos do
vector.
J na segunda variante do programa tal no era possvel, visto que a varivel de con-
trolo do ciclo iria conter valores (desde o limite inferior ao limite superior do intervalo) que
no deveriam corresponder s posies do vector em que o armazenamento dos resultados
se iria efectuar.
Em qualquer das variantes apresentadas, o processamento dos elementos do vector
consistiu em operaes de escrita (de atribuio) que modicaram o seu valor. igual-
mente possvel efectuar operaes de leitura sobre todos ou parte dos elementos dum
vector. Neste caso, como bvio, a varivel do tipo Array dever encontrar-se do lado
direito de uma operao de atribuio:
var = vector(indice)
A instruo acima copia o contedo de vector na posio ndice para a varivel var.
6 Funes e Procedimentos
As sub-rotinas descritas nos exemplos que tm sido apresentados destinam-se a executar
tarefas. Por exemplo, as rotinas descritas na Seco 2.6 na pgina 12 tm como objectivo
a monitorizao dos valores contidos em determinadas clulas da folha de clculo. Este
tipo de sub-rotinas designado por procedimentos. Destinam-se a realizar tarefas e no
devolvem qualquer resultado.
No entanto, no possvel utilizar estes procedimentos em frmulas duma folha de
clculo, ao contrrio do que acontece com as funes standard disponveis no Excel, como
seja a funo If referida atrs, ou a funo Sum, que calcula a soma do contedo numrico
das vrias clulas contidas numa dada gama. Isso acontece porque, para poderem ser
utilizadas em frmulas, elas tero que ser estruturadas como funes, e comportarem-se
de maneira idntica das funes standard.
Uma funo, seja ela pr-existente no Excel, ou criada pelo utilizador, deve poder
50
receber a informao de que necessita, e de conseguir devolver o resultado do seu trabalho,
de modo a esse resultado poder ser utilizado na frmula ou expresso que a utilize. Para
tal, tem que possuir uma estrutura denida pela sintaxe seguinte:
1 Function Nome ( argumento1 , argumento2 , . . . )
2 Li s t a de i ns t r uc oe s
3 Nome = r e s ul t ado
4 End Function
Repare-se que para alm das diferenas bvias no cabealho e no delimitador nal em
relao s sub-rotinas estudadas atrs, verica-se o seguinte:
1. A seguir ao nome da funo e entre parnteses encontra-se uma lista de argumen-
tos, atravs dos quais a funo vai receber as informaes essenciais realizao do seu
trabalho.
2. O resultado dos clculos efectuados ser entregue frmula ou expresso que
invocou a funo, depositando-o no seu prprio nome, como se este fosse uma varivel.
Atentemos na seguinte frmula:
= 10 * sin(angulo)
Para calcular a frmula, ir-se- multiplicar por 10 o resultado fornecido pela funo
standard sin. Esta, por sua vez, para poder fornecer o resultado dever ter recebido a
informao de qual o ngulo (neste caso em radianos) de que se quer calcular o seno.
Quando a funo termina o seu trabalho, deixar o resultado do seu clculo no lugar que
ocupava na frmula.
Figura 29: Funes como caixas pretas
Para o utilizador da funo, no interessa conhecer o seu funcionamento interno, mas
apenas qual a informao que lhe tem que fornecer e qual o tipo de resultado esperado.
Assim sendo, pode dizer-se que do ponto de vista do utilizador da funo, ela se comporta
como uma caixa preta, qual fornecida informao e que, com base nela, produz um
resultado (Figura 29 na pgina anterior).
51
6.1 Exemplo de funo criada pelo programador
Vamos agora criar uma funo que permita calcular a margem de lucro percentual de um
determinado produto sabendo o seu custo e o seu preo de venda. Supe-se que esses
dados se encontraro previamente armazenados em duas clulas da folha de clculo. Uma
soluo possvel ser a seguinte:
Listing 8: Funo margemLucro
1 Public Function margemLucro ( venda , cus t o )
2 margemLucro = ( venda cus t o ) / venda
3 End Function
Observe-se que esta funo possui dois parmetros de entrada, venda e custo, atravs
dos quais receber os dados correspondentes. Note-se ainda que o resultado da expresso
que calcula a margem de lucro atribudo directamente ao prprio nome da funo.
esse o processo pelo qual uma funo consegue fornecer o resultado do seu trabalho
entidade que a invocou.
Esta funo poder ser utilizada em qualquer frmula contida numa clula da folha de
clculo, das mesma maneira que qualquer das funes pr-existentes o seria. Um exemplo
de uma frmula utilizando esta funo seria a descrita na Figura 30.
Figura 30: Utilizao da funo margemLucro numa frmula
A frmula, que pode ser consultada na barra de frmulas da imagem apresentada na
Figura 30 na pgina 52, contem referncias s clulas D3 e D2, em que esto contidos,
respectivamente, o preo de venda e o custo do produto. Quando a funo invocada,
cpias do contedo destas duas clulas so passadas funo. Esta recebe-os atravs
dos parmetros de entrada respectivos, venda e custo. O resultado do seu clculo ser
deixado na frmula, quando a funo termina o seu trabalho.
6.2 Como aceder s funes standard do Excel
Se bem que o VBA possua vrias dezenas de funes pr-denidas, muito conveniente
poder utilizar num macro qualquer uma das centenas de funes standard oferecidas pelo
Excel. Para poder aceder a elas a partir do VBA necessrio utilizar a propriedade
WorsheetFunction do objecto Application
17
. Por exemplo, para, num macro, calcular o
17
Claro que s as funes do Excel que no se encontram duplicadas no VBA podem ser acedidas por
meio da propriedade WorsheetFunction.
52
valor mdio de uma gama de clulas (identicada pelo nome "Dados") poderia ser usada
a seguinte instruo:
med = Application.WorksheetFunction.Average(Range("Dados"))
Esta instruo permite aceder funo standard Average do Excel, qual fornecido
um objecto do tipo Range, representando a gama de clulas descritas sob o nome "Dados".
7 Programao do Excel usando VBA
Nesta seco vamos aprender a trabalhar com os objectos do Excel mais comuns: o Work-
book (Livro de trabalho), a Worksheet (Folha de clculo) e o Range (gama de clulas). So
objectos que pertencem, por sua vez, ao objecto principal que a Application (Aplicao,
neste caso, o prprio Excel).
7.1 Trabalhar com objectos Workbook
Usando estes objectos, o VBA pode criar novos livros de trabalho, abrir ou fechar exis-
tentes, entre outras aces possveis. Para especicar qual o livro de trabalho com que
queremos trabalhar podemos faz-lo de trs maneiras diferentes:
Usando o objecto Workbooks que representa o conjunto dos cheiros Excel abertos
naquele momento (Workbooks(Nome));
Usando o objecto ActiveWorkbook que representa o cheiro com que se est de
momento a trabalhar;
Usando o objecto ThisWorkbook que representa o cheiro em que o prprio pro-
grama em VBA (e no o utilizador) est a operar.
Para abrir um Livro de Trabalho aplica-se o mtodo Open ao objecto Workbooks:
Sintaxe:
Workbooks.Open Nome_do_cheiro
Exemplo:
Workbooks.Open "C : \Documentos\Excel\Dados.xls"
Os mtodos Save e Close so utilizados de forma similar para salvaguardar o contedo
dum cheiro e para o fechar, respectivamente.
7.2 Trabalhar com objectos Worksheet
Normalmente um livro de trabalho possui mais do que uma folha de clculo ( normal-
mente criado logo partida com trs). Para escolher qual a folha de clculo com que se
pretende trabalhar usa-se o objecto Worksheets especicando um ndice ou o nome da
folha de clculo em causa, conforme se exemplica a seguir:
Worksheets(2)
53
Worksheets("Custos")
7.2.1 Propriedades de Worksheet
Nesta seco so referidas algumas das suas propriedades mais teis:
Worksheet.Name - permite mudar ou obter o nome da folha de clculo. O exemplo
abaixo muda o nome de "Folha 1" para "Medidas":
Worksheets("Folha 1").Name = "Medidas"
Worksheet.StandardWidth - permite especicar a largura standard das colunas duma
folha de clculo.
7.2.2 Mtodos de Worksheet
Eis alguns dos mtodos normalmente aplicados a este tipo de objectos:
Worksheet.Activate - torna activa a folha de clculo especicada
18
. O exemplo
seguinte torna activa a folha de clculo "Custos" do livro de trabalho "Dados 2007":
Workbook("Dados 2007").Worksheets("Custos").Activate
Worksheet.Copy - copia a folha de clculo especicada para outra posio dentro
do livro de trabalho.
Sintaxe:
Worksheet.Copy [Position]
O argumento Position opcional e pode ter o valor Before ou After indicando a
posio onde a cpia ser inserida. Caso o argumento no seja includo, a cpia
ser inserida num novo livro de trabalho.
Exemplo:
Worksheets(2).Copy After:=Worksheets(3)
O exemplo anterior faz uma cpia da 2
a
folha de clculo e insere-a a seguir 3
a
.
O mtodo Move usa uma sintaxe idntica para mover uma determinada folha de
clculo para outra posio.
Worksheet.Delete - permite eliminar a folha de clculo especicada.
18
A folha de clculo activa aquela que est visvel no momento.
54
Worksheet.Add - permite acrescentar uma nova folha de clculo ao livro de trabalho.
Sintaxe:
Worksheet.Add [Position]
Tambm aqui o argumento Position opcional. Se for omitido, a nova folha de
clculo ser inserida imediatamente antes da folha activa.
Exemplo:
Worksheets.Add After:=Worksheets("Medidas")
7.3 Trabalhar com objectos Range
Um objecto do tipo Range pode representar uma simples clula, um conjunto de clulas,
uma linha ou uma coluna. No existe em VBA um objecto especco para representar
uma clula individual.
Para nos referirmos a uma clula ou gama de clulas podemos aplicar o mtodo Range
ao objecto Worksheet usando uma de duas sintaxes possveis:
Sintaxe 1:
Worksheet.Range(Nome)
Sintaxe 2:
Worksheet.Range(Celula1, Celula2)
A 1
a
sintaxe usa nomes de gamas pr-denidos
19
, enquanto que a 2
a
utiliza as re-
ferncias das clulas que denem os dois vrtices opostos da rea rectangular contendo
as clulas que se quer especicar. Caso se omita Worksheet em qualquer das sintaxes
anteriores, o VBA pressupe que se trata da folha de clculo activa naquele momento.
Exemplos:
Range("C5").Value = 100
Range("D1","D10").Value = 0
Worksheets(3).Range("Dados").ClearContents
O 1
o
exemplo guarda o valor 100 na clula C5. O 2
o
exemplo atribui o valor zero
a todas as clulas da gama D1 a D10. Nestes dois exemplos utilizada a propriedade
Value dos objectos Range que permite conhecer ou modicar o seu valor. No 3
o
exemplo
limpa-se o contedo das clulas da gama "Dados" da 3
a
folha de clculo, mediante a
aplicao do mtodo ClearContents.
Caso queiramos identicar apenas uma clula podemos tambm utilizar o mtodo
Cells.
Sintaxe:
Objecto.Cells(Linha,Coluna)
19
Atribudos em Excel usando o Menu "Insert/Name/Dene".
55
Na sintaxe acima, a entidadeObjecto pode ser um objecto Worksheet ou Range. A sua
omisso, leva o VBA a partir do princpio que se trata da folha de clculo activa. Linha
e Coluna so valores numricos indicando qual a linha e qual a coluna na interseco das
quais a clula se encontra
20
. Veja-se o seguinte exemplo:
1 For col una = 2 To 13
2 Ce l l s ( 2 , Coluna ) . Value = "Mes" & col una 1
3 Next
O exemplo acima usa um ciclo For...To para preencher todas as clulas da gama C2 a
C13 com o texto "Ms X" em que X o n
o
do ms. usado o operador de concatenao
de strings & para efectuar a colagem.
Caso se pretenda identicar uma linha ou coluna completa, podem ser utilizados os
mtodos Rows e Columns.
Sintaxe:
Objecto.Rows(Indice)
Objecto.Columns(Indice)
Para ilustrar a utilizao do mtodo Rows atente-se no seguinte exemplo de sub-
rotina
21
:
Listing 9: Sub-rotina InsereLinhas
1 Sub I ns er eLi nhas ( gama As Range , num As Integer )
2 Dim num_linhas As Integer , ul ti ma_l i nha As Integer
3 Dim i As Integer
4 With gama
5 num_linhas = . Rows . Count
6 ul ti ma_l i nha = . Rows( num_linhas ) . Row
7 For i = 1 To num
8 . Rows( ul ti ma_l i nha + i ) . I ns e r t
9 Next
10 End With
11 End Sub
Esta sub-rotina recebe como argumentos uma gama de clulas (um objecto do tipo
Range) e um inteiro especicando o nmero de linhas a inserir abaixo da ltima linha
dessa gama. A estrutura With...End...With muito prtica porque permite executar
um conjunto de instrues sobre um determinado objecto, neste caso qualquer objecto
Range que a sub-rotina receba como argumento. Dentro da estrutura With...End...With
omite-se qualquer referncia a esse objecto, usando-se apenas os seus mtodos e propri-
edades. Assim, .Rows.Count refere-se ao nmero total de linhas da gama especicada
e .Rows(num_linhas).Row fornece-nos o ndice da ltima linha dessa gama. O ciclo
For...To repete num vezes a aplicao do mtodo Insert ultima linha da gama.
Para testar a sub-rotina InsereLinhas, use-se a seguinte rotina de teste:
20
Se o objecto for do tipo Range, os argumentos Linha e Coluna referir-se-o linha e coluna dentro
da gama de clulas especicada.
21
Adaptado de um exemplo contido em [1].
56
1 Sub i ns e r e Te s t e ( )
2 I ns er eLi nhas Worksheets ( 3 ) . Range ( "Dados" ) , 3
3 End Sub
Apresentamos outro exemplo, agora referido ao mtodo Columns:
Columns(5).ColumnWidth = 15
Aplicando o mtodo Columns ao objecto Columns(5) (a coluna de ndice 5, ou seja,
a coluna E) o efeito obtido a mudana da sua largura para 15.
8 Adicionando uma interface grca
O acesso aos macros faz-se, conforme referido na Seco 2.3, mediante a combinao de
teclas ALT-F8. Pode ainda associar-se a um macro uma combinao de teclas especial
que permite accion-lo directamente. No entanto, em muitos casos, mais conveniente
poder interagir com o macro atravs de uma interface prpria, concebida especialmente
para ele. Usam-se para o efeito objectos grcos como Dialog Boxes (Caixas de Dilogo)
desenhadas medida, que so verses mais desenvolvidas das j conhecidas Input Boxes
e Message Boxes.
Vamos nesta seco ver como construir as nossas prprias Dialog Boxes usando ob-
jectos da classe UserForm e como as integrar numa aplicao em VBA.
8.1 Instalao da Form
Uma Form uma janela, em si mesma um objecto, utilizada como um contentor para
outros objectos grcos (ver Seco 4.3.3 na pgina 28). Pode-se criar um objecto da
classe UserForm no Editor do VBA atravs do Menu "Insert/User Form".
Na Figura 31 na pgina anterior pode-se ver uma Form vazia e uma caixa de fer-
ramentas (Toolbox) contendo os vrios controlos (objectos grcos) disponveis para a
construo da interface. Pode ainda ver-se no canto inferior esquerdo a Janela de Propri-
edades, atravs da qual possvel manipular vrias caractersticas da Form (como, alis,
de qualquer controlo que esteja seleccionado). A seguir so apresentadas algumas das
principais propriedades que podem ser conguradas numa Form:
Name - especica o nome pelo qual a Form ser identicada
Caption - especica o ttulo que gura no topo da Form
BackColor - permite seleccionar a cor do fundo
Enabled - controla a utilizao da Form pelo utilizador
ShowModal - permite alterar o comportamento da Form de modo a controlar o
acesso aplicao enquanto a Form estiver activa
Font - controla o tipo e tamanho da letra utilizada
Height - especica a altura da Form
Width - especica a largura da Form
57
Figura 31: Criao de uma Form no VBA
8.2 Instalao dos Controlos
Usando a Caixa de Ferramentas Toolbox, possvel escolher e instalar os controlos na
Form. Para o efeito, basta accionar o smbolo do controlo pretendido e desenh-lo com
o rato na Form. A seguir, quer agindo directamente sobre o controlo, quer utilizando a
Janela de Propriedades, podem-se fazer os ajustes necessrios das suas caractersticas. Se
bem que cada classe de controlos possua a sua lista especca de propriedades, existem
algumas propriedades importantes que so comuns maioria delas:
Name - especica o nome pelo qual o controlo ser identicado no programa
Caption - especica o texto apresentado pelo controlo
BackColor - permite seleccionar a cor do fundo
Enabled - controla a utilizao do objecto pelo utilizador da interface
Height - especica a altura do controlo
Width - especica a sua largura
Visible - especica se o controlo est ou no visvel
58
Conforme referido na Seco 4.3 na pgina 25 no ambiente de desenvolvimento do
VBA encontram-se disponveis diversos tipos de controlos: botes de comando (Command
Buttons), etiquetas (Labels), caixas de texto (Text Boxes), quadros (Frames), botes de
opo (Option Buttons), caixas de vericao (Check Boxes) e caixas de listagem (List
Boxes), entre outros.
8.3 Incorporao da Form na sub-rotina
Nesta fase h trs aspectos a considerar:
1. Visualizao da Form
2. Tratamento dos eventos que ocorram enquanto a Form estiver visvel
3. Processamento dos resultados fornecidos pela Form
O 2
o
ponto, referente ao tratamento dos eventos, foi j discutido anteriormente. Os
restantes sero tratados nas seces seguintes.
8.3.1 Como visualizar e terminar uma Form
Para visualizar a UserForm usa-se o mtodo Show:
1 Exemplo :
2 MinhaForm. Show
Se, em alternativa, se pretender arrancar com a Form mas sem a visualizar nesse
momento, usa-se a instruo Load:
1 Exemplo :
2 Load MinhaForm
Quando se pretender tornar a Form visvel, aplicar-se- ento o mtodo Show.
Aps a sua utilizao, quando uma Form deixar de ser necessria, deve-se utilizar a
instruo Unload para a desactivar:
1 Exemplo :
2 Unload Me
No entanto, desactivar uma Form atravs da instruo Unload no implica que esta
deixe de estar em memria. Para garantir a sua efectiva remoo, que se traduzir na
gerao do evento Terminate, haver que se usar a seguinte tcnica:
1 Exemplo :
2 Set MinhaForm = Nothi ng
8.3.2 Tratamento de eventos atravs de Event Handlers
Este tema foi j introduzido na Seco 4.1.3 na pgina 21. Pelo menos um Event Handler
deve ser associado a um controlo instalado na form. Vamos agora considerar o exemplo de
Event Handler utilizando a instruo Unload Me e associado a um controlo (normalmente
59
um boto de comando) presente na Form. Nesta instruo, a palavra Me indica ao VBA
que a Form a desactivar ser aquela a que o Event Handler diz respeito.
Um exemplo de um Event Handler que termine uma Form pode ser:
Listing 10: Handler do objecto cmdFechar para o evento click
1 Private Sub cmdFechar_Click ( )
2 Dim op As Integer
3 op = MsgBox( " Sai r ?( Yes/No) " , vbYesNo + vbQuesti on )
4 I f op = vbYes Then
5 Unload Me
6 End I f
7 End Sub
A sub-rotina acima vai especicar a reaco do boto de comando cmdFechar ao
evento Click, neste caso apresentar uma Msg Box que conrme a inteno do utilizador
de fechar a Form. O tratamento de qualquer evento a ocorrer na Form, ou em qualquer
dos controlos nela presentes, dever basear-se num Event Handler que dena a resposta
adequada.
Outro evento importante o Change que ocorre sempre que se altera o contedo de
objectos como as Text Box. Na Seco 8.4 na pgina 63 encontra-se um exemplo de um
Event Handler associado a este tipo de evento.
8.3.3 Como recolher os resultados de uma Form
Uma UserForm muitas vezes utilizada para pedir informao ao utilizador. Nesse caso,
ser necessrio recolher os dados introduzidos ou as opes seleccionadas nos controlos
apropriados.
Para tal preciso aceder s propriedades Value dos diversos controlos existentes na
Form e copiar os seus valores actuais para clulas da folha de clculo.
O contedo da propriedade Value nas principais classes de controlos encontra-se re-
sumida na seguinte tabela:
Classe Contedo
CheckBox True ou False conforme esteja ou no activada
OptionButton True ou False conforme esteja ou no activada
ListBox A posio da linha seleccionada
TextBox O contedo da TextBox (pode-se tambm usar a propriedade Text)
TabStrip Um inteiro indicando qual a Tab que est activa
Note-se que nas List Boxes em VBA a 1
a
linha tem a posio 1, ao contrrio do que
se passa em Visual Basic, em que comea na posio 0.
8.3.4 Exemplo de aplicao
Vamos nalmente aplicar estes conceitos e tcnicas na construo e integrao de uma
UserForm (descrita na Figura 32 na pgina seguinte) que permita a introduo conjunta
60
dos dados de um aluno (Nome, Nmero e Curso) sem necessidade de recorrer a trs Input
Boxes separadas.
Esta UserForm conter duas Text Boxes para insero do Nome e Nmero do aluno e
uma Combo Box para seleco do seu Curso. Uma Combo Box um controlo semelhante
a uma List Box em que a lista est normalmente invisvel, s aparecendo quando o campo
superior activado. Aplicam-se-lhe os mesmos mtodos da classe ListBox.
Listing 11: Exemplo de sub-rotina de invocao de uma UserForm
1 Public Sub testUserFormInput ( )
2 usrFrmInput . Show
3 Set usrFrmInput = Nothi ng
4 End Sub
O macro da Listagem 11 na pgina 60 chama a UserForm com o nome usrFrmInput e
remove-a de memria quando ela termine o seu trabalho. Para facilitar a sua invocao,
conveniente associar ao macro uma combinao de teclas especca, usando uma das
tcnicas j aprendidas (ver parte nal da Seco 2.6).
Listing 12: Exemplo de sub-rotina de inicializao de uma UserForm
1 Private Sub Us er For m_I ni t i al i ze ( )
2 cmbCursos . AddItem " Ci vi l "
3 cmbCursos . AddItem " I nf or mat i ca "
4 cmbCursos . AddItem " El e c t r ot e c ni a "
5 cmbCursos . AddItem " Geotecni a "
6 cmbCursos . AddItem "Quimica"
7 cmbCursos . AddItem " Instrumentacao Medica"
8 End Sub
Figura 32: A UserForm para Entrada Mltipla de Dados
61
Esta sub-rotina especial, que executada automaticamente quando a UserForm ar-
ranca, trata de inicializar a Combo Box "cmbCursos" com os nomes dos diferentes cursos
da escola.
Listing 13: Handler do objecto cmdFechar para o evento Click
1 Private Sub cmdFechar_Click ( )
2 With Worksheets ( 4)
3 . [ H5] = txtNome . Value
4 . [ I 5 ] = txtNum. Value
5 . [ J5 ] = cmbCursos . Text
6 End With
7 Unload Me
8 End Sub
Este Event Handler est associado ao boto cmdFechar e chamado quando sobre
ele ocorre o evento Click. Antes de fechar a UserForm usando Unload, copia o contedo
das duas Text Box e o da linha seleccionada da Combo Box para trs clulas contguas
da folha de clculo.
8.4 Exemplo de aplicao mais elaborado
Neste exemplo mais elaborado vamos introduzir o controlo Tabstrip existente no VBA.
Este objecto permite a apresentao de diferentes conjuntos de valores mediante a seleco
de diferentes separadores ("tabs"). Na Figura 33 na pgina 62 pode-se encontrar um
exemplo de um objecto deste tipo.
Figura 33: Objecto da classe Tabstrip
Numa Tabstrip usual inserirem-se outros controlos, um pouco como se faria numa
mini-Form ou num quadro. No exemplo da gura, encontram-se trs TextBox.
Conforme referido na Seco 4.1, para que um controlo possa reagir a aces pro-
vocadas pelo utilizador, como o "clicar" do rato, preciso que o programador crie sub-
62
programas especiais, chamados Event Handlers e que esses sub-programas sejam associ-
ados aos controlos respectivos.
Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitem
especicar o comportamento de controlos em face de certos eventos. Em 1
o
lugar,
apresentar-se- o Event Handler da form "UserForm2" para o evento Initialize, que ocorre
quando a form criada aps o arranque do programa:
Listing 14: Sub-rotina de inicializao da UserForm
1 Private Sub Us er For m_I ni t i al i ze ( )
2 With TabStri p1
3 . Tabs ( 0 ) . Capti on = " Ci vi l "
4 . Tabs ( 1 ) . Capti on = " I nf or mat i ca "
5 . Tabs .Add " El e c t r ot e c ni a "
6 End With
7 With Worksheets ( 4)
8 txtNumAlunos . Text = . [ D5]
9 txtPercAprov . Text = . [ D6] 100
10 txtMedi a . Text = . [ D7]
11 End With
12 End Sub
Este procedimento vai inicializar os dois separadores do controlo Tabstrip1 com que
ele criado por defeito, mudando-lhe os nomes para "Civil" e "Informtica". De seguida,
acrescenta um terceiro separador e d-lhe o nome "Electrotecnia". Por m, so atribudos
a cada uma das TextBox contidas na Tabstrip1 os contedos das trs clulas da folha de
clculo referentes ao curso referente ao 1
o
separador.
O prximo procedimento o Event Handler do controlo Tabstrip1 para o evento
Change que ocorre sempre que alguma alterao ocorre nesse controlo, concretamente,
uma mudana de separador activo.
Listing 15: Handler associado ao objecto Tabstrip1 para o evento Change
1 Private Sub TabStrip1_Change ( )
2 Dim v As Integer
3 With Worksheets ( 4)
4 v = TabStri p1 . Value
5 I f v = 0 Then
6 txtNumAlunos = . [ D5]
7 txtPercAprov = . [ D6] 100
8 txtMedi a = . [ D7]
9 El seIf v = 1 Then
10 txtNumAlunos = . [ E5 ]
11 txtPercAprov = . [ E6 ] 100
12 txtMedi a = . [ E7 ]
13 Else
14 txtNumAlunos = . [ F5 ]
15 txtPercAprov = . [ F6 ] 100
63
16 txtMedi a = . [ F7 ]
17 End I f
18 End With
19 End Sub
A propriedade Value dos objectos Tabstrip contem um valor numrico inteiro que
traduz qual o separador que est activo. Em funo do valor recolhido na varivel v, a
estrutura condicional imbricada If...Then...Else ir escolher o conjunto de valores corres-
pondente.
9 Notas nais
Parte da estrutura e alguns dos exemplos apresentados foram inspirados no livro de Paul
McFreddies[1]. Foram ainda reutilizados e adaptados materiais contidos na Sebenta de
Introduo Computao da minha autoria[2].
Referncias
[1] Paul McFredies. VBA for the Microsoft Oce System, QUE.
[2] Antnio Silva. Sebenta de Introduo Computao - Visual Basic, ISEP.
64