Pointer un label de manière dynamique

kamagap Messages postés 5 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 4 juin 2009 - 1 juin 2009 à 17:05
cyrilremy Messages postés 33 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 11 août 2010 - 25 avril 2010 à 12:46
Bonjour à tous,

J'ai une petite question, ça ne doit pas être bien compliqué mais je cherche depuis un moment et je ne trouve pas. Voilà, j'ai une userform sur laquelle il y a une dizaine d'objets (textbox, button...). Je souhaiterai pouvoir changer la langue d'affichage. Pour simplifier le code, j'ai créé un tableau dans lequel j'ai placé dans la colonne 1 les noms des différents labels (label_1, button_3...), dans la colonne 2 les "captions" correspondants en français (bienvenue), et dans la 3  ceux correspondants en anglais (welcome). Ce que je voudrais faire c'est passer par une variable intermédiaire de type string, pointer sur la première colonne, stocker le nom du label dans ma variable, puis selon la langue sélectionner, modifier le caption du label en allant chercher la valeur dans l'une ou l'autre colonne. Voici le code que j'ai pour le moment et qui ne fonctionne pas:

"If langue = "Fr" Then


For i_ = 1 To 10

label = Cells(i_, 1).Value
label.Caption = Cells(i_, 2).Value


Next


Else


For i_ = 1 To 10


label = Cells(i_, 1).Value
label.Caption = Cells(i_, 3).Value




Next


End If"

Ce code fonctionne lorsque j'écris le nom du label en dur par exemple "label_1 = cells(i_,3).value" .

Voila, merci d'avance pour vos réponses.

9 réponses

cyrilremy Messages postés 33 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 11 août 2010
1 juin 2009 à 20:25
Si je comprends bien, avec la ligne
label = Cells(i_, 1).Value
tu cherches à obtenir dans "label" l'objet label dont le nom est représenté par "Cells(i_,1).Value" ?

Le problème, c'est que Label est, justement, un label, et non pas un nom. En fait, label est de type "Label" et Cells(i_, 1).Value de type String (si c'est un nom).

Il te faudrait une boucle de type FOR EACH... NEXT, et vérifier pour chaque label de ton formulaire, si son nom est égal à "TaCellule.Value", et si c'est le cas, stocker ce label dans la variable "Label".
0
kamagap Messages postés 5 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 4 juin 2009
2 juin 2009 à 09:07
Merci de ta réponse cyrilremy! Si je comprends bien, il faut donc que je déclare ma variable "label" en tant que label et non pas en tant que string?
D'après ce que tu dis ça donnerai:

if monlabel1.name=cells(i_,1).value then
label=monlabel1
endif

Si c'est cela, peut-on alors écrire directement quelque chose du genre:

label.name=cells(i_, 1).value  ?

Car en fait sinon je perds l'intérêt d'avoir une liste de labels puisque je dois les tester un par un. Ou bien ai-je mal compris?

Merci.
0
cyrilremy Messages postés 33 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 11 août 2010
2 juin 2009 à 20:04
il faut donc que je déclare ma variable "label" en tant que label et non pas en tant que string?
D'après ce que tu dis ça donnerai:

if monlabel1.name= cells(i_,1).value then
label=monlabel1
endif



C'est à peu près ça, oui.

peut-on alors écrire directement quelque chose du genre:
label.name=cells(i_, 1).value  ?

Hélas non... si tu fais cela, tu ne feras que changer le nom de "label", et tu obtiendras une erreur te disant qu'un objet portant ce nom existe déjà.

je perds l'intérêt d'avoir une liste de labels puisque je dois les tester un par un.

En réalité, il ne faut pas que tu les testes un par un, mais à l'aide d'une bouche "For Each". Cette boucle parcourt tous les objets d'un type donné dans un collection. En VB.Net, ça donne par exemple :

For each l As Label In Me.Controls
    if l.Name =cells(i_,1).Value Then
        label=l
        Exit For
    End If
Next

Cette boucle va effectuer l'action en italique (If... end If) pour chaque (For each) objet de type label dans la collection 'Me.Controls'.
Une fois le bon label trouvé, on le stocke dans ta variable 'label' et on arrête de parcourir les éléments (Exit For).

Bon courage à toi

<hr size="2" width="100%" />Penser : Réponse acceptée !
0
kamagap Messages postés 5 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 4 juin 2009
3 juin 2009 à 11:37
Merci pour tes réponses complètes! J'ai essayé un peu ça, mais je ne vois pas à quoi correspond le "me" de "me.controls"?
J'ai un problème avec ton code car je ne peut pas déclarer directement "l" dans le "For Each". Je l'ai donc déclaré comme label en tête de programme mais ça ne marche pas. En cherchant dans l'aide, j'ai vu que "l" devait être déclaré en tant que "control" puisqu'il n'y a pas que des labels dans ma userform (il y aussi des boutons etc).
J'ai donc essayé tout un tas de chose grâce à l'aide, mais il y une erreur récurrente pour le code suivant:
"label.caption=cells(i_,3)"
C'est une erreur 91 mais je ne comprends pas pourquoi. J'ai déclaré label comme un label, ça ne marche pas, comme un control, ça ne marche pas non plus, et j'ai ajouté un "Set label=l" au lieu de "label=l", mais toujours rien. As-tu une idée?

Je suis désolé, j'ai un peu de mal! J'a déjà fait pas mal de programmation en C, C++ mais le VBA je débute vraiment! Merci pour ton aide et ta patience en tout cas!
0

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

Posez votre question
cyrilremy Messages postés 33 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 11 août 2010
3 juin 2009 à 16:31
Ah, c'est en VBA...
Vous êtes ici : Thèmes / [forum-VB-NET-VB-2005_40.aspx VB.NET et VB 2005]
Ce que je te donnais était du VB.Net... en VBA je sais pas trop comment faire.

En ce qui concerne l'erreur 91, je sais pas du tout. As-tu plus de détails sur cette erreur ? (Texte affiché) ?
0
kamagap Messages postés 5 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 4 juin 2009
4 juin 2009 à 08:51
Oui effectivement c'est VBA, j'ai oublié de le préciser! Mais ce n'est pas grave car en fait mon application fonctionne! Je n'y ai pas retouché mais le fait de la relancer ce matin ça a marché! Voilà le code final:

"Private Sub but_fr_en_Click()


Dim langue As String
Dim i_ As Integer
Dim l As Control
Dim label As Object


'Ouverture de la page


Worksheets("Fra_En").Activate


'Reconnaissance de la langue actuelle


langue = Range("d1").Value


'Modification de la langue sélectionnée


If langue = "Fr" Then
    langue = "En"
Else
    langue = "Fr"
End If


'Enregistrement de la langue


Range("d1").Value = langue


'Passage des labels et buttons en français


If langue = "Fr" Then


For i_ = 2 To Controls.Count


'Recherche des labels de la collection dans la page Fra_En


For Each l In Controls
    If l.Name = Cells(i_, 1).Value Then
    Set label = l
    Exit For
End If


Next


'Modification du caption du label sélectionné par la valeur en français


label.Caption = Cells(i_, 2).Value


Next


'Même procédé pour le passage à l'anglais


Else


For i_ = 2 To Controls.Count
For Each l In Controls
    If l.Name = Cells(i_, 1).Value Then
    Set label = l
    Exit For
End If


Next


label.Caption = Cells(i_, 3).Value


Next


End If


End Sub"

En tout cas merci beaucoup pour ton aide!!! Bonne journée!!!
0
kamagap Messages postés 5 Date d'inscription lundi 1 juin 2009 Statut Membre Dernière intervention 4 juin 2009
4 juin 2009 à 14:14
C'est encore moi! Cela fonctionne effectivement correctement, mais je ne sais pas comment faire pour appliquer ce changement à tout les userforms de l'application! Cela fonctionnerai-t-il si je crée une collection qui engloberait tous les labels et buttons de l'application?

Merci.
0
cs_Kikouyou1080 Messages postés 1 Date d'inscription dimanche 21 février 2010 Statut Membre Dernière intervention 25 avril 2010
25 avril 2010 à 10:41
Bonjour, je me permet de faire remonter ce post car j'ai le meme genre de soucis en vb.net.
Je souhaiterai modifier la visibilités de labels a l'aide d'une boucle "pour".
L'idée est d'avoir des coordonnées au label (avec les index j'imagine)du genre
lbl11 lbl21 lbl31 ...
lbl12 lbl22 lbl32 ...
... ... ...

étant donné que le nombre maximal de label pouvant être affiché est connu, je les ai tous créé en invisible et je voudrais rendre certains labels visible comme suit :
        Dim xy As Integer
        For i = 1 To nbLettreChoisi
            For j = 1 To NbMaxProposition
                xy = CUInt(CStr(i & j))
                lbl(xy).Visible = True
            Next j
        Next i

En recherchant sur le net, j'ai cru comprendre qu'il fallait ajouter un controle avec des "name" identiques pour chaque label et les index souhaités alors, j'ai tenté de créer un control pour mettre tout mes labels indexé manuellement 11, 12, 13, ... Mais ensuite je n'arrivais pas a donner le même nom a tous ni a appeler le control.

Merci pour votre précieuse aide!
0
cyrilremy Messages postés 33 Date d'inscription samedi 15 décembre 2007 Statut Membre Dernière intervention 11 août 2010
25 avril 2010 à 12:46
Eh bin, pour ce qui est de VB.Net, tu peux appliquer ce qu'on disait dans les posts précédents, par exemple créer une fonction GetLabelByName qui prend en paramètres le nom du label et qui retourne le label lui-même :

pour chaque label (tous contenus dans l'objet Me.Controls)
si le nom du label est le paramètre,
alors on retourne le label et on quitte la fonction.

tu utilises la fonction pour obtenir un objet "label" dont tu modifies ensuite la propriété Visible.

Voilà voilà
0
Rejoignez-nous