Como utilizar variáveis nos subprodutivos do Excel no Visual Basic for Applications

Introdução

Este artigo descreve como utilizar variáveis nos subprodutivos do Microsoft Excel no Microsoft Visual Basic for Applications.

Mais Informações

Variáveis num sub-procedimento

Uma funcionalidade avançada das linguagens de programação é a capacidade de armazenar algo numa variável para que os conteúdos da variável possam ser utilizados ou possam ser alterados posteriormente no procedimento. Este documento aborda a seguinte utilização de variáveis no Visual Basic:

  • Como as variáveis são declaradas.
  • Os procedimentos e os projetos que podem utilizar a variável.
  • A duração de uma variável.

Declarar uma variável numa macro

A forma mais simples de declarar uma variável numa macro é utilizar a instrução Dim. A linha seguinte declara duas variáveis, como números inteiros:

    Dim x As Integer, y As Integer

Com x e y especificados como números inteiros, está a dizer ao Visual Basic para reservar memória suficiente para uma variável de número inteiro (2 bytes cada para x e y) e que as informações armazenadas em x ou y são um número inteiro entre -32768 e 32767.

NOTA: Se declarar mais do que uma variável com uma única instrução Dim, tem de especificar o tipo de dados para cada variável.

Se não especificar o tipo de dados para cada variável, como no seguinte código do Visual Basic, apenas a variável y é configurada como uma variável de número inteiro. A variável x será um tipo de variante:

    Dim x, y As Integer

Para obter informações adicionais, veja Tipo de dados variante abaixo.
 

Para realizar um teste de variável, siga estes passos:

  1. Guarde e feche todos os livros abertos e, em seguida, abra um novo livro.

  2. Inicie o Visual Basic Editor (prima Alt+F11).

  3. No menu Inserir , clique em Módulo.

  4. Escreva o seguinte código:

    Sub Variable_Test()
        Dim x As Integer, y As Integer
        x = 10
        y = 100
        MsgBox "o valor de x é " & x & _
        Chr(13) & "o valor de y é " & y
    End Sub

  5. Execute a macro Variable_Test . Recebe a seguinte mensagem:

    the value of x is 10
    the value of y is 100

  6. Clique em OK.

  7. Na Variable_Test macro altere a seguinte linha:

    x = 10

  8. para:

    x = "error"

  9. Execute a macro Variable_Test .

Receberá um erro de tempo de execução porque "error" não é um número inteiro e está a tentar atribuir este valor de cadeia à variável de número inteiro x.
 

Resumo do tipo de dados

Estes são os tipos de dados variáveis comuns:

tipos de dados de variáveis comuns

tipo de dados Variant

Se não especificar um tipo de dados quando declara uma variável ou não declara uma variável, o Visual Basic especifica automaticamente o tipo de dados de variante para esta variável. Seguem-se as vantagens das variáveis declaradas como este tipo de dados:

  • As variáveis podem conter valores numéricos, de cadeia, de data, de hora, booleanos ou numéricos.
  • As variáveis podem converter os valores que contêm automaticamente.

A desvantagem é que as variáveis de variante requerem, pelo menos, 16 bytes de memória. 16 bytes de memória podem ser significativos em procedimentos grandes ou em módulos complexos.

Para ver como funciona na macro Variable_Test, siga estes passos:

Altere o código na macro Variable_Test para:


Sub Variable_Test()
    Dim x, y
    x = "string"
    y = 1.23
    MsgBox "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
End Sub

Execute a macro Variable_Test .

Não receberá um erro porque pode atribuir qualquer coisa às variáveis de variante x e y.

NOTA: Também pode deixar de fora a seguinte linha e a macro continuará a funcionar, uma vez que as variáveis x e y são tratadas como tipos de dados Variante:

    Dim x, y

Âmbito de uma variável

Quando declara uma variável, esta pode ou não ser vista por outras macros no mesmo módulo, noutros módulos ou noutros projetos. Esta disponibilidade de uma variável nos módulos é referida como âmbito. Os três tipos de âmbito são ao nível do procedimento, ao nível do módulo privado e ao nível do módulo público. O âmbito depende de como e onde declara a variável ou variáveis.

Âmbito ao nível do procedimento

Uma variável com âmbito ao nível do procedimento não é vista fora do procedimento em que é declarada. Se definir o valor de uma variável que tenha um âmbito ao nível do procedimento, os conteúdos dessa variável não serão vistos por outras macros.

Para verificar se uma variável com âmbito ao nível do procedimento não é vista fora do procedimento em que é declarada, siga estes passos:

  1. Insira um novo módulo no seu projeto.

  2. Escreva ambas as seguintes macros neste módulo:
      Sub Macro1() Dim x As Integer x = 10 MsgBox "x, conforme visto pela Macro1 é " & x "a linha seguinte executa Macro2 Macro2 Sub-Macro2() MsgBox "x, como visto pela Macro2 é " & x Sub-End

  3. Execute Macro1 e receberá a seguinte mensagem:

    x, as seen by Macro1 is 10

  4. Clique em OK e receberá a seguinte mensagem:

    x, as seen by Macro2 is

  5. Clique em OK.

Macro2 não apresenta um valor para a variável x porque a variável x é local para Macro1.

Âmbito ao nível do módulo privado e público

Pode definir variáveis na secção de declarações de um módulo (na parte superior de um módulo, acima de todos os procedimentos) e definir o âmbito da variável com a instrução Pública, a instrução Dim ou a instrução Privada. Se colocar a instrução Pública à frente da variável, a variável estará disponível para todas as macros em todos os módulos do projeto. Se colocar a instrução Dim ou a instrução Privada à frente da variável, a variável só está disponível para macros no módulo onde está a ser declarada.

Para ver a diferença entre a declaração Pública e a instrução Dim, siga estes passos:

  1. Guarde e feche todos os livros abertos e, em seguida, abra um novo livro.

  2. Inicie o Visual Basic Editor.

  3. Insira um módulo no seu projeto.

  4. Type the following code into this module:
    
    Public x As Integer
    Sub Macro_1a()
         x = 10
         MsgBox x
         Macro_1b
    End Sub
    Sub Macro_1b()
         x = x * 2
         MsgBox x
         Macro2
    End Sub
    
  5. Insira outro módulo no seu projeto.

  6. Escreva o seguinte código neste módulo:
    Sub Macro2()
        x = x * 3
        MsgBox x
    End Sub

  7. Execute Macro_1a macro no primeiro módulo.

  8. Com a variável x declarada como "Public x As Integer", as três macros no projeto têm acesso ao valor de x. A primeira caixa de mensagem apresenta um valor de 10. A segunda caixa de mensagem apresenta um valor de 20 (porque x é multiplicado por 2 em Macro_1b). A terceira caixa de mensagem apresenta um valor de 60 (porque o valor de x foi alterado para 20 em Macro_1b e, em seguida, foi multiplicado por 3 em Macro2).

  9. Altere a linha de declaração no primeiro módulo de:

       Public x As Integer

    para:

       Dim x As Integer

  10. Execute a macro Macro_1a .

  11. Com a variável x declarada como "Dim x As Integer", apenas as macros no primeiro módulo têm acesso ao valor de x. Assim, a primeira caixa de mensagem apresenta um valor de 10, a segunda caixa de mensagem apresenta um valor de 20 (porque x é multiplicado por 2 em Macro_1b) e a terceira caixa de mensagem apresenta um valor de 0 (porque Macro2 não vê o valor de x e o valor não inicializado de zero é utilizado pela Macro 2).

  12. Altere a linha de declaração no primeiro módulo de:

      Dim x As Integer

    para:

        Private x As Integer

  13. Execute a macro Macro_1a .

  14. As mesmas caixas de mensagens são apresentadas com o âmbito da instrução Privada, uma vez que estavam a utilizar a instrução Dim. A variável x tem o mesmo âmbito, privada do módulo onde é declarada.

NOTA: Se quiser que o âmbito da variável seja limitado ao módulo onde é declarado, utilize a instrução Privatestatement em vez da instrução Dim. Ambos têm o mesmo efeito, mas o âmbito é mais claro quando lê o código se utilizar a instrução Privado.
 

Duração de uma variável

O tempo durante o qual uma variável mantém o seu valor é conhecido como a sua duração. O valor de uma variável pode mudar ao longo da sua duração, mas irá manter um valor. Além disso, quando uma variável perde o âmbito, já não tem um valor.
 

Inicializar o valor de uma variável

Quando executa uma macro, todas as variáveis são inicializadas para um valor. Uma variável numérica é inicializada para zero, uma cadeia de comprimento variável é inicializada para uma cadeia de comprimento zero (""), e uma cadeia de comprimento fixo é preenchida com o código ASCII 0. As variáveis de variante são inicializadas como Vazio. Uma variável Empty é representada por um zero num contexto numérico e uma cadeia de comprimento zero ("") num contexto de cadeia.

Variáveis ao nível do procedimento

Se tiver uma variável declarada numa macro com a instrução Dim, a variável mantém o respetivo valor enquanto a macro estiver em execução. Se esta macro chamar outras macros, o valor da variável é mantido (não disponível para as outras macros), desde que estas outras macros também estejam em execução.

Para demonstrar como funcionam as variáveis ao nível do procedimento, siga estes passos:

  1. Insira um novo módulo no seu projeto.

  2. Escreva ambas as seguintes macros neste módulo:

    Sub Macro1()
        'definir x como uma variável de nível de procedimento
       Dim x As Integer
       MsgBox "o valor inicializado de x é " & x
       x = 10
        MsgBox "x is" & x
        'a linha seguinte executa Macro2
        Macro2
        MsgBox "x is still" & x
    End Sub
    Sub Macro2()
        MsgBox "x, conforme visto pela Macro2 é " & x
    End Sub

  3. Execute Macro1.

  4. Recebe a seguinte mensagem:

        the initialized value of x is 0

  5. Clique em OK e receberá a mensagem:

     x is 10

  6. Clique em OK e receberá a seguinte mensagem:

    x, as seen by Macro2 is

  7. Clique em OK.

  8. Macro2 não apresenta um valor para a variável x porque a variável x é local para Macro1. Recebe a seguinte mensagem:

    x is still 10

  9. Clique em OK.

  10. Execute Macro1.

Recebe as mesmas mensagens descritas nos passos 3 a 6 porque assim que a Macro1 deixou de ser executada no Passo 6, o valor da variável x foi perdido. Por conseguinte, quando voltar a executar Macro1 no Passo 7, a primeira mensagem mostra o valor de x como zero (o valor inicializado).

Palavra-chave estática

Se for declarada uma variável ao nível do procedimento com a palavra-chave Estática, a variável mantém o respetivo valor até que o projeto seja reposto. Por conseguinte, se tiver uma variável estática, da próxima vez que chamar o procedimento, a variável estática será inicializada para o último valor.

Para ver como funciona a palavra-chave Estática, siga estes passos:

1.

Change the code in Macro1 to:

Sub Macro1()
    'set x as a procedure level variable
    Static x As Integer
       MsgBox "the initialized value of x is " & x
    x = x + 10
    MsgBox "x is " & x
End Sub
  1. Execute Macro1.

  2. Receberá a mensagem:

    the initialized value of x is 0

  3. Clique em OK e receberá a mensagem:

    x is 10

  4. Clique em OK.

  5. Execute Macro1 e recebe a seguinte mensagem:

    the initialized value of x is 10

  6. Clique em OK e receberá a seguinte mensagem:

    x is 20

  7. Clique em OK.

Os valores que aparecem nas mensagens são diferentes na segunda vez porque a variável x é declarada como uma variável estática e a variável mantém o respetivo valor depois de executar Macro1 pela primeira vez.

NOTA: Se tiver uma variável ao nível do módulo, a respetiva duração é a mesma que se fosse uma variável estática ao nível do procedimento.

Para verificar a duração de uma variável ao nível do módulo, siga estes passos:

1.

Change the code in the module that contains Macro1 to the following:

Dim x As Integer  'create a module-level variable
Sub Macro1()
   MsgBox "the initialized value of x is " & x
   x = x + 10
   MsgBox "x is " & x
End Sub
  1. Execute Macro1 e receberá a seguinte mensagem:

    the initialized value of x is 0

  2. Clique em OK e receberá a seguinte mensagem:

    x is 10

  3. Clique em OK,

  4. Execute Macro1 e irá receber esta mensagem:

    the initialized value of x is 10

  5. Clique em OK.

  6. Recebe a seguinte mensagem:

    x is 20

  7. Clique em OK.

Os valores que aparecem nas mensagens são diferentes na segunda vez porque a variável x é declarada como uma variável estática e mantém o respetivo valor depois de executar Macro1 pela primeira vez.
 

Repor um projeto para repor variáveis

Se quiser repor o valor de uma variável estática ou de uma variável ao nível do módulo, clique no botão Repor no botão
Barra de ferramentas padrão ou clique em Repor no menu Executar .

Se o fizer para o projeto Macro1 e, em seguida, voltar a executar Macro1, o valor da variável x será inicializado novamente para zero e receberá a primeira mensagem:

    the initialized value of x is 0