OVH Cloud OVH Cloud

Interdire une Sub lors de la fermeture d'un UserForm

19 réponses
Avatar
cphil
Bonjour/soir à tous,

Je souhaite donc interdire une Sub à la fermeture
d'un UserForm par la croix en haut à droite, une piste...
un bout de code....

Merci pour votre aide.

-cphil-

9 réponses

1 2
Avatar
cphil
Jean-Marc a écrit:
> Voici une façon de faire:



>>Dim FORCE_QUIT As Boolean

Où déclarer cette variable?
A quoi fait réference FORCE , un objet, une instruction, une
expression...........?
Est-ce le TextBox, la UserForm ....?
Suis novice, première année maternelle prog. !
Merci.
-cphil-
> Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
> ' on teste si on veut "forcer le passage"
> If FORCE_QUIT Then
> Exit Sub ' hop on s'en va sans avertissement
> End If
> ' sinon cas général
> If TextBox1.Text = "" Then ' penser à tester la propriété, pas le
> controle entier
> Cancel = False
> MsgBox "tutu"
> End If
> End Sub
>
>
> Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
> ' MsgBox "On passe dans cet evenement en premier"
> FORCE_QUIT = True ' on force la variable à TRUE
> End Sub


Avatar
François Picalausa
"cphil" <cazenave.(suffitspam) a écrit dans le message
de news:uizgr%
Jean-Marc a écrit:
Voici une façon de faire:





>>Dim FORCE_QUIT As Boolean

Où déclarer cette variable?
A quoi fait réference FORCE , un objet, une instruction, une
expression...........?
Est-ce le TextBox, la UserForm ....?
Suis novice, première année maternelle prog. !
Merci.
-cphil-
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
' on teste si on veut "forcer le passage"
If FORCE_QUIT Then
Exit Sub ' hop on s'en va sans avertissement
End If
' sinon cas général
If TextBox1.Text = "" Then ' penser à tester la propriété, pas
le controle entier
Cancel = False
MsgBox "tutu"
End If
End Sub


Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer) ' MsgBox "On passe dans cet evenement en premier"
FORCE_QUIT = True ' on force la variable à TRUE
End Sub







Bonjour/soir,

Dim FORCE_QUIT doit se placer dans les déclarations, c'est à dire, avant
tout sub, fonction, ...

a noter que dim ne spécifie pas la protée (espace/temps d'existence de la
variable) et ici, elle sera publique sans raison.
Autant utiliser une variable privée...
Private FORCE_QUIT As Boolean.. ou comme dans mon exemple,
Private Quit As Boolean

FORCE_QUIT signifie simplement forcer l'arrêt. ça ne fait référence à rien..
c'est juste une variable de plus.. comme on aurait pu écrire
Private MaVariableQuiIndiqueSiOnPeutSauterLaVérificationOuPas As Boolean
Mais généralement, il est plus agréable de travaille sur des noms plus
courts (ForceQuit/Quit/IsClosing/...) de préférences explicite pour
comprendre ce qu'on fait sans s'encombrer de noms à rallonge....

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
Jean-Marc
"François Picalausa" a écrit dans le message de
news:
Dim FORCE_QUIT doit se placer dans les déclarations, c'est à dire, avant
tout sub, fonction, ...

a noter que dim ne spécifie pas la protée (espace/temps d'existence de la
variable) et ici, elle sera publique sans raison.
Autant utiliser une variable privée...



Hello,

C'est exact! Il est (très) judicieux de limiter la portée des variables au
strict nécessaire.
(Je ne l'avait pas fait pour ne pas introduire en plus la notion de Private
pour Cphil.)

On devrait d'ailleurs peut être rappeler aux débutants les 2 ou 3 régles de
Base pour un
bon usage des variables:

- portée réduite au minimum
- déclaration explicite du type + choix du type adapté
- convention de nommage minimum, du genre:
une variable nommée 'i' pour quoi que ce soit d'autre qu'un indice de boucle
est une hérésie, etc.

Jean-Marc
Avatar
cphil
Bonsoir,

J'ai testé ton exemple avec le focus sur
le TextBox, mais ça ne fonctione pas,
MsgBox "bla." s'affiche!
Où est le problème?

Private Quit As Boolean

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not Quit And TextBox1.Text = "" Then
MsgBox " bla.."
Cancel = True
End If
End Sub

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

Le code est écrit au niveau du UserForm.

Merci A+

"François Picalausa" a écrit dans le message de
news:
"cphil" <cazenave.(suffitspam) a écrit dans le message
de news:uizgr%
Dim FORCE_QUIT doit se placer dans les déclarations, c'est à dire, avant
tout sub, fonction, ...

a noter que dim ne spécifie pas la protée (espace/temps d'existence de la
variable) et ici, elle sera publique sans raison.
Autant utiliser une variable privée...
Private FORCE_QUIT As Boolean.. ou comme dans mon exemple,
Private Quit As Boolean

FORCE_QUIT signifie simplement forcer l'arrêt. ça ne fait référence à


rien..
c'est juste une variable de plus.. comme on aurait pu écrire
Private MaVariableQuiIndiqueSiOnPeutSauterLaVérificationOuPas As Boolean
Mais généralement, il est plus agréable de travaille sur des noms plus
courts (ForceQuit/Quit/IsClosing/...) de préférences explicite pour
comprendre ce qu'on fait sans s'encombrer de noms à rallonge....

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
François Picalausa
"cphil" <cazenave.(suffitspam) a écrit dans le message
de news:%2323ez2%
Bonsoir,

J'ai testé ton exemple avec le focus sur
le TextBox, mais ça ne fonctione pas,
MsgBox "bla." s'affiche!
Où est le problème?



Bonjour/soir,

L'ordre des événements varie peut-être en fonction des versions de VBA.
Essaye ceci:
Option Explicit

Private Quit As Boolean

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Debug.Print "Exit"
If Not Quit And TextBox1.Text = "" Then
MsgBox "bla..."
Cancel = True
End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Debug.Print "Close"
Quit = True
End Sub

Vérifie dans la fenêtre d'exécution immédiate l'ordre des événements.
Ce devrait être:
Close
Exit

Si tu as un ordre inverse, c'est que l'ordre des événements n'est pas le
même chez moi que chez toi...

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
cphil
"François Picalausa" a écrit dans le message de
news:OupPzB$
Bonjour/soir,

L'ordre des événements varie peut-être en fonction des versions de VBA.
Essaye ceci:
Option Explicit

Private Quit As Boolean

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Debug.Print "Exit"
If Not Quit And TextBox1.Text = "" Then
MsgBox "bla..."
Cancel = True
End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Debug.Print "Close"
Quit = True
End Sub

Vérifie dans la fenêtre d'exécution immédiate l'ordre des événements.
Ce devrait être:
Close
Exit



Bonsoir,

Seul l'évènement "Exit "est exécuté, aucune trace de "Close"!

Merci.
-cphil-
Avatar
François Picalausa
"cphil" <cazenave.(suffitspam) a écrit dans le message
de news:
"François Picalausa" a écrit dans le message de
news:OupPzB$
Bonjour/soir,

L'ordre des événements varie peut-être en fonction des versions de
VBA. Essaye ceci:
Option Explicit

Private Quit As Boolean

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Debug.Print "Exit"
If Not Quit And TextBox1.Text = "" Then
MsgBox "bla..."
Cancel = True
End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer) Debug.Print "Close"
Quit = True
End Sub

Vérifie dans la fenêtre d'exécution immédiate l'ordre des événements.
Ce devrait être:
Close
Exit



Bonsoir,

Seul l'évènement "Exit "est exécuté, aucune trace de "Close"!

Merci.
-cphil-



Bonjour/soir,

Les événements n'ont donc pas le même ordre.. bon à savoir...
Une solution serait d'effectuer le tester sur l'entrée dans les autres
contrôles.
Exemple: sur un userform contenant un textbox, textbox1 et deux combobox
(ComboBox1 et ComboBox2):
Private Sub ComboBox1_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox2_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox3_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub TestIsSet(TextBox As TextBox)
If TextBox.Text = "" Then
MsgBox "bla..."
TextBox.SetFocus
End If
End Sub

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
cphil
"François Picalausa" a écrit dans le message de
news:uKsV%
Les événements n'ont donc pas le même ordre.. bon à savoir...
Une solution serait d'effectuer le tester sur l'entrée dans les autres
contrôles.
Exemple: sur un userform contenant un textbox, textbox1 et deux combobox
(ComboBox1 et ComboBox2):
Private Sub ComboBox1_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox2_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox3_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub TestIsSet(TextBox As TextBox)
If TextBox.Text = "" Then
MsgBox "bla..."
TextBox.SetFocus
End If
End Sub



Bonsoir,

Comprends pas bien le but de la manip...
Peu-tu m'expliquer s'il te plait?
Est-ce pour tester l'ordre des évènements?
Si c'est de ça dont il s''agit regarde ce que j'ai fait:

Private Sub ComboBox1_Enter()
Debug.Print "Enter"
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox2_Enter()
Debug.Print "Enter"
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox3_Enter()
Debug.Print "Enter"
TestIsSet TextBox1.Text
End Sub

Private Sub TestIsSet(TextBox As String)
Debug.Print "test"
If TextBox1.Text = "" Then
MsgBox "bla..."
TextBox1.SetFocus
End If
End Sub

L'ordre d'éxécution est: Enter-Test -Enter-test

Merci pour ta patience.

-cphil-
Avatar
François Picalausa
"cphil" <cazenave.(suffitspam) a écrit dans le message
de news:elnC%
"François Picalausa" a écrit dans le message de
news:uKsV%
Les événements n'ont donc pas le même ordre.. bon à savoir...
Une solution serait d'effectuer le tester sur l'entrée dans les
autres contrôles.
Exemple: sur un userform contenant un textbox, textbox1 et deux
combobox (ComboBox1 et ComboBox2):
Private Sub ComboBox1_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox2_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub ComboBox3_Enter()
TestIsSet TextBox1.Text
End Sub

Private Sub TestIsSet(TextBox As TextBox)
If TextBox.Text = "" Then
MsgBox "bla..."
TextBox.SetFocus
End If
End Sub



Bonsoir,

Comprends pas bien le but de la manip...
Peu-tu m'expliquer s'il te plait?
Est-ce pour tester l'ordre des évènements?
Si c'est de ça dont il s''agit regarde ce que j'ai fait:



Bonjour/soir,

L'ordre des événements a été testé dans le code précédent. Dans ce cas ci,
on tente juste de palier au problème....
Donc, au lieu d'annuler la sortie du contrôle, on ne permet pas l'entrée
dans un autre.. c'est une autre approche du problème...

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
1 2