Choisir le Userform

bananevapeur - 22 oct. 2013 à 18:13
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 29 oct. 2013 à 10:55
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

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 22/10/2013 à 18:45
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 oct. 2013 à 07:26
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 oct. 2013 à 07:51
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à.



0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
23 oct. 2013 à 13:47
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


0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 23/10/2013 à 14:05
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é.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
23 oct. 2013 à 16:16
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

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 oct. 2013 à 16:24
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.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
23 oct. 2013 à 18:54
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.
0
bananevapeur
23 oct. 2013 à 16:26
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 ^^
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
23 oct. 2013 à 18:53
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 = ...

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 23/10/2013 à 19:47
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 oct. 2013 à 20:34
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 !
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
23 oct. 2013 à 21:00
Ce qui, comme tu me l'a fait remarquer dans ma première proposition. .. .ne permet pas de manipuler ensuite les contrôles.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 23/10/2013 à 21:15
Pourquoi ? Pas du tout !
Ce n'était qu'un exemple ! Si l'on peut montrer, on peut s'y référer. Et si on peut s'y référer, on peut également se référer aux contrôles dont il serait le conteneur, selon le même principe !
Tu veux un exemple ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2013 à 08:34
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 ...
0
bananevapeur
24 oct. 2013 à 09:00
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
0
bananevapeur
24 oct. 2013 à 09:10
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é.
0
Rejoignez-nous