Como usar variáveis em sub-procedimentos do Excel em Visual Basic for Applications

Introdução

Este artigo descreve como usar variáveis em sub-procedimentos do Microsoft Excel no Microsoft Visual Basic for Applications.

Mais informações

Variáveis em um sub procedimento

Um recurso poderoso de linguagens de programação é a capacidade de armazenar algo em uma variável para que o conteúdo da variável possa ser usado ou possa ser alterado posteriormente no procedimento. Este documento discute o seguinte uso de variáveis no Visual Basic:

  • Como as variáveis são declaradas.
  • Os procedimentos e os projetos que podem usar a variável.
  • O tempo de vida de uma variável.

Declarar uma variável em uma macro

A maneira mais simples de declarar uma variável em uma macro é usar a instrução Dim. A linha a seguir declara duas variáveis, como inteiros:

    Dim x As Integer, y As Integer

Com x e y especificados como inteiros, você está dizendo ao Visual Basic para reservar memória suficiente para uma variável 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 você declarar mais de uma variável usando uma única instrução Dim, deverá especificar o tipo de dados para cada variável.

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

    Dim x, y As Integer

Para obter informações adicionais, confira Tipo de dados variant abaixo.
 

Para executar um teste de variável, siga estas etapas:

  1. Salve e feche as pastas de trabalho abertas e abra uma nova pasta de trabalho.

  2. Inicie o Editor do Visual Basic (pressione ALT+F11).

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

  4. Digite o seguinte código:

    Sub Variable_Test()
        Dim x Como Inteiro, y Como Inteiro
        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 . A seguinte mensagem é exibida:

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

  6. Clique em OK.

  7. Na macro Variable_Test , altere a seguinte linha:

    x = 10

  8. precisará:

    x = "error"

  9. Execute a macro Variable_Test .

Você receberá um erro em tempo de execução porque "erro" não é um inteiro e está tentando atribuir esse valor de cadeia de caracteres à variável inteiro x.
 

Resumo do tipo de dados

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

tipos de dados variáveis comuns

tipo de dados Variant

Se você não especificar um tipo de dados ao declarar uma variável ou não declarar uma variável, o Visual Basic especifica automaticamente o tipo de dados variant para essa variável. A seguir estão as vantagens das variáveis declaradas como esse tipo de dados:

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

A desvantagem é que as variáveis variantes exigem 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 isso funciona na macro Variable_Test, siga estas etapas:

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 .

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

NOTA: Você também pode deixar de fora a seguinte linha e a macro ainda funcionará conforme as variáveis x e y são tratadas como tipos de dados Variant:

    Dim x, y

Escopo de uma variável

Quando você declara uma variável, ela pode ou não ser vista por outras macros no mesmo módulo, em outros módulos ou em outros projetos. Essa disponibilidade de uma variável em módulos é conhecida como escopo. Os três tipos de escopo são nível de procedimento, nível de módulo privado e nível de módulo público. O escopo depende de como e onde você declara sua variável ou variáveis.

Escopo no nível do procedimento

Uma variável com escopo no nível do procedimento não é vista fora do procedimento em que é declarada. Se você definir o valor de uma variável que tenha escopo no nível do procedimento, o conteúdo dessa variável não será visto por outras macros.

Para verificar se uma variável com escopo no nível do procedimento não é vista fora do procedimento em que é declarada, siga estas etapas:

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

  2. Digite as duas macros a seguir neste módulo:
      Sub Macro1() Dim x As Integer x = 10 MsgBox "x, conforme visto pela Macro1 é " & x 'a próxima linha executa Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, como visto pela Macro2 é " & x Sub End

  3. Execute Macro1 e você receberá a seguinte mensagem:

    x, as seen by Macro1 is 10

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

    x, as seen by Macro2 is

  5. Clique em OK.

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

Escopo de nível de módulo público e privado

Você pode definir variáveis na seção declarações de um módulo (na parte superior de um módulo, acima de todos os procedimentos sub) e definir o escopo de sua variável usando a instrução Public, a instrução Dim ou a instrução Private. Se você colocar a instrução Public na frente de sua variável, sua variável estará disponível para todas as macros em todos os módulos do projeto. Se você colocar a instrução Dim ou a instrução Privada na frente de sua variável, sua variável estará disponível apenas para macros no módulo em que ela está sendo declarada.

Para ver a diferença entre a instrução Pública e a instrução Dim, siga estas etapas:

  1. Salve e feche as pastas de trabalho abertas e abra uma nova pasta de trabalho.

  2. Inicie o Editor do Visual Basic.

  3. Insira um módulo em 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 em seu projeto.

  6. Digite 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", todas as três macros do projeto têm acesso ao valor de x. A primeira caixa de mensagem exibe um valor de 10. A segunda caixa de mensagem exibe um valor de 20 (porque x é multiplicado por 2 em Macro_1b). A terceira caixa de mensagem exibe um valor de 60 (porque o valor de x foi alterado para 20 em Macro_1b e depois foi multiplicado por 3 na Macro2).

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

       Public x As Integer

    precisará:

       Dim x As Integer

  10. Execute a macro Macro_1a .

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

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

      Dim x As Integer

    precisará:

        Private x As Integer

  13. Execute a macro Macro_1a .

  14. As mesmas caixas de mensagem são exibidas usando o escopo de instrução privada que estavam usando a instrução Dim. A variável x tem o mesmo escopo, privado para o módulo em que é declarado.

NOTA: Se você quiser que o escopo da variável seja limitado ao módulo em que ela é declarada, use o Privatestatement em vez da instrução Dim. Ambos atingem o mesmo efeito, mas o escopo é mais claro quando você lê o código se você usa a instrução Privada.
 

Tempo de vida de uma variável

O tempo durante o qual uma variável mantém seu valor é conhecido como seu tempo de vida. O valor de uma variável pode ser alterado ao longo de seu tempo de vida, mas manterá um valor. Além disso, quando uma variável perde escopo, ela não tem mais um valor.
 

Inicializar o valor de uma variável

Quando você executa uma macro, todas as variáveis são inicializadas para um valor. Uma variável numérica é inicializada como zero, uma cadeia de caracteres de comprimento variável é inicializada para uma cadeia de caracteres de comprimento zero (") e uma cadeia de caracteres de comprimento fixa é preenchida com o código ASCII 0. As variáveis variant são inicializadas como Vazias. Uma variável Vazia é representada por zero em um contexto numérico e uma cadeia de caracteres de comprimento zero ("") em um contexto de cadeia de caracteres.

Variáveis no nível do procedimento

Se você tiver uma variável declarada em uma macro usando a instrução Dim, a variável manterá seu valor enquanto a macro estiver em execução. Se essa macro chamar outras macros, o valor da variável será mantido (não disponível para as outras macros, porém), desde que essas outras macros também estejam em execução.

Para demonstrar como as variáveis no nível do procedimento funcionam, siga estas etapas:

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

  2. Digite as duas macros a seguir neste módulo:

    Sub Macro1()
        'set x como uma variável de nível de procedimento
       Dim x Como Inteiro
       MsgBox "o valor inicializado de x é " & x
       x = 10
        MsgBox "x is" & x
        'a próxima linha executa Macro2
        Macro2
        MsgBox "x ainda está" & x
    End Sub
    Sub Macro2()
        MsgBox "x, como visto por Macro2 é " & x
    End Sub

  3. Execute Macro1.

  4. A seguinte mensagem é exibida:

        the initialized value of x is 0

  5. Clique em OK e você receberá a mensagem:

     x is 10

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

    x, as seen by Macro2 is

  7. Clique em OK.

  8. A Macro2 não exibe um valor para a variável x porque a variável x é local para Macro1. Você recebe a seguinte mensagem:

    x is still 10

  9. Clique em OK.

  10. Execute Macro1.

Você recebe as mesmas mensagens descritas nas etapas 3 a 6 porque assim que o Macro1 parou de ser executado na Etapa 6, o valor da variável x foi perdido. Portanto, ao executar Novamente Macro1 na Etapa 7, a primeira mensagem mostra o valor de x como zero (o valor inicializado).

palavra-chave estático

Se uma variável de nível de procedimento for declarada usando o palavra-chave Estático, a variável manterá seu valor até que seu projeto seja redefinido. Portanto, se você tiver uma variável estática, na próxima vez que chamar seu procedimento, a variável estática será inicializada para seu último valor.

Para ver como funciona o palavra-chave Estático, siga estas etapas:

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. Você receberá a mensagem:

    the initialized value of x is 0

  3. Clique em OK e você receberá a mensagem:

    x is 10

  4. Clique em OK.

  5. Execute Macro1 e você obtém a seguinte mensagem:

    the initialized value of x is 10

  6. Clique em OK e você 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 seu valor depois que você executa a Macro1 pela primeira vez.

NOTA: Se você tiver uma variável no nível do módulo, seu tempo de vida será o mesmo que se fosse uma variável estática no nível do procedimento.

Para verificar o tempo de vida de uma variável no nível do módulo, siga estas etapas:

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 você receberá a seguinte mensagem:

    the initialized value of x is 0

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

    x is 10

  3. Clique em OK,

  4. Execute Macro1 e você receberá esta mensagem:

    the initialized value of x is 10

  5. Clique em OK.

  6. A seguinte mensagem é exibida:

    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 seu valor depois que você executa a Macro1 pela primeira vez.
 

Redefinir um projeto para redefinir variáveis

Se você quiser redefinir o valor de uma variável estática ou para uma variável no nível do módulo, clique no botão Redefinir no
Standard barra de ferramentas ou clique em Redefinir no menu Executar.

Se você fizer isso para o projeto Macro1 e executar novamente Macro1, o valor da variável x será inicializado de volta a zero e você receberá a primeira mensagem:

    the initialized value of x is 0