Recherche valeur colonne, récupération donnée ligne
Bonjour à toutes et à tous !
Je débute le VBA depuis à peine une semaine pour un projet d'entreprise et je suis bloqué à une étape...
Voilà, j'ai réussi à créer deux formulaires pour la gestion d'un stock (un qui enregistre les informations de retrait vers une feuille excel, l'autre qui permet de retrouver les informations dudit retrait effectué).
Les deux formulaires sont exactement identiques (même textbox, meme combobox, etc).
Ce que j'aimerai faire :
J'ai réussi à basculer les informations du UserForm dans une feuille excel et je voudrais maintenant faire le sens inverse :
Chaque mouvement matériel est référencé par un numéro unique (textbox NCall).
Je souhaite pouvoir retrouver toutes les informations du mouvement à l'aide de ce numéro que je remplie dans une textbox.
De plus, je voudrais que mes autres textbox se remplissent automatiquement en fonction des informations du retrait (elles sont toutes sur la même ligne).
Ci-après mon code pour trouver le numéro de référence, mais il ne marche pas...
Private Sub NCall_Change() 'NCall est le nom de ma textbox
Dim cel As Variant
For Each cel In Sheets("Mouvements_Materiels").Range("A3:A" & Sheets("Mouvements_Materiels").Range("A65536").End(xlUp).Row) 'Définition chemin plage de recherche
If cel.Value = NCall.Value Then 'Test si valeur cellule = numéro call
'Mettre ici le remplissage automatique des autres champs text (Item / OutDate / NSerie)
End If
Next cel
End SubJe vous remercie par avance pour le temps que vous m'accorderez !
Bonne journée !
Bonjour,
ton code paraît correct.
peut-être un problème de type de donnée.
essaie en modifiant l'instruction pour forcer la conversion en variable string
If cel.Value &"" = NCall.Value Then 'Test si valeur cellule = numéro callMerveilleux, ça marche ! Il trouve bien mes numéros de référence. Merci !
Maintenant as-tu une idée de comment pourrais-je faire pour récupérer les informations associés (qui sont sur la même ligne) ?
Zepn a écrit :Merveilleux, ça marche ! Il trouve bien mes numéros de référence. Merci !
Maintenant as-tu une idée de comment pourrais-je faire pour récupérer les informations associés (qui sont sur la même ligne) ?
bonjour
cel.row te donne le numéro de la ligne de cel.
tu peux accéder aux cellules sur la même ligne ainsi
textbox1=cells(cel.row,"A") ' mettre valeur de la colonne A dans textbox1Aie, ça ne marche pas... :/
"Could not set the Value property. Type mismatch."
Je suis sous Excel 2010
For Each cel In Sheets("Mouvements_Materiels").Range("A2:A" & Sheets("Mouvements_Materiels").Range("A65536").End(xlUp).Row) 'Définition chemin plage de donnée
If cel.Value & "" = NCall.Value Then 'Test cellule vide ou non
CallDate.Value = Cells(cel.Row, "B")
Client.Value = Cells(cel.Row, "C")
Customer.Value = Cells(cel.Row, "D")
End If
Next cel
End SubJ'ai mis .Value car le code que tu me proposes ne marche pas non plus.
En tout cas merci de ton investissement !
Edit : Finalement ça marche ! Il fallait simplement redémarer excel.
Merci encore une fois ! Bonne soirée
Bonjour,
une fois que tu as trouvé tes données tu peux arrêter la boucle
For Each cel In Sheets("Mouvements_Materiels").Range("A2:A" & Sheets("Mouvements_Materiels").Range("A65536").End(xlUp).Row) 'Définition chemin plage de donnée
If cel.Value & "" = NCall.Value Then 'Test cellule vide ou non
CallDate.Value = Cells(cel.Row, "B")
Client.Value = Cells(cel.Row, "C")
Customer.Value = Cells(cel.Row, "D")
exit for
End If
Next cel
End SubBonjour !
Je reviens vers vous car j'ai de nouveau un problème avec ma recherche en colonne.
Je tiens tout d'abord à te remercier h2so4 pour ton aide précieuse qui m'a permis de bien advancer dans mon projet !
Malheureusement, le code ne marche plus...
Voici mon problème :
Lorsque j'exécute le userForm et que je realise ma recherche, la fonction trouve uniquement la dernière valeur enregitrée et non les valeurs intermédiaires...
Des images sont jointes afin d'illustrer mon problème.
Ci-joint mon code :
Pour vous donner une petite explication : j'ai fait en sorte que les champs soient verrouillés et qu'ils ne s'affichent uniquement s'il y a concordance avec un numéro de référence (ici NCall).
Private Sub NCall_Change()
Dim cel As Variant
For Each cel In Sheets("Mouvements_Materiels").Range("A3:A" & Sheets("Mouvements_Materiels").Range("A65536").End(xlUp).Row) 'Définition chemin plage de donnée
If cel = NCall Then 'Cherche numéro call
With Sheets("Mouvements_Materiels")
CallDate.Visible = True
CallDate.Text = .Cells(cel.Row, "B") 'Permet de récupérer la donnée sur la même ligne que la cellule
CallDate.Enabled = False
Client.Visible = True
Client.Text = .Cells(cel.Row, "C")
Client.Enabled = False
Customer.Visible = True
Customer.Text = .Cells(cel.Row, "D")
Customer.Enabled = False
OutType.Visible = True
OutType.Text = .Cells(cel.Row, "E")
OutType.Enabled = False
Item.Visible = True
Item.Text = .Cells(cel.Row, "F")
Item.Enabled = False
Quantity.Visible = True
Quantity.Text = .Cells(cel.Row, "Z")
Quantity.Enabled = False
If Quantity > 1 Then 'Choix combobox ou textbox
NSerie2.Visible = True
Else
NSerie.Visible = True
NSerie.Text = .Cells(cel.Row, "G")
NSerie.Enabled = False
End If
OutDate.Visible = True
OutDate.Text = .Cells(cel.Row, "H")
OutDate.Enabled = False
Commentary.Visible = True
Commentary.Text = .Cells(cel.Row, "I")
CheckBoxYes.Visible = True
CheckBoxYes.Enabled = False
CheckBoxNo.Visible = True
CheckBoxNo.Enabled = False
If .Cells(cel.Row, "J") Then 'Coche / Décoche case
With Sheets("Mouvements_Materiels")
CheckBoxYes = True
CheckBoxNo = False
ReturnDate.Visible = True
ReturnDate.Text = .Cells(cel.Row, "O")
End With
Else
With Sheets("Mouvements_Materiels")
CheckBoxNo = True
CheckBoxYes = False
Label10.Visible = False
ReturnDate.Visible = False
End With
End If
End With
Label1.Visible = True
Label2.Visible = True
Label3.Visible = True
Label5.Visible = True
Label6.Visible = True
Label7.Visible = True
Label8.Visible = True
Label9.Visible = True
Label10.Visible = True
Label12.Visible = True
CommandSend.Visible = True
Else
Client.Visible = False
Customer.Visible = False
CallDate.Visible = False
Item.Visible = False
Quantity.Visible = False
NSerie.Visible = False
NSerie2.Visible = False
OutDate.Visible = False
OutType.Visible = False
CheckBoxYes.Visible = False
CheckBoxNo.Visible = False
ReturnDate.Visible = False
Commentary.Visible = False
Label1.Visible = False
Label2.Visible = False
Label3.Visible = False
Label5.Visible = False
Label6.Visible = False
Label7.Visible = False
Label8.Visible = False
Label9.Visible = False
Label10.Visible = False
Label11.Visible = False
Label12.Visible = False
CommandSend.Visible = False
'Exit For
End If
Next cel
End SubPar avance merci et bonne journée !
bonjour,
je ferais ceci
Private Sub NCall_Change()
Dim cel As Variant
For Each cel In Sheets("Mouvements_Materiels").Range("A3:A" & Sheets("Mouvements_Materiels").Range("A65536").End(xlUp).Row) 'Définition chemin plage de donnée
If cel = NCall Then 'Cherche numéro call
With Sheets("Mouvements_Materiels")
CallDate.Visible = True
CallDate.Text = .Cells(cel.Row, "B") 'Permet de récupérer la donnée sur la même ligne que la cellule
CallDate.Enabled = False
Client.Visible = True
Client.Text = .Cells(cel.Row, "C")
Client.Enabled = False
Customer.Visible = True
Customer.Text = .Cells(cel.Row, "D")
Customer.Enabled = False
OutType.Visible = True
OutType.Text = .Cells(cel.Row, "E")
OutType.Enabled = False
Item.Visible = True
Item.Text = .Cells(cel.Row, "F")
Item.Enabled = False
Quantity.Visible = True
Quantity.Text = .Cells(cel.Row, "Z")
Quantity.Enabled = False
If Quantity > 1 Then 'Choix combobox ou textbox
NSerie2.Visible = True
Else
NSerie.Visible = True
NSerie.Text = .Cells(cel.Row, "G")
NSerie.Enabled = False
End If
OutDate.Visible = True
OutDate.Text = .Cells(cel.Row, "H")
OutDate.Enabled = False
Commentary.Visible = True
Commentary.Text = .Cells(cel.Row, "I")
CheckBoxYes.Visible = True
CheckBoxYes.Enabled = False
CheckBoxNo.Visible = True
CheckBoxNo.Enabled = False
If .Cells(cel.Row, "J") Then 'Coche / Décoche case
With Sheets("Mouvements_Materiels")
CheckBoxYes = True
CheckBoxNo = False
ReturnDate.Visible = True
ReturnDate.Text = .Cells(cel.Row, "O")
End With
Else
With Sheets("Mouvements_Materiels")
CheckBoxNo = True
CheckBoxYes = False
Label10.Visible = False
ReturnDate.Visible = False
End With
End If
End With
Label1.Visible = True
Label2.Visible = True
Label3.Visible = True
Label5.Visible = True
Label6.Visible = True
Label7.Visible = True
Label8.Visible = True
Label9.Visible = True
Label10.Visible = True
Label12.Visible = True
CommandSend.Visible = True
'on a trouvé, on a affiché, c'est terminé
Exit sub
End If
Next cel
'on n'a pas trouvé après avoir parcouru toute la liste
Client.Visible = False
Customer.Visible = False
CallDate.Visible = False
Item.Visible = False
Quantity.Visible = False
NSerie.Visible = False
NSerie2.Visible = False
OutDate.Visible = False
OutType.Visible = False
CheckBoxYes.Visible = False
CheckBoxNo.Visible = False
ReturnDate.Visible = False
Commentary.Visible = False
Label1.Visible = False
Label2.Visible = False
Label3.Visible = False
Label5.Visible = False
Label6.Visible = False
Label7.Visible = False
Label8.Visible = False
Label9.Visible = False
Label10.Visible = False
Label11.Visible = False
Label12.Visible = False
CommandSend.Visible = False
End SubBonjour,
Ca marche à nouveau, merci !
Mais j'aimerai bien comprendre pourquoi. Est-ce qu'il y a une limite d'instructions gérables dans une boucle If ?
De même, que fait précisément le "Exit For", "Exit Sub", "Exit Quelquechose" ?
Je pense que ça force la sortie de la procédure et ainsi décharger le programme en plus de forcer sa réactialisation, c'est ça ?
Une excellente journée à toi et encore merci !
Zepn a écrit :Bonjour,
Ca marche à nouveau, merci !
Mais j'aimerai bien comprendre pourquoi. Est-ce qu'il y a une limite d'instructions gérables dans une boucle If ?
non,
imagine que tu fasses le travail manuellement, tu cherches une fiche dans ton bac à fiche (imaginons que les fiches ne soient pas triées). tu prends la première, tu compares, si c'est pas bon, tu passes à la suivante sinon tu as trouvé, tu notes les informations de la fiche (et tu t'arrêtes de chercher !-> exit for pour sortir de la boucle ou exit sub pour sortir de la procédure)
si tu as parcouru toutes tes fiches et que tu n'as pas trouvé, alors tu peux afficher ton formulaire non trouvé, mais pas pour chaque fiche dont le numéro ne correspond pas.
ton algorithme
1) on prend chaque fiche
2) si trouvé on affiche le contenu
3) si pas trouvé, on affiche pas trouvé
4) existe-t-il fiche suivante
si oui aller à 2
sinon terminé
algorithme
1)on prend première fiche
2)si trouvé, on affiche le contenu de la fiche -> terminé
3)existe-t-il une fiche suivante
si oui, fiche suivante, aller à 2
4) afficher fiche non trouvée
c'est ainsi que j'ai modifié ton programme.
Bonjour h2s04 !
Désolé, j'ai tardé à te répondre car je suis sur un autre problème (décidément, ça n'en finit jamais
Je ne compte plus le nombre de merci que j'ai dû t'adresser, mais je crains devoir encore t'en donner d'ici peu
Aujourd'hui, j'ai voulu joué les gros bras et faire une evolution de mon formulaire !
Cette fois, on va corser les choses en y incluant la fusion des cellules.
J'ai réussi à faire toute la partie Formulaire vers Feuille Excel, mais je bloque sur un Minuscule, Insignificant détail qui me dépasse
Comme tu pourras le voir sur les images, j'ai fait en sorte que si deux (voire plusieurs) cellules ont la même valeur (texte ici) alors elles fusionnes.
Cependant voilà, l'inverse ne marche pas des masses
Afin de t'éviter de jouer au jeu des 7 differences, je vais te les donner (ainsi que le code, naturellement
Capture1 : Correspond au premier N°Call et il n'y a que le N°Série test1 qui s'affiche.
Capture 2 : Correspond au deuxième; mais il manqué le client et la date du call. De même, il n'y a que le N° Série test21 qui s'affiche.
Là... je suis conscient que je m'attaque à du lourd (pour moi en tout cas ! J'ai qu'une petite semaine de VBA d'expérience
Ci-joint le code :
For Each C1 In Sheets("Mouvements_Materiels").Range("A3:A" & Sheets("Mouvements_Materiels").Range("A65536").End(xlUp).Row) 'Définition chemin plage de donnée
If C1 = NCall Then 'Cherche numéro call
With Sheets("Mouvements_Materiels")
CallDate.Visible = True
CallDate.Text = .Cells(C1.Row, "B") 'Permet de récupérer la donnée sur la même ligne que la cellule
CallDate.Enabled = False
Client.Visible = True
Client.Text = .Cells(C1.Row, "C")
Client.Enabled = False
Customer.Visible = True
Customer.Text = .Cells(C1.Row, "D")
Customer.Enabled = False
OutType.Visible = True
OutType.Text = .Cells(C1.Row, "E")
OutType.Enabled = False
Item.Visible = True
Item.Text = .Cells(C1.Row, "F")
Item.Enabled = False
Quantity.Visible = True
Quantity.Text = .Cells(C1.Row, "Z")
Quantity.Enabled = False
If .Cells(C1.Row, "Z") >= 2 Then 'Choix combobox ou textbox
NSerie.Visible = False
NSerie2.Visible = True
For Each C2 In Sheets("Mouvements_Materiels").Range("G3:G" & Sheets("Mouvements_Materiels").Range("G65536").End(xlUp).Row) 'Cherche le numéro de série
If C1 = .Cells(C2.Row, "A") Then 'Vérifie si le numéro de série est bien sur la même ligne que le NCall entré
NSerie2.AddItem .Cells(C2.Row, "G").Text 'Ajoute NSerie dans la combobox
End If
Next C2
'La suite reste inchangée, dis moi si tu veux quand même le voirJ'ai un peu honte d'abuser de toi et de tes connaissances...
Mille merci d'avance pour ton retour (positif et même negatif !) sur le problem
Bonne journée voire même bon week-end !
Bonjour,
très très mauvaise idée de travailler avec des cellules fusionnées si on veut automatiser les traitements, cela ne fait que complexifier le code ...
Entendu, je vais travailler sur des cellules cachées alors, comme ca je garde le côté incroyable sans la complexité