miércoles, 27 de julio de 2016

¿Cuál es la diferencia entre ByRef y ByVal en una función o procedimiento en VBA?


Con mucha frecuencia creamos funciones y procedimientos, en donde implementamos parámetros, los cuales nos permiten pasar por Referencia o por Valor, los argumentos solicitados.
Es muy importante conocer la diferencia de estos ámbitos en los cuales entran las variables, ya que de eso depende la mejor comprensión del proceso lógico que deseamos llevar a cabo.





Muy bien, veamos a continuación la creación de una función cuando es por Referencia

    
Function Multiplicar(ByRef x As Integer) As Integer
x = x * 5
    Multiplicar = x
End Function


En estos ejemplos pueden ver que he creado una función llamada Multiplicar, Cabe mencionar que en VBA, los parámetros declarados en una función se establecen por defecto por Referencia. Por lo que podemos omitir la palabra clave ByRef.

    
Function Multiplicar(x As Integer) As Integer
x = x * 5
    Multiplicar = x
End Function


Ahora!... si queremos declarar parámetros por Valor, pues en este caso, sí tenemos que indicarlo con la palabra clave ByVal.

    
Function Multiplicar(ByVal x As Integer) As Integer
x = x * 5
    Multiplicar = x
End Function


Disculpen por no llegar directo al punto y decir cuál es la diferencia en ambas palabras claves, pero es muy importante que conozcamos estos aspectos, ya que de eso depende, que programemos de una forma eficiente.

Muy bien... copien y peguen en un módulo nuevo, el código de la función Multiplicar, utilizando la palabra clave ByRef.



Y luego, copien y peguen lo siguiente, en un botón de comando ActiveX, insertado en la Hoja1

Private Sub CommandButton1_Click()
Dim x As Integer
    x = 5
    
    MsgBox Multiplicar(x)
    MsgBox x
End Sub



Pueden notar que vamos a obtener el resultado de la variable x, en dos cajas de mensaje; la primera, pasando la variable x, a la función Multiplicar, por su puesto dicho valor, se pasará por referencia. Y en la segunda caja de mensaje, únicamente obtenemos el resultado de la variable x,

¿Cuál es el punto aquí? Que en ambas cajas de mensaje, obtendremos el mismo valor.



Ya que al pasar por referencia la variable x en la función Multiplicar, dicha variable está usando un espacio único en la memoria ram, por lo que cuando es multiplicada dentro de la función, pues la variable x que tenemos dentro del evento click del botón, se sustituye por el valor que trae desde la función Multiplicar. En consecuencia, cuando creamos funciones del tipo ByRef,  debemos tener cuidado cuando manejamos variables con el mismo nombre en diferentes eventos, ya que su valor será sustituido a la largo de todo un procedimiento, por ocupar el mismo espacio en memoria.

Si, yo sé que esta explicación nos ha dejado un poco mareados, así que vuelvan a leerla para que se comprenda mejor... jejejeje... mientras voy por un café...................................... :)

Ok, ya estoy de vuelta...

Ahora bien... ¿Cómo trabaja una función cuando se utiliza la palabra clave ByVal?

Procedan a cambiar la función, indicando que sus parámetros serán del tipo ByVal...

    
Function Multiplicar(ByVal x As Integer) As Integer
x = x * 5
    Multiplicar = x
End Function


Y dan click nuevamente en el botón de comando...

Private Sub CommandButton1_Click()
Dim x As Integer
    x = 5
    
    MsgBox Multiplicar(x)
    MsgBox x
End Sub

Ahora notarán, que en la primera caja de mensaje les devuelve el valor 25, y en la segunda, el valor 5.
¿Qué pasó aquí?



Pues cuando pasamos por valor la variable x, se crea una copia de esa variable, ocupando un espacio diferente en la memoria ram, y dicha copia realizará la aritmética dentro de la función Multiplicar, y cuando obtenga el resultado, lo reflejará en la primera caja de mensaje y posteriormente se destruirá cuando la función termine su proceso. Por lo que la variable x que tenemos dentro del evento click del botón, su valor se conserva intacto, ya que ocupa su propio espacio en memoria, el cual no fue afectado por la función Multiplicar, y es por ello que en la segunda caja de mensaje, obtenemos el valor 5.


Descarga AQUÍ el archivo de Excel, el cual utilicé para realizar estos ejemplos

Si te ha gustado este artículo... compártelo con tus amigos en las diferentes redes sociales.

Nos vemos en la próxima entrega.

Saludos!



No hay comentarios:

Publicar un comentario