ByVal es "por valor". Tú pasas un número, y el número se copia y se usa en la función. Si modificas el número, lo harás en la función.
ByRef es "por referencia". Las referencias son instancias de la misma variable. Es como la misma variable usada en muchos lugares. Por tanto si la modificas en la función, lo harás en el resto del programa.
aqui tienes dos ejemplos q me han ayudado a mi:
Código de ejemplo ByVal
Private Sub Command1_Click()
Dim Un_Valor As Long
Un_Valor = 100
'Se envía la variable por Valor ( ByVal )
Call Sumar(Un_Valor)
'Muestra el valor que es 100, ( no se modificó en la función Sumar )
MsgBox Un_Valor
End Sub
Sub Sumar(ByVal Valor As Long)
'Modifica la variable
Valor = Valor + 100
End Sub
Código ByRef
Private Sub Command1_Click()
Dim Un_Valor As Long
Un_Valor = 100
'Se envía la variable por Referencia ( ByRef ) con el valor 100
Call Sumar(Un_Valor)
'Muestra el valor que ahora es 200, ( ya que se modificó en la Sub Sumar)
MsgBox Un_Valor
End Sub
Sub Sumar(ByRef Valor As Long)
'Modifica la variable
Valor = Valor + 100
End Sub