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 Sub

Je 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 call

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) ?

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 textbox1

Aie, ç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 Sub

J'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 Sub

Bonjour !

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 Sub

Par avance merci et bonne journée !

capture1 capture2 capture3

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 Sub

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 ?

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 voir

J'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 !

capture1 capture2

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é

Rechercher des sujets similaires à "recherche valeur colonne recuperation donnee ligne"