Question desactivation msgbox
Bonjour les amis,
Je viens de recevoir un tool d'un consultant qui fait des calculs qui prennent des heures...
Je suis en train de construire un tool qui me permet de lancer une suite de calculs à la suite en faisant appel à ce classeur.
A la fin des calculs j'ai plusieurs msgbox qui s'affichent et qui stoppent donc ma macro.. Ce qui m'embête, je pourrais toucher au code pour virer ces msgbox mais j'aimerais laisser ce tool tel quel.
Des idées?
Merci
Exemple de fermeture de MsgBox indésirable
Bonjour,
Si cela peut aider, voici un exemple de fermeture de MsgBox indésirable.
Le code ci-dessous ferme la MsgBox indésirable, l'important est de connaître son titre car son identification se fait par lui.
Copiez le code suivant dans un module standard
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| '### Adapter la constante selon le Titre de la MsgBox ###
Private Const TITRE_MSGBOX As String = "zaza"
'########################################################
Dim OnTimer&
Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String)
Private Declare Function SetTimer& Lib "user32" ( _
ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer& Lib "user32" ( _
ByVal hwnd As Long, ByVal nIDEvent As Long)
Private Declare Function GetWindowText& Lib "user32" Alias "GetWindowTextA" ( _
ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long)
Const WM_CLOSE As Long = &H10
'___________________________
Private Sub CloseMsgBox()
Dim HwndMsgBox&
HwndMsgBox& = FindWindow(vbNullString, TITRE_MSGBOX)
Dim Ch$
Dim Tampon&
Dim reponse&
Ch$ = Space(1024)
Tampon& = Len(Ch$)
reponse& = GetWindowText(HwndMsgBox&, Ch$, Tampon&)
Ch$ = Trim(Replace(Ch$, Chr$(0), ""))
If Ch$ = TITRE_MSGBOX Then
SendMessage HwndMsgBox&, WM_CLOSE, 0, ByVal 0&
End If
End Sub
'___________________________
Private Sub RunTimer(Delai&)
If OnTimer& > 0 Then OffTimer
OnTimer& = SetTimer(0, 0, ByVal Delai&, AddressOf CloseMsgBox)
End Sub
'___________________________
Private Sub OffTimer()
If OnTimer& > 0 Then
OnTimer& = KillTimer(0&, OnTimer&)
OnTimer& = 0
End If
End Sub
'___________________________
Sub monTraitement()
'*** Code traitement avant l'apparition du message ***
'///// à ajouter à votre code ////
OnTimer& = 0
Call RunTimer(Delai:=1000) 'j'ai mis le délai à 1 seconde pour voir ce qui se passe (1000 millisecondes)
'Call RunTimer(Delai:=0)
'---- Ici : simulation d'un message indésirable (à virer)----
MsgBox prompt:="coucou", Title:="zaza"
'------------------------------------------------------------
Call OffTimer
'/////////////////////////////////
'*** Code traitement après fermeture du message ***
End Sub |
Lancez la procédure monTraitement pour faire un test.
Fermer une MsgBox indésirable par macro contenue dans une autre instance d'Excel
Bonjour,
Une autre piste employant une macro de fermeture à partir d'une autre instance d'Excel.
L'intérêt est que la macro s'effectue dans un processus différent et n'interfère pas avec le programme principal.
Code a copier dans un module standard d'un nouveau classeur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| '### Adaptez les constantes selon votre usage ###
Private Const TITRE_MSGBOX As String = "zaza" 'Titre exact de la MsgBox indésirable
Private Const DELAI As String = "00:00:30" 'Intervalle d'exécution pour la récursivité ("00:00:30" = toutes les 30 secondes)
'################################################
Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" ( _
ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String)
Private Const WM_CLOSE As Long = &H10
Sub CloseMsgBoxIndesirable()
Dim Hwnd&
Hwnd& = FindWindow(vbNullString, TITRE_MSGBOX)
If Hwnd& <> 0 Then SendMessage Hwnd&, WM_CLOSE, 0, ByVal 0&
'--- Rappel de la procédure selon un délai ---
Application.OnTime Now + TimeValue(DELAI), "CloseMsgBoxIndesirable"
End Sub |
Il faut sauvegarder le classeur et l'ouvrir dans une autre instance d'Excel.
On ouvre les classeurs principaux avec la démarche normale.
Pour ouvrir ce classeur dans une autre instance d'Excel il faut ouvrir Excel puis faire menu Ouvrir.