88
    I    S    E    P    I    S    E    P Programação em VBA Texto Introdutório versão 3 António Silva DEI-Isep 2009-12-30 1

Programming in VBA v3

Embed Size (px)

Citation preview

Programao em VBATexto Introdutrioverso 3

Antnio Silva DEI-Isep 2009-12-30

IS E1

P

.

IS E P

Contedo1 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

P

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

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

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

P

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

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

85 86 88

IS E5

P

Lista de Figuras1 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 E6

P

Lista de Tabelas1 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 E7

P

Listings1 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 E8

P

1

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.

2

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 E9

P

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 funes1

A tratar na Seco 2.6 na pgina 13.

IS E10

P

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

P11

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

P

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 seu2 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

P13

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 macro1 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

P14

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 E15

P

3

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 cercaNa 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

P16

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, um10

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

IS E

P17

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 as11

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

IS E18

P

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

P

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

P20

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

P21

4

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

P

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

P

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

P

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

P25

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 osIsto porque as diferentes classes de objectos no so necessariamente sensveis aos mesmos tipos de eventos.12

IS E26

P

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

P

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

P28

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 E29

P

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

P30

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

P31

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 apresentar16

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

IS E

4.3.4

Botes de Comando

P32

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)

P

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

P34

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 E35

P

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 E36

P

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

P

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 E38

P

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.

5

Estruturas de controlo do programa

Um macro um programa escrito na linguagem VBA. Vamos agora comear a analizar mais em detalhe a estrutura de um programa. Um programa composto por um conjunto de instrues, cada uma delas executando uma tarefa 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 E39

P

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

P

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 E41

P

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

P

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 imbricados1 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

P43

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 E44

P

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

P

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 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 Imbricados1 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

P53

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.

6

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 nomes19

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

P54

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

P55

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.

P

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 vector1 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

P

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 vector1 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 ca