Sólo una pequeña aclaración
Sólo una pequeña aclaración
Es cierto, los argumentos en las funciones y procedimientos de Visual Basic, se pasan por referencia, lo que sería comparandolo con C "pasar un puntero".
Si es así, entonces no resulta necesario usar una función, ya que estaríamos guardando en la Pila información redundante e inservible.
Cuando pasamos una variable ByRef (por referencia) como argumento de un procedimiento x, estamos delimitando un secto de la Pila con la variable, un sector con el puntero y un sector con el procedimiento. Si usaramos una Función, estaríamos desperdiciando un espacio adicional en la Pila, reservado para la devolución de la Función.
Por eso, con solo asignar el valor ByRef a los argumentos del Procedimiento que va a modificar la variable X, es suficiente, cualquier cambio que sufra el argumento X en el procedimiento, lo tomará automáticamente la X del modulo origen , ya que estamos hablando de la misma variable, aunque su nombre sea distinto.
Tomando el ejemplo de "Y yo", sería así
Private Sub Command1_Click()
Dim x As Integer
'Por defecto, x es igual a 0
Suma x
MsgBox x 'el valor devuelto es 2
End Sub
Private Sub Suma(ByRef i As Integer)
i = i + 2
End Sub
El prefijo ByRef o ByVal, es conveniente usarlo siempre por una simple convención de programación. Es lo mismos que los Controles TextBox, todos sabemos que por default su valor es Text, y que podríamos escribir TextBox1 = "Valor", pero por convención, siempre ponemos TextBox1.Text = "Valor"