Hola Radical.
Yo creo que...
1- Con el sufijo $ (o #, !, &, ..) concretas el tipo de datos devuelto por la función o incluso el tipo de dato de un valor constante, por ejemplo: x = 132& asigna a x 4 bytes (tipo long en vb) con el valor 123. Y en la práctica dirás tú, ¿cuál es la diferencia?. Pos no sé, pero tu prueba a a hacer esto: If Command = "" y luego me cuentas (Lo correcto sería If Command$ = ""). Desde luego en vb no hay muchos problemas de casts de los que ocuparse, pero si usas funciones de otros lenguajes de más bajo nivel (el api de windows, por ejemplo) el tema puede ser importante.
2- Pos no te sé que dicir... yo lo veo con un ejemplo: en windows el GDI es la parte del sistema operativo que se ocupa de operaciones gráficas. Creo que se podría decir que el gdi es un api por si mismo, en el sentido de que proporciona funciones, tipos y demás (una interface) para realizar un conjunto de funciones especificas. A su vez, windows proporciona otro conjunto de apis para ocuparse de temas como la impresión, mensajería, comunicaciones, etc. Todas estas son apis dentro del api de windows. Supongo que los tiros van por ahí: una forma de organizar las distintas apis.
3- En vb el uso que se hace de punteros a alto nivel es inexistente (excepto en el caso de argumentos ByRef, pero eso va luego) De hecho las funciones vb que devuelven direcciones de variables o funciones (varptr, AddressOf, lngPtr, etc) parece que están escondidas a propósito. Sin embargo te vuelvo a decir lo del punto 1. En llamadas funciones externas, en el caso de la subclasificación, incluso usando funciones de winapi como timer, es indispensable el uso de punteros, tanto a variables como a funciones.
Para aprender cosas sobre punteros creo que lo mejor es que te olvides de vb y le eches un vistazo a algunos manuales de C, donde el uso de punteros es un plato fuerte.
4- ByVal y ByRef sirven para indicar la forma en la que se pasa un parámetro a un método o función.
Byval pasa el argumento 'por valor' es decir, es como si el método al que llamas creara
una copia de la variable que le estás pasando. Los cambios que se hagan en el método al valor de la variable no se verán reflejados en variable pasada a la función.
Por ejemplo para este código:
'Esto no tiene mucho sentido...
Private Sub A ()
Dim i as integer
i = 100
Sumar10 i
MsgBox i
End Sub
Private Sub Sumar10(Byval Numero As integer)
Numero = Numero + 10
End Sub
El valor de i al final seguiría siendo 100
ByRef pasa el argumento por referencia, es decir, se pasa a la función o método llamado la dirección de la variable (el puntero) que se le pasa. Los cambios que se hagan el la función afectarán al valor de la variable original (ya que realmente se trabaja de verdad con ella).
Fíjate ahora en esto:
Private Sub A ()
Dim i as integer
i = 100
Sumar10 i
MsgBox i
End Sub
Private Sub Sumar10(ByRef Numero As integer)
Numero = Numero + 10
End Sub
El valor de i sería 110.
Aparte de la posible afección del valor de la variable original, en vb, este paso de argumentos por valor o por referencia es transparente para el usuario.
Güeno, espero haberme explicado más o menos.
Abur.