Você está na página 1de 88

Programao em VBA

Texto Introdutrio
verso 3

Antnio Silva DEI-Isep 2009-12-30

IS E
1

IS E P

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 . . . . . . . . 3 Variveis e Tipos de Dados 3.1 Conceito de varivel . . . 3.2 Criao das variveis . . . 3.3 mbito de uma varivel . 3.4 Tipos de Dados . . . . . . 3.5 A operao de Atribuio 3.6 O uso de constantes . . . . 9 9 9 10 10 12 12 13 16 16 16 18 20 20 21 22 23 23 24 25 27 27 28 29 29 31 32 32 32 33 34 34 35 36 37 39 39 39 40 42 44

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 Como trabalhar com Objectos 4.1 Propriedades, Mtodos e Eventos . . . . . . . . 4.1.1 Propriedades . . . . . . . . . . . . . . . 4.1.2 Mtodos . . . . . . . . . . . . . . . . . . 4.1.3 Eventos . . . . . . . . . . . . . . . . . . 4.2 Os objectos do Excel mais comuns . . . . . . . . 4.2.1 Como trabalhar com as propriedades dos 4.2.2 Como aplicar mtodos aos objectos . . . 4.3 Objectos grcos . . . . . . . . . . . . . . . . . 4.3.1 MsgBox . . . . . . . . . . . . . . . . . . 4.3.2 InputBox . . . . . . . . . . . . . . . . . 4.3.3 Forms . . . . . . . . . . . . . . . . . . . 4.3.4 Botes de Comando . . . . . . . . . . . 4.3.5 Rtulos . . . . . . . . . . . . . . . . . . 4.3.6 Caixas de Texto . . . . . . . . . . . . . . 4.3.7 Botes de Opo . . . . . . . . . . . . . 4.3.8 Caixas de Vericao . . . . . . . . . . . 4.3.9 Quadros (Frames ) . . . . . . . . . . . . 4.3.10 Caixas de Listagem . . . . . . . . . . . . 4.4 Interface grca sem uma Form . . . . . . . . . 5 Estruturas de controlo do programa 5.1 Estruturas de controlo condicional . . . . . 5.1.1 If...Then...Else . . . . . . . . . . . 5.1.2 If...Then . . . . . . . . . . . . . . . 5.1.3 Estruturas condicionais embutidas . 5.2 Estruturas de controlo repetitivo . . . . . 3

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

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

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

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

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

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

IS E

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6

Estruturas de Controlo Do...Loop . . . . . . Ciclos controlados por contador . . . . . . . Exemplo integrador . . . . . . . . . . . . . . Ciclos controlados por sentinela . . . . . . . Estrutura de Controlo For..To..Next . . . . . Estruturas de controlo repetitivo imbricadas

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

44 45 47 49 50 52 54 55 56 56 59 62 62 63 66 67 68 69 71 71 71 71 72 73 76 76 77 77 77 78 78 79 80 83 83 83 83 83 84 84 85 85

6 Variveis indexadas - vectores e matrizes 6.1 Declarao esttica de vectores . . . . . . 6.2 Declarao dinmica de vectores . . . . . . 6.3 Processamento de vectores . . . . . . . . . 6.4 Matrizes . . . . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

7 Funes e Procedimentos 7.1 Funes . . . . . . . . . . . . . . . . . . . . . 7.2 Exemplos de funes criadas pelo programador 7.3 Passagem de parmetros ByVal . . . . . . . . 7.4 Procedimentos . . . . . . . . . . . . . . . . . . 7.5 Passagem de parmetros ByRef . . . . . . . . 7.6 Como aceder s funes standard do Excel . . 8 Programao do Excel usando VBA 8.1 Trabalhar com objectos Workbook . 8.2 Trabalhar com objectos Worksheet 8.2.1 Propriedades de Worksheet . 8.2.2 Mtodos de Worksheet . . . 8.3 Trabalhar com objectos Range . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

9 Adicionando uma interface grca 9.1 Instalao da Form . . . . . . . . . . . . . . . . . . . . . 9.2 Instalao dos Controlos . . . . . . . . . . . . . . . . . . 9.3 Associao da Form ao procedimento . . . . . . . . . . . 9.3.1 Como visualizar e terminar uma Form . . . . . . 9.3.2 Tratamento de eventos atravs de Event Handlers 9.3.3 Como recolher os resultados de uma Form . . . . 9.3.4 Exemplo de aplicao . . . . . . . . . . . . . . . . 9.4 Exemplo de aplicao mais elaborado . . . . . . . . . . . 10 Manipulao de texto 10.1 Funes de manipulao de strings 10.1.1 Trim, LTrim e RTrim . . . . 10.1.2 Len . . . . . . . . . . . . . . 10.1.3 Left, Right . . . . . . . . . . 10.1.4 Mid . . . . . . . . . . . . . 10.1.5 InStr . . . . . . . . . . . . . 10.1.6 UCase, LCase . . . . . . . . 10.2 Algoritmos . . . . . . . . . . . . . . 4

IS E

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

10.2.1 Separao duma string em caracteres . . . . . . . . . . . . . . . . 10.2.2 Diviso de uma frase em palavras . . . . . . . . . . . . . . . . . . 11 Notas nais

85 86 88

IS E
5

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 34 35 36 37 38 39 40 41 Janela de invocao do ambiente de Gravao de Macros . . . Janela de Gesto de Macros . . . . . . . . . . . . . . . . . . . Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . . Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . . Criao de novo Mdulo . . . . . . . . . . . . . . . . . . . . . Diferentes tipos de dados e o seu armazenamento em memria Como forar a declarao explcita automaticamente . . . . . Uma Form e vrios Controlos . . . . . . . . . . . . . . . . . . Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . . Lista de eventos disponveis . . . . . . . . . . . . . . . . . . . Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . . Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . . Vrios optionButton agrupados numa frame . . . . . . . . . . Vrios checkBox agrupadas numa frame . . . . . . . . . . . . Uma Frame agrupando trs botes de comando . . . . . . . . Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . . Interface construda directamente na folha de clculo . . . . . Estrutura de controlo condicional If...Then...Else . . . . . . . Estrutura de controlo condicional If...Then . . . . . . . . . . Estruturas de controlo condicional imbricadas . . . . . . . . . Estrutura de controlo repetitivo Do...While . . . . . . . . . . Estrutura de controlo repetitivo Do...Until . . . . . . . . . . Ciclos controlados por contador . . . . . . . . . . . . . . . . . Exemplo integrador - Interface . . . . . . . . . . . . . . . . . . Exemplo integrador - Cdigo . . . . . . . . . . . . . . . . . . . Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . . Um vector uma varivel mltipla . . . . . . . . . . . . . . . Um exemplo de vector de strings . . . . . . . . . . . . . . . . Porqu usar ciclos para processar vectores? . . . . . . . . . . . Ciclos encadeados para processar um vector bidimensional . . Funes como caixas pretas . . . . . . . . . . . . . . . . . . . Utilizao da funo margemLucro numa frmula . . . . . . . Anlise passo a passo da expresso de clculo das combinaes Comunicao da funo com o programa que a invoca . . . . . Resultados do cdigo da Listagem 13 na pgina 68 . . . . . . Exemplos de utilizao da propriedade Oset . . . . . . . . . Criao de uma Form no VBA . . . . . . . . . . . . . . . . . A UserForm para Entrada Mltipla de Dados . . . . . . . . . Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 11 11 12 13 17 18 22 24 25 26 29 31 34 35 35 36 38 39 40 43 44 45 46 47 48 50 52 54 55 57 59 63 64 65 66 69 75 76 80 81

IS E
6

Lista de Tabelas
1 2 3 4 Tipos de dados suportados pelo VBA . . . . . . . . . . . . . . . . . . . Propriedades mais comuns dos objectos grcos VBA . . . . . . . . . . Valores de congurao das caractersticas de uma Caixa de Mensagem Valores devolvidos por uma Caixa de Mensagem . . . . . . . . . . . . . . . . . 20 23 30 30

IS E
7

Listings
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 VericaValor - exemplo de macro . . . . . . . . . . . . . . . . vericaGama - exemplo de macro . . . . . . . . . . . . . . . . Exemplo de aplicao de If..Then..Else imbricados . . . . . . FormataBordo - exemplo de sub-rotina usando For..Next . . . Exemplo usando Ciclos Imbricados . . . . . . . . . . . . . . . Exemplo de Sub-rotina usando Ciclos Imbricados . . . . . . . Exemplo de processamento de um vector . . . . . . . . . . . . Outro exemplo de processamento de um vector . . . . . . . . . Soma de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . Funo mLucro . . . . . . . . . . . . . . . . . . . . . . . . . . Funo factorial . . . . . . . . . . . . . . . . . . . . . . . . . . Programa de clculo de Combinaes . . . . . . . . . . . . . . Diferentes resultados na passagem por valor e por referncia . Sub-rotina InsereLinhas . . . . . . . . . . . . . . . . . . . . . Handler do objecto cmdFechar para o evento click . . . . . . Exemplo de sub-rotina de invocao de uma UserForm . . . . Exemplo de sub-rotina de inicializao de uma UserForm . . . Handler do objecto cmdFechar para o evento Click . . . . . . Sub-rotina de inicializao da UserForm . . . . . . . . . . . . Handler associado ao objecto Tabstrip1 para o evento Change Separao de string em caracteres - 1o Mtodo . . . . . . . . . Separao de string em caracteres - 2o Mtodo . . . . . . . . . Separao de frase em palavras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 43 51 53 53 57 58 60 63 64 65 68 74 78 79 79 80 81 82 85 86 86

IS E
8

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 de funes standard. A linguagem de programao que vai ser utilizada ser o VBA (Visual Basic for Applications). uma linguagem que permite acrescentar capacidades adicionais a certo tipo de aplicaes informticas, concretamente as pertencentes ao Microsoft Oce, entre as quais o Excel e o Word. Permite ainda automatizar a realizao de muitas tarefas rotineiras nessas aplicaes. Como o prprio nome indica, trata-se duma adaptao da linguagem genrica de programao Visual Basic de modo a poder ser utilizada no ambiente especco das aplicaes Oce.

Conceitos Bsicos

O VBA constitui uma ferramenta poderosa nas mos de programadores experimentados mas pode, ao mesmo tempo, ser muito til a um utilizador normal, mesmo inexperiente. De facto, no dia a dia da utilizao destas aplicaes, defrontamo-nos com a necessidade de repetir a mesma tarefa vrias vezes ao dia ou, de em certas ocasies, ter que repetir uma determinada tarefa uma srie de vezes de seguida. Seja escrever ou formatar um certo texto, seja executar uma srie de comandos ou escolher opes de menus, seja ainda realizar a formatao complexa de um documento, so inmeras as ocasies em que dava jeito poder automatizar essas tarefas repetitivas. aqui que entra o VBA, permitindo a construo daquilo que se designa vulgarmente por macros.

2.1

O que um Macro?

Um macro contem uma lista das instrues a realizar para executar uma determinada tarefa. No fundo, um programa escrito em VBA, que indica a uma aplicao como o Excel quais os passos a dar para atingir um objectivo especco. Pode-se dizer que um macro no mais que uma descrio formalizada das tarefas que se pretende automatizar. Os macros incluem instrues que interagem com elementos da aplicao. Por exemplo, quando, numa aplicao Oce se pretende fechar uma janela, pode-se seleccionar a opo de menu Close. Um macro escrito em VBA, usar a seguinte instruo para obter o mesmo efeito: ActiveWindow.Close Existem duas formas alternativas de criar um macro mas a forma como ele criado no muda o seu contedo, continuando a ser um contentor de uma lista de instrues a realizar pela aplicao em que est instalado.

IS E
9

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, detalhando especicamente as instrues VBA que o compem. Sobretudo quando os macros so simples, muitas vezes mais prtico cri-los de forma automtica, gravando a sequncia de passos que ele dever executar na aplicao. Esta forma de criar um macro corresponde a mostrar ao computador o que fazer para conseguir obter o resultado pretendido. O utilizador indica ao programa que se vai entrar num modo de gravao do macro e inicia a execuo da sequncia de aces que normalmente teria que executar. Quando chega ao m dessa sequncia, indica ao programa que a gravao terminou. Aps ter atribudo a essa sequncia uma combinao de teclas especial, esse macro estar pronto a ser executado, substituindo assim o conjunto de aces que anteriormente seriam necessrias. Tudo se passa como se estivssemos a ensinar a aplicao pelo exemplo. Se se investigar, no entanto, o contedo desse macro, vericar-se- que ele composto precisamente por instrues escritas em VBA, sendo que a cada aco ou comando da aplicao corresponder uma instruo (ou conjunto de instrues) especca do macro. A forma alternativa de construir um macro ser assim introduzir essas instrues num editor de texto apropriado. essa, de facto, a forma de criar um macro quando o seu mbito algo no trivial1 .

2.3

Gravao de um Macro

Figura 1: Janela de invocao do ambiente de Gravao de Macros

Para gravar um macro que seja capaz de efectuar essas aces, haver que invocar o modo de gravao de macros, mediante o Menu "Tools/Macros/Record a New Macro " (em Excel), o que far aparecer a janela descrita da Figura 1. Nela se pode especicar o nome do macro, a localizao em que ser armazenado, uma descrio das suas funes
1

A tratar na Seco 2.6 na pgina 13.

IS E
10

Quando uma dada operao envolvendo uma srie de aces deve ser utilizada frequentemente, faz sentido tentar automatizar a sua execuo.

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, nessa janela, a indicao de que a gravao terminou. Uma vez tal realizado, esse macro passar a estar disponvel mediante a invocao da combinao de teclas especicada anteriormente (no caso da Figura 1 na pgina precedente, seria Ctrl+Shft+M) e realizar, de forma automtica, exactamente a mesma sequncia de aces que tnhamos efectuado manualmente.

Em alternativa, mediante a combinao de teclas ALT-F8, pode ser accionada a janela de Gesto de Macros (Figura 2), onde, entre outras aces, pode ser escolhido o macro a ser executado. Para facilitar o acesso s facilidades de gravao e edio de macros, ser conveniente tornar visvel de forma permanente a barra de ferramentas de Visual Basic (Figura 3). No Excel, isto poder fazer-se mediante a opo de Menu "View/Toolbars/Visual Basic ".

Figura 3: Barra de Ferramentas de VBA

IS E

Figura 2: Janela de Gesto de Macros

P
11

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 escrito em VBA, porque no trat-lo como tal e aceder ao seu cdigo, alterando-o de forma a melhorar a sua ecincia ou a corrigir problemas. E j agora, porque no cri-los de raiz, aproveitando todo o poder duma linguagem como o VBA?

2.5

O editor de VBA

Para aceder ao editor especializado de Visual Basic (Figura 4), que se encontra integrado no prprio Excel, basta utilizar o icone adequado na barra de ferramentas ou usar directamente a combinao de teclas ALT-F11 (tornando a premir esta combinao de teclas, voltaremos nossa folha de clculo). A este editor especializado tambm dado o nome de Integrated Development Environment (IDE) ou Ambiente de Desenvolvimento Integrado e semelhante aplicao autnoma usada para o desenvolvimento de programas em Visual Basic.

Figura 4: Editor integrado do VBA

Do lado esquerdo na Figura 4 podem-se ver duas janelas, a primeira das quais designada por Explorador de Projectos e que serve para mostrar o contedo do projecto VBA actual. Um projecto em VBA inclui um cheiro duma aplicao Oce (como, por 12

IS E

Figura 5: Criao de novo Mdulo

exemplo, uma folha de clculo do Excel) e todos os cheiros VBA associados, incluindo os prprios macros e eventuais user forms (janelas de interface prprias utilizadas pelos macros2 ). 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 do editor correspondente a esse mdulo, numa rea fora de qualquer macro j existente, e seleccionar a opo de menu "Insert/Procedure ". Aparecer uma janela prpria (Figura 5) onde ser possvel dar o nome ao novo procedimento (o conjunto de instrues que constituir o macro), especicar o tipo de macro que vai ser construdo (funo ou procedimento3 ) e qual o mbito da sua utilizao (privada ou pblica, ou seja, limitada ou no ao cheiro actual). Aps premir o boto aparecer na janela do editor o esqueleto do novo macro, apenas com o cabealho e o delimitador nal.

2.6

Criao de um Macro

Est na hora de construir o primeiro macro em VBA. Suponhamos que se pretende criar um macro que verique se o valor presente numa determinada clula superior a um dado limite e que, caso seja, disso notique o utilizador. A sub-rotina em que esse macro dever assentar poder ter o contedo apresentado na Listagem 1 na prxima pgina. No nos vamos de momento preocupar com os detalhes do cdigo que constitui o macro. Basta vericar, em 1o lugar, que constitudo por uma linha de cabealho que especica o tipo de macro (neste caso, uma sub-rotina (Sub ) ou procedimento) e o seu
2 3

Sobre o assunto, ver Seco 9. A distino entre funes e procedimentos (ou sub-rotinas) ser abordada na Seco 7 na pgina 62.

IS E

P
13

nome (vericaValor). O corpo do macro composto pela estrutura de controle condicional (If...Then 4 ) que vai vericar se o contedo da clula B25 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 ". Listing 1: VericaValor - exemplo de macro
1 2 3 4 5

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

O que este simples macro faz, portanto, vericar o contedo de uma clula especca da folha de clculo e avisar o utilizador caso o valor nela contido ultrapassar um valor pr-determinado. Sempre que for necessrio fazer esta vericao, bastar invocar a combinao de teclas que tenha sido associada a este macro. verdade que esta vericao poderia ter sido realizada colocando numa clula uma frmula contendo a funo standard do Excel IF. Mas suponhamos agora que se pretende algo mais complicado, por exemplo, fazer essa vericao num conjunto de clulas e apenas desencadear o alarme caso mais do que duas dessas clulas ultrapassem o limite estabelecido. A sub-rotina modicada poderia ser algo como:

1 2 3 4 5 6 7 8 9 10 11 12

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

A vericao agora repetida em todas as clulas de C1 a C5 graas aos servios da estrutura de controlo repetitivo For...To...Next 6 que executar 5 vezes as instrues contidas nas linhas 5 a 7. Para alm de vericar o contedo da clula em anlise, ainda actualizado um contador, baseado na varivel c (ver linha 6), sempre que o valor contido nessa clula ultrapasse o limite. S quando o valor desse contador for maior que 2 ser gerada a mensagem de alarme.
4 5

Ver Seco 5.1.2 na pgina 40. Cells(2,2) refere-se clula B2 (2a coluna, 2a linha) 6 Ver Seco 5.2.5 na pgina 50.

IS E

P
14

Listing 2: vericaGama - exemplo de macro

Estaremos j em posio de perceber a utilidade de construir os macros usando directamente o VBA. No seria trivial resolver este problema usando apenas frmulas e certamente impossvel executando comandos e seleccionando menus do Excel. A um macro criado usando directamente o VBA pode tambm ser associada uma combinao de teclas que facilite o seu acesso. Isso pode ser feito atravs do boto Options na Janela de Gesto de Macros, invocada mediante a combinao de teclas ALT-F8.

IS E
15

Variveis e Tipos de Dados

A informao processada por um macro pode ser de diferente natureza e existir em diferentes formatos. Genericamente um programa pode utilizar, entre outras, informao numrica e informao chamada alfa-numrica, ou seja texto. A linguagem VBA consegue lidar com informao de diversos tipos, que detalharemos mais adiante na Seco 3.4 na pgina 20.

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 essencialmente caracterizada pelo seu nome e pelo seu tipo, ou seja, o tipo de dados que pode armazenar7 . Como sugerido pelo prprio nome, o contedo de uma varivel pode mudar durante a execuo do macro. Existem algumas regras governando a escolha do nome duma varivel: 1. Deve obrigatoriamente comear por uma letra; 2. No pode conter espaos nem caracteres como vrgulas ou pontos; 3. No pode exceder 255 caracteres; 4. No pode ser igual a uma palavra reservada para o VBA. O tipo da varivel especica qual o tipo de dados que pode conter. Uma varivel de um determinado tipo no est preparada para armazenar dados de um tipo diferente. A razo para este facto que o espao necessrio para armazenar diferentes tipos de dados no o mesmo. Enquanto um inteiro simples pode ser guardado em 2 bytes de memria 8 , para guardar um nmero real podem ser necessrios 8 bytes (ou mesmo mais, dependendo da preciso requerida). A Figura 6 na pgina seguinte ilustra gracamente esta realidade. Enquanto que uma idade (valor inteiro) pde ser guardada numa varivel do tipo integer, dimensionada para armazenar valores inteiros, j um peso (valor real) teve que ser guardado numa varivel do tipo single, com a dimenso adequada a armazenar valores reais de uma dada preciso9 .

3.2

Criao das variveis

Ao acto de criao de variveis chama-se declarao. Criar uma varivel envolve dar-lhe um nome e reservar em memria o espao necessrio para que ela possa guardar o tipo de dados para o qual est a ser criada. O acto de declarar a varivel informa o VBA cerca
Na Seco 3.3 na pgina 18 referida outra caracterstica das variveis, o seu mbito, que, em certas situaoes, faz sentido considerar. 8 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. 9 possvel armazenar um valor inteiro dentro de uma varivel dimensionada para guardar valores reais. O contrrio que j no verdadeiro: ocorreria obrigatoriamente a truncagem do valor real, perdendo-se a parte fraccionria.
7

IS E

P
16

Figura 6: Diferentes tipos de dados e o seu armazenamento em memria

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 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 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 simples10 ). 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 encarregar-se- de criar automaticamente a varivel do tipo pretendido. Esta segunda forma de declarar variveis tem, a despeito da sua simplicidade, um
10

A discusso dos vrios tipos de dados suportados pelo VBA ser feita na Seco 3.4.

IS E

P
17

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 instruo11 : Distancia=1260 Como a primeira vez que o VBA encontra esta palavra ("Distancia"), partir do princpio que se trata de uma varivel ainda por declarar e tratar de a criar, substituindose ao programador. Dar-lhe- o nome "Distancia" e dimensiona-la- de forma a poder guardar inteiros simples, j que essa a utilizao sugerida na instruo. Agora suponha que adiante no programa, por engano, escrevia "Distncia" ao referir-se varivel em causa. O VBA no emitir nenhum alerta, j que aceitou tranquilamente "Distncia" como uma nova varivel. A forma mais prudente de lidar com declaraes de variveis , pois, utilizar apenas declaraes explcitas, e instruir o VBA para no aceitar declaraes implcitas, gerando uma mensagem de erro apropriada. Para tal, dever ser acrescentada a instruo Option Explicit no incio do mdulo contendo o macro.

Figura 7: Como forar a declarao explcita automaticamente

Se se pretender que seja esse o comportamento automtico do VBA em todos os mdulos, dever seleccionar-se no Editor do VBA a opo "Require Variable Declaration "no sub-menu Options do menu Tools, conforme pode ser observado na Figura 7.

3.3

mbito de uma varivel

Dissemos na Seco 3.1 na pgina 16 que uma varivel se caracterizava pelo seu nome e pelo tipo de dados que estava preparada para guardar. Isso rigorosamente verdade se considerarmos apenas variveis contidas num nico mdulo. Mas se tivermos em conta que vrios mdulos podem existir, cada um com as suas variveis, e ainda que as
11

Como se ver na seco 3.5, esta instruo guarda na varivel "Distancia"o valor 1260

IS E
18

variveis podem ser declaradas fora de qualquer mdulo, ento teremos que adicionar uma caracterstica adicional denio de uma varivel: o seu mbito. Por mbito entende-se a zona do programa em que a varivel conhecida, ou seja, em que pode ser utilizada. Esta zona est directamente relacionada com o local em que a varivel foi declarada. Para esclarecer melhor este ponto, atente-se na Listagem 3.3, em que podemos ver duas sub-rotinas, sub1 e sub2, em que so criadas e utilizadas diversas variveis, e ainda uma varivel n que foi declarada fora de qualquer sub-rotina.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Dim n As integer ... Private Sub sub1 ( ) Dim i As integer , x As s i n g l e i = 10 n = 100 ... End Sub Private Sub sub2 ( ) Dim i As integer , c As integer c = n 10 + i ... End Sub

Na sub-rotina sub1 usada quer a varivel i (at aqui, nada de mais j que essa varivel foi criada na prpria sub-rotina) quer a varivel n. Ora, esta segunda varivel no lhe pertence, no foi declarada dentro de si. Tal possvel, porque, sendo exterior sub-rotina, foi declarada como varivel dita global, fora de qualquer sub-rotina e, como tal, acessvel por qualquer mdulo que a ela queira aceder. Por seu lado, a varivel i diz-se local j que o seu mbito se restringe sub-rotina em que foi declarada. Na instruo da linha 15 da listagem, contida na sub-rotina sub2, so acediadas trs variveis: c pertencendo prpria sub-rotina, a varivel global n e a varivel i. A utilizao da varivel global j foi discutida. Vale a pena, porm, discutir a utilizao da varivel i. Esta varivel, se bem que tenha o mesmo nome de outra pertencendo a sub1, uma entidade diferente. A partilha do nome mera coincidncia. Assim sendo, e no tendo sido guardado previamente qualquer valor na varivel i dentro de sub2, o seu valor por defeito ser zero, pelo que o resultado da expresso armazenado em c ser ( 10 x 100 + 0 = 1000 ). Impe-se uma alerta relativamente utilizao de variveis globais. O facto de poderem ser acedidas indistintamente por qualquer mdulo torna a sua utilizao muito exvel e, em certos caso, insubstituvel. No entanto, especial ateno deve ser prestada a eventuais interaces indesejveis entre mdulos. Se muitas entidades acederem a uma mesma varivel global, modicando o seu contedo, pode tornar-se difcil detectar qual o mdulo responsvel por valores anmalos que possam surgir nessa varivel. 19

IS E

3.4

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. Tipo Integer Long Single 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 apresentadas 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 Quando declaramos variveis dever-se-, em princpio, especicar qual o tipo de dados que ela ir suportar. No entanto, em VBA possvel omitir a especicao do tipo de dados na declarao de variveis. O VBA criar, nesse caso, 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.

Double String Boolean Date Object

3.5

A operao de Atribuio

A operao de Atribuio permite guardar um dado numa varivel, ou seja, atribuir-lhe um valor. A sintaxe utilizada por esta operao a seguinte: Varivel = Valor O resultado da operao ser, portanto, o de guardar Valor em Varivel. Valor pode ser um valor constante ou o contedo de outra varivel. Neste segundo caso, a atribuio consistir na cpia do contedo de uma varivel para outra do mesmo tipo. A instruo seguinte copia o valor contido na varivel idade para a varivel temp (partimos do princpio que ambas so do tipo integer ): temp = idade Pode ainda ser atribudo a um varivel o resultado de uma expresso ou o valor devolvido por uma funo. Atente-se nos seguintes exemplos:

IS E

P
20

total = peso1 + peso2 resultado = sqrt(2+peso) No 1o exemplo, o VBA resolver em primeiro lugar a expresso direita do operador de atribuio (=), somando os contedos das variveis peso1 e peso2, aps o que copiar esse resultado para a varivel total. No 2o exemplo, a expresso direita composta pela funo standard do VBA sqrt(). Esta funo calcula a raiz quadrada do valor ou expresso que se encontrar dentro dos seus parntesis. Assim sendo, o VBA calcular em 1o lugar o resultado da expresso 2 + peso, fornecer esse valor funo sqrt(), aps o que copiar o valor fornecido por essa funo para a varivel resultado. importante que se perceba que a operao de atribuio uma operao destrutiva. Se a varivel contiver j um valor, uma operao subsequente de atribuio sobre essa varivel, substituir o valor nela contido pelo novo valor. Convem, assim, lembrar que nesta operao o uxo da informao se faz sempre da direita para a esquerda e no o contrrio. H ainda que ter em ateno o facto de que no normalmente aconselhvel atribuir um valor de um dado tipo a uma varivel de tipo diferente. Os resultados podem ser a perda de informao ou o mau funcionamento do programa. O VBA poder gerar uma mensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentos anmalos difceis de detectar e corrigir.

3.6

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 uma constante, em substituio do valor que representa, justica-se pelo seguinte facto: se um dado valor constante fr utilizado muitas vezes ao longo dum programa, caso ocorra a necessidade de o modicar, seremos forados a corrigir manualmente todas as ocorrncias desse valor, correndo, alm disso, o risco de nos enganarmos. Se, ao invs, for denida uma constante com esse valor, bastar modicar essa denio inicial para que tal mudana automaticamente se repercuta em todas as ocorrncias dessa constante no decurso do programa. A sintaxe da denio de constantes a seguinte: Const Nome As tipo = expresso Por expresso entende-se um valor numrico, uma cadeia de caracteres, ou uma 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 denir esse factor como constante e usar o seu nome em vez dele: Const Factor as Single = 1.347 Sempre que seja subsequentemente necessrio utilizar este factor numa expresso, usar-se- Factor em vez de 1.347.

IS E

P
21

Como trabalhar com Objectos

Para que uma macro possa manipular o ambiente da aplicao, seja modicando a formatao de um documento, modicando opes da aplicao ou introduzindo dados numa gama de clulas, vai ser preciso interagir com Objectos. Genericamente, pode dizer-se que um objecto algo que pode ser visto, tocado, sentido. Em VBA, considera-se um objecto tudo aquilo que pode ser visto e que pode ser manipulado de alguma forma. Quer o documento, quer uma clula ou gama de clulas, quer a prpria aplicao so considerados, para os efeitos de programao em VBA, como sendo objectos. Mas podem ainda existir outros objectos, nomeadamente aqueles que permitem construir uma interface grca especca do macro. A esses objectos grcos chamamos controlos e so colocados em janelas especiais chamadas forms. Na Figura 8 podem ser observados vrios objectos instalados numa form : uma caixa de texto, dois botes de comando, vrios rtulos ou etiquetas e uma caixa de vericao. Atravs de elementos como estes possvel o macro interagir com o utilizador. Veremos em detalhe mais frente para que servem e como utilizar estes diferentes objectos.

Figura 8: Uma Form e vrios Controlos Os objectos podem ser manipulados de vrias formas: podemos mudar as suas propriedades, que traduzem caractersticas prprias dos objectos; podemos aplicar um mtodo a um objecto, ou seja, executar uma aco sobre ele; podemos especicar uma sub-rotina que ser executada sempre que um determinado evento ocorra nesse objecto. Vamos agora utilizar a analogia para introduzir estes conceitos. Consideremos um automvel: As suas "propriedades " so caractersticas fsicas como o modelo, o peso ou a cilindrada; 22

IS E

Os seus "mtodos " especicam o que pode ser feito com ele: acelerar, travar, mudar de direco, etc; Os seus "eventos " so ocorrncias que provocaro respostas automticas por parte do automvel, como seja, um alarme que dispara (resposta ) caso desliguemos o carro com as luzes ligadas (evento ).

4.1

Propriedades, Mtodos e Eventos

Vamos, de seguida, aprofundar estes conceitos de propriedades, mtodos e eventos. 4.1.1 Propriedades

As propriedades de um objecto traduzem as suas caractersticas fsicas e formas de comportamento. Como na vida real, cada objecto possui caractersticas prprias ou propriedades, que podem ser quanticadas ou especicadas, como sejam as suas dimenses ou o tipo de letra que usa. A cada objecto est associada uma lista de propriedades a que possvel atribuir valores, determinando a sua aparncia, localizao e outros detalhes. Pode-se ento dizer que as propriedades de um objecto denem a forma como ele se apresenta ou se comporta. Diversas classes de objectos podem partilhar a mesma propriedade. Essa propriedade, no entanto, pode afectar esses objectos de forma diferente. Caption Name Left Top Height Width Font Visible Dene o texto a axar na barra de ttulo das forms, da legenda (caption) dos botes de comando, ou nos rtulos (label) Dene o nome pelo qual o objecto identicado Dene o afastamento entre uma form e o limite esquerdo do ecr ou entre um controlo e o limite esquerdo da form Dene o afastamento entre uma form e o topo do ecr ou entre um controlo e o topo da form Dene a altura do objecto Dene a largura do objecto Especica qual o tipo de letra a usar nos controlos Permite controlar o aparecimento de um dado objecto

Tabela 2: Propriedades mais comuns dos objectos grcos VBA

J vimos que quer os elementos do Excel como folhas de clculo ou prprio documento, quer elementos constituintes de interfaces grcas que os macros possam utilizar, so considerados objectos. Na Tabela 2 so descritas algumas das propriedades mais importantes e que so comuns maior parte dos objectos grcos. No caso dos objectos grcos, os valores que as propriedades de um dado objecto tomam podem ser consultados ou modicados usando a janela de propriedades (Figura 9 na prxima pgina). 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. 23

IS E

Figura 9: Janela de Propriedades

Quando num programa pretendemos referir-nos a uma propriedade de um objecto, utilizamos a seguinte sintaxe: Objecto.Propriedade Por exemplo, se nos quisermos referir propriedade que controla o tipo de letra (font ) da clula activa duma folha de clculo, usaremos

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 salvaguarda do contedo do documento activo num determinado cheiro. Aplicar o mtodo Clear a um objecto da classe ListBox (tratada na Seco 4.3.10 na pgina 36) ter como consequncia a eliminao de todas as linhas nele contidas. A cada classe de objectos possvel aplicar um determinado conjunto de mtodos. Para vermos como um mtodo aplicado a um objecto, vamos considerar o objecto Worksheet, que representa uma folha de clculo do Excel. Se pretendermos que o nosso macro mova essa folha para uma nova posio dentro do Livro de Trabalho (Workbook ), ele dever aplicar o mtodo Move a esse objecto, usando a seguinte sintaxe: Worksheet.Move([Before][, After]) Exemplicando, se quisermos que o macro desloque a folha de clculo "Dados 2009"para a posio imediatamente a seguir folha "Dados 2008", o comando a inserir no macro ser: Worksheets("Dados 2009").Move Before:=Worksheets("Dados 2008") Como veremos mais frente, o objecto Worksheet denido como um elemento do 24

IS E

ActiveCell.Font.Name

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". Outro mtodo til o que permite referenciar uma clula individual pertencendo a um objecto do tipo "Range "(gama de clulas) ou Worksheet. Trata-se do mtodo Cells, com a seguinte sintaxe: Objecto.Cells(Linha,Coluna) Se a indicao de Objecto for omitida, partir-se- do princpio que nos referimos folha de clculo activa. A instruo seguinte, por exemplo, copia o valor contido na clula C2 para a varivel temp : temp = Cells(2,3) Outra forma de referir uma clula individual usar a notao utilizada pelo Excel para referenciar clulas, envolvendo-a em parntesis rectos. O exemplo anterior caria assim: temp = [C2] 4.1.3 Eventos

Os eventos resultam de 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 outro exemplo de evento. Para que um objecto possa reagir a um dado evento dever existir, previamente programado, um procedimento especial, chamado event handler (tratador de eventos), que vai especicar o que fazer caso esse evento ocorra. Sem isso, o objecto detectar esse acontecimento mas no saber o que fazer. Nenhuma resposta ser produzida.

Figura 10: Lista de eventos disponveis

Na Figura 10 pode ver-se a janela de escrita de cdigo de macros. Na parte de cima,

IS E

P
25

direita, pode ser acedida a lista de eventos disponveis para o objecto Worksheet 12 . Seleccionando um dos eventos, ser possvel construir o procedimento event handler que permita ao objecto Worksheet reagir a esse evento. O cabealho e o delimitador nal so criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador a incluso das instrues necessrias. Na gura so referidos vrios eventos que podem ocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folha de clculo se torna activa, ou o Change que desencadeado por qualquer alterao ao seu contedo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estar preparada para reagir a diferentes eventos, desde que possua event handlers especcos para esses eventos.

Figura 11: Objectos e Eventos

Para tentar esclarecer melhor o conceito de evento e a questo de como organizar a resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenas objectos grcos dispostos numa form. Repare-se na Figura 11: o que se pretende aqui um macro capaz de vericar se um dado nmero inteiro, introduzido pelo utilizador usando a interface descrita na gura, ou no um nmero primo. Parte-se do princpio que todos sabem o que um nmero primo e no nos vamos agora debruar sobre os
Isto porque as diferentes classes de objectos no so necessariamente sensveis aos mesmos tipos de eventos.
12

IS E
26

detalhes do cdigo que o event handler dever conter para produzir o efeito desejado. Preocupemo-nos, de momento, apenas com as interaces entre as vrias entidades que intervm no processo. Como visvel na Figura 11 na pgina precedente, existem na interface vrios objectos (chamados controlos ). Entre eles, tm particular interesse para esta discusso a caixa de texto txt1, o rtulo lbl2 e o boto de comando command1. Quando o utilizador pretende utilizar o macro, uma vez este invocado, dever introduzir o nmero a testar em txt1 e pressionar ("clicar") o boto command1. Quando isso acontece, diz-se que ocorreu um evento click no boto command1. Se esse boto no dispuser de nenhum event handler para lidar com esse tipo de evento, nada se passar. No entanto, se se tiver previamente 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, o resultado dever ser efectuar os clculos necessrios para concluir se o nmero introduzido ou no primo e apresentar essa concluso no rtulo lbl2.

4.2

Os objectos do Excel mais comuns

4.2.1

Como trabalhar com as propriedades dos objectos Excel

Como j vimos, os objectos possuem caractersticas prprias, chamadas propriedades. A sintaxe genrica para nos referirmos a uma propriedade de um objecto a seguinte: 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 referir-nos, por exemplo, propriedade ActiveSheet para designar a folha de clculo em que se est a trabalhar ou a ActiveCell para nos referirmos clula actualmente seleccionada. Se pretendermos, por exemplo, especicar o tipo de letra da clula activa, usaremos a seguinte descrio de objecto: Application.ActiveWindow.ActiveCell.Font.Name Esta descrio ilustra a relao hierrquica existente entre os objectos do Excel. Na prtica, quando nos estamos a referir a uma propriedade da janela activa da aplicao como seja a ActiveCell, no precisamos, no entanto, de referir que pertence 27

IS E

J vimos que um documento Word ou Excel , em si mesmo, um objecto. Se bem que no lhe possamos tocar, podemos claramente v-lo e interagir com ele de mltiplas formas, seja alterando o contedo de clulas (no caso do Excel), seja mudando formatos ou inserindo linhas e colunas. Por sua vez, todos estes elementos so, eles tambm, objectos. Nas aplicaes Oce, os objectos esto organizados de forma hierrquica. O objecto mais geral o Application, e dentro dele existem mltiplos objectos de nvel progressivamente inferior.

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 seguinte13 : ActiveCell.Font.Name = "Helvetica" Note-se que estamos aqui a utilizar uma propriedade como uma varivel cujo contedo pode ser modicado. De facto, uma propriedade pode ser vista como uma varivel especial associada a um dado objecto. Se, ao contrrio, quisermos obter o valor de uma dada propriedade, a instruo a usar ser do tipo: variavel = Objecto.Propriedade Para obtermos, por exemplo, o contedo da clula activa da folha de clculo, a instruo correcta seria: conteudo = ActiveCell.Value Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa propriedade encontra-se armazenado o contedo da clula. 4.2.2 Como aplicar mtodos aos objectos

Vimos na Seco 4.1.2 na pgina 24, 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. Na sua forma mais simples, 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: 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")
13

Trata-se de uma operao de atribuio, descrita na Seco 3.5 na pgina 20

IS E

P
28

Muitas vezes, os argumentos que se podem fornecer a um mtodo so opcionais. Por exemplo, a instruo abaixo adiciona (insere) uma nova folha de clculo imediatamente antes da folha com o nome "Dados_Jan": Worksheets.Add Before:=Worksheets("Dados_Jan") No entanto, caso seja omitido o argumento Before, a nova folha ser inserida antes da folha de clculo activa. esse o comportamento por defeito do mtodo Add.

4.3

Objectos grcos

Vo agora ser apresentados de forma mais sistemtica alguns dos objectos e facilidades necessrios para realizar interfaces grcas simples. Essas interfaces vo permitir que os macros tenham uma interaco directa com o utilizador, requerendo e fornecendo informao. A forma mais simples de o macro interagir com o utilizador atravs de duas funes: MsgBox e InputBox. 4.3.1 MsgBox

A funo MsgBox permite apresentar no ecran uma Caixa de Mensagem (Msg Box ). Trata-se de uma pequena janela contendo uma mensagem, pelo menos um boto de comando e eventualmente um pequeno desenho (cone) ilustrativo do tipo de mensagem. Na Figura 12 encontra-se um exemplo de uma destas janelas.

Figura 12: Exemplo de MsgBox

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 dos seus botes, 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:

IS E
29

Mensagem Caractersticas

Ttulo

Texto a apresentar (mximo de 1024 caracteres) Valor numrico que especica o nmero de botes, o tipo do cone e o boto de defeito (com o focus), obtido pela soma de trs valores parciais (opcional) Contedo da barra de ttulo da janela (opcional)

O 2o argumento ser calculado usando os valores da Tabela 3. Assim, para obter o valor do parmetro caractersticas, ser preciso somar trs valores, um de cada coluna da Tabela 3, cada um deles especicando uma das caractersticas (Botes de Comando, cone e qual o boto com o "focus"14 ). Botes de Comando 0 - OK 1 - OK, Cancel 2 - Abort, Retry, Ignore 3 - Yes, No, Cancel 4 - Yes, No 5 - Retry, Cancel cone 0 - Nenhum 16 - Mensagem 32 - Mensagem 48 - Mensagem 64 - Mensagem Boto com o focus 0 - 1o Boto 256 - 2o Boto 512 - 3a Boto

Crtica de Aviso 1 de Aviso 2 de Informao

Tabela 3: Valores de congurao das caractersticas de uma Caixa de Mensagem

No caso da Figura 12 na pgina precedente, os valores a somar seriam os seguintes:

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. Constante vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo

Tabela 4: Valores devolvidos por uma Caixa de Mensagem

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).
14 O boto com o "focus" ou boto de defeito aquele que ser accionado automticamente caso o utilizador prima a tecla Enter ou Return.

IS E
Valor 1 2 3 4 5 6 7

P
30

1 + 16 + 0 = 17

Boto seleccionado OK Cancel Abort Retry Ignore Yes No

Quando se pretende aproveitar o valor devolvido pela funo MsgBox ser necessrio us-la com a seguinte sintaxe: Varivel = MsgBox(Mensagem, Caractersticas, Ttulo) Desta maneira, o valor devolvido pela funo ser guardado (atribudo) em Varivel, podendo depois ser avaliado por instrues seguintes. Quando, pelo contrrio, no haja interesse em aproveitar o valor devolvido pela funo (tipicamente quando h apenas um boto), a sua invocao poder fazer-se da seguinte forma: MsgBox Mensagem, Caractersticas, Ttulo 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 29), esta funo produz um resultado do tipo string e no do tipo integer.

Figura 13: Exemplo de InputBox

Como pode ser visto na Figura 13, esta funo cria um objecto composto (uma Caixa de Entrada) incluindo um caixa de texto, dois botes15 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: Mensagem Ttulo valor_de_defeito xpos e ypos Texto da mensagem a axar na Caixa de Entrada (mximo de 1024 caracteres) Contedo da barra de ttulo da janela (opcional) Texto a colocar partida na caixa de texto da Caixa de Entrada (opcional) Coordenadas da Input Box relativamente aos bordos esquerdo e superior do ecr (opcionais)

Ao contrrio da MsgBox, neste caso os dois botes so xos. Por outro lado, a tecla ESC tem o mesmo comportamento.

15

IS E

P
31

4.3.3

Forms

Como vimos no incio da Seco 4 na pgina 22, uma interface grca (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 grcos. 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 9 na pgina 76. A seguir so apresentadas algumas das principais propriedades que podem ser conguradas numa Form : Name Caption BackColor Enabled ShowModal Font Height Width especica o nome pelo qual a Form ser identicada especica o ttulo que gura no topo da Form permite seleccionar a cor do fundo controla a utilizao da Form pelo utilizador permite alterar o comportamento da Form de modo a controlar o acesso aplicao enquanto a Form estiver activa controla o tipo e tamanho da letra utilizada especica a altura da Form especica a largura da Form

Nas prximas seces, referiremos com algum detalhe os controlos de uso mais comum na construo de dialogBoxes em VBA. Estes so os objectos que mais frequentemente so colocados numa form.

Um boto de comando (objecto commandButton ), como o prprio nome sugere, utilizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se pode vericar na Figura 11 na pgina 26, 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 especicar o texto axado. A instruo seguinte serve de exemplo de como alterar programaticamente o estado de um boto de comando: cmdArranque.Enabled = True O que zemos com a instruo acima foi atribuir o valor booleano (lgico) True propriedade Enabled 16 do boto de comando cmdArranque. 4.3.5 Rtulos

Os rtulos, tambm designados por etiquetas (label ) so usados para apresentar texto na interface. Mais uma vez, a propriedade mais utilizada a propriedade Caption, que permite especicar o texto a apresentar. Este controlo usado no s para apresentar
16

Esta propriedade permite controlar o acesso do utilizador ao boto de comando.

IS E

4.3.4

Botes de Comando

P
32

informao esttica, que escolhida na fase de concepo da interface, como tambm informao dinmica, como seja a usada na apresentao de resultados: lblResultado.Caption = "O valor total 235 metros" A instruo acima atribui propriedade Caption do rtulo lblResultado a string "O valor total 235 metros", o que vai ter como consequncia a sua axao na interface. Funes Val e Str A linguagem VBA dispe de um grande nmero de funes pr-denidas. Duas delas, relacionadas com "strings", so particularmente teis para lidar com objectos da classeTextBox e Label : Funo Val() Str() Descrio Retorna como valor numrico um nmero contido dentro duma string Retorna uma string representando um nmero

Vamos supor que um macro precisa de calcular o peso total custa de dois valores introduzidos pelo utilizador atravs de duas TextBox. A tentao seria usar a instruo: pesoTotal = txt1.Text + txt2.Text No entanto, o que a propriedade Text das TextBox contem apenas texto, ainda que contendo algarismos. Para extrair a informao numrica de dentro do texto, haver que utilizar a funo Val() :

A funo str(), por seu lado, converte um valor numrico num texto contendo esse valor. Uma utilizao tpica a de permitir compor strings como a do exemplo apresentado na Seco 4.3.5. A string "O valor total de 35 metros"pode ser composta usando o smbolo "+"como operador de concatenao (colagem) de texto, numa instruo como a seguinte: texto = "O valor total de "+ str(res) + "metros" O smbolo "+"tanto pode ser interpretado como operador de adio como de concatenao. Essa ambiguidade desfeita pelo VBA, analizando o tipo dos seus operandos. Se forem ambos numricos, ser realizada uma adio. Se forem ambos texto, ser feita uma colagem. Se forem de tipo diferente, ocorrer um erro. Para que na instruo atrs, isso no ocorra, preciso usar a funo str() para converter para string o contedo numrico da varivel res. Agora, j poderemos perceber qual o resultado da primeira instruo apresentada (pesoTotal = txt1.Text + txt2.Text): ocorrer a colagem do texto contido nas duas TextBox, em vez da soma dos correspondentes valores numricos. 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 33

IS E

pesoTotal = Val(txt1.Text) + Val(txt2.Text)

numricos e, no caso do Excel, referncias a clulas e mesmo frmulas. Algumas das suas propriedades mais importantes so: Text Permite obter ou alterar o texto contido no objecto. MaxLenght Especica o tamanho mximo do texto (em caracteres) que o utilizador pode introduzir. MultiLine Permite escolher entre permitir ou no a apresentao do texto em vrias linhas. Enquanto que os rtulos (Label ) so utilizados pelo programa para apresentar informao ao utilizador, j as caixas de texto (Text Box ) so geralmente usadas para permitir a leitura de informao pelo programa. 4.3.7 Botes de Opo

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

Figura 14: Vrios optionButton agrupados numa frame

Os botes de opo so geralmente agrupados em conjuntos de dois ou mais, estando interligados entre si, j que, ao mesmo tempo, s possvel que esteja um boto seleccionado dentro do mesmo grupo de botes de opo. Encontram-se muitas vezes inseridos em frames (Seco 4.3.9 na pgina seguinte). Para alm de Caption, outra propriedade importante dos botes de opo a propriedade Value, que pode assumir o valor True ou False conforme o boto se encontre ou no seleccionado. 4.3.8 Caixas de Vericao

Estes objectos comportam-se de forma semelhante dos botes de opo mas, neste caso, possvel encontrar vrios controlos deste tipo activados simultaneamente na mesma form, visto que tais objectos funcionam de forma independente (isto , no se encontram relacionados entre si). Possuem tambm uma propriedade Value que, neste caso, pode apresentar os seguintes valores:

IS E

P
34

Figura 15: Vrios checkBox agrupadas numa frame

0 no activada 1 activada 2 no disponvel O texto a inserir junto de cada caixa de vericao deve ser especicado mediante a propriedade Caption. 4.3.9 Quadros (Frames )

Tais objectos destinam-se a agrupar outros objectos (controlos). So usados muitas vezes para organizar um dado conjunto de botes de opo (Seco 4.3.7 na pgina precedente), tornando-os independentes de outros botes de opo eventualmente existentes na mesma form.

Figura 16: Uma Frame agrupando trs botes de comando

importante criar o quadro antes de a inserir os controlos. Se o controlo fr criado antes do quadro, no ser possvel desloc-lo para dentro do quadro aps este ter sido criado. Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o contentor desse objecto. Quer isto dizer que a sua localizao passa a ser denida no em relao form mas em relao ao quadro que o contem. Outra utilidade dos quadros servir de moldura a um dado conjunto de controlos, de modo a melhorar a aparncia e a organizao da form em que esto inseridos, agrupando os diversos controlos de acordo com as suas funcionalidades.

IS E
35

4.3.10

Caixas de Listagem

Este objecto serve para apresentar listas e permite que o utilizador escolha uma ou mais opes dentro de uma dada lista. Esta lista apresentada numa caixa prpria (com uma barra de deslocamento vertical direita, no caso de a lista ser mais extensa que o nmero de linhas disponvel na caixa).

Figura 17: Exemplo de listBox

Os elementos da lista podem ser especicados partida usando a propriedade List, ou ser acrescentados durante a execuo do programa usando o mtodo AddItem : listbox.AddItem elemento ou

listbox.AddItem elemento, posio em que

elemento o novo elemento a acrescentar lista posio refere-se posio na lista em o elemento vai ser inserido Na primeira variante acima o elemento ser inserido a seguir ltima linha preenchida, desde que a lista no seja ordenada. Se a propriedade Sorted (ver tabela abaixo) estiver activa (True ), qualquer insero de nova linha ser feita na posio adequada para manter a lista ordenada A remoo de um elemento da lista pode ser feita mediante o mtodo RemoveItem : Listbox.RemoveItem posio A remoo simultnea de todas as linhas da caixa de listagem pode ser conseguida aplicando-lhe o mtodo Clear (este mtodo no necessita de qualquer argumento): Listbox.Clear As propriedades mais relevantes desta classe de objectos so:

IS E
36

ListCount

Na especicao de sintaxe, os parntesis rectos indicam que o seu contedo opcional. No caso das propriedades ListIndex e List descritas acima, a verso curta destina-se a ser usada do lado direito de uma operao de atribuio, enquanto que na verso completa o que se pretende atribuir um valor propriedade. Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox com uma ListBox. O utilizador pode introduzir um item na TextBox ou seleccion-lo na lista que, estando normalmente escondida, s aparecer quando se clica num cone prprio. normalmente utilizada quando se pretende dar a possibilidade de escolher um elemento de uma lista mas sem ocupar muito espao na form.

4.4

Interface grca sem uma Form

possvel criar uma interface grca para um macro sem ter que usar uma 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 18 na pgina seguinte. A interface descrita utiliza um boto de comando e dois botes de opo. Para a instalao desta interface, deve usar-se a Caixa de Ferramentas dos Controlos activada atravs da Barra de Ferramentas de VBA descrita na Figura 3 na pgina 11. Esta Caixa de Ferramentas pode ser vista na parte inferior da Figura 18 na pgina seguinte. Nesta Caixa possvel escolher-se qual o controlo que se pretende 37

IS E

permite conhecer em qualquer momento o nmero de elementos contidos na lista Sorted permite especicar se a lista ou no apresentada de maneira ordenada ColumnCount especica qual o nmero de colunas em que a lista apresentada ColumnHeads controla os cabealhos das colunas MultiSelect permite controlar a forma de seleco de elementos na lista: 0 - s possvel seleccionar um elemento 1 - possvel seleccionar vrios elementos simultaneamente, pressionando cada elemento 2 - possvel seleccionar vrios elementos simultaneamente, usando a tecla Ctrl ListIndex fornece ou especica qual o ndice do item actualmente seleccionado (ou 1 caso nenhum esteja). Sintaxe: objecto.ListIndex [= indice] List permite aceder aos elementos duma lista, quer para os ler, quer para os modicar. Sintaxe: objecto.List(indice) [= string] Text permite obter o elemento actualmente seleccionado. Sintaxe: variavel = objecto.Text RowSource especica qual a gama de clulas de uma folha de clculo Excel em que se encontra a informao a incluir na lista, ou seja, a fonte dos dados a apresentar.

Figura 18: Interface construda directamente na folha de clculo

IS E
38

instalar seleccionando o cone respectivo, aps o que se desenhar com o rato na prpria folha de clculo a rea que esse controlo vai ocupar. A sua posio e dimenses denitivas podero ser anadas quer com o rato quer manipulando as propriedades correspondentes na janela de Propriedades.

Estruturas de controlo do programa

Um macro um programa escrito na linguagem VBA. Vamos agora comear a analizar mais em detalhe a estrutura de um programa. Um programa composto por um conjunto de instrues, cada uma delas executando uma tarefa especca. A sequncia de instrues levar soluo do problema que o programa se prope resolver. Mas essa sequncia no tem que ser necessariamente linear, i.e., composta por uma lista de instrues que sero realizadas uma aps outra, de forma imutvel. Isso tornaria o programa inexvel, incapaz de se adaptar s circunstncias ou aos diferentes desejos do utilizador. J foi introduzida na Seco 3.5 na pgina 20 a noo de operao de atribuio. Com essa operao podemos criar instrues simples, mediante as quais possvel copiar valores entre variveis, ou armazenar resultados do clculo de expresses. Mas um programa exvel no poder ser construdo apenas com instrues desse tipo. preciso dispor de instrues que permitam alterar o uxo do programa. Para tal, vamos introduzir estruturas de controlo que possibilitam a alterao desse uxo.

5.1

Estruturas de controlo condicional

Uma estrutura de controlo fundamental a estrutura condicional, ou de seleco. Usando esta estrutura, as instrues podem ser executadas condicionalmente. Se uma dada condio fr verdadeira, ser executada uma dada sequncia de instrues. Se fr falsa, uma sequncia diferente ser escolhida.

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

IS E
39

5.1.1

If...Then...Else

A Figura 19 na pgina anterior descreve a estrutura condicional If...Then...Else. Como o seu nome sugere, esta estrutura est baseada no teste de uma condio. Se essa condio fr verdadeira, desencadear a execuo das instrues representadas na gura por Bloco de Instrues1. Em caso contrrio, ser executado o Bloco de Instrues 2. A sintaxe desta estrutura :
1 2 3 4 5

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

Quando a condio verdadeira sero executadas as instrues delimitadas por Then e Else. Em caso contrrio, ser executado o bloco alternativo de instrues. A condio pode consistir numa comparao ou outra operao lgica, ou ainda em qualquer expresso de que resulte um valor numrico: um valor no nulo ser interpretado como Verdadeiro, enquanto um valor nulo ser considerado como Falso. A condio , portanto, uma expresso booleana (lgica). Uma expresso booleana representa um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser constituda por uma varivel, uma funo ou uma combinao destas entidades atravs de operadores. 5.1.2 If...Then

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

Quando numa estrutura condicional no existe qualquer aco a executar quando a 40

IS E

condio seja falsa, usa-se uma variante simplicada, a If...Then. O seu diagrama est descrito na Figura 20 na pgina precedente. 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 ainda utilizar a seguinte sintaxe simplicada, sem o delimitador End If e sem mudana de linha: If condicao Then instrucao Expresses lgicas As expresses lgicas, utilizadas nas condies das estruturas de controlo, so construdas utilizando operadores lgicos especcos. A linguagem VBA prev os seguintes operadores lgicos, utilizveis em expresses: Operador > < = <= >= <> And Or Not Descrio Maior que Menor que Igualdade Menor ou igual Maior ou igual Desigualdade E Ou Negao

Dos primeiros seis operadores no haver muito a dizer. J do And e do Or haver alguns detalhes a esclarecer: AND Sintaxe: Expr1 And Expr2 Se Expr1 e Expr2 forem ambas verdadeiras, a expresso ser verdadeira Basta que quer Expr1 quer Expr2 seja falsa, para a expresso ser falsa OR Sintaxe: Expr1 Or Expr2 Se Expr1 e Expr2 forem ambas falsas, a expresso ser falsa. Basta que quer Expr1 quer Expr2 seja verdadeira, para a expresso ser verdadeira

IS E
41

5.1.3

Estruturas condicionais embutidas

possvel construir estruturas de controlo mais complexas, oferecendo ao programa a capacidade de escolher uma de entre vrias alternativas possveis. Estas estruturas condicionais embutidas ou encadeadas so construdas inserindo estruturas condicionais dentro de outras estruturas condicionais. Isso pode realizar-se de dois modos. O primeiro mtodo implica utilizar 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

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

I f c o n d i c a o 1 Then Accao1 Else I f c o n d i c a o 2 Then Accao2 Else If condicao 3 Accao 3 Else Accao4 End I f End I f EndIf

Na Figura 21 na pgina seguinte pode-se ver o uxograma de uma estrutura imbricada com quatro vias alternativas. A Aco 1 executada caso a 1a condio seja verdadeira. A Aco 3 ser executada caso a Condio 3 for verdadeira e as duas anteriores falsas. A Aco 4 ser executada caso todas as quatro condies se tiverem vericado falsas. 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, 42

IS E

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 vericado. possvel imbricar um qualquer nmero de blocos ElseIf dentro de uma dada estrutura condicional. As estruturas condicionais produzidas usando o mtodo alternativo no so to compactas mas tornam-se talvez mais legveis, sobretudo se se usar a indentao apropriada:

Figura 21: Estruturas de controlo condicional imbricadas

s uma das aces ser efectuada. Pode dizer-se que, genericamente, para um programa poder escolher uma de entre N alternativas, ser necessrio utilizar N - 1 estruturas condicionais encadeadas. O exemplo da Listagem 3 traduz uma situao em que o programa, confrontado com a necessidade de classicar uma nota numrica, pode escolher uma de entre seis notas qualitativas diferentes. S vrias estruturas condicionais encadeadas permitiro resolver esse problema. Listing 3: Exemplo de aplicao de If..Then..Else imbricados
1 2 3 4 5 6 7 8 9 10 11 12 13

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

IS E

P
43

5.2

Estruturas de controlo repetitivo

Como vimos, as estruturas de controlo condicional permitem alterar o uxo do programa, ou seja, executar diferentes sequncias de instrues conforme as circunstncias do momento. As estruturas de controlo repetitivo (tambm conhecidas por estruturas de repetio ou 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 assegura a execuo repetida de um dado conjunto de instrues dependendo do resultado do teste de uma determinada condio de funcionamento. De facto, como veremos, tambm os ciclos dependem da vericao de uma condio, normalmente de forma explcita, noutros casos denida implicitamente. 5.2.1 Estruturas de Controlo Do...Loop

Esto disponveis quatro variantes deste ciclo: Do...While e Do...Until, com teste da condio no princpio ou no m. Vejamos em detalhe as diversas variantes. O uxograma da primeira encontra-se na Figura 22:

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

Analizando esse uxograma, pode observar-se que tudo roda volta do teste a uma condio, descrita como condio de funcionamento. Se a condio for verdadeira na altura em que o teste realizado, as instrues que compem o chamado corpo do ciclo sero executadas, aps o que novo teste condio ser efectuado. Enquanto a condio se vericar ser verdadeira, o programa no sair deste ciclo. Na 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 de repetio. Neste ltimo caso, estaremos

IS E
44

perante o que se designa por ciclos imbricados ou embutidos, que sero tratados em detalhe na Seco 5.2.6 na pgina 52. A sintaxe em VBA desta estrutura de controle a seguinte:
1 2 3

Do While c o n d i c a o [ instrucoes ] Loop

A segunda variante muito semelhante primeira. A grande diferena diz respeito condio de controle. Neste caso, temos a chamada condio de termo (ou de paragem) 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 23).

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

A sintaxe da variante Do...Until ser ento:


1 2 3

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

Como nesta variante o teste da condio feito no m, as instrues constantes do corpo do ciclo sero garantidamente executadas pelo menos uma vez. Tal pode ou no vericar-se conveniente. 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 do programador e, sobretudo quando se usam condies mltiplas, da forma como a expresso lgica traduz com maior ou menor facilidade a condio expressa em linguagem corrente. 5.2.2 Ciclos controlados por contador

Usando como base estas duas estruturas de controlo repetitivo possvel construir dois tipos de ciclos: ciclos controlados por um contador e ciclos controlados por aquilo que se designa como sentinela. Comecemos pelos primeiros. 45

IS E

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

Figura 24: Ciclos controlados por contador Decorrendo do que vimos na seco anterior, torna-se claro que igualmente possvel construir este ciclo usando a estrutura Do..Until. H que ter em conta as seguintes questes na construo de um ciclo controlado por contador usando as estruturas de controlo Do...While ou Do...Until : Inicializar a varivel contadora Especicar a condio de funcionamento do ciclo Incluir no corpo do ciclo uma instruo que incremente ou decremente a varivel contadora.

IS E
46

Quando se usam estas estruturas, ao contrrio do que se passa com a estrutura de repetio For...To...Next, a analizar na Seco 5.2.5 na pgina 50, da responsabilidade do programador assegurar-se de que tais aces so correctamente executadas conforme est espelhado no diagrama de uxo representado na Figura 24 na pgina anterior. Um ltimo aspecto a observar o seguinte: s vivel construir um ciclo controlado por contador quando se pode conhecer partida o nmero de vezes que ele vai funcionar ou, por outras palavras, o nmero de repeties necessrias. Isso nem sempre possvel. Nesses casos, a alternativa ser usar ciclos controlados por sentinela. 5.2.3 Exemplo integrador

Vamos agora considerar o seguinte exemplo que permite integrar a utilizao de algumas propriedades importantes do controlo "listBox" com a aplicao de um ciclo controlado por contador para obter a soma dos valores numricos contidos na "listBox". Aproveitase ainda para ilustrar a forma de tratar certos eventos ocorridos em objectos presentes na interface. A ocorrncia desses eventos bem como a resposta que lhes dada descrita na Figura 25.

Figura 25: Exemplo integrador - Interface

O que se pretende do programa que demonstre o seguinte comportamento: Quando se "clica" directamente na prpria listBox a resposta do objecto dever consistir na apresentao na label "Label1" do contedo da linha seleccionada. Se, em vez de um click, ocorrer um duplo click, j a resposta respectiva dever consistir na apresentao na mesma label do nmero da linha actualmente seleccionada. Estaremos, assim, perante uma resposta diferenciada do mesmo objecto a dois eventos de tipo diferente. 47

IS E

Quando se "clica" no boto de comando "cmdTotal", a resposta desse objecto dever ser o clculo do somatrio do contedo de cada linha da listBox e a sua apresentao na label "Label2".

Figura 26: Exemplo integrador - Cdigo

O cdigo das sub-rotinas tratadoras de eventos associadas caixa de listagem e ao boto de comando encontra-se na Figura 26. Analizando esse cdigo, so pertinentes as seguintes observaes: Na sub-rotina lstValores_Click() codicada a resposta do objecto lstValores ao evento Click. Nela, apenas se atribui ao label "Label1" um texto resultante da concatenao (colagem) da string "Contedo: " com o contedo da linha seleccionada na ListBox, fornecido pela propriedade Text desse objecto. Na sub-rotina lstValores_DblClick() codicada a resposta do objecto "lstValores"ao evento Duplo Click. realizada uma operao anloga anterior, usando, desta vez, a propriedade ListIndex da ListBox. A sub-rotina cmdTotal_Click() instrui o boto de comando "cmdTotal" sobre o que fazer caso nele ocorra um evento Click. O cdigo utilizado usa uma estrutura de controlo repetitivo, neste caso um ciclo Do..While que, para cada linha da ListBox, actualiza a varivel soma com o contedo da linha especicada pelo valor contido na varivel c. Esta varivel usada para construir um contador que monitorize o nmero de linhas cujo contedo se est a somar. O seu valor inicial 0 e, para cada iterao (repetio) do ciclo, ser incrementada de uma unidade. O ciclo terminar quando 48

IS E

o contedo da varivel c for maior que o nmero de linhas da ListBox menos 117 . O nmero de linhas da ListBox fornecido pela propriedade ListCount. 5.2.4 Ciclos controlados por sentinela

Quando no possvel conhecer antecipadamente o nmero de vezes que o ciclo dever ser executado necessrio usar uma tcnica diferente: ciclos controlados por sentinela. Por sentinela deve entender-se um valor limite que assinala o m de uma dada sequncia de valores, mas que no esteja includo nessa sequncia.

Exemplo Se o utilizador estiver a introduzir os dados referentes a um conjunto de alunos identicados pelos seus nmeros de matrcula, a introduo de um nmero com menos de 6 dgitos (no caso do ISEP) como, por exemplo, o valor 1, permitir indicar ao programa que a presente sequncia de introduo de dados deve terminar. Seria esse, neste caso, o valor sentinela escolhido.

A seleco do valor sentinela da responsabilidade do programador, devendo ser escolhido fora do intervalo possvel de valores a introduzir, podendo ainda, ter-se em ateno a eventual ocorrncia de valores fora desse intervalo que possam resultar de algum eventual erro de digitao. O valor sentinela escolhido no deve pois ser passvel de facilmente ocorrer por mero acidente. Conforme pode ser observado na Figura 27 na prxima pgina um ciclo controlado por sentinela dever ser precedido da leitura de um elemento da sequncia de valores a introduzir. As leituras dos restantes valores dessa sequncia sero efectuadas dentro do corpo do ciclo, um em cada iterao. Essa leitura dever, no entanto, ser feita no m do corpo do ciclo, aps o processamento do valor anteriormente lido. Neste tipo de ciclos, a leitura e o processamento de cada valor lido andam, assim, desfasados de uma iterao do ciclo. No caso de se usar a estrutura Do..While, o ciclo funcionar enquanto o valor lido for diferente do valor sentinela escolhido. O exemplo apresentado acima, poderia ser codicado pelo segmento de programa seguinte:
1 2 3 4 5

num = InputBox ( " D i g i t e onumero" , "ISEP M a t r i c u l a s " ) Do While numero <> 1 I f numero <> 1 Then l s t b o x 1 . AddItem num num = InputBox ( " D i g i t e onumero" , "ISEP M a t r i c u l a s " ) Loop

Geralmente o valor sentinela um valor preciso. Existem casos, porm, em que a sentinela pode ser qualquer valor dentro de uma determinada gama, por exemplo, todos os nmeros negativos. Um exemplo de um ciclo controlado por uma sentinela com estas caractersticas apresentado na Seco 5.2.6 na pgina 52.
17

Note que a varivel contadora foi inicializada com o valor 0.

IS E

P
49

Figura 27: Ciclos controlados por sentinela

5.2.5

Estrutura de Controlo For..To..Next

Esta estrutura permite repetir um dado conjunto de instrues um nmero pr-determinado de vezes. Como vimos na seco anterior, nem sempre possvel saber de antemo quantas vezes as instrues contidas no corpo do ciclo devem ser repetidas. Nesse caso, devero ser utilizadas as estruturas de controlo repetitivo estudadas na Seco 5.2.1 na pgina 44. Esta estrutura permite construir ciclos controlados por contador de forma compacta e eciente. A sua sintaxe :
1 2 3

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

Esta estrutura baseia-se na existncia dum contador que incrementa automaticamente o contedo da varivel contador, chamada varivel de controlo do ciclo, cada vez que o ciclo funciona, isto , cada vez que as instrues contidas no corpo do ciclo so executadas. No incio, contador vai conter o valor inicial e aps valornal - valor inicial iteraes atingir o valor nal. Ser essa a ltima iterao do ciclo. A inicializao da varivel contadora, o seu incremento/decremento e a vericao da condio de funcionamento do ciclo (contador <= m) da responsabilidade da prpria 50

IS E

estrutura de controlo. O programador precisa, apenas, de especicar qual o valor de incio e de m (ou, de forma indirecta, o nmero de vezes que o ciclo vai funcionar) e quais as instrues que o ciclo vai repetir (o corpo do ciclo). O contedo da varivel de controlo do ciclo pode ser utilizado por instrues contidas no corpo do ciclo, mas no deve, sob pretexto algum, ser modicado por estas instrues, sob pena de se perder o controlo do funcionamento do ciclo. A estrutura de controlo verica no incio de cada iterao (repetio) do ciclo se a condio de funcionamento do ciclo ainda verdadeira. Caso seja falsa, o ciclo terminar, e o programa passar a executar as instrues que se lhe seguem. Pode ainda ser utilizada a seguinte sintaxe alternativa:
1 2 3

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

A diferena est na utilizao da palavra Step aps a especicao do valor nal. A sua incluso opcional: caso se pretenda que o contedo da varivel de controlo seja incrementada uma unidade de cada vez, desnecessrio especicar o passo. Em caso contrrio, Step passo permitir incrementar o valor de varivel de um valor diferente da unidade (positivo ou negativo). Caso o valor de passo seja positivo a varivel contadora ser incrementada. Se pretendermos, no entanto, efectuar um decremento, dever ser utilizado um valor negativo. Obviamente, nesse caso, a condio implcita de funcionamento do ciclo passar a ser contador >= m. Repare-se que nesta estrutura de controlo, ao contrrio das estudadas anteriormente, o incremento ou decremento da varivel de controle do ciclo automtico. Outro aspecto interessante que a condio de funcionamento do ciclo implcita. Ela existe e vericada mas no especicada de forma explcita pelo programador, apenas de forma indirecta ao xarem-se os valores inicial e nal da varivel de contagem. Listing 4: FormataBordo - exemplo de sub-rotina usando For..Next
1 2 3 4 5 6

Public Sub FormataBordo ( ) Dim c e l l O b j e c t As Range For Each c e l l O b j e c t In S e l e c t i o n c e l l O b j e c t . BorderAround C o l o r I n d e x :=3 , Weight := x l T h i c k Next End Sub

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 18 . A sintaxe desta estrutura a seguinte:
1

For Each elemento In C o l e c c a o

Por sua vez, um workbook tambm um objecto. Um objecto pode assim ser ele prprio uma coleco de objectos.

18

IS E

P
51

2 3

[ instrucoes ] Next

O bloco de instrues ser aplicada a cada elemento da coleco de objectos em causa. Na Listagem 4 na pgina anterior apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo. Nela utilizada a varivel cellObject para guardar um objecto do tipo Range (que representa uma gama de clulas - assunto tratado na Seco 8.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 usando uma linha grossa. 5.2.6 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 ou embutidos um dentro do outro. Diz-se tambm que esses ciclos esto encadeados.

Figura 28: Exemplo de Ciclos Imbricados

Considere-se o problema de calcular uma srie de factoriais de nmeros inteiros. O 52

IS E

clculo de um factorial realizado efectuando uma sucesso de multiplicaes. Ser necessrio usar um ciclo para o efeito. Por sua vez, se pretendermos repetir esse clculo um certo nmero de vezes, teremos tambm que usar um ciclo. Teremos assim um ciclo, chamemos-lhe exterior, que se encarrega de produzir uma sequncia de factoriais e cujo corpo inclui por sua vez um ciclo, dito interior, que responsvel pelo clculo de cada factorial. O diagrama de uxo da Figura 28 na pgina precedente representa esta realidade. O cdigo necessrio para traduzir esse diagrama o contido na Listagem 5. Listing 5: Exemplo usando Ciclos Imbricados
1 2 3 4 5 6 7 8 9 10

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

Listing 6: Exemplo de Sub-rotina usando Ciclos Imbricados


1 2 3 4 5 6 7 8 9

Sub F i l l R a n g e ( ) Num = 1 For Row = 1 To 10 For Col = 1 To 10 C e l l s (Row, Col ) . Value = Num Num = Num + 1 Next Col Next Row End Sub

O exemplo da Listagem 6 ilustra a utilizao de dois ciclos imbricados para preencher uma tabela em Excel com valores que vo de 1 at 100 (o nmero de elementos da tabela). O ciclo interior preenche as clulas de uma linha da tabela. O ciclo exterior repete isso para cada um das linhas da tabela. O preenchimento das clulas efectuado pela instruo 5, que usa o mtodo Cells(Row, Col) para aceder acada clula da gama a que se aplica..

IS E

P
53

O ciclo exterior controlado por uma sentinela, no caso qualquer valor inteiro no positivo. um exemplo de sentinela constitudo no por um valor especco mas por uma gama de valores possveis. O ciclo interior claramente controlado por contador, funcionando tantas vezes quantas o valor do inteiro cujo factorial se pretende calcular.

Variveis indexadas - vectores e matrizes

At agora, temos trabalhado com variveis que podemos classicar como individuais. Como essas variveis no podem conter simultaneamente mais que um dado, a atribuio de um novo valor a essa varivel implica o desaparecimento do valor anteriormente nela contido. Mediante a utilizao de um novo tipo de variveis, as variveis do tipo Array (Vector), passa a ser possvel armazenar na mesma varivel mltiplos valores desde que sejam do mesmo tipo. Estamos, portanto, a utilizar agora variveis que se podem classicar como variveis mltiplas. Na Figura 29 podemos observar representaes de uma varivel simples do tipo integer e de uma varivel mltipla (um vector uni-dimensional) contendo valores inteiros. Cada elemento do vector identicado por um valor numrico especco.

Um vector uma lista ordenada de variveis simples do mesmo tipo. Pode tambm ser visto como um conjunto de variveis simples agrupadas. Todos os elementos desse vector partilham o mesmo nome (o nome do vector) e so identicados 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 inteiros. O primeiro valor do ndice zero19 . Um elemento de um vector identicado utilizando o nome do vector seguido do valor do ndice dentro de parntesis: nome_vector(indice) Exemplos: var_Multipla(3) 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
19

possvel forar que os ndices dos vectores comecem do valor 1 usando a directiva Option Base 1.

IS E

Figura 29: Um vector uma varivel mltipla

P
54

Figura 30: Um exemplo de vector de strings

Os elementos de um vector no tm que ser inteiros, nem sequer valores numricos. Na Figura 30 representado um vector contendo strings (texto). Considerando o vector como armazenado os nomes dos membros de uma equipa de futebol, os sucessivos valores do ndice podem ser vistos como os correspondentes nmeros das suas camisolas. Note-se que estamos, neste caso, a forar os valores do ndice a iniciar em 1.

6.1

Declarao esttica de vectores

Dim nome_vector(num_elementos) As Tipo Exemplos:

Dim var_Multipla(8) As Integer Dim notas(30) As Single Dim nomes(100) As String Note- se que num_elementos no se refere ao valor mximo que a varivel ndice pode assumir (7, no caso do vector var_Multipla) mas sim ao nmero de elementos do vector (8, neste caso). Por este processo, a declarao do limite inferior faz-se de forma implcita: por defeito assume-se como limite inferior do ndice o valor zero (ou 1 se tal for especicado mediante a instruo Option Base 1 ). Uma forma alternativa de utilizar a instruo Dim para declarar vectores implica a utilizao da palavra reservada To, permitindo especicar o menor e o maior valor que o ndice pode assumir: Dim nome_vector(menorIndice To maiorIndice) As Tipo Exemplos:
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).
20

IS E

P
55

Como qualquer outra varivel, uma varivel do tipo Array deve tambm ser declarada (criada) antes de poder ser usada. Para tal, deve ser usada a instruo Dim, que reserva espao em memria suciente para armazenar o nmero previsto de elementos do vector 20 . Uma das formas de utilizar a instruo Dim para declarar vectores a seguinte:

Dim numeros(100 To 200) As Double Dim valores(-100 to 100) As Single

6.2

Declarao dinmica de vectores

As formas de criar variveis do tipo Array descritas anteriormente partem do princpio que as necessidades de armazenamento de informao so conhecidas previamente, i.e, que o programador pode avaliar antecipadamente qual dever ser a dimenso do vector a armazenar. Isso nem sempre acontece. Sendo este o caso, e no se querendo errar nem por defeito nem por excesso, tentando adivinhar o que seria uma dimenso adequada, possvel utilizar uma tcnica alternativa, a declarao dinmica de Arrays. Este tipo de declarao efectuada no inserindo a dimenso entre parntesis na instruo Dim: Exemplo: Dim vector() As Single Esta declarao ser inserida na zona habitual no incio do programa. Quando chegar o momento em que seja possvel avaliar de forma mais exacta a dimenso necessria para o vector, usar-se- a instruo ReDim para atribuir essa dimenso ao Array. Exemplo: ReDim vector(100)

Exemplo: ReDim Preserve vector(200)

6.3

Processamento de vectores

Sendo um vector uma varivel mltipla composta de elementos do mesmo tipo agrupados na mesma estrutura, a forma mais adequada de executar uma mesma aco sobre uma parte ou a totalidade dos seus elementos utilizar uma estrutura de controlo repetitivo ou ciclo. Para perceber de forma mais clara o porqu da armao contida no pargrafo anterior, observe-se o problema descrito na Figura 31 na pgina seguinte 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. 56

IS E

A instruo ReDim pode igualmente ser usada para re-dimensionar um vector caso se verique que a dimenso inicialmente atribuda no foi adequada. Nessa situao, caso se pretenda manter os valores j existentes no vector, dever-se- usar a opo Preserve.

Figura 31: Porqu usar ciclos para processar vectores?

Do atrs exposto facilmente se vericar 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 um deles capaz de armazenar o preo de um produto. Consequentemente, teremos apenas uma instruo Dim, no caso, algo como Dim preos As single. E quando for necessrio 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 7: Exemplo de processamento de um vector
1 2 3 4 5 6 7 8 9 10 11

Private Sub cmdGo_Click ( ) Dim v e c t o r S q r ( 1 0 0 ) As Double Dim i As Integer Dim r e s As S i n g l e l s t T a b e l a . Clear For i = 0 To txtMaior r e s = Sqr ( i ) vectorSqr ( i ) = res l s t T a b e l a . AddItem Format ( r e s , " 0 . 0 0 0 " ) Next i End Sub

O programa descrito na Listagem 7 permite calcular e apresentar sob a forma de uma tabela as razes quadradas de todos os nmeros inteiros compreendidos entre 0 e um 57

IS E

limite superior a especicar pelo utilizador na TextBox txtMaior (a largura do intervalo no deve exceder 100, visto ser esta a dimenso do vector). Os valores calculados so armazenados num vector para eventual futura utilizao. Listing 8: Outro exemplo de processamento de um vector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Private Sub cmdGo_Click ( ) Dim v e c t o r ( 1 0 0 ) As Double Dim i As Integer Dim i n d i c e As Integer Dim r e s As S i n g l e Dim l i n h a As String l s t T a b e l a . Clear indice = 0 For i = txtMenor To txtMaior r e s = Sqr ( i ) vector ( indice ) = res l i n h a = Format ( Str ( i ) , "##0" ) + "" + _ Format ( v e c t o r ( i n d i c e ) , " 0 0 0 . 0 0 0 " ) l s t T a b e l a . AddItem l i n h a indice = indice + 1 Next i End Sub

Na variante desta sub-rotina, contida no exemplo descrito na Listagem 8, possvel especicar tambm o limite inferior do intervalo, para alm de se demonstrarem algumas tcnicas de formatao da sada de dados. De notar que na primeira verso do programa se usou a mesma varivel i para controlar o ciclo For e para armazenar os valores dos ndices do vector. Tal aconteceu porque foi possvel estabelecer naquele caso uma correspondncia directa entre os valores da varivel de controlo do ciclo i e os valores do ndice que controla as posies dos elementos do vector. J na segunda variante do programa tal no era possvel, visto que a varivel de controlo do ciclo iria conter valores (desde o limite inferior ao limite superior do intervalo) que no deveriam corresponder s posies do vector em que o armazenamento dos resultados se iria efectuar. Em qualquer das variantes apresentadas, o processamento dos elementos do vector consistiu em operaes de escrita (de atribuio) que modicaram o seu valor. igualmente possvel efectuar operaes de leitura sobre todos ou parte dos elementos dum vector. Neste caso, como bvio, a varivel do tipo Array dever encontrar-se do lado direito de uma operao de atribuio: var = vector(indice) A instruo acima copia o contedo de vector na posio ndice para a varivel var.

IS E

P
58

6.4

Matrizes

As variveis indexadas descritas anteriormente representam vectores uni-dimensionais. No h nada, no entanto, que nos impea de trabalhar com estruturas de dados multidimensionais. A declarao de vectores multi-dimensionais far-se- acrescentando dimenses adicionais entre os parntesis das instrues Dim. Um vector bidimensional (vulgarmente designado por matriz) ser criado mediante uma instruo do tipo: Dim matriz(Numero_de_linhas, Numero_de_colunas) As Tipo Exemplo: Dim matriz(50,50) As Integer O exemplo anterior cria uma matriz quadrada capaz de armazenar 2500 valores inteiros. Para referenciar um elemento de matriz ser necessrio usar dois ndices, um para identicar a linha e outro para a coluna. No que diz respeito ao processamento de uma matriz, se, para processar um vector uni-dimensional, necessrio utilizar um ciclo, para processar uma matriz (vector bidimensional) sero precisos dois ciclos encadeados.

Figura 32: Ciclos encadeados para processar um vector bidimensional

Na Figura 32 pode ser visto um fragmento de cdigo em VBA que permite calcular a soma de duas matrizes (m1 e m2), colocando o resultado noutra matriz (ms). No diagrama pode ser observada a existncia de um ciclo interior que processa uma linha da matriz (correspondendo, no fundo, a um vector uni-dimensional), coluna a coluna, e que se encontra integrado no corpo de um ciclo exterior que repete esse processamento para todas as linhas da matriz. Analizando mais em detalhe o cdigo apresentado na Figura 32, pode vericar-se a existncia de dois ndices, concretizados nas variveis i e j (a 1a para controlar as linhas e a 2a para as colunas). Estas variveis foram tambm utilizadas como variveis de controle 59

IS E

dos ciclos For. Dessa maneira, vo ser percorridos automaticamente os intervalos de valores dos ndices de 1 at nl (varivel contendo o no de linhas) e de 1 at nc (varivel contendo o no de colunas). Listing 9: Soma de matrizes
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 34 35 36 37 38 39 40 41

Option Base 1 Const Linhas = 10 Const Colunas = 10 Private Sub cmdCalc_Click ( ) Dim m1( Linhas , Colunas ) As Integer , Dim m2( Linhas , Colunas ) As Integer Dim ms( Linhas , Colunas ) As Integer , l i n h a As String Dim n l As Integer , nc As Integer , i As Integer , j As Integer n l = Val ( txtNL . Text ) nc = Val ( txtNC . Text ) I f nc < 1 Or nc > Colunas Or n l < 1 Or n l > Linhas Then MsgBox " Dimensoes e r r a d a s ! " Else For i = 1 To n l l e i t u r a da m a t r i z 1 l i n h a = "" For j = 1 To nc m1( i , j ) = Val ( InputBox ( "M1[ " & i & " , " & j & "]=" ) ) l i n h a = l i n h a & "" & m1( i , j ) Next lstM1 . AddItem l i n h a Next For i = 1 To n l l e i t u r a da m a t r i z 2 l i n h a = "" For j = 1 To nc m2( i , j ) = Val ( InputBox ( "M2[ " & i & " , " & j & "]=" ) ) l i n h a = l i n h a & "" & m2( i , j ) Next lstM2 . AddItem l i n h a Next For i = 1 To n l c a l c u l o da soma de m1 com m2 l i n h a = "" For j = 1 To nc ms( i , j ) = m2( i , j ) + m1( i , j ) l i n h a = l i n h a & "" & ms( i , j ) Next lstMS . AddItem l i n h a Next End I f End Sub

IS E

P
60

Na Listagem 9 na pgina precedente pode ser encontrado o cdigo completo de um programa que preenche as duas matrizes m1 e m2 com valores fornecidos pelo utilizador, aps o que calcula a matriz soma ms. O programa faz ainda a apresentao do contedo das trs matrizes noutras tantas caixas de listagem. No cdigo pode ser observada a utilizao de constantes para facilitar a escrita e eventual alterao do programa. Foram inicialmente denidas as duas constantes Linhas e Colunas que vo ser em seguida utilizadas por vrias vezes ao longo do programa. Se houver necessidade de alterar as dimenses das matrizes, bastar modicar a denio inicial das constantes. As instrues contidas nas linhas 20, 28 e 36 so usadas para acrescentar string a adicionar s ListBox o contedo (devidamente formatado) do elemento da matriz que se encontra a ser processado no momento.

IS E
61

Funes e Procedimentos

Nesta seco vamos falar da organizao interna de um programa. Em vez de incluir todas as instrues numa nica entidade, possvel e aconselhvel organizar um programa em vrios mdulos, divididos de acordo com a sua especializao. A melhor maneira de encontrar a soluo para um problema complexo dividi-lo em subproblemas e estes por sua vez em problemas de ainda menor dimenso at atingir um nvel de complexidade sucientemente baixo para ser resolvido sem diculdade. Uma vez resolvidos os subproblemas de nvel mais baixo, comea um processo inverso, de integrao de mdulos individuais num todo coerente. A construo de um programa baseia-se num processo idntico. Deve ser seguido o mtodo de subdividir o problema nas suas partes constituintes e encontrar soluo para cada uma delas, integrando no m as partes no todo. Cada uma dessas partes pode constituir um mdulo independente que ser utilizado pelo programa principal, usando um mecanismo que se pode descrever como de "subcontratao". Usando este mecanismo, o programa principal vai utilizar os servios dos mdulos especializados na realizao de certas tarefas. possvel, assim, re-aproveitar as capacidades desses mdulos, em vez de ser o prprio programa a assegurar essas tarefas. Por outro lado, organizando o programa dessa forma, possvel melhorar a sua legibilidade e facilitar a sua manuteno, j que quaisquer alteraes a cada mdulo caro circunscritas a esse mdulo, evitando efeitos secundrios indesejveis.

7.1

Funes

Os programas descritos nos exemplos que tm sido apresentados destinam-se a executar tarefas. Por exemplo, as rotinas descritas na Seco 2.6 na pgina 13 tm como objectivo a monitorizao dos valores contidos em determinadas clulas da folha de clculo. Este tipo de rotinas designado por procedimentos ou sub-rotinas (em linguagem VBA). Destinam-se a realizar tarefas e no tm necessariamente que devolver 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 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. Uma funo devolve obrigatriamente um, e s um, resultado. Dever possuir uma estrutura denida pela sintaxe seguinte:
1 2 3 4

Function Nome ( argumento1 , argumento2 , . . . ) L i s t a de i n s t r u c o e s Nome = r e s u l t a d o End Function

Repare-se que para alm das diferenas bvias no cabealho e no delimitador nal em relao s sub-rotinas estudadas anteriormemte, verica-se o seguinte: 62

IS E

Figura 33: Funes como caixas pretas

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 Excel: = 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. Para o utilizador da funo, no interessa conhecer o seu funcionamento interno, mas apenas qual a informao que lhe tem que fornecer e qual o tipo de resultado esperado. Assim sendo, pode dizer-se que do ponto de vista do programa que utiliza a funo, ela se comporta como uma caixa preta, qual fornecida informao e que, com base nela, produz um resultado (Figura 33).

7.2

Exemplos de funes criadas 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 10: Funo mLucro
1 2 3

Public Function mlucro ( v As s i n g l e , c As s i n g l e ) As s i n g l e mLucro = ( v c ) / v End Function 63

IS E

Observe-se que funo mlucro possui dois parmetros de entrada, v e c, atravs dos quais receber os dados das vendas e dos custos respectivamente. Estes dois parmetros esto preparados para receber dados do tipo single. 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. O tipo de resultado fornecido pela funo especicado na parte direita do cabealho, tambm do tipo single, neste caso21 .

Figura 34: Utilizao da funo margemLucro numa frmula

Esta funo poder ser utilizada em qualquer frmula contida numa clula da folha de clculo, da mesma maneira que qualquer das funes pr-existentes o seria. Um exemplo de uma frmula utilizando esta funo seria a apresentada na Figura 34. A frmula, que pode ser visualizada na barra de frmulas da imagem apresentada na Figura 34, contem referncias s clulas D3 e D2, em que esto contidos, respectivamente, o preo de venda e o custo do produto. Quando a funo invocada, cpias do contedo destas duas clulas so passadas funo. Esta recebe-os atravs dos parmetros de entrada respectivos, v e c. O resultado do seu clculo ser deixado na frmula, quando a funo termina o seu trabalho. Listing 11: Funo factorial
1 2 3 4 5 6 7 8

Function f a c t o r i a l ( ByVal n as Integer ) as Double Dim i as Integer , f as Double f = 1 For i = 2 To n f = f i Next i factorial = f End Function

Vamos agora apresentar outro exemplo de funo criada pelo programador e de como esta pode ser utilizada num programa. Trata-se de uma funo que calcula o factorial de um nmero inteiro. J que o factorial de um nmero obtido custa da multiplicao
Quer no que respeita ao tipo de resultado devolvido, quer ao tipo de dados recebido pela funo atravs dos parmetros de entrada, possvel omitir a sua especicao no cabealho da funo. Isso ter como consequncia que o VBA parta do princpio que se trata de dados do tipo Variant. Os inconvenientes de usar este tipo de dados j foram referidos na Seco 3.4 na pgina 20.
21

IS E

P
64

de todos os valores inteiros entre 1 e esse nmero, estamos perante um caso tpico de utilizao de uma estrutura de repetio. O cdigo da funo apresentado na Listagem 11 na pgina precedente usa um ciclo For para repetir a instruo f = f * i, responsvel pela actualizao da varivel f. No nal do ciclo, essa varivel conter o resultado das sucessivas multiplicaes, ou seja, o prprio factorial. Atente-se a que essa varivel deve ser inicializada com o valor 1, j que este o elemento neutro na multiplicao. Finalmente, o resultado contido em f copiado para o nome da funo de modo a permitir que ela possa devolver esse resultado ao programa que a invoca. Na Listagem 12 pode ser consultado o cdigo de um programa que calcula combinaes, usando a funo factorial que acabmos de estudar22 . Este programa codica a resposta do boto de comando cmdCombina ao evento click. Listing 12: Programa de clculo de Combinaes
1 2 3 4 5 6 7 8 9 10

Private Sub cmdCombina_Click ( ) Dim n As Integer , p As Integer n = Abs ( [ D4 ] ) p = Abs ( [ D5 ] ) I f n > 0 And p > 0 And n >= p Then [ D7 ] = f a c t o r i a l ( n ) / f a c t o r i a l ( n p ) / f a c t o r i a l ( p ) Else MsgBox " Erro : dados i n v a l i d o s ! " , vbOKOnly End I f End Sub

O programa l os valores da populao e da amostra contidos nas clulas D4 e D5, respectivamente, aps o que, caso os valores de n e p sejam vlidos, calcula as combinaes de n, p a p, atravs da instruo na linha 6. Esta instruo guarda na clula D7 o resultado da expresso de clculo de combinaes23 . Para perceber melhor como essa expresso avaliada, na Figura 35 descrito o processo passo a passo.

Figura 35: Anlise passo a passo da expresso de clculo das combinaes


22 23

Programa adaptado de um exemplo dos textos de apoio do prof. ngelo Martins. n! A frmula de clculo de combinaes n p = (np)!p! .

IS E

P
65

Em 1o lugar, so copiados os valores das variveis do programa principal para os parmetros de entrada da funo24 . Assim n e p so substitudos pelos valores presentes nesse momento nessas variveis (Passo 1). Como na 2a invocao da funo o que lhe est a ser passado o resultado da expresso n - p, essa expresso tem que ser calculada. Em seguida, a funo sucessivamente invocada com os valores previamente obtidos. Com esses valores, a funo faz o clculo do factorial e terminando o seu trabalho, deixa no seu lugar o rsultado do clculo (Passo 4). S falta agora calcular o resultado da expresso e armazenar o seu resultado na clula D7.

7.3

Passagem de parmetros ByVal

Nesta seco vamos analisar em maior detalhe o processo de passagem de parmetros entre as funes e procedimentos e os programas que os invocam. Para poder trabalhar, uma funo precisa de dados, que lhe so passados atravs de parmetros. Esses dados so processados, e, no caso das funes, um resultado produzido e devolvido ao programa que a chamou, atravs do seu prprio nome. Uma funo invocada numa expresso, usualmente do lado direito de uma operao de atribuio. A instruo que a invoca tem que, ao mesmo tempo, entregar-lhe os dados de que a funo necessita para o seu trabalho (no caso da funo factorial, o nmero cujo factorial se pretende conhecer). Esses dados so passados como argumentos da funo. No exemplo seguinte, a funo factorial invocada passando-lhe como argumento o contedo da varivel num:

Para poder receber a informao que lhe foi passada como argumento, a funo dever ter sido criada de forma a poder receb-la adequadamente. Para tal, dever possuir um parmetro de entrada por onde essa informao possa entrar. No caso da funo factorial, n esse parmetro de entrada e est preparado para receber dados do tipo integer.

Figura 36: Comunicao da funo com o programa que a invoca


24

Para ver em detalhe esse proceeso, consultar a Seco 7.3

IS E

P
66

fac = factorial(num)

Na Figura 36 na pgina precedente est assinalado o parmetro n com o sendo a via de entrada de informao na funo bem como a forma pela qual o resultado fornecido. No cdigo da funo factorial pode observar-se a incluso da palavra reservada ByVal imediatamente antes do nome do argumento. Esta palavra indica que a funo espera que um argumento lhe seja passado "por valor", ou seja, que aquilo que venha a receber atravs daquele parmetro seja exactamente o dado com que vai trabalhar. Por oposio a ByVal pode usar-se a palavra ByRef ("por referncia"). Neste caso, a informao passada funo ou procedimento ser no um valor especco mas a indicao de onde esse valor poder ser encontrado ou, por outras palavras, o endereo da varivel em que o valor a utilizar se encontrar. O uso de ByRef tem ainda outras consequncias que sero estudadas na Seco 7.4.

7.4

Procedimentos

At agora, temos estado a analisar o processo pelo qual as funes e os programas que as invocam comunicam entre si. Uma funo, como vimos, devolve um e um s resultado. H, no entanto, situaes em que conveniente que as rotinas possam devolver mais do que um resultado. Nesses casos, uma funo no pode ser utilizada. Teremos que usar um procedimento (ou sub-rotina) 25 e usar a tcnica de passagem de parmetros por referncia (ByRef ). Se bem que j tenhamos por vrias vezes lidado com procedimentos, est na altura de formalizar o processo da sua criao. A sintaxe utilizada a seguinte: Sub <nome>(Lista_de_argumentos ) instrucoes End Sub

Antes da palavra reservada Sub possvel acrescentar Private ou Public, conforme o o mbito do procedimento esteja ou no circunscrito ao mdulo em que o procedimento esteja inserido 26 . A Lista de argumentos composta por elementos do tipo "Nome As Tipo" separados por vrgulas. Note-se que um procedimento no tem que devolver resultados. Pode limitar-se a executar uma ou mais tarefas que no implicam o clculo e devoluo de resultados. Nesse caso, podem ser vistos apenas como um sub-programa especializado na execuo de uma tarefa especca. Enquanto que uma funo apenas pode ser invocada no interior de uma expresso e, portanto, aparece vulgarmente do lado direito de uma operao de atribuio, j um procedimento invocado como uma instruo. A forma geral ser algo como: nome_do_procedimento argumento1, argumento 2,...argumentoN Na Listagem 13 na pgina seguinte (linha 11) pode ser observado um exemplo de invocao de um procedimento.
Como foi referido na Seco 7.1 na pgina 62 no obrigatrio que um procedimento devolva resultados. Pode limitar-se a executar uma tarefa que no implique fornecer o resultado de um clculo. 26 Na prtica, Public Sub ou Sub tm exactamente o mesmo efeito.
25

IS E

P
67

Uma forma alternativa de chamar um procedimento implica o uso da palavra Call. Nesse caso, a eventual lista de argumentos passada dentro de parntesis. Teremos assim: Call nome_do_procedimento(argumento1, argumento 2,...argumentoN)

7.5

Passagem de parmetros ByRef

Dissemos que para um procedimento poder fornecer vrios resultados teremos que recorrer passagem de parmetros por referncia. No fundo, um procedimento receber o endereo de uma varivel do programa principal, que o que acontece quando um argumento lhe passado ByRef, equivale a receber autorizao do programa para que aceda livremente a essa varivel, no s para ler o seu contedo mas igualmente para o modicar. Se um procedimento for autorizado a aceder a mltiplas variveis do programa que o invocar, ter oportunidade de devolver resultados mltiplos, colocando um resultado em cada varivel. Conforme foi referido na Seco 3.3 na pgina 18 as variveis tm um mbito prprio. Em regra geral, uma varivel criada num dado procedimento apenas ser conhecida no local em que foi criada e, como tal, s poder ser acedida nesse procedimento. A excepo so as variveis globais que, por serem declaradas fora de qualquer mdulo, so accessveis a partir de qualquer um. A passagem de parmetros ByRef um mecanismo que permite tambm o acesso a variveis exteriores ao mdulo em que foram criadas. Listing 13: Diferentes resultados na passagem por valor e por referncia

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

a = 100 b = 400 v a l o r e s de a e b a n t e s da chamada de proc2 [ I3 ] = a [ J3 ] = b proc2 a , b v a l o r e s de a e b d e p o i s da chamada de proc2 [ I4 ] = a [ J4 ] = b End Sub Sub proc2 ( ByRef v1 As Integer , ByVal v2 As Integer ) v1 = v1 1 . 1 v2 = v2 1 . 1 End Sub 68

IS E

Private Sub proc1 ( ) Dim a As Integer Dim b As Integer

Analizemos o cdigo da Listagem 13 na pgina anterior. O procedimento proc1 trabalha com as variveis a e b. Copia os seus valores para as clulas I3 e J3 respectivamente. Em seguida chama o procedimento proc2 passando-lhe dois argumentos: o primeiro passado por referncia ()ByRef ), ou seja, o que efectivamente enviado endereo (referncia) da varivel a ; o segundo passado por valor (ByVal ), i.e, efectuada uma cpia do contedo da varivel b. Dentro de proc2 so modicados os valores dos seus parmetros de entrada v1 e v2 em que, na altura da sua invocao, foram colocados uma referncia varivel a e uma cpia do contedo de b, respectivamente. Observe-se agora qual o contedo de a e b aps a invocao de proc2, conforme apresentados na Figura 37.

Figura 37: Resultados do cdigo da Listagem 13 na pgina anterior

Verca-se que enquanto o contudo de a mudou, o contedo de b manteve-se inalterado. De facto, enquanto que atravs do primeiro parmetro foi passado a proc2 autorizao para alterar a varivel a, j no caso do segundo parmetro o que foi enviado foi meramente uma cpia do contedo de b. Esse valor foi alterado dentro de proc2 mas essa alterao ca estritamente circunscrita a esse procedimento. Torna-se assim claro que quando um programa invoca um procedimento passando-lhe como argumentos referncias a variveis suas, est efectivamente a autoriz-lo a manipular essas variveis. Assim sendo, o procedimento ter agora possibilidade de colocar nessas variveis os resultados dos seus clculos. Como no h um limite prtico para o nmero de argumentos que se pode passar a uma rotina, um procedimento poder devolver mltiplos resultados ao programa que o invocar, contornando a limitao existente no caso das funes.

7.6

Como aceder s funes standard do Excel

Se bem que o VBA possua vrias dezenas de funes pr-denidas, muito conveniente poder utilizar num macro qualquer uma das centenas de funes standard oferecidas pelo Excel. Para poder aceder a elas a partir do VBA necessrio utilizar a propriedade WorsheetFunction do objecto Application 27 . Por exemplo, para, num macro, calcular o valor mdio de uma gama de clulas (identicada pelo nome "Dados") poderia ser usada a seguinte instruo: med = Application.WorksheetFunction.Average(Range("Dados"))
Claro que s as funes do Excel que no se encontram duplicadas no VBA podem ser acedidas por meio da propriedade WorsheetFunction.
27

IS E

P
69

Esta instruo permite aceder funo standard Average do Excel, qual passado um objecto do tipo Range, representando a gama de clulas descritas sob o nome "Dados". O resultado fornecido pela funo ser a mdia dos valores contidos nas clulas que compem essa gama.

IS E
70

Programao do Excel usando VBA

Nesta seco vamos aprender a trabalhar com os objectos do Excel mais comuns: o Workbook (Livro de trabalho), a Worksheet (Folha de clculo) e o Range (gama de clulas). So objectos que pertencem, por sua vez, ao objecto principal que a Application (Aplicao, neste caso, o prprio Excel).

8.1

Trabalhar com objectos Workbook

Usando estes objectos, o VBA pode criar novos livros de trabalho, abrir ou fechar existentes, entre outras aces possveis. Para especicar qual o livro de trabalho com que queremos trabalhar podemos faz-lo de trs maneiras diferentes: Usando o objecto Workbooks que representa o conjunto dos cheiros Excel abertos naquele momento (Workbooks(Nome) ); Usando o objecto ActiveWorkbook que representa o cheiro com que se est de momento a trabalhar; Usando o objecto ThisWorkbook que representa o cheiro em que o prprio programa em VBA (e no necessariamente o utilizador) est a operar. Para abrir um Livro de Trabalho aplica-se o mtodo Open ao objecto Workbooks : Sintaxe: Workbooks.Open Nome_do_cheiro

Exemplo: Workbooks.Open "C : \Documentos\Excel\Dados.xls" Os mtodos Save e Close so utilizados de forma similar para salvaguardar o contedo dum cheiro e para o fechar, respectivamente.

8.2

Trabalhar com objectos Worksheet

Normalmente um livro de trabalho possui mais do que uma folha de clculo ( normalmente criado logo partida com trs). Para escolher qual a folha de clculo com que se pretende trabalhar usa-se o objecto Worksheets especicando um ndice ou o nome da folha de clculo em causa, conforme se exemplica a seguir: Worksheets(2) Worksheets("Custos") 8.2.1 Propriedades de Worksheet

Nesta seco so referidas algumas das suas propriedades mais teis:

IS E

P
71

Worksheet.Name - permite mudar ou obter o nome da folha de clculo. O exemplo abaixo muda o nome de "Folha 1" para "Medidas": Worksheets("Folha 1").Name = "Medidas" Worksheet.StandardWidth - permite especicar a largura standard das colunas duma folha de clculo. 8.2.2 Mtodos de Worksheet

Eis alguns dos mtodos normalmente aplicados a este tipo de objectos: Worksheet.Activate - torna activa a folha de clculo especicada28 . O exemplo seguinte torna activa a folha de clculo "Custos" do livro de trabalho "Dados 2007": Workbook("Dados 2007").Worksheets("Custos").Activate Worksheet.Copy - copia a folha de clculo especicada para outra posio dentro do livro de trabalho. Sintaxe: Worksheet.Copy [Position] O argumento Position opcional e pode ter o valor Before ou After indicando a posio onde a cpia ser inserida. Caso o argumento no seja includo, a cpia ser inserida num novo livro de trabalho. Exemplo:

Worksheets(2).Copy After:=Worksheets(3) O exemplo anterior faz uma cpia da 2a folha de clculo e insere-a a seguir 3a . O mtodo Move usa uma sintaxe idntica para mover uma determinada folha de clculo para outra posio. Worksheet.Delete - permite eliminar a folha de clculo especicada. Worksheet.Add - permite acrescentar uma nova folha de clculo ao livro de trabalho. Sintaxe: Worksheet.Add [Position] Tambm aqui o argumento Position opcional. Se for omitido, a nova folha de clculo ser inserida imediatamente antes da folha activa. Exemplo: Worksheets.Add After:=Worksheets("Medidas")
28

A folha de clculo activa aquela que est visvel no momento.

IS E

P
72

8.3

Trabalhar com objectos Range

Um objecto do tipo Range pode representar uma simples clula, um conjunto de clulas, uma linha ou uma coluna. No existe em VBA um objecto especco para representar uma clula individual. Para nos referirmos a uma clula ou gama de clulas podemos aplicar o mtodo Range ao objecto Worksheet usando uma de duas sintaxes possveis: Sintaxe 1: Worksheet.Range(Nome) Sintaxe 2: Worksheet.Range(Celula1, Celula2) A 1a sintaxe usa nomes de gamas pr-denidos29 , enquanto que a 2a utiliza as referncias das clulas que denem os dois vrtices opostos da rea rectangular contendo as clulas que se quer especicar. Caso se omita a referncia a 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 da folha de clculo activa. 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 modicar 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 identicar apenas uma clula podemos tambm utilizar o mtodo Cells. Sintaxe: Objecto.Cells(Linha,Coluna) Na sintaxe acima, a entidadeObjecto pode ser um objecto Worksheet ou Range. Mais uma vez, 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 encontra30 . Veja-se o seguinte exemplo:
1 2 3

For c o l u n a = 2 To 13 C e l l s ( 2 , Coluna ) . Value = "Mes" & c o l u n a 1 Next

O exemplo acima usa um ciclo For...To para preencher todas as clulas da gama C2 a C13 com o texto "Ms X" em que X o no do ms. usado o operador de concatenao de strings & para efectuar a colagem.
Atribudos em Excel usando o Menu "Insert/Name/Dene ". Se o objecto for do tipo Range, os argumentos Linha e Coluna referir-se-o linha e coluna dentro da gama de clulas especicada.
30 29

IS E

P
73

Caso se pretenda identicar uma linha ou coluna completa, podem ser utilizados os mtodos Rows e Columns. Sintaxe: Objecto.Rows(Indice) Objecto.Columns(Indice) Para ilustrar a utilizao do mtodo Rows atente-se no seguinte exemplo de subrotina31 : Listing 14: Sub-rotina InsereLinhas
1 2 3 4 5 6 7 8 9 10 11

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

Esta sub-rotina recebe como argumentos uma gama de clulas (um objecto do tipo Range ) e um inteiro especicando o nmero de linhas a inserir abaixo da ltima linha dessa gama. A estrutura With...End...With muito prtica porque permite executar um conjunto de instrues sobre um determinado objecto, neste caso qualquer objecto Range que a sub-rotina receba como argumento. Dentro da estrutura With...End...With omite-se qualquer referncia a esse objecto, usando-se apenas os seus mtodos e propriedades. Assim, .Rows.Count refere-se ao nmero total de linhas da gama especicada e .Rows(num_linhas).Row fornece-nos o ndice da ltima linha dessa gama. O ciclo For...To repete num vezes a aplicao do mtodo Insert ultima linha da gama. Para testar a sub-rotina InsereLinhas, use-se a seguinte rotina de teste:
1 2 3

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 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. Existe uma propriedade dos objectos Range particularmente til. Trata-se da propriedade Oset que permite denir um deslocamento em relao a um objecto Range, por exemplo, em relao clula activa.
31

Adaptado de um exemplo contido em [1].

IS E

P
74

Sintaxe: Range.Oset(linha,coluna) Na Figura 38 podem observar-se dois exemplos de aplicao desta propriedade. Mantendose a clula activa B3, no caso A foi armazenado o valor 2 na clula B5 (duas linhas abaixo de B3 e na mesma coluna) usando a seguinte instruo: ActiveCell.Oset(2,0) = 2 No caso B, foi colocado o valor 2 em A3 (na mesma linha e uma coluna antes de b3), usando a instruo: ActiveCell.Oset(0,-1) = 2 Note-se que nos dois casos a clula activa se manteve inalterada. Apenas se especicou a posio de uma clula em relao a um referencial xo (B3).

Figura 38: Exemplos de utilizao da propriedade Oset

Usando esta propriedade podemos escolher uma clula especicando a sua coluna ou a sua linha (ou as duas) de forma relativa, ou seja, em relao ao objecto Range a que se aplica. Isto pode no parecer primeira vista especialmente til. No entanto, se pensarmos que linha ou coluna podem ser constitudos por variveis, cujo valor pode ser controlado por uma estrutura de repetio, podemos ver que temos aqui uma forma expedita de executarmos uma mesma aco sobre um conjunto de clulas denido de forma relativa em relao a uma dada clula, que podemos considerar como uma espcie de ncora.

IS E
75

Adicionando uma interface grca

O acesso aos macros faz-se, conforme referido na Seco 2.3, mediante a combinao de teclas ALT-F8. Pode ainda associar-se a um macro uma combinao de teclas especial que permite accion-lo directamente. No entanto, em muitos casos, mais conveniente poder interagir com o macro atravs de uma interface prpria, concebida especialmente para ele. Usam-se para o efeito objectos grcos como Dialog Boxes (Caixas de Dilogo) desenhadas medida, que so verses mais desenvolvidas das j conhecidas Input Boxes e Message Boxes. Vamos nesta seco ver como construir as nossas prprias Dialog Boxes usando objectos da classe UserForm e como as integrar numa aplicao em VBA.

9.1

Instalao da Form

Uma Form uma janela, em si mesma um objecto, utilizada como um contentor para outros objectos grcos (ver Seco 4.3.3 na pgina 32). Pode-se criar um objecto da classe UserForm no Editor do VBA atravs do Menu "Insert/User Form ".

Figura 39: Criao de uma Form no VBA

Na Figura 39 pode-se ver uma Form vazia e uma caixa de ferramentas (Toolbox ) contendo os vrios controlos (objectos grcos) disponveis para a construo da interface. Pode ainda ver-se no canto inferior esquerdo a Janela de Propriedades, atravs da qual 76

IS E

possvel manipular vrias caractersticas da Form (como, alis, de qualquer controlo que esteja seleccionado).

9.2

Instalao dos Controlos

Usando a Caixa de Ferramentas (Toolbox ), possvel escolher e instalar os controlos na Form. Para o efeito, basta accionar o smbolo do controlo pretendido e desenh-lo com o rato na Form. A seguir, quer agindo directamente sobre o controlo, quer utilizando a Janela de Propriedades, podem-se fazer os ajustes necessrios das suas caractersticas. Se bem que cada classe de controlos possua a sua lista especca de propriedades, existem algumas propriedades importantes que so comuns maioria delas (ver Seco 4.1 na pgina 23). Conforme referido na Seco 4.3 na pgina 29 no ambiente de desenvolvimento do VBA encontram-se disponveis diversos tipos de controlos: botes de comando (Command Buttons ), etiquetas (Labels ), caixas de texto (Text Boxes ), quadros (Frames ), botes de opo (Option Buttons ), caixas de vericao (Check Boxes ) e caixas de listagem (List Boxes ), entre outros.

9.3

Associao da Form ao procedimento

Uma vez construda a form preciso associ-la ao programa que a vai utilizar. Nesta fase h trs aspectos a considerar:

2. Tratamento dos eventos que ocorram enquanto a Form estiver visvel 3. Processamento dos resultados fornecidos pela Form O 2o ponto, referente ao tratamento dos eventos, foi j discutido anteriormente. Os restantes sero tratados nas seces seguintes. 9.3.1 Como visualizar e terminar uma Form

Para visualizar a UserForm usa-se o mtodo Show : Exemplo: MinhaForm.Show Se, em alternativa, se pretender arrancar com a Form mas sem a visualizar nesse momento, usa-se a instruo Load : Exemplo: Load MinhaForm Quando se pretender tornar a Form visvel, aplicar-se- ento o mtodo Show. Aps a sua utilizao, quando uma Form deixar de ser necessria, deve-se utilizar a instruo Unload para a desactivar: Exemplo: 77

IS E

1. Visualizao da Form

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 2

Exemplo : Set MinhaForm = Nothing Tratamento de eventos atravs de Event Handlers

9.3.2

Este tema foi j introduzido na Seco 4.1.3 na pgina 25. Pelo menos um controlo instalado na form deve ter um Event Handler associado. Vamos agora considerar o exemplo de um Event Handler utilizando a instruo Unload Me e associado a um controlo (neste caso, como habitual, 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 15: Handler do objecto cmdFechar para o evento click
1 2 3 4 5 6 7

A sub-rotina acima vai especicar a reaco do boto de comando cmdFechar ao evento Click, neste caso apresentar uma MsgBox que conrme a inteno do utilizador de fechar a Form. Outro evento importante o Change que ocorre sempre que se altera o contedo de objectos como as Text Box. Na Seco 9.4 na pgina 82 encontra-se um exemplo de um Event Handler associado a este tipo de evento. O tratamento de qualquer evento a ocorrer na Form, ou em qualquer dos controlos nela presentes, dever basear-se num Event Handler que dena a resposta adequada. 9.3.3 Como recolher os resultados de uma Form

Uma UserForm muitas vezes utilizada para pedir informao ao utilizador. Nesse caso, ser necessrio recolher os dados introduzidos ou as opes seleccionadas nos controlos apropriados. Para tal preciso aceder s propriedades Value dos diversos controlos existentes na Form e copiar os seus valores actuais para clulas da folha de clculo. O contedo da propriedade Value nas principais classes de controlos encontra-se resumida na seguinte tabela:

IS E

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

P
78

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

Recorde-se que nas List Boxes em VBA 1a linha corresponde a posio 1. 9.3.4 Exemplo de aplicao

Vamos nalmente aplicar estes conceitos e tcnicas na construo e integrao de uma UserForm (descrita na Figura 40 na pgina seguinte) que permita a introduo conjunta 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. Conforme referido na Seco 4.3.10 na pgina 36, 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 16: Exemplo de sub-rotina de invocao de uma UserForm
1 2 3 4

O macro da Listagem 16 chama a UserForm com o nome usrFrmInput e remove-a de memria quando ela termine o seu trabalho. Para facilitar a sua invocao, conveniente associar ao macro uma combinao de teclas especca, usando uma das tcnicas j aprendidas (ver parte nal da Seco 2.6). Listing 17: Exemplo de sub-rotina de inicializao de uma UserForm
1 2 3 4 5 6 7 8

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

A sub-rotina da Listagem 17 um event handler especial que trata do evento Initialize. Este evento ocorre quando a UserForm criada. Assim sendo, esta sub-rotina executada de forma automtica sempre que a UserForm arranca. Neste caso, trata de inicializar a Combo Box "cmbCursos" com os nomes dos diferentes cursos da escola.

IS E

P
79

Public Sub testUserFormInput ( ) usrFrmInput . Show Set usrFrmInput = Nothing End Sub

Figura 40: A UserForm para Entrada Mltipla de Dados

Listing 18: Handler do objecto cmdFechar para o evento Click


1 2 3 4 5 6 7 8

O Event Handler da Listagem 18 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, permitindo assim memorizar os dados introduzidos pelo utilizador. Nessa listagem pode observar-se que as trs instrues de atribuio a outras tantas clulas da folha de clculo "Worksheets(4)" esto encapsuladas pela estrutura With..End With . Esta estrutura permite a omisso da referncia ao objecto (neste caso a "Worksheets(4)") a que pertencem as clulas em causa. Isto tambm vlido quando queremos especicar propriedades ou aplicar mtodos a um mesmo objecto. Veja-se o exemplo na Seco 9.4.

9.4

Exemplo de aplicao mais elaborado

Neste exemplo mais elaborado vamos introduzir o controlo Tabstrip existente no VBA. Este objecto permite a apresentao de diferentes conjuntos de valores mediante a seleco de diferentes separadores ("tabs"). Na Figura 41 na pgina seguinte 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 gura, encontram-se trs TextBox. 80

IS E

Private Sub cmdFechar_Click ( ) With Worksheets ( 4 ) . [ H5 ] = txtNome . Value . [ I 5 ] = txtNum . Value . [ J5 ] = cmbCursos . Text End With Unload Me End Sub

Figura 41: Objecto da classe Tabstrip

Listing 19: 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 m, so atribudos a cada uma das TextBox contidas na Tabstrip1 os contedos das trs clulas da folha de 81

IS E

Conforme j referido anteriormente (Seco 4.1 na pgina 23), para que um controlo possa reagir a aces provocadas pelo utilizador, como o "clicar" do rato, preciso que o programador crie sub-programas especiais, chamados Event Handlers (tratadores de eventos) e que esses sub-programas sejam associados aos controlos respectivos. Esses Handlers contm as instrues que controlam a reaco do objecto ao evento ocorrido. Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitem especicar o comportamento de controlos em face de certos eventos. Em primeiro lugar, apresentar-se- o Event Handler da form "UserForm" para o evento Initialize (Listagem 19). Este evento ocorre automaticamente quando, aps o arranque do programa, a form criada.

clculo referentes ao curso referente ao 1o separador. Mais uma vez, repare-se na utilizao da estrutura With..End que permite simplicar a escrita das instrues 3,4 e 5. Sem ela, cada uma dessas instrues deveria vir precedida do nome do objecto a que se aplicam (TabStrip1 ). Da mesma forma, nas instrues 8,9 e 10, as referncias s clulas D5, D6 e D7 teriam que ser precedidas da indicao de qual a folha de clculo a que pertenciam (Worksheets(4) ). O prximo procedimento (Listagem 20) 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. 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 e armazen-los nas caixas de texto respectivas. Listing 20: 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

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

IS E

P
82

10

Manipulao de texto

O VBA representa texto atravs de strings (cadeias de caracteres). No existe um tipo de dados especco para representar caracteres individuais, pelo que se utiliza o mesmo tipo usado para cadeias de caracteres.

10.1

Funes de manipulao de strings

Nesta seco so introduzidas algumas funes especializadas no tratamento de strings e que sero utilizadas nos exemplos de programas de manipulao de texto apresentados na Seco 10.2 na pgina 85. 10.1.1 Trim, LTrim e RTrim

Estas funes retornam uma cpia da string original, mas sem os eventuais espaos no incio ou m da string. Exemplos: Dim s1 As String , s2 As String s 1 = "ISEP C i v i l " s 2 = Trim ( s1 ) R e s u l t a d o : "ISEP C i v i l " s 2 = LTrim ( s1 ) R e s u l t a d o : "ISEP C i v i l " s 2 = RTrim ( s1 ) R e s u l t a d o : " ISEP C i v i l " Os espaos que ocorram no interior da string no so afectados por estas funes. A string original mantem-se inalterada. 10.1.2 Len

Retorna o nmero de caracteres de uma string ou, por outras palavras, o seu comprimento.. Exemplos: Dim s1 As String , n As Integer s 1 = "ISEP C i v i l " n = Len ( s1 ) R e s u l t a d o : n = 14 n = Len ( Trim ( s1 ) ) R e s u l t a d o : n = 10 10.1.3 Left, Right

Estas funes copiam n caracteres da string s a partir da esquerda (Left ) ou da direita (Right ). Sintaxe: Left(s As String, n As Integer) As String Exemplos:

IS E

P
83

Dim s1 As String , s2 As String , n As Integer s 1 = "ISEP C i v i l " n = 2 s 2 = Left ( s t 1 , n ) R e s u l t a d o : s2 = " IS " s 2 = Right ( s t 1 , n ) R e s u l t a d o : s2 = " i l " E l i m i n a r o p r i m e i r o c a r a c t e r de uma s t r i n g . s 1 = Right ( s1 , Len ( s1 ) 1) R e s u l t a d o : s1 = "SEP C i v i l " Esta ltima instruo usa a funo Right para seleccionar os primeiros Len(s1)-1 caracteres contados a partir da direita. Se Len(s1) nos d o nmero de caracteres da string ento os caracteres seleccionados sero todos menos o primeiro. Como esta nova string de novo guardada em s1, estamos efectivamente a eliminar o 1o caracter da string s1. 10.1.4 Mid

Sintaxe: Mid(s As String, i As Integer [, n As Integer]) As String Copia n caracteres da string s a partir da posio inicial i. Se n no for indicado (o 3 argumento opcional), ser copiado tudo desde i at ao m da string.
o

Exemplos: Dim s1 As String , s2 as String s 1 = "ISEP C i v i l " s 2 = Mid ( s1 , 2 , 2 ) R e s u l t a d o : s2 = "EP" s 2 = Mid ( s1 , 6 , 10 ) R e s u l t a d o : s2 = " C i v i l " s 2 = Mid ( s1 , 6 ) R e s u l t a d o : s2 = " C i v i l " 10.1.5 InStr

Sintaxe: Instr([i as Integer, ] s1 As String, s2 As String) As Integer Procura um padro s2 dentro de uma string (s1) a partir da posio i. Se essa posio i no for denida (o 1o argumento opcional), a pesquisa comear no princpio da string. Se a pesquisa tiver sucesso, a funo devolver um valor numrico indicando a posio na string s1 em que o padro s2 comea. Caso no tenha sucesso, ser devolvido o valor zero. Exemplos: Dim s = n = n = n = s As String , n As Integer "ISEP C i v i l " Instr ( s , "" ) Resultado : n = 5 Instr ( 5 , s , "" ) Resultado : 0 InStr ( s , " C i v i l " ) Resultado : 6

IS E

P
84

10.1.6

UCase, LCase

Sintaxe: UCase(s As String) As String LCase(s As String) As String Retorna uma cpia da string original s, mas com letras convertidas para maisculas (UCase ) ou minsculas (LCase ). Obviamente os valores numricos e os caracteres de pontuao mantem-se inalterados. Exemplos: Dim s1 As String , s2 As String s 1 = " i109123X " s 2 = UCase ( s1 ) R e s u l t a d o : s2 = "I100Y" s 2 = LCase ( s1 ) R e s u l t a d o : s2 = " i 1 0 0 y "

10.2

Algoritmos

Nesta seco so discutidos mtodos que permitem dividir uma string nos caracteres que a constituem e dividir uma frase em palavras 32 . 10.2.1 Separao duma string em caracteres

1. Mtodo destrutivo da string original, usando um ciclo e as funes Left e Right Listagem 21 2. Mtodo no-destrutivo, usando um ciclo e a funo Mid - Listagem 22 na pgina seguinte Listing 21: Separao de string em caracteres - 1o Mtodo
1 2 3 4 5 6

Dim s As String , c As String Do While s <> "" c = Left ( s , 1 ) Processamento do c a r a c t e r que acabou de s e r i s o l a d o s = Right ( s , Len ( s ) 1 ) Loop

O mtodo baseia-se na repetio das instrues nas linhas 3 e 5 para cada elemento da string. A 1a instruo usa a funo Left para isolar o 1o caracter da string, copiando-o para a varivel c. Conforme analizado na Seco 10.1.3 na pgina 83 a 2a instruo vai armazenar a string s uma vez expurgada do 1o caracter. Ser essa string amputada que vai ser processada na prxima iterao do ciclo. Este terminar quando s contiver a string vazia. O contedo da string original car assim perdido.
32

Os exemplos desta Seco so adaptaes dos includos nos textos de apoio do prof. ngelo Martins.

IS E

P
85

Para decompor uma string nos caracteres que a compem, vamos apresentar dois mtodos diferentes:

Listing 22: Separao de string em caracteres - 2o Mtodo


1 2 3 4 5

Dim s t As String , c As String , v As Integer For v = 1 To Len ( s ) c = Mid ( s , v , 1 ) Processamento do c a r a c t e r que acabou de s e r i s o l a d o Next

Este 2o mtodo baseia-se na instruo da linha 3, que usa a funo Mid. Como descrito na Seco 10.1.4 na pgina 84, esta funo vai copiar um caracter (3o argumento) da string s a partir da posio especicada pelo contedo da varivel v. Esta varivel, que ao mesmo tempo a varivel de controle do ciclo For, vai conter, ao longo do seu funcionamento, todos os valores desde 1 at Len(s), ou seja, a posio do ltimo caracter da string. No h qualquer alterao do contedo da string original. 10.2.2 Diviso de uma frase em palavras

Para efeitos desta seco, considera-se uma palavra qualquer destes conjuntos: caracteres entre espaos, entre o incio da string e o primeiro espao, entre o ltimo espao e o m da string, ou ainda todos os caracteres da string, se esta no contiver espaos. Listing 23: Separao de frase em palavras
1 2 3 4 5 6 7 8 9 10 11 12 13 14

Dim s As String , p a l As String , p As Integer s = Trim ( s ) Do While s <> "" p = InStr ( s , "" ) I f p > 0 Then p a l = Left ( s , p 1 ) s = LTrim ( Right ( s , Len ( s ) p ) ) Else pal = s s = "" End I f Processamento da p a l a v r a c o n t i d a em p a l Loop

O algoritmo descrito na Listagem 23 usa um mtodo destrutivo, segundo o qual se procura sistematicamente o 1o espao contido na string (instruo 5). Sabendo ns que o incio da string e esse espao delimitam uma palavra, est achada a 1a palavra, que copiada para a varivel pal (instruo 7) e de seguida eliminada da string (instruo 8). Nesta ltima instruo vale a pena atentar no seguinte: 1. Len(s) - p o comprimento da string restante se lhe retirarmos a 1a palavra 2. Right(s, Len(s) - p) copia a parte da string s que vai do seu m at posio p, ou seja, tudo menos a palavra que foi j copiada para pal. 86

IS E

3. A funo LTrim limita-se a descartar o espao existente entre a 1a palavra e o resto da string. 4. A atribuio a s desta string truncada destroi a string original, preparando as condies para que na prxima iterao do ciclo seja destacada uma nova palavra. A utilizao da estrutura If..Then..Else permite detectar se existem ou no espaos na string, testando o contedo da varivel p. Se a funo InStr encontrar um espao (p > 0) porque (ainda) existe uma palavra na string. Se no encontrar (p = 0) porque a string constituda por uma s palavra. Nesse caso as instrues executadas sero as que se encontram entre Else e End If (linhas 10 e 11), a 1a copiando s para pal, a 2a atribuindo a s a string vazia, o que ter como consequncia a paragem do ciclo.

IS E
87

11

Notas nais

Alguns dos exemplos apresentados foram inspirados no livro de Paul McFreddies[1]. Foram ainda reutilizados e adaptados materiais contidos na Sebenta de Introduo Computao da minha autoria[2].

Referncias
[1] Paul McFredies. VBA for the Microsoft Oce System, QUE. [2] Antnio Silva. Sebenta de Introduo Computao - Visual Basic, ISEP.

IS E
88

Você também pode gostar