Microsoft 365 Bloquer la fermeture par la croix

José77

XLDnaute Occasionnel
Bonjour,
A l'aide d'un userform je lance l'ouverture d'un classeur. j'ai donc 2 classeurs ouverts à l'écran et j'aurai besoin de bloquer le clic sur la croix.
En utilisant Private Sub Workbook_BeforeClose(Cancel As Boolean) cela fonctionne pour le classeur qui lance le userform mais pas pour l'autre.
Quelqu'un pourrait il m'apporter de l'aide ?
Merci
 

bbb38

XLDnaute Accro
Bonsoir José77, le forum,
Essaies d’incorporer le code suivant dans tes deux formulaires, sans oublier de créer les boutons de commandes ‘Quitter’. Je n’ai pas testé la méthode, mais je vais te préparer un exemple.

VB:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "Vous ne pouvez pas utiliser la croix pour fermer ce formulaire." & Chr(10) & "Veuillez cliquer sur le bouton de commande 'Quitter'.", vbInformation, consttitre
Cancel = True
End If
End Sub

Cordialement,
Bernard
 

bbb38

XLDnaute Accro
Bonjour José77, le forum,
Dans mon premier message (#2), la solution correspond uniquement à la fermeture des formulaires (avec mes excuses, car trop souvent je lis trop vite les messages).
A tester, pour le blocage des classeurs. J’ai testé uniquement en ouvrant le classeur 1 (car mes petits yeux commencent à se fermer).
Les 2 classeurs doivent être dans le même répertoire (mais je suis certain que tu ne l’ignorais pas).
Cordialement,
Bernard
 

Pièces jointes

  • Classeur_1.xlsm
    44.5 KB · Affichages: 6
  • Classeur_2.xlsm
    46.3 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
bonjour
l'idée si je comprends bien est de bloquer la fermeture par la croix du classeur N2 ouvert par le classeur N1

somme toute c'est assez simple

un exemple
dans le classeur ouvreur dans le module thisworkbook
on va instancier un events d'un object workbook et piloter l'event qui nous interesse dans le classeur 1 sans toucher au classeur 2

demonstration
donc dans le module thisworkbook

VB:
Public WithEvents WbK As Workbook

Public Sub test()
Set WbK = Workbooks.Open("C:\Users\polux\Desktop\classeur2.xlsx")
End Sub

Private Sub WbK_BeforeClose(Cancel As Boolean)
Cancel = True
End Sub

Public Sub raz()
Set WbK = Nothing
End Sub
la sub test va donc ouvrir le classeur N2 et en même temps la variable object classeur WbK va s'instancier
on aura donc tout les events dispo comme si on etait dans le thisworkbook du classeur 2
dans l'event beforeclose ben tu cancel comme tu le ferais dans l'event lui même
et voilà essaie donc de fermer ton classeur 2 par la croix
pour le libérer tu lance raz la croix redeviendra fonctionnelle

pas compliqué ;)
 

José77

XLDnaute Occasionnel
Bonjour,
J’ai donc essayé les codes de Bernard et Patrick. Rien n’y fait je n’arrive pas à bloquer cette maudite croix.
Le problème est très bien expliqué par patrick (bloquer La croix du classeur N2 ouvert par le classeur N1) mais en vain.
Merci à tous les deux.
 

job75

XLDnaute Barbatruc
Bonjour José77, bbb38, patricktoulon,

On peut aussi mettre tranquilou la macro Workbook_BeforeClose dans Classeur2.xlsm.

Et mettre ce code dans l'UserForm ouvert depuis Classeur1.xlsm :
VB:
Private Sub CommandButton1_Click() 'Ouvrir Classeur2.xlsm
Workbooks.Open ThisWorkbook.Path & "\Classeur2.xlsm"
End Sub

Private Sub CommandButton2_Click() 'Fermer Classeur2.xlsm
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next
Workbooks("Classeur2.xlsm").Close False
Application.EnableEvents = True 'réactive les évènements
End Sub
Nota : en fait on peut toujours fermer Excel par le Gestionnaire des tâches...

A+
 

Pièces jointes

  • Classeur1.xlsm
    19.2 KB · Affichages: 1
  • Classeur2.xlsm
    14 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
bonsoir @job75
si on devait alors coder dans le classeur 2
il y a deux events qui ne sont pas implémentés dans vbe mais qui pourtant sont bien utiles
je parle de Auto-Open et Auto-close

ces deux events ont la particularité de se déclencher uniquement si le classeur st ouvert par son raccourci
mais sont inopérants si le classeur est ouvert ou fermé par un autre classeur (par vba)


dans le classeur 2 dans un module standard

VB:
Sub Auto_Open()
        ThisWorkbook.cancello = False
End Sub
Sub Auto_Close()
        MsgBox "bye!"
End Sub
dans le classeur 2 module thisworkbook
VB:
Public cancello As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = cancello
End Sub

Private Sub Workbook_Open()
cancello = True
End Sub
pour pouvoir fermer(pour le test) j'ajoute un bouton dans la feuille pour mettre cancello a false
VB:
Private Sub CommandButton1_Click()
ThisWorkbook.cancello = False
End Sub
en fait au workbook_open cancello est mis a true directement
si le fichier est ouvert par son raccourci la sub auto_open sera déclenchée et donc cancello sera false
mais si c'est un autre classeur qui ouvre le classeur2 la sub auto_open ne sera tout simplement pas déclenchée

démonstration avec ces deux classeurs joints
on les oubli bien trop souvent ces deux events
;)
 

Pièces jointes

  • Classeur1.xlsm
    17.4 KB · Affichages: 5
  • classeur2.xlsm
    18.1 KB · Affichages: 5

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 915
Membres
101 837
dernier inscrit
Ugo