Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 annuler la commande BeforeClose, le temps d'une macro

pat66

XLDnaute Impliqué
Bonjour le forum,

est il possible que le temps d'une macro, le classeur se ferme sans que s'affiche ce message, merci

VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim ret As Integer
    ret = MsgBox("Vous souhaitez quitter sans enregistrer ?", vbYesNo + vbInformation, "titre")
    If ret = vbNo Then
        Cancel = True
    Else
    ThisWorkbook.Saved = True
  End If
End Sub

voici la macro en question (merci à Hasco)

Code:
Private Sub Workbook_Open()
Dim wk As Workbook
On Error Resume Next
Set wk = Workbooks("B.xlsm")
On Error GoTo 0
If Not wk Is Nothing Then
If MsgBox("B est ouvert" & vbCrLf & vbCrLf & "Fermer B et ouvrir A ?", vbOKCancel) = vbOK Then
wk.Close False
Else
ThisWorkbook.Close
End If
End If
End Sub



merci pour votre aide
 
Solution
bonjour,

Bien sûr si vous ne donnez pas tous les éléments !
On ne sait pas si les deux macros sont le même classeur, s'il s'agit du classeur A ou B s'il y en a d'autres, bref rien.

Je vous propose ceci et je m'arrêterai là, pour vous, je n'aime pas travailler comme ça.

Remplacez :
Code:
Private Sub Workbook_Open()
Dim wk As Workbook
On Error Resume Next
Set wk = Workbooks("B.xlsm")
On Error GoTo 0
If Not wk Is Nothing Then
If MsgBox("B est ouvert" & vbCrLf & vbCrLf & "Fermer B et ouvrir A ?", vbOKCancel) = vbOK Then
wk.Close False
Else
ThisWorkbook.Close
End If
End If
End Sub

Par
Code:
Private Sub Workbook_Open()
    Dim wk As Workbook
    On Error Resume Next
    Set wk = Workbooks("B.xlsm")
    On Error GoTo FIN...

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

Bien sûr si vous ne donnez pas tous les éléments !
On ne sait pas si les deux macros sont le même classeur, s'il s'agit du classeur A ou B s'il y en a d'autres, bref rien.

Je vous propose ceci et je m'arrêterai là, pour vous, je n'aime pas travailler comme ça.

Remplacez :
Code:
Private Sub Workbook_Open()
Dim wk As Workbook
On Error Resume Next
Set wk = Workbooks("B.xlsm")
On Error GoTo 0
If Not wk Is Nothing Then
If MsgBox("B est ouvert" & vbCrLf & vbCrLf & "Fermer B et ouvrir A ?", vbOKCancel) = vbOK Then
wk.Close False
Else
ThisWorkbook.Close
End If
End If
End Sub

Par
Code:
Private Sub Workbook_Open()
    Dim wk As Workbook
    On Error Resume Next
    Set wk = Workbooks("B.xlsm")
    On Error GoTo FIN
    Application.EnableEvents = False
    If Not wk Is Nothing Then
        If MsgBox("B est ouvert" & vbCrLf & vbCrLf & "Fermer B et ouvrir A ?", vbOKCancel) = vbOK Then
            wk.Close False
        Else
            ThisWorkbook.Close
        End If
    End If
FIN:

    Application.EnableEvents = True

End Sub

Là que ce soit dans l'un ou l'autre des classeurs, la macro ne devrait pas se lancer à la fermeture.
 

pat66

XLDnaute Impliqué
bonjour,

et merci beaucoup le message ne s'affiche plus lorsque je clique sur OK et l'ouverture de chaque classeur est bien conditionné selon que A ou B soit déjà ouvert, c'est parfait !!

Sauf que si, dans les deux cas, je clique sur "annuler", Excel me demande si je veux enregistrer les modifications que vous avez apportés au classeur B ou au classeur A, selon le cas

Ma question :
Peut on aussi faire en sorte de ne plus avoir cet avertissement de sorte que si je clique sur annuler, on revienne sur le classeur déjà ouvert et on annule l'ouverture de B sans avoir de message

PS : j'ai remarqué que lorsque je clique sur annuler, les 2 classeurs sont toujours présents dans le vba, alors que leur interface n'est plus visible

merci d'avance
 
Dernière édition:

pat66

XLDnaute Impliqué
re,

Cela fonctionne parfaitement, un grand merci,

mon seul soucis, c'est qu'en cliquant sur annuler l'un des deux classeurs se ferme bien, mais les 2 classeurs sont toujours présents dans le vba

VB:
Private Sub Workbook_Open()
    Dim wk As Workbook
    On Error Resume Next
    Set wk = Workbooks("B.xlsm")
    On Error GoTo FIN
    Application.EnableEvents = False
    If Not wk Is Nothing Then
        If MsgBox("B est ouvert" & vbCrLf & vbCrLf & "Fermer B et ouvrir A ?", vbOKCancel) = vbOK Then
            wk.Close False
        Else
            ThisWorkbook.Close false

        End If
    End If
FIN
    Application.EnableEvents = True
End Sub
 

Discussions similaires

Réponses
2
Affichages
422
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…