Qual é a diferença entre os argumentos ByRef e ByVal? - Pergunta para Entrevista VBA

Índice:

Anonim

Esta é uma das perguntas mais frequentes nas entrevistas do VBA. Neste artigo, aprenderemos qual é a diferença entre os argumentos ByVal e ByRef no Excel VBA.

Definições:

Argumento ByRef: É a forma abreviada literal de por referência. Quando um argumento é passado como argumento ByRef para uma subfunção ou função diferente, a referência da variável real é enviada. Quaisquer alterações feitas na cópia da variável refletirão no argumento original.
Podemos dizer que, em vez do valor, a localização do valor é enviada para a função usando ByRef para uma função.
Este é o argumento padrão no VBA. Não precisamos escrever ByRef antes do argumento.
Sintaxe:

Sub x (a como variante)

'Ou

Sub x (ByRef a como Variante)

Argumento ByVal: É uma forma abreviada literal de por valor. Quando um argumento é passado como argumento ByVal para uma subfunção ou função diferente, apenas o valor do argumento é enviado. O argumento original é deixado intacto. Quaisquer alterações feitas na função estrangeira ou sub não refletirão no argumento original.
Para declarar um argumento como ByVal, você precisa usar a palavra-chave ByVal antes do argumento.
Sintaxe:
Sub x (ByVal a como Variante)
Agora sabemos as definições. Vamos ver um exemplo e acabar com ele.

Exemplo ByRef

Aqui está um programa simples.

Sub X (ByRef a As Variant) a = 20 Debug.Print "no valor sub X de a =" & a End Sub Sub Y () a = 10 Chame X (a) Debug.Print "no valor sub Y de a =" & a End Sub 

Portanto, aqui temos duas sub-rotinas. O primeiro sub é X que leva um argumento variante como ByRef.
(Você pode omitir a palavra-chave ByRef. É o padrão.)
Em seguida, está definindo o valor de a = 20 end então imprime o valor de a.

Sub Y é a sub-rotina principal que chama a sub-rotina X. Ele define o valor de a = 10 então chama a sub-rotina X e passauma como um argumento. Em seguida, ele imprime o valor de uma em Y.

Agora, quando você executa Sub Y, esta é a saída que você obtém.
no valor sub X de a = 20

no valor sub Y de a = 20

Conclusão: O valor de a original é alterado por sub X e definido como 20 para ambos os subs.
você pode ver que quando Sub Y é executado, o valor inicial de a era 10. Y chama X (a). X define o valor de a = 20. Ele imprime “no valor sub X de a = 20”. O controle volta para y e imprime no valor sub Y de a = 20.
Este é o efeito do argumento ByRef.

Exemplo de ByVal:

Este é um exemplo de ByVal

Sub X (ByVal a As Variant) a = 20 Debug.Print "no valor sub X de a =" & a End Sub Sub Y () a = 10 Chame X (a) Debug.Print "no valor sub Y de a =" & a End Sub

Ambos os exemplos são iguais, com a única diferença de passagem de argumento. Aqui em X, os argumentos são declarados como ByVal. Quando você executa a sub-rotina Y desta vez, a saída é:

no valor sub X de a = 20
no valor sub Y de a = 10


Conclusão: O valor do a original NÃO é alterado pelo sub X. É 20 para X e 10 para Y.

Quando Y chama X com a, ele apenas envia o valor de a não o endereço de a. Portanto, qualquer alteração feita em a não é refletida na variável original.

Para teste, se imprimir o valor de uma em X antes de defini-lo como 20, ele imprimirá 10. Porque o 10 é passado para a em X usando byVal. Usando ByRef você enviou um de Y para a de X.

É uma pergunta fácil, mas muitos de nós confundimos isso, na pergunta da entrevista vba. A razão é que não conseguimos usá-lo muito. Na maioria das vezes, copiamos o valor em uma variável diferente.

Então sim pessoal, esta é a diferença entre os argumentos ByRef e ByVal no Excel VBA. Avise-me, se você tiver alguma dúvida sobre este tópico ou qualquer outro tópico do VBA ou Excel. A seção de comentários é toda sua.

Adicionar e salvar uma nova pasta de trabalho usando VBA no Microsoft Excel 2016

Exibir uma mensagem na barra de status do Excel VBA

Desativar mensagens de aviso usando VBA no Microsoft Excel 2016

Artigos populares:

A função VLOOKUP no Excel

CONT.SE no Excel 2016

Como usar a função SUMIF no Excel