cuando se que tengo que declarar una variable Long o Byte?
Debes tomar en cuenta el rango que tendrá tu variable a la hora de declararla:
Byte --> tamaño 1 byte --> rango de valores de 0 a 255
Long --> tamaño 4 bytes --> rango de valores de -2,147,483,648 a 2,147,483,647
que hace el ByVal
El Byval lo que hace es crear una copia de la variable que envías como parámetro, esto con la intención de que la original no sea modificada, mira este EJEMPLO:
Option Explicit
Dim Cadena As String
Private Sub Form_Load()
Cadena = "Mensaje Inicial" 'Valor Inicial
MsgBox Cadena 'Muestra el valor inicial
Prueba Cadena 'Resultado de la rutina
MsgBox Cadena '¿Y que paso con la variable Cadena?
End Sub
Public Sub Prueba(ByVal Parametro As String)
Parametro = Parametro & " Modificado"
MsgBox Parametro
End Sub
Como veras, el valor de Cadena pasado como parámetro a la rutina Prueba, es modificado, pero solo se refleja dentro de la rutina mas no fuera de ella.
Prueba quitando el ByVal y fijaos en lo que pasara: (otro EJEMPLO)
Public Sub Prueba(ByVal Parametro As String) 'Ya lo probamos así...
Public Sub Prueba(Parametro As String)' Ahora lo probamos sin ByVal...
Sin el ByVal la rutina no solo cambia el valor pasado como parámetro dentro de ella, sino que también afecta fuera de la misma.