Cavalcante Consultores – treinamento e consultoria em finanças e Excel

Passagem de parâmetros por valor e por referência

Cavalcante Consultores > Biblioteca de Excel > Passagem de parâmetros por valor e por referência

Introdução

As estruturas para criação de funções do VBA, Sub e Function possibilitam o envio de informações para uso destas. Estas são infomadas em seu cabeçalho, entre parênteses e logo após o nome da função. São normalmente conhecidas como parâmetros ou argumentos da função.

Exemplo

No código acima, uma Function poderia ter sido utilizada no lugar da Sub. As variáveis declaradas no topo da função devem ser informadas em sua chamada. A partir disso, a código interno terá acesso aos valores destas variáveis e fazer uso destes para suas operações.

Existem duas formas de passar valores para funções no VBA. São elas ByVal (por valor) e ByRef (por referência).

Caso a forma não seja informada, o VBA considera por padrão que os valores são passados em modo ByVal. Ou seja, o código acima poderia ser escrito desta forma sem alterar suas funcionalidades:

Mas o que quer dizer por valor ou por referência?

Na passagem de parâmetro por valor, ao iniciar a execução, a função faz uma cópia dos valores passados para serem utilizados nas operações. Supondo que o valor passado para a função fosse uma variável criada por você, uma cópia deste valor seria criada durante a execução da função, não alterando em nada o valor original de sua variável. Para entender melhor, veja o exemplo de código abaixo:

A função teste cria uma variável do tipo numérica na linha 3 e atribui o valor '2' a ela na linha 5. Em seguida, é chamada a função valor que recebe o valor da variável var e o multiplica por 2. Em seguida o valor da variável é mostrado na linha 9. Veja o resultado da execução do código:

Note que por mais que tenhamos passado o valor por parâmetro para a função Dobro, a variável var permaneceu com seu valor original. Isso aconteceu porque como explicado, ao iniciar sua execução, a função cria uma cópia em memória do valor da variável passado por parâmetro, deixando seu valor original intacto.

Esse problema pode ser facilmente resolvido utilizando uma Function ao invés de uma Sub e retornar o valor no final de final da execução. Mas se precisássemos alterar ou mesmo retornar mais de um valor? É isso que queremos contornar e é nesse ponto que entra o ByRef. Veja o código alterado abaixo:

Note que alteramos a passagem do parâmetro de ByVal para ByRef. Veja o resultado da execução da função Teste:

Ou seja, qualquer alteração feita no valor x dentro da função será automaticamente refletida na variável var.

Como você pode passar mais de um parâmetro as funções no VBA, esta se torna uma forma de poder retorna vários valores com uma única função. Veja o código alterado abaixo:

O que aconteceu desta vez? Quando a declração de uma variável passada como parâmetro de uma função é feita bom ByRef, o VBA ao invés de efetuar uma cópia como o ByVal, faz um referência ou ligação à variável que foi passada. No caso do código acima, a mudança da forma de passagem do parâmetro para ByRef faz com que exista um vínculo entre a variável x na função Dobro e a variável var na função Teste.

Veja que todos as valores das variáveis foram alterados. Apenas para informação, o operador '&' é utilizado para concatenar textos e o 'vbNewLine' causa uma quebra de linha, similar a um Enter no Word.

As formas de passagem de parâmetros podem ser utilizadas tanto para Sub com para Function. No caso da Function, o valor de retorno tradicional não sofre nenhuma alteração. Porém, é bom frisar que parâmetros passados em funções de planilha não sofrem alterações mesmo se passados como ByRef.

Conclusão

Vimos que o VBA disponibiliza dois tipos de passagem de parâmetros para funções, ByVal e ByRef. A forma padrão é ByVal e nela, uma cópia do valor passado por parâmetro é utilizada na execução da função. Com ByRef, uma referência à variável é passada para a função, fazendo com que todas as alterações feitas sejam refletidas na variável original.

Utilizando o recurso de passagem de parâmetros para funções e conhecendo suas forma de trabalhar, é possível resolver a grande maioria de nossos problemas na construção de aplicativos em VBA.