Mira, este tipo de falla lo tuve al principio, pero lo "corregi" agregando una variable global de tipo boleana.
Lo q se me ocurre en en tu caso es que podrias verificar en q momento descargaras el Form (no el usuario, si no el programa automaticmante),
Entonces, siguiendo con lo de la variable podrias decirle que si es verdadera (caso en q el usuario cerro la form) muestre el mensaje de salida, si es falsa (caso en q se descarga automaticamente) no lo muestre:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If Salir = True Then
If MsgBox("Esta opción terminará la ejecución del programa. Esta seguro de salir ahora?", 4 + 32 + 256, "Salida del sistema") <> 6 Then
Cancel = True
Else
End
End If
Else
Unload Me
End If
End Sub
Lo q tendrias q agregar es la igualdad de la variable dentro del procedimiento donde descargas el Form automaticamente para q no mostrara el mensaje:
Sub DescargarForm () 'Supnemos q este es el proced.
Salir=False
----------
--------
End Sub
Asi cuando aplicas el procedimiento DescargarForm, le indicas q la variable Salir = False, cuando llega al evento QueryLoad, verifica el valor, pero como le indicastes que solo pusiera el mensaje de salida cuando fuese verdadero, no lo mostrara.
A lo mejor esta algo confuso, pero funciona....
Tienes q tener en cuenta q cada vez q se cierra un formulario (independientemente de donde lo cierres), pasa por el evento QueryUnload, de ahi q ponga una variable para verificar de donde viene la instruccion de sali