Académique Documents
Professionnel Documents
Culture Documents
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
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
.
.
.
.
.
52
53
53
53
54
54
.
.
.
.
.
.
.
.
56
57
58
58
59
59
60
60
62
5.3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
.
.
.
17
20
26
27
Listings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
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
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.
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".
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.
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
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
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
13
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
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
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.
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
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
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.
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
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
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
Isto porque as diferentes classes de objectos no so necessariamente sensveis aos mesmos tipos de
eventos.
22
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
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
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
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.
25
Ttulo
cone
0 - Nenhum
16 - Mensagem
32 - Mensagem
48 - Mensagem
64 - Mensagem
Crtica
de Aviso 1
de Aviso 2
de Informao
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
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.
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
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
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
29
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
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).
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.
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).
32
ListCount
4.4
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
5.1
If...Then...Else
34
I f c o n d i c a o Then
[ instrucoes ]
Else
[ instrucoes alternativas ]
End I f
If...Then
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
36
5.1.3
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.
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
possvel imbricar um qualquer nmero de blocos ElseIf dentro de uma dada estrutura condicional.
5.2
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
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
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
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
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
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.
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
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
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
1
2
3
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
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
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
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
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
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
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
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
9
10
11
12
13
14
15
16
17
Funes e Procedimentos
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.
51
6.1
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
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.
6.2
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".
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
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
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
Mtodos de Worksheet
54
7.3
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
55
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
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
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
8.2
58
8.3
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
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
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
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
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
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
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
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
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.
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
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