Bonjour,
Oui, ça fonctionne, mais le code est bizarroïde
1 2 3 4 5 6 7 8 9
| Private Sub Workbook_BeforeClose(Cancel As Boolean)
10 DisplayAlerts = False
20 If ActiveWorkbook.Name <> ThisWorkbook.Name Then
30 ActiveWorkbook.Saved = True
40 ActiveWorkbook.Close
50 End If
'désactive le plein écran
60 Application.DisplayFullScreen = False
End Sub |
L’événementiel BeforeClose placé dans un classeur ne peut concerner, de base, que celui-ci donc tes lignes de code 20 à 50 qui testent le nom du classeur n’ont aucune utilité car cela ne peut se produire….
La ligne 10 ne peut pas ne pas planter normalement, DisplayAlerts étant une propriété de l’objet Application, tu es obligé de l’invoquer de façon explicite :
Application.DisplayAlerts = False
Je ne comprends pas non plus l’utilité de cette ligne sinon, vu que tu passes la propriété Saved de ton classeur à True, normalement il ne doit pas y avoir de message d’alerte à la fermeture…
Au niveau code pur, tu peux concaténer les lignes 30 & 40 en écrivant direct :
ActiveWorkbook.Close Savechanges:=False
Ton code devrait donc se résumer à :
1 2 3
| Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayFullScreen = True
End Sub |
Toujours question de logique, si tu utilises l’évènementiel Workbook_WindowActivate ainsi que le code déjà évoqué, c’est que tu considères que d’autres classeurs peuvent être ouverts en simultané, il serait donc logique de prévoir l’évènementiel contraire ainsi :
1 2 3
| Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Application.DisplayFullScreen = False
End Sub |
Vu qu’on peut activer, sans ruban, un autre classeur ouvert via la barre de tâches ou en VBA etc… On a un effet bascule correct du coup.
Le code du BeforClose devient, de fait, inutile.
Les choses seraient différentes si on utilisait les évènementiels au niveau Application via un module de classe, mais tu n’en parles pas.
cordialement,
Didier
Partager