OVH Cloud OVH Cloud

Excel se bloque après l'exécution d'une macro événementielle "BeforeClose"

23 réponses
Avatar
Emile63
Bonjour =E0 tous,

Dans un document mod=E8le (xltm), je souhaite remplacer le message standard=
d'Excel =E0 la fermeture d'un classeur (Voulez-vous enregistrer.. etc) par=
celui-ci, le probl=E8me c'est que bien que la proc=E9dure fonctionne comme=
je l'attend, une fois le classeur ferm=E9, Excel reste fig=E9 (plant=E9).
Quelqu'un pourrait me venir en aide :-)

'-------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Reponse As String
'On Error Resume next
With Application
.StatusBar =3D "Ex=E9cution de macro...."
.EnableEvents =3D False
.ScreenUpdating =3D False
.DisplayAlerts =3D False
End With
If ActiveWorkbook.Saved =3D False Then
Reponse =3D MsgBox("D=E9sires-tu sauvegarder les modifications?", vb=
YesNoCancel + vbInformation, "Attention, =E0 l'historique des factures?")
If Reponse =3D vbNo Then
Sheets("Facture").[NO_Fact].Value =3D ""
[Control].Value =3D 2
ActiveWorkbook.Saved =3D True
With Application
.DisplayAlerts =3D True
.StatusBar =3D False
.EnableEvents =3D True
.ScreenUpdating =3D True
End With
ActiveWorkbook.Close SaveChanges:=3DFalse
ElseIf Reponse =3D vbYes Then
Sheets("Facture").[NO_Fact].Value =3D ""
[Control].Value =3D 2
Ins=E9rer ' Cette macro copie les donn=E9es de la facture dans =
un classeur de sauvegarde
ActiveWorkbook.Save
Else
Cancel =3D True
End If
End If
With Application
.DisplayAlerts =3D True
.StatusBar =3D False
.EnableEvents =3D True
.ScreenUpdating =3D True
End With
End Sub
'---------------------------------------------------

Merci d'avance pour votre aide,
cordialement,
Emile

10 réponses

1 2 3
Avatar
MichD
J'ai testé la proposition que je t'ai faite et elle fonctionne très bien
sans se planter ou planter Excel.
As-tu testé la procédure sans exécuter la procédure "Insérer" ?
Ceci pourrait te donner une idée à savoir laquelle des procédures
génère une erreur

MichD
---------------------------------------------------------------
Avatar
Emile63
Re-Bonjour Mich1D,

J'essaie de cerner le problème, car la proc. fonctionne et c'est Excel qu i plante.
Oui j'ai testé sans l'appel à l'autre procédure, et ça ne change ri en.
En fait j'ai constaté que si je répond OUI ou ANNULER au message tout v a bien, Excel ne bronche pas.
C'est quand je lui dit NON, qu'il tousse...
Cet événement se situant avant l'appel à la procédure Insérer, je pense que cette proc. n'a pas de rapport.
J'ai suivi tes conseils et changé [Control] par[Mon_Control] ainsi que Ac tiveWorkbook par ThisWorkbook mais sans résultat malheureusement.

J'ai l'impression que lors du VbNo c'est à ce niveau que ça pêche:
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True

Parceque en désactivant tous ces blocs (les 3), j'ai l'impression que c'e st plus stable. Par contre ça bouge...
Voilà ou j'en suis!
Avatar
Emile63
Heu.. Non je retire ce que j'ai dit: Ca ne va pas mieux avec les événem ents désactivés..
C'était une fausse joie! :-(

Est-ce qu'il ne manquerait pas quelque chose pour redonner la main a Excel ?
Je pense a un: DoEvents
quelque part ... Je sais pas.
Avatar
Emile63
Re Bonjour MichD,

Dans ton cas, quand ton classeur se ferme via la procédure et si tu n'as pas d'autres classeurs ouverts derrière, si tu fermes alors Excel par la [X], Excel se ferme normalement ?

Merci de me redire, :-)
Bonne soirée
Avatar
DanielCo
Recopie toutes les feuilles de ton classeur dans classeur vierge, ainsi que les
macros et les userforms, au besoin. Enregistre-le et teste. Il est possible que
ton classeur soit corrompu.
Daniel
Emile63 a émis l'idée suivante :
Re Bonjour MichD,

Dans ton cas, quand ton classeur se ferme via la procédure et si tu n'as pas
d'autres classeurs ouverts derrière, si tu fermes alors Excel par la [X],
Excel se ferme normalement ?

Merci de me redire, :-)
Bonne soirée
Avatar
Patrick
Le 16/11/2015 18:47, DanielCo a écrit :
Recopie toutes les feuilles de ton classeur dans classeur vierge, ainsi
que les macros et les userforms, au besoin. Enregistre-le et teste. Il


est possible que ton classeur soit corrompu.



mais que fait la police ??? :)




---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
Jacquouille
Salut Patrick
La police est fort occupée ces jours-ci et n'a pas le temps pour quelques
virus.
Mais, elle prend le temps de te saluer bien bas.

Jacques
" Le vin est au repas ce que le parfum est à la femme."
.
"Patrick" a écrit dans le message de groupe de discussion :
n2d791$qo3$

Le 16/11/2015 18:47, DanielCo a écrit :
Recopie toutes les feuilles de ton classeur dans classeur vierge, ainsi
que les macros et les userforms, au besoin. Enregistre-le et teste. Il


est possible que ton classeur soit corrompu.



mais que fait la police ??? :)




---
L'absence de virus dans ce courrier électronique a été vérifiée par le
logiciel antivirus Avast.
https://www.avast.com/antivirus


---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
http://www.avast.com
Avatar
DanielCo
Patrick a exposé le 16/11/2015 :
Le 16/11/2015 18:47, DanielCo a écrit :
Recopie toutes les feuilles de ton classeur dans classeur vierge, ainsi
que les macros et les userforms, au besoin. Enregistre-le et teste. Il




est possible que ton classeur soit corrompu.



mais que fait la police ??? :)



Bonsoir,
;-))) A vrai dire, je n'avais pas compris. Merci Jacquouille.
Daniel
Avatar
MichD
Essaie cette macro...

'-------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Reponse As VbMsgBoxResult
With ThisWorkbook
If .Saved = False Then
Reponse = MsgBox("Désires-tu sauvegarder les modifications?", _
vbYesNoCancel + vbInformation, "Attention, à l'historique des factures?")

If Reponse = vbNo Then
With .Sheets("Facture")
.[NO_Fact].Value = ""
.[Control].Value = 2
End With
Application.EnableEvents = False
ThisWorkbook.Saved = True
Application.EnableEvents = True
Exit Sub
ElseIf Reponse = vbYes Then
With .Sheets("Facture")
.[NO_Fact].Value = ""
.[Control].Value = 2
End With
With Application
.StatusBar = "Exécution de macro...."
.EnableEvents = False
.ScreenUpdating = False
.DisplayAlerts = False
'Cette macro copie les données de la facture dans un classeur de sauvegarde
Call Insérer
.StatusBar = "Exécution de macro...."
.EnableEvents = True
.ScreenUpdating = True
.DisplayAlerts = True
End With
ThisWorkbook.Save

ElseIf Reponse = True Then
vbCancel = True
End If
End If
End With
End Sub
'-------------------------------------------------
Avatar
MichD
La dernière section de la procédure :
ElseIf Reponse = True Then
vbCancel = True

devrait plutôt se lire comme ceci :
ElseIf Reponse = vbCancel Then
Cancel = True

MichD
---------------------------------------------------------------
1 2 3