0% acharam este documento útil (0 voto)
8 visualizações

Programming in VBA

Enviado por

alex
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
8 visualizações

Programming in VBA

Enviado por

alex
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 51

Programação em VBA

Texto Introdutório
António Silva
2009-10-6

1
.
Conteúdo
1 Introdução 6

2 Conceitos Básicos 6
2.1 O que é um Macro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Técnicas de construção dum Macro . . . . . . . . . . . . . . . . . . . . . 7
2.3 Gravação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 A escrita de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 O editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.6 Criação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

3 Variáveis e Tipos de Dados 11


3.1 Conceito de variável . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Criação das variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4 A operação de Atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 O uso de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4 Como trabalhar com Objectos 16


4.1 Propriedades, Métodos e Eventos . . . . . . . . . . . . . . . . . . . . . . 17
4.1.1 Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.1.2 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.1.3 Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 Os objectos do Excel mais comuns . . . . . . . . . . . . . . . . . . . . . . 21
4.2.1 Como trabalhar com as propriedades dos objectos Excel . . . . . 21
4.2.2 Como aplicar métodos aos objectos . . . . . . . . . . . . . . . . . 22
4.3 Objectos gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.3.1 MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.3.2 A função InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3.3 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3.4 Instalação dos Controlos . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.5 Botões de Comando . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.6 Rótulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.7 Caixas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3.8 Quadros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.9 Botões de Opção . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.10 Caixas de Verificação . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.11 Caixas de Listagem . . . . . . . . . . . . . . . . . . . . . . . . . . 30

5 Estruturas de controlo do programa 31


5.1 Estruturas de controlo condicional . . . . . . . . . . . . . . . . . . . . . . 32
5.1.1 If...Then...Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.1.2 If...Then . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.1.3 Estruturas condicionais embutidas . . . . . . . . . . . . . . . . . . 34
5.2 Estruturas de controlo repetitivo . . . . . . . . . . . . . . . . . . . . . . 36
5.2.1 Estruturas de Controlo Do...Loop . . . . . . . . . . . . . . . . . . 36

3
5.2.2 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . 37
5.2.3 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . 38
5.2.4 Estrutura de Controlo For...Next . . . . . . . . . . . . . . . . . . 39
5.2.5 Estruturas de controlo repetitivo imbricadas . . . . . . . . . . . . 42
5.3 Variáveis indexadas - vectores e matrizes . . . . . . . . . . . . . . . . . . 43
5.3.1 Declaração de vectores . . . . . . . . . . . . . . . . . . . . . . . . 44
5.3.2 Processamento de vectores . . . . . . . . . . . . . . . . . . . . . . 45

6 Funções e Procedimentos 47

7 Programação do Excel usando VBA 47


7.1 Como aceder às funções standard do Excel . . . . . . . . . . . . . . . . . 47
7.2 Trabalhar com objectos Workbook . . . . . . . . . . . . . . . . . . . . . . 48
7.3 Trabalhar com objectos Worksheet . . . . . . . . . . . . . . . . . . . . . 48
7.3.1 Propriedades de Worksheet . . . . . . . . . . . . . . . . . . . . . . 49
7.3.2 Métodos de Worksheet . . . . . . . . . . . . . . . . . . . . . . . . 49
7.4 Trabalhar com objectos Range . . . . . . . . . . . . . . . . . . . . . . . . 49

8 Notas finais 51

4
Lista de Figuras
1 Janela de invocação do ambiente de Gravação de Macros . . . . . . . . . 7
2 Janela de Gestão de Macros . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . . . . . . . . 9
4 Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5 Criação de novo Módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
6 Diferentes tipos de dados e o seu armazenamento em memória . . . . . . 13
7 Como forçar a declaração explícita automaticamente . . . . . . . . . . . 14
8 Uma Form e vários Controlos . . . . . . . . . . . . . . . . . . . . . . . . 17
9 Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
10 Lista de eventos disponíveis . . . . . . . . . . . . . . . . . . . . . . . . . 19
11 Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
12 Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
13 Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
14 Criação de uma Form no VBA . . . . . . . . . . . . . . . . . . . . . . . 26
15 Uma Frame agrupando três botões de comando . . . . . . . . . . . . . . 28
16 Vários optionButton agrupados numa frame . . . . . . . . . . . . . . . . 29
17 Vários checkBox agrupadas numa frame . . . . . . . . . . . . . . . . . . 29
18 Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
19 Estrutura de controlo condicional If...Then...Else . . . . . . . . . . . . . 32
20 Estrutura de controlo condicional If...Then . . . . . . . . . . . . . . . . 33
21 Estrutura de controlo condicional If...Then . . . . . . . . . . . . . . . . 35
22 Estrutura de controlo repetitivo Do...While . . . . . . . . . . . . . . . . 37
23 Estrutura de controlo repetitivo Do...Until . . . . . . . . . . . . . . . . 38
24 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . . . . . 39
25 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . . . . . 40
26 Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . . . . 42
27 Um vector é uma variável múltipla . . . . . . . . . . . . . . . . . . . . . 43
28 Um exemplo de vector de strings . . . . . . . . . . . . . . . . . . . . . . 44
29 Porquê usar ciclos para processar vectores? . . . . . . . . . . . . . . . . . 45
30 Exemplo de processamento de um vector . . . . . . . . . . . . . . . . . . 46
31 Outro exemplo de processamento de um vector . . . . . . . . . . . . . . . 47

5
1 Introdução
Este texto tem como objectivo apoiar o ensino das técnicas de Programação de compu-
tadores, utilizando, como ambiente de aplicação, programas como o gestor de folhas de
cálculo Excel.
Destina-se assim aos alunos que já possuem alguns conhecimentos da utilização e
funcionamento desta aplicação. Concretamente, presume-se que estão já familiarizados
com os conceitos de folha de cálculo, de livro de trabalho, de fórmulas e funções standard.
A linguagem de programação que vai ser utilizada será o VBA (Visual Basic for
Applications). É uma linguagem que permite acrescentar capacidades adicionais a certo
tipo de aplicações informáticas, concretamente as pertencentes ao Microsoft Office, entre
as quais o Excel e o Word. Permite ainda automatizar a realização de certas tarefas
rotineiras nessas aplicações.
Como o próprio nome indica, trata-se duma adaptação da linguagem genérica de
programação Visual Basic de modo a poder ser utilizada no ambiente específico das
aplicações Office.

2 Conceitos Básicos
O VBA constitui uma ferramenta poderosa nas mãos de programadores experimentados
mas pode, ao mesmo tempo, ser muito útil a qualquer utilizador, mesmo inexperiente.
De facto, no dia a dia da utilização destas aplicações, defrontamo-nos com a neces-
sidade de repetir a mesma tarefa várias vezes ao dia ou, de em certas ocasiões, ter que
repetir uma determinada tarefa uma série de vezes de seguida. Seja escrever ou formatar
um certo texto, seja executar uma série de comandos ou escolher opções de menus, seja
ainda realizar a formatação complexa de um documento, são inúmeras as ocasiões em
que dava jeito poder automatizar essas tarefas repetitivas.
É aqui que entra o VBA, permitindo a construção daquilo que se designa vulgarmente
por macros.

2.1 O que é um Macro?


Um macro contem uma lista das instruções a realizar para executar uma determinada
tarefa. No fundo, é um programa escrito em VBA, que indica a uma aplicação como o
Excel quais os passos a dar para atingir um objectivo específico. Pode-se dizer que um
macro não é mais que uma descrição formalizada das tarefas que se pretende automatizar.
Os macros incluem instruções que interagem com elementos da aplicação. Por exem-
plo, quando, numa aplicação Office se pretende fechar uma janela, pode-se seleccionar a
opção de menu Close. Um macro escrito em VBA, usará a seguinte instrução para obter
o mesmo efeito:
ActiveWindow.Close
Existem duas formas alternativas de criar um macro mas a forma como ele é criado
não muda o seu conteúdo, continuando a ser um contentor de uma lista de instruções a
realizar pela aplicação em que está instalado.

6
2.2 Técnicas de construção dum Macro
Se bem que um macro seja um programa em VBA, nem sempre é necessário escrevê-lo de
forma explícita, ou seja, escrevendo especificamente as instruções VBA que o compõem.
Sobretudo quando os macros são simples, é muitas vezes mais prático criá-lo de forma
automática, gravando a sequência de passos que ele deverá executar na aplicação.
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 gravação do macro e inicia a execução da sequência de acções
que normalmente teria que executar. Quando chega ao fim dessa sequência, indica ao
programa que a gravação terminou. Após ter atribuído a essa sequência uma combinação
de teclas especial, esse macro estará pronto a ser executado, substituindo assim o conjunto
de acções que anteriormente seriam necessárias.
Se se investigar, no entanto, o conteúdo desse macro, verificar-se-á que ele é composto
por instruções escritas precisamente em VBA, sendo que a cada acção ou comando da
aplicação corresponderá uma instrução (ou conjunto de instruções) específica do macro.
A forma alternativa de construir um macro será assim introduzir essas instruções num
editor de texto apropriado. É essa, de facto, a forma de criar um macro quando o seu
âmbito é algo não trivial.

2.3 Gravação de um Macro


Quando uma dada operação envolvendo uma série de acções deva ser utilizada frequen-
temente faz sentido tentar automatizar a sua execução.
Para gravar um macro que seja capaz de efectuar essas acções, haverá que invocar o
modo de gravação 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 localização em que será armazenado, uma descrição das suas funções
e ainda a combinação de teclas (Shortcut key) que será utilizada para arrancar com o
macro, uma vez este construído.

Figura 1: Janela de invocação do ambiente de Gravação de Macros

Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

7
Figura 2: Janela de Gestão de Macros

o processo de gravação e dever-se-á dar início à execução das acções que o macro vai
substituir. Quando se tiver executado a última acção a incluir no macro, basta dar a
indicação de que a gravação terminou.
Uma vez tal realizado, esse macro passará a estar disponível mediante a invocação
da combinação de teclas especificada anteriormente (no caso da Figura 1 na página pre-
cedente, seria Ctrl+Shft+M) e executará, de forma automática, exactamente a mesma
sequência de acções que tínhamos realizado manualmente.
Em alternativa, mediante a combinação de teclas ALT-F8, pode ser accionada a janela
de Gestão de Macros (Figura 2), onde, entre outras acções, pode ser escolhido o macro a
ser executado.

2.4 A escrita de um Macro


Ensinar pelo exemplo ao Excel como fazer as coisas é um método expedito de construir
um macro, mas tem as suas limitações. Já que um macro não é mais que um programa
escrito em VBA, porque não tratá-lo como tal e aceder a seu código, alterando-o de forma
a melhorar a sua eficiência ou a corrigir problemas. E já agora, porque não criá-los de
raiz, aproveitando todo o poder duma linguagem como o VBA?

2.5 O editor de VBA


Para facilitar o acesso às facilidades de gravação e edição de macros, será conveniente
tornar visível de forma permanente a barra de ferramentas de Visual Basic (Figura 3 na
próxima página). No Excel, isto poderá fazer-se mediante a opção de Menu "View/Tool-
bars/Visual Basic".
Para aceder ao editor especializado de Visual Basic (Figura 4 na página 10), que se
encontra integrado no próprio Excel, basta utilizar o icone adequado na barra de ferra-
mentas ou usar directamente a combinação de teclas ALT-F11. Tornando a premir esta
combinação de teclas, voltaremos à nossa folha de cálculo. A este editor especializado
é também dado o nome de Integrated Development Environment (IDE) ou Ambiente de

8
Figura 3: Barra de Ferramentas de VBA

Desenvolvimento Integrado e é semelhante à aplicação autónoma usada para o desenvol-


vimento de programas em Visual Basic.
Do lado esquerdo na Figura 4 na próxima página podem-se ver duas janelas, a primeira
das quais é designada por Explorador de Projectos e que serve para mostrar o conteúdo
do projecto VBA actual. Um projecto em VBA inclui um ficheiro duma aplicação Office
(como, por exemplo, uma folha de cálculo do Excel) e todos os ficheiros VBA associa-
dos, incluindo os próprios macros e eventuais user forms (janelas de interface próprias
utilizadas pelos macros1 ).
Para poder começar a escrever macros usando o VBA é necessário criar um módulo
que o possa albergar, o que é conseguido usando a opção de menu "Insert/Module". Como
consequência, para além do novo módulo aparecer referido na janela do Explorador de
Projectos, será criada uma janela nova onde será possível escrever o código que constitui os
novos macros. Se já existir algum módulo criado, bastará seleccionar o módulo pretendido
no explorador de projectos, posicionar o cursor na janela correspondente a esse módulo
numa área fora de qualquer macro e seleccionar a opção de menu "Insert/Procedure".
Aparecerá uma janela própria (Figura 5 na página 11) onde será possível dar o nome ao
novo procedimento (o conjunto de instruções que constituirá o macro), especificar o tipo
de macro que vai ser construído (função ou sub-rotina2 ) e qual o âmbito da sua utilização
(pública ou privada, ou seja, limitada ao ficheiro actual).

2.6 Criação de um Macro


Está na hora de construir o primeiro macro em VBA. Suponhamos que se pretende um
macro que verifique se o valor presente numa determinada célula é 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 conteúdo:
1 Public Sub v e r i f i c a V a l o r ( )
2 I f C e l l s ( 2 , 2 ) > 100 Then
3 MsgBox " Valor ␣maximo␣ e x c e d i d o ! "
4 End I f
5 End Sub
1
Sobre o assunto, ver Secção ??.
2
A distinção entre funções e sub-rotinas, que estará já clara para quem possua os conhecimentos
básicos de Visual Basic, será tratada mais à frente.

9
Figura 4: Editor integrado do VBA

Não nos vamos de momento preocupar com os detalhes do código que constitui o
macro. Basta verificar que, em 1o lugar, é constituído por uma linha de cabeçalho que
especifica o tipo de macro (neste caso, um procedimento) e o seu nome (verificaValor ).
O corpo do macro é composto pela estrutura de controle condicional (If...Then) que vai
verificar se o conteúdo da célula B2 é ou não maior que o valor 200. Caso essa condição
seja verdadeira afixará, o macro apresentará uma mensagem no ecran dizendo que o valor
máximo foi excedido. Finalmente, o macro é terminado com uma linha contendo "End
Sub".
O que este simples macro faz, portanto, é verificar o conteúdo de uma célula específica
da folha de cálculo e avisar o utilizador caso o valor nela contido ultrapassar um valor
pré-determinado. Sempre que for necessário fazer esta verificação, bastará invocar a
combinação de teclas que tenha sido associada a este macro.
Esta verificação poderia, no entanto, ter sido realizada colocando numa célula uma
fórmula contendo a função standard do Excel IF. Mas suponhamos agora que se pretende
algo mais complicado, por exemplo, fazer essa verificação num conjunto de células e
apenas desencadear o alarme caso mais do que duas dessas células ultrapassem o limite
estabelecido. A sub-rotina modificada poderia ser algo como:
1 Public Sub v e r i f i c a G a m a ( )
2 Dim i As Integer , c As Integer

10
Figura 5: Criação de novo Módulo

3 c = 0
4 For i = 1 To 5
5 I f C e l l s ( i , 3 ) > 100 Then
6 c = c + 1
7 End I f
8 Next
9 I f c > 2 Then
10 MsgBox c & "␣ v a l o r e s ␣ s u p e r i o r e s ␣ ao ␣ l i m i t e ! "
11 End I f
12 End Sub
A verificação é agora repetida em todas as células de C1 a C5 graças aos serviços
da estrutura de controlo repetitivo For...To...Next que executará 5 vezes as instruções
contidas nas linhas 5 a 7. Para além de verificar o conteúdo da célula em análise, é ainda
actualizado um contador, baseado na variável c (ver linha 6), sempre que o valor contido
nessa célula ultrapasse o limite. Só no caso de o valor desse contador for maior que 2 será
gerada a mensagem de alarme.
Estaremos já em posição de perceber a utilidade de construir os macros usando di-
rectamente o VBA. Não seria trivial resolver este problema usando apenas fórmulas e
certamente impossível executando comandos e seleccionando menus do Excel.
A um macro criado usando directamente o VBA pode também ser associada uma
combinação de teclas que facilite o seu acesso. Isso pode ser feito através do botão
Opções na Janela de Gestão de Macros, invocada mediante ALT-F8.

3 Variáveis e Tipos de Dados


A informação processada por um macro pode ser de diferente natureza e existir em
diferentes formatos. Genericamente um programa pode utilizar informação numérica e

11
informação chamada alfa-numérica, ou seja texto. A linguagem VBA consegue lidar com
informação de diversos tipos, que detalharemos adiante.

3.1 Conceito de variável


Uma variável é uma localização de memória em que a informação pode ser guardada de
modo a ser usada por um macro. Cada variável é caracterizada pelo seu nome e pelo seu
tipo, ou seja, o tipo de dados que pode armazenar. O conteúdo de uma variável pode
mudar durante a execução do macro. Existem algumas regras governando a escolha do
nome duma variável:

1. Deve obrigatoriamente começar por uma letra;

2. Não pode conter espaços nem caracteres como vírgulas ou pontos;

3. Não pode exceder 255 caracteres;

4. Não pode ser igual a uma palavra reservada para o VBA.

O tipo da variável especifica qual o tipo de dados que pode conter. Uma variável de um
determinado tipo não está preparada para armazenar dados de um tipo diferente. A razão
para este facto é que o espaço necessário para armazenar diferentes tipos de dados não é
o mesmo. Enquanto um inteiro simples pode ser guardado em 2 bytes de memória 3 , para
guardar um número real podem ser necessários 8 bytes (ou mesmo mais, dependendo da
precisão requerida). A Figura 6 na próxima página ilustra graficamente esta realidade.

3.2 Criação das variáveis


Ao acto de criação de variáveis chama-se declaração. Criar uma variável envolve dar-lhe
um nome e reservar em memória o espaço necessário para que ela possa guardar o tipo de
dados para o qual está a ser criada. O acto de declarar a variável 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 variável pode ser utilizada antes de ser criada. A declaração
deve, pois, preceder a sua utilização. Desde que se siga esta regra, é possível inserir
declarações em qualquer ponto do macro. No entanto, é boa prática agrupar todas as
declarações necessárias num bloco a colocar no início, para mais fácil manutenção do
programa.
Em VBA, existem duas formas de declaração de variáveis: explícita e implícita. A
declaração explícita exige a utilização da instrução específica
"Dim ... As" (Dimensionar ...Como).
Por exemplo, a instrução
3
Para armazenar números que podem variar entre -32768 e 32767, ou seja 65536 valores diferentes, há
necessidade de dispor de 16 unidades básicas de informação (bits), ou seja dois bytes (1 byte = 8 bits).
De facto, se cada bit apenas pode representar um valor binário (0 ou 1), 16 bits poderão representar até
216 = 65536 valores diferentes.

12
Figura 6: Diferentes tipos de dados e o seu armazenamento em memória

Dim Preço As Integer


cria (declara) uma variável com o nome Preço e do tipo Integer, ou seja, preparada
para receber dados do tipo integer (inteiro simples4 ).
A declaração implícita resume-se a utilizar pela primeira vez uma variável sem qual-
quer declaração explícita prévia, dando-lhe um nome e atribuindo-lhe um valor. O VBA
cria automaticamente a variável do tipo pretendido.
Esta segunda forma de declarar variáveis tem, a despeito da sua simplicidade, um
problema grave: é possível, por distracção, criar uma variável nova indesejada, quando o
que se pretendia era apenas escrever o nome de uma variável já existente. Atente-se no
exemplo:
Suponha que havia criado uma variável "Distancia"mediante a instrução5 :
Distancia=1260
Como é a primeira vez que o VBA encontra esta palavra ("Distancia"), partirá do
princípio que se trata de uma variável ainda por declarar e tratará de a criar, substituindo-
se ao programador. Dar-lhe-á o nome "Distancia"e dimensioná-la-á de forma a poder
guardar inteiros simples, já que é essa a utilização sugerida na instrução.
Agora suponha que adiante no programa, por engano, escrevia "Distncia"ao referir-se
4
A discussão dos vários tipos de dados suportados pelo VBA será feita na Secção 3.3 na página
seguinte
5
Como se verá na secção 3.4 na página 15, esta instrução guarda na variável "Distancia"o valor 1260

13
à variável em causa. O VBA não emitirá nenhum alerta, já que aceitou tranquilamente
"Distncia"como uma nova variável. A forma mais prudente de lidar com declarações de
variáveis é, pois, utilizar apenas declarações explícitas, e instruir o VBA para não aceitar
declarações implícitas, gerando uma mensagem de erro apropriada. Para tal, deverá ser
acrescentada a seguinte instrução no início do módulo contendo o macro:
Option Explicit
Se se pretender que seja esse o comportamento automático do VBA em todos os
módulos, então, no Editor do VBA, deverá seleccionar-se a opção "Require Variable
Declaration"no sub-menu Options do menu Tools.

Figura 7: Como forçar a declaração explícita automaticamente

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:
Tipo Descrição
Integer Inteiro simples, usado para representar inteiros entre -32768 e 32767
Long Inteiro longo, ou seja, compreendido entre -2.147.483.648 e
2.147.483.647
Single Real representado com precisão simples, com valores negativos compre-
endidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca
de 1,4E-45 e 3,4E38
Double Real representado com precisão dupla, usado para representar números
reais muito maiores ou muito mais pequenos que com o tipo single
String Usado para representar texto (informação alfanumérica como letras,
algarismos e símbolos especiais); strings são representadas entre aspas
Boolean Usado para representar valores lógicos (True ou False)
Date Usado para representar datas ou valores de tempo; são representados
entre caracteres #
Object Serve para guardar referências a objectos
Quando declaramos variáveis dever-se-á, em princípio, especificar qual o tipo de dados
que ela irá suportar, usando um dos tipos acima. No entanto, em VBA é possível omitir a
especificação do tipo de dados na declaração de variáveis. O VBA criará uma variável do
tipo Variant capaz de armazenar qualquer tipo de dados. O que, à partida, parece uma

14
boa ideia acaba por não o ser porque, entre outros motivos, implica um gasto excessivo
de memória e torna a execução dos macros mais lenta.

3.4 A operação de Atribuição


A operação de Atribuição permite guardar um dado numa variável, ou seja, atribuir-lhe
um valor. A sintaxe utilizada por esta operação é a seguinte:
Variável = Valor
O resultado da operação será, portanto, o de guardar Valor em Variável. Valor
pode ser um valor constante ou o conteúdo de outra variável. Neste caso, a atribuição
consistirá na cópia do conteúdo de uma variável para outra do mesmo tipo. A instrução
seguinte copia o valor contido na variável idade para a variável temp (partimos do
princípio que ambas são do tipo integer ):
temp = idade
Pode ainda ser atribuído a um variável o resultado de uma expressão ou o valor
devolvido por uma função. Atente-se nos seguintes exemplos:
total = peso1 + peso2
resultado = sqrt(2+peso)
No 1o exemplo, o VBA resolverá em primeiro lugar a expressão à esquerda do operador
de atribuição (=), somando os conteúdos das variáveis peso1 e peso2, após o que copiará
esse resultado para a variável total.
No 2o exemplo, a expressão à direita é composta por uma função standard do VBA
(sqrt()). Esta função calcula a raiz quadrada do valor ou expressão que se encontrar
dentro dos seus parêntesis. Assim sendo, o VBA calculará em 1o lugar o resultado da
expressão 2 + peso, fornecerá esse valor à função sqrt(), após o que copiará o valor
fornecido por essa função para a variável resultado.
A operação de atribuição é uma operação destrutiva. Se a variável contiver já um
valor, uma operação subsequente de atribuição sobre essa variável, substituirá o valor
nela contido pelo novo valor. Convem, assim, lembrar que nesta operação o fluxo da
informação se faz sempre da direita para a esquerda e não o contrário.
Há ainda que ter em atenção o facto de que não é normalmente aconselhável atribuir
um valor de um dado tipo a uma variável de tipo diferente. Os resultados podem ser a
perda de informação ou o mau funcionamento do programa. O VBA poderá gerar uma
mensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentos
anómalos difíceis de detectar e corrigir.

3.5 O uso de constantes


Uma constante consiste num nome que é dado a um valor numérico ou a uma cadeia de
caracteres, e que pode ser usado dentro do programa na vez desses valores. Funciona
como uma espécie de sinónimo. A utilização de constantes em substituição dos valores
que representa justifica-se pelo seguinte facto: se um dado valor constante fôr utilizado

15
muitas vezes ao longo dum programa, caso ocorra a necessidade de o modificar, haverá ne-
cessidade de corrigir manualmente todas as ocorrências desse valor, correndo, além disso,
o risco de se enganar. Se, ao invés, for definida uma constante com esse valor, bastará
modificar essa definição inicial para que tal mudança automaticamente se repercuta em
todas as ocorrências dessa constante no decurso do programa. A sintaxe da definição de
constantes é a seguinte:
Const Nome As tipo = expressão
Por expressão entende-se um valor numérico, uma cadeia de caracteres, ou uma ex-
pressão cujo resultado seja um destes tipos de valores.
Caso, por exemplo, seja necessário usar ao longo de um macro um mesmo factor em
vários cálculos, faz sentido definir esse factor como constante e usar o seu nome em vez
dele:
Const Factor as Single = 1.347

4 Como trabalhar com Objectos


Para que uma macro possa manipular o ambiente da aplicação, seja modificando a forma-
tação de um documento, modificando opções da aplicação ou introduzindo dados numa
gama de células, 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 célula ou gama de células, quer a própria aplicação
são considerados, para os efeitos de programação em VBA, como sendo objectos. Mas
podem ainda existir outros objectos, nomeadamente aqueles que permitem construir uma
interface gráfica específica do macro. A esses objectos gráficos chamamos controlos e são
colocados em janelas especiais chamadas forms.
Na Figura 8 na página seguinte podem ser observados vários objectos instalados numa
form: uma caixa de texto, dois botões de comando, vários rótulos ou etiquetas e uma
caixa de verificação. Através deles é possível o macro interagir com o utilizador. Veremos
em detalhe mais à frente para que servem e como utilizar estes diferentes objectos.
Os objectos podem ser manipulados de várias formas:
• podemos mudar as suas propriedades, que traduzem características próprias dos
objectos;

• podemos aplicar um método a esse objecto, ou seja, executar uma acção 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 de propriedades, mé-
todos e eventos. Consideremos um automóvel:

• As suas "propriedades"são características físicas como o modelo, o peso ou a cilin-


drada;

16
Figura 8: Uma Form e vários Controlos

• Os seus "métodos"especificam o que pode ser feito com ele: acelerar, travar, mudar
de direcção, etc;

• Os seus "eventos"são ocorrências que provocarão respostas automáticas por parte


do automóvel, como seja, uma campainha que toca (resposta) caso saiamos do carro
deixando a chave na ignição (evento).

4.1 Propriedades, Métodos e Eventos


Vamos, de seguida, aprofundar estes conceitos de propriedades, métodos e eventos.

4.1.1 Propriedades
As propriedades de um objecto são as suas características físicas. Como na vida real, cada
objecto possui características próprias ou propriedades, que podem ser quantificadas ou
especificadas, como sejam as suas dimensões ou o tipo de letra que usa. Cada objecto
tem associado uma lista de propriedades a que é possível atribuir valores determinando
a sua aparência, localização e outros detalhes. Pode-se então 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 en-
tanto, pode afectar esses objectos de forma diferente.
Já vimos que quer os elementos do Excel como folhas de cálculo ou próprio documento,
quer elementos constituintes de interfaces gráficas que os macros possam utilizar, são
considerados objectos. Algumas das propriedades mais importantes e que são comuns à
maior parte dos objectos gráficos são as seguintes:

17
Caption Define o texto a afixar na barra de título das forms, da legenda
(“caption”) dos botões de comando, ou nos rótulos (“label”)
Name Define o nome pelo qual o objecto é identificado
Left Define o afastamento entre uma “form” e o limite esquerdo do ecrã
ou entre um controlo e o limite esquerdo da form
Top Define o afastamento entre uma “form” e o topo do ecrã ou entre um
controlo e o topo da “form”
Height Define a altura do objecto
Width Define a largura do objecto
Font Especifica qual o tipo de letra a usar nos controlos
Visible Permite controlar o aparecimento de um dado objecto

Figura 9: Janela de Propriedades

Os valores que tomam as propriedades de um dado objecto podem ser consultados ou


modificados mediante a janela de propriedades. Nessa janela aparece a lista de proprie-
dades do objecto que estiver nesse momento seleccionado (Figura 9). Nela pode observar,
entre outras, algumas das propriedades referidas na lista acima (Caption, Height e Font)
e os respectivos valores no momento.

4.1.2 Métodos
Os métodos traduzem acções que podem ser realizadas sobre os objectos. Por exemplo,
aplicar o método Save ao objecto ActiveDocument implica desencadear o processo de sal-
vaguardar o conteúdo do documento activo num determinado ficheiro. Aplicar o método
Clear a um objecto da classe ListBox terá como consequência a eliminação de todas as
linhas nele contidas.
Para vermos como um método é aplicado a um objecto, vamos considerar o objecto
Worksheet, que representa uma folha de cálculo do Excel. Se pretendermos que o nosso
macro mova essa folha para uma nova posição dentro do Livro de Trabalho (Workbook ),
ele deverá aplicar o método Move a esse objecto, usando a seguinte sintaxe:

18
Worksheet.Move([Before][, After])
Exemplificando, se quisermos que o macro desloque a folha de cálculo "Dados 2009"para
a posição 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 cálculo contidas no Livro de Trabalho. Este conjunto de folhas é
representado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se à folha
de cálculo com o nome "Dados 2009".

4.1.3 Eventos
Os eventos são acções que, uma vez exercidas sobre um objecto, implicam a possibilidade
de ocorrer uma resposta automática desse objecto. 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 inserção de uma nova folha no livro é outro exemplo
de evento.
Para que um objecto possa reagir a um dado evento deverá existir, previamente pro-
gramado, um procedimento especial, chamado event handler, que vai especificar o que
fazer caso esse evento ocorra. Sem isso, o objecto detectará esse acontecimento mas não
saberá o que deve fazer. Nenhuma resposta será produzida.

Figura 10: Lista de eventos disponíveis

Na Figura 10 pode ver-se a janela de escrita de código de macros. Na parte de


cima, à direita, pode ser acedida a lista de eventos disponíveis para o objecto Worksheet.
Seleccionando um dos eventos, será possível construir o procedimento event handler que
permita ao objecto Worksheet reagir a esse evento. O cabeçalho e o delimitador final são
criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador
a inclusão das instruções necessárias. Na figura são referidos vários eventos que podem
ocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folha
de cálculo se torna activa, ou o Change que é desencadeado por qualquer alteração ao
seu conteúdo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estar
preparada para reagir a diferentes eventos, desde que possua event handlers específicos
para esses eventos.

19
Figura 11: Objectos e Eventos

Para tentar esclarecer melhor o conceito de evento e a questão de como organizar


a resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenas
objectos gráficos dispostos numa form. Repare-se na Figura 11: o que se pretende aqui
é um macro capaz de verificar se um dado número inteiro, introduzido pelo utilizador
usando a interface descrita na figura, é ou não um número primo. Parte-se do princípio
que todos sabem o que é um número primo e não nos vamos agora debruçar sobre os
detalhes do código que o event handler deverá conter para produzir o efeito desejado.
Preocupamo-nos, de momento, apenas com as interacções entre as várias entidades que
intervêm no processo.
Como é visível na Figura 11, existem vários objectos (chamados controlos) na inter-
face. Entre eles, têm particular interesse para esta discussão a caixa de texto txt1, o
rótulo lbl2 e o botão de comando command1. Quando o utilizador pretende utilizar o
macro, uma vez este invocado, deverá introduzir o número a testar em txt1 e pressionar
("clicar") o botão command1. Quando isso acontece, diz-se que ocorreu um evento click
no botão command1. Se esse botão não dispuser de nenhum event handler para lidar
com esse tipo de evento, nada se passará. No entanto, se se tiver associado a esse ob-
jecto (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

20
cálculos necessários para concluir se o número introduzido é ou não primo e apresentar
essa conclusão no rótulo 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
não possamos tocar, podemos claramente vê-lo e interagir com ele, alterando, no caso do
Excel, o conteúdo de células, alterando formatos ou inserindo linhas e colunas. Por sua
vez, todos estes elementos são, eles também, objectos. Nas aplicações Office, os objectos
estão organizados de forma hierárquica. O objecto mais geral é o Application, e dentro
dele existem múltiplos objectos de nível progressivamente inferior.

4.2.1 Como trabalhar com as propriedades dos objectos Excel


Como já vimos, os objectos possuem características próprias, chamadas propriedades. A
sintaxe genérica para nos referirmos a uma propriedade de um objecto é a seguinte:
Objecto.Propriedade
Se nos quisermos referir, por exemplo, à propriedade ActiveWindow do objecto Ap-
plication, procederemos do seguinte modo:
Application.ActiveWindow
A propriedade ActiveWindow refere-se à janela da aplicação com que estamos, de
momento, a trabalhar. No caso do Excel, podemos ainda referirmo-nos, por exemplo, à
propriedade ActiveSheet para designar a folha de cálculo em que se está a trabalhar ou a
ActiveCell para nos referirmos à célula actualmente seleccionada.
Se pretendermos, por exemplo, especificar o tipo de letra da célula activa, usaremos
a seguinte descrição de objecto:
Application.ActiveWindow.Active.Cell.Font.Name
Na prática, quando nos estamos a referir a uma propriedade da janela activa da
aplicação como seja a ActiveCell, não 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 célula activa,
faremos então6 :
ActiveCell.Font.Name = "Helvetica"
Se, ao contrário, quisermos obter o valor de uma dada propriedade, a instrução a usar
será do tipo:
variavel = Objecto.Propriedade
6
Trata-se de uma operação de atribuição, descrita na Secção 3.4 na página 15

21
Para obtermos o conteúdo da célula activa da folha de cálculo, a instrução correcta
seria:
conteudo = ActiveCell.Value
Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa proprie-
dade encontra-se o conteúdo da célula.

4.2.2 Como aplicar métodos aos objectos


Vimos na Secção 4.1.2 na página 18, que os métodos de uma classe de objectos descrevem
as acções que podemos executar sobre eles ou, por outras palavras, aquilo que podemos
fazer com eles. A sintaxe usada para aplicar um método a um objecto é similar à usada
para trabalhar com as suas prorpiedades:
Objecto.Método
Um exemplo da aplicação de um método a um objecto, usando esta sintaxe, é o
seguinte:
Worksheets("Leituras").Activate
Estamos aqui a aplicar o método Activate ao objecto Worksheets("Leituras"), o
que tem como consequência que essa folha de cálculo se tornará activa.
No entanto, muitas vezes, os métodos exigem informação adicional para poderem
executar o seu trabalho. Essa informação adicional será fornecida através de argumentos,
inseridos a seguir ao nome do método aplicado:
Objecto.Método (argumento1, argumento2. ...)

Workbooks.Open("Dados.xls")
Muitas vezes, os argumentos que se podem fornecer a um método são opcionais. Por
exemplo, a instrução abaixo adiciona (insere) uma nova folha de cálculo imediatamente
antes da folha com o nome "Dados_Jan":
O seguinte exemplo abre um Livro de Trabalho pré-existente com o nome "Dados.xls":
Worksheets.Add Before:=Worksheets("Dados_Jan")
No entanto, caso seja omitido o argumento Before, a nova folha será inserida antes da
folha de cálculo activa. É esse o comportamento por defeito do método Add.

4.3 Objectos gráficos


Vão agora ser apresentados de forma mais sistemática alguns dos objectos e facilidades
necessários para realizar interfaces gráficas simples. Essas interfaces vão permitir que
os macros tenham uma interacção directa com o utilizador, requerendo e fornecendo
informação.
A forma mais simples de o macro interagir com o utilizador é através de duas funções:
MsgBox e InputBox.

22
4.3.1 MsgBox

Figura 12: Exemplo de MsgBox

A função MsgBox permite apresentar uma pequena janela contendo um mensagem,


pelo menos um botão de comando e eventualmente um pequeno desenho (ícone) ilustra-
tivo do tipo de mensagem, ou seja, o que se desigan por Caixa de Mensagem. Destina-se
assim a apresentar ao utilizador uma mensagem com informação relevante, sejam avisos,
resultados, perguntas ou sugestões. Esta janela tem um comportamento peculiar: en-
quanto não for premido um botão, não será possível fazer mais nada, já que essa janela
tomou o controlo do computador. O utilizador é assim obrigado a atender à mensagem
apresentada. Na Figura 12 encontra-se um exemplo de uma destas janelas.
A sintaxe da função MsgBox é a seguinte:
MsgBox(Mensagem, Características, Título)
Em que os argumentos são:
Mensagem Texto a apresentar (máximo de 1024 caracteres)
Características Valor numérico que especifica o número de botões, o tipo do
ícone e o botão de defeito (com o “focus”), obtido pela soma
de três valores parciais.
Título Conteúdo da barra de título da janela (opcional)
O 2o argumento será calculado usando os valores da tabela abaixo:

Botões de Comando Ícone Botão com o “focus”


0 - OK 0 - Nenhum 0 - 1o Botão
1 - OK, Cancel 16 - Mensagem Crítica 256 - 2o Botão
2 - Abort, Retry, Ignore 32 - Mensagem de Aviso 1 512 - 3a Botão
3 - Yes, No, Cancel 48 - Mensagem de Aviso 2
4 - Yes, No 64 - Mensagem de Informação
5 - Retry, Cancel

Assim, para obter a MsBox da Figura 12 o valor a utilizar para o parâmetro carac-
terísticas seria obtido somando 3 valores, um de cada coluna da tabela, cada um deles
especificando uma das características (Botões de Comando, Ícone e qual o botão com o

23
"Focus"7 ):
1 + 16 + 0 = 17
A MsgBox serve então para apresentar uma mensagem ao utilizador. No entanto,
permite também recolher informação. Quando a caixa de mensagem apresenta mais
do que um botão, está-se a pedir ao utilizador que escolha uma de entre duas ou três
alternativas. Dependendo de qual o botão premido pelo utilizador, assim o valor numérico
devolvido pela função MsgBox será um de entre 7 valores possíveis, descritos na tabela
seguinte.

Constante Valor Botão seleccionado


vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No

De notar que caso a tecla ESC (Escape) seja premida o valor devolvido será 2, a que
corresponde o botão Cancel (o que indica que as duas acções são equivalentes).
Claro que quando se pretende aproveitar o valor devolvido pela função MsgBox será
necessário usá-la com a seguinte sintaxe:
Variável = MsgBox(Mensagem, Características, Título)
Desta maneira, o valor devolvido pela função será guardado (atribuído) em Variável,
podendo depois ser avaliado por instruções seguintes.

4.3.2 A função InputBox


Esta função permite apresentar uma mensagem ao utilizador, recolhendo ao mesmo tempo
uma string contendo a sua resposta. Assim, ao contrário da função MsgBox (ver Sec-
ção 4.3.1 na página precedente), esta função produz um resultado do tipo string e não
do tipo integer.

Figura 13: Exemplo de InputBox

7
Por botão com o "Focus"entende-se o botão que está previamente assinalado e que será actuado se
se premir a tecla Enter. Também se pode chamar botão por defeito.

24
Como poder ser visto na Figura 13 na página anterior, esta função cria um objecto
composto (uma Caixa de Entrada) incluindo um caixa de texto, dois botões8 e um rótulo
dentro de uma pequena janela.
A sua sintaxe é
Variável = InputBox (mensagem, título, valor_de_defeito, xpos, ypos)
Em que os argumentos são:
Mensagem Texto da mensagem a afixar na Caixa de Entrada (máximo
de 1024 caracteres)
Título Conteúdo da barra de título da janela (opcional)
valor_de_defeito Texto a colocar à partida na caixa de texto da Caixa de En-
trada (opcional)
xpos e ypos coordenadas da “Input Box” relativamente aos bordos es-
querdo e superior do ecrã (opcionais)

4.3.3 Forms
Como vimos no início da Secção 4 na página 16, uma interface gráfica (em terminolo-
gia VBA, uma DialogBox ) é construída dispondo os objectos adequados (genericamente
designados por controlos) sobre uma janela especial, a form. Efectivamente uma form é
utilizada como um contentor para outros objectos gráficos. Um objecto da classe User-
Form pode ser criado no Editor do VBA através do Menu "Inser/User Form".
Na Figura 14 na página seguinte pode ser visto o ambiente de desenvolvimento inte-
gradodo VBA, mostrando uma janela com uma form vazia recém-criada e um conjunto
de janelas que permitem aceder às facilidades oferecidas pelo VBA para construção de
interfaces gráficas.
Uma dessas janelas é a Janela de Propriedades, onde podem ser consultadas ou alte-
radas as propriedades do objecto gráfico que nesse momento estiver seleccionado (neste
caso, a form). Outra janela é a chamada Caixa de Ferramentas (ToolBox ) e contem os
objectos gráficos (os controlos) disponíveis.
Usando a Janela de Propriedades, é possível especificar uma série de características
que determinam a sua aparência e o seu comportamento. A seguir são apresentadas
algumas das principais propriedades que podem ser configuradas numa Form:

• Name - especifica o nome pelo qual a Form será identificada

• Caption - especifica o título que figura no topo da Form

• BackColor - permite seleccionar a cor do fundo

• Enabled - controla a utilização da Form pelo utilizador

• ShowModal - permite alterar o comportamento da Form de modo a controlar o


acesso à aplicação enquanto a Form estiver activa
8
Ao contrário da MsgBox, neste caso os dois botões são fixos. Por outro lado, a tecla ESC tem o
mesmo comportamento

25
Figura 14: Criação de uma Form no VBA

• Font - controla o tipo e tamanho da letra utilizada

• Height - especifica a altura da Form

• Width - especifica a largura da Form

4.3.4 Instalação dos Controlos


Usando a Caixa de Ferramentas Toolbox, é possível escolher e instalar os controlos na
Form. Para tal, basta accionar o símbolo 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 necessários das suas características. Se bem
que cada classe de controlos possua a sua lista própria de propriedades, existem algumas
propriedades importantes que são 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 utilização do objecto pelo utilizador

• Height - especifica a altura do controlo

26
• Width - especifica a sua largura

• Visible - especifica se o controlo está ou não visível

Muitas destas proriedades, para além de serem alteráveis na Janela de Proprieda-


des, durante a fase de concepção da interface, podem ainda ser modificadas durante o
funcionamento do macro, usando instruções específicas para as manipular.
Nas próximas secções, referiremos com algum detalhe os controlos de uso mais comum
na construção de dialogBoxes em VBA.

4.3.5 Botões de Comando


Um botão de comando (objecto commandButton), como o próprio nome sugere, é uti-
lizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se pode
verificar na Figura 11 na página 20, é a este tipo de controlos que normalmente se asso-
ciam as sub-rotinas que permitem responder a eventos como o clicar de um rato.
As propriedades normalmente referidas em relação a esta classe de objectos são as que
controlam as dimensões (Height e Width) e a propriedade Caption que permite especificar
o texto afixado.
A instrução seguinte serve de exemplo de como alterar programaticamente o estado
de um botão de comando:
cmdArranque.Enabled = True
O que fizemos com a instrução acima foi atribuir o valor booleano (lógico) True à
propriedade Enabled do botão de comando cmdArranque. Estamos, assim, a tratar uma
propriedade como sendo uma variável. De facto, uma propriedade pode ser considerada
como uma variável especial.

4.3.6 Rótulos
Os rótulos, também designados por etiquetas (label ) são 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 não só para apresentar
informação estática, que é escolhida na fase de concepção da interface, como também
informação dinâmica, como seja a apresentação de resultados:
lblResultado.Caption = "O valor total é 235 metros"

4.3.7 Caixas de Texto


As caixas de texto (objecto TextBox ) são uma classe de controlos muito versáteis que
permitem a introdução pelo utilizador de diversos tipos de informação: texto, valores
numéricos e, no caso do Excel, referências a células e mesmo fórmulas.
Algumas das suas propriedades mais importantes são:

• Text - Permite obter ou alterar o texto contido no objecto.

27
• MaxLenght - Especifica o tamanho máximo do texto (em caracteres) que o utili-
zador pode introduzir.

• MultiLine - Permite escolher entre autorizar ou não a inserção de várias linhas.

Funções Val e Str


A linguagem Visual Basic dispõe de um grande número de funções pré-definidas.
Duas delas, relacionadas com "strings", são particularmente úteis para lidar com
objectos da classeTextBox :
Função Descrição
Val() Retorna como valor numérico um número contido dentro duma string
Str() Retorna uma string representando um número
Vamos supor que um macro precisa de calcular o peso total à custa de dois valores
introduzidos pelo utilizador através de duas TextBox. A tentação seria usar a
instrução:
pesoTotal = txt1.Text + txt2.Text
No entanto, o que a propriedade Text das TextBox contem é apenas texto, ainda
que contendo algarismos. Para extrair a informação numérica de dentro do texto,
haverá que utilizar a função Val():
pesoTotal = Val(txt1.Text) + Val(txt2.Text)

4.3.8 Quadros
Tais objectos destinam-se a agrupar outros objectos (controlos). São usados muitas vezes
para organizar um dado conjunto de botões de opção (Secção 4.3.9 na página seguinte),
tornando-os independentes de outros botões de opção eventualmente existentes na mesma
form.

Figura 15: Uma Frame agrupando três botões de comando

É importante criar o quadro antes de aí inserir os controlos. Se o controlo fôr criado


antes do quadro, não será possível deslocá-lo para dentro do quadro uma vez este criado.
Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o
“contentor” desse objecto. Quer isto dizer que a sua localização passa a ser definida não
em relação à form mas em relação ao quadro que o contem.

28
Outra utilidade dos quadros é servir de “moldura” a um dado conjunto de controlos, de
modo a melhorar a aparência e a organização da form em que estão inseridos, agrupando
os diversos controlos de acordo com as suas funcionalidades.

4.3.9 Botões de Opção


Estes objectos permitem ao utilizador efectuar escolhas entre diversas alternativas. São
compostos pelo botão propriamente dito (de forma circular) e um pequeno texto que o
acompanha, controlado pela propriedade Caption do objecto.

Figura 16: Vários optionButton agrupados numa frame

Os botões de opção são geralmente agrupados em conjuntos de dois ou mais, estando


interligados entre si, já que, ao mesmo tempo, só é possível existir um botão seleccionado
dentro do mesmo grupo de botões de opção. São normalmente inseridos em frames
(quadros - Secção 4.3.8 na página precedente).
Para além da propriedade Caption, outra propriedade importante dos botões de opção
é a propriedade Value, que pode assumir o valor “True” ou “False” conforme o botão se
encontrar ou não seleccionado.

4.3.10 Caixas de Verificação


Estes objectos comportam-se de forma semelhante à dos botões de opção mas, neste caso,
é possível encontrar vários controlos deste tipo activados simultaneamente, visto que tais
objectos funcionam de forma independente (isto é, não se encontram relacionados entre
si).

Figura 17: Vários checkBox agrupadas numa frame

29
Possuem também uma propriedade Value que, neste caso, pode apresentar os seguintes
valores:
0 não activada
1 activada
2 não disponível
O texto a inserir junto de cada caixa de verificação deve ser especificado mediante a
propriedade Caption.

4.3.11 Caixas de Listagem


Este objecto serve para apresentar listas e permite que o utilizador escolha uma ou mais
opções dentro de uma dada lista. Esta lista é apresentada numa caixa própria (com uma
barra de deslocamento vertical à direita, no caso de a lista ser mais extensa que o número
de linhas disponível na caixa).

Figura 18: Exemplo de listBox

Os elementos da lista podem ser especificados à partida usando a propriedade List, ou


ser acrescentados durante a execução do programa mediante o método listbox.AddItem:
listbox.AddItem elemento
ou
listbox.AddItem elemento, posição
em que
elemento é o novo elemento a acrescentar à lista
posição refere-se à posição na lista em o elemento vai ser inserido
A remoção de um elemento da lista pode ser feita mediante o método RemoveItem:
Listbox.RemoveItem posição
As propriedades mais relevantes desta classe de objectos são:

30
ListCount permite conhecer em qualquer momento o número de elemen-
tos contidos na lista
Sorted permite especificar se a lista é ou não apresentada de maneira
ordenada
ColumnCount especifica qual o número de colunas em que a lista é apresen-
tada
MultiSelect permite controlar a forma de selecção de elementos na lista:
0 - só é possível seleccionar um elemento
1 - é possível seleccionar vários elementos simultaneamente,
pressionando cada elemento
2 - é possível seleccionar vários elementos simultaneamente,
usando a tecla Ctrl
ListIndex fornece ou especifica qual o índice do item actualmente selec-
cionado (ou –1 caso nenhum esteja). Sintaxe:
objecto.ListIndex [= indice]
List permite aceder aos elementos duma lista, quer para os ler,
quer para os 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 células onde estará a in-
formação a incluir na lista
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 próprio. É
normalmente utilizado quando se pretende dar a possibilidade de escolher um elemento
de uma lista mas sem ocupar muito espaço na form.

5 Estruturas de controlo do programa


Um macro é um programa escrito na linguagem VBA. Vamos agora começar a analizar
mais em detalhe a estrutura de um programa. Um programa é composto por um conjunto
de instruções, cada uma delas executando uma tarefa específica. A sequência de instruções
levará à solução do problema que o programa se propõe resolver. Mas essa sequência não
tem que ser necessariamente linear, i.e., composta por uma lista de instruções que serão
realizadas uma após outra, de forma imutável. Isso tornaria o programa inflexível, incapaz
de se adaptar às circunstâncias ou aos diferentes desejos do utilizador.
Já foi introduzida na Secção 3.4 na página 15 a noção de operação de atribuição.
Com essa operação podemos já criar instruções simples, mediante as quais é possível
copiar valores entre variáveis, ou armazenar resultados do cálculo de expressões. Mas
um programa flexível não poderá ser construído apenas com instruções desse tipo. É
preciso dispor de instruções que permitam alterar o fluxo do programa. Para tal vamos
introduzir estruturas de controlo que possibilitam a alteração desse fluxo.

31
5.1 Estruturas de controlo condicional
Uma estrutura de controlo fundamental é a estrutura condicional, ou de selecção. Usando
esta estrutura, as instruções podem ser executadas condicionalmente. Se uma dada con-
dição fôr verdadeira, será executada uma dada sequência de instruções. Se fôr falsa, uma
sequência diferente será escolhida.

5.1.1 If...Then...Else
A Figura 19 descreve a estrutura condicional If...Then...Else. Como o seu nome sugere,
esta estrutura está baseada no teste de uma condição. Se essa condição fôr verdadeira,
desencadeará a execução das instruções representadas na figura por Bloco de Instru-
ções1. Em caso contrário, será executada o Bloco de Instruções 2.

Figura 19: Estrutura de controlo condicional If...Then...Else

A sintaxe desta estrutura é:


1 I f c o n d i c a o Then
2 [ instrucoes ]
3 Else
4 [ instrucoes alternativas ]
5 End I f

32
Quando a condição é verdadeira serão executadas as instruções delimitadas por Then
e Else. Em caso contrário, será executado o bloco alternativo de instruções.
A condição pode consistir numa comparação ou outra operação lógica, ou ainda em
qualquer expressão de que resulte um valor numérico: um valor não nulo será interpretado
como Verdadeiro, enquanto um valor nulo será considerado como Falso.
A condição é, portanto, uma expressão booleana (lógica). Uma expressão booleana
representa um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser cons-
tituída por uma variável, uma função ou uma combinação destas entidades através de
operações.

5.1.2 If...Then

Figura 20: Estrutura de controlo condicional If...Then

Esta estrutura condicional existe em duas variantes: com ou sem a alternativa Else.
No 1o existe uma acção alternativa a ser executada caso a condição seja falsa. No 2o
caso, a alternativa será não fazer nada. O seu diagrama está descrito na Figura 20. A
sua sintaxe será então:
1 I f c o n d i c a o Then
2 [ instrucoes ]
3 End I f

33
Nesta 2a variante, quando a acção a realizar no caso a condição seja verdadeira puder
ser executada com apenas uma instrução, é possível utilizar a seguinte sintaxe simplifi-
cada, sem o delimitador End If :
1 I f c o n d i c a o Then i n s t r u c a o

Expressões lógicas
As expressões lógicas, utilizadas nas condições das estruturas de controlo, são cons-
truídas utilizando operadores lógicos específicos. A linguagem VBA prevê os seguin-
tes operadores lógicos, utilizáveis em expressões:
Operador Descrição
> Maior que
< Menor que
= Igualdade
<= Menor ou igual
>= Maior ou igual
<> Desigualdade
And E
Or Ou
Not Negação
Dos primeiros seis operadores não 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 expressão será verdadeira

• Basta que quer Expr1 quer Expr2 seja falsa, para a expressão ser falsa

OR
Sintaxe: Expr1 Or Expr2

• Se Expr1 e Expr2 forem ambas falsas, a expressão será falsa.

• Basta que quer Expr1 quer Expr2 seja verdadeira, para a expressão ser ver-
dadeira

5.1.3 Estruturas condicionais embutidas


É possível imbricar estruturas condicionais dentro de outras estruturas condicionais, per-
mitindo, assim, a construção de estruturas de controlo mais complexas. Para inserir uma
estrutura condicional dentro de outra, é utilizada a palavra reservada ELSEIF.
A sintaxe desta estrutura é:

34
1 IF c o n d i c a o 1 THEN
2 Accao1
3 ELSEIF c o n d i c a o 2 THEN
4 Accao2
5 ELSEIF c o n d i c a o 3 THEN
6 ...
7 ELSE
8 AccaoN
9 ENDIF
Esta estrutura condicional permite a selecção de uma entre várias alternativas mu-
tuamente exclusivas. As instruções que se seguem à palavra reservada ELSE (aqui re-
presentadas por "AcçãoN") serão executadas apenas se nenhuma das condições se tiver
verificado.

Figura 21: Estrutura de controlo condicional If...Then

Na Figura 21 pode-se ver o fluxograma de uma estrutura imbricada com quatro vias
alternativas. A Acção 1 é executada caso a 1a condição seja verdadeira. A Acção 3 será
executada caso a Condição 3 for verdadeira e as duas anteriores falsas. A Acção 4 será
executada caso todas as quatro condições se tiverem verificado falsas. Chama-se a esta
acção, a acção por defeito, o que se faz quando todo o resto falha.
É muito importante que se compreenda que estamos aqui a tratar de verdadeiras alter-
nativas, i.e., mútuamente exclusivas. Cada vez que uma estrutura deste tipo é executada,
só uma das acções será efectuada.
O exemplo seguinte traduz uma situação em que o programa, confrontado com a
necessidade de classificar uma nota numérica, pode escolher uma de entre seis notas

35
qualitativas diferentes. Só uma estrutura condicional imbricada lhe permitirá resolver o
problema.

Exemplo de aplicação
If (nota < 0) Or (nota > 20) Then
resultado = "Nota Invalida!"
ElseIf nota < 6 Then
resultado = "Mau"
ElseIf nota < 10 Then
resultado = "Mediocre"
ElseIf nota < 14 Then
resultado = "Suficiente"
ElseIf nota < 17 Then
resultado = "Bom"
Else
resultado = "Muito Bom"
End If

É possível imbricar um qualquer número 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 pro-
grama, ou seja, executar diferentes sequências de instruções conforme as circunstâncias
do momento. As estruturas de controlo repetitivo (também conhecidas por ciclos)
permitem repetir um dado conjunto de instruções o número de vezes que fôr necessário.
Existem diversas variantes de ciclos, diferindo umas das outras pela forma como é
controlada a execução das instruções contidas no corpo do ciclo. Genericamente, pode-se
dizer que uma estrutura de controlo repetitiva (ou ciclo) assegura a execução repetida de
um dado conjunto de instruções dependendo do resultado do teste de uma determinada
condição de funcionamento. De facto, como veremos, também os ciclos dependem da
verificação de uma condição, normalmente de forma explícita, noutros casos implicita-
mente.

5.2.1 Estruturas de Controlo Do...Loop


Estão disponíveis quatro variantes deste ciclo: Do While e Do Until, com teste no prin-
cípio ou no fim. Vejamos em detalhe as diversas variantes. O fluxograma da primeira
encontra-se na Figura 22 na página seguinte:
Analizando esse fluxograma, pode-se observar que tudo roda à volta do teste a uma
condição, descrita como condição de funcionamento. Caso, na altura em que o teste
é executado, a condição for verdadeira, as instruções que compõem o chamado corpo
do ciclo serão executadas, após o que novo teste à condição será efectuado. Enquanto

36
Figura 22: Estrutura de controlo repetitivo Do...While

a condição se verificar ser verdadeira, o programa não sairá deste ciclo. Na 1a vez em
que a condição se mostrar falsa, o ciclo terminará e o programa poderá continuar coma
s instruções seguintes.
A sintaxe em VBA desta estrutura de controle é a seguinte:
1 Do While c o n d i c a o
2 [ instrucoes ]
3 Loop
A segunda variante é muito semelhante à primeira. A grande diferença diz respeito à
condição de controle. Neste caso, temos a chamada condição de termo (ou de fim) o que
faz com que o ciclo funcione enquanto a condição for falsa ou, por outras palavras, até
que a condição de termo seja verdadeira.
A sintaxe desta variante será então:
1 Do
2 [ instrucoes ]
3 Loop U n t i l c o n d i c a o
Como se pode deduzir do atrás dito, é possível tranformar uma estrutura Do...While
numa Do...Until desde que se substitua a palavra While pela Until e se negue a condição
de controlo. Escolher uma outra estrutura de controlo depende, no fundo, do jeito do pro-
gramador e, sobretudo quando se usam condições múltiplas, da forma como a expressão
lógica traduz com maior ou menor facilidade a condição em linguagem normal.

5.2.2 Ciclos controlados por contador


Usando como base estas duas estruturas de controlo repetitivo é possível construir dois
tipos de ciclos: ciclos controlados por um contador e ciclos controlados por aquilo que se
designa como sentinela. Comecemos pelos primeiro.

37
Figura 23: Estrutura de controlo repetitivo Do...Until

Um ciclo controlado por contador baseado na estrutura Do While pode assumir a


seguinte forma genérica:
Decorrendo do que vimos na secção anterior, é possível construir este ciclo usando a
estrutura Do...Until.
Há que ter em conta as seguintes questões na construção de um ciclo controlado por
contador usando as estruturas de controlo Do...While ou Do...Until :

• Especificar a condição de funcionamento do ciclo

• Inicializar a variável contadora

• Incluir no corpo do ciclo uma instrução que incremente ou decremente a variável


contadora.

Quando se usam estas estruturas, ao contrário do que se passa com a estrutura de


controlo repetitivo For...To...Next, a analizar na Secção 5.2.4 na próxima página, é da
responsabilidade do utilizador assegurar-se de que tais acções são correctamente execu-
tadas.
Um último aspecto a observar é o seguinte: só é viável construir um ciclo controlado
por contador quando é possível conhecer à partida o número de vezes que ele vai funcionar
ou ,por outras palavras, o número de repetições necessárias. Isso nem sempre é possível.
Nesses casos, a alternativa será usar ciclos controlados por sentinela.

5.2.3 Ciclos controlados por sentinela


Quando não é possível conhecer antecipadamente o número de vezes que o ciclo deverá
ser executado é necessário usar uma técnica diferente: ciclos controlados por sentinela.
Por sentinela deve entender-se um valor limite que assinala o fim de uma dada sequência
de valores, mas que não esteja incluído nesse conjunto de valores.

38
Figura 24: Ciclos controlados por contador

Exemplo
Se o utilizador estiver a introduzir os dados referentes a
um conjunto de alunos identificados pelos seus números
de matrícula, a introdução de um número com menos de
6 dígitos (no caso do ISEP) como, or exemplo, o valor 1,
permitirá indicar ao programa que a presente sequência
de introdução de dados deve terminar.

A selecção do valor sentinela é da responsabilidade do programador, devendo ser


escolhido fora do intervalo possível de valores a introduzir, podendo ainda, ter-se em
atenção a possível ocorrência de valores fora desse intervalo que possam resultar de algum
eventual erro de digitação. O valor sentinela escolhido não deve pois ser passível de
facilmente ocorrer por mero acidente.

5.2.4 Estrutura de Controlo For...Next


Este ciclo permite repetir um dado conjunto de instruções um número pré-determinado de
vezes. Como vimos na secção anterior, nem sempre é possível saber de antemão quantas

39
Figura 25: Ciclos controlados por sentinela

vezes as instruções contidas no corpo do ciclo devem ser repetidas. Nesse caso, deverão
ser utilizadas as estruturas de controlo repetitivo estudadas na Secção 5.2.1 na página 36.
A sintaxe da estrutura For..To..Next é:
1 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
2 [ instrucoes ]
3 Next
Esta estrutura baseia-se na existência dum contador que incrementa automaticamente
o conteúdo da variável contador, chamada variável de controlo do ciclo, cada vez
que o ciclo funciona, isto é, cada vez que as instruções contidas no corpo do ciclo são
executadas. No início contador vai conter o valor inicial e após valorfinal - valor inicial
iterações atingirá o valor final. Nesse momento o ciclo terminará.
A inicialização da variável contadora, o seu incremento/decremento e a verificação da
condição de funcionamento do ciclo (contador <= fim) é da responsabilidade da própria
estrutura de controlo. O programador deve, apenas, especificar qual o valor de início e
de fim (ou, por outras palavras, o número de vezes que o ciclo vai funcionar) e quais as
instruções que o ciclo vai repetir (o corpo do ciclo).
O conteúdo da variável de controlo do ciclo pode ser utilizado por instruções contidas

40
no corpo do ciclo, mas não deve, sob pretexto algum, ser modificado por estas instruções,
sob pena de se perder o controlo do funcionamento do ciclo.
A estrutura de controlo verifica no início de cada iteração (repetição) do ciclo se a
condição de funcionamento do ciclo é ainda verdadeira. Caso seja falsa, o ciclo terminará,
e o programa passará a executar as instruções que se seguem.
Pode ainda ser utilizada a seguinte sintaxe alternativa:
1 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
2 [ instrucoes ]
3 Next
A diferença está na utilização da palavra Step após a especificação do valor final. A sua
inclusão é opcional: caso se pretenda que o conteúdo de variável seja incrementada uma
unidade de cada vez, é desnecessário especificar o passo. Em caso contrário, Step passo
permitirá incrementar o valor de variável de um valor diferente da unidade (positivo ou
negativo).
Caso o valor de passo seja positivo a variável contadora será incrementada. Se pre-
tendermos, no entanto, efectuar um decremento, deverá ser utilizado um valor negativo
para passo. Obviamente, nesse caso, a condição de funcionamento do ciclo passará a ser
contador >= fim.
Repara-se que nesta estrutura de controlo, ao contrário das estudadas anteriormente,
o incremento ou decremento da variável de controle do ciclo é automático. Outro aspecto
interessante é que a condição de funcionamento do ciclo é implícita. Ela existe e é
verificada mas não é especificada de forma explícita, apenas de forma indirecta ao fixarem-
se os valores inicial e final da variável de contagem.
Existe ainda em VBA uma estrutura de controlo que é uma variante da For...Next e
que opera numa colecção de objectos. Uma colecção é um conjunto de objectos idênticos,
pertencentes à mesma classe, e que são referenciáveis mediante um índice. Por exemplo,
um Workbook é constituído por um conjunto de objectos da classe Worksheet 9 .
A sintaxe desta estrutura é a seguinte:
1 For Each elemento In C o l e c c a o
2 [ instrucoes ]
3 Next
O bloco de instruções será aplicada a cada elemento da colecção de objectos em causa.
A seguir é apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo:
1 Public Sub FormataBordo ( )
2 Dim c e l l O b j e c t As Range
3 For Each c e l l O b j e c t In S e l e c t i o n
4 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
5 Next
6 End Sub
É criada a variável cellObject para guardar um objecto do tipo Range (que representa
uma gama de células - assunto tratado na Secção 7.4). O ciclo For Each...Next aplica
9
Por sua vez, um workbook é também um objecto. Um objecto pode assim ser ele próprio uma
colecção de objectos.

41
o método BorderAround a cada uma das células contidas na gama representada por
cellObject. Com os argumentos fornecidos no exemplo, este método formata o bordo
dessas células a vermelho e uma linha grossa.

5.2.5 Estruturas de controlo repetitivo imbricadas


Foi dito anteriormente que o corpo de um ciclo era constituído pelo conjunto de instruções
que o ciclo irá executar repetidamente. Foi também dito que nesse conjunto de instruções
se poderiam incluir qualquer tipo de instruções, mesmo constituindo outras estruturas
de controlo repetitivo. Prosseguindo com os exemplos apresentados na secção anterior,
abaixo se pode ver um exemplo de uma utilização de um ciclo dentro de outro. Destes
ciclos se diz que se encontram imbricados um dentro do outro.

Figura 26: Exemplo de Ciclos Imbricados

42
Exemplo de utilização de Ciclos Imbricados
‘Leitura do 1o número cujo factorial vai ser calculado
num = InputBox("Introduza um no positivo não nulo", "Calculo de factoriais")
Do Until num < 0
’calculo do factorial de num
factorial = 1
contador = 1
Do Until contador > num
factorial = factorial * contador
contador = contador +1
Loop
‘Leitura do número seguinte
num = InputBox("Introduza um no positivo não nulo", "Cálculo de factoriais")
Loop

5.3 Variáveis indexadas - vectores e matrizes


Até agora, temos trabalhado essencialmente com variáveis que podemos classificar como
individuais (isto é, cada variável podendo conter ao mesmo tempo apenas um só valor).
Como essas variáveis não podem conter simultaneamente mais que um dado, a atribuição
de um novo valor a essa variável implica a destruição do valor anteriormente nela contido.
Mediante a utilização de um novo tipo de variáveis, as variáveis do tipo Array (Vector),
passa a ser possível armazenar na mesma variável múltiplos valores desde que sejam do
mesmo tipo. Estamos, portanto, a utilizar agora variáveis que se podem classificar como
variáveis múltiplas.

Figura 27: Um vector é uma variável múltipla

Um vector é uma lista ordenada de variáveis simples do mesmo tipo. Pode também ser
visto como um conjunto de variáveis simples agrupadas. Todos as variáveis membros desse
vector partilham o mesmo nome (o nome do vector). São identificadas individualmente
mediante o valor dum índice, que determina qual a sua posição dentro do vector. É por
isso que estas variáveis são conhecidas por variáveis indexadas.

43
Os valores do índice devem obrigatoriamente ser do tipo Integer. O primeiro valor do
índice é zero10 .

Figura 28: Um exemplo de vector de strings

Um elemento de um vector é identificado utilizando o nome do vector seguido do valor


do índice dentro de parêntesis
nome_vector(indice)
var_Multipla(3) 4o elemento do vector ‘var_Multipla’
var_Multipla(7) 8o e último elemento do vector ‘var_Multipla’
Exemplos:
notas(14) 15o elemento do vector ‘notas’
nomes(0) 1o elemento do vector ‘nomes’

5.3.1 Declaração de vectores


Como qualquer outra variável, uma variável do tipo Array deve também ser declarada
(criada) antes de poder ser usada. Para tal, deve ser usada a instrução Dim, que reserva
espaço em memória suficiente para armazenar o número previsto de elementos do vector
11
. Uma das formas de utilizar a instrução Dim para declarar vectores é a seguinte:
Dim nome_vector(num_elementos) As Tipo
Exemplos: Dim var_Multipla(8) As Integer Dim notas(30) As Single Dim no-
mes(100) As String
Nota: num_elementos não se refere ao valor máximo que a variável índice pode
assumir (7, no caso do vector var_Multipla) mas sim ao número de elementos do vector
(8, neste caso).
Por este processo a declaração do limite inferior faz-se de forma implícita: por defeito
assume-se como limite inferior do índice o valor zero (ou 1 se tal for especificado mediante
a instrução Option Base 1 ).
10
É possível forçar que os índices dos vectores comecem do valor 1 usando a directiva Option Base 1.
11
Adicionalmente, a instrução Dim atribui valores iniciais a todos os elementos do vector (zeros no
caso de vectores numéricos e strings nulas no caso de vectores alfa-numéricos).

44
Uma forma alternativa de utilizar a instrução Dim para declarar vectores implica a
utilização 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 variável múltipla composta de elementos do mesmo tipo agrupados
na mesma estrutura, a forma mais adequada de executar uma mesma acção 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 afirmação contida no parágrafo an-
terior, observe-se o problema descrito na Figura 29 e atente-se nas diferentes soluções
propostas.

Figura 29: Porquê usar ciclos para processar vectores?

Quando confrontado com o problema de armazenar e actualizar a informação relativa


ao preço de 100 produtos, um programador poderia ser tentado a criar 100 variáveis
individuais para guardar cada um desses preços. Isso, no entanto, obrigá-lo-ia a incluir
no seu programa 100 instruções Dim para criar outras tantas variáveis individuais. Por

45
outro lado, quando necessitasse de actualizar os preços em, por exemplo, 5%, teria que
inserir 100 instruções do tipo preçoN = preçoN * 1,05.
Do atrás exposto facilmente se verificará que esta solução não tem qualquer exequi-
bilidade prática. Analizemos então a solução alternativa usando uma variável indexada:
em vez de 100 variáveis individuais teremos apenas um vector de 100 elementos, cada ele-
mento capaz de armazenar o preço de um produto. Consequentemente, teremos apenas
uma instrução Dim, no caso, algo como Dim preços As single. E quando necessitar
de actualizar os preços, como o vector é uma variável múltipla indexada, haverá apenas
que construir um ciclo que percorra automáticamente o vector, actualizando cada um dos
seus elementos.

Exemplo
Private Sub cmdGo_Click()
Dim vectorSqr(100) As Double
Dim i As Integer ‘ variável índice
Dim res As Single
lstTabela.Clear
For i = 0 To txtMaior
res = Sqr(i)
vectorSqr(i) = res
lstTabela.AddItem Format(res, "0.000")
Next i
End Sub

Figura 30: Exemplo de processamento de um vector

O programa descrito na Figura 30 permite calcular e apresentar sob a forma de uma


tabela as raízes quadradas de todos os números inteiros compreendidos entre 0 e um dado
limite superior a especificar pelo utilizador na TextBox txtMaior (a largura do intervalo
não deve exceder 100, visto ser esta a dimensão do vector). Os valores calculados são
armazenados num vector para eventual futura utilização.
Na variante desta sub-rotina, contida no exemplo descrito na Figura 31 na próxima
página, é possível especificar também o limite inferior do intervalo, para além de se
demonstrarem algumas técnicas de formatação da saída de dados.
De notar que na primeira versão do programa se usou a mesma variável i para controlar
o ciclo For e para armazenar os valores dos índices do vector. Tal aconteceu porque foi
possível estabelecer naquele caso uma correspondência directa entre os valores da variável
de controlo do ciclo i e os valores do índice que controla as posições dos elementos do
vector.
Já na segunda variante do programa tal não era possível, visto que a variável de con-
trolo do ciclo iria conter valores (desde o limite inferior ao limite superior do intervalo) que
não deveriam corresponder às posições do vector em que o armazenamento dos resultados
se iria efectuar.
Em qualquer das variantes apresentadas, o processamento dos elementos do vector
consistiu em operações de escrita (de atribuição) que modificaram o seu valor. É igual-

46
Exemplo Private Sub cmdGo_Click()
Dim vector(100) As Double
Dim i As Integer
Dim indice As Integer
Dim res As Single
Dim linha As String
lstTabela.Clear
indice = 0
For i = txtMenor To txtMaior
res = Sqr(i)
vector(indice) = res
linha = Format(Str(i), "##0") + - "+ Format(vector(indice), "000.000")
lstTabela.AddItem linha
indice = indice + 1
Next i
End Sub

Figura 31: Outro exemplo de processamento de um vector

mente possível efectuar operações de leitura sobre todos ou parte dos elementos dum
vector. Neste caso, como é óbvio, a variável do tipo Array deverá encontrar-se do lado
direito de uma operação de atribuição:
var = vector(indice)
A instrução acima copia o conteúdo de vector na posição índice para a variável var.

6 Funções e Procedimentos
7 Programação do Excel usando VBA
Nesta secção vamos aprender a trabalhar com os objectos do Excel mais comuns: o Work-
book (Livro de trabalho), a Worksheet (Folha de cálculo) e o Range (gama de células). São
objectos que pertencem, por sua vez, ao objecto principal que é a Application (Aplicação,
neste caso, o próprio Excel).

7.1 Como aceder às funções standard do Excel


Se bem que o VBA possua várias dezenas de funções pré-definidas, é muito conveniente
poder utilizar directamente qualquer uma das centenas de funções standard oferecidas
pelo Excel. Para poder aceder a elas a partir do VBA é necessário utilizar a propriedade

47
WorsheetFunction do objecto Application 12 . Por exemplo, para, num macro, calcular o
valor médio de uma gama de células (identificada pelo nome "Dados") poderia ser usada
a seguinte instrução:
1 med = A p p l i c a t i o n . WorksheetFunction . Average ( Range ( "Dados" ) )
Esta instrução permite aceder à função standard Average do Excel, à qual é fornecido
um objecto do tipo Range, representando a gama de células descritas sob o nome "Dados".

7.2 Trabalhar com objectos Workbook


Usando estes objectos, o VBA pode criar novos livros de trabalho, abrir ou fechar exis-
tentes, entre outras acções possíveis. Para especificar qual o livro de trabalho com que
queremos trabalhar podemos fazê-lo de três 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 próprio pro-
grama em VBA (e não o utilizador) está a operar.

Para abrir um Livro de Trabalho aplica-se o método Open ao objecto Workbooks:


1 Sintaxe :
2 Workbooks . Open Nome_do_ficheiro

1 Exemplo :
2 Workbooks . Open "C: \ Documentos \ E x c e l \Dados . x l s "
Os métodos Save e Close são utilizados de forma similar para salvaguardar o conteúdo
dum ficheiro e para o fechar, respectivamente.

7.3 Trabalhar com objectos Worksheet


Normalmente um livro de trabalho possui mais do que uma folha de cálculo (é normal-
mente criado logo à partida com três). Para escolher qual a folha de cálculo com que se
pretende trabalhar usa-se o objecto Worksheets especificando um índice ou o nome da
folha de cálculo em causa:
1 Worksheets ( 2 )
2 Worksheets ( " Custos " )
Para acrescentar uma folha de cálculo ao livro de trabalho o método adequado será o
Add :
1 Exemplo :
2 Worksheets .Add A f t e r := Worksheets ( " Medidas " )

12
Claro que só as funções do Excel que não se encontram duplicadas no VBA podem ser acedidas por
meio da propriedade WorsheetFunction.

48
7.3.1 Propriedades de Worksheet
Nesta secção são referidas algumas das suas propriedades mais úteis:

• Worksheet.Name - permite mudar ou obter o nome da folha de cálculo. O exemplo


abaixo muda o nome de "Folha 1" para "Medidas":
1 Worksheets ( " Folha ␣1" ) .Name = " Medidas "

• Worksheet.StandardWidth - permite especificar a largura standard das colunas duma


folha de cálculo.

7.3.2 Métodos de Worksheet


Eis alguns dos métodos normalmente aplicados a este tipo de objectos:

• Worksheet.Activate - torna activa a folha de cálculo especificada 13 . O exemplo


seguinte torna activa a folha de cálculo "Custos" do livro de trabalho "Dados 2007":
1 Workbook ( "Dados␣ 2007 " ) . Worksheets ( " Custos " ) . Activate

• Worksheet.Copy - copia a folha de cálculo especificada para outra posição dentro


do livro de trabalho.
1 Sintaxe :
2 Worksheet . Copy [ P o s i t i o n ]

O argumento Position é opcional e pode ter o valor Before ou After indicando a


posição onde a cópia será inserida. Caso o argumento não seja incluído, a cópia
será inserida num novo livro de trabalho.
1 Exemplo :
2 Worksheets ( 2 ) . Copy A f t e r := Worksheets ( 3 )

O exemplo anterior faz uma cópia da 2a folha de cálculo e insere-a a seguir à 3a .


O método Move usa uma sintaxe idêntica para mover uma determinada folha de
cálculo para outra posição.

• Worksheet.Delete - permite eliminar a folha de cálculo especificada.

7.4 Trabalhar com objectos Range


Um objecto do tipo Range pode representar uma simples célula, um conjunto de células,
uma linha ou uma coluna. Não existe em VBA um objecto específico para representar
uma célula individual.
Para nos referirmos a uma célula ou gama de células podemos aplicar o método Range
ao objecto Worksheet usando uma de duas sintaxes possíveis:
13
A folha de cálculo activa é aquela que está visível no momento.

49
1 Sintaxe 1:
2 Worksheet . Range (Nome)
3 Range (Nome)

1 Sintaxe 2:
2 Worksheet . Range ( Ce lul a1 , C e l u l a 2 )
A 1a sintaxe usa nomes de gamas pré-definidos 14 , enquanto que a 2a utiliza as referên-
cias das células que definem dois vértices opostos da área rectangular contendo as células
que se quer especificar. Caso se omita Worksheet em qualquer das sintaxes anteriores, o
VBA pressupõe que se trata da folha de cálculo activa naquele momento.
1 Exemplos :
2 Range ( "C5" ) . Value = 100
3 Range ( "D1" , "D10" ) . Value = 0
4 Worksheets ( 3 ) . Range ( "Dados" ) . C l e a r C o n t e n t s
O 1o exemplo guarda o valor 100 na célula C5. O 2o exemplo atribui o valor zero
a todas as células da gama D1 a D10. O 3o exemplo limpa o conteúdo das células da
gama "Dados" da 3a folha de cálculo. A propriedade Value dos objectos Range permite
conhecer ou modificar o seu valor.
Para identificarmos apenas uma célula podemos também utilizar o método Cells.
1 Sintaxe :
2 Objecto . C e l l s ( Linha , Coluna )
Objecto pode ser um objecto Worksheet ou Range. A sua omissão, leva o VBA a
partir do princípio que se trata da folha de cálculo activa. Linha e Coluna são valores
numéricos indicando qual a linha e qual a coluna na intersecção das quais a célula se
encontra15 .
1 Exemplo :
2 For c o l u n a = 2 To 13
3 C e l l s ( 2 , Coluna ) . Value = "Mes␣" & c o l u n a − 1
4 Next
O exemplo acima usa um ciclo For...To para preencher todas as células da gama C2 a
C13 com um texto "Mês X" em que X é o no do mês. É usado o operador de concatenação
de strings & para efectuar a colagem.
Caso se pretenda identificar uma linha ou coluna completa, podem ser utilizados os
métodos Rows e Columns.
1 Sintaxe :
2 Objecto . Rows ( I n d i c e )
3 Objecto . Columns ( I n d i c e )
Para ilustrar a utilização do método Rows atente-se no seguinte exemplo16 :
14
Atribuídos em Excel usando o Menu "Name/Define".
15
Se o objecto for do tipo Range, Linha e Coluna referir-se-ão à linha e à coluna dentro da gama de
células especificada.
16
Adaptado de um exemplo contido em [?].

50
1 Sub I n s e r e L i n h a s ( gama As Range , num As Integer )
2 Dim num_linhas As Integer , u l t i m a _ l i n h a As Integer
3 Dim i As Integer
4 With gama
5 num_linhas = . Rows . Count
6 u l t i m a _ l i n h a = . Rows ( num_linhas ) . Row
7 For i = 1 To num
8 . Rows ( u l t i m a _ l i n h a + i ) . I n s e r t
9 Next
10 End With
11 End Sub
Esta sub-rotina recebe como argumentos uma gama de células (um objecto do tipo
Range) e um inteiro especificando o número de linhas a inserir abaixo da última linha
dessa gama. A estrutura With...End...With é muito prática porque permite executar
um conjunto de instruções 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 referência a esse objecto, usando-se apenas os seus métodos e propri-
edades. Assim, .Rows.Count refere-se ao número 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 aplicação do método Insert à ultima linha da gama.
Para testar a sub-rotina InsereLinhas, use-se a seguinte rotina de teste:
1 Sub i n s e r e T e s t e ( )
2 I n s e r e L i n h a s Worksheets ( 3 ) . Range ( "Dados" ) , 3
3 End Sub
Apresentamos outro exemplo, agora referido ao método Columns em que a largura da
coluna E (5a coluna) é mudada para 15:
1 Columns ( 5 ) . ColumnWidth = 15

8 Notas finais
Parte da estrutura e alguns dos exemplos apresentados foram inspirados no livro de Paul
McFredies[?]. Foram ainda reutilizados materiais contidos na Seventa de Introdução à
Computação da minha autoria[2].

Referências
[1] Paul McFredies. VBA for the Microsoft Office System, QUE.

[2] António Silva. Sebenta de Introdução à Computação - Visual Basic, ISEP.

51

Você também pode gostar

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy