Userform.hide = invisible mais pas "fermé" ! [Résolu]

CerberusPau 377 Messages postés lundi 3 avril 2006Date d'inscription 22 août 2018 Dernière intervention - 20 oct. 2010 à 02:30 - Dernière réponse : CerberusPau 377 Messages postés lundi 3 avril 2006Date d'inscription 22 août 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 20 oct. 2010 à 08:44
3
Merci
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

Merci jordane45 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de jordane45
Meilleure réponse
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 20 oct. 2010 à 08:59
3
Merci
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)

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Jack
CerberusPau 377 Messages postés lundi 3 avril 2006Date d'inscription 22 août 2018 Dernière intervention - 20 oct. 2010 à 02:38
0
Merci
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
Commenter la réponse de CerberusPau
CerberusPau 377 Messages postés lundi 3 avril 2006Date d'inscription 22 août 2018 Dernière intervention - 20 oct. 2010 à 18:13
0
Merci
Bonjour,

Impeccable!

Merci à tous les deux

Cordialement
Rataxes64
Commenter la réponse de CerberusPau

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.