ByVal hace que al argumento pasado se le pase una copia de la variable, por lo tanto en la función no es posible modificar el valor de dicha variable, vamos a demostrarlo, prueba el siguiente código Option Explicit Public Sub PasarValores() Dim intNum As Integer intNum = 2 MsgBox Format(intNum) & " = " & XXX_1(intNum) MsgBox "intNum = " & Format(intNum) 'Aqui todavia vale 2 MsgBox Format(intNum) & " = " & XXX_2(intNum) MsgBox "intNum = " & Format(intNum) 'Aqui ahora vale 3 End Sub Public Function XXX_1(ByVal abc As Integer) As String Dim str As String Select Case abc Case 1: str = "Uno" Case 2: str = "Dos" Case 3: str = "Tres" Case 4: str = "Cuatro" Case 5: str = "Cinco" Case Else: str = "Otro" End Select 'Aquí modificamos el valor de la variable pasado 'intNum solo que como con ByVal le pasamos una copia 'la copia es la que se modifica abc = abc + 1 XXX_1 = str End Function Public Function XXX_2(ByRef abc As Integer) As String Dim str As String Select Case abc Case 1: str = "Uno" Case 2: str = "Dos" Case 3: str = "Tres" Case 4: str = "Cuatro" Case 5: str = "Cinco" Case Else: str = "Otro" End Select 'Aquí modificamos el valor de la variable pasada 'intNum pero la pasamos por referencia ByRef la variable 'original es la que se modifica abc = abc + 1 XXX_2 = str End Function