Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação em VBA PDF
Programação em VBA PDF
Texto Introdutrio
Antnio Silva
DEI-Isep
2009-10-28
1
.
Contedo
1 Introduo 8
2 Conceitos Bsicos 8
2.1 O que um Macro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Tcnicas de construo dum Macro . . . . . . . . . . . . . . . . . . . . . 9
2.3 Gravao de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 A escrita de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 O editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6 Criao de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3
5.2.3 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . 41
5.2.4 Estrutura de Controlo For..To..Next . . . . . . . . . . . . . . . . . 43
5.2.5 Estruturas de controlo repetitivo imbricadas . . . . . . . . . . . . 44
5.3 Variveis indexadas - vectores e matrizes . . . . . . . . . . . . . . . . . . 46
5.3.1 Declarao de vectores . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.2 Processamento de vectores . . . . . . . . . . . . . . . . . . . . . . 48
6 Funes e Procedimentos 50
6.1 Exemplo de funo criada pelo programador . . . . . . . . . . . . . . . . 51
6.2 Como aceder s funes standard do Excel . . . . . . . . . . . . . . . . . 52
9 Notas finais 63
4
Lista de Figuras
1 Janela de invocao do ambiente de Gravao de Macros . . . . . . . . . 9
2 Janela de Gesto de Macros . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5 Criao de novo Mdulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6 Diferentes tipos de dados e o seu armazenamento em memria . . . . . . 15
7 Como forar a declarao explcita automaticamente . . . . . . . . . . . 16
8 Uma Form e vrios Controlos . . . . . . . . . . . . . . . . . . . . . . . . 19
9 Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
10 Lista de eventos disponveis . . . . . . . . . . . . . . . . . . . . . . . . . 22
11 Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
12 Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
13 Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
14 Vrios optionButton agrupados numa frame . . . . . . . . . . . . . . . . 30
15 Vrios checkBox agrupadas numa frame . . . . . . . . . . . . . . . . . . 31
16 Uma Frame agrupando trs botes de comando . . . . . . . . . . . . . . 31
17 Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
18 Estrutura de controlo condicional If...Then...Else . . . . . . . . . . . . . 34
19 Estrutura de controlo condicional If...Then . . . . . . . . . . . . . . . . 35
20 Estruturas de controlo condicional imbricadas . . . . . . . . . . . . . . . 37
21 Estrutura de controlo repetitivo Do...While . . . . . . . . . . . . . . . . 39
22 Estrutura de controlo repetitivo Do...Until . . . . . . . . . . . . . . . . 40
23 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . . . . . 41
24 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . . . . . 42
25 Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . . . . 45
26 Um vector uma varivel mltipla . . . . . . . . . . . . . . . . . . . . . 46
27 Um exemplo de vector de strings . . . . . . . . . . . . . . . . . . . . . . 47
28 Porqu usar ciclos para processar vectores? . . . . . . . . . . . . . . . . . 48
29 Funes como caixas pretas . . . . . . . . . . . . . . . . . . . . . . . . . 51
30 Utilizao da funo margemLucro numa frmula . . . . . . . . . . . . . 52
31 Criao de uma Form no VBA . . . . . . . . . . . . . . . . . . . . . . . 57
32 A UserForm para Entrada Mltipla de Dados . . . . . . . . . . . . . . . 61
33 Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5
Lista de Tabelas
1 Tipos de dados suportados pelo VBA . . . . . . . . . . . . . . . . . . . . 17
2 Propriedades mais comuns dos objectos grficos VBA . . . . . . . . . . . 20
3 Valores de configurao das caractersticas de uma Caixa de Mensagem . 26
4 Valores devolvidos por uma Caixa de Mensagem . . . . . . . . . . . . . . 27
6
Listings
1 VerificaValor - exemplo de funo definida pelo utilizador . . . . . . . . . 12
2 verificaGama - exemplo de funo definida pelo utilizador . . . . . . . . . 13
3 Exemplo de aplicao de If..Then..Else imbricados . . . . . . . . . . . . 38
4 FormataBordo - exemplo de sub-rotina usando For..Next . . . . . . . . . 44
5 Exemplo usando Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . 45
6 Exemplo de processamento de um vector . . . . . . . . . . . . . . . . . . 49
7 Outro exemplo de processamento de um vector . . . . . . . . . . . . . . . 49
8 Funo margemLucro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
9 Sub-rotina InsereLinhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
10 Handler do objecto cmdFechar para o evento click . . . . . . . . . . . . 59
11 Exemplo de sub-rotina de invocao de uma UserForm . . . . . . . . . . 60
12 Exemplo de sub-rotina de inicializao de uma UserForm . . . . . . . . . 61
13 Handler do objecto cmdFechar para o evento Click . . . . . . . . . . . . 61
14 Sub-rotina de inicializao da UserForm . . . . . . . . . . . . . . . . . . 62
15 Handler associado ao objecto Tabstrip1 para o evento Change . . . . . . 63
7
1 Introduo
Este texto tem como objectivo apoiar o ensino das tcnicas de programao de compu-
tadores, utilizando, como ambiente de aplicao, programas como o gestor de folhas de
clculo Excel.
Destina-se assim aos alunos que j possuem alguns conhecimentos da utilizao e
funcionamento desta aplicao. Concretamente, presume-se que esto j familiarizados
com os conceitos de folha de clculo, de livro de trabalho, de frmulas e funes standard.
A linguagem de programao que vai ser utilizada ser o VBA (Visual Basic for
Applications). uma linguagem que permite acrescentar capacidades adicionais a certo
tipo de aplicaes informticas, concretamente as pertencentes ao Microsoft 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.
2 Conceitos Bsicos
O VBA constitui uma ferramenta poderosa nas mos de programadores experimentados
mas pode, ao mesmo tempo, ser muito til a qualquer utilizador, mesmo inexperiente.
De facto, no dia a dia da utilizao destas aplicaes, defrontamo-nos com a neces-
sidade de repetir a mesma tarefa vrias vezes ao dia ou, de em certas ocasies, ter que
repetir uma determinada tarefa uma srie de vezes de seguida. Seja escrever ou formatar
um certo texto, seja executar uma srie de comandos ou escolher opes de menus, seja
ainda realizar a formatao complexa de um documento, so inmeras as ocasies em
que dava jeito poder automatizar essas tarefas repetitivas.
aqui que entra o VBA, permitindo a construo daquilo que se designa vulgarmente
por macros.
8
2.2 Tcnicas de construo dum Macro
Se bem que um macro seja um programa em VBA, nem sempre necessrio escrev-lo de
forma explcita, ou seja, escrevendo 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.
9
Figura 2: Janela de Gesto de Macros
Aps se premir a tecla OK, aparecer uma pequena janela que permitir controlar
o processo de gravao e dever-se- dar incio execuo das aces que o macro vai
substituir. Quando se tiver executado a ltima aco a incluir no macro, basta dar a
indicao de que a gravao terminou.
Uma vez tal realizado, esse macro passar a estar disponvel mediante a invocao
da combinao de teclas especificada anteriormente (no caso da Figura 1 na pgina pre-
cedente, seria Ctrl+Shft+M) e realizar, de forma automtica, exactamente a mesma
sequncia de aces que tnhamos realizado manualmente.
Em alternativa, mediante a combinao de teclas ALT-F8, pode ser accionada a janela
de Gesto de Macros (Figura 2), onde, entre outras aces, pode ser escolhido o macro a
ser executado.
Para facilitar o acesso s facilidades de gravao e edio de macros, ser conveniente
tornar visvel de forma permanente a barra de ferramentas de Visual Basic (Figura 3).
No Excel, isto poder fazer-se mediante a opo de Menu "View/Toolbars/Visual Basic".
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?
Do lado esquerdo na Figura 4 podem-se ver duas janelas, a primeira das quais
designada por Explorador de Projectos e que serve para mostrar o contedo do projecto
VBA actual. Um projecto em VBA inclui um ficheiro duma aplicao Office (como, por
exemplo, uma folha de clculo do Excel) e todos os ficheiros VBA associados, incluindo
os prprios macros e eventuais user forms (janelas de interface prprias utilizadas pelos
11
Figura 5: Criao de novo Mdulo
macros1 ).
Para poder comear a escrever macros usando o VBA necessrio criar um mdulo
que o possa albergar, o que conseguido usando a opo de menu "Insert/Module".
Como consequncia, para alm do novo mdulo aparecer referido na janela do Explora-
dor de Projectos, ser criada uma janela nova onde ser possvel escrever o cdigo que
constitui o novo macro. Se j existir algum mdulo criado, bastar seleccionar o mdulo
pretendido no explorador de projectos, posicionar o cursor na janela correspondente a
esse mdulo, numa rea fora de qualquer macro j existente, e seleccionar a opo de
menu "Insert/Procedure". Aparecer uma janela prpria (Figura 5) onde ser possvel
dar o nome ao novo procedimento (o conjunto de instrues que constituir o macro),
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).
12
No nos vamos de momento preocupar com os detalhes do cdigo que constitui o
macro. Basta verificar que, em 1o lugar, constitudo por uma linha de cabealho que
especifica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seu
nome (verificaValor). O corpo do macro composto pela estrutura de controle condici-
onal (If...Then 3 ) que vai verificar se o contedo da clula B24 ou no maior que o valor
200. Caso essa condio seja verdadeira, o macro apresentar uma mensagem no ecran
dizendo que o valor mximo foi excedido. Finalmente, o macro terminado com uma
linha contendo "End Sub".
O que este simples macro faz, portanto, verificar o contedo de uma clula especfica
da folha de clculo e avisar o utilizador caso o valor nela contido ultrapassar um valor
pr-determinado. Sempre que for necessrio fazer esta verificao, bastar invocar a
combinao de teclas que tenha sido associada a este macro.
verdade que sta verificao poderia ter sido realizada colocando numa clula uma
frmula contendo a funo standard do Excel IF. Mas suponhamos agora que se pretende
algo mais complicado, por exemplo, fazer essa verificao num conjunto de clulas e
apenas desencadear o alarme caso mais do que duas dessas clulas ultrapassem o limite
estabelecido. A sub-rotina modificada poderia ser algo como:
Listing 2: verificaGama - exemplo de funo definida pelo utilizador
1 Public Sub v e r i f i c a G a m a ( )
2 Dim i As Integer , c As Integer
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
13
Options na Janela de Gesto de Macros, invocada mediante ALT-F8.
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.
14
Figura 6: Diferentes tipos de dados e o seu armazenamento em memria
declaraes necessrias num bloco a colocar no incio, para mais fcil manuteno do
programa.
Em VBA, existem duas formas de declarao de variveis: explcita e implcita. A
declarao explcita exige a utilizao da instruo especfica
Dim ... As (Dimensionar ... Como).
Por exemplo, a instruo
Dim Preo As Integer
cria (declara) uma varivel com o nome Preo e do tipo Integer, ou seja, dimensio-
nada para receber dados do tipo integer (inteiro simples7 ).
A declarao implcita resume-se a utilizar pela primeira vez uma varivel sem qual-
quer declarao explcita prvia, dando-lhe um nome e atribuindo-lhe um valor. O VBA
criar automaticamente a varivel do tipo pretendido.
Esta segunda forma de declarar variveis tem, a despeito da sua simplicidade, um
problema grave: possvel, por distraco, criar uma varivel nova indesejada, quando o
que se pretendia era apenas escrever o nome de uma varivel j existente. Suponha, por
exemplo, que havia criado uma varivel "Distancia" mediante a 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, substituindo-
se ao programador. Dar-lhe- o nome "Distancia" e dimensiona-la- de forma a poder
guardar inteiros simples, j que essa a utilizao sugerida na instruo.
Agora suponha que adiante no programa, por engano, escrevia "Distncia" ao referir-se
varivel em causa. O VBA no emitir nenhum alerta, j que aceitou tranquilamente
"Distncia" como uma nova varivel. A forma mais prudente de lidar com declaraes de
variveis , pois, utilizar apenas declaraes explcitas, e instruir o VBA para no aceitar
declaraes implcitas, gerando uma mensagem de erro apropriada. Para tal, dever ser
acrescentada a instruo Option Explicit no incio do mdulo contendo o macro.
16
Tipo Descrio
Integer Inteiro simples, usado para representar inteiros entre -32768 e 32767
Long Inteiro longo, ou seja, compreendido entre -2.147.483.648 e
2.147.483.647
Single Real representado com preciso simples, com valores negativos compre-
endidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca
de 1,4E-45 e 3,4E38
Double Real representado com preciso dupla, usado para representar nmeros
reais muito maiores ou muito mais pequenos que com o tipo single
String Usado para representar texto (informao alfanumrica como letras,
algarismos e smbolos especiais); strings so representadas entre aspas
Boolean Usado para representar valores lgicos (True ou False)
Date Usado para representar datas ou valores de tempo; so representados
entre caracteres #
Object Serve para guardar referncias a objectos
17
varivel, substituir o valor nela contido pelo novo valor. Convem, assim, lembrar que
nesta operao o fluxo da informao se faz sempre da direita para a esquerda e no o
contrrio.
H ainda que ter em ateno o facto de que no normalmente aconselhvel atribuir
um valor de um dado tipo a uma varivel de tipo diferente. Os resultados podem ser a
perda de informao ou o mau funcionamento do programa. O VBA poder gerar uma
mensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentos
anmalos difceis de detectar e corrigir.
18
4 Como trabalhar com Objectos
Para que uma macro possa manipular o ambiente da aplicao, seja modificando a forma-
tao 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.
19
Os seus "mtodos" especificam o que pode ser feito com ele: acelerar, travar, mudar
de direco, etc;
4.1.1 Propriedades
As propriedades de um objecto so as suas caractersticas fsicas. Como na vida real, cada
objecto possui caractersticas prprias ou propriedades, que podem ser quantificadas ou
especificadas, como sejam as suas dimenses ou o tipo de letra que usa. A cada objecto
est associada uma lista de propriedades a que possvel atribuir valores, determinando
a sua aparncia, localizao e outros detalhes. Pode-se ento dizer que as propriedades
de um objecto definem a forma como ele se apresenta ou se comporta.
Diversos objectos podem partilhar a mesma propriedade. Essa propriedade, no en-
tanto, pode afectar esses objectos de forma diferente.
J vimos que quer os elementos do Excel como folhas de clculo ou prprio docu-
mento, quer elementos constituintes de interfaces grficas que os macros possam utilizar,
so considerados objectos. Na Tabela 2 so descritas algumas das propriedades mais
importantes e que so comuns maior parte dos objectos grficos.
Os valores que as propriedades de um dado objecto tomam podem ser consultados ou
modificados usando a janela de propriedades (Figura 9 na pgina seguinte). Nessa janela
aparece a lista de propriedades do objecto que estiver nesse momento seleccionado . Nela
pode observar, entre outras, algumas das propriedades referidas na lista acima (Caption,
Height e Font) e os respectivos valores no momento.
20
Figura 9: Janela de Propriedades
4.1.2 Mtodos
Os mtodos traduzem aces que um macro pode realizar sobre os objectos. Por exem-
plo, aplicar o mtodo Save ao objecto ActiveDocument implica desencadear o processo
de salvaguardar o contedo do documento activo num determinado ficheiro. Aplicar o
mtodo Clear a um objecto da classe ListBox ter como consequncia a eliminao de
todas as linhas nele contidas. A cada classe de objectos possvel aplicar um determinado
conjunto de mtodos.
Para vermos como um mtodo aplicado a um objecto, vamos considerar o objecto
Worksheet, que representa uma folha de clculo do Excel. Se pretendermos que o nosso
macro mova essa folha para uma nova posio dentro do Livro de Trabalho (Workbook ),
ele dever aplicar o mtodo Move a esse objecto, usando a seguinte sintaxe:
Worksheet.Move([Before][, After])
Exemplificando, se quisermos que o macro desloque a folha de clculo "Dados 2009"para
a posio imediatamente a seguir folha "Dados 2008", o comando a inserir no macro
ser:
Worksheets("Dados 2009").Move Before:=Worksheets("Dados 2008")
Como veremos mais frente, o objecto Worksheet definido como um elemento do
conjunto de folhas de clculo contidas no Livro de Trabalho. Este conjunto de folhas
representado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se folha
de clculo com o nome "Dados 2009".
4.1.3 Eventos
Os eventos so aces que, uma vez exercidas sobre um objecto, implicam a possibilidade
de ocorrer uma resposta automtica por parte dele. Basicamente, um evento algo que
acontece a um objecto. Por exemplo, a abertura de uma folha de um livro de trabalho
(workbook ) em Excel um evento. A insero de uma nova folha no livro de trabalho
21
outro exemplo de evento.
Para que um objecto possa reagir a um dado evento dever existir, previamente 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 no
saber o que fazer. Nenhuma resposta ser produzida.
22
Figura 11: Objectos e Eventos
associado a esse objecto (command1 ) um event handler adequado, o objecto ser j capaz
de responder ao evento e produzir o resultado desejado. Neste caso, esse resultado dever
ser efectuar os clculos necessrios para concluir se o nmero introduzido ou no primo
e apresentar essa concluso no rtulo lbl2.
23
Objecto.Propriedade
Se nos quisermos referir, por exemplo, propriedade ActiveWindow do objecto Ap-
plication, procederemos do seguinte modo:
Application.ActiveWindow
A propriedade ActiveWindow refere-se janela da aplicao com que estamos, de
momento, a trabalhar. No caso do Excel, podemos ainda referirmo-nos, por exemplo,
propriedade ActiveSheet para designar a folha de clculo em que se est a trabalhar ou a
ActiveCell para nos referirmos clula actualmente seleccionada.
Se pretendermos, por exemplo, 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 ins-
truo correcta seria:
conteudo = ActiveCell.Value
Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa proprie-
dade encontra-se armazenado o contedo da clula.
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.1 MsgBox
A funo MsgBox permite apresentar no ecran uma Caixa de Mensagem (Msg Box ).
Trata-se de uma pequena janela contendo um mensagem, pelo menos um boto de co-
mando e eventualmente um pequeno desenho (cone) ilustrativo do tipo de mensagem.
Na Figura 12 encontra-se um exemplo de uma destas janelas.
25
Uma Caixa de Mensagem destina-se a apresentar ao utilizador uma mensagem com
informao relevante, sejam avisos, resultados, perguntas ou sugestes. Uma janela deste
tipo tem um comportamento peculiar: enquanto no for premido um boto, no ser
possvel qualquer outra interaco com o computador, j que essa janela tomou o controlo.
O utilizador assim obrigado a atender mensagem apresentada.
A sintaxe da funo MsgBox a seguinte:
MsgBox(Mensagem, Caractersticas, Ttulo)
Em que os argumentos so:
Mensagem Texto a apresentar (mximo de 1024 caracteres)
Caractersticas Valor numrico que especifica o nmero de botes, o tipo do
cone e o boto de defeito (com o focus), obtido pela soma
de trs valores parciais.
Ttulo Contedo da barra de ttulo da janela (opcional)
O 2o argumento ser calculado usando os valores da Tabela 3:
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 Valor Boto seleccionado
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No
4.3.2 InputBox
A funo InputBox permite apresentar ao utilizador uma mensagem com uma questo,
recolhendo ao mesmo tempo uma string contendo a sua resposta. Assim, ao contrrio
da funo MsgBox (Seco 4.3.1 na pgina 25), esta funo produz um resultado do tipo
string e no do tipo integer.
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 Texto da mensagem a afixar na Caixa de Entrada (mximo
de 1024 caracteres)
Ttulo Contedo da barra de ttulo da janela (opcional)
valor_de_defeito Texto a colocar partida na caixa de texto da Caixa de En-
trada (opcional)
xpos e ypos Coordenadas da Input Box relativamente aos bordos es-
querdo e superior do ecr (opcionais)
4.3.3 Forms
Como vimos no incio da Seco 4 na pgina 19, uma interface grfica (em terminolo-
gia VBA, uma DialogBox ) construda dispondo os objectos adequados (genericamente
designados por controlos) sobre uma janela especial, a form. Efectivamente uma form
utilizada como um contentor para outros objectos grficos. Um objecto da classe User-
Form pode ser criado no Editor do VBA atravs do Menu "Insert/User Form". Esse
processo ser visto em detalhe na Seco 8 na pgina 56.
A seguir so apresentadas algumas das principais propriedades que podem ser confi-
guradas numa 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.
28
A instruo seguinte serve de exemplo de como alterar programaticamente o estado
de um boto de comando:
cmdArranque.Enabled = True
O que fizemos com a instruo acima foi atribuir o valor booleano (lgico) True pro-
priedade Enabled 13 do boto de comando cmdArranque. Estamos, assim, a tratar uma
propriedade como sendo uma varivel. De facto, uma propriedade pode ser considerada
como uma varivel especial.
4.3.5 Rtulos
Os rtulos, tambm designados por etiquetas (label ) so usados para apresentar texto
na interface. Mais uma vez, a propriedade mais utilizada a propriedade Caption, que
permite 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.
Enquanto que os rtulos (Label ) so utilizados pelo programa para aparesentar infor-
mao ao utilizador, j as caixas de texto (Text Box ) so maioritriamente usadas para
permitir a leitura de informao pelo programa.
13
Esta propriedade permite controlar o acesso do utilizador ao boto de comando.
29
Funes Val e Str
A linguagem Visual Basic dispe de um grande nmero de funes pr-definidas.
Duas delas, relacionadas com "strings", so particularmente teis para lidar com
objectos da classeTextBox :
Funo Descrio
Val() Retorna como valor numrico um nmero contido dentro duma string
Str() Retorna uma string representando um nmero
Vamos supor que um macro precisa de calcular o peso total custa de dois valo-
res introduzidos pelo utilizador atravs de duas TextBox. A tentao seria usar a
instruo:
pesoTotal = txt1.Text + txt2.Text
No entanto, o que a propriedade Text das TextBox contem apenas texto, ainda
que contendo algarismos. Para extrair a informao numrica de dentro do texto,
haver que utilizar a funo Val():
pesoTotal = Val(txt1.Text) + Val(txt2.Text)
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.
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.
32
ListCount permite conhecer em qualquer momento o nmero de elemen-
tos contidos na lista
Sorted permite especificar se a lista ou no apresentada de maneira
ordenada
ColumnCount especifica qual o nmero de colunas em que a lista apresen-
tada
ColumnHeads controla os cabealhos das colunas
MultiSelect permite controlar a forma de seleco de elementos na lista:
0 - s possvel seleccionar um elemento
1 - possvel seleccionar vrios elementos simultaneamente,
pressionando cada elemento
2 - possvel seleccionar vrios elementos simultaneamente,
usando a tecla Ctrl
ListIndex fornece ou 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 clulas onde estar a in-
formao a incluir na lista, ou seja, a fonte dos dados a apre-
sentar.
Na especificao de sintaxe, os parntesis rectos indicam que o seu contedo opcional.
No caso das propriedades ListIndex e List descritas acima, a verso curta destina-se a ser
usada do lado direito de uma operao de atribuio, enquanto que na verso completa
o que se pretende atribuir um valor propriedade.
Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox com
uma ListBox. O utilizador pode introduzir um item na TextBox ou seleccion-lo na lista
que, estando normalmente escondida, s aparecer quando se clica num cone prprio.
normalmente utilizado quando se pretende dar a possibilidade de escolher um elemento
de uma lista mas sem ocupar muito espao na form.
33
5 Estruturas de controlo do programa
Um macro um programa escrito na linguagem VBA. Vamos agora comear a analizar
mais em detalhe a estrutura de um programa. Um programa composto por um conjunto
de instrues, cada uma delas executando uma tarefa especfica. A sequncia de instrues
levar soluo do problema que o programa se prope resolver. Mas essa sequncia no
tem que ser necessariamente linear, i.e., composta por uma lista de instrues que sero
realizadas uma aps outra, de forma imutvel. Isso tornaria o programa inflexvel, incapaz
de se adaptar s circunstncias ou aos diferentes desejos do utilizador.
J foi introduzida na Seco 3.4 na pgina 17 a noo de operao de atribuio. Com
essa operao podemos criar instrues simples, mediante as quais possvel copiar valores
entre variveis, ou armazenar resultados do clculo de expresses. Mas um programa
flexvel no poder ser construdo apenas com instrues desse tipo. preciso dispor
de instrues que permitam alterar o fluxo do programa. Para tal vamos introduzir
estruturas de controlo que possibilitam a alterao desse fluxo.
5.1.1 If...Then...Else
34
A Figura 18 na pgina 34 descreve a estrutura condicional If...Then...Else. Como o
seu nome sugere, esta estrutura est baseada no teste de uma condio. Se essa condio
fr verdadeira, desencadear a execuo das instrues representadas na figura por Bloco
de Instrues1. Em caso contrrio, ser executada o Bloco de Instrues 2.
A sintaxe desta estrutura :
1 I f c o n d i c a o Then
2 [ instrucoes ]
3 Else
4 [ instrucoes alternativas ]
5 End I f
Quando a condio verdadeira sero executadas as instrues delimitadas por Then
e Else. Em caso contrrio, ser executado o bloco alternativo de instrues.
A condio pode consistir numa comparao ou outra operao lgica, ou ainda em
qualquer expresso de que resulte um valor numrico: um valor no nulo ser interpretado
como Verdadeiro, enquanto um valor nulo ser considerado como Falso.
A condio , portanto, uma expresso booleana (lgica). Uma expresso booleana
representa um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser cons-
tituda por uma varivel, uma funo ou uma combinao destas entidades atravs de
operadores.
5.1.2 If...Then
35
condio seja falsa, usa-se uma variante simplificada, a If...Then. O seu diagrama est
descrito na Figura 19 na pgina 35. A sua sintaxe ser ento:
1 I f c o n d i c a o Then
2 [ instrucoes ]
3 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 cons-
trudas utilizando operadores lgicos especficos. A linguagem VBA prev os seguin-
tes operadores lgicos, utilizveis em expresses:
Operador Descrio
> Maior que
< Menor que
= Igualdade
<= Menor ou igual
>= Maior ou igual
<> Desigualdade
And E
Or Ou
Not Negao
Dos primeiros seis operadores no haver muito a dizer. J do And e do Or haver
alguns detalhes a esclarecer:
AND
Sintaxe: Expr1 And Expr2
Basta que quer Expr1 quer Expr2 seja falsa, para a expresso ser falsa
OR
Sintaxe: Expr1 Or Expr2
Basta que quer Expr1 quer Expr2 seja verdadeira, para a expresso ser ver-
dadeira
36
5.1.3 Estruturas condicionais embutidas
possvel imbricar estruturas condicionais dentro de outras estruturas condicionais, per-
mitindo, assim, a construo de estruturas de controlo mais complexas. Para inserir uma
estrutura condicional dentro de outra, utilizada a palavra reservada ElseIf.
A sintaxe desta estrutura :
1 I f c o n d i c a o 1 Then
2 Accao1
3 E l s e I f c o n d i c a o 2 Then
4 Accao2
5 E l s e I f c o n d i c a o 3 Then
6 ...
7 Else
8 AccaoN
9 EndIf
Esta estrutura condicional permite a seleco de uma entre vrias alternativas mu-
tuamente exclusivas. As instrues que se seguem palavra reservada Else (aqui re-
presentadas por "AcoN") sero executadas apenas se nenhuma das condies se tiver
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 alter-
nativas, i.e., mtuamente exclusivas. Cada vez que uma estrutura deste tipo executada,
s uma das aces ser efectuada.
O exemplo seguinte traduz uma situao em que o programa, confrontado com a
necessidade de 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 I f ( nota < 0 ) Or ( nota > 20 ) Then
2 r e s u l t a d o = "Nota I n v a l i d a ! "
3 E l s e I f nota < 6 Then
4 r e s u l t a d o = "Mau"
5 E l s e I f nota < 10 Then
6 r e s u l t a d o = " Mediocre "
7 E l s e I f nota < 14 Then
8 resultado = " Suficiente "
9 E l s e I f nota < 17 Then
10 r e s u l t a d o = "Bom"
11 Else
12 r e s u l t a d o = " Muito Bom"
13 End I f
possvel imbricar um qualquer nmero de blocos ElseIf dentro de uma dada estru-
tura condicional.
38
grama da primeira encontra-se na Figura 21:
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 Do While c o n d i c a o
2 [ instrucoes ]
3 Loop
A segunda variante muito semelhante primeira. A grande diferena diz respeito
condio de controle. Neste caso, temos a chamada condio de termo (ou de fim) o
que faz com que o ciclo funcione enquanto a condio for falsa ou, por outras palavras,
at que a condio de termo seja verdadeira (Figura 22).
A sintaxe da variante Do...Until ser ento:
1 Do
2 [ instrucoes ]
3 Loop U n t i l c o n d i c a o
Como se pode deduzir do atrs dito, possvel transformar uma estrutura Do...While
numa Do...Until desde que se substitua a palavra While pela Until e se negue a condio
de controlo. Escolher uma ou outra estrutura de controlo depende, no fundo, do jeito
39
Figura 22: Estrutura de controlo repetitivo Do...Until
40
Figura 23: Ciclos controlados por contador
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.
42
corpo do ciclo, um em cada iterao. Essa leitura dever, no entanto, ser feita no fim do
corpo do ciclo, aps o processameento do valor anteriormente lido. Neste tipo de ciclos, a
leitura e o processamento de cada valor lido andam desfasados de uma iterao do ciclo.
No caso de se usar a estrutura Do..While, o ciclo funcionar enquanto o valor lido for
diferente do valor sentinela escolhido.
O exemplo apresentado acima, poderia ser codificado pelo segmento de programa
seguinte:
1 num = InputBox ( " D i g i t e onumero" , "ISEP M a t r i c u l a s " )
2 Do While numero <> 1
3 I f numero <> 1 Then l s t b o x 1 . AddItem num
4 num = InputBox ( " D i g i t e onumero" , "ISEP M a t r i c u l a s " )
5 Loop
Geralmente o valor sentinela um valor preciso. Existem casos, porm, em que a
sentinela pode ser qualquer valor dentro de uma determinada gama, por exemplo, todos
os nmeros negativos. Um exemplo de um ciclo controlado por uma sentinela com estas
caractersticas apresentado na Seco 5.2.5 na prxima pgina.
43
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 diferena est na utilizao da palavra Step aps a especificao do valor final. A
sua incluso opcional: caso se pretenda que o contedo da varivel de controlo seja
incrementada uma unidade de cada vez, desnecessrio especificar o passo. Em caso
contrrio, Step passo permitir incrementar o valor de varivel de um valor diferente da
unidade (positivo ou negativo).
Caso o valor de passo seja positivo a varivel contadora ser incrementada. Se pre-
tendermos, no entanto, efectuar um decremento, dever ser utilizado um valor negativo
para passo. Obviamente, nesse caso, a condio implcita de funcionamento do ciclo
passar a ser contador >= fim.
Repara-se que nesta estrutura de controlo, ao contrrio das estudadas anteriormente,
o incremento ou decremento da varivel de controle do ciclo automtico. Outro aspecto
interessante que a condio de funcionamento do ciclo implcita. Ela existe e
verificada mas no especificada de forma explcita pelo programador, apenas de forma
indirecta ao fixarem-se os valores inicial e final da varivel de contagem.
Existe ainda em VBA uma estrutura de controlo que uma variante da For..To..Next
e que opera numa coleco de objectos. Uma coleco um conjunto de objectos idnticos,
pertencentes mesma classe, e que so referenciveis mediante um ndice. Por exemplo,
um Workbook constitudo por um conjunto de objectos da classe Worksheet 14 .
A sintaxe desta estrutura a seguinte:
1 For Each elemento In C o l e c c a o
2 [ instrucoes ]
3 Next
O bloco de instrues ser aplicada a cada elemento da coleco de objectos em causa.
A seguir apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo:
Listing 4: FormataBordo - exemplo de sub-rotina usando For..Next
1 Public Sub FormataBordo ( )
2 Dim c e l l 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 varivel cellObject para guardar um objecto do tipo Range (que representa
uma gama de clulas - assunto tratado na Seco 7.3). O ciclo For Each...Next aplica
o mtodo BorderAround a cada uma das clulas contidas na gama representada por
cellObject. Com os argumentos fornecidos no exemplo, este mtodo formata o bordo
dessas clulas a vermelho e uma linha grossa.
14
Por sua vez, um workbook tambm um objecto. Um objecto pode assim ser ele prprio uma
coleco de objectos.
44
5.2.5 Estruturas de controlo repetitivo imbricadas
Foi dito anteriormente que o corpo de um ciclo era constitudo pelo conjunto de instrues
que o ciclo ir executar repetidamente. Foi tambm dito que nesse conjunto de instrues
se poderia incluir qualquer tipo de instrues, mesmo constituindo outras estruturas de
controlo repetitivo. Destes ciclos se diz que se encontram imbricados um dentro do
outro.
Considere-se o problema de calcular uma srie de factoriais de nmeros inteiros. O
clculo de um factorial realizado efectuando uma sucesso de multiplicaes. Ser
necessrio usar um ciclo para o efeito. Por sua vez, se pretendermos repetir esse clculo
um certo nmero de vezes, teremos tambm que usar um ciclo. Teremos assim um
ciclo, chamemos-lhe exterior, que se encarrega de produzir uma sequncia de factoriais
e cujo corpo inclui por sua vez um ciclo, dito interior, que responsvel pelo clculo de
cada factorial. O diagrama de fluxo da Figura 25 na pgina precedente representa esta
realidade. O cdigo necessrio para traduzir esse diagrama o seguinte:
Listing 5: Exemplo usando Ciclos Imbricados
1 num = InputBox ( " I n t r o d u z a um i n t e i r o p o s i t i v o " )
2 Do U n t i l num < 0
3 factorial = 1
4 contador = 1
5 Do U n t i l c o n t a d o r > num
6 f a c t o r i a l = f a c t o r i a l contador
7 c o n t a d o r = c o n t a d o r +1
8 Loop
9 num = InputBox ( " I n t r o d u z a um i n t e i r o p o s i t i v o " )
10 Loop
O ciclo exterior controlado por uma sentinela, no caso qualquer valor inteiro no
positivo. um exemplo de sentinela constitudo no por um valor 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.
45
Figura 25: Exemplo de Ciclos Imbricados
Um vector uma lista ordenada de variveis simples do mesmo tipo. Pode tambm ser
visto como um conjunto de variveis simples agrupadas. Todos as variveis membros desse
vector partilham o mesmo nome (o nome do vector). So identificadas individualmente
mediante o valor dum ndice, que determina qual a sua posio dentro do vector. por
isso que estas variveis so conhecidas por variveis indexadas.
Os valores do ndice devem obrigatoriamente ser do tipo Integer. O primeiro valor do
ndice zero15 .
Um elemento de um vector identificado utilizando o nome do vector seguido do valor
do ndice dentro de parntesis
nome_vector(indice)
Exemplos:
var_Multipla(3) 4o elemento do vector var_Multipla
var_Multipla(7) 8o e ltimo elemento do vector var_Multipla
notas(14) 15o elemento do vector notas
nomes(0) 1o elemento do vector nomes
15
possvel forar que os ndices dos vectores comecem do valor 1 usando a directiva Option Base 1.
46
Figura 26: Um vector uma varivel mltipla
47
Dim notas(30) As Single
Dim nomes(100) As String
Nota: num_elementos no se refere ao valor mximo que a varivel ndice pode
assumir (7, no caso do vector var_Multipla) mas sim ao nmero de elementos do
vector (8, neste caso). Por este processo, a declarao do limite inferior faz-se de forma
implcita: por defeito assume-se como limite inferior do ndice o valor zero (ou 1 se tal
for especificado mediante a instruo Option Base 1 ).
Uma forma alternativa de utilizar a instruo Dim para declarar vectores implica a
utilizao da palavra reservada To, permitindo especificar o menor e o maior valor que o
ndice pode assumir:
Dim nome_vector(menorIndice To maiorIndice) As Tipo
Exemplos:
Dim numeros(100 To 200) As Double
Dim valores(-100 to 100) As Single
48
Figura 28: Porqu usar ciclos para processar vectores?
4 Dim r e s As S i n g l e
5 l s t T a b e l a . Clear
6 For i = 0 To txtMaior
7 r e s = Sqr ( i )
8 vectorSqr ( i ) = res
9 l s t T a b e l a . AddItem Format( r e s , " 0 . 0 0 0 " )
10 Next i
11 End Sub
49
9 For i = txtMenor To txtMaior
10 r e s = Sqr ( i )
11 vector ( indice ) = res
12 l i n h a = Format( Str ( i ) , "##0" ) + "" + _
13 Format( v e c t o r ( i n d i c e ) , " 0 0 0 . 0 0 0 " )
14 l s t T a b e l a . AddItem l i n h a
15 indice = indice + 1
16 Next i
17 End Sub
6 Funes e Procedimentos
As sub-rotinas descritas nos exemplos que tm sido apresentados destinam-se a executar
tarefas. Por exemplo, as rotinas descritas na Seco 2.6 na pgina 12 tm como objectivo
a monitorizao dos valores contidos em determinadas clulas da folha de clculo. Este
tipo de sub-rotinas designado por procedimentos. Destinam-se a realizar tarefas e no
devolvem qualquer resultado.
No entanto, no possvel utilizar estes procedimentos em frmulas duma folha de
clculo, ao contrrio do que acontece com as funes standard disponveis no Excel, como
seja a funo If referida atrs, ou a funo Sum, que calcula a soma do contedo numrico
das vrias clulas contidas numa dada gama. Isso acontece porque, para poderem ser
utilizadas em frmulas, elas tero que ser estruturadas como funes, e comportarem-se
de maneira idntica das funes standard.
Uma funo, seja ela pr-existente no Excel, ou criada pelo utilizador, deve poder
50
receber a informao de que necessita, e de conseguir devolver o resultado do seu trabalho,
de modo a esse resultado poder ser utilizado na frmula ou expresso que a utilize. Para
tal, tem que possuir uma estrutura definida pela sintaxe seguinte:
1 Function Nome ( argumento1 , argumento2 , . . . )
2 L i s t a de i n s t r u c o e s
3 Nome = r e s u l t a d o
4 End Function
Repare-se que para alm das diferenas bvias no cabealho e no delimitador final em
relao s sub-rotinas estudadas atrs, verifica-se o seguinte:
1. A seguir ao nome da funo e entre parnteses encontra-se uma lista de argumen-
tos, atravs dos quais a funo vai receber as informaes essenciais realizao do seu
trabalho.
2. O resultado dos clculos efectuados ser entregue frmula ou expresso que
invocou a funo, depositando-o no seu prprio nome, como se este fosse uma varivel.
Atentemos na seguinte frmula:
= 10 * sin(angulo)
Para calcular a frmula, ir-se- multiplicar por 10 o resultado fornecido pela funo
standard sin. Esta, por sua vez, para poder fornecer o resultado dever ter recebido a
informao de qual o ngulo (neste caso em radianos) de que se quer calcular o seno.
Quando a funo termina o seu trabalho, deixar o resultado do seu clculo no lugar que
ocupava na frmula.
51
6.1 Exemplo de funo criada pelo programador
Vamos agora criar uma funo que permita calcular a margem de lucro percentual de um
determinado produto sabendo o seu custo e o seu preo de venda. Supe-se que esses
dados se encontraro previamente armazenados em duas clulas da folha de clculo. Uma
soluo possvel ser a seguinte:
Listing 8: Funo margemLucro
1 Public Function margemLucro ( venda , c u s t o )
2 margemLucro = ( venda c u s t o ) / venda
3 End Function
Observe-se que esta funo possui dois parmetros de entrada, venda e custo, atravs
dos quais receber os dados correspondentes. Note-se ainda que o resultado da expresso
que calcula a margem de lucro atribudo directamente ao prprio nome da funo.
esse o processo pelo qual uma funo consegue fornecer o resultado do seu trabalho
entidade que a invocou.
Esta funo poder ser utilizada em qualquer frmula contida numa clula da folha de
clculo, das mesma maneira que qualquer das funes pr-existentes o seria. Um exemplo
de uma frmula utilizando esta funo seria a descrita na Figura 30.
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".
Usando o objecto Workbooks que representa o conjunto dos ficheiros Excel abertos
naquele momento (Workbooks(Nome));
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.
53
Worksheets("Custos")
Workbook("Dados 2007").Worksheets("Custos").Activate
Sintaxe:
Worksheet.Copy [Position]
Exemplo:
Worksheets(2).Copy After:=Worksheets(3)
54
Worksheet.Add - permite acrescentar uma nova folha de clculo ao livro de trabalho.
Sintaxe:
Worksheet.Add [Position]
55
Na sintaxe acima, a entidadeObjecto pode ser um objecto Worksheet ou Range. A sua
omisso, leva o VBA a partir do princpio que se trata da folha de clculo activa. Linha
e Coluna so valores numricos indicando qual a linha e qual a coluna na interseco das
quais a clula se encontra20 . Veja-se o seguinte exemplo:
1 For c o l u n a = 2 To 13
2 C e l l s ( 2 , Coluna ) . Value = "Mes" & c o l u n a 1
3 Next
O exemplo acima usa um ciclo For...To para preencher todas as clulas da gama C2 a
C13 com o texto "Ms X" em que X o 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 sub-
rotina21 :
Listing 9: Sub-rotina InsereLinhas
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 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 propri-
edades. 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
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 mtodo Columns:
Columns(5).ColumnWidth = 15
Aplicando o mtodo Columns ao objecto Columns(5) (a coluna de ndice 5, ou seja,
a coluna E) o efeito obtido a mudana da sua largura para 15.
57
Figura 31: Criao de uma Form no VBA
58
Conforme referido na Seco 4.3 na pgina 25 no ambiente de desenvolvimento do
VBA encontram-se disponveis diversos tipos de controlos: botes de comando (Command
Buttons), etiquetas (Labels), caixas de texto (Text Boxes), quadros (Frames), botes de
opo (Option Buttons), caixas de verificao (Check Boxes) e caixas de listagem (List
Boxes), entre outros.
1. Visualizao da Form
59
um boto de comando) presente na Form. Nesta instruo, a palavra Me indica ao VBA
que a Form a desactivar ser aquela a que o Event Handler diz respeito.
Um exemplo de um Event Handler que termine uma Form pode ser:
Listing 10: Handler do objecto cmdFechar para o evento click
1 Private Sub cmdFechar_Click ( )
2 Dim op As Integer
3 op = MsgBox( " S a i r ? ( Yes/No) " , vbYesNo + vbQuestion )
4 I f op = vbYes Then
5 Unload Me
6 End I f
7 End Sub
Classe Contedo
CheckBox True ou False conforme esteja ou no activada
OptionButton True ou False conforme esteja ou no activada
ListBox A posio da linha seleccionada
TextBox O contedo da TextBox (pode-se tambm usar a propriedade Text)
TabStrip Um inteiro indicando qual a Tab que est activa
Note-se que nas List Boxes em VBA a 1a linha tem a posio 1, ao contrrio do que
se passa em Visual Basic, em que comea na posio 0.
60
dos dados de um aluno (Nome, Nmero e Curso) sem necessidade de recorrer a trs Input
Boxes separadas.
Esta UserForm conter duas Text Boxes para insero do Nome e Nmero do aluno e
uma Combo Box para seleco do seu Curso. Uma Combo Box um controlo semelhante
a uma List Box em que a lista est normalmente invisvel, s aparecendo quando o campo
superior activado. Aplicam-se-lhe os mesmos mtodos da classe ListBox.
Listing 11: Exemplo de sub-rotina de invocao de uma UserForm
1 Public Sub testUserFormInput ( )
2 usrFrmInput . Show
3 Set usrFrmInput = Nothing
4 End Sub
61
Esta sub-rotina especial, que executada automaticamente quando a UserForm ar-
ranca, trata de inicializar a Combo Box "cmbCursos" com os nomes dos diferentes cursos
da escola.
Listing 13: Handler do objecto cmdFechar para o evento Click
1 Private Sub cmdFechar_Click ( )
2 With Worksheets ( 4 )
3 . [ H5 ] = txtNome . Value
4 . [ I 5 ] = txtNum . Value
5 . [ J5 ] = cmbCursos . Text
6 End With
7 Unload Me
8 End Sub
Este Event Handler est associado ao boto cmdFechar e chamado quando sobre
ele ocorre o evento Click. Antes de fechar a UserForm usando Unload, copia o contedo
das duas Text Box e o da linha seleccionada da Combo Box para trs clulas contguas
da folha de clculo.
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 pro-
vocadas pelo utilizador, como o "clicar" do rato, preciso que o programador crie sub-
62
programas especiais, chamados Event Handlers e que esses sub-programas sejam associ-
ados aos controlos respectivos.
Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitem
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 Private Sub U s e r F o r m _ I n i t i a l i z e ( )
2 With TabStrip1
3 . Tabs ( 0 ) . Caption = " C i v i l "
4 . Tabs ( 1 ) . Caption = " I n f o r m a t i c a "
5 . Tabs .Add " E l e c t r o t e c n i a "
6 End With
7 With Worksheets ( 4 )
8 txtNumAlunos . Text = . [ D5 ]
9 txtPercAprov . Text = . [ D6 ] 100
10 txtMedia . Text = . [ D7 ]
11 End With
12 End Sub
Este procedimento vai inicializar os dois separadores do controlo Tabstrip1 com que
ele criado por defeito, mudando-lhe os nomes para "Civil" e "Informtica". De seguida,
acrescenta um terceiro separador e d-lhe o nome "Electrotecnia". Por 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 Private Sub TabStrip1_Change ( )
2 Dim v As Integer
3 With Worksheets ( 4 )
4 v = TabStrip1 . Value
5 I f v = 0 Then
6 txtNumAlunos = . [ D5 ]
7 txtPercAprov = . [ D6 ] 100
8 txtMedia = . [ D7 ]
9 E l s e I f v = 1 Then
10 txtNumAlunos = . [ E5 ]
11 txtPercAprov = . [ E6 ] 100
12 txtMedia = . [ E7 ]
13 Else
14 txtNumAlunos = . [ F5 ]
15 txtPercAprov = . [ F6 ] 100
63
16 txtMedia = . [ F7 ]
17 End I f
18 End With
19 End Sub
A propriedade Value dos objectos Tabstrip contem um valor numrico inteiro que
traduz qual o separador que est activo. Em funo do valor recolhido na varivel v, a
estrutura condicional imbricada If...Then...Else ir escolher o conjunto de valores corres-
pondente.
9 Notas 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.
64