Anda di halaman 1dari 64

Programao em VBA

Texto Introdutrio
Antnio Silva
DEI-Isep
2009-10-28

Contedo
1 Introduo

2 Conceitos Bsicos
2.1 O que um Macro? . . . . . . . . .
2.2 Tcnicas de construo dum Macro
2.3 Gravao de um Macro . . . . . . .
2.4 A escrita de um Macro . . . . . . .
2.5 O editor de VBA . . . . . . . . . .
2.6 Criao de um Macro . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

8
8
9
9
10
11
12

3 Variveis e Tipos de Dados


3.1 Conceito de varivel . . .
3.2 Criao das variveis . . .
3.3 Tipos de Dados . . . . . .
3.4 A operao de Atribuio
3.5 O uso de constantes . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

14
14
14
16
17
18

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

19
20
20
21
21
23
23
24
25
25
27
28
28
29
29
30
31
31
32

.
.
.
.
.
.
.

34
34
34
35
37
38
38
40

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

4 Como trabalhar com Objectos


4.1 Propriedades, Mtodos e Eventos . . . . . . . .
4.1.1 Propriedades . . . . . . . . . . . . . . .
4.1.2 Mtodos . . . . . . . . . . . . . . . . . .
4.1.3 Eventos . . . . . . . . . . . . . . . . . .
4.2 Os objectos do Excel mais comuns . . . . . . . .
4.2.1 Como trabalhar com as propriedades dos
4.2.2 Como aplicar mtodos aos objectos . . .
4.3 Objectos grficos . . . . . . . . . . . . . . . . .
4.3.1 MsgBox . . . . . . . . . . . . . . . . . .
4.3.2 InputBox . . . . . . . . . . . . . . . . .
4.3.3 Forms . . . . . . . . . . . . . . . . . . .
4.3.4 Botes de Comando . . . . . . . . . . .
4.3.5 Rtulos . . . . . . . . . . . . . . . . . .
4.3.6 Caixas de Texto . . . . . . . . . . . . . .
4.3.7 Botes de Opo . . . . . . . . . . . . .
4.3.8 Caixas de Verificao . . . . . . . . . . .
4.3.9 Quadros (Frames) . . . . . . . . . . . .
4.3.10 Caixas de Listagem . . . . . . . . . . . .
5 Estruturas de controlo do programa
5.1 Estruturas de controlo condicional . . . . .
5.1.1 If...Then...Else . . . . . . . . . . .
5.1.2 If...Then . . . . . . . . . . . . . . .
5.1.3 Estruturas condicionais embutidas .
5.2 Estruturas de controlo repetitivo . . . . .
5.2.1 Estruturas de Controlo Do...Loop .
5.2.2 Ciclos controlados por contador . .
3

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
objectos Excel
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

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

.
.
.
.
.
.
.

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

.
.
.
.
.
.
.

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

.
.
.
.
.
.
.

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

.
.
.
.
.
.
.

.
.
.
.
.
.

41
43
44
46
47
48

6 Funes e Procedimentos
6.1 Exemplo de funo criada pelo programador . . . . . . . . . . . . . . . .
6.2 Como aceder s funes standard do Excel . . . . . . . . . . . . . . . . .

50
51
52

7 Programao do Excel usando VBA


7.1 Trabalhar com objectos Workbook .
7.2 Trabalhar com objectos Worksheet
7.2.1 Propriedades de Worksheet .
7.2.2 Mtodos de Worksheet . . .
7.3 Trabalhar com objectos Range . . .

.
.
.
.
.

52
53
53
53
54
54

.
.
.
.
.
.
.
.

56
57
58
58
59
59
60
60
62

5.3

5.2.3 Ciclos controlados por sentinela . . . . . . .


5.2.4 Estrutura de Controlo For..To..Next . . . . .
5.2.5 Estruturas de controlo repetitivo imbricadas
Variveis indexadas - vectores e matrizes . . . . . .
5.3.1 Declarao de vectores . . . . . . . . . . . .
5.3.2 Processamento de vectores . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

8 Adicionando uma interface grfica


8.1 Instalao da Form . . . . . . . . . . . . . . . . . . . . .
8.2 Instalao dos Controlos . . . . . . . . . . . . . . . . . .
8.3 Incorporao da Form na sub-rotina . . . . . . . . . . . .
8.3.1 Como visualizar e terminar uma Form . . . . . .
8.3.2 Tratamento de eventos atravs de Event Handlers
8.3.3 Como recolher os resultados de uma Form . . . .
8.3.4 Exemplo de aplicao . . . . . . . . . . . . . . . .
8.4 Exemplo de aplicao mais elaborado . . . . . . . . . . .
9 Notas finais

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.

63

Lista de Figuras
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Janela de invocao do ambiente de Gravao de Macros . . .


Janela de Gesto de Macros . . . . . . . . . . . . . . . . . . .
Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . .
Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . .
Criao de novo Mdulo . . . . . . . . . . . . . . . . . . . . .
Diferentes tipos de dados e o seu armazenamento em memria
Como forar a declarao explcita automaticamente . . . . .
Uma Form e vrios Controlos . . . . . . . . . . . . . . . . . .
Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . .
Lista de eventos disponveis . . . . . . . . . . . . . . . . . . .
Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . .
Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . .
Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . .
Vrios optionButton agrupados numa frame . . . . . . . . . .
Vrios checkBox agrupadas numa frame . . . . . . . . . . . .
Uma Frame agrupando trs botes de comando . . . . . . . .
Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . .
Estrutura de controlo condicional If...Then...Else . . . . . . .
Estrutura de controlo condicional If...Then . . . . . . . . . .
Estruturas de controlo condicional imbricadas . . . . . . . . .
Estrutura de controlo repetitivo Do...While . . . . . . . . . .
Estrutura de controlo repetitivo Do...Until . . . . . . . . . .
Ciclos controlados por contador . . . . . . . . . . . . . . . . .
Ciclos controlados por sentinela . . . . . . . . . . . . . . . . .
Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . .
Um vector uma varivel mltipla . . . . . . . . . . . . . . .
Um exemplo de vector de strings . . . . . . . . . . . . . . . .
Porqu usar ciclos para processar vectores? . . . . . . . . . . .
Funes como caixas pretas . . . . . . . . . . . . . . . . . . .
Utilizao da funo margemLucro numa frmula . . . . . . .
Criao de uma Form no VBA . . . . . . . . . . . . . . . . .
A UserForm para Entrada Mltipla de Dados . . . . . . . . .
Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

9
10
10
11
12
15
16
19
21
22
23
25
27
30
31
31
32
34
35
37
39
40
41
42
45
46
47
48
51
52
57
61
62

Lista de Tabelas
1
2
3
4

Tipos de dados suportados pelo VBA . . . . . . . . . . . . . . . . . . .


Propriedades mais comuns dos objectos grficos VBA . . . . . . . . . .
Valores de configurao das caractersticas de uma Caixa de Mensagem
Valores devolvidos por uma Caixa de Mensagem . . . . . . . . . . . . .

.
.
.
.

17
20
26
27

Listings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

VerificaValor - exemplo de funo definida pelo utilizador . . .


verificaGama - exemplo de funo definida pelo utilizador . . .
Exemplo de aplicao de If..Then..Else imbricados . . . . . .
FormataBordo - exemplo de sub-rotina usando For..Next . . .
Exemplo usando Ciclos Imbricados . . . . . . . . . . . . . . .
Exemplo de processamento de um vector . . . . . . . . . . . .
Outro exemplo de processamento de um vector . . . . . . . . .
Funo margemLucro . . . . . . . . . . . . . . . . . . . . . . .
Sub-rotina InsereLinhas . . . . . . . . . . . . . . . . . . . . .
Handler do objecto cmdFechar para o evento click . . . . . .
Exemplo de sub-rotina de invocao de uma UserForm . . . .
Exemplo de sub-rotina de inicializao de uma UserForm . . .
Handler do objecto cmdFechar para o evento Click . . . . . .
Sub-rotina de inicializao da UserForm . . . . . . . . . . . .
Handler associado ao objecto Tabstrip1 para o evento Change

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

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

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

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

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

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

12
13
38
44
45
49
49
51
56
59
60
61
61
62
63

Introduo

Este texto tem como objectivo apoiar o ensino das tcnicas de programao de computadores, 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 Office, 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 especfico das
aplicaes Office.

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 necessidade 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 especfico. 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 exemplo, quando, numa aplicao Office 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.

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 especificamente 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 fim 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, verificar-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) especfica 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 frequentemente 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 especificar 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

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 especificada anteriormente (no caso da Figura 1 na pgina precedente, 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 eficincia 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 directamente 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 ficheiro duma aplicao Office (como, por
exemplo, uma folha de clculo do Excel) e todos os ficheiros VBA associados, incluindo
os prprios macros e eventuais user forms (janelas de interface prprias utilizadas pelos

11

Figura 5: Criao de novo Mdulo

macros1 ).
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 Explorador 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),
especificar o tipo de macro que vai ser construdo (funo ou procedimento2 ) e qual o
mbito da sua utilizao (privada ou pblica, ou seja, limitada ou no ao ficheiro 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 verifique se o valor presente numa determinada clula superior a um
dado limite e que, caso seja, disso notifique o utilizador. A sub-rotina em que esse macro
dever assentar poder ter o seguinte contedo:
Listing 1: VerificaValor - exemplo de funo definida pelo utilizador
1
2
3
4
5

1
2

Public Sub v e r i f i c a V a l o r ( )
I f C e l l s ( 2 , 2 ) > 100 Then
MsgBox " Valor maximo e x c e d i d o ! "
End I f
End Sub

Sobre o assunto, ver Seco 8.


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 verificar que, em 1o lugar, constitudo por uma linha de cabealho que
especifica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seu
nome (verificaValor). O corpo do macro composto pela estrutura de controle condicional (If...Then 3 ) que vai verificar se o contedo da clula B24 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, verificar o contedo de uma clula especfica
da folha de clculo e avisar o utilizador caso o valor nela contido ultrapassar um valor
pr-determinado. Sempre que for necessrio fazer esta verificao, bastar invocar a
combinao de teclas que tenha sido associada a este macro.
verdade que sta verificao 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 verificao num conjunto de clulas e
apenas desencadear o alarme caso mais do que duas dessas clulas ultrapassem o limite
estabelecido. A sub-rotina modificada poderia ser algo como:
Listing 2: verificaGama - exemplo de funo definida pelo utilizador
1
2
3
4
5
6
7
8
9
10
11
12

Public Sub v e r i f i c a G a m a ( )
Dim i As Integer , c As Integer
c = 0
For i = 1 To 5
I f C e l l s ( i , 3 ) > 100 Then
c = c + 1
End I f
Next
I f c > 2 Then
MsgBox c & " v a l o r e s s u p e r i o r e s ao l i m i t e ! "
End I f
End Sub

A verificao 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 verificar 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 directamente 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.


Cells(2,2) refere-se clula B2 (2a coluna, 2a linha)
5
Ver Seco 5.2.4 na pgina 43.

13

Options na Janela de Gesto de Macros, invocada mediante ALT-F8.

Variveis e Tipos de Dados

A informao processada por um macro pode ser de diferente natureza e existir em diferentes formatos. Genericamente um programa pode utilizar, entre outras, informao
numrica e informao chamada alfa-numrica, ou seja texto. A linguagem VBA consegue 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 especifica 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 graficamente 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
216 = 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 especfica
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, dimensionada para receber dados do tipo integer (inteiro simples7 ).
A declarao implcita resume-se a utilizar pela primeira vez uma varivel sem qualquer 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 instruo8 :
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, substituindose 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 mdulos, 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 linguagem 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, especificar qual o tipo de dados
que ela ir suportar. No entanto, em VBA possvel omitir a especificao 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
Integer
Long
Single

Double
String
Boolean
Date
Object

Descrio
Inteiro simples, usado para representar inteiros entre -32768 e 32767
Inteiro longo, ou seja, compreendido entre -2.147.483.648 e
2.147.483.647
Real representado com preciso simples, com valores negativos compreendidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca
de 1,4E-45 e 3,4E38
Real representado com preciso dupla, usado para representar nmeros
reais muito maiores ou muito mais pequenos que com o tipo single
Usado para representar texto (informao alfanumrica como letras,
algarismos e smbolos especiais); strings so representadas entre aspas
Usado para representar valores lgicos (True ou False)
Usado para representar datas ou valores de tempo; so representados
entre caracteres #
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 1o 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 2o 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 1o 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 fluxo 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 justifica-se pelo seguinte facto: se um dado valor constante fr utilizado
muitas vezes ao longo dum programa, caso ocorra a necessidade de o modificar, seremos
forados a corrigir manualmente todas as ocorrncias desse valor, correndo, alm disso, o
risco de nos enganarmos. Se, ao invs, for definida uma constante com esse valor, bastar
modificar essa definio inicial para que tal mudana automaticamente se repercuta em
todas as ocorrncias dessa constante no decurso do programa. A sintaxe da definio de
constantes a seguinte:
Const Nome As tipo = expresso
Por expresso entende-se um valor numrico, uma cadeia de caracteres, ou uma expresso 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 definir 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

Como trabalhar com Objectos

Para que uma macro possa manipular o ambiente da aplicao, seja modificando a formatao de um documento, modificando 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 grfica especfica do macro. A esses objectos grficos 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 verificao.
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 especificar 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 cilindrada;
19

Os seus "mtodos" especificam 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 quantificadas ou
especificadas, 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 definem a forma como ele se apresenta ou se comporta.
Diversos objectos podem partilhar a mesma propriedade. Essa propriedade, no entanto, pode afectar esses objectos de forma diferente.
Caption
Name
Left
Top
Height
Width
Font
Visible

Define o texto a afixar na barra de ttulo das forms, da legenda


(caption) dos botes de comando, ou nos rtulos (label)
Define o nome pelo qual o objecto identificado
Define o afastamento entre uma form e o limite esquerdo do ecr
ou entre um controlo e o limite esquerdo da form
Define o afastamento entre uma form e o topo do ecr ou entre um
controlo e o topo da form
Define a altura do objecto
Define a largura do objecto
Especifica qual o tipo de letra a usar nos controlos
Permite controlar o aparecimento de um dado objecto

Tabela 2: Propriedades mais comuns dos objectos grficos VBA

J vimos que quer os elementos do Excel como folhas de clculo ou prprio documento, quer elementos constituintes de interfaces grficas 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 grficos.
Os valores que as propriedades de um dado objecto tomam podem ser consultados ou
modificados 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 exemplo, aplicar o mtodo Save ao objecto ActiveDocument implica desencadear o processo
de salvaguardar o contedo do documento activo num determinado ficheiro. 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])
Exemplificando, 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 definido 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 programado, um procedimento especial, chamado event handler, que vai especificar 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 final so
criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador
a incluso das instrues necessrias. Na figura 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 especficos
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 grficos dispostos numa form. Repare-se na Figura 11 na pgina seguinte: o que
se pretende aqui um macro capaz de verificar se um dado nmero inteiro, introduzido
pelo utilizador usando a interface descrita na figura, ou no um nmero primo. Partese 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 Office, 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 Application, 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, especificar 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 seguinte10 :
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 instruo correcta seria:
conteudo = ActiveCell.Value
Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa propriedade 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 grficos

Vo agora ser apresentados de forma mais sistemtica alguns dos objectos e facilidades
necessrios para realizar interfaces grficas 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 comando 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
Caractersticas

Ttulo

Texto a apresentar (mximo de 1024 caracteres)


Valor numrico que especifica o nmero de botes, o tipo do
cone e o boto de defeito (com o focus), obtido pela soma
de trs valores parciais.
Contedo da barra de ttulo da janela (opcional)

O 2o argumento ser calculado usando os valores da Tabela 3:


Botes de Comando
0 - OK
1 - OK, Cancel
2 - Abort, Retry, Ignore
3 - Yes, No, Cancel
4 - Yes, No
5 - Retry, Cancel

cone
0 - Nenhum
16 - Mensagem
32 - Mensagem
48 - Mensagem
64 - Mensagem

Crtica
de Aviso 1
de Aviso 2
de Informao

Boto com o focus


0 - 1o Boto
256 - 2o Boto
512 - 3a Boto

Tabela 3: Valores de configurao 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 especificando 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
vbOK
vbCancel
vbAbort
vbRetry
vbIgnore
vbYes
vbNo

Valor
1
2
3
4
5
6
7

Boto seleccionado
OK
Cancel
Abort
Retry
Ignore
Yes
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 botes12 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 fixos. Por outro lado, a tecla ESC tem o
mesmo comportamento.

27

Mensagem
Ttulo
valor_de_defeito
xpos e ypos

4.3.3

Texto da mensagem a afixar na Caixa de Entrada (mximo


de 1024 caracteres)
Contedo da barra de ttulo da janela (opcional)
Texto a colocar partida na caixa de texto da Caixa de Entrada (opcional)
Coordenadas da Input Box relativamente aos bordos esquerdo e superior do ecr (opcionais)

Forms

Como vimos no incio da Seco 4 na pgina 19, uma interface grfica (em terminologia 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 grficos. Um objecto da classe UserForm 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 configuradas numa Form:
Name - especifica o nome pelo qual a Form ser identificada
Caption - especifica o ttulo que figura 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 - especifica a altura da Form
Width - especifica 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, utilizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se pode
verificar na Figura 11 na pgina 23, a este tipo de controlos que normalmente se associam 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 especificar
o texto afixado.
28

A instruo seguinte serve de exemplo de como alterar programaticamente o estado


de um boto de comando:
cmdArranque.Enabled = True
O que fizemos com a instruo acima foi atribuir o valor booleano (lgico) True propriedade 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 especificar 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 afixao 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 - Especifica o tamanho mximo do texto (em caracteres) que o utilizador 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 informao 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-definidas.
Duas delas, relacionadas com "strings", so particularmente teis para lidar com
objectos da classeTextBox :
Funo
Val()
Str()

Descrio
Retorna como valor numrico um nmero contido dentro duma string
Retorna uma string representando um nmero

Vamos supor que um macro precisa de calcular o peso total custa de dois valores 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 Verificao

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 verificao deve ser especificado 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 definida 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 especificados 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 preenchida.
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 elementos contidos na lista


Sorted
permite especificar se a lista ou no apresentada de maneira
ordenada
ColumnCount especifica qual o nmero de colunas em que a lista apresentada
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 especifica qual o ndice do item actualmente seleccionado (ou 1 caso nenhum esteja). Sintaxe:
objecto.ListIndex [= indice]
List
permite aceder aos elementos duma lista, quer para os ler,
quer para os modificar. Sintaxe:
objecto.List(indice) [= string]
Text
permite obter o elemento actualmente seleccionado. Sintaxe:
variavel = objecto.Text
RowSource
no Excel, especifica qual a gama de clulas onde estar a informao a incluir na lista, ou seja, a fonte dos dados a apresentar.
Na especificao 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 grfica sem uma Form

possvel criar uma interface grfica 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

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 especfica. 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 inflexvel, 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
flexvel no poder ser construdo apenas com instrues desse tipo. preciso dispor
de instrues que permitam alterar o fluxo do programa. Para tal vamos introduzir
estruturas de controlo que possibilitam a alterao desse fluxo.

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 condio 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 figura por Bloco
de Instrues1. Em caso contrrio, ser executada o Bloco de Instrues 2.
A sintaxe desta estrutura :
1
2
3
4
5

I f c o n d i c a o Then
[ instrucoes ]
Else
[ instrucoes alternativas ]
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 constituda 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 simplificada, a If...Then. O seu diagrama est
descrito na Figura 19 na pgina 35. A sua sintaxe ser ento:
1
2
3

I f c o n d i c a o Then
[ instrucoes ]
End I f

Nesta 2a variante, quando a aco a realizar no caso a condio ser verdadeira puder ser
executada com apenas uma instruo, possvel utilizar a seguinte sintaxe simplificada,
sem o delimitador End If :
If condicao Then instrucao
Expresses lgicas
As expresses lgicas, utilizadas nas condies das estruturas de controlo, so construdas utilizando operadores lgicos especficos. A linguagem VBA prev os seguintes operadores lgicos, utilizveis em expresses:
Operador
>
<
=
<=
>=
<>
And
Or
Not

Descrio
Maior que
Menor que
Igualdade
Menor ou igual
Maior ou igual
Desigualdade
E
Ou
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 verdadeira

36

5.1.3

Estruturas condicionais embutidas

possvel imbricar estruturas condicionais dentro de outras estruturas condicionais, permitindo, 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
2
3
4
5
6
7
8
9

I f c o n d i c a o 1 Then
Accao1
E l s e I f c o n d i c a o 2 Then
Accao2
E l s e I f c o n d i c a o 3 Then
...
Else
AccaoN
EndIf

Esta estrutura condicional permite a seleco de uma entre vrias alternativas mutuamente exclusivas. As instrues que se seguem palavra reservada Else (aqui representadas por "AcoN") sero executadas apenas se nenhuma das condies se tiver
verificado.

Figura 20: Estruturas de controlo condicional imbricadas

Na Figura 20 na pgina anterior pode-se ver o fluxograma de uma estrutura imbricada


com quatro vias alternativas. A Aco 1 executada caso a 1a 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 verificado 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 alternativas, 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 classificar 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
2
3
4
5
6
7
8
9
10
11
12
13

I f ( nota < 0 ) Or ( nota > 20 ) Then


r e s u l t a d o = "Nota I n v a l i d a ! "
E l s e I f nota < 6 Then
r e s u l t a d o = "Mau"
E l s e I f nota < 10 Then
r e s u l t a d o = " Mediocre "
E l s e I f nota < 14 Then
resultado = " Suficiente "
E l s e I f nota < 17 Then
r e s u l t a d o = "Bom"
Else
r e s u l t a d o = " Muito Bom"
End I f

possvel imbricar um qualquer nmero de blocos ElseIf dentro de uma dada estrutura condicional.

5.2

Estruturas de controlo repetitivo

Como vimos, as estruturas de controlo condicional permitem alterar o fluxo do programa, 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
verificao de uma condio, normalmente de forma explcita, noutros casos implicitamente.
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 fim. Vejamos em detalhe as diversas variantes. O fluxo38

grama da primeira encontra-se na Figura 21:

Figura 21: Estrutura de controlo repetitivo Do...While

Analizando esse fluxograma, 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 verificar ser verdadeira, o programa no sair deste ciclo. Na 1a 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
2
3

Do While c o n d i c a o
[ instrucoes ]
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 fim) 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
2
3

Do
[ instrucoes ]
Loop U n t i l c o n d i c a o

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
2
3
4
5

contador = v a l o r _ i n i c i a l
Do While c o n t a d o r <= v a l o r _ f i n a l
Corpo do C i c l o
contador = contador + 1
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
Especificar 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 responsabilidade do programador assegurar-se de que tais aces so correctamente executadas
40

Figura 23: Ciclos controlados por contador

conforme est espelhado no diagrama de fluxo representado na Figura 23 na pgina precedente.


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 fim 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
identificados 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 fim 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 codificado pelo segmento de programa
seguinte:
1
2
3
4
5

num = InputBox ( " D i g i t e onumero" , "ISEP M a t r i c u l a s " )


Do While numero <> 1
I f numero <> 1 Then l s t b o x 1 . AddItem num
num = InputBox ( " D i g i t e onumero" , "ISEP M a t r i c u l a s " )
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
2
3

For c o n t a d o r = v a l o r _ i n i c i a l To v a l o r _ f i n a l
[ instrucoes ]
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 valorfinal - valor
inicial iteraes atingir o valor final. Nesse momento o ciclo terminar.
A inicializao da varivel contadora, o seu incremento/decremento e a verificao da
condio de funcionamento do ciclo (contador <= fim) da responsabilidade da prpria
estrutura de controlo. O programador deve, apenas, especificar qual o valor de incio e
de fim (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 modificado por estas instrues,
sob pena de se perder o controlo do funcionamento do ciclo.
A estrutura de controlo verifica 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

For c o n t a d o r = v a l o r _ i n i c i a l To v a l o r _ f i n a l Step p a s s o
[ instrucoes ]
Next

1
2
3

A diferena est na utilizao da palavra Step aps a especificao do valor final. A


sua incluso opcional: caso se pretenda que o contedo da varivel de controlo seja
incrementada uma unidade de cada vez, desnecessrio especificar 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 pretendermos, 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 >= fim.
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
verificada mas no especificada de forma explcita pelo programador, apenas de forma
indirecta ao fixarem-se os valores inicial e final 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:
For Each elemento In C o l e c c a o
[ instrucoes ]
Next

1
2
3

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
2
3
4
5
6

Public Sub FormataBordo ( )


Dim c e l l O b j e c t As Range
For Each c e l l O b j e c t In S e l e c t i o n
c e l l O b j e c t . BorderAround C o l o r I n d e x :=3 , Weight := x l T h i c k
Next
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 fluxo 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
2
3
4
5
6
7
8
9
10

num = InputBox ( " I n t r o d u z a um i n t e i r o p o s i t i v o " )


Do U n t i l num < 0
factorial = 1
contador = 1
Do U n t i l c o n t a d o r > num
f a c t o r i a l = f a c t o r i a l contador
c o n t a d o r = c o n t a d o r +1
Loop
num = InputBox ( " I n t r o d u z a um i n t e i r o p o s i t i v o " )
Loop

O ciclo exterior controlado por uma sentinela, no caso qualquer valor inteiro no
positivo. um exemplo de sentinela constitudo no por um valor especfico 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 classificar 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 classificar 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 unidimensional) contendo valores inteiros. Cada elemento do vector identificado por um
valor numrico especfico.
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 identificadas 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 zero15 .
Um elemento de um vector identificado utilizando o nome do vector seguido do valor
do ndice dentro de parntesis
nome_vector(indice)
Exemplos:
var_Multipla(3) 4o elemento do vector var_Multipla
var_Multipla(7) 8o e ltimo elemento do vector var_Multipla
notas(14)
15o elemento do vector notas
nomes(0)
1o 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 futebol, 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 suficiente 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 especificado 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 especificar 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 afirmao contida no pargrafo anterior, 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 verificar que esta soluo no tem qualquer exequibilidade prtica. Analizemos ento a soluo alternativa usando uma varivel indexada:
em vez de 100 variveis individuais teremos apenas um vector de 100 elementos, cada elemento 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
2
3

Private Sub cmdGo_Click ( )


Dim v e c t o r S q r ( 1 0 0 ) As Double
Dim i As Integer
48

Figura 28: Porqu usar ciclos para processar vectores?

4
5
6
7
8
9
10
11

Dim r e s As S i n g l e
l s t T a b e l a . Clear
For i = 0 To txtMaior
r e s = Sqr ( i )
vectorSqr ( i ) = res
l s t T a b e l a . AddItem Format( r e s , " 0 . 0 0 0 " )
Next i
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 especificar 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
2
3
4
5
6
7
8

Private Sub cmdGo_Click ( )


Dim v e c t o r ( 1 0 0 ) As Double
Dim i As Integer
Dim i n d i c e As Integer
Dim r e s As S i n g l e
Dim l i n h a As String
l s t T a b e l a . Clear
indice = 0
49

9
10
11
12
13
14
15
16
17

For i = txtMenor To txtMaior


r e s = Sqr ( i )
vector ( indice ) = res
l i n h a = Format( Str ( i ) , "##0" ) + "" + _
Format( v e c t o r ( i n d i c e ) , " 0 0 0 . 0 0 0 " )
l s t T a b e l a . AddItem l i n h a
indice = indice + 1
Next i
End Sub

Na variante desta sub-rotina, contida no exemplo descrito na Listagem 7 na pgina


anterior, possvel especificar 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 controlo 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 modificaram o seu valor. igualmente 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.

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 definida pela sintaxe seguinte:
1
2
3
4

Function Nome ( argumento1 , argumento2 , . . . )


L i s t a de i n s t r u c o e s
Nome = r e s u l t a d o
End Function

Repare-se que para alm das diferenas bvias no cabealho e no delimitador final em
relao s sub-rotinas estudadas atrs, verifica-se o seguinte:
1. A seguir ao nome da funo e entre parnteses encontra-se uma lista de argumentos, 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
2
3

Public Function margemLucro ( venda , c u s t o )


margemLucro = ( venda c u s t o ) / venda
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-definidas, 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 (identificada 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".

Programao do Excel usando VBA

Nesta seco vamos aprender a trabalhar com os objectos do Excel mais comuns: o Workbook (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 existentes, entre outras aces possveis. Para especificar 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 ficheiros Excel abertos
naquele momento (Workbooks(Nome));
Usando o objecto ActiveWorkbook que representa o ficheiro com que se est de
momento a trabalhar;
Usando o objecto ThisWorkbook que representa o ficheiro em que o prprio programa 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_ficheiro
Exemplo:
Workbooks.Open "C : \Documentos\Excel\Dados.xls"
Os mtodos Save e Close so utilizados de forma similar para salvaguardar o contedo
dum ficheiro e para o fechar, respectivamente.

7.2

Trabalhar com objectos Worksheet

Normalmente um livro de trabalho possui mais do que uma folha de clculo ( normalmente criado logo partida com trs). Para escolher qual a folha de clculo com que se
pretende trabalhar usa-se o objecto Worksheets especificando um ndice ou o nome da
folha de clculo em causa, conforme se exemplifica 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 especificar 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 especificada18 . 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 especificada 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 2a folha de clculo e insere-a a seguir 3a .
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 especificada.
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 especfico 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 1a sintaxe usa nomes de gamas pr-definidos19 , enquanto que a 2a utiliza as referncias das clulas que definem os dois vrtices opostos da rea rectangular contendo
as clulas que se quer especificar. 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 1o exemplo guarda o valor 100 na clula C5. O 2o 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 modificar o seu valor. No 3o exemplo
limpa-se o contedo das clulas da gama "Dados" da 3a folha de clculo, mediante a
aplicao do mtodo ClearContents.
Caso queiramos identificar apenas uma clula podemos tambm utilizar o mtodo
Cells.
Sintaxe:
Objecto.Cells(Linha,Coluna)
19

Atribudos em Excel usando o Menu "Insert/Name/Define".

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 encontra20 . Veja-se o seguinte exemplo:
1
2
3

For c o l u n a = 2 To 13
C e l l s ( 2 , Coluna ) . Value = "Mes" & c o l u n a 1
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 no do ms. usado o operador de concatenao
de strings & para efectuar a colagem.
Caso se pretenda identificar 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 subrotina21 :
Listing 9: Sub-rotina InsereLinhas
1
2
3
4
5
6
7
8
9
10
11

Sub I n s e r e L i n h a s ( gama As Range , num As Integer )


Dim num_linhas As Integer , u l t i m a _ l i n h a As Integer
Dim i As Integer
With gama
num_linhas = . Rows . Count
u l t i m a _ l i n h a = . Rows ( num_linhas ) . Row
For i = 1 To num
. Rows ( u l t i m a _ l i n h a + i ) . I n s e r t
Next
End With
End Sub

Esta sub-rotina recebe como argumentos uma gama de clulas (um objecto do tipo
Range) e um inteiro especificando 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 propriedades. Assim, .Rows.Count refere-se ao nmero total de linhas da gama especificada
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 especificada.
21
Adaptado de um exemplo contido em [1].

56

Sub i n s e r e T e s t e ( )
I n s e r e L i n h a s Worksheets ( 3 ) . Range ( "Dados" ) , 3
End Sub

1
2
3

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.

Adicionando uma interface grfica

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 grficos 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 objectos 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 grficos (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 ferramentas (Toolbox ) contendo os vrios controlos (objectos grficos) disponveis para a
construo da interface. Pode ainda ver-se no canto inferior esquerdo a Janela de Propriedades, 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 configuradas numa Form:
Name - especifica o nome pelo qual a Form ser identificada
Caption - especifica o ttulo que figura 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 - especifica a altura da Form
Width - especifica 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 especfica de propriedades, existem
algumas propriedades importantes que so comuns maioria delas:
Name - especifica o nome pelo qual o controlo ser identificado no programa
Caption - especifica o texto apresentado pelo controlo
BackColor - permite seleccionar a cor do fundo
Enabled - controla a utilizao do objecto pelo utilizador da interface
Height - especifica a altura do controlo
Width - especifica a sua largura
Visible - especifica 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 verificao (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 2o 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 :
MinhaForm . Show

Se, em alternativa, se pretender arrancar com a Form mas sem a visualizar nesse
momento, usa-se a instruo Load :
1

Exemplo :
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 :
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 :

8.3.2

Set MinhaForm = Nothing


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
2
3
4
5
6
7

Private Sub cmdFechar_Click ( )


Dim op As Integer
op = MsgBox( " S a i r ? ( Yes/No) " , vbYesNo + vbQuestion )
I f op = vbYes Then
Unload Me
End I f
End Sub

A sub-rotina acima vai especificar a reaco do boto de comando cmdFechar ao


evento Click, neste caso apresentar uma Msg Box que confirme 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 defina 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 resumida na seguinte tabela:
Classe
CheckBox
OptionButton
ListBox
TextBox
TabStrip

Contedo
True ou False conforme esteja ou no activada
True ou False conforme esteja ou no activada
A posio da linha seleccionada
O contedo da TextBox (pode-se tambm usar a propriedade Text)
Um inteiro indicando qual a Tab que est activa

Note-se que nas List Boxes em VBA a 1a 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 finalmente 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
2
3
4

Public Sub testUserFormInput ( )


usrFrmInput . Show
Set usrFrmInput = Nothing
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 especfica, usando uma das
tcnicas j aprendidas (ver parte final da Seco 2.6).
Listing 12: Exemplo de sub-rotina de inicializao de uma UserForm
1
2
3
4
5
6
7
8

Private Sub U s e r F o r m _ I n i t i a l i z e ( )
cmbCursos . AddItem " C i v i l "
cmbCursos . AddItem " I n f o r m a t i c a "
cmbCursos . AddItem " E l e c t r o t e c n i a "
cmbCursos . AddItem " G e o t e c n i a "
cmbCursos . AddItem " Quimica "
cmbCursos . AddItem " I n s t r u m e n t a c a o Medica "
End Sub

Figura 32: A UserForm para Entrada Mltipla de Dados

61

Esta sub-rotina especial, que executada automaticamente quando a UserForm arranca, 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
2
3
4
5
6
7
8

Private Sub cmdFechar_Click ( )


With Worksheets ( 4 )
. [ H5 ] = txtNome . Value
. [ I 5 ] = txtNum . Value
. [ J5 ] = cmbCursos . Text
End With
Unload Me
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 figura, encontram-se trs TextBox.
Conforme referido na Seco 4.1, para que um controlo possa reagir a aces provocadas pelo utilizador, como o "clicar" do rato, preciso que o programador crie sub62

programas especiais, chamados Event Handlers e que esses sub-programas sejam associados aos controlos respectivos.
Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitem
especificar o comportamento de controlos em face de certos eventos. Em 1o 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
2
3
4
5
6
7
8
9
10
11
12

Private Sub U s e r F o r m _ I n i t i a l i z e ( )
With TabStrip1
. Tabs ( 0 ) . Caption = " C i v i l "
. Tabs ( 1 ) . Caption = " I n f o r m a t i c a "
. Tabs .Add " E l e c t r o t e c n i a "
End With
With Worksheets ( 4 )
txtNumAlunos . Text = . [ D5 ]
txtPercAprov . Text = . [ D6 ] 100
txtMedia . Text = . [ D7 ]
End With
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 fim, so atribudos
a cada uma das TextBox contidas na Tabstrip1 os contedos das trs clulas da folha de
clculo referentes ao curso referente ao 1o 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Private Sub TabStrip1_Change ( )


Dim v As Integer
With Worksheets ( 4 )
v = TabStrip1 . Value
I f v = 0 Then
txtNumAlunos = . [ D5 ]
txtPercAprov = . [ D6 ] 100
txtMedia = . [ D7 ]
E l s e I f v = 1 Then
txtNumAlunos = . [ E5 ]
txtPercAprov = . [ E6 ] 100
txtMedia = . [ E7 ]
Else
txtNumAlunos = . [ F5 ]
txtPercAprov = . [ F6 ] 100
63

16
17
18
19

txtMedia = . [ F7 ]
End I f
End With
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 correspondente.

Notas finais

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 Office System, QUE.
[2] Antnio Silva. Sebenta de Introduo Computao - Visual Basic, ISEP.

64