VBA USF: masquer temporairement un userform sans passer par UserForm_Activate

Guy_M

XLDnaute Occasionnel
Bonjour,

J'ai un petit problème avec le masquage et l'affichage d'un userform. J'ai joint un petit fichier de simulation pour que vous puissiez tester.

Mon userform est grand et donc masque une partie de l'écran. A un moment, je pose une question à propos de la feuille Excel sélectionnée et pour que l'utilisateur puisse bien voir la feuille, je souhaite masquer le userform puis le réafficher.

Bêtement, je pensais qu'avec un "me.visible = True/False" marcherait. Mais VBA pour Excel ne le permet pas. Je doit donc utiliser le couple (infernal) me.hide et me.show. Gros souci, chaque me.show appelle la procédure évènementielle UserForm_Activate et donc tout ce qui vient après n'est pas exécutée immédiatement mais quand je ferme le userform.

J'ai tracé tout ça avec une série de debug.print, je simule le comportement souhaité de ma procédure avec le bouton "BoutonTestHideShow" dans le userform
Code:
LancerLeTest_Clic:début
UserForm_Initialize:debut
ActionInitiale
UserForm_Initialize:fin
UserForm_Activate
BoutonTestHideShow_Click:début
UserForm_Activate
BoutonFermer_Click:debut
BoutonFermer_Click:fin
BoutonTestHideShow_Click:fin
LancerLeTest_Clic:fin

Marche à suivre pour reproduire cette trace dans la fenêtre d'exécution : cliquer sur "Lancer le test" puis sur "Test hide/show" (vous pouvez cliquer plusieurs fois) et pour finir sur "Fermer".

Que puis-je faire pour afficher/masquer le userform sans que UserForm_Activate ne s'exécute ?

Par avance, je vous remercie de vos réponses.
Guy
 

Pièces jointes

  • TestHideShowUSF.xlsm
    20.7 KB · Affichages: 34

Pierrot93

XLDnaute Barbatruc
Re : VBA USF: masquer temporairement un userform sans passer par UserForm_Activate

Bonjour,

essaye comme ceci, pas testé avec tes "Debug.Print", pas mon truc...

Code:
Dim b As Boolean
Private Sub BoutonFermer_Click()
Debug.Print "BoutonFermer_Click:debut"
Unload Me 'Décharge le formulaire en mettant le contenu à zéro (aux valeurs par défaut)
Debug.Print "BoutonFermer_Click:fin"
End Sub
Private Sub BoutonTestHideShow_Click()
Debug.Print "BoutonTestHideShow_Click:début"
Me.Hide
    MsgBox (Me.Name & " masqué pour voir les feuilles de calcul")
MsgBox ("BoutonTestHideShow_Click: Userform visible : " & Me.Visible)
If Not Me.Visible Then b = True: Me.Show
Debug.Print "BoutonTestHideShow_Click:fin"
b = False
End Sub
Private Sub UserForm_Activate()
If b Then Exit Sub
Debug.Print "UserForm_Activate"
End Sub
Private Sub UserForm_Initialize()
Debug.Print "UserForm_Initialize:debut"
ActionInitiale
Debug.Print "UserForm_Initialize:fin"
End Sub
Private Sub ActionInitiale()
MsgBox "Action initiale"
Debug.Print "ActionInitiale"
End Sub

bon après midi
@+
 

Guy_M

XLDnaute Occasionnel
Re : VBA USF: masquer temporairement un userform sans passer par UserForm_Activate

Bonjour,

J'ai trouvé une première solution de contournement en déplaçant le userform hors de l'écran, je remplace Me.Hide par :
Code:
Haut = Me.Top
Gauche = Me.Left
Me.Top = -Me.Width
Me.Left = -Me.Height
puis Me.Show par
Code:
Me.Top = Haut
Me.Left = Gauche

Ça marche mais je ne trouve pas ça très élégant.

A bientôt
Guy
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : VBA USF: masquer temporairement un userform sans passer par UserForm_Activate

Bonjour à tous,

une autre manière de faire en pièce jointe

à+
Philippe
 

Pièces jointes

  • 111.xlsm
    19.6 KB · Affichages: 38
  • 111.xlsm
    19.6 KB · Affichages: 44
  • 111.xlsm
    19.6 KB · Affichages: 47

Guy_M

XLDnaute Occasionnel
Re : VBA USF: masquer temporairement un userform sans passer par UserForm_Activate

Merci Pierrot93 et phlaurent55 pour vos réponses

Malheureusement, Pierrot93 ta proposition ne change rien à l'affaire. Mais pourquoi "Me.Visible = True" est interdit ?

A bientôt
Guy
 

Si...

XLDnaute Barbatruc
Re : VBA USF: masquer temporairement un userform sans passer par UserForm_Activate

salut

voir Si... cela peut convenir

Dans l'Usf en ShowModal = False
Code:
Private Sub Bouton_Click()
   Me.Hide
End Sub

pour revoir le formulaire : clic en A1 (ou autre et pour tout onglet)
Dans ThisWorkbook
Code:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal R As Range)
  If R.Address = "$A$1" Then UserForm1.Show
End Sub
 

Pièces jointes

  • Hide ShowUSF.xlsm
    21.6 KB · Affichages: 34

Discussions similaires

Statistiques des forums

Discussions
312 384
Messages
2 087 841
Membres
103 667
dernier inscrit
datengo