Você está na página 1de 41

Captulo 3

Recursos de programao VBA

Estrutura
Estando familiarizado com os conhecimentos tericos que um programador deve ter, e tambm com os mecanismos de produo de macros e cdigos do VBA, chegou o momento de trabalhar diretamente com os comandos de VBA. A estrutura dos cdigos VBA, como j dissemos anteriormente, se d na forma propriedade parmetros evento. Ou seja, em toda a linha do VBA so denidas, em primeiro lugar, as propriedades que vamos utilizar, depois os parmetros com os quais ser aplicada a propriedade e, por ltimo, o evento que deve resultar da juno dos dois elementos anteriores. Porm, tambm podemos pensar o VBA como uma estrutura modularizada (formada por mdulos). A estrutura de mdulos, ou modularizao, consiste na construo de programas ou cdigos extensos por meio da diviso em etapas menores, que so os mdulos ou subprogramas. A primeira dessas etapas, por onde comea a execuo do trabalho, recebe o nome de programa principal, ao passo que as outras so os subprogramas propriamente ditos, executados sempre que ocorre uma chamada, o que feito por meio da especicao de seus nomes. Utilizar subprogramas, como faz o VBA, traz inmeras vantagens: Economia de cdigo; Desenvolvimento modularizado, em que se pensa no algoritmo por partes; Facilidade de depurao (correo e acompanhamento); Facilidade para alterao do cdigo; Generalidade de cdigo com o uso de parmetros: algoritmos so escritos para situaes genricas. H duas espcies de subprogramas: o procedimento e a funo.

Procedimento
Um subprograma do tipo procedimento um programa que tem vida prpria, mas que, para ser processado, tem de ser solicitado pelo programa principal que o armazena, por outro subprograma, ou por ele mesmo. Basicamente, um procedimento funciona da seguinte maneira:

Programao de planilhas em VBA


34

Public Static Sub <nome do procedimento() (apstrofo) Declarao dos objetos locais do Procedimento comandos do Procedimento End Sub

Funes
Alm dos procedimentos, temos as funes. As funes so, na verdade, microprogramas evocados dentro de um programa maior (no nosso caso, um cdigo VBA) e so utilizados para adicionar funcionalidades a um cdigo, sem carreg-lo com divises. Isso possvel, pois as funes funcionam como materiais pr-fabricados empregados na construo de casas: eles esto ali, mo, prontos para serem utilizados, e basta combin-los da forma desejada para que funcionem. Observe, a seguir, a estrutura de uma funo:
Function Nom(..) As .. End Function

No parnteses ao lado do nome da funo, temos de inserir os argumentos da funo e declar-los. Tais argumentos so sempre nmeros ou conjuntos de variveis numricas. Os argumentos de uma funo so os valores necessrios para que ela possa ser executada. Se executssemos uma funo parecida com Media(2,3) estaramos habilitando a funo Media para lhe indicar a utilizao dos valores n1=2 y n2=3 como argumentos de execuo. Uma funo sempre retorna algum valor como resultado, sendo que o valor que desejamos obter deve ser declarado no cdigo da funo. Se quisssemos, por exemplo, criar uma funo que nos desse o produto de dois nmeros multiplicados por dois, seria preciso declarar essa inteno utilizando o argumento As Double ( o dobro). Para que isso ocorra, a construo da funo deve conter a relao entre os argumentos de entrada e o valor de sada (a mdia, em nosso caso). Esse tipo de trabalho pode ser feito utilizando a seguinte expresso matemtica:

Recursos de programao VBA


35

Media = (n1 + n2) / 2

No decorrer do livro, entraremos em contato com exemplos mais prticos de procedimentos e funes.

Criao de variveis no Visual Basic


Uma varivel um objeto criado pelo usurio no qual podemos introduzir valores que sero utilizados em clculos ou em outros tipos de procedimentos. Para criar uma varivel em um programa VBA, no Editor do Visual Basic, siga o menu Ferramentas > Opes > Editor. Em seguida, selecione a opo Requerer declarao de varivel e, logo aps, clique em OK. A partir desse momento, a primeira linha de cada mdulo passar a se chamar Option Explicit e ser preciso declarar a varivel a criar mediante o seguinte cdigo:
Dim varMinhaVarivel as String

Esse cdigo far com que o VBA reconhea todas as variveis criadas, indicando, ao mesmo tempo, uma instruo que contenha um erro de ortograa ou de execuo.

Tipos de variveis
Para declarar uma varivel no incio de cada procedimento, devese denir o tipo de varivel, escrito apenas com letras maisculas. Existem, essencialmente, quatro tipos principais de variveis: String, Double, Date e Variante. importante frisar que elas podem conter diversas outras variveis especializadas.

String
Para conjuntos com at 65.000 caracteres (texto). Utiliza-se esse tipo de varivel para conjuntos de caracteres, incluindo a denio de repositrios locais (C:\. D:\) ou de rede (\\192.168.1.20, \\josejoaquim), nomes de arquivos (gastos.xls), endereos de clulas ($A$1$) e todos os elementos de texto ou sobre os quais no efetuaremos clculo. o equivalente VBA das strings que denem as proprieda-

Programao de planilhas em VBA


36

des das clulas de uma planilha do Excel: no possvel fazer clculos com clulas de texto, ao mesmo tempo em que no se pode utilizar funes de texto em clulas numricas.

Double
Varivel aplicada em nmeros com ou sem casas decimais. Double uma varivel genrica, capaz de comportar muitas outras variveis especializadas, que sero vistas adiante.

Bytes
As variveis Byte so armazenadas como nmeros de 8 bits (1 byte), sem sinal, nicos, e que variam, em valor, de 0 a 255. O tipo de varivel Byte til para conter dados binrios (0 e 1).

Integer
As variveis do tipo Integer so armazenadas como nmeros de 16 bits (2 bytes) com valor no intervalo de -32.768 a 32.767. O caractere de declarao de tipo para Integer o sinal de porcentagem (%). As variveis Integer tambm podem ser usadas para representar valores enumerados. Um valor enumerado pode guardar um conjunto nito de nmeros inteiros exclusivos, cada um com um signicado especial no contexto em que usado. Valores enumerados oferecem uma forma conveniente de seleo entre um nmero conhecido de opes em um formulrio. Por exemplo, preto = 0, branco = 1 e assim por diante. Pode-se denir constantes mediante a instruo CONST para cada valor enumerado.

Long
As variveis do tipo Long (inteiro longo) so armazenadas como nmeros de 32 bits (4 bytes) sinalizados, no intervalo de -2.147.483.648 a 2.147.483.647. O caractere de declarao de tipo para Long o e comercial (&).

Single
As variveis do tipo Single (vrgula utuante de preciso simples) so armazenadas como nmeros de vrgula utuante com 32 bits (4 bytes) e tm um valor no intervalo de -3,402823E38 a -1,401298E45 para valores negativos e de 1,401298E-45 a 3,402823E38 para valores positivos. O caractere de declarao de tipo para Single

Recursos de programao VBA


37

o ponto de exclamao (!). Single a ltima das strings usadas para representar valores numricos armazenados dentro da varivel Double.

Date
Varivel utilizada para a declarao de datas. As variveis Date so armazenadas como nmeros de ponto utuante de 64 bits (8 bytes) responsveis por representar as datas que variam de 1 de janeiro do ano 100 a 31 de dezembro de 9999, abrangendo, tambm, as horas de 0:00:00 a 23:59:59, segundo o modelo internacional de 24 horas. Qualquer valor reconhecvel e literal de data (no representado de maneira exclusivamente numrica) pode ser atribudo a variveis Date. Os literais Date devem estar entre sinais (#), por exemplo, #1 de janeiro de 1993# ou #1 jan 93#. As variveis Date exibem as datas de acordo com o formato reconhecido por seu computador, assim como as horas (12 ou 24 horas). Para mais informaes sobre como operar a congurao de data e hora, leia o tpico Conguraes de data e hora, nesse mesmo captulo. As datas manipuladas pela varivel esto localizadas, normalmente, nas clulas das planilhas. possvel, portanto, copiar o contedo das clulas para o interior da varivel Date sem prejuzo nenhum no desenrolar do cdigo.

Variant
A varivel Variant utilizada para todas as variveis no explicitamente declaradas como de algum outro tipo (usando instrues como Dim, Private, Public ou Static). O tipo de dados Variant no possui caractere de declarao. Uma Variant um tipo especial de varivel que pode guardar qualquer dado, exceto dados String de comprimento xo. Uma Variant tambm pode conter os valores especiais Empty, Error, Nothing e Null. possvel determinar ainda como os dados em uma Variant so tratados mediante as funes VarType ou TypeName. Os seus dados numricos podem ser qualquer valor de nmero inteiro ou real no intervalo de -1,797693134862315E308 a -4,94066E-324 para valores negativos e de 4,94066E-324 a 1,797693134862315E308 para valores positivos. Geralmente, os dados numricos Variant so mantidos em seu tipo original no interior da varivel.

Programao de planilhas em VBA


38

A Variant pode ser utilizada em cdigos que guardam uma grande quantidade de clculos a serem processados, pois essa varivel capaz de trabalhar com mais de 4.000 clculos por vez.

Configuraes de data e hora


Para fazer alteraes na forma como seu sistema operacional trabalha com parmetros de data e hora, abra o menu Iniciar > Conguraes > Painel de controle > Opes regionais > Geral. Em seguida, clique em Ingls (Estados Unidos) e, depois, em Aplicar, se deseja utilizar o modelo americano, que divide o dia em duas partes iguais, representadas por AM (horas do dia) ou PM (horas da noite). As conguraes para as horas podem ser feitas por meio das conguraes da aba Hora. Na seo Formato de hora, podemos especicar de que maneira a hora atual ser exibida na tela. A programao pode ser feita manualmente, por meio da digitao de combinaes de letras e smbolos:
Para Exibir a hora em um formato de 24 horas. Digite H ou HH para a hora. Uma s letra H mostrar a hora no formato de um nico dgito (por exemplo, 9). Duas letras mostraro a hora no formato de dois dgitos (por exemplo, 09). h ou hh para a hora. Uma s letra h mostrar a hora no formato de um nico dgito (por exemplo, 9). Duas letras mostraro a hora no formato de dois dgitos (por exemplo, 09). Um nico H, em letra maiscula ou minscula, como em H:m:s.

Exibir a hora em um formato de 12 horas.

Suprimir a exibio de zeros esquerda em segundos, minutos ou horas em um dgito. Exibir uma nica letra para indicar AM ou PM.

Um t minsculo no nal da declarao dos valores, como em HH:mm: ss t.

Recursos de programao VBA


39

Para Exibir duas letras para indicar AM ou PM. Exibir texto.

Digite tt minsculos no nal da declarao dos valores, como em HH:mm:s tt. Aspas simples () ao redor do texto. Tabela 3.1.

No preciso implementar conguraes no separador ou no smbolo de visualizao das horas, pois so padres internacionais. Agora, vamos implementar as conguraes de data. Para tanto, ainda em Opes regionais, selecione a aba Data.

Figura 3.1.

Na seo Calendrio, possvel congurar como o sistema vai se comportar quando um ano for digitado com apenas dois dgitos. Existe uma limitao de 100 anos no complemento de datas abreviadas do Windows que estabelece, por padro, que apenas os anos

Programao de planilhas em VBA


40

entre 1930 e 2029 so reconhecidos. Para modicar essa congurao, basta ir segunda caixa da seo em que est o valor 2029, alterando-o por um valor de sua escolha. Note que o primeiro valor tambm alterado. Dessa forma, se alterarmos 2029 para 2050, o nmero anterior ser imediatamente alterado para 1951. Na seo Data abreviada, mais precisamente na linha Exemplo de data abreviada, exibida a forma como uma data abreviada ser mostrada no sistema. Esse layout afeta diretamente a maneira como as datas sero mostradas em um aplicativo VBA. O modo como a data abreviada exibida pode ser alterado recongurando-se a linha Formato de data abreviada de acordo com os parmetros seguintes:
Para Exibir nmeros de um dgito sem um zero esquerda. Digite Um nico caractere. Digite d para o tipo de congurao referente ao dia, a para a congurao referente ao ano e M para a congurao referente ao ms. Assim, por exemplo, para produzir uma data como 9/9/9, digite d/M/a. Dois caracteres. Digite dd para a congurao referente ao dia, aa para a congurao referente ao ano e MM para a congurao referente ao ms. Por exemplo, para produzir 09/06/06, digite dd/MM/aa. aa para a congurao referente ao ano. aaaa para a congurao referente ao ano. Por exemplo, para obter 10/12/2005, digite dd/MM//aaaa.

Exibir zeros esquerda com nmeros de um dgito.

Exibir os dois ltimos dgitos do ano. Exibir quatro dgitos para o ano.

Recursos de programao VBA


41

Para Exibir abreviaes para o dia ou ms.

Digite Trs caracteres. Digite ddd para a congurao referente ao dia e MMM para a congurao referente ao ms. Dessa forma, se voc pretende que uma quarta-feira, dia 18 do ms de janeiro de 2006, surja como quarta 18/jan/2006, digite ddd/MMM/aaaa. Quatro caracteres. Digite dddd para a congurao referente ao dia e MMMM para a congurao do ms. Assim, se voc deseja que 10/02/2007 seja exibido como quinta-feira, 10 de fevereiro de 2007, digite dddd/MMMM/ aaaa. Aspas simples () ao redor do texto.

Exibir o nome completo do dia ou ms.

Exibir texto adicional.

Tabela 3.2.

Loops
Com as instrues de estrutura (tambm chamadas de estruturas de controle), podemos criar cdigos no Visual Basic capazes de tomar decises e repetir aes. No Captulo 1, Introduo lgica de programao, ao falarmos sobre algoritmos, discorremos sobre a necessidade de utilizar estruturas de repetio na produo de solues que demandam a repetio contnua de procedimentos ou a escolha entre duas ou mais variveis, seguida do reposicionamento do cdigo em posio original. Se precisarmos repetir o cdigo, podemos utilizar o loop, o que permitir a execuo de um grupo de instrues repetidamente. Alguns loops repetem instrues at que uma condio seja False (Falsa), ao passo que outros repetem as instrues at uma condio ser True (Verdadeira). Tambm h loops que repetem instrues um nmero especco de vezes ou em cada objeto de uma coleo.

Programao de planilhas em VBA


42

Do...Loop
Quando precisamos de um loop que persista at que uma condio seja True, utilizamos a instruo Do...Loop. Na forma de uma instruo simples, ele pode ser utilizado para continuar a execuo de uma macro de forma indiscriminada, como mostramos agora, no Exerccio 1:

Exerccio 1
1. Abra uma planilha do Excel e a preencha com os seguintes dados:
A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Mx. 20 22 27 29 25 25 24 23 22 21 27 20 22 26 23 29 27 28 25 B Mn. 17 21 23 20 21 16 17 20 26 21 16 17 20 18 23 21 22 20 C Mdia D Data 01/03/2001 02/03/2001 03/03/2001 04/03/2001 05/03/2001 06/03/2001 07/03/2001 08/03/2001 09/03/2001 10/03/2001 11/03/2001 12/03/2001 13/03/2001 14/03/2001 15/03/2001 16/03/2001 17/03/2001 18/03/2001 19/03/2001

Tabela 3.3.

2. Agora, utilize o atalho Alt + F11 para acessar o editor de VBA em uma planilha em branco.

Recursos de programao VBA


43

3. Dentro da janela do editor, insira o cdigo de loop que exibimos a seguir. Os comentrios assinalados com (apstrofo simples) so indicaes nossas e as utilizamos apenas para documentar o cdigo, introduzindo informaes sobre novos conceitos.
Sub Loop1() O loop ir apenas at a clula seguinte da coluna, de cima para baixo, caso os parmetros estabelecidos sejam cumpridos (True). Do contrrio, o processo de migrao para a prxima coluna ser interrompido. Do Do utilizado para especicar o que devemos fazer em um determinado caso. Em um loop, Do tem a funo de condicional, sendo utilizado para de nir a condio True da estrutura. ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2]) ActiveCell.FormulaR1C1 indica que a macro comear a ser utilizada em conjunto com a frmula R!C!, pertencente funo Average (Mdia, na verso em Portugus do Excel). A cada vez que o clculo da mdia for realizado pela presena dos dados, o looping ser executado, repetindo a utilizao da frmula na prxima clula da coluna. ActiveCell.Offset(1, 0).Select Loop Until IsEmpty(ActiveCell.Offset(0, 1)) estabelecido que deve haver um loop a partir da clula ativa (ActiveCell) direcionada; utiliza-se a funo Offset para indicar direcionamento. Os parnteses aps Offset indicam as coordenadas que sero aplicadas no direcionamento. Na forma (1,0), 1 indica que o looping sempre deslocar e formular uma linha abaixo da clula atualmente ativa e 0 indica que o deslocamento ser na mesma coluna. End Sub

4. Inscrito o cdigo ( claro que podemos omitir os comentrios), volte para a planilha em que voc inseriu os dados, selecione a clula C2 e utilize o atalho Alt + F8, rodando a macro criada logo em seguida. possvel utilizar essa macro para criar planilhas que calculem diariamente a cotao de uma moeda, como juros mensais ou os

Programao de planilhas em VBA


44

rendimentos de um determinado conjunto de papis no mercado de aes.

Do...While
Para vericar se a condio verdadeira ou falsa, utilizamos a palavra-chave While. While era, a princpio, a instruo utilizada para criar sistemas de loop em programas at que uma opo fosse dada como True. Como loop, no entanto, uma soluo mais estruturada, convencionou-se empregar While como uma ncora para a chamada de True. A sintaxe da expresso :
While condition [statements] Loop

A sintaxe da instruo While possui as seguintes partes:


Parte condition Descrio Obrigatria. Expresso numrica ou expresso de seqncia avaliada como True ou False. Se condition for Null, ser tratada como False, de acordo com as regras da lgica da programao, que estabelecem que um valor nulo equivalente a 0 costuma ser um valor False. Opcional. Uma ou mais instrues executadas enquanto a condio for True. Na verdade, no h muito sentido em criar uma funo While sem a presena dos statements. Tabela 3.4.

statements

No tpico seguinte, utilizaremos a funo While para denir um loop at o ponto em que uma condio no seja mais verdadeira (True), ou seja, aparea como False. Na prtica, ela faz a mesma coisa que a macro do Exerccio 1, mas, desta vez, procura por uma condio verdadeira na coluna ao lado, e no na clula abaixo, localizada na mesma coluna.

Recursos de programao VBA


45

Exerccio 2
1. Abra uma planilha do Excel e a preencha com os mesmos dados exibidos no Exerccio 1. 2. Em seguida, abra o editor do Visual Basic e digite o seguinte cdigo (os comentrios, novamente, so nossos):
Sub Loop2() Este loop roda enquanto existir um valor verdadeiro na coluna ao lado Do While IsEmpty(ActiveCell.Offset(0, 1)) = False Do While utiliza aqui a funo IsEmpty, empregada para retornar um valor booleano (0 ou 1, Verdadeiro ou Falso) que indica se uma varivel foi inicializada. No caso anterior, ele s ser executado se as coordenadas expressas (0,1) equivalerem mesma linha utilizada atualmente na planilha, conferindo, porm, os dados presentes na coluna seguinte ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2]) ActiveCell.Offset(1, 0).Select Loop End Sub

3. Salve a macro. V at a planilha editada anteriormente, posicione o cursor sobre a clula C2 e rode a macro que acabamos de criar.

For...Next
A funo For...Next utiliza um contador para executar instrues um determinado nmero de vezes. A sintaxe do comando a seguinte:
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter]

Em que:

Programao de planilhas em VBA


46

counter uma instruo obrigatria, empregada como um contador dos loops que sero realizados. A varivel no pode ser um valor booleano nem uma matriz; start o valor inicial de counter; end o valor nal de counter, o momento em que o loop ser interrompido; Step o valor da alterao do contador sempre que passar pelo loop. Se Step no for especicado, o padro ser 1 (um). O exerccio seguinte mostra um loop criado com a instruo
For...Next e capaz de avanar por dez clulas at ser interrompido.

Exerccio 3
1. Abra qualquer planilha do Excel, como a planilha em que inserimos os dados dos modelos anteriores. Depois, abra o editor de VBA. 2. Crie um novo mdulo, clicando com o boto direito do mouse na pasta Mdulos, localizada direita da tela, e siga o menu Inserir > Novo mdulo. 3. Escreva na janela do novo mdulo o seguinte cdigo:
Sub Accumulate() Dim n As Integer Dim t As Integer A funo Dim, utilizada para de nir e armazenar variveis, de ne que o valor n um dado Integer. Neste caso, utilizamos Integer para especicar um conjunto de valores enumerados. A mesma observao vale para Dim trabalhando com a varivel t, na linha seguinte. For n = 1 To 10 t = t + n Note que n, ao mesmo tempo em que uma varivel, ser utilizada como contador por For. De nimos o Start da contagem como 1 e o End como 10. Na mesma linha, de nimos que o produto ser igual ao valor do produto da linha anterior mais n. O valor de n iniciado com 1 e vai at 10. Next n Next a segunda parte do comando de loop. nele que estabelecemos em que resultar o loop

Recursos de programao VBA


47

MsgBox O total & t MsBox o objeto-padro do VBA utilizado para criar caixas de texto na tela. Os textos apresentados no box devem car entre parnteses. O & (e comercial) utilizado como concatenador do texto, fazendo a ligao entre este e o resultado nal obtido pela soma da ltima clula contabilizada pelo counter do looping. End Sub

4. Grave a macro e execute-a em uma planilha qualquer. O resultado ser semelhante ao mostrado na Figura 3.2:

Figura 3.2.

Condies lgicas: If...Then...Else/ Select Case


Todos os loops exibidos anteriormente so artifcios simples, mesmo quando trabalham com condicionais. No vimos, mesmo ao trabalhar com For...Next, escolhas condicionais alm da interrupo de um loop, caso uma coluna no correspondesse a um determinado parmetro. Muito mais complexo, e muito mais til para uma planilha de dados com o Excel, seria fazer com que o loop deixasse de lado o preenchimento de clulas que no correspondessem a um determinado requisito, ou que tivessem um valor nulo, mas ao mesmo tempo contasse com a opo de continuar se repetindo nas clulas posteriores s clulas com contedo False. Um looping desse tipo pode ser obtido com o auxlio da instruo If...Then...Else (traduzindo, Se... Ento... De outra maneira). Essa instruo executa condicionalmente um grupo de instrues, de acordo com o valor de uma expresso, e obedece seguinte sintaxe:

Programao de planilhas em VBA


48

If condition Then [statements] [Else elsestatements]

Tambm possvel inserir a sintaxe em forma de bloco:


If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]] End If

Em qualquer dos casos, cada um dos elementos corresponde ao seguinte: condition um ou mais dos dois tipos de expresso seguintes. Essa expresso pode ser numrica, avaliada como True ou False. Se condition for Null ser tratada como False; statements opcional na forma de bloco e obrigatria na forma de uma linha que no tenha clusula Else (De outra maneira). Suporta uma ou mais instrues separadas por dois-pontos que sero executadas se condition for True; condition-n opcional, j que igual a condition; elseifstatements opcional e dene se uma ou mais instrues sero executadas com a condition-n associada a True; elsestatements opcional e dene se uma ou mais instrues sero executadas se nenhuma expresso condition ou condition-n anterior for True. No Exerccio 4, veremos uma implementao simples de cdigo utilizando somente a instruo If. Nele, faremos com que seja retornado um erro caso uma clula esteja vazia, ou seja, caso tenha contedo False ou Null.

Exerccio 4
1. Abra uma nova planilha do Excel e a preencha com os dados apresentados, ou com dados parecidos:

Recursos de programao VBA


49

A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Mx. 20 22 27 29 25

B Mn. 16 17 21 23 20

C Mdia

D Data 01/03/2001 02/03/2001 03/03/2001 04/03/2001 05/03/2001 06/03/2001 07/03/2001 08/03/2001 09/03/2001 10/03/2001 11/03/2001 12/03/2001 13/03/2001 14/03/2001 15/03/2001 16/03/2001 17/03/2001 18/03/2001 19/03/2001

27 20 22 26 23 29 27 28 25

21 16 17 20 18 23 21 22 20 Tabela 3.5.

2. Em seguida, abra o editor de VBA, crie um novo mdulo e digite o seguinte cdigo:
Sub Loop4() Do If IsEmpty(ActiveCell) Then Incio da condicional: se a clula estiver ocupada (com contedo), ento a condio de prosseguimento ser satisfeita. ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2]) End If End If marca o m da condio ActiveCell.Offset(1, 0).Select

Programao de planilhas em VBA


50

A clula que deve ser selecionada como ativa a da linha seguinte clula atual, na mesma coluna. Loop Until IsEmpty(ActiveCell.Offset(0, 1)) O loop ser executado se uma clula na mesma linha, mas na coluna seguinte, estiver ocupada. End Sub

3. Salve o cdigo e v para a planilha que foi criada no primeiro passo. Selecione a clula C2 e rode a macro criada (Loop4). O resultado ser parecido com o que mostramos a seguir:
A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Mx. 20 22 27 29 25 B Mn. 16 17 21 23 20 C Mdia 18,00 19,50 24,00 26,00 22,50 #DIV/0! #DIV/0! #DIV/0! #DIV/0! #DIV/0! 24,00 18,00 19,50 23,00 20,50 26,00 24,00 25,00 22,50 D Data 01/03/2001 02/03/2001 03/03/2001 04/03/2001 05/03/2001 06/03/2001 07/03/2001 08/03/2001 09/03/2001 10/03/2001 11/03/2001 12/03/2001 13/03/2001 14/03/2001 15/03/2001 16/03/2001 17/03/2001 18/03/2001 19/03/2001

27 20 22 26 23 29 27 28 25

21 16 17 20 18 23 21 22 20

Tabela 3.6.

Como podemos notar, as linhas em que no havia dados apresentaram erro durante o looping. Isso ocorreu porque a condio

Recursos de programao VBA


51

estabelecida (If...Then) foi a de que a frmula seria aplicada repetidamente em cada clula ocupada. Para que as mensagens de erro no surjam na planilha, fazendo com que as clulas vazias simplesmente sejam ignoradas, utilizaremos no Exerccio 5 a instruo If...Then.

Exerccio 5
1. Com a planilha montada anteriormente, abra o editor do VBA e produza a macro seguinte. Lembre-se de que os comentrios () so apenas indicaes sobre determinados pontos do programa e, portanto, no fazem parte do cdigo:
Sub Loop5() Do If IsEmpty(ActiveCell) Then Se a clula est ativa na mesma linha, mas na coluna anterior est ocupada, ento... If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell. Offset(0, -2)) Then ActiveCell.Value = Se a clula na mesma linha, mas nas duas colunas anteriores (0,-1) e (0,-2) no esto ocupada por dados, ento a clula preenchida por um espao vazio, de nido por . Note que aqui utilizada uma condio (If) dentro de outra. Else ActiveCell.FormulaR1C1 = =Average(RC[-1],RC[-2]) Aqui, utilizamos a condio Else (De outra maneira). Se nenhuma das condies do comando anterior for satisfeita, passa-se para a situao em que se utiliza a funo de clculo da mdia normalmente. End If End If Terminam aqui as condicionais If. ActiveCell.Offset(1, 0).Select

Programao de planilhas em VBA


52

Loop Until IsEmpty(ActiveCell.Offset(0, 1)) En m, aplica-se o loop mostrado nos exerccios anteriores para o deslocamento das clulas da coluna seguinte. End Sub

2. Salve a macro e, na planilha, ative a clula C2. Em seguida, ative a macro Loop5. Note o que ocorre:
A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Mx. 20 22 27 29 25 B Mn. 16 17 21 23 20 C Mdia 18,00 19,50 24,00 26,00 22,50 D Data 01/03/2001 02/03/2001 03/03/2001 04/03/2001 05/03/2001 06/03/2001 07/03/2001 08/03/2001 09/03/2001 10/03/2001 11/03/2001 12/03/2001 13/03/2001 14/03/2001 15/03/2001 16/03/2001 17/03/2001 18/03/2001 19/03/2001

27 20 22 26 23 29 27 28 25

21 16 17 20 18 23 21 22 20

24,00 18,00 19,50 23,00 20,50 26,00 24,00 25,00 22,50

Tabela 3.7.

Como era nossa inteno, as clulas que dependiam de clulas nulas da mesma linha foram ignoradas (preenchidas com espao em branco) e no marcadas com uma mensagem de erro, como no exerccio anterior. Essa ttica pode ser utilizada para montar planilhas que no apresentam mensagens de erro ou que precisem de mensagens diferenciadas para a ausncia de contedo em cada tipo de clula.

Recursos de programao VBA


53

Select Case
Select Case uma expresso lgica utilizada para execuo de

um entre os diversos grupos de instrues presentes em um cdigo. O determinante da execuo o valor da expresso utilizada. A sintaxe de uma expresso Select Case :
Select Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else [elsestatements]] End Select

Em que: testexpression corresponde a qualquer expresso numrica, ou de seqncia, necessria para a escolha correta da funo; expressionlist-n produz uma lista delimitada a partir de algumas das seguintes formas: expression, expression To expression e Is comparisonoperator expression. A palavra-chave To especica um intervalo de valores. Se voc empregar a palavra-chave To, o valor menor deve aparecer antes dela. Aplique a palavra-chave Is com operadores de comparao (exceto Is e Like) para especicar um intervalo de valores. Se no for fornecida, a palavra-chave Is ser inserida automaticamente; statements-n faz com que uma ou mais instrues sejam executadas se testexpression coincidir com qualquer parte de expressionlist-n. um recurso opcional; elsestatements faz com que uma ou mais instrues sejam executadas se testexpression no coincidir com qualquer das clusulas Case. No tpico seguinte, damos um exemplo simples do funcionamento de Select Case montando uma planilha para o clculo de taxas. Essa pequena planilha pode ser utilizada de forma isolada ou na montagem de uma planilha de taxas um pouco mais elaborada.

Exerccio 6
1. Nosso cenrio o seguinte: Em uma determinada modalidade de taxas, os primeiros R$ 2.500,00 de todo valor so livres de taxao;

Programao de planilhas em VBA


54

Os valores superiores a R$ 2.500,00 e inferiores a R$ 5.000,00 so taxados em 5%; Todo valor maior do que R$ 5.000,00 taxado em 10%. 2. Para representar esse cenrio, vamos utilizar uma planilha em branco do Excel e preench-la da seguinte maneira: Na clula A1, digitamos Para o valor de, ao passo que na clula B1 digitamos R$ 2.000,00; Na clula A2, digitamos Taxa a pagar, enquanto na clula B2, digitamos =taxa(B1). 3. Agora, abra o editor de VBA e digite em um novo mdulo o seguinte cdigo (os comentrios so nossos):
Public Function taxa() Select Case income Case Is <= 2500 taxa = 0 Se o valor menor ou igual a R$ 2.500,00 a opo escolhida ser taxa=0 Case Is <= 5000 taxa = (5000 - 2500) * 0.05 Se o valor menor ou igual a R$ 5.000,00 a taxa ser de 0,05 ou 5% Case Else taxa = (income - 5000) * 0.1 + 125 Se o valor for maior que R$ 5.000,00, a taxa dever ser multiplicada por 0.1 mais 5% End Select End Function

4. Salve o mdulo e volte para a planilha. Em seguida, ative a clula B2, na qual inserimos a expresso que ativa a macro, e aperte a tecla Enter. Veja o resultado:
A 1 2 B Para o valor de Taxa a pagar Tabela 3.8. C R$ 20.000,00 R$ 1.625,00

Recursos de programao VBA


55

5. Com um simples arrastar-e-soltar, podemos tornar a planilha muito mais interessante, fazendo com que a macro efetue o clculo de vrios valores. uma operao muito mais simples do que montar uma funo matemtica para cada caso de taxao (so trs casos diferentes), aplicando-as manualmente ao descobrir em que caso elas se encaixam. Observe:
Para o valor de R$ 20.000,00 Taxa a pagar R$ 1.625,00 R$ 12.000,00 R$ 250.000,00 R$ 1.900,00 R$ 25.000,00 R$ 825,00 R$ 24.625,00 R$ 0,00 R$ 2.125,00

Tabela 3.9.

Caixas de texto (TextBox)


Caixas de texto so utilizadas para implementar a comunicao entre o programa e o usurio ou vice-versa. Um TextBox o controle mais utilizado para exibir informaes, inseridas por um usurio, em uma caixa de texto. Alm disso, pode exibir conjuntos de dados, como tabelas, consultas, planilhas ou o resultado de clculos. Caixas de texto so objetos dinmicos: se um TextBox estiver ligado a uma fonte de dados, a alterao do seu contedo vai alterar tambm o valor da fonte de dados acoplada. Da mesma forma, a formatao aplicada a qualquer parte do texto de um TextBox afetar todo o texto do controle. Como exemplo, se voc alterar a fonte ou o tamanho em um ponto de qualquer caractere de um controle, essa alterao afetar todos os caracteres desse controle. O TextBox um controle exvel governado pelas seguintes propriedades: Text, MultiLine, WordWrap e AutoSize. Text contm o texto exibido na caixa. Por outro lado, MultiLine controla se TextBox pode exibir texto como uma nica linha ou como mltiplas linhas. Os caracteres da nova linha identicam onde termina uma linha e onde outra comea. Se MultiLine for False, o texto ser truncado em vez de mudar automaticamente de linha. WordWrap permite que o TextBox mude automaticamente de linha quando as linhas de texto forem maiores que sua largura. Quando no utilizamos WordWrap, o TextBox iniciar uma nova linha de texto quando encontrar um caractere que indique o procedimento. Se WordWrap estiver desativado, possvel obter linhas de texto que no se ajustem completamente ao TextBox. O TextBox exibir ento

Programao de planilhas em VBA


56

as partes do texto que se ajustarem sua largura e truncar as partes que no se ajustarem. WordWrap no aplicvel, a no ser que MultiLine seja True. AutoSize controla se o TextBox ser ajustado para exibir todo o texto. Ao utilizar AutoSize com um TextBox, a largura deste diminui ou aumenta de acordo com a quantidade de texto e com o tamanho da fonte utilizada. Um TextBox um pouco diferente de uma MsgBox. Se com este comando criamos caixas que mostram mensagens na tela, com aquele somos capazes de inserir dados no programa, utilizando, portanto, a funcionalidade de caixa no sentido inverso. No Exerccio 7, criaremos uma caixa de texto simples. Nela, basta teclar Enter (comportamento quase instintivo para os usurios de computadores) para escrever algo. Novamente, os comentrios sero nossos.

Exerccio 7
1. Abra uma planilha em branco e, em seguida, o editor de VBA (Alt + F11). Logo aps, clique com o boto direito do mouse em Formulrios > Inserir > UserForm. Utilizamos a opo UserForm em vez de Mdulo, porque, no caso das caixas de texto, criaremos, antes de tudo, a estrutura grca, para, depois, complementar o objeto com cdigo. 2. Ser aberta a rea UserForm1 (Figura 3.3). Essa rea utilizada para a insero de um determinado objeto pr-modelado e sua programao.

Figura 3.3.

3. V ao menu Exibir do editor de VBA e clique na opo Caixa de ferramentas. Essa opo ativa a barra de tarefas homnima com

Recursos de programao VBA


57

vrios modelos para objetos de formulrio que podem ser anexados a um projeto de VBA. Para tanto, basta arrastar e soltar o objeto escolhido. No caso das caixas de texto, clique no objeto (Figura 3.4) e arraste-o para a rea UserForm1. O resultado ser parecido com o da Figura 3.5, em que tambm podemos ver a Caixa de ferramentas.

Figura 3.4.

Figura 3.5.

4. Isso feito, edite a caixa de texto. Para tanto, clique duas vezes no objeto e ser aberta a janela de insero de cdigo, com o seguinte contedo:
Option Explicit Private Sub TextBox1 _ Change() End Sub Private Sub UserForm _ Click() End Sub

5. Esse contedo equivale ao delineamento de uma caixa de texto simples. UserForm _ Click() o objeto do VBA que permite a ativao de um formulrio, ou de um outro objeto, a partir de uma ao do usurio; um clique do mouse ou o apertar de uma tecla, por

Programao de planilhas em VBA


58

exemplo. Por ltimo, vamos inserir o cdigo que permitir a habilitao da caixa com a tecla Enter:
Private Sub TextBox1 _ KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) Note que criamos TextBox1 como uma subfuno. Alm disso, deve-se substituir TextBox1 _ Change(), do objeto-padro, por _ KeyDown. KeyDown e um tipo de evento que s ocorre quando um usurio aperta uma determinada tecla. If KeyCode = 13 Then 13 equivale tecla Enter na tabela VBKey do VBA. Essa tabela corresponde s constantes, tambm chamadas VBKey, utilizadas para ligar o objeto VBA a eventos de teclado (teclas pressionadas) ou de mouse (cliques com os botes do dispositivo). Sheet1.Range(A65536).End(xlUp).Offset(1, 0) = TextBox1 TextBox1 = vbNullString Com Sheet1, indicamos que o comando diz respeito planilha atualmente ativa. Da mesma forma, a instruo Range(A65536) especica que todas as clulas dessa planilha sero consideradas ativas. =TextBox1 mostra ao programa que a ativao de qualquer clula da planilha equivale chamada da caixa de texto. vbNullString uma constante especial que retorna uma string nula. End If End Sub

Molduras (frames) e botes de opo (options buttons)


Nesse tpico, continuaremos a trabalhar com objetos grcos. Desta vez, no entanto, vamos nos concentrar nos frames, ou molduras, parte essencial da manipulao de objetos grcos no VBA. O frame, ou moldura, utilizado para montar um grupo de controles. Um grupo de controles consiste em um conjunto de controles relacionados conceitual ou logicamente. Como exemplo, podemos congurar um conjunto de botes, fazendo com que um deles seja clicado para acionar uma determinada opo ou funcionalidade de uma planilha, ao passo que o restante ser tratado como False. Todos os botes de opo em um frame so mutuamente exclusivos, portanto podemos utilizar um frame para criar um grupo de opes, todas verdadeiras. Como exemplo, em um aplicativo que processa pedidos, com nome, endereo e nmero de conta dos

Recursos de programao VBA


59

clientes, todas as opes sero True, mas nada impede que elas sejam agrupadas em um nico frame ou moldura. Finalmente, podemos denir os frames como formas passivas, utilizadas para moldar um conjunto de comandos em um determinado layout. Aqui, vamos mostrar a montagem de uma moldura muito simples, acompanhada de alguns botes de opes. Utilizaremos as ferramentas grcas do formulrio para a criao de nosso frame.

Exerccio 8
1. Abra o editor do VBA e, na rvore do lado direito da tela, clique com o boto direito do mouse em Formulrios, selecionando, em seguida, a opo Inserir > UserForm. Utilize o comando Selecionar objetos (Figura 3.6), da Caixa de ferramentas, e clique no formulrio criado.

Figura 3.6.

2. Posicione o cursor do mouse na lateral da rea UserForm at ele se transformar em uma seta com duas pontas. Em seguida, arraste a seta para baixo, para que o espao til da rea seja aumentado.

Figura 3.7.

3. Logo aps, acesse novamente a Caixa de ferramentas e clique duas vezes na opo Quadro (Figura 3.8). esse o comando utilizado para a montagem de um frame. O cursor do computador ser transformado em uma cruz. Arraste-a para criar um frame do tamanho desejado (Figura 3.9):

Programao de planilhas em VBA


60

Figura 3.8.

Figura 3.9.

4. Procure, agora, na Caixa de ferramentas, pelo comando Boto de opo (Figura 3.10). Clique duas vezes no comando e arraste-o para dentro do frame. Repita o processo trs vezes, criando uma leira vertical com trs botes de opo, como mostramos na Figura 3.11:

Figura 3.10.

Figura 3.11.

Recursos de programao VBA


61

5. Clique com o boto direito do mouse sobre a moldura que circunda o frame e selecione a opo Propriedades. A moldura o quadrado com hachuras que utilizamos para movimentar o objeto e alterar seu tamanho. Do lado inferior-esquerdo da tela, surgir a janela Propriedades, na qual podemos alterar as conguraes do objeto por meio de um sistema de formulrios em que cada linha equivale a uma das propriedades do frame utilizado.

Figura 3.12.

6. Nessa mesma janela, selecione a linha BackColor (Cor de Fundo) e expanda o menu suspenso que aparece ao lado da opo. Altere a cor do frame para a cor-padro da rea de trabalho do Windows, clicando na opo de cor rea de trabalho. Tambm poderamos completar tal atividade com a ajuda de cdigo e com a propriedade BackColor, que obedece seguinte sintaxe:
objeto.BackColor [= Longo]

Em que objeto deve ser substitudo pelo nome do elemento atualmente manipulado, como um frame. Longo deve ser substitudo

Programao de planilhas em VBA


62

pelo valor-cdigo da cor escolhida, com qualquer inteiro que represente uma cor vlida. Tambm podemos especicar uma cor utilizando a funo RGB com componentes em cores vermelha, verde e azul. O valor de cada componente de cor um inteiro que varia de zero a 255. Como exemplo, podemos especicar azul turquesa com o valor inteiro 4966415 ou os componentes vermelho, verde e azul como 15, 200 e 75, respectivamente. O cdigo da cor de fundo do objeto caria mais ou menos assim:
TextBox6.BackColor = RGB(0, 255, 0) Esta combinao de RGB equivale cor verde. TextBox3.BackColor = RGB(0, 255, 255) Esta combinao equivale ao ciano TextBox3.BorderColor = RGB(0, 0, 0) Aqui criamos um fundo preto TextBox4.BackColor = RGB(0, 0, 100) Aqui temos azul-marinho TextBox5.BackColor = RGB(128, 128, 128) Um cinzento bem pronunciado

7. Na linha Caption, podemos dar ao objeto um nome que ser mostrado para o usurio. Se nenhum nome for atribudo, o nomepadro do objeto ser exibido na tela. Para nosso frame, atribuiremos a frase: Escolha seu lanche. Tambm possvel faz-lo com a linha de comando: a propriedade Caption ser sempre a primeira na declarao de propriedades de um objeto.
Private Sub Frame1() Frame1.Caption = Escolha seu lanche

8. Clique, agora, com o boto direito do mouse no primeiro Boto de opo, no interior da moldura, e selecione novamente a opo Propriedades. A janela que antes existia para o objeto Frame ser sobreposta com a do objeto OptionButton1. A primeira coisa a ser alterada a cor de fundo do objeto, para que ele acompanhe a cor de fundo do frame. O resultado nal exibido na gura a seguir:

Recursos de programao VBA


63

Figura 3.13.

9. Para testar o comportamento do aplicativo, clique no boto Salvar e, em seguida, execute o aplicativo apertando o boto Executar Sub/UserForm (Figura 3.14). No resultado nal, voc ver a tela de selees surgir (Figura 3.15).

Figura 3.14.

Figura 3.15.

Voc deve ter percebido que o objetivo desse exerccio era manipular objetos visuais do VBA, alterando algumas de suas conguraes, e no criar um aplicativo acabado. Basta notar que as aes

Programao de planilhas em VBA


64

denidas no foram atreladas aos botes e que no foi criado um boto de OK ou outra forma de sair do aplicativo.

UserForms e objetos
Este projeto ser mais elaborado que o anterior, pois vamos atrelar aes especcas ListBox e aos demais componentes presentes em nosso frame. Alm disso, teremos de criar diversas estruturas menores para povoar nossa moldura, o que comearemos a fazer no Exerccio 9, antes de partirmos para a montagem da ListBox propriamente dita.

Exerccio 9
1. Abra o editor de VBA e, em seguida, clique com o boto direito do mouse no diretrio Formulrios, localizado na rvore esquerda da tela. Escolha a opo Inserir > UserForm. 2. Aumente o tamanho da rea da UserForm com o cursor. Logo aps, clique com o boto direito do mouse e selecione a opo Propriedades. Aparecer a tela de propriedades da UserForm, em que podemos alterar todos os valores relacionados ao objeto, como j zemos no exerccio anterior. 3. Anteriormente, apresentamos algumas propriedades como
Caption. Agora, nos deteremos um pouco mais sobre algumas delas

e sobre o modo de edit-las. Name: o nome com o qual vamos identicar a UserForm. Tem de ser um nome nico, sem espaos ou smbolos como separadores. Um bom truque iniciar o nome do objeto com UF. Assim, sempre que o cdigo zer referncia a esse objeto, saberemos que se trata de uma UserForm; Caption: como j vimos, Caption se refere ao ttulo que o usurio ver no quadro de dilogo. Podemos inserir qualquer tipo de texto, incluindo espaos; BackColor: a cor de fundo da caixa de dilogo. J vimos como realizar a alterao da propriedade BackColor no Exerccio 8; ForeColor: a cor do primeiro plano, ou seja, a cor do texto que aparece na caixa de dilogo; Font: a fonte utilizada como padro para a caixa de dilogo, incluindo os botes de controle presentes;

Recursos de programao VBA


65

StartupPosition: a posio em que aparecer a caixa de dilogo. Ao utilizarmos, por exemplo, o valor CenterScreen, o objeto ser exibido no centro da tela; SpecialEffect: so efeitos especiais para a borda da caixa de dilogo; Picture, PictureAlignment, PictureSizeMode e PictureTiling: so propriedades utilizadas para inserir e formatar as caractersticas de guras no interior da UserForm. 4. Agora, vamos inserir uma caixa de texto em nossa UserForm. Para tanto, na janela Caixa de ferramentas, clique no boto Caixa de texto e arraste o objeto para a UserForm. possvel utilizar o mouse para alterar a localizao e o tamanho desse controle. 5. Clique com o boto direito do mouse na caixa de texto e selecione a opo Propriedades. Aparecer a janela Propriedades do lado direito da tela. Vejamos as principias propriedades com que trabalharemos: Name: o nome do objeto. Como j apontamos anteriormente em relao UserForm, aqui tambm no permitida a utilizao de espaos ou smbolos. Voc pode nomear o objeto como TB (iniciais de TextBox) para identic-lo no decorrer do cdigo; Text: corresponde ao texto no interior da caixa de texto. Podemos inserir um texto do tipo: Preencha com seus dados, ou Digite um nmero. Essa caixa pode ser editada pelo usurio com a insero de novos dados; TextAlign: alinhamento do texto dentro da UserForm. Normalmente, se queremos que o usurio introduza uma seqncia de texto, preciso alinhar o texto esquerda ( mTextAlignLeft). Se for preciso introduzir nmeros, costuma-se alinhar o texto direita (fmTextAlignRight). Para alinhar um texto de forma centralizada, escolha fmTextAlignLeft; MultiLine: estabelece se os valores possveis so True ou False. Tais valores indicam se ser possvel que o usurio escreva ou no mais de uma linha na caixa de texto. Na propriedade TextAlign, vamos escolher fmTextAlignRight, j que usaremos essa caixa para inserir um nmero.

Programao de planilhas em VBA


66

6. Agora, vamos inserir um texto descritivo do lado do quadro de edio. Para tanto, vamos, novamente, para a janela Caixa de ferramentas, em que selecionaremos a opo Rtulo (Figura 3.16), posicionando-o acima da caixa de texto. Todos os elementos de texto de uma UserForm que no correspondam a objetos editveis, mas somente a textos indicativos ou explicativos, devem ser montados com a ajuda da opo Rtulo:

Figura 3.16.

7. Clique com o boto direito do mouse sobre o Rtulo e selecione a opo Propriedades. A propriedade utilizada para fazer com que o rtulo mostre um texto Caption. Preencha-a com o texto Digite um nmero. Terminamos nosso exerccio com uma bela estrutura: alinhamento, nomes, tudo estabelecido. Porm, um aplicativo em VBA ou em qualquer outra linguagem de programao deve possuir uma maneira de ser reiniciado ou nalizado. Em aplicativos grcos, isso feito por botes de controle. No exerccio seguinte, vamos construir um boto de controle dentro da UserForm anteriormente criada, alm de lhe atribuir uma funo.

Exerccio 10
1. Na UserForm em que trabalhamos no exerccio anterior, montaremos um boto OK e um boto Cancelar. Iniciamos pelo Cancelar, de execuo um pouco mais simples. Comeamos novamente pela Caixa de ferramentas, selecionando o comando Boto de comando (Figura 3.17):

Figura 3.17.

2. Posicione o boto na parte inferior da UserForm. Em seguida, d-lhe um clique com o boto direito do mouse e selecione Propriedades. Vamos editar algumas das propriedades do objeto:

Recursos de programao VBA


67

Name: no nome do controle, vamos escrever cbCancel, para documentar o cdigo (cb a sigla para CommandButton); Caption: no texto exibidos no boto, logicamente vamos escrever Cancelar; Cancel: essa propriedade pode ter o valor True ou False. S pode existir um controle em uma determinada caixa de dilogo ou UserForm com a propriedade Cancel estabelecida como verdadeira. Se dermos Cancel o valor True, basta que o usurio utilize a tecla Esc para que o boto editado seja ativado, como se tivesse utilizado o mouse. Selecione a opo True; Default: com valor True ou False, indica se o boto pertence caixa de dilogo. Se optarmos por denir a propriedade como True, o boto ser ativado, assim como seria ativado com a tecla do mouse se o usurio apertasse a tecla Enter. Como o boto em questo o boto Cancelar, e, alm disso, pretendemos reservar a propriedade Default para o boto OK, que montaremos mais tarde, optamos por False. Se executarmos o projeto agora, veremos que temos um boto acionado com a tecla Esc, mas que no faz nada alm disso. Para que o boto faa alguma coisa, preciso operar com um conceito muito importante da programao a objetos: os eventos. 3. Um evento uma ao concreta que ocorre sempre que um objeto ou propriedade ativado por um agente, que pode ser uma tecla, um clique do mouse ou outro objeto. O comum para um boto Cancelar que o usurio clique com o mouse ou o selecione com o teclado. Esse tipo de evento chamado de Click. Criaremos um evento Click, chamando- o de cbCancelar _ Click(). Para tanto, clicamos duas vezes no boto Cancelar, exibindo a janela de cdigo correspondente ao projeto. 4. Vejamos o seguinte cdigo:
Private Sub cbCancelar _ Click() End Sub

O Excel encarregou-se de criar a estrutura do evento. Agora, temos de preench-lo. A instruo que utilizamos para fechar uma UserForm Unload, que serve para limpar um objeto da memria

Programao de planilhas em VBA


68

ativa do sistema. A instruo Unload requer um parmetro, utilizado para indicar qual objeto deve ser retirado da memria. Em nosso caso, utilizaremos a palavra-chave Me, que aponta o objeto em que estamos executando o cdigo, ou seja, nossa UserForm. 5. Nosso cdigo, ento, caria assim:
Private Sub cbCancelar _ Click() Unload Me End Sub

Faa o teste. Rode o aplicativo e clique no boto Cancelar (ou aperte a tecla Esc). Se a janela for fechada, o boto est funcionando. Com a tcnica de criao de botes, vamos passar para o prximo exerccio. Nele, criaremos mais um boto, to necessrio quanto o boto Cancelar: o boto OK.

Exerccio 11
1. Abra a Caixa de ferramentas e clique em Boto de comando. Coloque esse novo boto na UserForm em que criamos o boto Cancelar. O ideal posicion-lo do lado esquerdo do Cancelar. 2. Clique, com o boto direito do mouse, sobre o comando e selecione a opo Propriedades. Em Name, digite cbOK, ou o nome que voc quer dar ao boto. Em Caption, denimos que a mensagem inscrita no boto ser OK. 3. Na propriedade Default, denimos o valor como True. Dessa forma, sempre que o usurio apertar a tecla Enter, o boto OK ser ativado, da mesma forma que ocorreria se o mouse tivesse sido utilizado. 4. Clique duas vezes no boto para que surja a janela de cdigo. Dentro da estrutura do boto
Private Sub cbOK _ Click() End Sub

idntica do boto Cancelar, insira o seguinte cdigo:

Recursos de programao VBA


69

Private Sub cbOK _ Click() ActiveCell.Value = TextBox1.Value Unload Me End Sub

Essa funo praticamente igual que inserimos no boto Cancelar, com a exceo de que, antes de fechar a caixa de dilogo, temos de escrever uma outra linha, que se encarrega de copiar a clula ativa da planilha qual pertence o aplicativo com o contedo da caixa de texto. Observe que ativamos a caixa de texto por meio do nome do controle (TextBox1) e sua propriedade Value:
ActiveCell.Value = TextBox1.Value

Estabelecemos que a clula da planilha igual ao valor da caixa de texto presente na UserForm. Se no existir nenhum caractere numrico na caixa de texto, o valor capturado para a clula ser 0.

UserForms mais elaboradas


Nesse tpico, vamos construir uma UserForm mais elaborada, aproveitando para mostrar mais alguns recursos da Caixa de ferramentas. Suponhamos que temos uma folha de clculo em que h uma clula com o nome de uma pessoa e outra com o sobrenome. Criaremos uma UserForm que permita ao usurio editar seu nome e sobrenome localizados na planilha e que, alm de tudo, logo que se aperte o boto OK na caixa de dilogo, transra os valores inseridos pelos usurios para a planilha.

Exerccio 11
1. Antes de tudo, vamos criar nossa planilha. primeira coluna, que ter os nomes, daremos o ttulo de rgNome, e a segunda coluna, responsvel pelos sobrenomes, chamaremos de rgSobrenome. 2. Agora, acessamos o editor de VBA e criamos uma UserForm. Mediante o boto direito do mouse, abra o menu Inserir > UserForm. Vamos dar a essa UserForm o nome de ufDadosPessoais, editando a linha Name da janela Propriedades.

Programao de planilhas em VBA


70

3. Clique na Caixa de ferramentas e insira duas caixas de texto, uma para o nome e outra para o sobrenome, s quais daremos os nomes tbNome e tbSobrenome. 4. Inserimos, agora, dois rtulos, que colocaremos esquerda de cada uma das caixas de texto. No primeiro rtulo, escreveremos Nome e, no segundo, Sobrenome. Para tanto, edite as linhas Caption das janelas de propriedades de cada objeto.

Figura 3.18.

5. Clique, agora, no comando Boto de comando, da Caixa de ferramentas, e arraste um boto para a UserForm. Na janela Propriedades, mude o nome do boto para cbCancelar, digite Cancelar na linha Caption e, na propriedade Cancel, selecione o valor True. 6. Inserimos, ento, um boto OK, nomeando-o como cbOK. Na linha Caption, setaremos OK e daremos propriedade Default o valor True. 7. Vamos aos eventos: para o boto Cancelar a funo que devemos escrever exatamente igual mostrada no exerccio anterior:
Private Sub cbCancelar _ Click() Unload Me End Sub

Recursos de programao VBA


71

A nica coisa que esse boto faz fechar a caixa de dilogo assim que o boto Cancelar pressionado pelo mouse ou acionado pela tecla Esc. 8. A funo para o boto OK tambm bem parecida com a anterior:
Private Sub cbOK _ Click() Range(rngNome).Value = tbNome.Text Range(RngSobrenome).Value = tbSobrenome.Text Unload Me End Sub

Essa funo executada quando produzimos o evento Click do boto chamado cbOK. Porm, antes de fechar a caixa de dilogo, a funo guarda nas clulas de nossa planilha os valores presentes nas caixas de texto. Para tanto, utilizamos um objeto Range e estabelecemos que sua propriedade Value igual ao valor da propriedade Text do objeto TextBox. 9. Execute o aplicativo e observe que ele funciona perfeitamente: se alterarmos os nomes na UserForm e clicarmos em OK, veremos que as clulas da planilha tambm tero seu contedo alterado e agora armazena novos nomes. No entanto, algo escapou. Se acessarmos diretamente a planilha, podemos alterar os nomes contidos nas clulas e depois, ao executar a UserForm, veremos que os controles de edio no tm os nomes atualizados, pois no so capazes de recolher as alteraes feitas diretamente na folha de clculo. 10. Para resolver esse problema, vamos utilizar um evento especco para a UserForm. Esse evento chama-se Inicialize e executado antes de o UserForm surgir na tela. Para criar esse evento, clique com o boto direito do mouse sobre a UserForm de nosso aplicativo e, depois, em Exibir cdigo. 11. No menu suspenso, localizado no canto superior direito da tela, substitua Click por Initialize. O Excel criar uma estrutura para essa nova funo:

Programao de planilhas em VBA


72

Private Sub UserForm _ Initialize() End Sub

12. no miolo dessa funo que temos de escrever o cdigo a ser executado antes que a UserForm seja exibido. O que vamos fazer inserir nas duas caixas de texto o contedo das clulas com esses dados. Para tanto, utilizaremos o seguinte cdigo:
Private Sub UserForm _ Initialize() tbNome.Text = Range(rngNome).Value tbSobrenome.Text = Range(rngSobrenome).Value End Sub

Recursos de programao VBA


73