Recherche find

Bonjour à tous,

Je suis nouvelle inscrite sur ce forum qui m'a déjà été très utile dans le passé.
Je rencontre un soucis sur un bout de code avec une recherche find.

Actuellement, je recherche avec find une seule valeur fixe mais j'ai plusieurs lignes dans mon fichier avec à chaque fois des valeurs différentes à chercher et des retours multiples.

voici le code que j'ai essayé de modifier mais la recherche find me renvoie "Nothing":

 Sub test()

Dim plage_recherchee As Range, pointeur As Integer, n As Integer, Val_cherchee

Worksheets("Feuil2").Activate

'pour cherchée la valeur une ligne après l'autre
For n = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1

    pointeur = 0

    With Workbooks("Classeur1").Worksheets("Feuil1")
    derligc = .Range("A" & Rows.Count).End(xlUp).Row
    'valeur cherchée qui change en fonction de la ligne       
     Val_cherchee = Range("A" & n)
            
     With .Range("A1:A" & derligc)
                Set C = .Find(Val_cherchee, LookIn:=xlValues, LookAt:=xlWhole)
                   
                If Not C Is Nothing Then
                        firstaddress = C.Address
                              
                             Do
                                Range("B" & pointeur) = C.Offset(, 2)
                            
                                pointeur = pointeur + 1
                        
                                Set C = .FindNext(C)
                               
                                'ajouter une ligne pour chaque valeur trouvée
                                If Not C Is Nothing And C.Address <> firstaddress Then
                                    Rows(pointeur).Insert shift:=xlShiftDown
                                End If

                            Loop While Not C Is Nothing And C.Address <> firstaddress
                    End If
                End With
                
            End With
Next n

End Sub


Est ce que vous auriez une idée de comment je dois faire?

De plus je souhaiterais ne pas avoir à taper à chaque fois Workbooks("Classeur1").Worksheets("Feuil1") car le nom du classeur peut changer et comme j'ai 4 classeurs différents, ca fait pas mal de modifications.

Est-ce que ça serait possible de faire quelque chose comme

Set wb = Workbooks("Classeur1")
Set ws = Worksheets("Feuil2")

Merci d'avance!

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour
    pointeur = 0
    puis
    Range("B" & pointeur) = C.Offset(, 2)
    Au premier passage, il ne trouvera jamais la cellule B0, il faut initialiser le pointeur à 1.
    Pourquoi partir de la Feuille2, aller sur la feuille 1 si vous ne revenez jamais sur la feuille 2.
    Si tout se déroule sur le même classeur, inutile de préciser le nom du classeur,
    With Workbooks("Classeur1").Worksheets("Feuil1") à supprimer
    et remplacez With .Range("A1:A" & derligc) par With activesheet.Range("A1:A" & derligc).
    Range("B" & pointeur)= C.Offset(, 2).Value remplacer par Range("B" & pointeur).value= C.Offset(x, 2).Value (vous avez oublié le N° de ligne dans le décalage, remplacez le x par le N° de ligne)
    Voici le code corrigé (n'oubliez pas de remplacé la valeur x).
    Sub test()
        Dim plage_recherchee As Range, pointeur As Integer, n As Integer, Val_cherchee
        'pour cherchée la valeur une ligne après l'autre
        For n = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
            pointeur = 1
            derligc = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
            'valeur cherchée qui change en fonction de la ligne
             Val_cherchee = Range("A" & n)
             With ActiveSheet.Range("A1:A" & derligc)
                Set C = .Find(Val_cherchee, LookIn:=xlValues, LookAt:=xlWhole)
                If Not C Is Nothing Then
                    firstaddress = C.Address
                    Do
                        Range("B" & pointeur).Value = C.Offset(x, 2).Value
                        pointeur = pointeur + 1
                        Set C = .FindNext(C)
                        'ajouter une ligne pour chaque valeur trouvée
                        If C.Address <> firstaddress Then Rows(pointeur).Insert shift:=xlShiftDown
                    Loop While Not C Is Nothing And C.Address <> firstaddress
                End If
            End With
        Next n
    End Sub

    bonne journée
    cdlt
    1. Bonjour Frenchie83,

      Tout d'abord, merci d'avoir pris le temps de répondre à ma question.

      Après avoir posté ma question, j'ai continué à travailler dessus et j'ai obtenu le bout de code suivant, qui fonctionne:

      Dim plage_recherchee As Range, pointeur As Integer, l As Integer, Val_cherchee
      
      For l = Range("B" & Rows.Count).End(xlUp).Row To 9 Step -1
      
              pointeur = 0
              Val_cherchee = Range("B" & l)
                  With Workbooks("Classeur2").Worksheets("Feuil1")
                  derligc = .Range("A" & Rows.Count).End(xlUp).Row
                      With .Range("A1:A" & derligc)
                      Set C = .Find(Val_cherchee, LookIn:=xlValues, LookAt:=xlWhole)
                          If Not C Is Nothing Then
                              firstAddress = C.Address
                                  
                                  Do
                                      'recherche n° 
                                      Range("N" & l) = C.Offset(, 1)       
                                      pointeur = pointeur + 1
                                      l = l + 1
      
                                      Set C = .FindNext(C)
                                      
                                      If Not C Is Nothing And C.Address <> firstAddress Then
                                          Rows(l).Insert shift:=xlShiftDown
                                      End If
                                                                 
                                  Loop While Not C Is Nothing And C.Address <> firstAddress
                          
                          End If
                      End With
                  End With
                  l = l - pointeur
      Next l


      Pour répondre à une de vos questions, je travaille avec plusieurs classeurs excel.

      J'ai d'ailleurs un autre soucis à ce propos. Le nom de mes fichiers dans lesquels je vais chercher mes valeurs seront partiellement connus, de type "classeur1 S32" classeur1 étant connu et S32 variable. Avec le code précédent, je n'arrive pas à utiliser le nom de fichier variable avec With.

      Sub test2()
      
      Dim chemin As String
      Dim VariableFeuille As Workbook
      Dim plage_recherche As Range, point As Integer, Val_cherche
      
      chemin = ThisWorkbook.Path & "\"
      Workbooks.Open Filename:=chemin & Dir(chemin & "Classeur1 *.xls")
       
      Set VariableFeuille = Activeworkbooks.Name
              
              point = 0
              Val_cherche = Range("B2")
                  With Workbooks(VariableFeuille).Sheets("Feuil1")
                  derligc = .Range("A" & Rows.Count).End(xlUp).Row
      
                  ....
                  End with
      End sub
      
      


      Est ce que vous auriez une idée?

      Merci
      1. Bonjour
        Workbooks.Open Filename:=chemin & Dir(chemin & "Classeur1 *.xls")
        Si vous mettez "Classeur1 *.xls", Excel ouvre le premier classeur qui trouve, mais comment va -t-il faire pour les suivants? Vous devez créer une variable pour ouvrir chaque classeur et remplacer * par la variable, cette variable sera incrémentée à chaque passage.
        VarClass="Classeur1 S" & le N° de classeur & ".xls" 
        Workbooks.Open Filename:=chemin & Dir(chemin & VarClass)
                point = 0
                Val_cherche = Range("B2")
                    With ActiveWorkbook.Sheets("Feuil1")

        Avec ça, vous devriez pouvoir vous en sortir
        cdlt
        1. J'ai essayé malheureusement j'ai une erreur d'exécution 9 "L'indice n'appartient pas à la sélection", à la ligne With ActiveWorkbook.Sheets("Feuil1")
          1. et au-dessus, qu'est-ce qu'il y a?
        2. Bonjour,

          Au dessus de mon code j'ai: avec en gras la ligne où j'ai une erreur

          Sub test()
          
          Dim chemin As String
          Dim plage_recherche As Range, point As Integer, Val_cherche
          
          chemin = ThisWorkbook.Path & "\"
          
          Workbooks.Open Filename:=chemin & Dir(chemin & "Commande *.xls")
                
                  point = 0
                  Val_cherche = Range("B2")
                      With ActiveWorkbook.Sheets("Feuil1")
                      derligc = .Range("A" & Rows.Count).End(xlUp).Row
                          With .Range("A1:A" & derligc)
                          Set C = .Find(Val_cherche, LookIn:=xlValues, LookAt:=xlWhole)
                              If Not C Is Nothing Then
                                  firstAddress = C.Address
          
          
          1. Bonjour

            Workbooks.Open Filename:=chemin & Dir(chemin & "Commande *.xls")
            Comment s'appelle le fichier que vous voulez ouvrir?
            Telle que vous l'avez saisie, il cherche le fichier qui s'appelle
            "Commande *.xls", or, je ne pense pas que ayez pu enregistrer un fichier sous cette forme, il faut remplacer * par une valeur.

            la ligne appropriée devrait plutôt avoir la forme suivante:
            Workbooks.Open Filename:=chemin & Dir(chemin & "Commande xxx.xls")
            mettez le vrai nom du fichier et réessayez.
            A+
            1. C'est justement mon problème. Le nom du fichier n'est pas fixe, toutes les semaines il changera, uniquement le début du nom reste le même. Par exemple, "Commande S32" "Commande S33". Dans mon code pour "Commande *.xls" * correspond au texte que je ne connait pas, qui varie toutes les semaines.
          2. Alors, je vous propose via la macro, d'appeler une boîte de dialogue dans laquelle vous rentrerez le N° de la semaine devotre choix.
            remplacez la ligne "Workbooks.Open Filename:=chemin & Dir(chemin & "Commande *.xls")" par:
                Dim Sem As lng
                Semaine = "Sélectionnez un N° de semaine"
                Sem = InputBox(Semaine)
                Workbooks.Open Filename:=chemin & Dir(chemin & "Commande S" & Sem & ".xls")
            , essayez et dites-moi si ça marche
            1. J'ai essayé mais j'obtiens toujours la même erreur: "l'indice n'appartient pas à la sélection" sur la ligne With Workbooks("Commande S" & Sem).Sheets("Feuil1").

              Dim chemin As String
              Dim plage_recherche As Range, point As Integer, Val_cherche
              Dim Sem As Long
              
              chemin = ThisWorkbook.Path & "\"
              
              Semaine = "Sélectionner un n° de semaine"
              Sem = InputBox(Semaine)
              
              Workbooks.Open Filename:=chemin & Dir(chemin & "Commande S" & Sem & ".xls")
                      
                      point = 0
                      Val_cherche = ThisWorkbook.Sheets("Tableau").Range("B2")
                          With Workbooks("Commande S" & Sem).Sheets("Feuil1")
                          derligc = .Range("A" & Rows.Count).End(xlUp).Row
              1. Il y a 2 fois le chemin

                Workbooks.Open Filename:=chemin & "Commande S" & Sem & ".xls"
                1. Mon problème persiste avec le bloc With
                2. With Sheets("Feuil1")
                3. Super ça fonctionne!

                  Merci beaucoup!