Lister les userform d un workbook pour agir dessus

Bonjour

Je cherche a lister tout les userform de mon workbook ( for each userform in thisworkbook ...next userform)

Ceci pour agir sur les uns et les autres suivant leurs noms ( soit les unload soit juste les hide ) au deactivate d une feuille

Ceci pour agir sur les uns et les autres suivant leurs noms ( soit les load soit juste les show ) au activate d une feuille

Je sens que je suis sur la bonne piste avec for each userform in thisworkbook ...next userform mais il manque surement quelque chose.

En atente de vos reponses

Merci d' avance

Cordialement

Bonjour Acrien, bonjour le forum,

La collection UserForms ne renvoie que la liste des userforms chargés (Load) mais pas la liste de tous les userforms...

Bonjour

Merci de votre reponse

J ai donc fait ceci pour faire en sorte de cacher tout les userfom charges des que je quitte la feuille pricipale de mo classeur

Private Sub Worksheet_Deactivate()

Dim usf As Object

For Each usf In ThisWorkbook.VBProject.VBComponents

usf.Hide

Next usf

End Sub

est il possible de show tout les userform justes hide ( et donc load ) a la reactivation de ma feuille principale ?

Merci bien

Re,

Qu'est qui t'empêche de tester ?... Je pense que ça devrait marcher.

j ai un petit probleme qui se manifeste

L instruction Dim usf As Object se passe bien

par contre des que l on rentre dans la boucle , la premiere iteration est fait avec l 'objet ThisWorksheet pour la variable usf , or , ceci n est pas un UserForm...

En essayant de faire usf.Hide ( donc ThisWorkbook.hide) il est donc logique que VBA me mette l erreur 438 qui dit que cette methode n est pas gere par cette objet.

Voila ou se trouve le probleme

En attente de votre reponse

Cordialement

Re,

Le problème est que sur ma bécane je ne peux plus utiliser ce genre de code sans bug suivi d'un message me disant que L'accès par programme au projet Visual Basic n'est pas fiable ?. Alors qu'avant je pouvais !... J'avais commencer à coder dans ce sens là.

Peut-être avec une gestion d'erreur (mais je ne peux pas tester) :

Private Sub Worksheet_Deactivate()
Dim usf As Object

For Each usf In ThisWorkbook.VBProject.VBComponents
On Error Resume Next
usf.Hide
If Err <> 0 Then Err.Clear
Next usf
End Sub

Bonsoir à tous,

Au cas où le problème n'est pas encore complètement résolu, essaie ceci :

Sub Test()
    Dim usf As VBComponent
    For Each usf In ThisWorkbook.VBProject.VBComponents
        If usf.Type = vbext_ct_MSForm Then MsgBox usf.Name
    Next usf
End Sub

Cordialement.

Bonsoir le fil, bonsoir le forum,

@MFerranf

ton code plante sur la ligne de déclaration : Dim usf As VBComponent avec le message : Erreur de Compilation: / Type définit par l'utilisateur non défini.

Je profite de ton passage pour te demander si tu sais pourquoi je ne peux plus utiliser ce type de code (voir Post #6) ? Cela vient-il de ma version d'Office 2010 64 bits ?

Salut ThauThème,

La dernière erreur, je viens de trouver ! Il faut que tu coches dans les références :

Microsoft Visual Basic for Applications Extensibility 5.3

J'ai pu constater qu'en décochant j'avais la même erreur et VBComponent n'était plus proposé par l'assistant lors de la frappe d'une déclaration, après avoir tapé As...

Par contre l'autre problème que tu signales, je t'aurais dit de vérifier dans les Options mais tu as sûrement dû le faire...

La version 64 bits jusqu'à présent je n'ai eu à m'inquiéter que du problème des données de type Long des fonctions API.

Mais tu n'es sans doute pas le seul à avoir des problèmes avec cette version... D'ailleurs je suis intéressé par les solutions si tu en viens à bout !

J'entretiens depuis quelques années une petite appli de gestion d'activités d'une association pour quelqu'un qui s'est trouvé doté d'une version 2013 64 bits. Après avoir réglé le problème des API (du moins je le croyais mais je n'en suis plus vraiment sûr) il vient de me signaler que ça coinçait encore (j'attends de savoir sur quoi).

Cordialement.

Bonjour le fil, bonjour le forum,

@MFerrand

J'ai fait comme tu as dit et en effet plus d'erreur !... Enfin, seul mon message qui ne me permet pas de poursuivre... Merci pour ta réponse.

@Adrien

Désolé de polluer ton fil avec des problèmes qui ne le concerne pas...

Private Sub Workbook_Open()

'charger en memoire tout les userform du projet

'initialisation de l interface

' a l ouverture du classeur

Dim usf As Object

For Each usf In ThisWorkbook.VBProject.VBComponents

If usf.Type = 3 Then ' si c est un userform ( donc ni une feuille ni un module ni thisworkbook )

usf.Load

End If

Next usf

End Sub

Moi j ai fait ce morceau de programme en m ' inspirant de ce que vous aviez marque ci dessus :

Le probleme est le suivant :

Je rentre bien dans ma boucle conditionnel lorsque l objet est un userform ( verifie avec le mode espion sur la variable objet usf )

par contre impossible de load l userform ( erreur 438 propirete ou methode non gere par cette objet ) alors que c est forcement un userform que je veux loader

Je precise que je veux loader tout mes userform a l ouverture de mon classeur , donc avant d executer ce code , aucun userform n est deja loadé , c' est impossible ...

En atente de vos avis

Merci

Bonjour,

D'une part, la syntaxe n'est pas usf.Load mais:

Load usf

Mais comme ça ça ne marchera pas ! Alors que dans une procédure : Load Userform1 fonctionne très bien, ilse charge d'ailleurs même sans Load, dès que tu l'évoques pour affecter une propriété à un contrôle...

Je suppose qu'on se trouve en fait dans le projet, car seule les propriétés de l'objet VBComponent fonctionnent !

Si tu mets usf.Activate..... pas de problème ça affiche l'objet en création dans l'éditeur... !

J'avais pourtant fait ça une fois mais impossible de me rappeler ni de mettre la main sur le classeur d'essais (qui a pet-être d'ailleurs été éliminé). Puis à force de mélanger les indices j'ai fini par me reconnecter : j'avais rejeté Userforms.Add, concluant trop rapidement qu'il ne s'agissait pas d'ajouter un nouveau Userform... alors que je venais de relire une proc. de création de userform en VBA (qui n'utilise pas du tout la collection Userforms) Est remonté à la surface ce que je sais pourtant depuis quelques temps : que la collection Userforms est la colllection des objets Userforms chargés.... et que donc ajouter un objet à la collection était ajouter un objet à la collection des Userforms chargés !!! Il y avait encore quelques incertitudes sur la syntaxe mais :

Load UserForms.Add(usf.Name)

Cette ligne de commande fonctionne ! Dans la boucle, quand un Userform est rencontré il sera chargé. Comme chargé n'est pas visible, je conseillerais pour les besoins du test de mettre dans l'Initialize des Userforms qui doivent être chargés un MsgBox qui lui s'affichera (Initialize est exécutée au chargement et avant affichage, sans .Show pas d'affichage mais Initialize est exécutée...)

Cordialement.

Rechercher des sujets similaires à "lister userform workbook agir dessus"