Userform.hide = invisible mais pas "fermé" !

Résolu
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 20 oct. 2010 à 02:30
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 20 oct. 2010 à 18:13
Bonjour,

Une sub A "ouvre" MaForm contenant une ComboBox avec "Maform.Show"

Avec "initialize", je charge une liste par "RowSource"... Tout va bien...

Puis une Sub B "ferme" MaForm par "MaForm.Hide" ... Tout va bien...

Mais si je relance la sub A... MaForm ne charge plus la Liste dans la ComboBox! J'ai uniquement la valeur précédemment sélectionnée de la Liste.

En revanche Si je FERME MaForm avec la croix, la Sub A rouvre bien MaForm avec la liste dans la ComboBox.

Il semble donc que le "MaForm.Hide" via la Sub B "cache" MaForm, mais ne la FERME pas.

J'ai tenté DoEvents, UnLoad : je n'y suis pas arrivé.

Mon appli étant trop lourde, je propose du code pour un petit exemple avec un classeur "Test.xls", dans la feuille "Liste", un Button "MaForm", et une liste de 1 à 13 en colonne A
Macro feuille "Liste" :
Private Sub Button_Click()
MaForm.Show
End Sub


Userform "MaForm" comprenant une Combo et un Button "OK"
If MaComboBox.Value = 3 Then MaForm.Hide

End Sub

Private Sub UserForm_Initialize()
Dim Listing
MaComboBox.Value = "Choisir dans la liste..."
Listing = Workbooks("Test.xls").Sheets("Liste").Range("A1:A13").Address(external:=True)    'plage du Row.Source Tests
MaComboBox.RowSource = Listing
End Sub


En choisissant 3 dans la liste et en cliquant sur OK, MaForm semble refermée,
Mais si je la rouvre depuis le bouton "MaForm" : je n'ai plus la liste, mais la valeur 3 !!!

Si maintenant je ferme avec la croix et que je rouvre avec le bouton "MaForm", j'ai bien la liste!

J'ai donc fait ça :
Private Sub Button_Click()
If MaComboBox.Value = 3 Then
    
    Dim Listing
    MaComboBox.Value = "Choisir dans la liste"
    Listing = Workbooks("Test.xls").Sheets("Liste").Range("A1:A13").Address(external:=True)    'plage du Row.Source Tests
    MaComboBox.RowSource = Listing

    MaForm.Hide
End If
End Sub

Et là c'est bon, mais PARCE QU'ON EST EN PRIVATE SUB...!

Mais ça ne marche PAS si l'ordre "MaForm.Hide" arrive depuis la réponse d'une MsgBox ou d'un Module, même avec les 2 lignes
    Listing = Workbooks("Test.xls").Sheets("Liste").Range("A1:A13").Address(external:=True)    'plage du Row.Source Tests
    MaComboBox.RowSource = Listing
    Listing = Workbooks("Test.xls").Sheets("Liste").Range("A1:A13").Address(external:=True)    'plage du Row.Source Tests
    MaComboBox.RowSource = Listing


Merci à qui pourrait m'aider.

Cordialement
Rataxes64

4 réponses

jordane45 Messages postés 38171 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 344
20 oct. 2010 à 08:44
Bonjour,

En effet, .hide => Cache

Pour "fermer" une form.; tu peux la décharger de la mémoire.
'charger en mémoire :
Load userform1
'Afficher
Userform1.Show
'Masquer / Cacher
Userform1.Hide
'Décharger de la mémoire
Unload Userform1


Tu as aussi une instruction qui permet de rafraichir ta forme après une modification
'Actualiser / redessiner la UserForm.
UserForm1.Repaint


C'est principalement ce que j'utilise pour manipuler les Form.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 oct. 2010 à 08:59
Salut

Oui, la méthode Hide cache, escamote, masque la forme mais ne la ferme pas.
Cela a certains avantages.
Par contre, Unload décharge l'objet et ses composants perdent leurs références donc leurs contenus.

Fais ce simple exemple, hors de ton projet :
Tu crées un nouveau classeur et tu y ajoutes deux UserForm1 et UserForm2.
Sur UserForm1, tu ajoutes un bouton dans le code duquel tu mets
UserForm2.Show
Sur UserForm2, tu ajoutes :
- un bouton dans le code duquel tu mets
Me.Hide
- un autre bouton dans le code duquel tu mets
Unload Me
- Une TextBox dans laquelle tu mets "Coucou" (en mode création)
- Dans l'évènement UserForm_Initialize, tu places ce code :
Debug.Print "UserForm2 Initialize"

Tu lances la UserForm1 et tu cliques sur le bouton.
-1- La UserForm2 s'affiche et sa TextBox renferme "Coucou".
Dans la fenêtre de debug (Ctrl-G), tu notes que l'Initialisation a eu lieu.
Modifie le texte de la TextBox puis clique sur le bouton qui provoque le Hide de la forme.
Reclique sur le bouton de la première forme, la seconde forme s'affiche à nouveau, en ayant conservé le texte modifié, et l'initialisation ne s'est pas redéclenchée.
-2- Refait cette même manip mais en cliquant sur le bouton qui provoque le Unload.
Tu verras que lors du rappel de forme 2, la TextBox reprend le texte mis en configuration, et l'initialisation a lieu.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
20 oct. 2010 à 02:38
Oups!

Un copier/coller a glissé...

Il manque la première ligne de code du premier essai de MaForm :
Private Sub Button_Click()


Vous aurez rectifié cet oubli

Cordialement
Rataxes64
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
20 oct. 2010 à 18:13
Bonjour,

Impeccable!

Merci à tous les deux

Cordialement
Rataxes64
0
Rejoignez-nous