ByVal e ByRef. Sabe a diferença entre esses tipos de parâmetros no VBA ?

No VBA podemos codificar Sub e Function sendo que ambas permitem a passagem de parâmetros. Ex:

Public Sub realizaOperacoes(ByVal a As Integer, ByRef b As Integer)

Esses parâmetros podem ser passados ByVal (por valor) ou ByRef (por referência). A diferença entre esses casos é que ao passarmos um parâmetro ByRef a função receberá a referência do endereço de memória do mesmo. Já os parâmetros ByVal na verdade são uma cópia do que foi passado externamente a função.

Vamos imaginar que, ao declararmos uma variável, criamos um pequeno “baldinho” na memória do computador que poderá aceitar um tipo de valor. Ex:

Dim x as Integer

declaramos, então, um “baldinho” que aceita valores inteiros e apenas inteiros. Agora vamos atribuir um valor dentro deste “baldinho”:

x =  11

Ao passar x para outra Function ou Sub que aceitem um parâmetro inteiro, se o parâmetro for ByRef estaremos passando a referência ao endereço deste “baldinho” na memória. Caso seja ByVal, a Sub ou Function que detém o parâmetro tirará uma cópia deste baldinho e alterará o valor desta cópia. Vamos ver um exemplo prático:

1) Declaramos a seguinte SUB com dois parâmetros ‘a’ e ‘b’:

Public Sub realizaOperacoes(ByVal a As Integer, ByRef b As Integer)
 '3) Para parâmetros ByVal, é realizada a CÓPIA do baldinho.
 'Para parâmetros ByRef (padrão do VBA) usa-se o próprio baldinho
 'que veio de fora.
 a = 1
 b = 3
End Sub

2) Agora declaramos uma SUB que chama a outra SUB realizaOperacoes:

Public Sub teste()
 'EXECUTAR ESSA SUB NA JANELA IMEDIATA PARA TESTAR
 '1) Ao declarar variáveis, cria-se BALDINHOS que aceitam tipos específicos.
 Dim x As Integer
 Dim y As Integer
 
 '2) Colocamos valores dentro dos baldinhos
 x = 11
 y = 33


 'Estou chamando a sub acima (teste1) passando-lhe seus dois parâmetros.
 realizaOperacoes x, y
 
 'QUANTO VOCÊ ACHA QUE SERÁ O VALOR DE X E Y NO FINAL DA EXECUÇÃO ?
 'Debug.Print --> Imprime no console [Ctrl + G]
 Debug.Print "x=", x, "y=", y
End Sub

A ideia é entender qual será o valor de X e de Y no final da execução.

No console serão  impressos os valores de X e Y:

x=             11           y=             3

Isso por que X foi passado por um parâmetro ByVal. Dentro da SUB realizaOperacoes é feito uma cópia deste “baldinho” com seu valor original. Já o y como foi passado ByRef o VBA entende que queremos alterar o mesmo baldinho de y.

Há que se saber que o padrão do VBA é ByRef, ou seja, se declararmos uma SUB ou Function desta forma:

Public Sub realizaOperacoes(a As Integer, b As Integer)

ambos os parâmetros são ByRef.

Anúncios
Esta entrada foi publicada em Visual Basic 6.0 e VBA com as etiquetas , , . ligação permanente.

3 respostas a ByVal e ByRef. Sabe a diferença entre esses tipos de parâmetros no VBA ?

  1. Diego Silva diz:

    Boa dica pedro.
    Eu comecei a pouquíssimo tempo o curso de excel 2013 com VBA pelo adv, http://www.cursoadv.com.br, ainda não tinha chego nesta parte.
    Mas o post já me ajudou a entender as diferenças entre os parâmetros, assim quando vai ficar mais fácil aplicá-los nos exercícios.

    Gostar

  2. Daniel diz:

    Acredito que o padrão do vba é o uso do ByVal se não especificarmos o contrário nos parâmetros de uma Sub/Function. Correto?

    Gostar

    • pedroabs diz:

      Oi Daniel, tudo bem ? Respondendo a sua pergunta, o padrão do VBA é ByRef, porém as variáveis passadas por referência são apenas as do tipo objeto. As variáveis de tipos simples como Integer, Double, Single, etc são passadas ByVal.

      Gostar

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s