Recherche find

Fermé
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013 - Modifié par risama le 23/08/2013 à 15:10
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013 - 2 sept. 2013 à 17:40
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

Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
24 août 2013 à 10:49
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
0
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
30 août 2013 à 16:39
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
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
30 août 2013 à 17:48
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
0
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
30 août 2013 à 18:32
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")
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
30 août 2013 à 18:44
et au-dessus, qu'est-ce qu'il y a?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
2 sept. 2013 à 08:25
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

0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
2 sept. 2013 à 09:12
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+
0
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
Modifié par risama le 2/09/2013 à 11:13
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.
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
2 sept. 2013 à 11:58
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
0
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
2 sept. 2013 à 12:55
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
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
2 sept. 2013 à 13:04
Il y a 2 fois le chemin

Workbooks.Open Filename:=chemin & "Commande S" & Sem & ".xls"
0
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
2 sept. 2013 à 13:13
Mon problème persiste avec le bloc With
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 338
2 sept. 2013 à 13:18
With Sheets("Feuil1")
0
risama Messages postés 8 Date d'inscription mardi 6 août 2013 Statut Membre Dernière intervention 2 septembre 2013
2 sept. 2013 à 17:40
Super ça fonctionne!

Merci beaucoup!
0