Choisir le Userform

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour tout le monde !
.
Je cherche à utiliser un string et un integer pour créer un userform : je m'explique
.
j'aimerai grace à une fonction que j'ai créée gérer l'affichage de plusieurs userforms et pour ça j'aimerai combiner un string "Userform" et un integer 2 pour utiliser des commandes du style UserForm2.combobox1.value = ...
.
merci d'avance !!!

8 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
1) La collection Userforms contient UNIQUEMENT les UserForms déjà chargés
2) on ne peut, dans cette collection, se référer à un userform par son nom, mais UNIQUEMENT par son index
3) les index de cette collection sont attribués dans l'ordre de création de ces userforms
Tu ne peux gérer autrement qu'ainsi.

Regarde et comprends ===>>
 Load UserForm1
Load UserForm2
n = 2
UserForms(n - 1).Show

t'affichera Userform2
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Ceci étant dit : on peut toujours utiliser des tremplins (tableaux, switch, etc ...) pour faire ce que tu cherches à faire.
Le "tremplin" le plus simple, s'agissant de VBA, est l'utilisation d'une combobox cachée à deux colonnes.
C'est là un procédé "tiré par les cheveux", mais que je suis prêt, si tu y vois un intérêt réel, à écrire.

Tu dis.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Et puis après tout, voilà (je viens de m'y amuser... et de bâcler un peu ...) :
Il te faut avoir ajouté une combobox combobox1 avec ces propriétés :
- visible = false
- ColumnCount = 2

exemple d'utilisation
Private Sub CommandButton1_Click()
Load UserForm2
Load UserForm1
prepare
n = 2
ComboBox1.Text = "userform" & n
If ComboBox1.ListIndex >= 0 Then UserForms(ComboBox1.ListIndex).Show
End Sub

Private Sub prepare()
ComboBox1.Clear
For i = 0 To UserForms.Count - 1
ComboBox1.AddItem UserForms(i).Name
ComboBox1.List(i, 1) = i
Next
End Sub


Tu remarqueras (je te l'ai dit plus haut) que les userforms à montrer doivent bien évidemment appartenir déjà à la collection des userforms. Et donc avoir été chargés à un moment où à l'autre.
Voilà.



Messages postés
30294
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Bonjour,


Il est tout à fait possible de charger des userform à partir de leur nom

Exemple :
Sub lancementUSF()
Dim sVariable As String
i=2
sVariable = "UserForm" & i
VBA.UserForms.Add(sVariable).Show
End Sub


Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour, jordane45,
Charger, oui. Utiliser ensuite à partir d'une chaîne de caractères, non ...
Pour mémoire :
"j'aimerai grace à une fonction que j'ai créée gérer l'affichage de plusieurs userforms et pour ça j'aimerai combiner un string "Userform" et un integer 2 pour utiliser des commandes du style UserForm2.combobox1.value = ... "

PS : ton code, en fait, crée un userform, lui attribue un nom et montre l'objet ainsi créé, dans la foulée (l'objet concerné est à ce moment là unique et donc reconnu).
Mais il est ensuite impossible de se référer à cet objet userform en utilisant la chaine de caractères qui a servi à lui attribuer un nom. Il est pour cela nécessaire, si par exemple, on lui a attribué le nom "toto", de se référer à l'objet toto créé et non en utilisant "toto"
Sauf à utiliser un subterfuge du genre de celui que j'ai montré.
Messages postés
30294
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Charger, oui. Utiliser ensuite à partir d'une chaîne de caractères, non ...

Et ça ? =>
Sub test()
Dim oUserForm As Object
Dim usfName As String
usfName = "Userform" & 1
Set oUserForm = UserForms.Add(usfName)

oUserForm.TextBox1.Text = "ceci est un test"
oUserForm.Show

End Sub

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Cà oui, mais tu es dans le même cas que le cas précédent (utilisation de l'objet ajouté.
Ce que veut bananevapeur est pouvoir écrire quelque chose du genre :
"UserForm" & n pour se référer à l'un des userform en fonction de n !
Et ce, n'importe où dans son code.
Je ne sais pas pourquoi il le veut, mais c'est ce qu'il veut.
Messages postés
30294
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Je viens de mettre la réponse en dessous.
Il suffit d'assigner dans une variable Tableau de type OBJET les différents Userform.
Ainsi, il suffit d'appeler ce tableau (n) pour accéder au userform voulu.

merci les gars pour vos réponses je regarde ça dès que je peux!
c'est strictement dans une démarche d'allègement de mon code !
sûr qu'à force de faire des copiers collers de mes formules les fichiers deviennent gros ^^
Messages postés
30294
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Bon,
Afin de pouvoir afficher ET gérer les Userform via une variable,
je propose l'utilisation d'un Tableau d'objets.

(Variables définie en GLOBALE de façon à pouvoir l'appeler de partout dans le code )

Exemple:
' A placer dans un MODULE

Global Usf() As Object

Sub test()
Dim oUserForm As Object
Dim usfName As String

For i = 1 To 2
ReDim Preserve Usf(i + 1)
usfName = "Userform" & i
Set Usf(i) = UserForms.Add(usfName)
Next

'afficher le userform1
Usf(1).Show

End Sub



j'aimerai combiner un string "Userform" et un integer 2 pour utiliser des commandes du style UserForm2.combobox1.value = ...

Ce qui donnerait ici par exemple :
 Usf(2).combobox1.value = ...

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Egalement, jordane. C'est également une manière. Relis d'ailleurs ce que j'en avais dit :
"Ceci étant dit : on peut toujours utiliser des tremplins (tableaux, switch, etc ...) pour faire ce que tu cherches à faire".
Celle-là, toutefois, oblige, contrairement à celle d'une combo, à passer par un autre nom (celui du tableau) et plus celui de l'userform
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Tout cela pour dire que si l'on doit s'écarter de la demande initiale, qui était, je le rappelle :
"j'aimerai grace à une fonction que j'ai créée gérer l'affichage de plusieurs userforms et pour ça j'aimerai combiner un string "Userform" et un integer 2 pour utiliser des commandes du style UserForm2.combobox1.value = ... "
Alors ==>> inutile de chercher midi à 124 heures, dans ce cas d' "éloignement" et : ===>>>
Private Sub montre(usf As String)
For Each u In UserForms
If u.Name = usf Then u.Show
Next
End Sub

appelable par :
n = 2
montre "UserForm" & n

montrera (s'il est chargé, une fois de plus, et donc appartient ainsi à la collection Userforms) l'userform nommé Userform2 !
Mais on s'écarte de la demande, telle que formulée !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Exemple, donc :
Private Sub CommandButton1_Click()
Load UserForm1
Load UserForm2
Dim n As Integer
n = 2
On Error Resume Next
Set toto = dis("UserForm" & n)
toto.TextBox1.Text = "bbb"
toto.Show
On Error GoTo 0
End Sub

Private Function dis(usf As String) As Object
Set dis = Nothing
For Each u In UserForms
If u.Name = usf Then Set dis = u
Next
End Function


A tester avec 2 userforms userform1 et userform2 contenant une textbox textbox1

(je préfère toutefois de loin la souplesse de mon 1er code, avec la combo invisible, hein ...)

J'avais signalé plus haut d'autres mécanismes possibles (tableaux, switch, etc ...)
Il y en a deux autres encore :
1) utiliser le scripting Runtime
ou
2) écrire dynamiquement une macro et l'exécuter ensuite (en agissant sur les vbcomponents).
Je n'ai même pas voulu en parler car encore plus "tarabiscoté" pour rien ...

salut les gars !
.
J'ai donc essayé le code de Jordanne 42
Merci pour la solution apporté j'ai presque cru que ça allait marcher !!
jusqu'à ce que mon excel ne plante avec l'erreur qui suit "espace pile insuffisant".
.
apparemment il aime pas trop XD

je suis actuellement en train de tenter un truc je vous tiens au jus

bon ben ça a pas fonctionné...

j'essayais de créer le tableau dans une autre feuille que le userform qui se serait appelé lui-même mais excel voulait pas que je définisse le tableau usf() en tant qu'object public
du coup c'est rapé.
Messages postés
30294
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2020
338
Les variables globale se definissent dans des modules (pas dans le code des userform..).
Ton souci vient sûrement de la.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Où en es-tu, bananevapeur ?
Et si problème réglé ===>>> clos s'il te plait cette discussion (un clic sur le tag "RESOLU")