ticrain
Messages postés178Date d'inscriptionjeudi 15 mars 2007StatutMembreDernière intervention 2 janvier 2015
-
23 avril 2008 à 22:09
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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é.
ticrain
Messages postés178Date d'inscriptionjeudi 15 mars 2007StatutMembreDerniè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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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.
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 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