Forum Clubic

Parcourir Ligne pour recherche Valeur ( VBA EXCEL )

Bonjour.

En entrée j’ai un tableau excel avec plusieurs Colonnes et plusieurs Lignes. Sur chaque ligne j’ai des cellules comportant du texte qui est souvent identique à d’autres cellules ( Gestion du personnel ). Ce que j’aurais souhaité, c’est que la macro parcourt chaque ligne de mon tableau et si elle tombe sur la valeur que je souhaite rechercher, elle passe à la ligne suivant tout en me copiant la ligne entière où a été trouvé la valeur correspondante vers une autre feuille.

Je vous remercie de l’aide que vous pourrez m’apporter :wink:
Edité le 17/05/2008 à 10:33

Tu affectes un objet range à la zone à parcourir
Pour la première recherche, tu utilises sur cet objet la méthode .find pour trouver la première occurence, .findnext pour les suivantes
exemple tiré de l’aide en ligne excel pour chercher la valeur “aaaa”:

With Worksheets(1).Range("a1:a500")
    Set c = .Find("aaaa", lookin:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            xxxxxxxxx
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With 

A la place des xxxx, tu mets tes lignes pour copier ta sélection dans le fichier de destination.
Pour avoir la ligne entière à partir de la cellule c, tu utilises c.EntireRow

Je te remercie, je vais tester ça sous peu et viendrait donner un retour :wink:

Je te conseille de le tester sous windows car sous peu tu risques d’avoir de gros soucis.:clap:

Le justicier du Net.

L’utilité de ton message ?

Le justicier du Coin.

J’ai effectivement tester le code ci dessus et la recherche se fait sans problème. Seul un petit problème persiste au niveau du résultat de ma copie. En effet sur une ligne je peux avoir plusieurs fois la valeur recherchée mais néanmoins une fois la première valeur trouvée je souhaiterai qu’il passe directement à la ligne du dessus. Ayant fouillé sur la méthode find, je pense qu’il doit exister une astuce. Je vous remercie pour l’aide apportée en tout cas :wink:

Tu veux passer à la ligne du dessus ou du dessous ?
Dans le second cas, il suffit que mémorise le numero de la ligne (c.row) et que tu ne fasses rien tant qu’il n’a pas changé

La ligne du dessous. Désolé.

Et ca ne marche pas, en mémorisant c.row ?

J’y avais pensé pendant un moment mais je m’y étais mal pris sans doute car cela ne donnait aucun résultat. Je réessaie demain dans la journée sur mon lieu de travail et revient donner plus de nouvelles demain soir. Merci beaucoup

Voilà , mon code marche correctement , je vous remercie :wink:

Me revoilà car j’ai à nouveau un problème sur ma méthode de recherche.

Je m’explique :

Je remplis une Combobox à partir d’une feuille. Jusque là pas de problèmes. Une cellule est de la forme “CED + CT” . Quand j’effectue ma recherche il faudrait qu’il me recherche toutes les cellules correspondantes à CED et à CT. Là mon code fonctionne seulement pour une valeur soit CED où alors CT. Je vous remercie de l’aide que vous pourrez m’apporter.

Mon code de recherche est celui ci.

Dim cpt As Integer
Dim Ligne As Integer
cpt = 8

'On définit la plage pour commencer à rechercher uniquement à partir de la colonne correspondant aux années
'Pour ne pas trouver la valeur cherchée dans un nom d’employé
'Exemple : Andre contient DR

'On définit les plages
Call Definit_Plage

ThisWorkbook.Worksheets(“Tableau”).Select
With ThisWorkbook.Worksheets(“Tableau”).Range(Cells(8, Dbt), Cells((ActiveSheet.UsedRange.Rows.Count), F - 2))
Set c = .Find(Choix_Recherche.ComboBox1.Value, LookIn:=xlValues, MatchCase:=False)
'Si la fonction find ne trouve aucune valeur correspondante alors on met le boolean à false
'Pour la suite des fonctions appellées juste après. On affiche un message comme quoi la synthèse
'N’a pas pu etre effectuée et on va directement à la fin de la procédure par le biais de la fonction Goto
If c Is Nothing Then
Etat = False
MsgBox “error”
Choix_Recherche.ComboBox1.Value = “”
GoTo Fini
End If
'Si une valeur correspondante est trouvée alors on effectue la suite de la fonction
If Not c Is Nothing Then
firstAddress = c.Address
'On appelle la méthode gestion feuille pour mettre en forme
'La feuille qui va recevoir les données par la copie
Call Gestion_Feuille
Do
'Si le numéro de la ligne n’est pas égale au numéro
'de la ligne de la cellule trouvée alors on copie la ligne
'Sinon on recherche l’occurence suivante et on effectue
'De nouveau le test
If Not Ligne = c.Row Then
'Permet de copier la ligne vers la feuille portant le nom
'De la valeur recherchée
c.EntireRow.Copy ThisWorkbook.Worksheets(Choix_Recherche.ComboBox1.Value).Cells(cpt, 1)
'On stocke le numéro de la ligne de la variable c
Ligne = c.Row
'On incrémente le compteur pour copier les lignes
'Les une après les autres
cpt = cpt + 1
End If
'On recherche l’occurence suivant avec la méthode FindNext
'Qui évite de réécrire tous les arguments de la fonction Find
Set c = .FindNext©
'On reste dans la boucle tant que c n’est pas égal a nul et que
'Son adresse est différent de la première adresse
Loop While Not c Is Nothing And c.Address <> firstAddress
'On appelle la fonction synthèse qui permet de faire le total de la valeur
'Cherchée par trimestre ou par le total des 4 trimestre

        'On parcourt une nouvelle fois le tableau pour tester si la valeur
        'Correspond dans le potentiel pour également la copier
        'Dans la feuille de synthèse
        For i = 8 To ThisWorkbook.Worksheets("Tableau").UsedRange.Rows.Count
            If ThisWorkbook.Worksheets("Tableau").Cells(i, 4).Value = Choix_Recherche.ComboBox1.Value Then
                        ThisWorkbook.Worksheets("Tableau").Cells(i, 4).EntireRow.Copy ThisWorkbook.Worksheets(Choix_Recherche.ComboBox1.Value).Cells(ThisWorkbook.Worksheets(Choix_Recherche.ComboBox1.Value).UsedRange.Rows.Count + 1, 1)
            End If
        Next i

Evite les goto dans tes fonctions.
D’autant plus qu’ici c’est complètement inutile : puisque le but est de sortir, mets directement un exit sub
Où fais-tu le choix de tes valeurs CED et CT ?
Que contient exactement ta combox ?
ce n’est pas très clair

Ma combobox contient les valeurs définies dans une source car j’ai besoin de faire des sommes pour certaines combinaisons de cellules. Par exemple ma combobox contient “CF” “CE + CT”. En fin de compte par exemple j’ai besoin qu’il recherche toute les celluels corespondantes à CE et à CT bien que dans la combobox il n’y est qu’une seule ligne “CE + CT”.

C’est la même chose
A moins que tu n’aies voulu dire à CE OU à CT ?
Dans ce cas tu n’y arriveras pas directement.
Il faut que parses ta valeur d’entrée sur le +, et que tu fasses la recherche sur le premier critère, puis sur le second.
Il y a peut-être aussi une solution du côté de REGEX.FIND

Tout ca me paraît bien compliqué.
Personnellement, toujours après avoir séparé mes deux critères, j’appliquerais tout simplement un filtre automatique au tableau (possible de lui entrer deux critères traités en OU), et je copierais le réultat obtenu dans la feuille résultante.
Tu peux le faire en macro automatique et t’en inspirer pour écrire ensuite du code propre.