• Nenhum resultado encontrado

Programação em VBA Texto Introdutório

N/A
N/A
Protected

Academic year: 2021

Share "Programação em VBA Texto Introdutório"

Copied!
89
0
0

Texto

(1)

Programação em VBA

Texto Introdutório

versão 2

António Silva

DEI-Isep

2009-12-30

(2)
(3)

Conteúdo

1 Introdução 9

2 Conceitos Básicos 9

2.1 O que é um Macro? . . . 9

2.2 Técnicas de construção dum Macro . . . 10

2.3 Gravação de um Macro . . . 10

2.4 A escrita de um Macro . . . 12

2.5 O editor de VBA . . . 12

2.6 Criação de um Macro . . . 13

3 Variáveis e Tipos de Dados 16 3.1 Conceito de variável . . . 16

3.2 Criação das variáveis . . . 16

3.3 Âmbito de uma variável . . . 18

3.4 Tipos de Dados . . . 20

3.5 A operação de Atribuição . . . 20

3.6 O uso de constantes . . . 21

4 Como trabalhar com Objectos 22 4.1 Propriedades, Métodos e Eventos . . . 23

4.1.1 Propriedades . . . 23

4.1.2 Métodos . . . 24

4.1.3 Eventos . . . 25

4.2 Os objectos do Excel mais comuns . . . 27

4.2.1 Como trabalhar com as propriedades dos objectos Excel . . . 27

4.2.2 Como aplicar métodos aos objectos . . . 28

4.3 Objectos gráficos . . . 29 4.3.1 MsgBox . . . 29 4.3.2 InputBox . . . 31 4.3.3 Forms . . . 32 4.3.4 Botões de Comando . . . 32 4.3.5 Rótulos . . . 32 4.3.6 Caixas de Texto . . . 33 4.3.7 Botões de Opção . . . 34 4.3.8 Caixas de Verificação . . . 34 4.3.9 Quadros (Frames) . . . 35 4.3.10 Caixas de Listagem . . . 36

4.4 Interface gráfica sem uma Form . . . 37

5 Estruturas de controlo do programa 39 5.1 Estruturas de controlo condicional . . . 39

5.1.1 If...Then...Else . . . 39

5.1.2 If...Then . . . 40

5.1.3 Estruturas condicionais embutidas . . . 42

(4)

5.2.1 Estruturas de Controlo Do...Loop . . . 44

5.2.2 Ciclos controlados por contador . . . 45

5.2.3 Exemplo integrador . . . 47

5.2.4 Ciclos controlados por sentinela . . . 49

5.2.5 Estrutura de Controlo For..To..Next . . . 50

5.2.6 Estruturas de controlo repetitivo imbricadas . . . 52

6 Variáveis indexadas - vectores e matrizes 54 6.1 Declaração estática de vectores . . . 55

6.2 Declaração dinâmica de vectores . . . 56

6.3 Processamento de vectores . . . 56

6.4 Matrizes . . . 59

7 Funções e Procedimentos 62 7.1 Funções . . . 62

7.2 Exemplos de funções criadas pelo programador . . . 63

7.3 Passagem de parâmetros ByVal . . . 66

7.4 Procedimentos . . . 67

7.5 Passagem de parâmetros ByRef . . . 68

7.6 Como aceder às funções standard do Excel . . . 69

8 Programação do Excel usando VBA 71 8.1 Trabalhar com objectos Workbook . . . 71

8.2 Trabalhar com objectos Worksheet . . . 71

8.2.1 Propriedades de Worksheet . . . 71

8.2.2 Métodos de Worksheet . . . 72

8.3 Trabalhar com objectos Range . . . 73

9 Adicionando uma interface gráfica 76 9.1 Instalação da Form . . . 76

9.2 Instalação dos Controlos . . . 77

9.3 Associação da Form ao procedimento . . . 77

9.3.1 Como visualizar e terminar uma Form . . . 77

9.3.2 Tratamento de eventos através de Event Handlers . . . 78

9.3.3 Como recolher os resultados de uma Form . . . 78

9.3.4 Exemplo de aplicação . . . 79

9.4 Exemplo de aplicação mais elaborado . . . 80

10 Manipulação de texto 83 10.1 Funções de manipulação de strings . . . 83

10.1.1 Trim, LTrim e RTrim . . . 83

10.1.2 Len . . . 83 10.1.3 Left, Right . . . 83 10.1.4 Mid . . . 84 10.1.5 InStr . . . 84 10.1.6 UCase, LCase . . . 85 10.2 Algoritmos . . . 85

(5)

10.2.1 Separação duma string em caracteres . . . 85 10.2.2 Divisão de uma frase em palavras . . . 86

(6)

Lista de Figuras

1 Janela de invocação do ambiente de Gravação de Macros . . . 10

2 Janela de Gestão de Macros . . . 11

3 Barra de Ferramentas de VBA . . . 11

4 Editor integrado do VBA . . . 12

5 Criação de novo Módulo . . . 13

6 Diferentes tipos de dados e o seu armazenamento em memória . . . 17

7 Como forçar a declaração explícita automaticamente . . . 18

8 Uma Form e vários Controlos . . . 22

9 Janela de Propriedades . . . 24

10 Lista de eventos disponíveis . . . 25

11 Objectos e Eventos . . . 26

12 Exemplo de MsgBox . . . 29

13 Exemplo de InputBox . . . 31

14 Vários optionButton agrupados numa frame . . . 34

15 Vários checkBox agrupadas numa frame . . . 35

16 Uma Frame agrupando três botões de comando . . . 35

17 Exemplo de listBox . . . 36

18 Interface construída directamente na folha de cálculo . . . 38

19 Estrutura de controlo condicional If...Then...Else . . . 39

20 Estrutura de controlo condicional If...Then . . . 40

21 Estruturas de controlo condicional imbricadas . . . 43

22 Estrutura de controlo repetitivo Do...While . . . 44

23 Estrutura de controlo repetitivo Do...Until . . . 45

24 Ciclos controlados por contador . . . 46

25 Exemplo integrador - Interface . . . 47

26 Exemplo integrador - Código . . . 48

27 Ciclos controlados por sentinela . . . 50

28 Exemplo de Ciclos Imbricados . . . 52

29 Um vector é uma variável múltipla . . . 54

30 Um exemplo de vector de strings . . . 55

31 Porquê usar ciclos para processar vectores? . . . 57

32 Ciclos encadeados para processar um vector bidimensional . . . 59

33 Funções como caixas pretas . . . 63

34 Utilização da função margemLucro numa fórmula . . . 64

35 Análise passo a passo da expressão de cálculo das combinações . . . 65

36 Comunicação da função com o programa que a invoca . . . 66

37 Resultados do código da Listagem 13 na página 68 . . . 69

38 Exemplos de utilização da propriedade Offset . . . 75

39 Criação de uma Form no VBA . . . 76

40 A UserForm para Entrada Múltipla de Dados . . . 80

(7)

Lista de Tabelas

1 Tipos de dados suportados pelo VBA . . . 20 2 Propriedades mais comuns dos objectos gráficos VBA . . . 23 3 Valores de configuração das características de uma Caixa de Mensagem . 30 4 Valores devolvidos por uma Caixa de Mensagem . . . 30

(8)

Listings

1 VerificaValor - exemplo de macro . . . 14

2 verificaGama - exemplo de macro . . . 14

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

4 FormataBordo - exemplo de sub-rotina usando For..Next . . . 51

5 Exemplo usando Ciclos Imbricados . . . 53

6 Exemplo de Sub-rotina usando Ciclos Imbricados . . . 53

7 Exemplo de processamento de um vector . . . 57

8 Outro exemplo de processamento de um vector . . . 58

9 Soma de matrizes . . . 60

10 Função mLucro . . . 63

11 Função factorial . . . 64

12 Programa de cálculo de Combinações . . . 65

13 Diferentes resultados na passagem por valor e por referência . . . 68

14 Sub-rotina InsereLinhas . . . 74

15 Handler do objecto cmdFechar para o evento click . . . 78

16 Exemplo de sub-rotina de invocação de uma UserForm . . . 79

17 Exemplo de sub-rotina de inicialização de uma UserForm . . . 79

18 Handler do objecto cmdFechar para o evento Click . . . 80

19 Sub-rotina de inicialização da UserForm . . . 81

20 Handler associado ao objecto Tabstrip1 para o evento Change . . . 82

21 Separação de string em caracteres - 1o Método . . . . 85

22 Separação de string em caracteres - 2o Método . . . . 86

(9)

1

Introdução

Este texto tem como objectivo apoiar o ensino das técnicas de programação de com-putadores, utilizando, como ambiente de aplicação, programas como o gestor de folhas de cálculo Excel. Destina-se, assim, aos alunos que já possuem alguns conhecimentos da utilização e funcionamento desta aplicação. Concretamente, presume-se que estão já familiarizados com os conceitos de folha de cálculo, de livro de trabalho, de fórmulas e de funções standard.

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

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

2

Conceitos Básicos

O VBA constitui uma ferramenta poderosa nas mãos de programadores experimentados mas pode, ao mesmo tempo, ser muito útil a um utilizador normal, 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 que repetir uma determinada tarefa uma série de vezes de seguida. Seja escrever ou formatar um certo texto, seja executar uma série de comandos ou escolher opções de menus, seja ainda realizar a formatação complexa de um documento, são inúmeras as ocasiões em que dava jeito poder automatizar essas tarefas repetitivas.

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

2.1

O que é um Macro?

Um macro contem uma lista das instruções a realizar para executar uma determinada tarefa. No fundo, é um programa escrito em VBA, que indica a uma aplicação como o Excel quais os passos a dar para atingir um objectivo específico. Pode-se dizer que um macro 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 a opção de menu Close. Um macro escrito em VBA, usará a seguinte instrução para obter o mesmo efeito:

ActiveWindow.Close

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

(10)

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 de forma explícita, ou seja, detalhando especificamente as instruções VBA que o compõem. Sobretudo quando os macros são simples, é muitas vezes mais prático criá-los de forma automá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 fazer para conseguir obter o resultado pretendido. O utilizador indica ao programa que se vai entrar num modo de gravação do macro e inicia a execução da sequência de acções que normalmente teria que executar. Quando chega ao fim dessa sequência, indica ao programa que a gravação terminou. Após ter atribuído a essa sequência uma combinação de teclas especial, esse macro estará pronto a ser executado, substituindo assim o conjunto de acções que anteriormente seriam necessárias. Tudo se passa como se estivéssemos a ensinar a aplicação pelo exemplo.

Se se investigar, no entanto, o conteúdo desse macro, verificar-se-á que ele é composto precisamente por instruções escritas em VBA, sendo que a cada acção ou comando da aplicaçã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 num editor de texto apropriado. É essa, de facto, a forma de criar um macro quando o seu âmbito é algo não trivial1.

2.3

Gravação de um Macro

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

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

Para gravar um macro que seja capaz de efectuar essas acções, haverá que invocar o modo 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 o nome do macro, a localização em que será armazenado, uma descrição das suas funções

(11)

e ainda a combinação de teclas (Shortcut key) que será utilizada para arrancar com o macro, uma vez este construído.

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

Uma vez tal realizado, esse macro passará a estar disponível mediante a invocação da 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 mesma sequência de acções que tínhamos efectuado manualmente.

Figura 2: Janela de Gestão de Macros

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

Para facilitar o acesso às facilidades de gravação e edição de macros, será conveniente tornar 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".

(12)

2.4

A escrita de um Macro

Ensinar pelo exemplo ao Excel como fazer as coisas é um método expedito de construir um macro, mas tem as suas limitações. Já que um macro não é mais que um programa escrito em VBA, porque não tratá-lo como tal e aceder ao seu código, alterando-o de forma a melhorar a sua eficiência ou a corrigir problemas. E já agora, porque não criá-los de raiz, aproveitando todo o poder duma linguagem como o VBA?

2.5

O editor de VBA

Para aceder ao editor especializado de Visual Basic (Figura 4), que se encontra integrado no 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 de Integrated Development Environment (IDE) ou Ambiente de Desenvolvimento Inte-grado e é semelhante à aplicação autónoma usada para o desenvolvimento de programas em Visual Basic.

Figura 4: Editor integrado do VBA

Do lado esquerdo na Figura 4 podem-se ver duas janelas, a primeira das quais é designada por Explorador de Projectos e que serve para mostrar o conteúdo do projecto VBA actual. Um projecto em VBA inclui um ficheiro duma aplicação Office (como, por

(13)

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

exemplo, uma folha de cálculo do Excel) e todos os ficheiros VBA associados, incluindo os próprios macros e eventuais user forms (janelas de interface próprias utilizadas pelos macros2).

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 Explorador de Projectos, será criada uma janela nova onde será possível escrever o código que constitui o novo macro. Se já existir algum módulo criado, bastará seleccionar o módulo pretendido no explorador de projectos, posicionar o cursor na janela do editor correspondente a esse módulo, numa área fora de qualquer macro já existente, e seleccionar a opção de menu "Insert/Procedure". Aparecerá uma janela própria (Figura 5) onde será possível dar 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 procedimento3) e qual o âmbito da sua utilização (privada ou pública, ou seja, limitada ou não ao ficheiro actual). Após premir o botão aparecerá na janela do editor o esqueleto do novo macro, apenas com o cabeçalho e o delimitador final.

2.6

Criação de um Macro

Está na hora de construir o primeiro macro em VBA. Suponhamos que se pretende criar um macro que verifique se o valor presente numa determinada célula é superior a um dado limite e que, caso seja, disso notifique o utilizador. A sub-rotina em que esse macro deverá assentar poderá ter o conteúdo apresentado na Listagem 1 na próxima página.

Não nos vamos de momento preocupar com os detalhes do código que constitui o macro. Basta verificar, em 1o lugar, que é constituído por uma linha de cabeçalho que

especifica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seu

2Sobre o assunto, ver Secção 9.

(14)

nome (verificaValor). O corpo do macro é composto pela estrutura de controle condici-onal (If...Then4) que vai verificar se o conteúdo da célula B25 é ou não maior que o valor

200. Caso essa condição seja verdadeira, o macro apresentará uma mensagem no ecran dizendo que o valor máximo foi excedido. Finalmente, o macro é terminado com uma linha contendo "End Sub".

Listing 1: VerificaValor - exemplo de macro

1 Public Sub v e r i f i c a V a l o r ( ) 2 I f C e l l s ( 2 , 2 ) > 100 Then

3 MsgBox " V a l o r ␣maximo␣ e x c e d i d o ! " 4 End I f

5 End Sub

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

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

Listing 2: verificaGama - exemplo de macro

1 Public Sub v e r i f i c a G a m a ( )

2 Dim i As Integer , c As Integer 3 c = 0 4 For i = 1 To 5 5 I f C e l l s ( i , 3 ) > 100 Then 6 c = c + 1 7 End I f 8 Next 9 I f c > 2 Then 10 MsgBox c & " ␣ v a l o r e s ␣ s u p e r i o r e s ␣ ao ␣ l i m i t e ! " 11 End I f 12 End Sub

A verificação é agora repetida em todas as células de C1 a C5 graças aos serviços da estrutura de controlo repetitivo For...To...Next6 que executará 5 vezes as instruções

contidas nas linhas 5 a 7. Para além de verificar o conteúdo da célula em análise, é ainda actualizado um contador, baseado na variável c (ver linha 6), sempre que o valor contido nessa célula ultrapasse o limite. Só quando o valor desse contador for maior que 2 será gerada a mensagem de alarme.

4Ver Secção 5.1.2 na página 40.

5Cells(2,2) refere-se à célula B2 (2a coluna, 2a linha) 6Ver Secção 5.2.5 na página 50.

(15)

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 e certamente impossível executando comandos e seleccionando menus do Excel.

A um macro criado usando directamente o VBA pode também ser associada uma combinação de teclas que facilite o seu acesso. Isso pode ser feito através do botão Options na Janela de Gestão de Macros, invocada mediante a combinação de teclas ALT-F8.

(16)

3

Variáveis e Tipos de Dados

A informação processada por um macro pode ser de diferente natureza e existir em diferentes formatos. Genericamente um programa pode utilizar, entre outras, informação numérica e informação chamada alfa-numérica, ou seja texto. A linguagem VBA consegue lidar com informação de diversos tipos, que detalharemos mais adiante na Secção 3.4 na página 20.

3.1

Conceito de variável

Uma variável é uma localização de memória em que a informação pode ser guardada de modo a ser usada por um macro. Cada variável é essencialmente caracterizada pelo seu nome e pelo seu tipo, ou seja, o tipo de dados que pode armazenar7. Como é sugerido

pelo próprio nome, o conteúdo de uma variável pode mudar durante a execução do macro. Existem algumas regras governando a escolha do nome 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 um determinado tipo não está preparada para armazenar dados de um tipo diferente. A razão para 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 8, para guardar um número real podem ser necessários 8 bytes (ou mesmo mais,

dependendo da precisão requerida). A Figura 6 na página seguinte ilustra graficamente esta realidade. Enquanto que uma idade (valor inteiro) pôde ser guardada numa variável do tipo integer, dimensionada para armazenar valores inteiros, já um peso (valor real) teve que ser guardado numa variável do tipo single, com a dimensão adequada a armazenar valores reais de uma dada precisão9.

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-lhe um nome e reservar em memória o espaço necessário para que ela possa guardar o tipo de dados para o qual está a ser criada. O acto de declarar a variável informa o VBA àcerca

7Na Secção 3.3 na página 18 é referida outra característica das variáveis, o seu âmbito, que, em certas

situaçoes, faz sentido considerar.

8Para 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.

9É possível armazenar um valor inteiro dentro de uma variável dimensionada para guardar valores

reais. O contrário é que já não é verdadeiro: ocorreria obrigatoriamente a truncagem do valor real, perdendo-se a parte fraccionária.

(17)

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

do 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ção deve, pois, preceder a sua utilização. Desde que se siga esta regra, é possível inserir declarações em qualquer ponto do macro. No entanto, é boa prática agrupar todas as declarações necessárias num bloco a colocar no início, para mais fácil manutenção do programa.

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

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 simples10).

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 VBA encarregar-se-á de criar automaticamente a variável do tipo pretendido.

Esta segunda forma de declarar variáveis tem, a despeito da sua simplicidade, um

(18)

problema grave: é possível, por distracção, criar uma variável nova indesejada, quando o que se pretendia era apenas escrever o nome de uma variável já existente. Suponha, por exemplo, que havia criado uma variável "Distancia" mediante a instrução11:

Distancia=1260

Como é a primeira vez que o VBA encontra esta palavra ("Distancia"), partirá do princí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 poder guardar 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 de variáveis é, pois, utilizar apenas declarações explícitas, e instruir o VBA para não aceitar declarações implícitas, gerando uma mensagem de erro apropriada. Para tal, deverá ser acrescentada 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"no sub-menu Options do menu Tools, conforme pode ser observado na Figura 7.

3.3

Âmbito de uma variável

Dissemos na Secção 3.1 na página 16 que uma variável se caracterizava pelo seu nome e pelo tipo de dados que estava preparada para guardar. Isso é rigorosamente verdade se considerarmos apenas variáveis contidas num único módulo. Mas se tivermos em conta que vários módulos podem existir, cada um com as suas variáveis, e ainda que as

(19)

variáveis podem ser declaradas fora de qualquer módulo, então teremos que adicionar uma característica adicional à definição de uma variável: o seu âmbito.

Por âmbito entende-se a zona do programa em que a variável é conhecida, ou seja, em que pode ser utilizada. Esta zona está directamente relacionada com o local em que a variável foi declarada. Para esclarecer melhor este ponto, atente-se na Listagem 3.3, em que podemos ver duas sub-rotinas, sub1 e sub2, em que são criadas e utilizadas diversas variáveis, e ainda uma variável n que foi declarada fora de qualquer sub-rotina.

1 Dim n As integer 2 . . .

3

4 Private Sub sub1 ( )

5 Dim i As integer , x As s i n g l e 6 7 i = 10 8 n = 100 9 . . . 10 End Sub 11

12 Private Sub sub2 ( )

13 Dim i As integer , c As integer 14

15 c = n ∗ 10 + i 16 . . .

17 End Sub

Na sub-rotina sub1 é usada quer a variável i (até aqui, nada de mais já que essa variável foi criada na própria sub-rotina) quer a variável n. Ora, esta segunda variável não lhe pertence, não foi declarada dentro de si. Tal é possível, porque, sendo exterior à sub-rotina, foi declarada como variável dita global, fora de qualquer sub-rotina e, como tal, acessível por qualquer módulo que a ela queira aceder. Por seu lado, a variável i diz-se local já que o seu âmbito se restringe à sub-rotina em que foi declarada.

Na instrução da linha 15 da listagem, contida na sub-rotina sub2, são acediadas três variáveis: c pertencendo à própria sub-rotina, a variável global n e a variável i. A utilização da variável global já foi discutida. Vale a pena, porém, discutir a utilização da variável i. Esta variável, se bem que tenha o mesmo nome de outra pertencendo a sub1, é uma entidade diferente. A partilha do nome é mera coincidência. Assim sendo, e não tendo sido guardado previamente qualquer valor na variável i dentro de sub2, o seu valor por defeito será zero, pelo que o resultado da expressão armazenado em c será ( 10 x 100 + 0 = 1000 ).

Impõe-se uma alerta relativamente à utilização de variáveis globais. O facto de po-derem ser acedidas indistintamente por qualquer módulo torna a sua utilização muito flexível e, em certos caso, insubstituível. No entanto, especial atenção deve ser prestada a eventuais interacções indesejáveis entre módulos. Se muitas entidades acederem a uma mesma variável global, modificando o seu conteúdo, pode tornar-se difícil detectar qual o módulo responsável por valores anómalos que possam surgir nessa variável.

(20)

3.4

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 na Tabela 1.

Tipo Descrição

Integer Inteiro simples, usado para representar inteiros entre -32768 e 32767 Long Inteiro longo, ou seja, compreendido entre -2.147.483.648 e

2.147.483.647

Single Real representado com precisão simples, com valores negativos compre-endidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca de 1,4E-45 e 3,4E38

Double Real representado com precisão dupla, usado para representar números reais 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 apresentadas 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

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

3.5

A operação de Atribuição

A operação de Atribuição permite guardar um dado numa variável, ou seja, atribuir-lhe um 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. Valor pode ser um valor constante ou o conteúdo de outra variável. Neste segundo caso, a atribuição consistirá na cópia do conteúdo de uma variável para outra do mesmo tipo. A instrução seguinte copia o valor contido na variável idade para a variável temp (partimos do princí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 valor devolvido por uma função. Atente-se nos seguintes exemplos:

(21)

total = peso1 + peso2 resultado = sqrt(2+peso)

No 1o exemplo, o VBA resolverá em primeiro lugar a expressão à direita do operador de 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 pela função standard do VBA sqrt(). Esta função calcula a raiz quadrada do valor ou expressão que se encontrar dentro dos seus parêntesis. Assim sendo, o VBA calculará em 1o lugar o resultado da expressão 2 +

peso, fornecerá esse valor à função sqrt(), após o que copiará o valor fornecido 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 variável, substituirá o valor nela contido pelo novo valor. Convem, assim, lembrar que nesta operação o fluxo da informação se faz sempre da direita para a esquerda e não o contrário.

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

3.6

O uso de constantes

Uma constante consiste num nome que é dado a um valor numérico ou a uma cadeia de caracteres, e que pode ser usado dentro do programa na vez desses valores. Funciona como uma espécie de sinónimo. A utilização de uma constante, em substituição do valor que representa, justifica-se pelo seguinte facto: se um dado valor constante fôr utilizado muitas vezes ao longo dum programa, caso ocorra a necessidade de o modificar, seremos forçados a corrigir manualmente todas as ocorrências desse valor, correndo, além disso, o risco 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 em todas as ocorrências dessa constante no decurso do programa. A sintaxe da definição de constantes é 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 em vários cálculos, faz sentido definir esse factor como constante e usar o seu nome em vez dele:

Const Factor as Single = 1.347

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

(22)

4

Como trabalhar com Objectos

Para 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 numa gama de células, vai ser preciso interagir com Objectos. Genericamente, pode dizer-se que um objecto é algo que pode ser visto, tocado, sentido. Em VBA, considera-se um objecto tudo aquilo que pode ser visto e que pode ser manipulado de alguma forma.

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

Na Figura 8 podem ser observados vários objectos instalados numa form: uma caixa de texto, dois botões de comando, vários rótulos ou etiquetas e uma caixa de verificação. Através de elementos como estes é 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 dos objectos;

• 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 determinado

evento ocorra nesse objecto.

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

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

(23)

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

• Os seus "eventos" são ocorrências que provocarão respostas automáticas por parte do automóvel, como seja, um alarme que dispara (resposta) caso desliguemos o carro 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 traduzem as suas características físicas e formas de com-portamento. Como na vida real, cada objecto possui características próprias ou propri-edades, que podem ser quantificadas ou especificadas, como sejam as suas dimensões ou o tipo de letra que usa. A cada objecto está associada uma lista de propriedades a que é possível atribuir valores, determinando a sua aparência, localização e outros detalhes. Pode-se então dizer que as propriedades de um objecto definem a forma como ele se apresenta ou se comporta.

Diversas classes de objectos podem partilhar a mesma propriedade. Essa propriedade, no entanto, pode afectar esses objectos de forma diferente.

Caption 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 é identificado

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

Top 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 objecto Width Define a largura do objecto

Font Especifica qual o tipo de letra a usar nos controlos Visible 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 mais importantes e que são comuns à maior parte dos objectos gráficos.

No caso dos objectos gráficos, os valores que as propriedades de um dado objecto tomam podem ser consultados ou modificados usando a janela de propriedades (Figura 9 na próxima página). Nessa janela aparece a lista de propriedades do objecto que estiver nesse momento seleccionado . Nela pode observar, entre outras, algumas das propriedades referidas na lista acima (Caption, Height e Font ) e os respectivos valores no momento.

(24)

Figura 9: Janela de Propriedades

Quando num programa pretendemos referir-nos a uma propriedade de um objecto, utilizamos a seguinte sintaxe:

Objecto.Propriedade

Por exemplo, se nos quisermos referir à propriedade que controla o tipo de letra (font ) da célula activa duma folha de cálculo, usaremos

ActiveCell.Font.Name

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 processo de salvaguarda do conteúdo do documento activo num determinado ficheiro. Aplicar o método Clear a um objecto da classe ListBox (tratada na Secção 4.3.10 na página 36) terá como consequência a eliminação de todas as linhas nele contidas. A cada classe de objectos é possível aplicar um determinado conjunto de métodos.

Para vermos como um método é aplicado a um objecto, vamos considerar o objecto Worksheet, que representa uma folha de cálculo do Excel. Se pretendermos que o nosso macro 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"para a posição imediatamente a seguir à folha "Dados 2008", o comando a inserir no macro será:

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

(25)

conjunto de folhas de cálculo contidas no Livro de Trabalho. Este conjunto de folhas é representado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se à folha de cálculo com o nome "Dados 2009".

Outro método útil é o que permite referenciar uma célula individual pertencendo a um objecto do tipo "Range"(gama de células) ou Worksheet. Trata-se do método Cells, com a seguinte sintaxe:

Objecto.Cells(Linha,Coluna)

Se a indicação de Objecto for omitida, partir-se-á do princípio que nos referimos à folha de cálculo activa.

A instrução seguinte, por exemplo, copia o valor contido na célula C2 para a variável temp:

temp = Cells(2,3)

Outra forma de referir uma célula individual é usar a notação utilizada pelo Excel para referenciar células, envolvendo-a em parêntesis rectos. O exemplo anterior ficaria assim:

temp = [C2]

4.1.3 Eventos

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

Para que um objecto possa reagir a um dado evento deverá existir, previamente pro-gramado, um procedimento especial, chamado event handler (tratador de eventos), que vai especificar o que fazer caso esse evento ocorra. Sem isso, o objecto detectará esse acontecimento mas não saberá o que fazer. Nenhuma resposta será produzida.

Figura 10: Lista de eventos disponíveis

(26)

à direita, pode ser acedida a lista de eventos disponíveis para o objecto Worksheet12. Seleccionando um dos eventos, será possível construir o procedimento event handler que permita ao objecto Worksheet reagir a esse evento. O cabeçalho e o delimitador final são criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador a inclusão das instruções necessárias. Na figura são referidos vários eventos que podem ocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folha de cálculo se torna activa, ou o Change que é desencadeado por qualquer alteração ao seu conteúdo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estar preparada para reagir a diferentes eventos, desde que possua event handlers específicos para esses eventos.

Figura 11: Objectos e Eventos

Para tentar esclarecer melhor o conceito de evento e a questão de como organizar a resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenas objectos gráficos dispostos numa form. Repare-se na Figura 11: o que se pretende aqui é um macro capaz de verificar se um dado número inteiro, introduzido pelo 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 agora debruçar sobre os

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

(27)

detalhes do código que o event handler deverá conter para produzir o efeito desejado. Preocupemo-nos, de momento, apenas com as interacções entre as várias entidades que intervêm no processo.

Como é visível na Figura 11 na página precedente, existem na interface vários objectos (chamados controlos). Entre eles, têm particular interesse para esta discussão a caixa de texto txt1, o rótulo lbl2 e o botão de comando command1. Quando o utilizador pretende utilizar o macro, uma vez este invocado, deverá introduzir o número a testar em txt1 e pressionar ("clicar") o botão command1. Quando isso acontece, diz-se que ocorreu um evento click no botão command1. Se esse botão não dispuser de nenhum event handler para lidar com esse tipo de evento, nada se passará. No entanto, se se tiver previamente associado a esse objecto (command1 ) um event handler adequado, o objecto será já capaz de responder ao evento e produzir o resultado desejado. Neste caso, o resultado deverá ser efectuar os cálculos necessários para concluir se o número introduzido é ou não primo e 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ão lhe possamos tocar, podemos claramente vê-lo e interagir com ele de múltiplas formas, seja alterando o conteúdo de células (no caso do Excel), seja mudando formatos ou inserindo linhas e colunas. Por sua vez, todos estes elementos são, eles também, objectos. Nas aplicações Office, os objectos estão organizados de forma hierárquica. O objecto mais geral é o Application, e dentro dele existem múltiplos objectos de nível progressivamente inferior.

4.2.1 Como trabalhar com as propriedades dos objectos Excel

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

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, de momento, a trabalhar. No caso do Excel, podemos ainda referir-nos, por exemplo, à propriedade ActiveSheet para designar a folha de cálculo em que se está a trabalhar ou a ActiveCell para nos referirmos à célula actualmente seleccionada.

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

Application.ActiveWindow.ActiveCell.Font.Name

Esta descrição ilustra a relação hierárquica existente entre os objectos do Excel. Na prática, quando nos estamos a referir a uma propriedade da janela activa da aplicação como seja a ActiveCell, não precisamos, no entanto, de referir que pertence à

(28)

ActiveWindow e à Application. Podemos omitir esses detalhes e apenas escrever:

ActiveCell.Font.Name

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

ActiveCell.Font.Name = "Helvetica"

Note-se que estamos aqui a utilizar uma propriedade como uma variável cujo conteúdo pode ser modificado. De facto, uma propriedade pode ser vista como uma variável especial associada a um dado objecto.

Se, ao contrário, quisermos obter o valor de uma dada propriedade, a instrução a usar será 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 24, que os métodos de uma classe de objectos descrevem as acções que podemos executar sobre eles ou, por outras palavras, aquilo que podemos fazer com eles. Na sua forma mais simples, a sintaxe usada para aplicar um método a um objecto é similar à usada para trabalhar com as suas prorpiedades:

Objecto.Método

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

Worksheets("Leituras").Activate

Estamos aqui a aplicar o método Activate ao objecto Worksheets("Leituras"), o que 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 poderem executar 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")

(29)

Muitas vezes, os argumentos que se podem fornecer a um método são opcionais. Por exemplo, a instrução abaixo adiciona (insere) uma nova folha de cálculo imediatamente antes da folha com o nome "Dados_Jan":

Worksheets.Add Before:=Worksheets("Dados_Jan")

No entanto, caso seja omitido o argumento Before, a nova folha será inserida antes da folha de 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 facilidades necessários para realizar interfaces gráficas simples. Essas interfaces vão permitir que os macros tenham uma interacção directa com o utilizador, requerendo e fornecendo informaçã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 uma mensagem, pelo menos um botão de comando e eventualmente um pequeno desenho (ícone) ilustrativo do tipo de mensagem. Na Figura 12 encontra-se um exemplo de uma destas janelas.

Figura 12: Exemplo de MsgBox

Uma Caixa de Mensagem destina-se a apresentar ao utilizador uma mensagem com informação relevante, sejam avisos, resultados, perguntas ou sugestões. Uma janela deste tipo tem um comportamento peculiar: enquanto não for premido um dos seus botões, 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)

(30)

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 soma de três valores parciais (opcional)

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

O 2o argumento será calculado usando os valores da Tabela 3. Assim, para obter o valor do parâmetro características, será preciso somar três valores, um de cada coluna da Tabela 3, cada um deles especificando uma das características (Botões de Comando, Ícone e qual o botão com o "focus"14).

Botões de Comando Ícone Botão com o “focus” 0 - OK 0 - Nenhum 0 - 1o Botão

1 - OK, Cancel 16 - Mensagem Crítica 256 - 2o Botão 2 - Abort, Retry, Ignore 32 - Mensagem de Aviso 1 512 - 3a Botão

3 - Yes, No, Cancel 48 - Mensagem de Aviso 2 4 - Yes, No 64 - Mensagem de Informação 5 - Retry, Cancel

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

No caso da Figura 12 na página precedente, os valores a somar seriam os seguintes:

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 mais do que um botão, está-se a pedir ao utilizador que escolha uma de entre duas ou três alternativas. Dependendo de qual o botão premido pelo utilizador, assim o valor numérico devolvido pela função MsgBox será um de entre 7 valores possíveis, descritos na Tabela 4.

Constante Valor Botão seleccionado

vbOK 1 OK vbCancel 2 Cancel vbAbort 3 Abort vbRetry 4 Retry vbIgnore 5 Ignore vbYes 6 Yes vbNo 7 No

Tabela 4: Valores devolvidos por uma Caixa de Mensagem

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

14O botão com o "focus" ou botão de defeito é aquele que será accionado automáticamente caso o

(31)

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

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.

Quando, pelo contrário, não haja interesse em aproveitar o valor devolvido pela função (tipicamente quando há apenas um botão), a sua invocação poderá fazer-se da seguinte forma:

MsgBox Mensagem, Características, Título

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ário da função MsgBox (Secção 4.3.1 na página 29), esta função produz um resultado do tipo string 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 Caixa de Entrada) incluindo um caixa de texto, dois botões15 e um rótulo dentro de uma

pequena janela. A sua sintaxe é

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

Em que os argumentos são:

Mensagem Texto da mensagem a afixar na Caixa de Entrada (máximo de 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)

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

(32)

4.3.3 Forms

Como vimos no início da Secção 4 na página 22, uma interface gráfica (em terminolo-gia VBA, uma DialogBox ) é construída dispondo os objectos adequados (genericamente designados 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 User-Form". Esse processo será visto em detalhe na Secção 9 na página 76.

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 o acesso à 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 comum na construção de dialogBoxes em VBA. Estes são os objectos que mais frequentemente sã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 utiuti-lizador dar ordens (comandos) ao programa. Como se pode verificar na Figura 11 na página 26, é 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 que controlam as dimensões (Height e Width) e a propriedade Caption que permite especificar o texto afixado.

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

cmdArranque.Enabled = True

O que fizemos com a instrução acima foi atribuir o valor booleano (lógico) True à propriedade Enabled16 do botão de comando cmdArranque.

4.3.5 Rótulos

Os rótulos, também designados por etiquetas (label ) são usados para apresentar texto na interface. Mais uma vez, a propriedade mais utilizada é a propriedade Caption, que permite especificar o texto a apresentar. Este controlo é usado não só para apresentar

(33)

informação estática, que é escolhida na fase de concepção da interface, como também informação dinâmica, como seja a usada na apresentação de resultados:

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

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

Funções Val e Str

A linguagem VBA dispõe de um grande número de funções pré-definidas. Duas delas, relacionadas com "strings", são particularmente úteis para lidar com objectos da classeTextBox e Label :

Função Descrição

Val() Retorna como valor numérico um número contido dentro duma string Str() 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 a instrução:

pesoTotal = txt1.Text + txt2.Text

No entanto, o que a propriedade Text das TextBox contem é apenas texto, ainda que 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)

A função str(), por seu lado, converte um valor numérico num texto contendo esse valor. Uma utilização típica é a de permitir compor strings como a do exemplo apresentado na Secção 4.3.5.

A string "O valor total é de 35 metros"pode ser composta usando o símbolo "+"como operador de concatenação (colagem) de texto, numa instrução como a seguinte:

texto = "O valor total é de "+ str(res) + "metros"

O símbolo "+"tanto pode ser interpretado como operador de adição como de conca-tenação. Essa ambiguidade é desfeita pelo VBA, analizando o tipo dos seus operan-dos. Se forem ambos numéricos, será realizada uma adição. Se forem ambos texto, será feita uma colagem. Se forem de tipo diferente, ocorrerá um erro. Para que na instrução atrás, isso não ocorra, é preciso usar a função str() para converter para string o conteúdo numérico da variável res.

Agora, já poderemos perceber qual o resultado da primeira instrução apresentada (pesoTotal = txt1.Text + txt2.Text): ocorrerá a colagem do texto contido nas duas TextBox, em vez da soma dos correspondentes valores numéricos.

4.3.6 Caixas de Texto

As caixas de texto (objecto TextBox ) são uma classe de controlos muito versáteis que permitem a introdução pelo utilizador de diversos tipos de informação: texto, valores

(34)

numé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 utilizador pode introduzir.

MultiLine Permite escolher entre permitir ou não a apresentação do texto em várias linhas.

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

4.3.7 Botões de Opção

Estes objectos permitem ao utilizador efectuar escolhas entre diversas alternativas. São compostos pelo botão propriamente dito (de forma circular) e um pequeno texto que o acompanha, 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, estando interligados entre si, já que, ao mesmo tempo, só é possível que esteja um botão selecci-onado dentro do mesmo grupo de botões de opção. Encontram-se muitas vezes inseridos em frames (Secção 4.3.9 na página seguinte).

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

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 mesma form, visto que tais objectos funcionam de forma independente (isto é, não se encontram relacionados entre si).

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

(35)

Figura 15: Vários checkBox agrupadas numa frame

0 não activada 1 activada 2 não disponível

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

4.3.9 Quadros (Frames)

Tais objectos destinam-se a agrupar outros objectos (controlos). São usados muitas vezes para 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 mesma form.

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 criado antes do quadro, não será possível deslocá-lo para dentro do quadro após este ter sido criado.

Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o “contentor” desse objecto. Quer isto dizer que a sua localização passa a ser definida não em 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, de modo a melhorar a aparência e a organização da form em que estão inseridos, agrupando os diversos controlos de acordo com as suas funcionalidades.

(36)

4.3.10 Caixas de Listagem

Este objecto serve para apresentar listas e permite que o utilizador escolha uma ou mais opções dentro de uma dada lista. Esta lista é apresentada numa caixa própria (com uma barra de deslocamento vertical à direita, no caso de a lista ser mais extensa que o número de 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 usando o método AddItem:

listbox.AddItem elemento

ou

listbox.AddItem elemento, posição

em que

elemento é o novo elemento a acrescentar à lista

posiçã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, desde que a lista não seja ordenada. Se a propriedade Sorted (ver tabela abaixo) estiver activa (True), qualquer inserção de nova linha será feita na posição adequada para manter a lista ordenada

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

Listbox.RemoveItem posição

A remoção simultânea de todas as linhas da caixa de listagem pode ser conseguida aplicando-lhe o método Clear (este método não necessita de qualquer argumento):

Listbox.Clear

(37)

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 maneira ordenada

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

ColumnHeads controla os cabeçalhos das colunas

MultiSelect permite controlar a forma de selecção de elementos na lista: 0 - só é possível seleccionar um elemento

1 - é possível seleccionar vários elementos simultaneamente, pressionando cada elemento

2 - é 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 especifica qual a gama de células de uma folha de cálculo Excel em que se encontra a informação a incluir na lista, ou seja, a fonte dos dados a apresentar.

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 ser usada do lado direito de uma operação de atribuição, enquanto que na versão completa o que se pretende é atribuir um valor à propriedade.

Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox com uma ListBox. O utilizador pode introduzir um item na TextBox ou seleccioná-lo na lista que, estando normalmente escondida, só aparecerá quando se clica num ícone próprio. É normalmente utilizada quando se pretende dar a possibilidade de escolher um elemento de 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 uma form onde se instalem os diferentes controlos. Nesse caso, os controlos serão instalados directamente na própria folha de cálculo, numa área reservada para o efeito. Um exemplo pode ser observado na Figura 18 na página seguinte. A interface descrita utiliza um botão de comando e dois botões de opção.

Para a instalação desta interface, deve usar-se a Caixa de Ferramentas dos Con-trolos activada através da Barra de Ferramentas de VBA descrita na Figura 3 na página 11. Esta Caixa de Ferramentas pode ser vista na parte inferior da Figura 18 na página seguinte. Nesta Caixa é possível escolher-se qual o controlo que se pretende

(38)

Figura 18: Interface construída directamente na folha de cálculo

instalar seleccionando o ícone respectivo, após o que se desenhará com o rato na própria folha de cálculo a área que esse controlo vai ocupar. A sua posição e dimensões definitivas poderão ser afinadas quer com o rato quer manipulando as propriedades correspondentes na janela de Propriedades.

(39)

5

Estruturas de controlo do programa

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

Já foi introduzida na Secção 3.5 na página 20 a noção de operação de atribuição. Com essa operação podemos criar instruções simples, mediante as quais é possível copiar valores entre variáveis, ou armazenar resultados do cálculo de expressões. Mas um programa flexível não poderá ser construído apenas com instruções desse tipo. É preciso dispor de instruções que permitam alterar o fluxo do programa. Para tal, vamos introduzir estruturas 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. Usando esta 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, uma sequência diferente será escolhida.

5.1.1 If...Then...Else

(40)

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

A sintaxe desta estrutura é:

1 I f c o n d i c a o Then 2 [ i n s t r u c o e s ] 3 Else

4 [ 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 Then e 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 em qualquer expressão de que resulte um valor numérico: um valor não nulo será interpretado como Verdadeiro, enquanto um valor nulo será considerado como Falso.

A condição é, portanto, uma expressão booleana (lógica). Uma expressão booleana representa 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 de operadores.

5.1.2 If...Then

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

(41)

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

1 I f c o n d i c a o Then 2 [ 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 ser executada com apenas uma instrução, é possível ainda utilizar a seguinte sintaxe simplificada, sem o delimitador End If e sem mudança de linha:

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 <> Desigualdade And E Or Ou Not 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

(42)

5.1.3 Estruturas condicionais embutidas

É possível construir estruturas de controlo mais complexas, oferecendo ao programa a capacidade de escolher uma de entre várias alternativas possíveis. Estas estruturas con-dicionais embutidas ou encadeadas são construídas inserindo estruturas concon-dicionais den-tro de outras estruturas condicionais. Isso pode realizar-se de dois modos. O primeiro método implica utilizar a palavra reservada ElseIf.

A sintaxe desta estrutura é:

1 I f c o n d i c a o 1 Then 2 Accao1 3 E l s e I f c o n d i c a o 2 Then 4 Accao2 5 E l s e I f c o n d i c a o 3 Then 6 . . . 7 Else 8 AccaoN 9 E nd If

Esta estrutura condicional permite a selecção de uma entre várias alternativas mutua-mente exclusivas. As instruções que se seguem à palavra reservada Else (aqui representa-das por "AcçãoN") serão executarepresenta-das apenas se nenhuma representa-das condições se tiver verificado. É possível imbricar um qualquer número de blocos ElseIf dentro de uma dada estrutura condicional.

As estruturas condicionais produzidas usando o método alternativo não são tão com-pactas mas tornam-se talvez mais legíveis, sobretudo se se usar a indentação apropriada:

1 I f c o n d i c a o 1 Then 2 Accao1 3 Else 4 I f c o n d i c a o 2 Then 5 Accao2 6 Else 7 I f c o n d i c a o 3 8 Accao 3 9 Else 10 Accao4 11 End I f 12 End I f 13 E nd If

Na Figura 21 na página seguinte pode-se ver o fluxograma de uma estrutura imbricada com 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. Chama-se a esta acção, a acção por defeito, ou seja, aquilo que se faz quando todo o resto falha.

É muito importante que se compreenda que estamos aqui a tratar de verdadeiras alter-nativas, i.e., mútuamente exclusivas. Cada vez que uma estrutura deste tipo é executada,

Referências

Documentos relacionados

To demonstrate that SeLFIES can cater to even the lowest income and least financially trained individuals in Brazil, consider the following SeLFIES design as first articulated

Nessa situação temos claramente a relação de tecnovívio apresentado por Dubatti (2012) operando, visto que nessa experiência ambos os atores tra- çam um diálogo que não se dá

Estes dados foram cruzados com dados de presenças, existentes apenas para o escalão sénior e que terminaram 2 anos antes do início do estudo, tendo-se chegado a um

62 daquele instrumento internacional”, verifica-se que não restam dúvidas quanto à vinculação do Estado Brasileiro à jurisdição da Corte Interamericana, no que diz respeito a

Além desta verificação, via SIAPE, o servidor assina Termo de Responsabilidade e Compromisso (anexo do formulário de requerimento) constando que não é custeado

De acordo com o Consed (2011), o cursista deve ter em mente os pressupostos básicos que sustentam a formulação do Progestão, tanto do ponto de vista do gerenciamento

Conforme explicitado na introdução desta dissertação, este estudo teve como objetivo analisar a emblemática situação do baixo desempenho em Matemática dos alunos do 3º ciclo

Para preservar a identidade dos servidores participantes da entrevista coletiva, esses foram identificados pela letra S (servidor) e um número sequencial. Os servidores que