Hola Jaume:
Este problema me surge frecuentemente, tanto en el evento Validate como en el LostFocus.
Lo soluciono así:
Private Sub txtSig_Validate(Cancel As Boolean)
' -------------------------
If not lVale Then Exit Sub
lVale = False
'--------------------------
If IsNull(txtSig.Text) Or Trim(txtSig.Text) = "" Then
x = MsgBox("No puede dejar este campo vacío.", vbCritical)
txtSig.SetFocus
Exit Sub
End If
End Sub
La variable lVale, como la uso en toda la aplicación, la tengo definida como Public. Al entrar en todos los formularios que conllevan input la inicializo a False. Y en todos los eventos conflictivos pongo el condicionante del ejemplo.
Cambio su valor a True sólo cuando me interesa, como por ejemplo en
Private Sub txtSig_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
CboAut.SetFocus ' Foco al siguiente campo
lVale = True
txtSig_LostFocus
ElseIf KeyCode = 27 Then
CmdCan_Click
End If
End Sub
Ya lo tengo por sistema, y se me han solventado los quebraderos de cabeza por ese pasar y repasar por esos eventos.
Saludos y suerte