texto introdutório - deiasilva/page14/page16/assets/program… · figura2: janeladegestãodemacros...

64
Programação em VBA Texto Introdutório António Silva DEI-Isep 2009-10-28 1

Upload: others

Post on 29-Sep-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Programação em VBATexto Introdutório

António SilvaDEI-Isep

2009-10-28

1

Page 2: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

.

Page 3: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Conteúdo1 Introdução 8

2 Conceitos Básicos 82.1 O que é um Macro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2 Técnicas de construção dum Macro . . . . . . . . . . . . . . . . . . . . . 92.3 Gravação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4 A escrita de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.5 O editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.6 Criação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 Variáveis e Tipos de Dados 143.1 Conceito de variável . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.2 Criação das variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.3 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4 A operação de Atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . 173.5 O uso de constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

4 Como trabalhar com Objectos 194.1 Propriedades, Métodos e Eventos . . . . . . . . . . . . . . . . . . . . . . 20

4.1.1 Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.1.2 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.1.3 Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

4.2 Os objectos do Excel mais comuns . . . . . . . . . . . . . . . . . . . . . . 234.2.1 Como trabalhar com as propriedades dos objectos Excel . . . . . 234.2.2 Como aplicar métodos aos objectos . . . . . . . . . . . . . . . . . 24

4.3 Objectos gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.3.1 MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.3.2 InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.3.3 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.3.4 Botões de Comando . . . . . . . . . . . . . . . . . . . . . . . . . 284.3.5 Rótulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.3.6 Caixas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.3.7 Botões de Opção . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.3.8 Caixas de Verificação . . . . . . . . . . . . . . . . . . . . . . . . . 314.3.9 Quadros (Frames) . . . . . . . . . . . . . . . . . . . . . . . . . . 314.3.10 Caixas de Listagem . . . . . . . . . . . . . . . . . . . . . . . . . . 32

5 Estruturas de controlo do programa 345.1 Estruturas de controlo condicional . . . . . . . . . . . . . . . . . . . . . . 34

5.1.1 If...Then...Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.1.2 If...Then . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.1.3 Estruturas condicionais embutidas . . . . . . . . . . . . . . . . . . 37

5.2 Estruturas de controlo repetitivo . . . . . . . . . . . . . . . . . . . . . . 385.2.1 Estruturas de Controlo Do...Loop . . . . . . . . . . . . . . . . . . 385.2.2 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . 40

3

Page 4: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

5.2.3 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . 415.2.4 Estrutura de Controlo For..To..Next . . . . . . . . . . . . . . . . . 435.2.5 Estruturas de controlo repetitivo imbricadas . . . . . . . . . . . . 44

5.3 Variáveis indexadas - vectores e matrizes . . . . . . . . . . . . . . . . . . 465.3.1 Declaração de vectores . . . . . . . . . . . . . . . . . . . . . . . . 475.3.2 Processamento de vectores . . . . . . . . . . . . . . . . . . . . . . 48

6 Funções e Procedimentos 506.1 Exemplo de função criada pelo programador . . . . . . . . . . . . . . . . 516.2 Como aceder às funções standard do Excel . . . . . . . . . . . . . . . . . 52

7 Programação do Excel usando VBA 527.1 Trabalhar com objectos Workbook . . . . . . . . . . . . . . . . . . . . . . 537.2 Trabalhar com objectos Worksheet . . . . . . . . . . . . . . . . . . . . . 53

7.2.1 Propriedades de Worksheet . . . . . . . . . . . . . . . . . . . . . . 537.2.2 Métodos de Worksheet . . . . . . . . . . . . . . . . . . . . . . . . 54

7.3 Trabalhar com objectos Range . . . . . . . . . . . . . . . . . . . . . . . . 54

8 Adicionando uma interface gráfica 568.1 Instalação da Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578.2 Instalação dos Controlos . . . . . . . . . . . . . . . . . . . . . . . . . . . 588.3 Incorporação da Form na sub-rotina . . . . . . . . . . . . . . . . . . . . . 58

8.3.1 Como visualizar e terminar uma Form . . . . . . . . . . . . . . . 598.3.2 Tratamento de eventos através de Event Handlers . . . . . . . . . 598.3.3 Como recolher os resultados de uma Form . . . . . . . . . . . . . 608.3.4 Exemplo de aplicação . . . . . . . . . . . . . . . . . . . . . . . . . 60

8.4 Exemplo de aplicação mais elaborado . . . . . . . . . . . . . . . . . . . . 62

9 Notas finais 63

4

Page 5: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Lista de Figuras1 Janela de invocação do ambiente de Gravação de Macros . . . . . . . . . 92 Janela de Gestão de Macros . . . . . . . . . . . . . . . . . . . . . . . . . 103 Barra de Ferramentas de VBA . . . . . . . . . . . . . . . . . . . . . . . . 104 Editor integrado do VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Criação de novo Módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Diferentes tipos de dados e o seu armazenamento em memória . . . . . . 157 Como forçar a declaração explícita automaticamente . . . . . . . . . . . 168 Uma Form e vários Controlos . . . . . . . . . . . . . . . . . . . . . . . . 199 Janela de Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2110 Lista de eventos disponíveis . . . . . . . . . . . . . . . . . . . . . . . . . 2211 Objectos e Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2312 Exemplo de MsgBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2513 Exemplo de InputBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2714 Vários optionButton agrupados numa frame . . . . . . . . . . . . . . . . 3015 Vários checkBox agrupadas numa frame . . . . . . . . . . . . . . . . . . 3116 Uma Frame agrupando três botões de comando . . . . . . . . . . . . . . 3117 Exemplo de listBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3218 Estrutura de controlo condicional If...Then...Else . . . . . . . . . . . . . 3419 Estrutura de controlo condicional If...Then . . . . . . . . . . . . . . . . 3520 Estruturas de controlo condicional imbricadas . . . . . . . . . . . . . . . 3721 Estrutura de controlo repetitivo Do...While . . . . . . . . . . . . . . . . 3922 Estrutura de controlo repetitivo Do...Until . . . . . . . . . . . . . . . . 4023 Ciclos controlados por contador . . . . . . . . . . . . . . . . . . . . . . . 4124 Ciclos controlados por sentinela . . . . . . . . . . . . . . . . . . . . . . . 4225 Exemplo de Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . . . . 4526 Um vector é uma variável múltipla . . . . . . . . . . . . . . . . . . . . . 4627 Um exemplo de vector de strings . . . . . . . . . . . . . . . . . . . . . . 4728 Porquê usar ciclos para processar vectores? . . . . . . . . . . . . . . . . . 4829 Funções como caixas pretas . . . . . . . . . . . . . . . . . . . . . . . . . 5130 Utilização da função margemLucro numa fórmula . . . . . . . . . . . . . 5231 Criação de uma Form no VBA . . . . . . . . . . . . . . . . . . . . . . . 5732 A UserForm para Entrada Múltipla de Dados . . . . . . . . . . . . . . . 6133 Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . . . . . . . . 62

5

Page 6: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Lista de Tabelas1 Tipos de dados suportados pelo VBA . . . . . . . . . . . . . . . . . . . . 172 Propriedades mais comuns dos objectos gráficos VBA . . . . . . . . . . . 203 Valores de configuração das características de uma Caixa de Mensagem . 264 Valores devolvidos por uma Caixa de Mensagem . . . . . . . . . . . . . . 27

6

Page 7: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Listings1 VerificaValor - exemplo de função definida pelo utilizador . . . . . . . . . 122 verificaGama - exemplo de função definida pelo utilizador . . . . . . . . . 133 Exemplo de aplicação de If..Then..Else imbricados . . . . . . . . . . . . 384 FormataBordo - exemplo de sub-rotina usando For..Next . . . . . . . . . 445 Exemplo usando Ciclos Imbricados . . . . . . . . . . . . . . . . . . . . . 456 Exemplo de processamento de um vector . . . . . . . . . . . . . . . . . . 497 Outro exemplo de processamento de um vector . . . . . . . . . . . . . . . 498 Função margemLucro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 Sub-rotina InsereLinhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 5610 Handler do objecto cmdFechar para o evento click . . . . . . . . . . . . 5911 Exemplo de sub-rotina de invocação de uma UserForm . . . . . . . . . . 6012 Exemplo de sub-rotina de inicialização de uma UserForm . . . . . . . . . 6113 Handler do objecto cmdFechar para o evento Click . . . . . . . . . . . . 6114 Sub-rotina de inicialização da UserForm . . . . . . . . . . . . . . . . . . 6215 Handler associado ao objecto Tabstrip1 para o evento Change . . . . . . 63

7

Page 8: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

1 IntroduçãoEste texto tem como objectivo apoiar o ensino das técnicas de programação de compu-tadores, utilizando, como ambiente de aplicação, programas como o gestor de folhas decálculo Excel.

Destina-se assim aos alunos que já possuem alguns conhecimentos da utilização efuncionamento desta aplicação. Concretamente, presume-se que estão já familiarizadoscom os conceitos de folha de cálculo, de livro de trabalho, de fórmulas e funções standard.

A linguagem de programação que vai ser utilizada será o VBA (Visual Basic forApplications). É uma linguagem que permite acrescentar capacidades adicionais a certotipo de aplicações informáticas, concretamente as pertencentes ao Microsoft Office, entreas quais o Excel e o Word. Permite ainda automatizar a realização de muitas tarefasrotineiras nessas aplicações.

Como o próprio nome indica, trata-se duma adaptação da linguagem genérica deprogramação Visual Basic de modo a poder ser utilizada no ambiente específico dasaplicações Office.

2 Conceitos BásicosO VBA constitui uma ferramenta poderosa nas mãos de programadores experimentadosmas pode, ao mesmo tempo, ser muito útil a qualquer utilizador, mesmo inexperiente.

De facto, no dia a dia da utilização destas aplicações, defrontamo-nos com a neces-sidade de repetir a mesma tarefa várias vezes ao dia ou, de em certas ocasiões, ter querepetir uma determinada tarefa uma série de vezes de seguida. Seja escrever ou formatarum certo texto, seja executar uma série de comandos ou escolher opções de menus, sejaainda realizar a formatação complexa de um documento, são inúmeras as ocasiões emque dava jeito poder automatizar essas tarefas repetitivas.

É aqui que entra o VBA, permitindo a construção daquilo que se designa vulgarmentepor macros.

2.1 O que é um Macro?

Um macro contem uma lista das instruções a realizar para executar uma determinadatarefa. No fundo, é um programa escrito em VBA, que indica a uma aplicação como oExcel quais os passos a dar para atingir um objectivo específico. Pode-se dizer que ummacro não é mais que uma descrição formalizada das tarefas que se pretende automatizar.

Os macros incluem instruções que interagem com elementos da aplicação. Por exem-plo, quando, numa aplicação Office se pretende fechar uma janela, pode-se seleccionar aopção de menu Close. Um macro escrito em VBA, usará a seguinte instrução para obtero mesmo efeito:

ActiveWindow.Close

Existem duas formas alternativas de criar um macro mas a forma como ele é criadonão muda o seu conteúdo, continuando a ser um contentor de uma lista de instruções arealizar pela aplicação em que está instalado.

8

Page 9: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

2.2 Técnicas de construção dum Macro

Se bem que um macro seja um programa em VBA, nem sempre é necessário escrevê-lo deforma explícita, ou seja, escrevendo especificamente as instruções VBA que o compõem.Sobretudo quando os macros são simples, é muitas vezes mais prático criá-los de formaautomática, gravando a sequência de passos que ele deverá executar na aplicação.

Esta forma de criar um macro corresponde a mostrar ao computador o que fazerpara conseguir obter o resultado pretendido. O utilizador indica ao programa que sevai entrar num modo de gravação do macro e inicia a execução da sequência de acçõesque normalmente teria que executar. Quando chega ao fim dessa sequência, indica aoprograma que a gravação terminou. Após ter atribuído a essa sequência uma combinaçãode teclas especial, esse macro estará pronto a ser executado, substituindo assim o conjuntode acções que anteriormente seriam necessárias. Tudo se passa como se estivéssemos aensinar a aplicação pelo exemplo.

Se se investigar, no entanto, o conteúdo desse macro, verificar-se-á que ele é compostoprecisamente por instruções escritas em VBA, sendo que a cada acção ou comando daaplicação corresponderá uma instrução (ou conjunto de instruções) específica do macro.A forma alternativa de construir um macro será assim introduzir essas instruções numeditor de texto apropriado. É essa, de facto, a forma de criar um macro quando o seuâmbito é algo não trivial.

2.3 Gravação de um Macro

Quando uma dada operação envolvendo uma série de acções deva ser utilizada frequen-temente faz sentido tentar automatizar a sua execução.

Para gravar um macro que seja capaz de efectuar essas acções, haverá que invocar omodo de gravação de macros, mediante o Menu "Tools/Macros/Record a New Macro"(em Excel), o que fará aparecer a janela descrita da Figura 1. Nela se pode especificar onome do macro, a localização em que será armazenado, uma descrição das suas funçõese ainda a combinação de teclas (Shortcut key) que será utilizada para arrancar com omacro, uma vez este construído.

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

9

Page 10: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 2: Janela de Gestão de Macros

Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlaro processo de gravação e dever-se-á dar início à execução das acções que o macro vaisubstituir. Quando se tiver executado a última acção a incluir no macro, basta dar aindicação de que a gravação terminou.

Uma vez tal realizado, esse macro passará a estar disponível mediante a invocaçãoda combinação de teclas especificada anteriormente (no caso da Figura 1 na página pre-cedente, seria Ctrl+Shft+M) e realizará, de forma automática, exactamente a mesmasequência de acções que tínhamos realizado manualmente.

Em alternativa, mediante a combinação de teclas ALT-F8, pode ser accionada a janelade Gestão de Macros (Figura 2), onde, entre outras acções, pode ser escolhido o macro aser executado.

Para facilitar o acesso às facilidades de gravação e edição de macros, será convenientetornar visível de forma permanente a barra de ferramentas de Visual Basic (Figura 3).No Excel, isto poderá fazer-se mediante a opção de Menu "View/Toolbars/Visual Basic".

Figura 3: Barra de Ferramentas de VBA

2.4 A escrita de um Macro

Ensinar pelo exemplo ao Excel como fazer as coisas é um método expedito de construirum macro, mas tem as suas limitações. Já que um macro não é mais que um programa

10

Page 11: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

escrito em VBA, porque não tratá-lo como tal e aceder ao seu código, alterando-o deforma a melhorar a sua eficiência ou a corrigir problemas. E já agora, porque não criá-losde 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 integradono próprio Excel, basta utilizar o icone adequado na barra de ferramentas ou usar direc-tamente a combinação de teclas ALT-F11. Tornando a premir esta combinação de teclas,voltaremos à nossa folha de cálculo. A este editor especializado é também dado o nome deIntegrated Development Environment (IDE) ou Ambiente de Desenvolvimento Integradoe é semelhante à aplicação autónoma usada para o desenvolvimento de programas emVisual 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 conteúdo do projectoVBA actual. Um projecto em VBA inclui um ficheiro duma aplicação Office (como, porexemplo, uma folha de cálculo do Excel) e todos os ficheiros VBA associados, incluindoos próprios macros e eventuais user forms (janelas de interface próprias utilizadas pelos

11

Page 12: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

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

macros1).Para poder começar a escrever macros usando o VBA é necessário criar um módulo

que o possa albergar, o que é conseguido usando a opção de menu "Insert/Module".Como consequência, para além do novo módulo aparecer referido na janela do Explora-dor de Projectos, será criada uma janela nova onde será possível escrever o código queconstitui o novo macro. Se já existir algum módulo criado, bastará seleccionar o módulopretendido no explorador de projectos, posicionar o cursor na janela correspondente aesse módulo, numa área fora de qualquer macro já existente, e seleccionar a opção demenu "Insert/Procedure". Aparecerá uma janela própria (Figura 5) onde será possíveldar o nome ao novo procedimento (o conjunto de instruções que constituirá o macro),especificar o tipo de macro que vai ser construído (função ou procedimento2) e qual oâmbito da sua utilização (privada ou pública, ou seja, limitada ou não ao ficheiro actual).

2.6 Criação de um Macro

Está na hora de construir o primeiro macro em VBA. Suponhamos que se pretende criarum macro que verifique se o valor presente numa determinada célula é superior a umdado limite e que, caso seja, disso notifique o utilizador. A sub-rotina em que esse macrodeverá assentar poderá ter o seguinte conteúdo:

Listing 1: VerificaValor - exemplo de função definida pelo utilizador

1 Public Sub v e r i f i c aVa l o r ( )2 I f Ce l l s (2 , 2) > 100 Then3 MsgBox "Valor ␣maximo␣ excedido ! "4 End I f5 End Sub

1Sobre o assunto, ver Secção 8.2A distinção entre funções e procedimentos (ou sub-rotinas) será abordada mais à frente.

12

Page 13: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Não nos vamos de momento preocupar com os detalhes do código que constitui omacro. Basta verificar que, em 1o lugar, é constituído por uma linha de cabeçalho queespecifica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seunome (verificaValor). O corpo do macro é composto pela estrutura de controle condici-onal (If...Then3) que vai verificar se o conteúdo da célula B24 é ou não maior que o valor200. Caso essa condição seja verdadeira, o macro apresentará uma mensagem no ecrandizendo que o valor máximo foi excedido. Finalmente, o macro é terminado com umalinha contendo "End Sub".

O que este simples macro faz, portanto, é verificar o conteúdo de uma célula específicada folha de cálculo e avisar o utilizador caso o valor nela contido ultrapassar um valorpré-determinado. Sempre que for necessário fazer esta verificação, bastará invocar acombinação de teclas que tenha sido associada a este macro.

É verdade que sta verificação poderia ter sido realizada colocando numa célula umafórmula contendo a função standard do Excel IF. Mas suponhamos agora que se pretendealgo mais complicado, por exemplo, fazer essa verificação num conjunto de células eapenas desencadear o alarme caso mais do que duas dessas células ultrapassem o limiteestabelecido. A sub-rotina modificada poderia ser algo como:

Listing 2: verificaGama - exemplo de função definida pelo utilizador

1 Public Sub ver i f icaGama ( )2 Dim i As Integer , c As Integer3 c = 04 For i = 1 To 55 I f Ce l l s ( i , 3) > 100 Then6 c = c + 17 End I f8 Next9 I f c > 2 Then

10 MsgBox c & "␣ va l o r e s ␣ s up e r i o r e s ␣ao␣ l im i t e ! "11 End I f12 End Sub

A verificação é agora repetida em todas as células de C1 a C5 graças aos serviçosda estrutura de controlo repetitivo For...To...Next5 que executará 5 vezes as instruçõescontidas nas linhas 5 a 7. Para além de verificar o conteúdo da célula em análise, é aindaactualizado um contador, baseado na variável c (ver linha 6), sempre que o valor contidonessa célula ultrapasse o limite. Só quando o valor desse contador for maior que 2 serágerada a mensagem de alarme.

Estaremos já em posição de perceber a utilidade de construir os macros usando di-rectamente o VBA. Não seria trivial resolver este problema usando apenas fórmulas ecertamente impossível executando comandos e seleccionando menus do Excel.

A um macro criado usando directamente o VBA pode também ser associada umacombinação de teclas que facilite o seu acesso. Isso pode ser feito através do botão

3Ver Secção 5.1.2 na página 35.4Cells(2,2) refere-se à célula B2 (2a coluna, 2a linha)5Ver Secção 5.2.4 na página 43.

13

Page 14: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Options na Janela de Gestão de Macros, invocada mediante ALT-F8.

3 Variáveis e Tipos de DadosA informação processada por um macro pode ser de diferente natureza e existir em di-ferentes formatos. Genericamente um programa pode utilizar, entre outras, informaçãonumérica e informação chamada alfa-numérica, ou seja texto. A linguagem VBA conse-gue lidar com informação de diversos tipos, que detalharemos adiante na Secção 3.3 napágina 16.

3.1 Conceito de variável

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

1. Deve obrigatoriamente começar por uma letra;

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

3. Não pode exceder 255 caracteres;

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

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

3.2 Criação das variáveis

Ao acto de criação de variáveis chama-se declaração. Criar uma variável envolve dar-lheum nome e reservar em memória o espaço necessário para que ela possa guardar o tipo dedados para o qual está a ser criada. O acto de declarar a variável informa o VBA àcercado nome pelo qual ela será conhecida assim como qual o tipo de dados que ela deveráestar preparada para receber.

Como é óbvio, nenhuma variável pode ser utilizada antes de ser criada. A declaraçãodeve, pois, preceder a sua utilização. Desde que se siga esta regra, é possível inserirdeclarações em qualquer ponto do macro. No entanto, é boa prática agrupar todas as

6Para armazenar números que podem variar entre -32768 e 32767, ou seja 65536 valores diferentes, hánecessidade de dispor de 16 unidades básicas de informação (bits), ou seja dois bytes (1 byte = 8 bits).De facto, se cada bit apenas pode representar um valor binário (0 ou 1), 16 bits poderão representar até216 = 65536 valores diferentes.

14

Page 15: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

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

declarações necessárias num bloco a colocar no início, para mais fácil manutenção doprograma.

Em VBA, existem duas formas de declaração de variáveis: explícita e implícita. Adeclaração explícita exige a utilização da instrução específica

Dim ... As (Dimensionar ... Como).

Por exemplo, a instrução

Dim Preço As Integer

cria (declara) uma variável com o nome Preço e do tipo Integer, ou seja, dimensio-nada para receber dados do tipo integer (inteiro simples7).

A declaração implícita resume-se a utilizar pela primeira vez uma variável sem qual-quer declaração explícita prévia, dando-lhe um nome e atribuindo-lhe um valor. O VBAcriará automaticamente a variável do tipo pretendido.

Esta segunda forma de declarar variáveis tem, a despeito da sua simplicidade, umproblema grave: é possível, por distracção, criar uma variável nova indesejada, quando oque se pretendia era apenas escrever o nome de uma variável já existente. Suponha, porexemplo, que havia criado uma variável "Distancia" mediante a instrução8:

7A discussão dos vários tipos de dados suportados pelo VBA será feita na Secção 3.3 na próximapágina.

8Como se verá na secção 3.4 na página 17, esta instrução guarda na variável "Distancia"o valor 1260

15

Page 16: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Distancia=1260

Como é a primeira vez que o VBA encontra esta palavra ("Distancia"), partirá doprincípio que se trata de uma variável ainda por declarar e tratará de a criar, substituindo-se ao programador. Dar-lhe-á o nome "Distancia" e dimensiona-la-á de forma a poderguardar inteiros simples, já que é essa a utilização sugerida na instrução.

Agora suponha que adiante no programa, por engano, escrevia "Distncia" ao referir-seà variável em causa. O VBA não emitirá nenhum alerta, já que aceitou tranquilamente"Distncia" como uma nova variável. A forma mais prudente de lidar com declarações devariáveis é, pois, utilizar apenas declarações explícitas, e instruir o VBA para não aceitardeclarações implícitas, gerando uma mensagem de erro apropriada. Para tal, deverá seracrescentada a instrução Option Explicit no início do módulo contendo o macro.

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

Se se pretender que seja esse o comportamento automático do VBA em todos os mó-dulos, deverá seleccionar-se no Editor do VBA a opção "Require Variable Declaration"nosub-menu Options do menu Tools.

3.3 Tipos de Dados

Como já vimos, um macro deverá poder lidar com diferentes tipos de dados. A lingua-gem VBA suporta, entre outros, o tratamento dos seguintes tipos de dados descritos naTabela 1 na próxima página

Quando declaramos variáveis dever-se-á, em princípio, especificar qual o tipo de dadosque ela irá suportar. No entanto, em VBA é possível omitir a especificação do tipo dedados na declaração de variáveis. O VBA criará uma variável do tipo Variant capaz dearmazenar qualquer tipo de dados. O que, à partida, parece uma boa ideia acaba pornão o ser porque, entre outros motivos, implica um gasto excessivo de memória e tornaa execução dos macros mais lenta. Será, portanto, de evitar, na medida do possível.

16

Page 17: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Tipo DescriçãoInteger Inteiro simples, usado para representar inteiros entre -32768 e 32767Long Inteiro longo, ou seja, compreendido entre -2.147.483.648 e

2.147.483.647Single Real representado com precisão simples, com valores negativos compre-

endidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cercade 1,4E-45 e 3,4E38

Double Real representado com precisão dupla, usado para representar númerosreais muito maiores ou muito mais pequenos que com o tipo single

String Usado para representar texto (informação alfanumérica como letras,algarismos e símbolos especiais); strings são representadas entre aspas

Boolean Usado para representar valores lógicos (True ou False)Date Usado para representar datas ou valores de tempo; são representados

entre caracteres #Object Serve para guardar referências a objectos

Tabela 1: Tipos de dados suportados pelo VBA

3.4 A operação de Atribuição

A operação de Atribuição permite guardar um dado numa variável, ou seja, atribuir-lheum valor. A sintaxe utilizada por esta operação é a seguinte:

Variável = Valor

O resultado da operação será, portanto, o de guardar Valor em Variável. Valorpode ser um valor constante ou o conteúdo de outra variável. Neste caso, a atribuiçãoconsistirá na cópia do conteúdo de uma variável para outra do mesmo tipo. A instruçãoseguinte copia o valor contido na variável idade para a variável temp (partimos doprincípio que ambas são do tipo integer):

temp = idade

Pode ainda ser atribuído a um variável o resultado de uma expressão ou o valordevolvido por uma função. Atente-se nos seguintes exemplos:

total = peso1 + peso2resultado = sqrt(2+peso)

No 1o exemplo, o VBA resolverá em primeiro lugar a expressão à direita do operadorde atribuição (=), somando os conteúdos das variáveis peso1 e peso2, após o que copiaráesse resultado para a variável total.

No 2o exemplo, a expressão à direita é composta por uma função standard do VBA(sqrt()). Esta função calcula a raiz quadrada do valor ou expressão que se encontrardentro dos seus parêntesis. Assim sendo, o VBA calculará em 1o lugar o resultado daexpressão 2 + peso, fornecerá esse valor à função sqrt(), após o que copiará o valorfornecido por essa função para a variável resultado.

É importante que se perceba que a operação de atribuição é uma operação destrutiva.Se a variável contiver já um valor, uma operação subsequente de atribuição sobre essa

17

Page 18: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

variável, substituirá o valor nela contido pelo novo valor. Convem, assim, lembrar quenesta operação o fluxo da informação se faz sempre da direita para a esquerda e não ocontrário.

Há ainda que ter em atenção o facto de que não é normalmente aconselhável atribuirum valor de um dado tipo a uma variável de tipo diferente. Os resultados podem ser aperda de informação ou o mau funcionamento do programa. O VBA poderá gerar umamensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentosanómalos difíceis de detectar e corrigir.

3.5 O uso de constantes

Uma constante consiste num nome que é dado a um valor numérico ou a uma cadeia decaracteres, e que pode ser usado dentro do programa na vez desses valores. Funcionacomo uma espécie de sinónimo. A utilização de constantes em substituição dos valoresque representa justifica-se pelo seguinte facto: se um dado valor constante fôr utilizadomuitas vezes ao longo dum programa, caso ocorra a necessidade de o modificar, seremosforçados a corrigir manualmente todas as ocorrências desse valor, correndo, além disso, orisco de nos enganarmos. Se, ao invés, for definida uma constante com esse valor, bastarámodificar essa definição inicial para que tal mudança automaticamente se repercuta emtodas as ocorrências dessa constante no decurso do programa. A sintaxe da definição deconstantes é a seguinte:

Const Nome As tipo = expressão

Por expressão entende-se um valor numérico, uma cadeia de caracteres, ou uma ex-pressão cujo resultado seja um destes tipos de valores.

Caso, por exemplo, seja necessário usar ao longo de um macro um mesmo factor emvários cálculos, faz sentido definir esse factor como constante e usar o seu nome em vezdele:

Const Factor as Single = 1.347

Sempre que seja subsequentemente necessário utilizar este factor numa expressão,usar-se-á Factor em vez de 1.347.

18

Page 19: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

4 Como trabalhar com ObjectosPara que uma macro possa manipular o ambiente da aplicação, seja modificando a forma-tação de um documento, modificando opções da aplicação ou introduzindo dados numagama de células, vai ser preciso interagir com Objectos. Genericamente, pode dizer-se queum objecto é algo que pode ser visto, tocado, sentido. Em VBA, considera-se um objectotudo aquilo que pode ser visto e que pode ser manipulado de alguma forma.

Quer o documento, quer uma célula ou gama de células, quer a própria aplicaçãosão considerados, para os efeitos de programação em VBA, como sendo objectos. Maspodem ainda existir outros objectos, nomeadamente aqueles que permitem construir umainterface gráfica específica do macro. A esses objectos gráficos chamamos controlos e sãocolocados em janelas especiais chamadas forms.

Na Figura 8 podem ser observados vários objectos instalados numa form: uma caixade texto, dois botões de comando, vários rótulos ou etiquetas e uma caixa de verificação.Através deles é possível o macro interagir com o utilizador. Veremos em detalhe mais àfrente para que servem e como utilizar estes diferentes objectos.

Figura 8: Uma Form e vários Controlos

Os objectos podem ser manipulados de várias formas:

• podemos mudar as suas propriedades, que traduzem características próprias dosobjectos;

• podemos aplicar um método a um objecto, ou seja, executar uma acção sobre ele;

• podemos especificar uma sub-rotina que será executada sempre que um determinadoevento ocorra nesse objecto.

Vamos agora utilizar a analogia para introduzir estes conceitos. Consideremos umautomóvel:

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

19

Page 20: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

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

• Os seus "eventos" são ocorrências que provocarão respostas automáticas por partedo automóvel, como seja, um alarme que dispara (resposta) caso desliguemos ocarro com as luzes ligadas (evento).

4.1 Propriedades, Métodos e Eventos

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

4.1.1 Propriedades

As propriedades de um objecto são as suas características físicas. Como na vida real, cadaobjecto possui características próprias ou propriedades, que podem ser quantificadas ouespecificadas, como sejam as suas dimensões ou o tipo de letra que usa. A cada objectoestá associada uma lista de propriedades a que é possível atribuir valores, determinandoa sua aparência, localização e outros detalhes. Pode-se então dizer que as propriedadesde um objecto definem a forma como ele se apresenta ou se comporta.

Diversos objectos podem partilhar a mesma propriedade. Essa propriedade, no en-tanto, pode afectar esses objectos de forma diferente.

Caption Define o texto a afixar na barra de título das forms, da legenda(“caption”) dos botões de comando, ou nos rótulos (“label”)

Name Define o nome pelo qual o objecto é identificadoLeft Define o afastamento entre uma “form” e o limite esquerdo do ecrã

ou entre um controlo e o limite esquerdo da formTop Define o afastamento entre uma “form” e o topo do ecrã ou entre um

controlo e o topo da “form”Height Define a altura do objectoWidth Define a largura do objectoFont Especifica qual o tipo de letra a usar nos controlosVisible Permite controlar o aparecimento de um dado objecto

Tabela 2: Propriedades mais comuns dos objectos gráficos VBA

Já vimos que quer os elementos do Excel como folhas de cálculo ou próprio docu-mento, quer elementos constituintes de interfaces gráficas que os macros possam utilizar,são considerados objectos. Na Tabela 2 são descritas algumas das propriedades maisimportantes e que são comuns à maior parte dos objectos gráficos.

Os valores que as propriedades de um dado objecto tomam podem ser consultados oumodificados usando a janela de propriedades (Figura 9 na página seguinte). Nessa janelaaparece a lista de propriedades do objecto que estiver nesse momento seleccionado . Nelapode observar, entre outras, algumas das propriedades referidas na lista acima (Caption,Height e Font) e os respectivos valores no momento.

20

Page 21: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 9: Janela de Propriedades

4.1.2 Métodos

Os métodos traduzem acções que um macro pode realizar sobre os objectos. Por exem-plo, aplicar o método Save ao objecto ActiveDocument implica desencadear o processode salvaguardar o conteúdo do documento activo num determinado ficheiro. Aplicar ométodo Clear a um objecto da classe ListBox terá como consequência a eliminação detodas as linhas nele contidas. A cada classe de objectos é possível aplicar um determinadoconjunto de métodos.

Para vermos como um método é aplicado a um objecto, vamos considerar o objectoWorksheet, que representa uma folha de cálculo do Excel. Se pretendermos que o nossomacro mova essa folha para uma nova posição dentro do Livro de Trabalho (Workbook),ele deverá aplicar o método Move a esse objecto, usando a seguinte sintaxe:

Worksheet.Move([Before][, After])

Exemplificando, se quisermos que o macro desloque a folha de cálculo "Dados 2009"paraa posição imediatamente a seguir à folha "Dados 2008", o comando a inserir no macroserá:

Worksheets("Dados 2009").Move Before:=Worksheets("Dados 2008")

Como veremos mais à frente, o objecto Worksheet é definido como um elemento doconjunto de folhas de cálculo contidas no Livro de Trabalho. Este conjunto de folhas érepresentado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se à folhade cálculo com o nome "Dados 2009".

4.1.3 Eventos

Os eventos são acções que, uma vez exercidas sobre um objecto, implicam a possibilidadede ocorrer uma resposta automática por parte dele. Basicamente, um evento é algo queacontece a um objecto. Por exemplo, a abertura de uma folha de um livro de trabalho(workbook) em Excel é um evento. A inserção de uma nova folha no livro de trabalho é

21

Page 22: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

outro exemplo de evento.Para que um objecto possa reagir a um dado evento deverá existir, previamente pro-

gramado, um procedimento especial, chamado event handler, que vai especificar o quefazer caso esse evento ocorra. Sem isso, o objecto detectará esse acontecimento mas nãosaberá o que fazer. Nenhuma resposta será produzida.

Figura 10: Lista de eventos disponíveis

Na Figura 10 pode ver-se a janela de escrita de código de macros. Na parte de cima,à direita, pode ser acedida a lista de eventos disponíveis para o objecto Worksheet9.Seleccionando um dos eventos, será possível construir o procedimento event handler quepermita ao objecto Worksheet reagir a esse evento. O cabeçalho e o delimitador final sãocriados automaticamente pelo editor do VBA, sendo da responsabilidade do programadora inclusão das instruções necessárias. Na figura são referidos vários eventos que podemocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folhade cálculo se torna activa, ou o Change que é desencadeado por qualquer alteração aoseu conteúdo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estarpreparada para reagir a diferentes eventos, desde que possua event handlers específicospara esses eventos.

Para tentar esclarecer melhor o conceito de evento e a questão de como organizara resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenasobjectos gráficos dispostos numa form. Repare-se na Figura 11 na página seguinte: o quese pretende aqui é um macro capaz de verificar se um dado número inteiro, introduzidopelo utilizador usando a interface descrita na figura, é ou não um número primo. Parte-se do princípio que todos sabem o que é um número primo e não nos vamos agoradebruçar sobre os detalhes do código que o event handler deverá conter para produzir oefeito desejado. Preocupemo-nos, de momento, apenas com as interacções entre as váriasentidades que intervêm no processo.

Como é visível na Figura 11 na próxima página, existem vários objectos (chamadoscontrolos) na interface. Entre eles, têm particular interesse para esta discussão a caixa detexto txt1, o rótulo lbl2 e o botão de comando command1. Quando o utilizador pretendeutilizar o macro, uma vez este invocado, deverá introduzir o número a testar em txt1 epressionar ("clicar") o botão command1. Quando isso acontece, diz-se que ocorreu umevento click no botão command1. Se esse botão não dispuser de nenhum event handlerpara lidar com esse tipo de evento, nada se passará. No entanto, se se tiver previamente

9Isto porque as diferentes classes de objectos não são necessariamente sensíveis aos mesmos tipos deeventos.

22

Page 23: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 11: Objectos e Eventos

associado a esse objecto (command1 ) um event handler adequado, o objecto será já capazde responder ao evento e produzir o resultado desejado. Neste caso, esse resultado deveráser efectuar os cálculos necessários para concluir se o número introduzido é ou não primoe apresentar essa conclusão no rótulo lbl2.

4.2 Os objectos do Excel mais comuns

Já vimos que um documento Word ou Excel é, em si mesmo, um objecto. Se bem que nãolhe possamos tocar, podemos claramente vê-lo e interagir com ele de múltiplas formas, sejaalterando o conteúdo de células (no caso do Excel), seja mudando formatos ou inserindolinhas e colunas. Por sua vez, todos estes elementos são, eles também, objectos. Nasaplicações Office, os objectos estão organizados de forma hierárquica. O objecto maisgeral é o Application, e dentro dele existem múltiplos objectos de nível progressivamenteinferior.

4.2.1 Como trabalhar com as propriedades dos objectos Excel

Como já vimos, os objectos possuem características próprias, chamadas propriedades. Asintaxe genérica para nos referirmos a uma propriedade de um objecto é a seguinte:

23

Page 24: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Objecto.Propriedade

Se nos quisermos referir, por exemplo, à propriedade ActiveWindow do objecto Ap-plication, procederemos do seguinte modo:

Application.ActiveWindow

A propriedade ActiveWindow refere-se à janela da aplicação com que estamos, demomento, a trabalhar. No caso do Excel, podemos ainda referirmo-nos, por exemplo, àpropriedade ActiveSheet para designar a folha de cálculo em que se está a trabalhar ou aActiveCell para nos referirmos à célula actualmente seleccionada.

Se pretendermos, por exemplo, especificar o tipo de letra da célula activa, usaremosa seguinte descrição de objecto:

Application.ActiveWindow.ActiveCell.Font.Name

Na prática, quando nos estamos a referir a uma propriedade da janela activa daaplicação como seja a ActiveCell, não precisamos de referir que pertence à ActiveWindowe à Application. Podemos omitir esses detalhes e apenas escrever:

ActiveCell.Font.Name

Se quisermos utilizar esta propriedade para mudar o tipo de letra da célula activa,utilizaremos então uma instrução como a seguinte10:

ActiveCell.Font.Name = "Helvetica"

Se, ao contrário, quisermos obter o valor de uma dada propriedade, a instrução a usarserá do tipo:

variavel = Objecto.Propriedade

Para obtermos, por exemplo, o conteúdo da célula activa da folha de cálculo, a ins-trução correcta seria:

conteudo = ActiveCell.Value

Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa proprie-dade encontra-se armazenado o conteúdo da célula.

4.2.2 Como aplicar métodos aos objectos

Vimos na Secção 4.1.2 na página 21, que os métodos de uma classe de objectos descrevemas acções que podemos executar sobre eles ou, por outras palavras, aquilo que podemosfazer com eles. A sintaxe usada para aplicar um método a um objecto é similar à usadapara trabalhar com as suas prorpiedades:

Objecto.Método

Um exemplo da aplicação de um método a um objecto, usando esta sintaxe, é oseguinte:

10Trata-se de uma operação de atribuição, descrita na Secção 3.4 na página 17

24

Page 25: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Worksheets("Leituras").Activate

Estamos aqui a aplicar o método Activate ao objecto Worksheets("Leituras"), oque tem como consequência que essa folha de cálculo se tornará activa.

No entanto, muitas vezes, os métodos exigem informação adicional para poderemexecutar o seu trabalho. Essa informação adicional será fornecida através de argumentos,inseridos a seguir ao nome do método aplicado:

Objecto.Método (argumento1, argumento2. ...)

O seguinte exemplo abre um Livro de Trabalho pré-existente com o nome "Dados.xls":

Workbooks.Open("Dados.xls")

Muitas vezes, os argumentos que se podem fornecer a um método são opcionais. Porexemplo, a instrução abaixo adiciona (insere) uma nova folha de cálculo imediatamenteantes 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 dafolha de cálculo activa. É esse o comportamento por defeito do método Add.

4.3 Objectos gráficos

Vão agora ser apresentados de forma mais sistemática alguns dos objectos e facilidadesnecessários para realizar interfaces gráficas simples. Essas interfaces vão permitir queos macros tenham uma interacção directa com o utilizador, requerendo e fornecendoinformação.

A forma mais simples de o macro interagir com o utilizador é através de duas funções:MsgBox e InputBox.

4.3.1 MsgBox

A função MsgBox permite apresentar no ecran uma Caixa de Mensagem (Msg Box ).Trata-se de uma pequena janela contendo um mensagem, pelo menos um botão de co-mando e eventualmente um pequeno desenho (ícone) ilustrativo do tipo de mensagem.Na Figura 12 encontra-se um exemplo de uma destas janelas.

Figura 12: Exemplo de MsgBox

25

Page 26: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Uma Caixa de Mensagem destina-se a apresentar ao utilizador uma mensagem cominformação relevante, sejam avisos, resultados, perguntas ou sugestões. Uma janela destetipo tem um comportamento peculiar: enquanto não for premido um botão, não serápossível qualquer outra interacção com o computador, já que essa janela tomou o controlo.O utilizador é assim obrigado a atender à mensagem apresentada.

A sintaxe da função MsgBox é a seguinte:

MsgBox(Mensagem, Características, Título)

Em que os argumentos são:

Mensagem Texto a apresentar (máximo de 1024 caracteres)Características Valor numérico que especifica o número de botões, o tipo do

ícone e o botão de defeito (com o “focus”), obtido pela somade três valores parciais.

Título Conteúdo da barra de título da janela (opcional)

O 2o argumento será calculado usando os valores da Tabela 3:

Botões de Comando Ícone Botão com o “focus”0 - OK 0 - Nenhum 0 - 1o Botão1 - OK, Cancel 16 - Mensagem Crítica 256 - 2o Botão2 - Abort, Retry, Ignore 32 - Mensagem de Aviso 1 512 - 3a Botão3 - Yes, No, Cancel 48 - Mensagem de Aviso 24 - Yes, No 64 - Mensagem de Informação5 - Retry, Cancel

Tabela 3: Valores de configuração das características de uma Caixa de Mensagem

Assim, para obter a MsBox da Figura 12 na página anterior o valor a utilizar parao parâmetro características seria obtido somando 3 valores, um de cada coluna daTabela 3, cada um deles especificando uma das características (Botões de Comando,Ícone e qual o botão com o "focus"11):

1 + 16 + 0 = 17

A MsgBox serve então para apresentar uma mensagem ao utilizador. No entanto,permite também recolher informação. Quando a caixa de mensagem apresenta maisdo que um botão, está-se a pedir ao utilizador que escolha uma de entre duas ou trêsalternativas. Dependendo de qual o botão premido pelo utilizador, assim o valor numéricodevolvido pela função MsgBox será um de entre 7 valores possíveis, descritos na Tabela 4na página seguinte.

De notar que caso a tecla ESC (Escape) seja premida o valor devolvido será 2, a quecorresponde o botão Cancel (o que indica que as duas acções são equivalentes).

Claro que quando se pretende aproveitar o valor devolvido pela função MsgBox seránecessário usá-la com a seguinte sintaxe:

11O botão com o "focus" ou botão de defeito é aquele que será accionado automáticamente caso outilizador prima a tecla Enter ou Return.

26

Page 27: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Constante Valor Botão seleccionadovbOK 1 OKvbCancel 2 CancelvbAbort 3 AbortvbRetry 4 RetryvbIgnore 5 IgnorevbYes 6 YesvbNo 7 No

Tabela 4: Valores devolvidos por uma Caixa de Mensagem

Variável = MsgBox(Mensagem, Características, Título)

Desta maneira, o valor devolvido pela função será guardado (atribuído) em Variável,podendo depois ser avaliado por instruções seguintes.

4.3.2 InputBox

A função InputBox permite apresentar ao utilizador uma mensagem com uma questão,recolhendo ao mesmo tempo uma string contendo a sua resposta. Assim, ao contrárioda função MsgBox (Secção 4.3.1 na página 25), esta função produz um resultado do tipostring e não do tipo integer.

Figura 13: Exemplo de InputBox

Como pode ser visto na Figura 13, esta função cria um objecto composto (uma Caixade Entrada) incluindo um caixa de texto, dois botões12 e um rótulo dentro de umapequena janela.

A sua sintaxe é

Variável = InputBox (mensagem, título, valor_de_defeito, xpos, ypos)

Em que os argumentos são:12Ao contrário da MsgBox, neste caso os dois botões são fixos. Por outro lado, a tecla ESC tem o

mesmo comportamento.

27

Page 28: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Mensagem Texto da mensagem a afixar na Caixa de Entrada (máximode 1024 caracteres)

Título Conteúdo da barra de título da janela (opcional)valor_de_defeito Texto a colocar à partida na caixa de texto da Caixa de En-

trada (opcional)xpos e ypos Coordenadas da “Input Box” relativamente aos bordos es-

querdo e superior do ecrã (opcionais)

4.3.3 Forms

Como vimos no início da Secção 4 na página 19, uma interface gráfica (em terminolo-gia VBA, uma DialogBox ) é construída dispondo os objectos adequados (genericamentedesignados por controlos) sobre uma janela especial, a form. Efectivamente uma form éutilizada como um contentor para outros objectos gráficos. Um objecto da classe User-Form pode ser criado no Editor do VBA através do Menu "Insert/User Form". Esseprocesso será visto em detalhe na Secção 8 na página 56.

A seguir são apresentadas algumas das principais propriedades que podem ser confi-guradas numa Form:

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

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

• BackColor - permite seleccionar a cor do fundo

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

• ShowModal - permite alterar o comportamento da Form de modo a controlar oacesso à aplicação enquanto a Form estiver activa

• Font - controla o tipo e tamanho da letra utilizada

• Height - especifica a altura da Form

• Width - especifica a largura da Form

Nas próximas secções, referiremos com algum detalhe os controlos de uso mais comumna construção de dialogBoxes em VBA. Estes são os objectos que mais frequentementesão colocados numa form.

4.3.4 Botões de Comando

Um botão de comando (objecto commandButton), como o próprio nome sugere, é uti-lizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se podeverificar na Figura 11 na página 23, é a este tipo de controlos que normalmente se asso-ciam as sub-rotinas que permitem responder a eventos como o clicar de um rato.

As propriedades normalmente referidas em relação a esta classe de objectos são as quecontrolam as dimensões (Height e Width) e a propriedade Caption que permite especificaro texto afixado.

28

Page 29: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

A instrução seguinte serve de exemplo de como alterar programaticamente o estadode um botão de comando:

cmdArranque.Enabled = True

O que fizemos com a instrução acima foi atribuir o valor booleano (lógico) True à pro-priedade Enabled13 do botão de comando cmdArranque. Estamos, assim, a tratar umapropriedade como sendo uma variável. De facto, uma propriedade pode ser consideradacomo uma variável especial.

4.3.5 Rótulos

Os rótulos, também designados por etiquetas (label) são usados para apresentar textona interface. Mais uma vez, a propriedade mais utilizada é a propriedade Caption, quepermite especificar o texto a apresentar. Este controlo é usado não só para apresentarinformação estática, que é escolhida na fase de concepção da interface, como tambéminformação dinâmica, como seja a apresentação de resultados:

lblResultado.Caption = "O valor total é 235 metros"

A instrução acima atribui à propriedade Caption do rótulo lblResultado a string "Ovalor total é 235 metros", o que vai ter como consequência a sua afixação na interface.

4.3.6 Caixas de Texto

As caixas de texto (objecto TextBox ) são uma classe de controlos muito versáteis quepermitem a introdução pelo utilizador de diversos tipos de informação: texto, valoresnuméricos e, no caso do Excel, referências a células e mesmo fórmulas.

Algumas das suas propriedades mais importantes são:

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

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

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

Enquanto que os rótulos (Label) são utilizados pelo programa para aparesentar infor-mação ao utilizador, já as caixas de texto (Text Box ) são maioritáriamente usadas parapermitir a leitura de informação pelo programa.

13Esta propriedade permite controlar o acesso do utilizador ao botão de comando.

29

Page 30: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Funções Val e StrA linguagem Visual Basic dispõe de um grande número de funções pré-definidas.Duas delas, relacionadas com "strings", são particularmente úteis para lidar comobjectos da classeTextBox :

Função DescriçãoVal() Retorna como valor numérico um número contido dentro duma stringStr() Retorna uma string representando um número

Vamos supor que um macro precisa de calcular o peso total à custa de dois valo-res introduzidos pelo utilizador através de duas TextBox. A tentação seria usar ainstrução:

pesoTotal = txt1.Text + txt2.Text

No entanto, o que a propriedade Text das TextBox contem é apenas texto, aindaque contendo algarismos. Para extrair a informação numérica de dentro do texto,haverá que utilizar a função Val():

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

4.3.7 Botões de Opção

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

Figura 14: Vários optionButton agrupados numa frame

Os botões de opção são geralmente agrupados em conjuntos de dois ou mais, estandointerligados entre si, já que, ao mesmo tempo, só é possível existir um botão seleccionadodentro do mesmo grupo de botões de opção. Encontram-se muitas vezes inseridos emframes (Secção 4.3.9 na página seguinte).

Para além da propriedade Caption, outra propriedade importante dos botões de opçãoé a propriedade Value, que pode assumir o valor “True” ou “False” conforme o botão seencontre ou não seleccionado.

30

Page 31: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

4.3.8 Caixas de Verificação

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

Figura 15: Vários checkBox agrupadas numa frame

Possuem também uma propriedade Value que, neste caso, pode apresentar os seguintesvalores:

0 não activada1 activada2 não disponível

O texto a inserir junto de cada caixa de verificação deve ser especificado mediante apropriedade Caption.

4.3.9 Quadros (Frames)

Tais objectos destinam-se a agrupar outros objectos (controlos). São usados muitas vezespara organizar um dado conjunto de botões de opção (Secção 4.3.7 na página precedente),tornando-os independentes de outros botões de opção eventualmente existentes na mesmaform.

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

É importante criar o quadro antes de aí inserir os controlos. Se o controlo fôr criadoantes do quadro, não será possível deslocá-lo para dentro do quadro após este ter sidocriado.

31

Page 32: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o“contentor” desse objecto. Quer isto dizer que a sua localização passa a ser definida nãoem relação à form mas em relação ao quadro que o contem.

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

4.3.10 Caixas de Listagem

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

Figura 17: Exemplo de listBox

Os elementos da lista podem ser especificados à partida usando a propriedade List,ou ser acrescentados durante a execução do programa mediante o método AddItem:

listbox.AddItem elemento

ou

listbox.AddItem elemento, posição

em que

elemento é o novo elemento a acrescentar à listaposição refere-se à posição na lista em o elemento vai ser inserido

Na primeira variante acima o elemento será inserido a seguir à última linha preen-chida.

A remoção de um elemento da lista pode ser feita mediante o método RemoveItem:

Listbox.RemoveItem posição

As propriedades mais relevantes desta classe de objectos são:

32

Page 33: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

ListCount permite conhecer em qualquer momento o número de elemen-tos contidos na lista

Sorted permite especificar se a lista é ou não apresentada de maneiraordenada

ColumnCount especifica qual o número de colunas em que a lista é apresen-tada

ColumnHeads controla os cabeçalhos das colunasMultiSelect permite controlar a forma de selecção de elementos na lista:

0 - só é possível seleccionar um elemento1 - é possível seleccionar vários elementos simultaneamente,pressionando cada elemento2 - é possível seleccionar vários elementos simultaneamente,usando a tecla Ctrl

ListIndex fornece ou especifica qual o índice do item actualmente selec-cionado (ou –1 caso nenhum esteja). Sintaxe:objecto.ListIndex [= indice]

List permite aceder aos elementos duma lista, quer para os ler,quer para os modificar. Sintaxe:objecto.List(indice) [= string]

Text permite obter o elemento actualmente seleccionado. Sintaxe:variavel = objecto.Text

RowSource no Excel, especifica qual a gama de células onde estará a in-formação a incluir na lista, ou seja, a fonte dos dados a apre-sentar.

Na especificação de sintaxe, os parêntesis rectos indicam que o seu conteúdo é opcional.No caso das propriedades ListIndex e List descritas acima, a versão curta destina-se a serusada do lado direito de uma operação de atribuição, enquanto que na versão completao que se pretende é atribuir um valor à propriedade.

Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox comuma ListBox. O utilizador pode introduzir um item na TextBox ou seleccioná-lo na listaque, estando normalmente escondida, só aparecerá quando se clica num ícone próprio. Énormalmente utilizado quando se pretende dar a possibilidade de escolher um elementode uma lista mas sem ocupar muito espaço na form.

4.4 Interface gráfica sem uma Form

É possível criar uma interface gráfica para um macro sem ter que usar um form onde seinstalem os diferentes controlos. Nesse caso, os controlos serão instalados directamentena própria folha de cálculo, numa área reservada para o efeito. Um exemplo pode serobservado na Figura ?? na página ??.

33

Page 34: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

5 Estruturas de controlo do programaUm macro é um programa escrito na linguagem VBA. Vamos agora começar a analizarmais em detalhe a estrutura de um programa. Um programa é composto por um conjuntode instruções, cada uma delas executando uma tarefa específica. A sequência de instruçõeslevará à solução do problema que o programa se propõe resolver. Mas essa sequência nãotem que ser necessariamente linear, i.e., composta por uma lista de instruções que serãorealizadas uma após outra, de forma imutável. Isso tornaria o programa inflexível, incapazde se adaptar às circunstâncias ou aos diferentes desejos do utilizador.

Já foi introduzida na Secção 3.4 na página 17 a noção de operação de atribuição. Comessa operação podemos criar instruções simples, mediante as quais é possível copiar valoresentre variáveis, ou armazenar resultados do cálculo de expressões. Mas um programaflexível não poderá ser construído apenas com instruções desse tipo. É preciso disporde instruções que permitam alterar o fluxo do programa. Para tal vamos introduzirestruturas de controlo que possibilitam a alteração desse fluxo.

5.1 Estruturas de controlo condicional

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

5.1.1 If...Then...Else

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

34

Page 35: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

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

A sintaxe desta estrutura é:

1 I f condicao Then2 [ i n s t r u c o e s ]3 Else4 [ i n s t r u c o e s a l t e r n a t i v a s ]5 End I f

Quando a condição é verdadeira serão executadas as instruções delimitadas por Thene Else. Em caso contrário, será executado o bloco alternativo de instruções.

A condição pode consistir numa comparação ou outra operação lógica, ou ainda emqualquer expressão de que resulte um valor numérico: um valor não nulo será interpretadocomo Verdadeiro, enquanto um valor nulo será considerado como Falso.

A condição é, portanto, uma expressão booleana (lógica). Uma expressão booleanarepresenta um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser cons-tituída por uma variável, uma função ou uma combinação destas entidades através deoperadores.

5.1.2 If...Then

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

Quando numa estrutura condicional não existe qualquer acção a executar quando a

35

Page 36: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

condição seja falsa, usa-se uma variante simplificada, a If...Then. O seu diagrama estádescrito na Figura 19 na página 35. A sua sintaxe será então:

1 I f condicao Then2 [ i n s t r u c o e s ]3 End I f

Nesta 2a variante, quando a acção a realizar no caso a condição ser verdadeira puder serexecutada com apenas uma instrução, é possível utilizar a seguinte sintaxe simplificada,sem o delimitador End If :

If condicao Then instrucao

Expressões lógicas

As expressões lógicas, utilizadas nas condições das estruturas de controlo, são cons-truídas utilizando operadores lógicos específicos. A linguagem VBA prevê os seguin-tes operadores lógicos, utilizáveis em expressões:

Operador Descrição> Maior que< Menor que= Igualdade<= Menor ou igual>= Maior ou igual<> DesigualdadeAnd EOr OuNot Negação

Dos primeiros seis operadores não haverá muito a dizer. Já do And e do Or haveráalguns detalhes a esclarecer:

AND

Sintaxe: Expr1 And Expr2

• Se Expr1 e Expr2 forem ambas verdadeiras, a expressão será verdadeira

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

OR

Sintaxe: Expr1 Or Expr2

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

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

36

Page 37: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

5.1.3 Estruturas condicionais embutidas

É possível imbricar estruturas condicionais dentro de outras estruturas condicionais, per-mitindo, assim, a construção de estruturas de controlo mais complexas. Para inserir umaestrutura condicional dentro de outra, é utilizada a palavra reservada ElseIf.

A sintaxe desta estrutura é:

1 I f condicao1 Then2 Accao13 ElseIf condicao2 Then4 Accao25 ElseIf condicao3 Then6 . . .7 Else8 AccaoN9 EndIf

Esta estrutura condicional permite a selecção de uma entre várias alternativas mu-tuamente exclusivas. As instruções que se seguem à palavra reservada Else (aqui re-presentadas por "AcçãoN") serão executadas apenas se nenhuma das condições se tiververificado.

Figura 20: Estruturas de controlo condicional imbricadas

Na Figura 20 na página anterior pode-se ver o fluxograma de uma estrutura imbricadacom quatro vias alternativas. A Acção 1 é executada caso a 1a condição seja verdadeira.A Acção 3 será executada caso a Condição 3 for verdadeira e as duas anteriores falsas.A Acção 4 será executada caso todas as quatro condições se tiverem verificado falsas.

37

Page 38: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Chama-se a esta acção, a acção por defeito, ou seja, aquilo que se faz quando todo o restofalha.

É muito importante que se compreenda que estamos aqui a tratar de verdadeiras alter-nativas, i.e., mútuamente exclusivas. Cada vez que uma estrutura deste tipo é executada,só uma das acções será efectuada.

O exemplo seguinte traduz uma situação em que o programa, confrontado com anecessidade de classificar uma nota numérica, pode escolher uma de entre seis notasqualitativas diferentes. Só uma estrutura condicional imbricada lhe permitirá resolver oproblema.

Listing 3: Exemplo de aplicação de If..Then..Else imbricados

1 I f ( nota < 0) Or ( nota > 20) Then2 r e su l t ado = "Nota␣ Inva l i da ! "3 ElseIf nota < 6 Then4 r e su l t ado = "Mau"5 ElseIf nota < 10 Then6 r e su l t ado = "Mediocre "7 ElseIf nota < 14 Then8 r e su l t ado = " Su f i c i e n t e "9 ElseIf nota < 17 Then

10 r e su l t ado = "Bom"11 Else12 r e su l t ado = "Muito␣Bom"13 End I f

É possível imbricar um qualquer número de blocos ElseIf dentro de uma dada estru-tura condicional.

5.2 Estruturas de controlo repetitivo

Como vimos, as estruturas de controlo condicional permitem alterar o fluxo do pro-grama, ou seja, executar diferentes sequências de instruções conforme as circunstânciasdo momento. As estruturas de controlo repetitivo (também conhecidas por ciclos)permitem repetir um dado conjunto de instruções o número de vezes que fôr necessário.

Existem diversas variantes de ciclos, diferindo umas das outras pela forma como écontrolada a execução das instruções contidas no corpo do ciclo. Genericamente, pode-sedizer que uma estrutura de controlo repetitiva (ou ciclo) assegura a execução repetida deum dado conjunto de instruções dependendo do resultado do teste de uma determinadacondição de funcionamento. De facto, como veremos, também os ciclos dependem daverificação de uma condição, normalmente de forma explícita, noutros casos implicita-mente.

5.2.1 Estruturas de Controlo Do...Loop

Estão disponíveis quatro variantes deste ciclo: Do...While e Do...Until, ambas com testeda condição no princípio ou no fim. Vejamos em detalhe as diversas variantes. O fluxo-

38

Page 39: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

grama da primeira encontra-se na Figura 21:

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

Analizando esse fluxograma, pode-se observar que tudo roda à volta do teste a umacondição, descrita como condição de funcionamento. Se a condição for verdadeirana altura em que o teste é realizado, as instruções que compõem o chamado corpo dociclo serão executadas, após o que novo teste à condição será efectuado. Enquanto acondição se verificar ser verdadeira, o programa não sairá deste ciclo. Na 1a vez em quea condição se mostrar falsa, o ciclo terminará e o programa poderá continuar com asinstruções seguintes.

Chama-se corpo do ciclo ao conjunto de instruções que serão executadas em cadaiteração (repetição) do ciclo. Esse conjunto pode incluir qualquer número de instruçõese de qualquer tipo, mesmo outras estruturas repetitivas. Neste último caso, etaremosperante o que se designa por ciclos imbricados ou embutidos, que serão tratados emdetalhe na Secção 5.2.5 na página 44.

A sintaxe em VBA desta estrutura de controle é a seguinte:

1 Do While condicao2 [ i n s t r u c o e s ]3 Loop

A segunda variante é muito semelhante à primeira. A grande diferença diz respeito àcondição de controle. Neste caso, temos a chamada condição de termo (ou de fim) oque faz com que o ciclo funcione enquanto a condição for falsa ou, por outras palavras,até que a condição de termo seja verdadeira (Figura 22).

A sintaxe da variante Do...Until será então:

1 Do2 [ i n s t r u c o e s ]3 Loop Unt i l condicao

Como se pode deduzir do atrás dito, é possível transformar uma estrutura Do...Whilenuma Do...Until desde que se substitua a palavra While pela Until e se negue a condiçãode controlo. Escolher uma ou outra estrutura de controlo depende, no fundo, do jeito

39

Page 40: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

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

do programador e, sobretudo quando se usam condições múltiplas, da forma como aexpressão lógica traduz com maior ou menor facilidade a condição em linguagem corrente.

5.2.2 Ciclos controlados por contador

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

Um ciclo controlado por contador baseado na estrutura Do..While pode assumir aseguinte forma genérica:

1 contador = va l o r_ i n i c i a l2 Do While contador <= va l o r_ f i na l3 ’ Corpo do Cic lo4 contador = contador + 15 Loop

Decorrendo do que vimos na secção anterior, torna-se claro que é igualmente possívelconstruir este ciclo usando a estrutura Do..Until.

Há que ter em conta as seguintes questões na construção de um ciclo controlado porcontador usando as estruturas de controlo Do...While ou Do...Until :

• Inicializar a variável contadora

• Especificar a condição de funcionamento do ciclo

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

Quando se usam estas estruturas, ao contrário do que se passa com a estrutura decontrolo repetitivo For...To...Next, a analizar na Secção 5.2.4 na página 43, é da respon-sabilidade do programador assegurar-se de que tais acções são correctamente executadas

40

Page 41: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 23: Ciclos controlados por contador

conforme está espelhado no diagrama de fluxo representado na Figura 23 na página pre-cedente.

Um último aspecto a observar é o seguinte: só é viável construir um ciclo controladopor contador quando é possível conhecer à partida o número de vezes que ele vai funcionarou, por outras palavras, o número de repetições necessárias. Isso nem sempre é possível.Nesses casos, a alternativa será usar ciclos controlados por sentinela.

5.2.3 Ciclos controlados por sentinela

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

41

Page 42: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Exemplo

Se o utilizador estiver a introduzir os dados referentes a um conjunto de alunosidentificados pelos seus números de matrícula, a introdução de um número commenos de 6 dígitos (no caso do ISEP) como, por exemplo, o valor 1, permitiráindicar ao programa que a presente sequência de introdução de dados deveterminar. Seria esse, neste caso, o valor sentinela escolhido.

Figura 24: Ciclos controlados por sentinela

A selecção do valor sentinela é da responsabilidade do programador, devendo serescolhido fora do intervalo possível de valores a introduzir, podendo ainda, ter-se ematenção a eventual ocorrência de valores fora desse intervalo que possam resultar dealgum eventual erro de digitação. O valor sentinela escolhido não deve pois ser passívelde facilmente ocorrer por mero acidente.

Conforme pode ser observado na Figura 24 na página anterior um ciclo controladopor sentinela deverá ser precedido da leitura de um elemento da sequência de valores aintroduzir. As leituras dos restantes valores dessa sequência serão efectuadas dentro do

42

Page 43: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

corpo do ciclo, um em cada iteração. Essa leitura deverá, no entanto, ser feita no fim docorpo do ciclo, após o processameento do valor anteriormente lido. Neste tipo de ciclos, aleitura e o processamento de cada valor lido andam desfasados de uma iteração do ciclo.No caso de se usar a estrutura Do..While, o ciclo funcionará enquanto o valor lido fordiferente do valor sentinela escolhido.

O exemplo apresentado acima, poderia ser codificado pelo segmento de programaseguinte:

1 num = InputBox( " D ig i t e ␣o␣numero" , "ISEP␣−␣Matr i cu las " )2 Do While numero <> 13 I f numero <> 1 Then l s tbox1 .AddItem num4 num = InputBox( " D ig i t e ␣o␣numero" , "ISEP␣−␣Matr i cu las " )5 Loop

Geralmente o valor sentinela é um valor preciso. Existem casos, porém, em que asentinela pode ser qualquer valor dentro de uma determinada gama, por exemplo, todosos números negativos. Um exemplo de um ciclo controlado por uma sentinela com estascaracterísticas é apresentado na Secção 5.2.5 na próxima página.

5.2.4 Estrutura de Controlo For..To..Next

Este ciclo permite repetir um dado conjunto de instruções um número pré-determinado devezes. Como vimos na secção anterior, nem sempre é possível saber de antemão quantasvezes as instruções contidas no corpo do ciclo devem ser repetidas. Nesse caso, deverãoser utilizadas as estruturas de controlo repetitivo estudadas na Secção 5.2.1 na página 38.

A sintaxe da estrutura For..To..Next é:

1 For contador = va l o r_ i n i c i a l To va l o r_ f i na l2 [ i n s t r u c o e s ]3 Next

Esta estrutura baseia-se na existência dum contador que incrementa automaticamenteo conteúdo da variável contador, chamada variável de controlo do ciclo, cada vezque o ciclo funciona, isto é, cada vez que as instruções contidas no corpo do ciclo sãoexecutadas. No início, contador vai conter o valor inicial e após valorfinal - valorinicial iterações atingirá o valor final. Nesse momento o ciclo terminará.

A inicialização da variável contadora, o seu incremento/decremento e a verificação dacondição de funcionamento do ciclo (contador <= fim) é da responsabilidade da própriaestrutura de controlo. O programador deve, apenas, especificar qual o valor de início ede fim (ou, de forma indirecta, o número de vezes que o ciclo vai funcionar) e quais asinstruções que o ciclo vai repetir (o corpo do ciclo).

O conteúdo da variável de controlo do ciclo pode ser utilizado por instruções contidasno corpo do ciclo, mas não deve, sob pretexto algum, ser modificado por estas instruções,sob pena de se perder o controlo do funcionamento do ciclo.

A estrutura de controlo verifica no início de cada iteração (repetição) do ciclo se acondição de funcionamento do ciclo é ainda verdadeira. Caso seja falsa, o ciclo terminará,e o programa passará a executar as instruções que se lhe seguem.

Pode ainda ser utilizada a seguinte sintaxe alternativa:

43

Page 44: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

1 For contador = va l o r_ i n i c i a l To va l o r_ f i na l Step passo2 [ i n s t r u c o e s ]3 Next

A diferença está na utilização da palavra Step após a especificação do valor final. Asua inclusão é opcional: caso se pretenda que o conteúdo da variável de controlo sejaincrementada uma unidade de cada vez, é desnecessário especificar o passo. Em casocontrário, Step passo permitirá incrementar o valor de variável de um valor diferente daunidade (positivo ou negativo).

Caso o valor de passo seja positivo a variável contadora será incrementada. Se pre-tendermos, no entanto, efectuar um decremento, deverá ser utilizado um valor negativopara passo. Obviamente, nesse caso, a condição implícita de funcionamento do ciclopassará a ser contador >= fim.

Repara-se que nesta estrutura de controlo, ao contrário das estudadas anteriormente,o incremento ou decremento da variável de controle do ciclo é automático. Outro aspectointeressante é que a condição de funcionamento do ciclo é implícita. Ela existe e éverificada mas não é especificada de forma explícita pelo programador, apenas de formaindirecta ao fixarem-se os valores inicial e final da variável de contagem.

Existe ainda em VBA uma estrutura de controlo que é uma variante da For..To..Nexte que opera numa colecção de objectos. Uma colecção é um conjunto de objectos idênticos,pertencentes à mesma classe, e que são referenciáveis mediante um índice. Por exemplo,um Workbook é constituído por um conjunto de objectos da classe Worksheet14.

A sintaxe desta estrutura é a seguinte:

1 For Each elemento In Coleccao2 [ i n s t r u c o e s ]3 Next

O bloco de instruções será aplicada a cada elemento da colecção de objectos em causa.A seguir é apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo:

Listing 4: FormataBordo - exemplo de sub-rotina usando For..Next

1 Public Sub FormataBordo ( )2 Dim c e l lOb j e c t As Range3 For Each c e l lOb j e c t In S e l e c t i o n4 c e l lOb j e c t . BorderAround ColorIndex :=3 ,Weight:=xlThick5 Next6 End Sub

É criada a variável cellObject para guardar um objecto do tipo Range (que representauma gama de células - assunto tratado na Secção 7.3). O ciclo For Each...Next aplicao método BorderAround a cada uma das células contidas na gama representada porcellObject. Com os argumentos fornecidos no exemplo, este método formata o bordodessas células a vermelho e uma linha grossa.

14Por sua vez, um workbook é também um objecto. Um objecto pode assim ser ele próprio umacolecção de objectos.

44

Page 45: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

5.2.5 Estruturas de controlo repetitivo imbricadas

Foi dito anteriormente que o corpo de um ciclo era constituído pelo conjunto de instruçõesque o ciclo irá executar repetidamente. Foi também dito que nesse conjunto de instruçõesse poderia incluir qualquer tipo de instruções, mesmo constituindo outras estruturas decontrolo repetitivo. Destes ciclos se diz que se encontram imbricados um dentro dooutro.

Considere-se o problema de calcular uma série de factoriais de números inteiros. Ocálculo de um factorial é realizado efectuando uma sucessão de multiplicações. Seránecessário usar um ciclo para o efeito. Por sua vez, se pretendermos repetir esse cálculoum certo número de vezes, teremos também que usar um ciclo. Teremos assim umciclo, chamemos-lhe exterior, que se encarrega de produzir uma sequência de factoriaise cujo corpo inclui por sua vez um ciclo, dito interior, que é responsável pelo cálculo decada factorial. O diagrama de fluxo da Figura 25 na página precedente representa estarealidade. O código necessário para traduzir esse diagrama é o seguinte:

Listing 5: Exemplo usando Ciclos Imbricados

1 num = InputBox( " Introduza ␣um␣ i n t e i r o ␣ p o s i t i v o " )2 Do Unt i l num < 03 f a c t o r i a l = 14 contador = 15 Do Unt i l contador > num6 f a c t o r i a l = f a c t o r i a l ∗ contador7 contador = contador +18 Loop9 num = InputBox( " Introduza ␣um␣ i n t e i r o ␣ p o s i t i v o " )

10 Loop

O ciclo exterior é controlado por uma sentinela, no caso qualquer valor inteiro nãopositivo. É um exemplo de sentinela constituído não por um valor específico mas poruma gama de valores possíveis. O ciclo interior é calaramente controlado por contador,funcionando tantas vezes quantas o valor do inteiro cujo factorial se pretende calcular.

5.3 Variáveis indexadas - vectores e matrizes

Até agora, temos trabalhado essencialmente com variáveis que podemos classificar comoindividuais (isto é, cada variável podendo conter ao mesmo tempo apenas um só valor).Como essas variáveis não podem conter simultaneamente mais que um dado, a atribuiçãode um novo valor a essa variável implica a destruição do valor anteriormente nela contido.

Mediante a utilização de um novo tipo de variáveis, as variáveis do tipo Array (Vector),passa a ser possível armazenar na mesma variável múltiplos valores desde que sejam domesmo tipo. Estamos, portanto, a utilizar agora variáveis que se podem classificar comovariáveis múltiplas. Na Figura 26 na página anterior podemos observar representaçõesde uma variável simples do tipo integer e de uma variável múltipla (um vector uni-dimensional) contendo valores inteiros. Cada elemento do vector é identificado por umvalor numérico específico.

45

Page 46: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 25: Exemplo de Ciclos Imbricados

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

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

Um elemento de um vector é identificado utilizando o nome do vector seguido do valordo índice dentro de parêntesis

nome_vector(indice)

Exemplos:

var_Multipla(3) 4o elemento do vector ‘var_Multipla’var_Multipla(7) 8o e último elemento do vector ‘var_Multipla’notas(14) 15o elemento do vector ‘notas’nomes(0) 1o elemento do vector ‘nomes’

15É possível forçar que os índices dos vectores comecem do valor 1 usando a directiva Option Base 1.

46

Page 47: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

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

Figura 27: Um exemplo de vector de strings

Os elementos de um vector não têm que ser inteiros, nem sequer valores numéricos.Na Figura 27 na página precedente é representado um vector contendo strings (texto).Considerando o vector como armazenado os nomes dos membros de uma equipa de fu-tebol, os sucessivos valores do índice podem ser vistos como os correspondentes númerosdas suas camisolas. Note-se que estamos, neste caso, a forçar os valores do índice a iniciarem 1.

5.3.1 Declaração de vectores

Como qualquer outra variável, uma variável do tipo Array deve também ser declarada(criada) antes de poder ser usada. Para tal, deve ser usada a instrução Dim, que reservaespaço em memória suficiente para armazenar o número previsto de elementos do vector16. Uma das formas de utilizar a instrução Dim para declarar vectores é a seguinte:

Dim nome_vector(num_elementos) As Tipo

Exemplos:

Dim var_Multipla(8) As Integer16Adicionalmente, a instrução Dim atribui valores iniciais a todos os elementos do vector (zeros no

caso de vectores numéricos e strings nulas no caso de vectores alfa-numéricos).

47

Page 48: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Dim notas(30) As SingleDim nomes(100) As String

Nota: num_elementos não se refere ao valor máximo que a variável índice podeassumir (7, no caso do vector var_Multipla) mas sim ao número de elementos dovector (8, neste caso). Por este processo, a declaração do limite inferior faz-se de formaimplícita: por defeito assume-se como limite inferior do índice o valor zero (ou 1 se talfor especificado mediante a instrução Option Base 1 ).

Uma forma alternativa de utilizar a instrução Dim para declarar vectores implica autilização da palavra reservada To, permitindo especificar o menor e o maior valor que oíndice pode assumir:

Dim nome_vector(menorIndice To maiorIndice) As Tipo

Exemplos:

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

5.3.2 Processamento de vectores

Sendo um vector uma variável múltipla composta de elementos do mesmo tipo agrupadosna mesma estrutura, a forma mais adequada de executar uma mesma acção sobre umaparte ou a totalidade dos seus elementos é utilizar uma estrutura de controlo repetitivoou ciclo.

Para perceber de forma mais clara o porquê da afirmação contida no parágrafo an-terior, observe-se o problema descrito na Figura 28 na página anterior e atente-se nasdiferentes soluções propostas.

Quando confrontado com o problema de armazenar e actualizar a informação relativaao preço de 100 produtos, um programador poderia ser tentado a criar 100 variáveisindividuais para guardar cada um desses preços. Isso, no entanto, obrigá-lo-ia a incluirno seu programa 100 instruções Dim para criar outras tantas variáveis individuais. Poroutro lado, quando necessitasse de actualizar os preços em, por exemplo, 5%, teria queinserir 100 instruções do tipo preçoN = preçoN * 1,05.

Do atrás exposto facilmente se verificará que esta solução não tem qualquer exequi-bilidade prática. Analizemos então a solução alternativa usando uma variável indexada:em vez de 100 variáveis individuais teremos apenas um vector de 100 elementos, cada ele-mento capaz de armazenar o preço de um produto. Consequentemente, teremos apenasuma instrução Dim, no caso, algo como Dim preços As single. E quando necessitarde actualizar os preços, como o vector é uma variável múltipla indexada, haverá apenasque construir um ciclo que percorra automáticamente o vector, actualizando cada um dosseus elementos.

Listing 6: Exemplo de processamento de um vector

1 Private Sub cmdGo_Click ( )2 Dim vectorSqr (100) As Double3 Dim i As Integer

48

Page 49: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 28: Porquê usar ciclos para processar vectores?

4 Dim r e s As S ing l e5 l s tTabe l a .Clear6 For i = 0 To txtMaior7 r e s = Sqr ( i )8 vectorSqr ( i ) = r e s9 l s tTabe l a .AddItem Format( res , " 0 .000 " )

10 Next i11 End Sub

O programa descrito na Listagem 6 na página precedente permite calcular e apresentarsob a forma de uma tabela as raízes quadradas de todos os números inteiros compreendidosentre 0 e um dado limite superior a especificar pelo utilizador na TextBox txtMaior (alargura do intervalo não deve exceder 100, visto ser esta a dimensão do vector). Os valorescalculados são armazenados num vector para eventual futura utilização.

Listing 7: Outro exemplo de processamento de um vector

1 Private Sub cmdGo_Click ( )2 Dim vec to r (100) As Double3 Dim i As Integer4 Dim i n d i c e As Integer5 Dim r e s As S ing l e6 Dim l i nha As String7 l s tTabe l a .Clear8 i n d i c e = 0

49

Page 50: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

9 For i = txtMenor To txtMaior10 r e s = Sqr ( i )11 vec to r ( i nd i c e ) = r e s12 l i nha = Format(Str ( i ) , "##0" ) + "␣−␣" + _13 Format( vec to r ( i nd i c e ) , " 000 .000 " )14 l s tTabe l a .AddItem l i nha15 i n d i c e = ind i c e + 116 Next i17 End Sub

Na variante desta sub-rotina, contida no exemplo descrito na Listagem 7 na páginaanterior, é possível especificar também o limite inferior do intervalo, para além de sedemonstrarem algumas técnicas de formatação da saída de dados.

De notar que na primeira versão do programa se usou a mesma variável i para controlaro ciclo For e para armazenar os valores dos índices do vector. Tal aconteceu porque foipossível estabelecer naquele caso uma correspondência directa entre os valores da variávelde controlo do ciclo i e os valores do índice que controla as posições dos elementos dovector.

Já na segunda variante do programa tal não era possível, visto que a variável de con-trolo do ciclo iria conter valores (desde o limite inferior ao limite superior do intervalo) quenão deveriam corresponder às posições do vector em que o armazenamento dos resultadosse iria efectuar.

Em qualquer das variantes apresentadas, o processamento dos elementos do vectorconsistiu em operações de escrita (de atribuição) que modificaram o seu valor. É igual-mente possível efectuar operações de leitura sobre todos ou parte dos elementos dumvector. Neste caso, como é óbvio, a variável do tipo Array deverá encontrar-se do ladodireito de uma operação de atribuição:

var = vector(indice)

A instrução acima copia o conteúdo de vector na posição índice para a variável var.

6 Funções e ProcedimentosAs sub-rotinas descritas nos exemplos que têm sido apresentados destinam-se a executartarefas. Por exemplo, as rotinas descritas na Secção 2.6 na página 12 têm como objectivoa monitorização dos valores contidos em determinadas células da folha de cálculo. Estetipo de sub-rotinas é designado por procedimentos. Destinam-se a realizar tarefas e nãodevolvem qualquer resultado.

No entanto, não é possível utilizar estes procedimentos em fórmulas duma folha decálculo, ao contrário do que acontece com as funções standard disponíveis no Excel, comoseja a função If referida atrás, ou a função Sum, que calcula a soma do conteúdo numéricodas várias células contidas numa dada gama. Isso acontece porque, para poderem serutilizadas em fórmulas, elas terão que ser estruturadas como funções, e comportarem-sede maneira idêntica à das funções standard.

Uma função, seja ela pré-existente no Excel, ou criada pelo utilizador, deve poder

50

Page 51: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

receber a informação de que necessita, e de conseguir devolver o resultado do seu trabalho,de modo a esse resultado poder ser utilizado na fórmula ou expressão que a utilize. Paratal, tem que possuir uma estrutura definida pela sintaxe seguinte:

1 Function Nome ( argumento1 , argumento2 , . . . )2 ’ L i s t a de i n s t r u co e s3 Nome = re su l t ado4 End Function

Repare-se que para além das diferenças óbvias no cabeçalho e no delimitador final emrelação às sub-rotinas estudadas atrás, verifica-se o seguinte:

1. A seguir ao nome da função e entre parênteses encontra-se uma lista de argumen-tos, através dos quais a função vai receber as informações essenciais à realização do seutrabalho.

2. O resultado dos cálculos efectuados será entregue à fórmula ou expressão queinvocou a função, depositando-o no seu próprio nome, como se este fosse uma variável.

Atentemos na seguinte fórmula:

= 10 * sin(angulo)

Para calcular a fórmula, ir-se-á multiplicar por 10 o resultado fornecido pela funçãostandard sin. Esta, por sua vez, para poder fornecer o resultado deverá ter recebido ainformação de qual o ângulo (neste caso em radianos) de que se quer calcular o seno.Quando a função termina o seu trabalho, deixará o resultado do seu cálculo no lugar queocupava na fórmula.

Figura 29: Funções como caixas pretas

Para o utilizador da função, não interessa conhecer o seu funcionamento interno, masapenas qual a informação que lhe tem que fornecer e qual o tipo de resultado esperado.Assim sendo, pode dizer-se que do ponto de vista do utilizador da função, ela se comportacomo uma caixa preta, à qual é fornecida informação e que, com base nela, produz umresultado (Figura 29 na página anterior).

51

Page 52: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

6.1 Exemplo de função criada pelo programador

Vamos agora criar uma função que permita calcular a margem de lucro percentual de umdeterminado produto sabendo o seu custo e o seu preço de venda. Supõe-se que essesdados se encontrarão previamente armazenados em duas células da folha de cálculo. Umasolução possível será a seguinte:

Listing 8: Função margemLucro

1 Public Function margemLucro ( venda , custo )2 margemLucro = ( venda − custo ) / venda3 End Function

Observe-se que esta função possui dois parâmetros de entrada, venda e custo, atravésdos quais receberá os dados correspondentes. Note-se ainda que o resultado da expressãoque calcula a margem de lucro é atribuído directamente ao próprio nome da função. Éesse o processo pelo qual uma função consegue fornecer o resultado do seu trabalho àentidade que a invocou.

Esta função poderá ser utilizada em qualquer fórmula contida numa célula da folha decálculo, das mesma maneira que qualquer das funções pré-existentes o seria. Um exemplode uma fórmula utilizando esta função seria a descrita na Figura 30.

Figura 30: Utilização da função margemLucro numa fórmula

A fórmula, que pode ser consultada na barra de fórmulas da imagem apresentada naFigura 30 na página 52, contem referências às células D3 e D2, em que estão contidos,respectivamente, o preço de venda e o custo do produto. Quando a função é invocada,cópias do conteúdo destas duas células são passadas à função. Esta recebe-os atravésdos parâmetros de entrada respectivos, venda e custo. O resultado do seu cálculo serádeixado na fórmula, quando a função termina o seu trabalho.

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

Se bem que o VBA possua várias dezenas de funções pré-definidas, é muito convenientepoder utilizar num macro qualquer uma das centenas de funções standard oferecidas peloExcel. Para poder aceder a elas a partir do VBA é necessário utilizar a propriedadeWorsheetFunction do objecto Application17. Por exemplo, para, num macro, calcular o

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

52

Page 53: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

valor médio de uma gama de células (identificada pelo nome "Dados") poderia ser usadaa seguinte instrução:

med = Application.WorksheetFunction.Average(Range("Dados"))

Esta instrução permite aceder à função standard Average do Excel, à qual é fornecidoum objecto do tipo Range, representando a gama de células descritas sob o nome "Dados".

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

7.1 Trabalhar com objectos Workbook

Usando estes objectos, o VBA pode criar novos livros de trabalho, abrir ou fechar exis-tentes, entre outras acções possíveis. Para especificar qual o livro de trabalho com quequeremos trabalhar podemos fazê-lo de três maneiras diferentes:

• Usando o objecto Workbooks que representa o conjunto dos ficheiros Excel abertosnaquele momento (Workbooks(Nome));

• Usando o objecto ActiveWorkbook que representa o ficheiro com que se está demomento a trabalhar;

• Usando o objecto ThisWorkbook que representa o ficheiro em que o próprio pro-grama em VBA (e não o utilizador) está a operar.

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

Sintaxe:Workbooks.Open Nome_do_ficheiro

Exemplo:Workbooks.Open "C : \Documentos\Excel\Dados.xls"

Os métodos Save e Close são utilizados de forma similar para salvaguardar o conteúdodum ficheiro e para o fechar, respectivamente.

7.2 Trabalhar com objectos Worksheet

Normalmente um livro de trabalho possui mais do que uma folha de cálculo (é normal-mente criado logo à partida com três). Para escolher qual a folha de cálculo com que sepretende trabalhar usa-se o objecto Worksheets especificando um índice ou o nome dafolha de cálculo em causa, conforme se exemplifica a seguir:

Worksheets(2)

53

Page 54: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Worksheets("Custos")

7.2.1 Propriedades de Worksheet

Nesta secção são referidas algumas das suas propriedades mais úteis:

• Worksheet.Name - permite mudar ou obter o nome da folha de cálculo. O exemploabaixo muda o nome de "Folha 1" para "Medidas":

Worksheets("Folha 1").Name = "Medidas"

• Worksheet.StandardWidth - permite especificar a largura standard das colunas dumafolha de cálculo.

7.2.2 Métodos de Worksheet

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

• Worksheet.Activate - torna activa a folha de cálculo especificada18. O exemploseguinte torna activa a folha de cálculo "Custos" do livro de trabalho "Dados 2007":

Workbook("Dados 2007").Worksheets("Custos").Activate

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

Sintaxe:

Worksheet.Copy [Position]

O argumento Position é opcional e pode ter o valor Before ou After indicando aposição onde a cópia será inserida. Caso o argumento não seja incluído, a cópiaserá inserida num novo livro de trabalho.

Exemplo:

Worksheets(2).Copy After:=Worksheets(3)

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

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

• Worksheet.Delete - permite eliminar a folha de cálculo especificada.18A folha de cálculo activa é aquela que está visível no momento.

54

Page 55: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

• Worksheet.Add - permite acrescentar uma nova folha de cálculo ao livro de trabalho.

Sintaxe:

Worksheet.Add [Position]

Também aqui o argumento Position é opcional. Se for omitido, a nova folha decálculo será inserida imediatamente antes da folha activa.

Exemplo:

Worksheets.Add After:=Worksheets("Medidas")

7.3 Trabalhar com objectos Range

Um objecto do tipo Range pode representar uma simples célula, um conjunto de células,uma linha ou uma coluna. Não existe em VBA um objecto específico para representaruma célula individual.

Para nos referirmos a uma célula ou gama de células podemos aplicar o método Rangeao objecto Worksheet usando uma de duas sintaxes possíveis:

Sintaxe 1:Worksheet.Range(Nome)

Sintaxe 2:Worksheet.Range(Celula1, Celula2)

A 1a sintaxe usa nomes de gamas pré-definidos19, enquanto que a 2a utiliza as re-ferências das células que definem os dois vértices opostos da área rectangular contendoas células que se quer especificar. Caso se omita Worksheet em qualquer das sintaxesanteriores, o VBA pressupõe que se trata da folha de cálculo activa naquele momento.

Exemplos:Range("C5").Value = 100Range("D1","D10").Value = 0Worksheets(3).Range("Dados").ClearContents

O 1o exemplo guarda o valor 100 na célula C5. O 2o exemplo atribui o valor zeroa todas as células da gama D1 a D10. Nestes dois exemplos é utilizada a propriedadeValue dos objectos Range que permite conhecer ou modificar o seu valor. No 3o exemplolimpa-se o conteúdo das células da gama "Dados" da 3a folha de cálculo, mediante aaplicação do método ClearContents.

Caso queiramos identificar apenas uma célula podemos também utilizar o métodoCells.

Sintaxe:Objecto.Cells(Linha,Coluna)

19Atribuídos em Excel usando o Menu "Insert/Name/Define".

55

Page 56: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Na sintaxe acima, a entidadeObjecto pode ser um objecto Worksheet ou Range. A suaomissão, leva o VBA a partir do princípio que se trata da folha de cálculo activa. Linhae Coluna são valores numéricos indicando qual a linha e qual a coluna na intersecção dasquais a célula se encontra20. Veja-se o seguinte exemplo:

1 For coluna = 2 To 132 Ce l l s (2 , Coluna ) . Value = "Mes␣" & coluna − 13 Next

O exemplo acima usa um ciclo For...To para preencher todas as células da gama C2 aC13 com o texto "Mês X" em que X é o no do mês. É usado o operador de concatenaçãode strings & para efectuar a colagem.

Caso se pretenda identificar uma linha ou coluna completa, podem ser utilizados osmétodos Rows e Columns.

Sintaxe:Objecto.Rows(Indice)Objecto.Columns(Indice)

Para ilustrar a utilização do método Rows atente-se no seguinte exemplo de sub-rotina21:

Listing 9: Sub-rotina InsereLinhas

1 Sub In s e r eL inhas (gama As Range , num As Integer )2 Dim num_linhas As Integer , u lt ima_linha As Integer3 Dim i As Integer4 With gama5 num_linhas = .Rows .Count6 ult ima_linha = .Rows( num_linhas ) .Row7 For i = 1 To num8 . Rows( ult ima_linha + i ) . I n s e r t9 Next

10 End With11 End Sub

Esta sub-rotina recebe como argumentos uma gama de células (um objecto do tipoRange) e um inteiro especificando o número de linhas a inserir abaixo da última linhadessa gama. A estrutura With...End...With é muito prática porque permite executarum conjunto de instruções sobre um determinado objecto, neste caso qualquer objectoRange que a sub-rotina receba como argumento. Dentro da estrutura With...End...Withomite-se qualquer referência a esse objecto, usando-se apenas os seus métodos e propri-edades. Assim, .Rows.Count refere-se ao número total de linhas da gama especificadae .Rows(num_linhas).Row fornece-nos o índice da última linha dessa gama. O cicloFor...To repete num vezes a aplicação do método Insert à ultima linha da gama.

Para testar a sub-rotina InsereLinhas, use-se a seguinte rotina de teste:20Se o objecto for do tipo Range, os argumentos Linha e Coluna referir-se-ão à linha e à coluna dentro

da gama de células especificada.21Adaptado de um exemplo contido em [1].

56

Page 57: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

1 Sub i n s e r eTe s t e ( )2 In s e r eL inhas Worksheets ( 3 ) . Range ( "Dados" ) , 33 End Sub

Apresentamos outro exemplo, agora referido ao método Columns :

Columns(5).ColumnWidth = 15

Aplicando o método Columns ao objecto Columns(5) (a coluna de índice 5, ou seja,a coluna E) o efeito obtido é a mudança da sua largura para 15.

8 Adicionando uma interface gráficaO acesso aos macros faz-se, conforme referido na Secção 2.3, mediante a combinação deteclas ALT-F8. Pode ainda associar-se a um macro uma combinação de teclas especialque permite accioná-lo directamente. No entanto, em muitos casos, é mais convenientepoder interagir com o macro através de uma interface própria, concebida especialmentepara ele. Usam-se para o efeito objectos gráficos como Dialog Boxes (Caixas de Diálogo)desenhadas à medida, que são versões mais desenvolvidas das já conhecidas Input Boxese Message Boxes.

Vamos nesta secção ver como construir as nossas próprias Dialog Boxes usando ob-jectos da classe UserForm e como as integrar numa aplicação em VBA.

8.1 Instalação da Form

Uma Form é uma janela, em si mesma um objecto, utilizada como um contentor paraoutros objectos gráficos (ver Secção 4.3.3 na página 28). Pode-se criar um objecto daclasse UserForm no Editor do VBA através do Menu "Insert/User Form".

Na Figura 31 na página anterior pode-se ver uma Form vazia e uma caixa de fer-ramentas (Toolbox ) contendo os vários controlos (objectos gráficos) disponíveis para aconstrução da interface. Pode ainda ver-se no canto inferior esquerdo a Janela de Propri-edades, através da qual é possível manipular várias características da Form (como, aliás,de qualquer controlo que esteja seleccionado). A seguir são apresentadas algumas dasprincipais propriedades que podem ser configuradas numa Form:

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

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

• BackColor - permite seleccionar a cor do fundo

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

• ShowModal - permite alterar o comportamento da Form de modo a controlar oacesso à aplicação enquanto a Form estiver activa

• Font - controla o tipo e tamanho da letra utilizada

• Height - especifica a altura da Form

• Width - especifica a largura da Form

57

Page 58: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Figura 31: Criação de uma Form no VBA

8.2 Instalação dos Controlos

Usando a Caixa de Ferramentas Toolbox, é possível escolher e instalar os controlos naForm. Para o efeito, basta accionar o símbolo do controlo pretendido e desenhá-lo como rato na Form. A seguir, quer agindo directamente sobre o controlo, quer utilizando aJanela de Propriedades, podem-se fazer os ajustes necessários das suas características. Sebem que cada classe de controlos possua a sua lista específica de propriedades, existemalgumas propriedades importantes que são comuns à maioria delas:

• Name - especifica o nome pelo qual o controlo será identificado no programa

• Caption - especifica o texto apresentado pelo controlo

• BackColor - permite seleccionar a cor do fundo

• Enabled - controla a utilização do objecto pelo utilizador da interface

• Height - especifica a altura do controlo

• Width - especifica a sua largura

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

58

Page 59: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Conforme referido na Secção 4.3 na página 25 no ambiente de desenvolvimento doVBA encontram-se disponíveis diversos tipos de controlos: botões de comando (CommandButtons), etiquetas (Labels), caixas de texto (Text Boxes), quadros (Frames), botões deopção (Option Buttons), caixas de verificação (Check Boxes) e caixas de listagem (ListBoxes), entre outros.

8.3 Incorporação da Form na sub-rotina

Nesta fase há três aspectos a considerar:

1. Visualização da Form

2. Tratamento dos eventos que ocorram enquanto a Form estiver visível

3. Processamento dos resultados fornecidos pela Form

O 2o ponto, referente ao tratamento dos eventos, foi já discutido anteriormente. Osrestantes serão tratados nas secções seguintes.

8.3.1 Como visualizar e terminar uma Form

Para visualizar a UserForm usa-se o método Show :

1 Exemplo :2 MinhaForm .Show

Se, em alternativa, se pretender arrancar com a Form mas sem a visualizar nessemomento, usa-se a instrução Load :

1 Exemplo :2 Load MinhaForm

Quando se pretender tornar a Form visível, aplicar-se-á então o método Show.Após a sua utilização, quando uma Form deixar de ser necessária, deve-se utilizar a

instrução Unload para a desactivar:

1 Exemplo :2 Unload Me

No entanto, desactivar uma Form através da instrução Unload não implica que estadeixe de estar em memória. Para garantir a sua efectiva remoção, que se traduzirá nageração do evento Terminate, haverá que se usar a seguinte técnica:

1 Exemplo :2 Set MinhaForm = Nothing

8.3.2 Tratamento de eventos através de Event Handlers

Este tema foi já introduzido na Secção 4.1.3 na página 21. Pelo menos um Event Handlerdeve ser associado a um controlo instalado na form. Vamos agora considerar o exemplo deEvent Handler utilizando a instrução Unload Me e associado a um controlo (normalmente

59

Page 60: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

um botão de comando) presente na Form. Nesta instrução, a palavra Me indica ao VBAque a Form a desactivar será aquela a que o Event Handler diz respeito.

Um exemplo de um Event Handler que termine uma Form pode ser:

Listing 10: Handler do objecto cmdFechar para o evento click

1 Private Sub cmdFechar_Click ( )2 Dim op As Integer3 op = MsgBox( " Sa i r ?(Yes/No) " , vbYesNo + vbQuestion )4 I f op = vbYes Then5 Unload Me6 End I f7 End Sub

A sub-rotina acima vai especificar a reacção do botão de comando cmdFechar aoevento Click, neste caso apresentar uma Msg Box que confirme a intenção do utilizadorde fechar a Form. O tratamento de qualquer evento a ocorrer na Form, ou em qualquerdos controlos nela presentes, deverá basear-se num Event Handler que defina a respostaadequada.

Outro evento importante é o Change que ocorre sempre que se altera o conteúdo deobjectos como as Text Box. Na Secção 8.4 na página 63 encontra-se um exemplo de umEvent Handler associado a este tipo de evento.

8.3.3 Como recolher os resultados de uma Form

Uma UserForm é muitas vezes utilizada para pedir informação ao utilizador. Nesse caso,será necessário recolher os dados introduzidos ou as opções seleccionadas nos controlosapropriados.

Para tal é preciso aceder às propriedades Value dos diversos controlos existentes naForm e copiar os seus valores actuais para células da folha de cálculo.

O conteúdo da propriedade Value nas principais classes de controlos encontra-se re-sumida na seguinte tabela:

Classe ConteúdoCheckBox True ou False conforme esteja ou não activada

OptionButton True ou False conforme esteja ou não activadaListBox A posição da linha seleccionadaTextBox O conteúdo da TextBox (pode-se também usar a propriedade Text)TabStrip Um inteiro indicando qual a Tab que está activa

Note-se que nas List Boxes em VBA a 1alinha tem a posição 1, ao contrário do quese passa em Visual Basic, em que começa na posição 0.

8.3.4 Exemplo de aplicação

Vamos finalmente aplicar estes conceitos e técnicas na construção e integração de umaUserForm (descrita na Figura 32 na página seguinte) que permita a introdução conjunta

60

Page 61: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

dos dados de um aluno (Nome, Número e Curso) sem necessidade de recorrer a três InputBoxes separadas.

Esta UserForm conterá duas Text Boxes para inserção do Nome e Número do aluno euma Combo Box para selecção do seu Curso. Uma Combo Box é um controlo semelhantea uma List Box em que a lista está normalmente invisível, só aparecendo quando o camposuperior é activado. Aplicam-se-lhe os mesmos métodos da classe ListBox.

Listing 11: Exemplo de sub-rotina de invocação de uma UserForm

1 Public Sub testUserFormInput ( )2 usrFrmInput .Show3 Set usrFrmInput = Nothing4 End Sub

O macro da Listagem 11 na página 60 chama a UserForm com o nome usrFrmInput eremove-a de memória quando ela termine o seu trabalho. Para facilitar a sua invocação,é conveniente associar ao macro uma combinação de teclas específica, usando uma dastécnicas já aprendidas (ver parte final da Secção 2.6).

Listing 12: Exemplo de sub-rotina de inicialização de uma UserForm

1 Private Sub UserForm_In i t ia l i z e ( )2 cmbCursos .AddItem " C i v i l "3 cmbCursos .AddItem " In fo rmat i ca "4 cmbCursos .AddItem " E l e c t r o t e cn i a "5 cmbCursos .AddItem "Geotecnia "6 cmbCursos .AddItem "Quimica"7 cmbCursos .AddItem " Instrumentacao ␣Medica"8 End Sub

Figura 32: A UserForm para Entrada Múltipla de Dados

61

Page 62: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

Esta sub-rotina especial, que é executada automaticamente quando a UserForm ar-ranca, trata de inicializar a Combo Box "cmbCursos" com os nomes dos diferentes cursosda escola.

Listing 13: Handler do objecto cmdFechar para o evento Click

1 Private Sub cmdFechar_Click ( )2 With Worksheets (4 )3 . [ H5 ] = txtNome . Value4 . [ I5 ] = txtNum . Value5 . [ J5 ] = cmbCursos . Text6 End With7 Unload Me8 End Sub

Este Event Handler está associado ao botão cmdFechar e é chamado quando sobreele ocorre o evento Click. Antes de fechar a UserForm usando Unload, copia o conteúdodas duas Text Box e o da linha seleccionada da Combo Box para três células contíguasda folha de cálculo.

8.4 Exemplo de aplicação mais elaborado

Neste exemplo mais elaborado vamos introduzir o controlo Tabstrip existente no VBA.Este objecto permite a apresentação de diferentes conjuntos de valores mediante a selecçãode diferentes separadores ("tabs"). Na Figura 33 na página 62 pode-se encontrar umexemplo de um objecto deste tipo.

Figura 33: Objecto da classe Tabstrip

Numa Tabstrip é usual inserirem-se outros controlos, um pouco como se faria numamini-Form ou num quadro. No exemplo da figura, encontram-se três TextBox.

Conforme referido na Secção 4.1, para que um controlo possa reagir a acções pro-vocadas pelo utilizador, como o "clicar" do rato, é preciso que o programador crie sub-

62

Page 63: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

programas especiais, chamados Event Handlers e que esses sub-programas sejam associ-ados aos controlos respectivos.

Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitemespecificar o comportamento de controlos em face de certos eventos. Em 1o lugar,apresentar-se-á o Event Handler da form "UserForm2" para o evento Initialize, que ocorrequando a form é criada após o arranque do programa:

Listing 14: Sub-rotina de inicialização da UserForm

1 Private Sub UserForm_In i t ia l i z e ( )2 With TabStrip13 . Tabs ( 0 ) . Caption = " C i v i l "4 . Tabs ( 1 ) . Caption = " In fo rmat i ca "5 . Tabs .Add " E l e c t r o t e cn i a "6 End With7 With Worksheets (4 )8 txtNumAlunos . Text = . [ D5 ]9 txtPercAprov . Text = . [ D6 ] ∗ 100

10 txtMedia . Text = . [ D7 ]11 End With12 End Sub

Este procedimento vai inicializar os dois separadores do controlo Tabstrip1 com queele é criado por defeito, mudando-lhe os nomes para "Civil" e "Informática". De seguida,acrescenta um terceiro separador e dá-lhe o nome "Electrotecnia". Por fim, são atribuídosa cada uma das TextBox contidas na Tabstrip1 os conteúdos das três células da folha decálculo referentes ao curso referente ao 1o separador.

O próximo procedimento é o Event Handler do controlo Tabstrip1 para o eventoChange que ocorre sempre que alguma alteração ocorre nesse controlo, concretamente,uma mudança de separador activo.

Listing 15: Handler associado ao objecto Tabstrip1 para o evento Change

1 Private Sub TabStrip1_Change ( )2 Dim v As Integer3 With Worksheets (4 )4 v = TabStrip1 . Value5 I f v = 0 Then6 txtNumAlunos = . [ D5 ]7 txtPercAprov = . [ D6 ] ∗ 1008 txtMedia = . [ D7 ]9 ElseIf v = 1 Then

10 txtNumAlunos = . [ E5 ]11 txtPercAprov = . [ E6 ] ∗ 10012 txtMedia = . [ E7 ]13 Else14 txtNumAlunos = . [ F5 ]15 txtPercAprov = . [ F6 ] ∗ 100

63

Page 64: Texto Introdutório - DEIasilva/page14/page16/assets/Program… · Figura2: JaneladeGestãodeMacros Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar

16 txtMedia = . [ F7 ]17 End I f18 End With19 End Sub

A propriedade Value dos objectos Tabstrip contem um valor numérico inteiro quetraduz qual o separador que está activo. Em função do valor recolhido na variável v, aestrutura condicional imbricada If...Then...Else irá escolher o conjunto de valores corres-pondente.

9 Notas finaisParte da estrutura e alguns dos exemplos apresentados foram inspirados no livro de PaulMcFreddies[1]. Foram ainda reutilizados e adaptados materiais contidos na Sebenta deIntrodução à Computação da minha autoria[2].

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

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

64