Recherche de valeurs contenues dans des labels

ticrain Messages postés 178 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 2 janvier 2015 - 23 avril 2008 à 22:09
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 - 25 avril 2008 à 21:31
Bonjour les ptis loups

Voila j'ai une userform avec 164 labels. Ces derniers recuperent des valeurs qui se trouvent dans la colonne A1 (1 label pour une valeur). Je voudrai inclure une fonction recherche par le biais d'une textbox.

Exemple: Je tape 54 dans cette textbox et il me retrouve dans la useform le label qui contient cette valeur soit en l'entourant d'une forme ou autre...

Merci pour votre aide.

Nota : j'ai toujour pas trouvé le bon thème pour la prog VBA

11 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 13
23 avril 2008 à 22:24
Salut,

faut boncler sur les labels :

Dim MonControle As Object
For Each MonControle In Userform1.Controls
   IF MonControle.Value = TextBox1.Value Then
       With MonControle
            .BorderStyle = fmBorderStyleSingle
            .BorderColor = &H000000FF& 'rouge
       End With
       Exit For
    End If
Next

A+
   
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 13
23 avril 2008 à 22:31
...

oui bon ok pour le coup je boucle pas sur les labels mais sur tous les controles. C'est pour l'exemple mais, il est possible que ca plante si il y a un controle qui ne veut pas de la propriété .Value. Il te faudrai gérer cette eventualité.

Petit Louveteau  le VBA c'est ici :

[infomsg.aspx Thèmes] / [infomsgf_VISUAL-BASIC_1.aspx Visual Basic 6] / [infomsgt_LANGAGES-DERIVES_287.aspx Langages dérivés] / [infomsgt_VBA_244.aspx VBA]

A+
0
ticrain Messages postés 178 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 2 janvier 2015
23 avril 2008 à 23:00
Désolé mais je débute en VBA

Et j'avoue ne pas trop comprendre ta boucle. Je veux que la forme entoure le label qui contient la valeur saisie dans la textbox. Les valeurs des labels se trouvent dans la feuille 1 colonne A. il y'a 164 valeur donc 164 labels.

Peut tu m'eclaircir ta boucle s'il te plait
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 23 août 2018 21
24 avril 2008 à 00:09
Il faudrait peut-être que tu expliques ce qu'il y a sur ta feuille et le rapport avec tes 164 (!) labels. Y a-t-il 164 lignes de données en colonne A ? Est-ce que A1 correspond à Label1, A2 à Label2,... ?

Si tu inscris 54 dans ton Textbox, quel Label veux-tu voir s'afficher ?

Désolé, mais je ne vois pas ton UserForm...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0

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

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 13
24 avril 2008 à 00:30
Ai iAi iAi Ai iAi iAiiiiiiiii !!!...

je viens de voir tes precedents postes... j'ai un peu peur maintenant

As-tu essayé le code que je t'ai donné ?

alors commençont par le commencement :

un label, un bouton, une textbox etc, sont des objets de la colection controles. On peu aussi dire que ce sont des controles. Au meme titre qu'une cellule de ta feuille excel est un objet de la collection Range.

Pour chercher la valeur qui a ete saisie dans la textbox et trouver quel label contient cette valeur il te faut boucler sur les labels comme tu le ferais pour des cellules. Mais la grande difference entre une cellule et un controle est qu'une cellule est referencée par une adresse : "A1", "C12" etc. alors que les controles non eux pas de reference.

Pour rechercher une valeur dans des cellules a l'aide d'une boucle pas de probleme il suffit de boucler sur les references: par exemple

dim i as long
for i = 1 to 10
    if range("A" & i).value = toto then msgbox " la valeur toto ce trouve en ligne : " & range("A" & i).row
next i

helas cette methode ne marche pas pour les controles du fait qu ils non pas de references. Pour les controles on a une autre solution qui consiste a boucler dans la collection elle meme c'est a dire sur chaque objet de la collection. Le probleme est aussi que l'on ne peu pas directement utiliser les proprietes d'un objet comme par exemple son nom.

Pour bien comprendre la suite note qu'une collection controles est toujours enfant d'un objet de plus haut niveau tel qu'une feuille excel ou un formulaire. Ce qui veut dire que tu auras autant de collection de controles que tu as de formulaire. Donc pour boucler dans une collection il faudra toujours l'appeler en passant par sont parent le plus proche. Dans notre cas le formulaire qui contient la collection de controles.

maintenant passont aux choses concretes :

Dans l'exemple que je t'ai donné et que je te redonne ici:

Dim MonControle As Object
For Each MonControle In Userform1.Controls
   IF MonControle.Value = TextBox1.Value Then
       With MonControle
            .BorderStyle = fmBorderStyleSingle
            .BorderColor = &H000000FF& 'rouge
       End With
       Exit For
    End If
Next

tu peux voir, que je donne a la variable MonControle une dimension objet. Pourquoi ?
En fait cette variable est un peu comme une boite qui devient ce que l'on met dedans. un peut comme quelque chose qui permetrait de reveler un objet visible mais dont on ne percoit pas les proprietes, comme sa couleur, sa forme, sa matiere etc. Autrement dit si je met un bouton de type CommandButon ou un Label dans cette boite celci me permetra alors d'aceder a toute ses proprietes et notament ici celle qui nous interesse la valeur (.Value).

pour comprendre ce qui ce passe je traduire la ligne suivante :

For Each MonControle In Userform1.Controls = pour chaque objet dans la collection de controle de mon userform1

ici VBA prend les controles du userform1 un par un et les met dans la variable MonControle. La variable MonControle devient en quelque sorte le controle et me donne alors la possiblité de voir les proprietes. ce qui est fait avec la ligne suivante que je traduit aussi:
IF MonControle.Value TextBox1.Value Then si la valeur du controle est egale a la valeur de la textbox alors la suite ...

D'ailleur cela me fait penser que l'on aura un probleme car la textbox faisant partie de la collection  et evidemment
TextBox1.Value = TextBox1.Value

il y a une petite correction a faire mais je n'est plus de temps maitenant.

A+
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 13
24 avril 2008 à 06:52
???

bizzard le precedent message n' est pas celui prevu ????????

voila le code version corrigée:

Dim MonControle As Object, NomDuControl As String
NomDuControl = "label" ' nom du type de controle sur le quel on veut boucler
For Each MonControle In Userform1.Controls
   ' ici on regarde si le controle dans la variable MonControle est bien un label si oui on continu si non on passe au suivant
   If Left(LCase(MonControle.Name), Len(NomDuControl)) = NomDuControl then 
      If MonControle.Value = TextBox1.Value Then ' ici on compare la valeur du label trouve avec la valeur de la textbox
          With MonControle ' si la valeur est identique on met en forme le label
               .BorderStyle = fmBorderStyleSingle 'on lui met un cadre
               .BorderColor = &H000000FF& 'rouge
          End With
          Exit For
      End If
   End If
Next

et désole pour les fautes du message précèdent, j'avais vraiment plus de temps et je n'ai pas relu<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Bonne journee a tous, moi je vais me coucher
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
24 avril 2008 à 09:39
et si on a pris la bonne habitude de renommer ses controles ?
tout le monde ne laisse pas label1, label2 ou label3 ....


Dim MonControle As Object
For Each MonControle In Userform1.Controls
If TypeOf Moncontrol Is Label Tehn
With MonControle ' si la valeur est identique on met en forme le label
If .Value = TextBox1.Value Then ' ici on compare la valeur du label trouve avec la valeur de la textbox
.BorderStyle = fmBorderStyleSingle 'on lui met un cadre
.BorderColor = &H000000FF& 'rouge
Exit For
End If
End With
End If
Next
0
ticrain Messages postés 178 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 2 janvier 2015
24 avril 2008 à 09:58
Bonjour les ptis loups
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
24 avril 2008 à 10:04
c'est pas bientot finit, ticrain ?

soit tu trouves cela sacrément amusant, soit tu ne lis pas la FAQ...

http://www.vbfrance.com/doc/faq.aspx#cs_postempty
0
lillith212 Messages postés 1229 Date d'inscription vendredi 16 novembre 2007 Statut Membre Dernière intervention 16 juin 2009
25 avril 2008 à 17:12
Salut,

Remarque, s'il a utiliser les groupes de controle c'est plus simple vous ne pensez pas?
Est ce le cas?

SLB
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 13
25 avril 2008 à 21:31
Salut,

lillith212 : y pas cette possiblité en VBA helas

ouai je sais, il est facile de ce tromper vu que ce poste n'est pas dans le bon theme.

Par contre ticrain j'ai vu dans un de tes autres postes que tu as mis tous les labels dans une frame.
Dans ce cas si ta frame et seulement si elle ne contient que les labels, dans la boucle tu n'as pas besoin de verifier
le type de des controles :

Dim MonControle As Object
For Each MonControle In Userform1.Frame1.Controls
   IF MonControle.Value = TextBox1.Value Then
       With MonControle
            .BorderStyle = fmBorderStyleSingle
            .BorderColor = &H000000FF& 'rouge
       End With
       Exit For
    End If
Next

Renfield : ok pour TypeOf  en VBA mais la synthaxe a respecter est la suivante

Dim MonControle As Object, i As Long
For Each MonControle In Userform1.Controls
   If TypeOf MonControle Is MSForms.Label Then
        i = i + 1
   End If
Next
MsgBox i & " Label(s) trouvé(s). "

Une petite precision pour les autres:
TypeOf dans une condition IF renvoi vrai si ObjectName est l'objet du type spécifié . Donc pour en savoir plus, dans l'aide VBA il faut regarder du coter de  la condition IF

A+
0