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

Bonjour à tous,
Dans un document modèle (xltm), je souhaite remplacer le message standard=
d'Excel à la fermeture d'un classeur (Voulez-vous enregistrer.. etc) par=
celui-ci, le problème c'est que bien que la procédure fonctionne comme=
je l'attend, une fois le classeur fermé, Excel reste figé (planté).
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 = "Exécution de macro."
.EnableEvents = False
.ScreenUpdating = False
.DisplayAlerts = False
End With
If ActiveWorkbook.Saved = False Then
Reponse = MsgBox("Désires-tu sauvegarder les modifications?", vb=
YesNoCancel + vbInformation, "Attention, à l'historique des factures?")
If Reponse = vbNo Then
Sheets("Facture").[NO_Fact].Value = ""
[Control].Value = 2
ActiveWorkbook.Saved = True
With Application
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True
End With
ActiveWorkbook.Close SaveChanges:=False
ElseIf Reponse = vbYes Then
Sheets("Facture").[NO_Fact].Value = ""
[Control].Value = 2
Insérer ' Cette macro copie les données de la facture dans =
un classeur de sauvegarde
ActiveWorkbook.Save
Else
Cancel = True
End If
End If
With Application
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
'
Merci d'avance pour votre aide,
cordialement,
Emile
Dans un document modèle (xltm), je souhaite remplacer le message standard=
d'Excel à la fermeture d'un classeur (Voulez-vous enregistrer.. etc) par=
celui-ci, le problème c'est que bien que la procédure fonctionne comme=
je l'attend, une fois le classeur fermé, Excel reste figé (planté).
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 = "Exécution de macro."
.EnableEvents = False
.ScreenUpdating = False
.DisplayAlerts = False
End With
If ActiveWorkbook.Saved = False Then
Reponse = MsgBox("Désires-tu sauvegarder les modifications?", vb=
YesNoCancel + vbInformation, "Attention, à l'historique des factures?")
If Reponse = vbNo Then
Sheets("Facture").[NO_Fact].Value = ""
[Control].Value = 2
ActiveWorkbook.Saved = True
With Application
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True
End With
ActiveWorkbook.Close SaveChanges:=False
ElseIf Reponse = vbYes Then
Sheets("Facture").[NO_Fact].Value = ""
[Control].Value = 2
Insérer ' Cette macro copie les données de la facture dans =
un classeur de sauvegarde
ActiveWorkbook.Save
Else
Cancel = True
End If
End If
With Application
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
'
Merci d'avance pour votre aide,
cordialement,
Emile
Testé sans exécution de la macro Insérer. Je ne reproduis pas ton problème.
Quelles sont tes versions de Windows et d'Excel ?
Cordialement.
Daniel
Emile63 a exposé le 16/11/2015 :
http://cjoint.com et poster le lien généré ?
Daniel
Emile63 a exprimé avec précision :
Et arrive si répond: Non (VbNo)
Bien que dans le pas-à-pas il aille jusqu'à la fin de la procédure sa ns accrocs,
ActiveWorkbook.Close SaveChanges:úlse
Pas d'erreurs (on error resume next étant désactivé) !
C'est après que mon Excel se fige. Je n'ai plus accès au menu et bouton s. Si j'avais une autre feuille ouverte derrière, elle n'est plus accessi ble.
Alt+ Ctlr + Del :-(
Essaie comme ceci. Dans la procédure, tu utilises l'expression "ActiveWorkbook"
est-ce possible que tu aies plus d'un classeur ouvert?
Si la macro désigne le classeur dans lequel la macro est écrite, pourquoi n'utilise
pas l'expression "ThisWorkbook" à la place de "ActiveWorkbook" ?
Que représente " [Control]" ? Une plage nommée?
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Reponse As String
With Application
.StatusBar = "Exécution de macro...."
.EnableEvents = False
.ScreenUpdating = False
.DisplayAlerts = False
End With
If ActiveWorkbook.Saved = False Then
Reponse = MsgBox("Désires-tu sauvegarder les modifications?", vbYesNoCancel + vbInformation,
"Attention, à l'historique des factures?")
If Reponse = vbNo Then
Sheets("Facture").[NO_Fact].Value = ""
[Control].Value = 2
With Application
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True
End With
ActiveWorkbook.Saved = True 'Modifier
ActiveWorkbook.Close 'Modifier
ElseIf Reponse = vbYes Then
Sheets("Facture").[NO_Fact].Value = ""
[Control].Value = 2
Insérer ' Cette macro copie les données de la facture dans un classeur de sauvegarde
ActiveWorkbook.Save
Else
Cancel = True
End If
End If
With Application
.DisplayAlerts = True
.StatusBar = False
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
"Emile63" a écrit dans le message de groupe de discussion :
J'ajouterai que le blocage n'arrive pas en cliquant sur annuler.
Et arrive si répond: Non (VbNo)
Bien que dans le pas-à-pas il aille jusqu'à la fin de la procédure sans accrocs,
ActiveWorkbook.Close SaveChanges:úlse
Pas d'erreurs (on error resume next étant désactivé) !
C'est après que mon Excel se fige. Je n'ai plus accès au menu et boutons. Si j'avais une autre
feuille ouverte derrière, elle n'est plus accessible.
Alt+ Ctlr + Del :-(
Avec un traitement d'erreur;
'----------------------------
'ErrorHandler:
' vtMessage = "Erreur détectée"
' vtMessage = vtMessage & _
' Chr(10) & _
' Chr(10) & "Erreur Numéro: " & Err & _
' Chr(10) & "Description: " & Error()
' MsgBox vtMessage, vbInformation, ctByg
'-----------------------------
il m'annonce tout de même le message suivant:
-Erreur N° 40040
Si ça peut éclairer quelqu'un..
Daniel
Emile63 vient de nous annoncer :
Ne te sens pas obliger de répondre aux questions que l'on te pose...
Si j'étais à ta place, je donnerais un autre nom à ce que tu appelles "Control"
afin d'éviter que VBA interprète mal cette expression.
Désolé j'étais en RV.
Me revoici .
Oui, [Control] est une plage nommée.
Je vais la renommer [MonContrôle], si vous pensez qu'elle peut perturber.
Oui, il est possible que plus d'un classeur soit ouvert.
Ne doit se fermer que celui ou se trouve cette procédure.
Merci pour ton support.
Emile