Curso Excel VBA y Macros – Cap. 30 – Pasar argumentos a procedimientos. Diferencia entre ByRef y ByVal

<<CURSO COMPLETO EN YOUTUBE>>

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

<<CURSO COMPLETO EN YOUTUBE>>

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.

 

You may also like...