25
Apontamentos de VBA Texto Introdutório António Silva 2008-12-01 1

Apontamentos de VBA Texto Introdutórioasilva/page14/page16/assets/APROG... · macro que verifique se o valor presente numa determinada célula é superior a um dado ... será afixada

Embed Size (px)

Citation preview

Apontamentos de VBATexto Introdutório

António Silva

2008-12-01

1

.

2

Conteúdo1 Introdução 5

2 Conceitos Básicos 52.1 O que é um Macro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Técnicas de construção dum Macro . . . . . . . . . . . . . . . . . . . . . 52.3 Gravação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.4 A escrita de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.5 O editor de VBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.6 Criação de um Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.7 Funções e Sub-rotinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.8 Exemplo de função definida pelo utilizador . . . . . . . . . . . . . . . . . 11

3 Como trabalhar com Objectos 113.1 Propriedades, Métodos e Eventos . . . . . . . . . . . . . . . . . . . . . . 12

4 Estruturas de controlo do programa 134.1 Estruturas de controlo tradicionais . . . . . . . . . . . . . . . . . . . . . 13

4.1.1 If...Then...Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.1.2 Do...Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.1.3 For...Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4.2 Estruturas típicas do VBA . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2.1 For Each...Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

5 Programação do Excel usando VBA 145.1 Como aceder às funções standard do Excel . . . . . . . . . . . . . . . . . 145.2 Trabalhar com objectos Workbook . . . . . . . . . . . . . . . . . . . . . . 155.3 Trabalhar com objectos Worksheet . . . . . . . . . . . . . . . . . . . . . 15

5.3.1 Propriedades de Worksheet . . . . . . . . . . . . . . . . . . . . . . 155.3.2 Métodos de Worksheet . . . . . . . . . . . . . . . . . . . . . . . . 16

5.4 Trabalhar com objectos Range . . . . . . . . . . . . . . . . . . . . . . . . 16

6 Adicionando uma interface gráfica 186.1 Instalação da Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186.2 Instalação dos Controlos . . . . . . . . . . . . . . . . . . . . . . . . . . . 196.3 Incorporação da Form na sub-rotina . . . . . . . . . . . . . . . . . . . . . 22

6.3.1 Como visualizar e terminar uma Form . . . . . . . . . . . . . . . 226.3.2 Como recolher os resultados de uma Form . . . . . . . . . . . . . 236.3.3 Exemplo de aplicação . . . . . . . . . . . . . . . . . . . . . . . . . 23

7 Notas finais 25

3

Lista de Figuras1 Janela de invocação do ambiente de Gravação de Macros . . . . . . . . . 62 Janela de Gestão de Macros . . . . . . . . . . . . . . . . . . . . . . . . . 73 Barra de Ferramentas de Visual Basic . . . . . . . . . . . . . . . . . . . . 74 Editor integrado do Visual Basic . . . . . . . . . . . . . . . . . . . . . . 85 Criação de novo Módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Utilização da função margemLucro numa fórmula . . . . . . . . . . . . . 117 Lista de eventos disponíveis . . . . . . . . . . . . . . . . . . . . . . . . . 128 Criação de uma Form no VBE . . . . . . . . . . . . . . . . . . . . . . . . 199 Objecto da classe Tabstrip . . . . . . . . . . . . . . . . . . . . . . . . . . 2110 A UserForm para Entrada Múltipla de Dados . . . . . . . . . . . . . . . 24

4

1 IntroduçãoVBA é um acrónimo que quer dizer Visual Basic for Applications. É uma linguagem deprogramação que permite acrescentar capacidades adicionais a certo tipo de aplicaçõesinformáticas, neste caso, as pertencentes ao Microsoft O!ce, nomeadamente o Excele o Word. Permite ainda automatizar a realização de certas tarefas rotineiras nessasaplicaçõ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 destasaplicações.

Este texto destina-se aos alunos que já possuem alguns conhecimentos quer de pro-gramação em Visual Basic quer do gestor de folhas de cálculo Excel. Concretamente,presume-se que já estão capazes de utilizar estruturas de controle (condicional e repeti-tivo) e que estão familiarizados com os conceitos de função e sub-rotina.

2 Conceitos BásicosÉ comum utilizadores de programas como folhas de cálculo ou processadores de textoterem de realizar as mesmas tarefas repetidas vezes, como seja formatar de determinadomodo uma porção de texto, executar os mesmos cálculos em diferentes partes de umafolha de cálculo, ou ainda executar uma sequência de opções de menus. A solução éautomatizar essas tarefas, construindo aquilo que se designa por macros, que não sãomais que descrições formalizadas das tarefas que se pretende automatizar.

A linguagem utilizada para descrever essas tarefas é precisamente o VBA mas não éobrigatório conhecer esta linguagem para o poder fazer, especialmente quando as tarefasa programar são relativamente simples. Existe um método alternativo de "ensinar"aocomputador o que fazer em resposta a um determinado comando e que é tratado naSecção 2.2.

2.1 O que é um Macro?Um macro é um conjunto de instruções (escritas em VBA) que dizem a um programacomo o Excel o que fazer para atingir um determinado objectivo. E esse conjunto deinstruções pode ser activado mediante uma determinada tecla ou sequência de "clicks"dorato. A cada acção ou comando da aplicação corresponderá uma instrução específica domacro.

2.2 Técnicas de construção dum MacroExistem duas formas de criar um macro. A primeira corresponde a mostrar ao com-putador o que fazer para conseguir obter o resultado pretendido. O utilizador indica aoprograma que se vai entrar num modo de gravação do macro e inicia a execução da sequên-cia 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 umacombinação de teclas especial, esse macro estará pronto a ser executado, substituindoassim o conjunto de acções que anteriormente seriam necessárias.

5

Se se investigar, no entanto, o conteúdo desse macro, verificar-se-á que ele é compostopor instruções escritas precisamente em VBA. Assim sendo, é fácil de intuir que a formaalternativa de construir um macro será precisamente alinhar essas instruções num editorde texto apropriado. É essa a forma de criar um macro quando o seu âmbito é algo nãotrivial.

2.3 Gravação de um MacroQuando 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"(emExcel), o que fará aparecer a janela descrita da Figura 1. Nela se pode especificar o nomedo macro, a localização em que será armazenado, uma descrição das suas funções e aindaa combinação de teclas (Shortcut key) que será utilizada para arrancar com o macro, umavez este construído.

Figura 1: Janela de invocação do ambiente de Gravaçã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-ção da combinação de teclas especificada anteriormente (no caso da Figura 1, seriaCtrl+Shft+M) e executará, de forma automática, exactamente a mesma sequência deacçõ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 na página seguinte), onde, entre outras acções, pode serescolhido o macro a ser executado.

6

Figura 2: Janela de Gestão de Macros

2.4 A escrita de um MacroEnsinar 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 programaescrito em VBA, porque não tratá-lo como tal e aceder a seu código, alterando-o de formaa melhorar a sua eficiência ou a corrigir problemas. E já agora, porque não criá-los deraiz, aproveitando todo o poder duma linguagem como o VBA?

2.5 O editor de VBAPara 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 Visual Basic

Para aceder ao editor especializado de Visual Basic (Figura 4 na página seguinte),que se encontra integrado no próprio Excel, basta utilizar o icone adequado na barrade ferramentas ou usar directamente a combinação de teclas ALT-F11. Tornando apremir esta combinação de teclas, voltaremos à nossa folha de cálculo. A este editoresepcializado é também dado o nome de Integrated Development Environment (IDE) ou

7

Figura 4: Editor integrado do Visual Basic

Ambiente de Desenvolvimento Integrado e é semelhante à aplicação autónoma usada parao desenvolvimento de programas em Visual Basic.

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 O!ce (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 pelosmacros1).

Para poder começar a escrever macros usando o VBA é necessário criar um móduloque o possa albergar, o que é conseguido usando a opção de menu "Insert/Module". Comoconsequência, para além do novo módulo aparecer referido na janela do Explorador deProjectos, será criada uma janela nova onde será possível escrever o código que constitui osnovos macros. Se já existir algum módulo criado, bastará seleccionar o módulo pretendidono explorador de projectos, posicionar o cursor na janela correspondente a esse módulonuma área fora de qualquer macro e seleccionar a opção de menu "Insert/Procedure".Aparecerá uma janela própria (Figura 5 na página seguinte) onde será possível dar o nomeao novo procedimento (o conjunto de instruções que constituirá o macro), especificar o

1Sobre o assunto, ver Secção 6.

8

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

tipo de macro que vai ser construído (função ou sub-rotina2) e qual o âmbito da suautilização (pública ou privada, ou seja, limitada ao ficheiro actual).

2.6 Criação de um MacroEstá na hora de construir o primeiro macro em VBA. Suponhamos que se pretende ummacro que verifique se o valor presente numa determinada célula é superior a um dadolimite e que, caso seja, disso notifique o utilizador. A sub-rotina em que esse macro deveráassentar poderá ter o seguinte conteúdo:

Public Sub v e r i f i c aVa l o r ( )I f Ce l l s (2 , 2) > 100 Then

MsgBox "Valor"maximo" excedido ! "End I f

End Sub

Neste código podemos observar que a sub-rotina verificaValor utiliza uma estruturade controle condicional (If...Then) para verificar o conteúdo da célula B2 (que se encontrana 2a linha e 2a coluna da folha de cálculo). Caso esse conteúdo ultrapasse o valor limitede 100, será afixada uma janela com a mensagem de alarme adequada. Sempre que fornecessário fazer esta verificação, bastará invocar a combinação de teclas que tenha sidoassociada a este macro.

Esta verificação poderia ter sido realizada colocando numa célula uma fórmula con-tendo a função do Excel IF. Mas suponhamos agora que se pretende algo mais complicado,por exemplo, fazer essa verificação numa gama de células e apenas desencadear o alarme,caso mais do que duas dessas células ultrapassem o limite estabelecido. A sub-rotinamodificada poderia ser algo como:

2A distinção entre funções e sub-rotinas, que estará já clara para quem possua os conhecimentosbásicos de Visual Basic, será tratada mais à frente.

9

Public Sub ver i f icaGama ( )Dim i As Integer , c As Integerc = 0For i = 1 To 5

I f Ce l l s ( i , 3) > 100 Thenc = c + 1

End I fNextI f c > 2 Then

MsgBox c & "" va l o r e s " s up e r i o r e s "ao" l im i t e ! "End I f

End Sub

A verificação é agora repetida em todas as células de C1 a C5 graças aos serviços daestrutura de controlo repetitivo For...To. É ainda actualizado um contador (baseado navariável c) sempre que o valor contido na célula em análise ultrapassa o limite. Só nocaso de o conteúdo desse contador ultrapassar o valor 2 se gerará a mensagem de alarme.

Estamos 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ãoOpções na Janela de Gestão de Macros, invocada mediante ALT-F8.

2.7 Funções e Sub-rotinasAs sub-rotinas descritas na secção anterior destinam-se a executar tarefas, neste caso, devigilância sobre os valores contidos em determinadas células da folha de cálculo. No en-tanto, não é possível utilizá-las em fórmulas, ao contrário do que acontece com as funçõesstandard disponíveis no Excel, como seja a função IF referida atrás, ou a função SUM,que calcula a soma do conteúdo numérico das várias células contidas numa dada gama.Isso acontece porque, para poderem ser utilizadas em células, terão que ser estrutura-das como funções, e comportarem-se de maneira idêntica à das funções standard. Umafunção, seja ela pré-existente no Excel, ou criada pelo utilizador, deve poder receber ainformação de que necessita, e de poder devolver o resultado do seu trabalho, de modoa esse resultado poder ser utilizado na fórmula ou expressão que a utilize. Para tal, temque possuir uma estrutura definida pela sintaxe seguinte:

Function Nome ( argumento1 , argumento2 , . . . )’ L i s t a de i n s t r u co e sNome = re su l t ado

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.

10

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.

2.8 Exemplo de função definida pelo utilizadorVamos 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:

Public Function margemLucro ( venda , custo )margemLucro = ( venda ! custo ) / venda

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 6.

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

A fórmula contem referências às células D3 e D2, em que estão contidos, respectiva-mente, o preço de venda e o custo do produto. Quando a função é invocada, cópias doconteúdo destas duas células são passadas à função, que os recebe através dos parâmetrosde entrada respectivos, venda e custo.

3 Como trabalhar com ObjectosPara que uma macro (função ou sub-rotina) possa manipular o ambiente da aplicação,seja modificando a formatação de um documento, modificando opções da aplicação ouintroduzindo dados numa gama de células, vai ser preciso interagir com Objectos. Quero documento, quer a gama de células, quer a própria aplicação são considerados, para osefeitos de programação em VBA, como sendo objectos.

Os objectos podem ser manipulados de várias formas:

• podemos mudar as suas propriedades;

11

• podemos aplicar um método a esse objecto;

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

Os conceitos de propriedades, métodos e eventos deveriam já estar claros para quemtenha tido alguma exposição à programação em Visual Basic. No entanto, vamos aquirever rapidamente essas noções.

3.1 Propriedades, Métodos e EventosAs propriedades de um objecto são as suas características físicas, como sejam as suasdimensões ou o tipo de letra que usa.

Os métodos traduzem acções que podem ser realizadas 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.

Os eventos, por sua vez, são acções que, uma vez exercidas sobre um objecto, implicama possibilidade de ocorrer uma resposta automática desse objecto. Basicamente, umevento é algo que acontece a um objecto. Por exemplo, a abertura de uma folha de umlivro de trabalho (workbook) em Excel é um evento. A inserção de uma nova folha nolivro é 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 detecta esse acontecimento mas nãosabe o que deve fazer.

Figura 7: Lista de eventos disponíveis

Na Figura 7 pode-se ver a janela de escrita de código. Na parte de cima, à direita,pode ser acedida a lista de eventos disponíveis para o objecto Worksheet. Seleccionandoum dos eventos, será possível construir o procedimento event handler que permita aoobjecto Worksheet reagir a esse evento. O cabeçalho e o delimitador final são criados au-tomaticamente pelo editor do VBA, sendo da responsabilidade do programador a inclusãodas instruções necessárias. Na figura são referidos vários eventos que podem ocorrer noobjecto Worksheet, tais como o Activate que ocorre sempre que uma folha de cálculo setorna activa, ou oChange que é desencadeado por qualquer alteração ao seu conteúdo.

12

4 Estruturas de controlo do programaO VBA herda do Visual Basic uma série de estruturas de controlo do fluxo do programa.Têm um funcionamento semelhante pelo que não deverá haver surpresas. Vamos, noentanto, revê-las de forma sumária. Em seguida, serão apresentadas estruturas de controloespecíficas do VBA.

4.1 Estruturas de controlo tradicionais4.1.1 If...Then...Else

A sintaxe desta estrutura é:

I f condicao Then[ i n s t r u c o e s ]

Else[ i n s t r u c o e s a l t e r n a t i v a s ]

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. Esta estru-tura existe em duas variantes: com ou sem a alternativa Else. No 1o existe uma acçãoalternativa a ser executada caso a condição seja falsa. No 2o caso, a alternativa será nãofazer nada.

4.1.2 Do...Loop

Estão disponíveis as quatro variantes que já se encontravam no Visual Basic: Do Whilee Do Until, com teste no princípio ou no fim. Dois exemplos de sintaxe são a seguirfornecidos:

Do While condicao[ i n s t r u c o e s ]

Loop

Do[ i n s t r u c o e s ]

Loop Unt i l condicao

4.1.3 For...Next

À semelhança do que acontece no Visual Basic, esta estrutura é usada quando é possíveldeterminar de antemão o número de vezes que um dado número de instruções deve serrepetido. A sua sintaxe é:

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

Next

13

4.2 Estruturas típicas do VBA4.2.1 For Each...Next

Esta estrutura é uma variação da For...Next que opera numa colecção de objectos. Umacolecção é um conjunto de objectos idênticos, pertencentes à mesma classe, e que sãoreferenciáveis mediante um índice. Por exemplo, um Workbook é constituído por umconjunto de objectos da classe Worksheet3. A sintaxe desta estrutura é a seguinte:

For Each elemento In Coleccao[ i n s t r u c o e s ]

NextO 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:

Public Sub FormataBordo ( )Dim c e l lOb j e c t As RangeFor Each c e l lOb j e c t In S e l e c t i o n

c e l lOb j e c t . BorderAround ColorIndex :=3 , Weight:=xlThickNext

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

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

5.1 Como aceder às funções standard do ExcelSe bem que o VBA possua várias dezenas de funções pré-definidas, é muito convenientepoder utilizar directamente qualquer uma das centenas de funções standard oferecidaspelo Excel. Para poder aceder a elas a partir do VBA é necessário utilizar a propriedadeWorsheetFunction do objecto Application4. Por exemplo, para, num macro, calcular ovalor médio de uma gama de células (identificada pelo nome "Medidas") poderia serusado a seguinte instrução:

vMedio = Appl i ca t ion . WorksheetFunction .Sum(Range ( "Medidas" )

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

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

14

5.2 Trabalhar com objectos WorkbookUsando 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:S intaxe :Workbooks .Open Nome_do_ficheiro

Exemplo :Workbooks .Open "C:\ Documentos\Excel \Dados . x l s "Os métodos Save e Close são utilizados de forma similar para salvaguardar o conteúdo

dum ficheiro e para o fechar, respectivamente.

5.3 Trabalhar com objectos WorksheetNormalmente 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:

Worksheets (2 )Worksheets ( "Custos " )Para acrescentar uma folha de cálculo ao livro de trabalho o método adequado será o

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

5.3.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.

15

5.3.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 especificada 5. 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.

S intaxe :Worksheet .Copy [ Po s i t i on ]

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.

5.4 Trabalhar com objectos RangeUm objecto do tipo Range pode ser uma simples célula, um conjunto de células, umalinha ou uma coluna. No fundo representa uma gama de células da folha de cálculo.

Para nos referirmos a uma célula ou gama de células usando o método Range usamosuma de duas sintaxes possíveis:

S intaxe 1 :Worksheet . Range (Nome)Range (Nome)

Sintaxe 2 :Worksheet . Range ( Celula1 , Celu la2 )

A 1a sintaxe usa nomes de gamas pré-definidos 6, enquanto que a 2a utiliza as referên-cias das células que definem dois vértices opostos da área rectangular contendo as célulasque se quer especificar. Caso se omita Worksheet em qualquer das sintaxes anteriores, oVBA pressupõe que se trata da folha de cálculo activa naquele momento.

5A folha de cálculo activa é aquela que está visível no momento.6Atribuídos em Excel usando o Menu "Name/Define".

16

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. O 3o exemplo limpa o conteúdo das células dagama "Dados"da 3a folha de cálculo. A propriedade Value dos objectos Range permiteconhecer ou modificar o seu valor.

Para identificarmos apenas uma célula podemos também utilizar o método Cells.

S intaxe :Objecto . Ce l l s ( Linha , Coluna )

Objecto pode ser um objecto Worksheet ou Range. A sua omissão, leva o VBA apartir do princípio que se trata da folha de cálculo activa. Linha e Coluna são valoresnuméricos indicando qual a linha e qual a coluna na intersecção das quais a célula seencontra7.

Exemplo :For coluna = 2 To 13

Ce l l s (2 , Coluna ) . Value = "Mes"" & coluna ! 1Next

O exemplo acima usa um ciclo For...To para preencher todas as células da gama C2 aC13 com um 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 completas, podem ser utilizados osmétodos Rows e Columns.

S intaxe :Objecto . Rows( Ind i c e )Objecto . Columns ( Ind i c e )

Para ilustar a utilização do método Rows atente-se no seguinte exemplo8:

Sub In s e r eL inhas (gama As Range , num As Integer )Dim num_linhas As Integer , u lt ima_linha As IntegerDim i As IntegerWith gama

num_linhas = . Rows .Countult ima_linha = . Rows( num_linhas ) .RowFor i = 1 To num

. Rows( ult ima_linha + i ) . I n s e r tNext

End WithEnd Sub

7Se o objecto for do tipo Range, Linha e Coluna referir-se-ão à linha e à coluna dentro da gama decélulas especificada.

8Adaptado de um exemplo contido em [1].

17

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:

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

End Sub

Apresentamos outro exemplo, agora referido ao método Columns em que a largura dacoluna E (5a coluna) é mudada para 15:

Columns ( 5 ) . ColumnWidth = 15

6 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. Para quem estejajá ambientado com a programação em Visual Basic, quer os conceitos, quer as técnicasaqui utilizados, são já conhecidos.

6.1 Instalação da FormUma Form é uma janela, em si mesma um objecto, utilizada como um contentor paraoutros objectos gráficos. Pode-se criar um objecto da classe UserForm no Editor do VBAatravés do Menu "Insert/User Form".

Na Figura 8 na próxima página 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 Pro-priedades, através da qual é possível manipular várias características da Form. A seguirsão apresentadas algumas das principais propriedades que podem ser configuradas numaForm:

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

18

Figura 8: Criação de uma Form no VBE

• 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 impedir queenquanto esteja activa não seja permitido o acesso à aplicação

• Font - controla o tipo e tamanho da letra utilizada

• Height - especifica a altura da Form

• Width - especifica a largura da Form

6.2 Instalação dos ControlosUsando a Caixa de Ferramentas Toolbox, é possível escolher e instalar os controlos naForm. À semelhança do que é feito no ambiente de desenvolvimento do Visual Basic, bastaaccionar o símbolo do controlo pretendido e desenhá-lo com o rato na Form. A seguir,quer agindo directamente sobre o controlo, quer utilizando a Janela de Propriedades,podem-se fazer os ajustes necessários das suas características. Se bem que cada classe

19

de controlos possua a sua lista própria de propriedades, existem algumas propriedadesimportantes 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

• Height - especifica a altura do controlo

• Width - especifica a sua largura

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

Os controlos disponíveis em Visual Basic encontram-se também no ambiente de desen-volvimento do VBA: botões de comando (Command Buttons), etiquetas (Labels), caixasde texto (Text Boxes), quadros (Frames), botões de opção (Option Buttons), caixas deverificação (Check Boxes) e caixas de listagem (List Boxes), entre outros. O seu compor-tamento é idêntico ao observado em Visual Basic. Valerá a pena, no entanto, chamar aatenção para algumas propriedades específicas dos objectos da classe ListBox que diferemdos seus correspondentes em Visual Basic:

• ColumnCount - especifica o número de colunas em que os dados são apresentados

• ColumnHeads - controla os cabeçalhos das colunas

• RowSource - determina a fonte dos dados que vão preencher a ListBox

Vamos agora introduzir um controlo existente no VBA e que não está disponível noVisual Basic 5.0. Trata-se do objecto Tabstrip que permite a apresentação de diferentesconjuntos de valores mediante a selecção de diferentes separadores ("tabs"). Na Figura 9na página seguinte pode-se encontrar um exemplo de um objecto deste tipo.

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 3.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-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:

Private Sub UserForm_In i t ia l i z e ( )With TabStrip1

. Tabs ( 0 ) . Caption = " C i v i l "

. Tabs ( 1 ) . Caption = " In fo rmat i ca "

20

Figura 9: Objecto da classe Tabstrip

. Tabs .Add " E l e c t r o t e cn i a "End WithWith Worksheets (4 )

txtNumAlunos . Text = . [ D5 ]txtPercAprov . Text = . [ D6 ] " 100txtMedia . Text = . [ D7 ]

End WithEnd 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.

Private Sub TabStrip1_Change ( )Dim v As IntegerWith Worksheets (4 )

v = TabStrip1 . ValueI f v = 0 Then

txtNumAlunos = . [ D5 ]txtPercAprov = . [ D6 ] " 100txtMedia = . [ D7 ]

ElseIf v = 1 ThentxtNumAlunos = . [ E5 ]txtPercAprov = . [ E6 ] " 100txtMedia = . [ E7 ]

Else

21

txtNumAlunos = . [ F5 ]txtPercAprov = . [ F6 ] " 100txtMedia = . [ F7 ]

End I fEnd With

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.

6.3 Incorporação da Form na sub-rotinaNesta 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.

6.3.1 Como visualizar e terminar uma Form

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

Exemplo :MinhaForm .Show

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

Exemplo :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 :

Exemplo :Unload Me

Esta instrução deve ser incluída num Event Handler associado a um controlo (nor-malmente um botão de comando) presente na Form. No exemplo acima, a palavra Meinstrui o VBA para desactivar a Form específica a que o Event Handler diz respeito.

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

Private Sub cmdFechar_Click ( )Dim op As Integerop = MsgBox( " Sa i r ?(Yes/No) " , vbYesNo + vbQuestion )

22

I f op = vbYes ThenUnload Me

End I fEnd Sub

Desactivar uma Form através da instrução Unload não implica que esta deixe de estarem memória. Para garantir a sua efectiva remoção, que se traduzirá na geração do eventoTerminate, haverá que se usar a seguinte técnica:

Exemplo :Set MinhaForm = Nothing

6.3.2 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.

6.3.3 Exemplo de aplicação

Vamos finalmente aplicar estes conceitos e técnicas na construção e integração de umaUserForm (descrita na Figura 10 na próxima página) que permita a introdução conjuntados 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 eNúmero do aluno e uma Combo Box para selecção do seu Curso. Uma Combo Box éum controlo semelhante a uma List Box em que a lista está normalmente invisível, sóaparecendo quando o campo superior é activado. Aplicam-se-lhe os mesmos métodos daclasse ListBox.

Public Sub testUserFormInput ( )usrFrmInput .ShowSet usrFrmInput = Nothing

End Sub

Este macro chama a UserForm com o nome usrFrmInput e remove-a de memóriaquando ela termine o seu trabalho. Para facilitar a sua invocação, é conveniente associar

23

ao macro uma combinação de teclas específica, usando uma das técnicas já aprendidas(ver parte final da Secção 2.6).

Private Sub UserForm_In i t ia l i z e ( )cmbCursos .AddItem " C i v i l "cmbCursos .AddItem " In fo rmat i ca "cmbCursos .AddItem " E l e c t r o t e cn i a "cmbCursos .AddItem "Geotecnia "cmbCursos .AddItem "Quimica"cmbCursos .AddItem " Instrumentacao "Medica"

End Sub

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

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.

Private Sub cmdFechar_Click ( )With Worksheets (4 )

. [ H5 ] = txtNome . Value

. [ I5 ] = txtNum . Value

. [ J5 ] = cmbCursos . TextEnd WithUnload Me

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.

24

7 Notas finaisParte da estrutura e alguns dos exemplos apresentados foram inspirados no livro de PaulMcFredies[1].

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

25