Es una de las 'penas' de VB6, dichos eventos (Gotfocus y LostFocus) en el form están pensados exclusivamente para cuando se opera con aplicadones MDI, entonces dichos eventos saltan cuando se alterna entre ventanas MDIChild, para evitar confusión debieron llamarlos: GotDocusMDIChild y LostFocusMDIChild o algo similar...
Además dichos eventos están entrelazados con los eventos Activate y Deactivate, es decir no ocurren ni antes ni después de estos.
Hay un par de maneras, la larga es subclasificar para leer el mensaje que activa la ventana y derivarlo al evento deseado.
La otra forma es bastante más breve, y todavía asequible... usando una simple API, que nos devuelve el handle de la ventana que interactúa con el usuario en dicho instante.
Básicamente lo que haremos será chequear, cuando es nuestra ventana la que gana o pierde dicha atención, lo que equivale al resltados de tales eventos, aunque de un modo chapucero (no hay otra, salvo que quieras meter chorrocientas líneas para subclasificar los mensajes que reciba la ventana).
Coloca un control timer en el formulario pon a 100 su intervalo (100 milisegundos), luego con experiencia puedes decidir elevar dicho valor...
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Focus As Boolean
Private Sub Form_GotFocus()
' aqui tu codigo: cuando gana el foco
Debug.Print "Gotfocus " & Rnd ' solo para probar...
End Sub
Private Sub Form_LostFocus()
' aqui tu codigo: cuando pierde el foco.
Debug.Print "Lostfocus " & Rnd ' solo para probar...
End Sub
Private Sub Form_Load()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
If (Me.hWnd = GetForegroundWindow) Then
If (Focus = False) Then
Focus = True
Call Form_GotFocus
End If
Else
If (Focus = True) Then
Focus = False
Call Form_LostFocus
End If
End If
End Sub
Para probarlo tienes que mostrar la ventana de debug (ventana 'Inmediato') desde el menú ver, o bien pulsando CTRL+G durante la ejecución al menos...