Scusa ma c'è qualcosa che non va.
A cosa server LastR se la inizializzi ad ogni carattere ricevuto? Alla fine lastR=lastR+mChar sarà sempre uguale ad mChar, no?
Anche "If StringaBarCode = "" Then Return False" potrebbe essere causa dell'errore perché in pratica dici che se ricevi un TAB mentre il barcode è ancora nullo, allora non gestisci il TAB e lo passi alla normale catena di eventi (che potrebbe spostare il focus da qualche parte).
Io eliminerei del tutto la questione timer. Usa un boolean che ti dice se il codice è completo e valido o meno. In pratica sarà come avere un buffer che si riempie un carattere alla volta e all'arrivo di un TAB invia la stringa allo storage, annulla la stringa e si riporta in condizione iniziale.
Se la presenza del timer è strettamente necessaria ad evitare un crash generato dal lettore, allora usa lo stesso sistema del flag boolean per istruire il tick se passare o meno il codice alla fase di elaborazione. In pratica il time scatta sempre ma solo quando il flag è vero "tratta" il codice.