Вы находитесь на странице: 1из 9

Declarao de Varivel.

Introduo Variveis so elementos temporrios num cdigo que possui informao sobre uma aplicao, procedimento ou objeto.

A declarao de uma varivel tem a finalidade de pr-avisar o compilador do VBA qual o tipo de dado que ser tratado. No VBE, o comando para declarar uma varivel Dim:

Sub Ex01() Dim lng As Long lng = 5 Debug.Print lng End Sub No exemplo acima, a varivel lng definida como um nmero inteiro longo. Obviamente, se tentarmos executar o cdigo: Sub Ex02() Dim lng As Long lng = "Benzadeus" Debug.Print lng End Sub A seguinte tela de erro ser apresentada:

Esse erro foi gerado porque como lng foi declarado como um longo, se tentarmos atribuir uma string a ele, uma incompatibilidade detectada. Alm nos nmeros longos, existem os decimais, os inteiros, os tipos de dados no numricos tambm como string e data. Para saber mais sobre os tipos de dados do VBA, clique aqui . Declarando-se a varivel var1 conforme abaixo, os cdigos abaixo no retornaro erro: Sub Ex03() Dim var1 var1 = 8 Debug.Print var1 End Sub Sub Ex04() Dim var1 var1 = "Felipe" Debug.Print var1 End Sub Declarar uma varivel sem especificar seu tipo tem o mesmo efeito de omitir o comando Dim: Sub Ex05() var1 = 8 Debug.Print var1 End Sub Sub Ex06() var1 = "Felipe" Debug.Print var1 End Sub Para esses procedimentos que no foi especificado o tipo da declarao da varivel ou que a declarao foi omitida, o VBA atribui automaticamente, em tempo de execuo, o tipo da varivel. Por exemplo, no instante que se tenta atribuir 8 var1, o VBA convertevar1 numa varivel do tipo inteiro. Mas no pra por a. Considere o exemplo abaixo:

Sub Ex07() Dim var1

Debug.Print TypeName(var1) var1 = 8 Debug.Print TypeName(var1) var1 = 75000 Debug.Print TypeName(var1) var1 = -8.54 Debug.Print TypeName(var1) var1 = "st" Debug.Print TypeName(var1) var1 = 4 Debug.Print TypeName(var1) End Sub O comando TypeName(parmetro) retorna qual o tipo da varivel (longo, inteiro, string, double). Observe que, ao executar o cdigo acima, o VBA converter a varivel de acordo com a necessidade. Isso uma vantagem? Bem, sim e no. A vantagem que voc tem uma facilidade enorme para inserir e converter os tipos de variveis em seu cdigo, mas medida que este vai ficando grande, as coisas podem comear a complicar:

Sub Ex08() strApelido = "Benzadeus" Select Case strApelido Case "Benzadeus": lngPontos = 28 Case "Creuza": lngPontos = 24 Case "Doutior": lngPontos = 7 End Select MsgBox _ Prompt:=strApelido & " tem " & lngPotos & " pontos!", _ Buttons:=vbInformation, _ Title:="Informao" End Sub O simples cdigo acima pode te deixar puto por algum tempo at voc descobrir por que, ao executar o cdigo, no MsgBox nunca aparece quantos pontos a porra do strApelido tem. Voc observou que escrevi lngPotos ao invs de lngPontos? Pois . Se num cdigo desse tamanho j suficiente para nos fazer perder tempo, imagina quando estamos falando de cdigos de milhares de linhas. A seo a seguir explica como evitar esse tipo de equvoco. Vale ressaltar que a omisso do tipo de dado na declarao de uma varivel automaticamente a trata como uma Variant. Os cdigos abaixo so semelhantes:

Sub Ex08B() Dim strMatriz End Sub ' equivalente a: Sub Ex08C() Dim strMatriz As Variant End Sub Regras para Declarao de Varivel Existem regras para a nomenclatura de variveis no VBA: -Variveis devem comear obrigatoriamente com letras, ou seja, nmeros no so permitidos; -O nome de uma varivel no pode ter mais que 250 caracteres; -Uma varivel no pode ter o mesmo nome de um dos objetos/classes das bibliotecas referenciadas no projeto. Por exemplo, se voc estar no Word, no pode chamar uma varivel de Document, pois esta j existe na biblioteca Microsoft Word 14.0 Object Library, por exemplo;

-No pode haver espao no nome da varivel. Voc pode, entretanto, usar hifens ou letras maisculas para organizar o nome delas, como por exemplo strPrimeiroNome ou str_Primeiro_Nome; As boas prticas de programao sugerem que deve-se usar uma terminologia organizada para no se perder nos nomes das variveis. O final da se a seguir explora um pouco mais esse assunto.

Declarao de Varivel Obrigatria No VBA, existe uma forma de restringir quais so as variveis que podem aparecer no cdigo. Considere o cdigo abaixo, que nada mais o procedimento Ex08 com o comando Option Explicit e as declaraes das variveis que devem existir no cdigo. Observe que o comando Option Explicit deve preceder todos os procedimentos e funes de um mdulo: Option Explicit Sub Ex09() Dim strApelido As String Dim lngPontos As Long strApelido = "Benzadeus" Select Case strApelido Case "Benzadeus": lngPontos = 28 Case "Creuza": lngPontos = 24 Case "Doutior": lngPontos = 7 End Select MsgBox _ Prompt:=strApelido & " tem " & lngPotos & " pontos!", _ Buttons:=vbInformation, _ Title:="Informao" End Sub Se tentarmos executar o cdigo acima, o erro ser gerado: Instantaneamente, o usurio perceber que no local onde o VBA automaticamente sublinha, cometeu um erro de digitao. Para ativar obrigatria a declarao de varivel, no VBE, v em Ferramentas / Opes, Cheque Requerer Declarao de varivel:

Pronto, agora todos os mdulos criados pela Aplicao trar, em sua primeira linha, o comando Option Explicit. As boas prticas de programao defendem a declarao de varivel obrigatria. Ento, se voc quiser desenvolver aplicaes srias em VBA, ative essa opo. Declarao por Sufixos Caso deseje definir uma varivel atravs de um sufixo, utilize a tabela abaixo:

Ou seja, os procedimentos Ex10 e Ex11 exemplificados abaixo tm o mesmo efeito: Sub Ex10() Dim strNome As String Dim lngIdade As Long Dim dblPosio As Double End Sub Sub Ex11() Dim strNome$ Dim lngIdade&

Dim dblPosio# End Sub Pessoalmente, fao uso da topologia do Ex10. Pra qu complicar, n? Gostaria de chamar ateno para o nome das minhas variveis. Observe que se for do tipo String, uso o prefixo str em seu nome para defin-la. Isso considerada boa prtica de programao. Normalmente nomeio minhas variveis de acordo com a tabela abaixo:

Por Que Usar Variveis? Considere o exemplo abaixo, cdigo para uma aplicao em Excel: Sub Ex12() Range("A1").Value Range("A2").Value Range("A3").Value Range("B2").Value End Sub A expresso Range("B2").Value est repetindo vrias vezes. Isso torna o cdigo confuso para o depurador e, alm disso, toda a vez que o objeto Range chamado, o VBA invoca uma chamada propriedade Value do objeto, diminuindo a velocidade de execuo do programa. Uma forma de melhorar o cdigo acima dado no exemplo abaixo: Sub Ex13() Dim lng As Long lng = Range("B2").Value Range("A1").Value Range("A2").Value Range("A3").Value Range("B2").Value = = = = lng lng * 2 lng * 3 lng * 4 = = = = Range("B2").Value Range("B2").Value * 2 Range("B2").Value * 3 Range("B2").Value * 4

End Sub Primeiramente atribui-se um valor lng. Posteriormente, basta fazer chamadas da varivel. Variveis Locais e Variveis Globais Observe o cdigo abaixo. Preste ateno que so chamados mdlLocaisGlobais emdlLocaisGlobais2: colados cdigos de dois mdulos diferentes,

'********MDULO MDLLOCAISGLOBAIS1******** Dim lMdulo As Long Public lGlobal As Long Sub PrincipalLocaisGlobais() Dim lProcedto As Long lProcedto = lProcedto + 1 lMdulo = lMdulo + 1 lGlobal = lGlobal + 1 Debug.Print "lProcedto: ", lProcedto Debug.Print "lMdulo: ", lMdulo Debug.Print "lGlobal: ", lGlobal End Sub Sub AuxiliarLocaisGlobais() 'A linha abaixo compila porque a varivel definida 'como Global (Public) Debug.Print "lGlobal: ", lGlobal 'A linha abaixo compila porque a varivel definida 'no nvel do Mdulo: Debug.Print "lMdulo: ", lMdulo 'A linhas abaixo geraria erro de compilao porque a varivel 'lProcedto no nvel do Procedimento PrincipalLocaisGlobais 'Debug.Print "lProcedto: ", lProcedto End Sub '********FIM MDULO MDLLOCAISGLOBAIS1******** '********MDULO MDLLOCAISGLOBAIS2******** Sub OutroMdulo() 'A linha abaixo compila porque a varivel lGlobal definida 'como Global (Public): Debug.Print "lGlobal: ", lGlobal 'As linhas abaixo gerariam erro de compilao porque a varivel 'lMdulo definida no nvel do mdulo mdlLocaisGlobais1 e a 'Varivel lProcedto definida no nvel do Procedimento PrincipalLocaisGlobais 'Debug.Print "lMdulo: ", lMdulo 'Debug.Print "lProcedto: ", lProcedto End Sub '********FIM MDULO MDLLOCAISGLOBAIS2******** Nesse exemplo temos um total de trs variveis declaradas: so elas lProcedto, lMdulo e lGlobal. lProcedto o que se diz de uma varivel declarada no nvel do Procedimento (ou Funo). Ou seja, apenas chamadas ou alteraes da varivel dentro do Procedimento a que ela se encontra (que o PrinipalLocaisGlobais) so compiladas pelo VBA. lMdulo o que se diz de uma varivel declarada no nvel do Mdulo. Logo, todos os procedimentos dentro do mdulomdlLocaisGlobais1 podem ler ou alterar valores dessa varivel. Ela est declarada no nvel do mdulo porque ela se encontra nas primeiras linhas do mdulo, antes do cabealho do primeiro Procedimento, fora de qualquer Procedimento. lGlobal o que se diz de uma varivel declarada no nvel Global (ou Pblico). Qualquer Procedimento ou Funo do projeto pode ler ou alterar seu valor. Ela est declarada no nvel Global porque se encontra nas primeiras linhas do mdulo, antes do cabealho do primeiro Procedimento, fora de qualquer Procedimento e possui, ao invs do prefixo Dim, o prefixo Public. Observe que, ao executar a rotina PrincipalLocaisGlobais, a , a sada ser: lProcedto: 1 lMdulo: 1 lGlobal: 1 Caso seja executado o Procedimento AuxiliarLocaisGlobais, a sada ser: lGlobal: 1

lMdulo: 1 Se for executado o Procedimento OutroMdulo, presente no Mdulo mdlLocaisGlobais2, a sada ser: lGlobal: 1 Com isso, torna-se claro como que os nveis de declarao das variveis afetam as permisses de leitura e alterao que os Procedimentos tem sobre cada varivel.

Valor de Algumas Variveis Preservado Num primeiro momento, como mostrado acima, ao ser executada a rotina PrincipalLocaisGlobais, a sada foi: lProcedto: 1 lMdulo: 1 lGlobal: 1 Vamos experimentar executar essa rotina novamente e ver qual ser a sada: lProcedto: 1 lMdulo: 2 lGlobal: 2 Rodando mais uma vez: lProcedto: 1 lMdulo: 3 lGlobal: 3 Note que o valor das variveis lMdulo e lGlobal incrementa, e o valor de lProcedto no. Isso ocorre porque variveis declaradas no nvel do mdulo ou globais preservam seus valores na memria mesmo aps o trmino da execuo da rotina. J, variveis no nvel do Procedimento so resetadas a cada vez que o Procedimento chamado. O programador pode ter problemas em suas rotinas caso ele deseje sempre que uma rotina inicie com todos os parmetros limpos. Para contornar essa situao, uma das idias fazer como abaixo:

Sub PrincipalLocaisGlobais_Limpar() lMdulo = 0 lGlobal = 0 '...resto do cdigo End Sub O cdigo acima deve estar no incio da rotina do programa: as variveis que retm seus valores so zeradas manualmente. Declaraes Estticas Suponha que voc queria manter o valor de uma varivel toda vez que ela for executada. Podemos usar o prefixo de declarao Staticao invs de Dim. Observe o exemplo abaixo: Sub Principal() Debug.Print "---Antes---" Esttico Debug.Print "---Depois---" Esttico End Sub Sub Esttico() Dim lDinmica As Long Static lEsttica As Long lDinmica = lDinmica + 8 lEsttica = lEsttica + 8 Debug.Print "lEsttica: " & lEsttica Debug.Print "lDinmica: " & lDinmica End Sub

A rotina Esttico chamada duas vezes. Imprime-se a sada da rotina aps ser executada pela primeira e pela segunda vez. A sada mostrada abaixo: ---Antes--lEsttica: 8 lDinmica: 8 ---Depois--lEsttica: 16 lDinmica: 8 A varivel lEsttica definida com a palavra Static. Isso significa que o VBA preserva na memria o valor da varivel quando finda a execuo da rotina. O nico problema nesse caso que alm de preservar o valor da memria ao sair da rotina, o VBA tambm preserva quando finda a execuo de todas as rotinas. Isto , os valores das variveis estticas so preservados e se voc tentar executar a mesma rotina novamente, ter como resultado: ---Antes--lEsttica: 24 lDinmica: 8 ---Depois--lEsttica: 32 lDinmica: 8 e, se executar ainda novamente: ---Antes--lEsttica: 40 lDinmica: 8 ---Depois--lEsttica: 48 lDinmica: 8 ...e assim por diante. O que aconteceu que na primeira vez que a rotina foi executada o valor da varivel era igual ao seu valor na ltima execuo da rotina. Para zerar uma varivel esttica no incio de uma rotina, sugiro fazer algo como mostrado a seguir: Dim blResetarEsttico As Boolean Sub Principal() blResetarEsttico = True Debug.Print "---Antes---" Esttico Debug.Print "---Depois---" Esttico End Sub Sub Esttico() Dim lDinmica As Long Static lEsttica As Long If blResetarEsttico = True Then lEsttica = 0 blResetarEsttico = False End If lDinmica = lDinmica + 8 lEsttica = lEsttica + 8 Debug.Print "lEsttica: " & lEsttica Debug.Print "lDinmica: " & lDinmica End Sub Observe que existe uma varivel no nvel de Mdulo chamada blResetarEsttico. Ela comea como True e, quando a rotina Esttico executada pela primeira vez, zera-se o valor de lEsttica e atribuise False a blResetarEsttico. Agora, lEsttica ser zerada novamente apenas quando a rotina Principal for executada novamente.

Вам также может понравиться