Fermer tous les userforms sauf...

Manta Lucapyr

XLDnaute Nouveau
Bonjour a tous.

Je rencontre de nouveaux problèmes pour mon catalogue : je suis amené a utiliser a la suite différents userforms, et suite a une remarque des utilisateurs je les ai tous mis en non modal pour faciliter l'utilisation du fichier.

Problème : certains restent ouverts en fond,et comme j'utilise le fait que certains userforms soient visibles ou non pour mes critères de recherche, ça met un peu le boxon...

Etant donné que je serais amené a utiliser probablement plus de 50 userforms au total, j'aimerais une commande permettant de tous les fermer sauf certains, concernés. Une longue liste de " if UFmachin.visible = true then UFmachin.hide " me parait le meilleur moyen de se paumer ou d'en oublier, et la commande " End " semble ne pas permettre de maintenir visibles ( ou de remettre visible après son execution ) certains userforms.

Voilà, en esperant avoir été clair.

Merci d'avance

Cordialement, Manta.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Fermer tous les userforms sauf...

Bonjour Manta, le Forum

Ayant une petite expérience dans les Userforms, quand je lis "je serais amené à utiliser probablement plus de 50 userforms au total" Je défrise ! (Ceux qui me connaissent rigoleront !)

Déjà mon premier conseil, 50 Userforms, c'est la quatrième dimension, pratiquement ingérable, si en plus tu ne manges pas toutes les ressources de la machine.

En fait un application "bien faite" ne devrait avoir qu'une Dizaine (grand max) de UserForms. Il y a tellement de possibilité (des Tab Multipages, des TabStrip, de faire changer la taille du UserForm en RunTime), enfin vraiment la grosse panoplie de possibilités pour faire agir un UserForm en fonction de telles ou telles actions...

Enfin bon le HIDE n'est pas non plus conseillé, si le UserForm n'a plus d'intérêt il faut le Décharger et pas le Cacher (UNLOAD) sinon tu continues à le garder en mémoire probablement pour rien (?)

Un exemple de base :

4 UserForm (Userform1, Userform2, Userform3, Userform4)

Le Userform1 est lancé depuis un CommandButton1 sur une Feuille :
Private Sub CommandButton1_Click()
UserForm1.Show 0
End Sub

Sur ce UserForm1, tu décharge le UserFom1 (Me) et tu lances un UserForm2 avec un CommandButton1
Private Sub CommandButton1_Click()
Unload Me
UserForm2.Show 0
End Sub

Sur le UserForm2, tu lances avec un CommandButton1 le UserForm3 mais tu veux que le UserForm2 reste ouvert (et chargé) et que le UserForm3 ne chevauche pas le UserForm2
Private Sub CommandButton1_Click()
With UserForm3
.Show 0
.Left = 0
.Top = 0
End With
End Sub

Sur le UserForm2 tu as un second CommandButton2 qui lance le UserForm4 Toujours sans chevauchement en Haut à Gauche, mais tu veux que le Userform3 se Décharge si il est encore ouvert :
CommandButton2 du UserForm2:
Private Sub CommandButton2_Click()
With UserForm4
.Show 0
.Left = 0
.Top = 0
End With
End Sub

NB Dans le Module de Ce UserForm4 tu as aussi ceci :
Private Sub UserForm_Initialize()
If UserForm3.Visible = True Then Unload UserForm3
End Sub

Rien ne t'empêche de faire de même dans le Pricvate Module du UserForm3
Private Sub UserForm_Initialize()
If UserForm4.Visible = True Then Unload UserForm4
End Sub

Et ainsi de suite...

Bon Travail et bonne fêtes

@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Fermer tous les userforms sauf...

Re Bonjour

En relisant, j'ai peut-être zappé une possibilité que tu semblais demander, le Déchargement en Masse...

Donc on peut faire ceci :

Code:
Private Sub CommandButton1_Click()
Dim USF As Object
 
For Each USF In UserForms
    If Left(USF.Name, 1) = "U" Then
        Unload USF
    End If
Next USF

End Sub

Dans cet exemple si tous les UserForms se nomment Userform1, UserForm2 etc ils seront tous déchargés, mais tu peux nommer autrement ceux qui doivent rester (eg "Form1")

il y a aussi la possibilité d'utilser la Propriété Tag (Merci Ti_) en mode Design F4 sur le UserForm... Propriété Tag, indiquer un tag (ici "TAG")

Code:
Private Sub CommandButton1_Click()
Dim USF As Object
 
For Each USF In UserForms

    If USF.Tag = "TAG" Then
        Unload USF
    End If
Next USF

End Sub

Voilà tu auras ce genre de moyens, mais je le rapelle, 50 Userforms ça sent vraiment le Gaz...

PS "END" s'emploit pour tout décharger de la Mémoire pas uniquement des UserForms car cette instruction réinitialise tout y compris les valeurs stockée dans les Variables en mémoire, donc à utiliser vraiment en connaissance de cause.

Bien à vous

@+Thierry
 

ChTi160

XLDnaute Barbatruc
Re : Fermer tous les userforms sauf...

Salut Manta
Bonjour le Fil
Bonjour le Forum
Un coucou particulier à celui qu'on ne peut oublier @+Thierry Lol
Si effectivement tu défrises (cela t'ira beaucoup moins)
content de t'avoir croisé sur ce fil.
Bonne fin de journée
et Bon Weekend
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Fermer tous les userforms sauf...

Bonjour mon cher Jean Marie,

Vraiment plaisir de voir que tu es toujours dans les Fils où je passe, et que tu te portes bien.

Au fait au a droit à ZZ-top et Iggy pop sur le rocher le 5/07, et ce n'est pas une blague ! lol

Bien à toi,

Sorry for l'aparté dans ton Fil Manta

@+Thierry
 

Manta Lucapyr

XLDnaute Nouveau
Re : Fermer tous les userforms sauf...

Merci pour tes réponses Thierry.
Je sais que c'est pas vraiment ultra pratique comme solution les userforms multiples, mais c'est ce que j'ai trouvé de plus simple avec mes maigres connaissances.

Je t'explique : Actuellement j'ai un Userform en full screen permettant d'ouvrir 8 menus différents. J'ai du associer a chacun un USF parce que vu que certains d'entre eux changent déja grandement si certains boutons d'options sont cochés ou non, j'aurais fini avec une superposition de malade. ( si tu a des alternatives la dessus je suis preneur aussi, j'ai plus que 20 jours de boulot sur mon projet ( débugage compris ) mais on sait jamais ).

Et dans chaque menu j'ai entre 5 et 15 sous catégories de produits a classer, que je suis obligé de gérer sur des feuilles différentes parce que les caracteristiques a entrer varient, et pour lesquels j'ai associé un USF chacun, d'une part parce que ca me permettait de gérer mes critères de selections plus facilement, d'autre part et surtout parce que je pensais que ça serait plus simple a mettre a jour pour quelqu'un qui n'y connait rien, vu que c'est ce qui se passera après mon départ.

Je voyais quelque chose du genre " tu veux intégrer un nouveau type de produit, eh bah pouf tu importes un USF type, tu changes les valeurs la ou c'est indiqué, tu le relie au reste du programme avec trois quatres lignes de code ici et la, et ça marche "

Et tout ça renvoie sur un USF de résultat commun, capable de gérer le tout.

Je vais tester tes solutions, mais si tu a une idée qui te parait plus pratique pour gérer mon usine a gaz, fais m'en part. Si je peux simplifier mon boulot et surtout la vie des utilisateurs, c'est pas dommage.

Encore merci, et désolé pour la grosse tartine.
 

ChTi160

XLDnaute Barbatruc
Re : Fermer tous les userforms sauf...

Salut Manta
Bonjour le Fil
Ma petit incursion dans ce fil , fait que je suis averti de chaque nouvel apport à celui ci .
je tiens à te dire qu'il n'est pas évident de comprendre ce que tu veux faire (comme le Dit @+Thierry ça sent l'Usine à Gaz lol)
ne serait il pas possible que tu mettes un fichier exemple (-50k) avec quelques données non confidentielles (ou via Cijoint.com) avec quelques explications du résultat attendu .
Merci d'avance
Bonne fin de journée
 

YANN-56

XLDnaute Barbatruc
Re : Fermer tous les userforms sauf...

Bonjour à tous ici.

Au regard de votre pertinence sur ce fil, je me dis que si vous aviez regardé du coté de ma dernière question:
Peut-être un Barbatruc aurait eu une solution ??? :) :) :)

Amicalement, avec souvenirs des aides que vous m'avez déjà apportées.

Bonne fin de journée et bonne fin de semaine, si l'on ne se revoit pas d'ici là.

Yann
 

Discussions similaires

Statistiques des forums

Discussions
312 505
Messages
2 089 092
Membres
104 028
dernier inscrit
alain Barthe