Non ho capito i vari cicli che confrontano la variabile indice con se stessa tipo questi:
For i = 0 To i < StrMessage.Length - 2
For j = 0 To j < 8
in partenza i e j sono settate al valore di inizio del ciclo, ed essendo in ogni caso più basse del valore finale il ciclo viene eseguito solo una volta e non potranno mai essere superiori al confronto sul valore finale.
Inoltre:
Message[0] = Address
Message[1] = Type
Message[2] = Lsr(Start, 8)
Message[3] = CByte(Start)
Message[4] = CByte(Lsr(Register, 8))
Message[5] = CByte(Register)
Questo array non è dichiarato da nessuna parte, qui il messaggio di errore è garantito.
Per finire (per ora :) ), invece di usare Hex$(40961) usa &HA001& (In esadecimale), o addirittura in binario: &X1010000000000001, che ti permette di vedere subito dove sono messi i bit su cui devi lavorare. ;)