Tag Archives: ByVal

VBA – Passagem de parâmetros por valor e por referência (ByVal, ByRef)

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:

Public Sub Soma(x As Long, y As Long)
... código
End Sub

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:

Public Sub Soma(ByVal x As Long, ByVal y As Long)
... código
 End Sub

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 efetuada 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:

Public Sub Teste()
'cria a sua variável
 Dim var As Long
'atribui um valor a ela
var = 2
'chama a função Dobro passando a variável para esta
Call Dobro(var)
'mostra o valor da variável após a execução do código
MsgBox var
End Sub
Public Sub Dobro(ByVal x As Long)
x = x * 2
End Sub

A função teste cria uma variável do tipo numérica na linha 3 a 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:

Public Sub Teste()
'cria a sua variável
 Dim var As Long
'atribui um valor a ela
var = 2
'chama a função Dobro passando a variável para esta
Call Dobro(var)
'mostra o valor da variável após a execução do código
MsgBox var
End Sub
Public Sub Dobro(ByRef x As Long)
x = x * 2
End Sub

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

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.

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

Como você pode passar mais de uma 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:

Public Sub Teste()
'cria as variáveis
 Dim var1 As Long
 Dim var2 As Long
 Dim var3 As Long
 'atribui valores
var1 = 1
 var2 = 2
 var3 = 3
 'chama a função Dobro
Call Dobro(var1, var2, var3)
'mostra o valor das variáveis após a execução do código
MsgBox var1 & vbNewLine & var2 & vbNewLine & var3
End Sub

Public Sub Dobro(ByRef x As Long, ByRef y As Long, ByRef z As Long)
x = x * 2
y = y * 2
z = z * 2
End Sub

Veja que todos as valores das variáveis foram alterados. Apenas para informação, o operador ‘&’ é utilizado para concatenar textos eo ‘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 nosso problemas na construção de aplicativos em VBA.byvalbyref1byvalbyref1