Curso Excel VBA y Macros – Cap. 30 – Pasar argumentos a procedimientos. Diferencia entre ByRef y ByVal
A este nivel del curso ya estamos acostumbrados a crear procedimientos en VBA. Recordemos que un procedimiento puede ser considerado una macro, aunque no necesariamente ya que una macro se puede ejecutar desde un botón, pero un procedimiento no siempre.
En este tutorial veremos cómo crear procedimientos que acepten argumentos, similar a las funciones de Excel. Entre otros temas veremos:
-
Cómo pasar argumentos en un procedimiento.
-
Diferencia entre parámetros y argumentos.
-
Argumentos con nombre.
-
Parámetros ByRef y ByVal.
Ver video Capítulo 30 Excel VBA & Macros
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Diferencia entre parámetro y procedimiento
Un parámetro se especifica al momento de definir un procedimiento o una función, y éste puede ser ByRef o ByVal. En la siguiente línea declaramos el procedimiento Calcular y le decimos que tenga dos parámetros, Sueldo y Bono, además de indicarle cómo es que recibirán los valores (argumentos) y su tipo.
Sub Calcular(ByVal Sueldo As Double, Bono As Integer)
Un argumento representa el valor que se le pasa a un parámetro. Si mandamos llamar al procedimiento Calcular, éste tiene dos parámetros los cuales debemos enviarlos. Al enviarle el sueldo y el bono, le estamos enviando argumentos, es decir, los valores que se usarán para el cálculo.
Call Calcular(1200, 100)
Ó
Calcular 1200, 100)
Un argumento con nombre es por ejemplo cuando usamos la función MsgBox. Sabemos que podemos enviar un texto para mostrar, la cantidad de botones a mostrar, entre otros argumentos. Si miramos la siguiente línea, es la manera rápida de usar Msgbox:
MsgBox “Mensaje de prueba”, vbExclamation, “Titulo”
Si deseamos usar los argumentos con nombre, basta con indicar el nombre de cada argumento seguido de “:=”. Al usar los argumentos con nombre podemos usarlos en el orden que deseemos. Debemos tener en cuante que si usamos argumentos con nombre, deberemos guardar el valor del botón presionado en una variable.
valor = MsgBox(Prompt:=”Mensaje de prueba”, Buttons:=vbExclamation, Title:=”Titulo”)
Pasar argumentos por valor (ByVal) o por referencia (ByRef)
La sintaxis para pasar argumentos en un procedimiento se muestra a continuación:
Sub Name ([Optional] [ByVal | Byref] [ParamArray] <variable> [As type])
Donde:
ELEMENTO |
DESCRICIÓN |
Optional |
Indica que el argumento a pasar es opcional. |
ByVal |
El argumento se pasa por valor. El procedimiento accede a una copia de la variable por lo que el valor de la variable se mantiene intacto. |
ByRef |
Es la manera predeterminada en la que se envían los argumentos. Indica que el argumento se pasa por referencia. El procedimiento puede acceder al valor de la variable y lo puede modificar. |
ParamArray |
Se usa para enviar una matriz de valores. |
As type |
Indica el tipo de valor que tendrá el parámetro. |
Procedimientos VBA de ejemplo ByRef
Primero creamos un procedimiento llamado Calcular que tendrá como parámetros numero1 y numero2. Estos dos parámetros serán recibidos por referencia (ByRef).
Posteriormente creamos una macro llamada Procedimiento donde mandaremos llamar al procedimiento Calcular y le mandaremos como argumentos numero1 y numero2. Al enviarle los argumentos por referencia (ByRef) significa que el procedimiento Calcular tomará los valores y al aplicarles algún cálculo, modificará los valores definidos en la macro Procedimiento.
Option Explicit 'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo Sub Procedimiento() Dim numero1 As Integer Dim numero2 As Integer numero1 = 1 numero2 = 2 Call Calcular(numero1, numero2) MsgBox numero1 MsgBox numero2 End Sub Sub Calcular(ByVal numero1 As Integer, ByVal numero2 As Integer) numero1 = numero1 + 1 numero2 = numero2 + 1 MsgBox numero1 MsgBox numero2 End Sub
Ahora tenemos otro procedimiento llamado Calcular el cual tendrá dos parámetros, Sueldo y Bono. Este procedimiento tomará el sueldo y le sumará la cantidad de bono.
Tendremos un macro llamada BonoEmpleado donde definiremos el suelo y el bono del empleado. Estos dos argumentos se pasarán en la llamada al procedimiento Calcular. Se hará la suma del sueldo más el bono y el resultado se imprimirá en una celda.
Option Explicit Sub BonoEmpleado() Dim Sueldo As Double Dim Bono As Integer Sueldo = Range("B2").Value Bono = Range("B3").Value Call Calcular(Sueldo, Bono) MsgBox "El sueldo es: " & Sueldo Range("B4").Value = Sueldo End Sub Sub Calcular(Sueldo As Double, Bono As Integer) Sueldo = Sueldo + Bono End Sub
Procedimiento VBA ByVal
Como lo vimos anteriormente, al pasar argumento por valor (ByVal), el procedimiento que reciba los argumentos tomará una copia de los valores de las variables y trabajará sobre ellos, pero no modificará sus valores originales.
Tenemos el mismo ejemplo de la macro BonoEmpleado, pero ahora el procedimiento Calcular tendrá recibirá los argumentos Sueldo y Bono por valor (ByVal). El procedimiento Calcular hará la suma del Sueldo más el Bono, además de imprimir el resultado en una celda de Excel. La macro BonoEmpleado solo enviará una copia de las variables, pero los valores se mantendrán sin cambio dentro del mismo procedimiento.
Option Explicit Sub BonoEmpleado() Dim Sueldo As Double Dim Bono As Integer Sueldo = Range("B2").Value Bono = Range("B3").Value Call Calcular(Sueldo, Bono) MsgBox "El sueldo sigue siendo: " & Sueldo End Sub Sub Calcular(ByVal Sueldo As Double, ByVal Bono As Integer) Sueldo = Sueldo + Bono Range("B9").Value = Sueldo End Sub
Procedimiento VBA con parámetro Opcional
Modificamos los procedimientos anteriores, pero ahora usaremos un tercer parámetro en el procedimiento Calcular, el cual será un bono extra. Como el parámetro es opcional, cuando mandemos llamar a Calcular, tenemos la opción de enviarlo o no enviarlo sin afectar el funcionamiento del procedimiento.
Option Explicit Sub BonoEmpleado() Dim Sueldo As Double Dim Bono As Integer Dim BonoExtra As Integer Sueldo = Range("B2").Value Bono = Range("B3").Value BonoExtra = Range("B14").Value 'Call Calcular(Sueldo, Bono, BonoExtra) Calcular Sueldo, Bono, BonoExtra MsgBox "El sueldo sigue siendo: " & Sueldo End Sub Sub Calcular(ByVal Sueldo As Double, ByVal Bono As Integer, Optional Bono2 As Integer) Sueldo = Sueldo + Bono + Bono2 Range("B15").Value = Sueldo End Sub
Descarga el archivo de ejemplo
030 – Procedimentos con argumentos ByRef y ByVal – EXCELeINFO.zip
Si te gustó este tutorial por favor regístrate en nuestra Lista de correo y Suscríbete a nuestro canal de YouTube para que estés siempre enterado de lo nuevo que publicamos.