ByVal es pasar un parametro a un procedimiento o funcion "por valor", lo cual quiere decir que ese parametro que pasas ej. "Sub calcula(Byval i as integer" no cambia su valor al salir del procedimiento o funcion aunque lo cambies dentro de este procedimiento o funcion. En el ejemplo si "i" tiene valor 1 y llamas al procedimiento y dentro del procedimiento le cambias el valor a "i" y le pones 2, cuando terminas de llamar al procedimiento i sigue valiendo 1 que es con lo que entro, o bueno, la variable que pongas en el lugar de "i" para llamar al procedimiento. Hay otra forma de llamar a los parámetros, y es con ByRef; aquí si que la variable sale con el valor cambiado ya que el parámetro se pasa por referencia, y en nuestro ejemplo anterior, al salir del procedimiento "i" o la variable con la que se llame al procedimiento valdra 2 y no 1 como con ByVal