interdire a l'utilisateur de fermer un userform

  • Initiateur de la discussion arkancylla
  • Date de début
A

arkancylla

Guest
Bonjour, je viens d'achever un prog vba pour lequel j'ai utilisé des userforms. je souhaite interdire a l'utilisateur de les fermer, cad l'empecher d'appuyer sur la croix en haut a droite
merci de votre aide
 

Luki

XLDnaute Accro
bonjour arkancylla

à mon sens, il n'y a pas moyen d'empêcher la fermeture par la croix, mais je ne connais pas tout Lol!
D'une part, il est énérvant pour l'utilisateur de ne pas pouvoir fermer un usf, voir risque de bugs.
D'autre part, pourquoi vouloir interdire la fermeture ?

Par contre, il est possible d'intecepter la fermeture via l'événement ' QueryClose' de ton USF

Private sub USF_QueryClose()
If CloseMode= 0 then ' la valeur 0 indique qu'il est fermé par la croix.
end sub



A +
 

Ashaar

XLDnaute Junior
Bonjour le forum,

Le code ci-dessous masque la barre de titre du userform (y compris les croix ).

Il faut impérativement penser à prévoir un bouton pour sortir du UsrFrm (Unload Me )

Private Declare Function FindWindow Lib 'user32' Alias 'FindWindowA' _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowLong Lib 'user32' Alias _
'GetWindowLongA' (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLong Lib 'user32' Alias 'SetWindowLongA' _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function DrawMenuBar Lib 'user32' (ByVal hWnd As Long) As Long

Private Sub UserForm_Initialize()
Dim hWnd As Long, Style As Long

hWnd = FindWindow(vbNullString, Me.Caption)
Style = GetWindowLong(hWnd, -16) And Not &HC00000
SetWindowLong hWnd, -16, Style
DrawMenuBar hWnd
End Sub

Cdlt.

Message édité par: Ashaar, à: 02/05/2005 12:22


Bon, finalement il y a mieux : on conserve la barre de titre.

Private Declare Function GetWindowLongA Lib 'User32' _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib 'User32' _
(ByVal hWnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Private Declare Function FindWindowA Lib 'User32' _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long


Private Sub UserForm_Initialize()
Dim hWnd As Long
hWnd = FindWindowA('Thunder' & IIf(Application.Version Like '8*', _
'X', 'D') & 'Frame', Me.Caption)
SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) And &HFFF7FFFF
End Sub

Message édité par: Ashaar, à: 02/05/2005 12:41
 

Luki

XLDnaute Accro
ReBonjour le fil,

Bravo Ashaar pour la solution, je ne connaissais pas.

Toutefois, tu écris, je cite: Il faut impérativement penser à prévoir un bouton pour sortir du UsrFrm (Unload Me ), je suis entièrement d'accord sur ce point. Il faut pouvoir sortir d'un USF et la croix est le moyen par défaut que tout le monde connait.
Alors Hormis, la prouesse, que je salue, s'il s'agit par exemple d'interdire la fermeture avant que l'utilisateur n'ait saisit une donnée,
pourquoi ne pas simplement intercepter la fermeture et agir en conséquence ( annule ou valide les infos du USF par ex). C'est ce que je fais et ça marche bien. D'autre part, il m'est arrivé d'avoir des surprises avec les lib en fonction des versions d'Xl, mais bon, c'est vrai que je ne suis pas spécialiste et que j'essaie d'éviter les complications...

Attendons qu' arkancylla nous dise ce qu'il recherche pour affiner.

A+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Luki, Ashaar, Arkancylla, le Forum

Je partage tout à fait tes observations Luki, tant que l'on a les outils nécessaires dans VBA, il est toujours préférable de mettre les appels API de coté.

Par conséquent la méthode la plus simple et fiable pour le type de question d'Arkancylla est d'utiliser le CloseMode comme tu as annoncé Luki.

Voici une structure permettant la sortie du UserForm uniquement par un code 'Unload Me' lancé par un CommandButton par exemple. (à prévoir impérativement).

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
   
Select Case CloseMode
       
Case 0 'Ou Constante vbFormControlMenu
            MsgBox 'Fermeture par la Croix ou ''ALT F4''', vbCritical, 'Fermeture Interdite !!!!'
            Cancel =
True 'ici on interdit la fermeture
       
Case 1 'Ou Constante vbFormCode
            MsgBox 'Fermeture par programmation ''CommndButton'' ou autre', vbInformation, 'Fermeture Tolérée'
            Cancel =
False 'ici on autorise la fermeture (Facultatif, car False par défaut)
       
Case Else
            MsgBox 'Gros Plantage, ou Windows TaskManager, ou coupure EDF lol'
   
End Select
   
End Sub

Et du coup celà règle aussi dans la foulée le problème de Ashar avec le ALT F4...

Bon Appétit
@+Thierry
 

Paladin

XLDnaute Junior
Plus simple :

Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
End Sub

Ca bloque la croix et le ALT-F4. Pour ce qui est du moyen de sortir du UserForm en cas de pépin (style tu n'as plus la main ...), tu fais CTRL + PAUSE.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Paladin, Arkancylla, Luki, Ashaar

Oui vraiment plus simple, même je me permettrai de qualifier çà d'un peu 'simpliste' Paladin.

Car au fait, sans éteindre l'ordi, ou CTRL + Pause , (ou encore ALT + Suppress)... En usage normal, tu fermeras comment ce UserForm Paladin ?

Bonne Fin de Journée

@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 609
Messages
2 090 192
Membres
104 447
dernier inscrit
Baldur