Fonction find renvoie adresse [Résolu]

Signaler
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
-
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
-
Bonjour, je cherche à réaliser une macro qui recherche les valeurs d'un fichier dans un autre.

Suite à de nombreuses recherches sur le net, je me tourne vers vous pour comprendre où se trouve mon erreur.
J'ai opté pour la fonction find.

Voici mon code:

Sub Recherche()
Dim A As Integer 
Dim Z As Integer 
Dim B As Integer 
Dim Y As Integer
Dim D As Range 

Workbooks("fichieroùondoittrouvervaleurs.xls").Worksheets("sheet1").Activate 
Z = Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier test

Workbooks("fichieràpartirduqueloncherche.xls").Worksheets("sheet1").Activate  
Y = Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier source

A = 4
D=0

For B = 4 To Y
Workbooks("fichieràpartirduqueloncherche.xls").Activate
Set D = Cells(B, 7)
Workbooks("fichieroùondoittrouvervaleurs.xls").Activate
        With Worksheets("sheet1").Range(Cells(3, 4), Cells(Z, 4))
       
        
           Set C = .Find(D.Value, LookIn:=xlValues, After:=ActiveCell, LookAt:=xlWhole, MatchCase:=True, SearchFormat:=False)
            If Not c Is Nothing Then
              CelluleAddresse = c.Address 
            End If
        End With
Next B
    
End Sub


Je souhaite que ma macro relève dans fichier où on cherche toutes les adresses de ces cellules. Pour le moment, elle me dit que pour la plage dans la fichier où il faut trouver, il n'y a pas la valeur de la cellule du fichier source. Sauf que c'est faux, elle s'y trouve, et plusieurs fois même. De même, si vous avez une toute autre méthode pour vous y prendre, je suis open ^^.

Merci de me faire savoir s'il vous faut plus d'infos.

Merci d'avance.

S'il vous faut plus d'information.

19 réponses

Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Oups, code précédent à oublier car je n'ai pas pris en compte ton dernier message, voici donc le bon :
Sub Recherche()
    Set WsC = Workbooks("fichieràpartirduqueloncherche.xls").Sheets(1)
    Set WsT = Workbooks("fichieroùondoittrouvervaleurs.xls").Sheets(1)
          Z = WsT.[B3].End(xlDown).Row
          Y = WsC.[B3].End(xlDown).Row

    For B = 4 To Y
        Set Cel = WsT.Range(WsT.[D3], WsT.Cells(Z, 4)).Find(WsC.Cells(B, 7))

        If Not Cel Is Nothing Then
            If Cel.Offset(, 1) "TOTO" Then Cel.EntireRow.Interior.ColorIndex 6
        End If
    Next
End Sub

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Je ne suis pas sûr de bien saisir, voudrais-tu dire que pour une cellule WsC il y en ait plusieurs dans WsT ?

Dans ce cas il faudrait faire une boucle avec un FindNext comme dans l'exemple de l'aide en ligne de Find ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Edit: j'ai trouvé mon erreur, voici mon code final pour ceux qui auraient le même souci que moi.

Sub CalculDépenses()

Dim Z As Integer ' le nombre de lignes du classeur test: 531100
Dim B As Integer ' Variable des lignes du classeur référence 6......
Dim Y As Integer ' nb ligne dans le classeur référence


Set reference1 = Workbooks("fichierd'oùonpart.xls").Worksheets("sheet1")
Set test = Workbooks("fichieroùoncherche.xls").Worksheets("sheet1")

Z = test.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé
Y = reference1.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé
    
       
    For B = 4 To Y
        Set cel = test.Range(test.[D3], test.Cells(Z, 4)).Find(reference1.Cells(B, 7))

        If Not cel Is Nothing Then
           firstAddress = cel.Address

            If cel.Offset(, 1) <> "toto" Then
            cel.EntireRow.Interior.ColorIndex = 35
            Else
            End If
        Do
            Set cel = test.Range(test.[D3], test.Cells(Z, 4)).FindNext(cel)
        
            If cel.Offset(, 1) <> "toto" Then
                 cel.EntireRow.Interior.ColorIndex = 35
            Else
            End If
            
        Loop While Not cel Is Nothing And cel.Address <> firstAddress

        End If
     Next B
    
End Sub
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Pas mal mais tu peux réduire comme ceci au niveau de la boucle :
Sub CalculDépenses()
    Set reference1 = Workbooks("fichierd'oùonpart.xls").Worksheets("sheet1")
          Set test = Workbooks("fichieroùoncherche.xls").Worksheets("sheet1")

    Z = test.Range("B3").End(xlDown).Row
    Y = reference1.Range("B3").End(xlDown).Row
       
    With test.Range(test.[D3], test.Cells(Z, 4))
        For B = 4 To Y
            Set cel = .Find(reference1.Cells(B, 7))

            If Not cel Is Nothing Then
            firstAddress = cel.Address
        
            Do
                If cel.Offset(, 1) <> "toto" Then cel.EntireRow.Interior.ColorIndex = 35
                Set cel = .FindNext(cel)
            Loop Until cel.Address = firstAddress
            End If
        Next B
     End With
End Sub

C'est rare mais parfois il peut y avoir des coquilles dans l'aide en ligne,
en l'occurence dans le test de sortie de la boucle Not cel Is Nothing ne sert à rien
car on se trouve déjà dans ce cas là ...

En tout cas félicitations pour d'être plongée dedans !

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Bonjour.     Pour commencer ta ligne D=0 provoque une erreur car plus haut D est défini comme range !

Donc ligne à mettre en commentaire et ensuite dis-nous s'il y a une autre erreur et où
voir un autre souci ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
230
Bonjour,
1) reviens s'il te plait après avoir au moins abandonné ces vilains Activate et cie.
Exemple (à imiter pour tout le treste)
Workbooks("fichieroùondoittrouvervaleurs.xls").Worksheets("sheet1").Activate 
Z = Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier test

s'écrit :
Z = workbooks("fichieroùondoittrouvervaleurs.xls").Worksheets("sheet1").Range("B3").End(xlDown).Row

2) comment peux-tu déclarer D as Range et écrire D = 0 ?
3) combien vaut ton Z (en pas à pas ?)
4) tu n'as pas déclaré C (as range)
et je ne suis pas, à ce stade, allé plus loin .
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Question :   t'en fais quoi de CelluleAddresse ?

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

voici mon code corrigé comme demandé (normalement c'est bon) mais ça ne marche toujours pas.
Sub Recherche()
Dim A As Integer 
Dim Z As Integer 
Dim B As Integer 
Dim Y As Integer
Dim D As String 

Z = workbooks("fichieroùondoittrouvervaleurs.xls").Worksheets("sheet1").Range("B3").End(xlDown).Row on calcule le nombre de ligne dans le fichier test

Y =Workbooks("fichieràpartirduqueloncherche.xls").Worksheets("sheet1").Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier source

A = 4
D=0

For B = 4 To Y
Workbooks("fichieràpartirduqueloncherche.xls").Activate
Set D = Cells(B, 7).value
Workbooks("fichieroùondoittrouvervaleurs.xls").Activate
        With Worksheets("sheet1").Range(Cells(3, 4), Cells(Z, 4))
       
        
           Set C = .Find(D.Value, LookIn:=xlValues, After:=ActiveCell, LookAt:=xlWhole, MatchCase:=True, SearchFormat:=False)
            If Not c Is Nothing Then
              CelluleAddresse = c.Address 
            End If
        End With
Next B
    
End Sub


Pour répondre: l'adresse de la cellule, je compte testé si pour la même ligne mais la colonne suivante la valeur de la cellule est égale à "TOTO". alors si cells.value="TOTO" surligne toute la ligne dans fichieroùondoittrouvervaleurs

Dans l'absolu c'est ça que je souhaite. Mais si j'arrive déjà à faire chercher et trouver les valeurs pour la première étape, je serai contente (car le reste en découlera)

Merci d'avance.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
230
je continue a voir des Activate ===> je te laisse donc.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Malgré tout il y a encore beaucoup trop d'erreurs dans ton code corrigé !

1 : Dans la ligne Z = , il manque l'apostrophe de commentaire !
    As-tu réellement exécuté ton code ?   Le mode Pas à pas détaillé du menu Débogage te serait utile !

2 : Worksheets("sheet1") est une erreur dans les versions françaises d'Excel car par défaut c'est Feuil1 !
    Ici encore le mode Pas à pas détaillé ...

2 : Pas bloquante mais pas logique : variable D définie en String puis dans le code on a une ligne D=0
    puis une autre set D = comme si c'était un objet !
    Mieux vaut alors ne pas déclarer de variable pour la laisser en type Variant par défaut ...

3 : bien lire l'aide en ligne de la méthode Find telle qu'elle s'applique à l'objet Range
    car rien qu'avec le paramètre After=:Activecell cela ne peut fonctionner
    si la cellule active n'est pas en début de la plage de recherche ...
    Donc genre de paramètre à supprimer.   Par défaut il n'y a besoin que du paramètre What,
    on affine si besoin avec d'autres paramètres dans un second temps ...

4 : J'ai un bon doute sur la cohérence de tes colonnes; je m'explique :
    - les variables Y & Z sont alimentées par la colonne 2;
    - les valeurs cherchées sont dans la colonne 7;
    - la plage de recherce se situe dans la colonne 4;
      est-ce logique ?

Saches qu'évidemment j'ai un code qui fonctionne chez moi mais dans l'attente de plus amples informations ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

J'ai utilisé le débogage, c'est bien pour ça que je sais où mon code ne marche pas...

Je tiens à préciser, que ma variable D qui est comme vous le dites tous string alors que je l'initialise en D=0 Prend très bien la valeur de la case à chercher.

Il est normal que la valeur se trouve dans la colonne 7 sur une feuille et dans la colonne 4 sur une autre: ce ne sont pas les mêmes classeurs, des fichiers complètement différents puisqu'un classeur représente un compte de charge et l'autre classeur un compte d'actif.

Il est normal que Z et Y soient définis sur la colonnes 2 de chacun des classeurs: Dans les autres colonnes, il peut y avoir des cellules vides; Là ce n'est pas le cas. Et ça me permet d'avoir Z et Y qui me donnent TOUTES les lignes de mes fichiers (sinon ça me paraît compliqué s'il s'arrête à la première cellule vide quand même....)


J'ai exécuté mon code pas à pas figurez vous. Et c'est bien le C qui ne trouve pas la valeur dans le fichier où on doit trouver.
J'aimerai donc que l'on m'aide sur ce point.

Sub CalculDépenses()

Dim A As Integer 'variable des lignes du classeur test: 531100, plus précisément ATERME: suivi_..../sheet Caisse
Dim Z As Integer ' le nombre de lignes du classeur test: 531100
Dim B As Integer ' Variable des lignes du classeur référence 6......
Dim Y As Integer ' nb ligne dans le classeur référence
Dim D As String  'variable pour le code écriture dans la référence



Z = Workbooks("suivi_bmx_janvier_2012.xls").Worksheets("Caisse").Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé

Y = Workbooks("626100 BMX janvier.xls").Worksheets("sheet1").Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé
    

A = 4
For B = 4 To Y
D = Cells(B, 7).Value
       
        With Workbooks("suivi_bmx_janvier_2012.xls").Worksheets("Caisse").Range("D:D")
        
            Set C = Cells.Find(what:=D)
            If Not C Is Nothing Then
                CelluleAddresse = C.Address ' quand on test on a l'adresse de la feuille référence alors qu'on veut CELLES de suivi (il y en a plusieurs)
            End If
        End With
Next B
    
End Sub


Ca c'est le bon code, le précédent mis n'était pas le bon.

Merci.
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

pour précision comme souhaité plus haute:

Mon Z est la dernière ligne remplie dans le fichier où on doit trouver: z =2776
Et Y nombre ligne dans le fichier à partir duquel on a l'info: Y=41
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Dans ton dernier code ton find ne peut marcher car le point manque devant Cells ... (sinon à quoi bon le With !)

Voici le code fonctionnant bien sur ma version 2003 d'après ton précédent code :
Sub Recherche()
    Set WsC = Workbooks("fichieràpartirduqueloncherche.xls").Sheets(1)
    Set WsT = Workbooks("fichieroùondoittrouvervaleurs.xls").Sheets(1)
    Set ZrT = WsT.[B3].End(xlDown)
          Y = WsC.[B3].End(xlDown).Row

    For B = 4 To Y
        Set Cel = WsT.Range(WsT.[D3], ZrT).Find(WsC.Cells(B, 7))

        If Not Cel Is Nothing Then
            If Cel.Offset(, 1) "TOTO" Then Cel.EntireRow.Interior.ColorIndex 6
        End If
    Next
End Sub

Tu ne devrais pas avoir grand chose à modifier pour l'adapter ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Dans ton dernier code, en mode Pas à pas tu aurais dû te rendre compte que ta variable D n'est pas bien renseignée
car tu as bien enlevé les .Activate des Workbooks (comme conseillé par ucfoutu)
mais pas précisé alors le chemin complet dans l'affectation de cette variable, il prend la feuille active ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Merci, c'est niquel.
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Malheureusement, cette macro que tu as donné MarcPL marche très bien. Cependant, elle ne met pas en couleur toutes les occurences du fichier WsT.

Et c'est bien ça mon problème majeur.

As tu une idée de comment faire?

Je tente de me lancer sur un Do, mais forcément je n'y arrive pas pour le moment.

Merci de l'aide.
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

C'est exactement ça. Je teste le findnext et reviens vers vous. Si j'y arrive...
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Voici mon nouveau code, qui bien évidemment ne marche pas...
Cette macro est censée surligné dans mon fichier test les lignes où ya pas Toto dans la colonne d'à côté.
Le renvoi multiple ne marche pas....


Sub recherche()

Dim Z As Integer ' le nombre de lignes du classeur test
Dim B As Integer ' Variable des lignes du classeur référence
Dim Y As Integer ' nb ligne dans le classeur référence


Set reference1 = Workbooks("fichieràpartirduqueloncherche.xls").Worksheets("sheet1")
Set test = Workbooks("fichieroùondoittrouver.xls").Worksheets("Caisse")

Z = test.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé
Y = reference1.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé


For B = 4 To Y
Set Cel = test.Range(test.[D3], test.Cells(Z, 4)).Find(reference1.Cells(B, 7))

If Not Cel Is Nothing Then
firstAddress = Cel.Address

If Cel.Offset(, 1) <> "ECART FOND DE CAISSE" Then
Cel.EntireRow.Interior.ColorIndex = 35
Else
End If

Do
Set Cel = .FindNext(Cel)
If Cel.Offset(, 1) = "Toto" Then
Else
Cel.EntireRow.Interior.ColorIndex = 35
End If

Loop While Not Cel Is Nothing And Cel.Address <> firstAddress

End If
Next B

End Sub


Message d'erreur: il plante sur le findnext
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Excusez moi j'ai zappé les balises de code.

Voici mon nouveau code, qui bien évidemment ne marche pas...
Cette macro est censée surligné dans mon fichier test les lignes où ya pas Toto dans la colonne d'à côté.
Le renvoi multiple ne marche pas....


Sub recherche()

Dim Z As Integer ' le nombre de lignes du classeur test
Dim B As Integer ' Variable des lignes du classeur référence
Dim Y As Integer ' nb ligne dans le classeur référence


Set reference1 = Workbooks("fichieràpartirduqueloncherche.xls").Worksheets("sheet1")
Set test = Workbooks("fichieroùondoittrouver.xls").Worksheets("Caisse")

Z = test.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé
Y = reference1.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier testé


For B = 4 To Y
Set Cel = test.Range(test.[D3], test.Cells(Z, 4)).Find(reference1.Cells(B, 7))

If Not Cel Is Nothing Then
firstAddress = Cel.Address

If Cel.Offset(, 1) <> "ECART FOND DE CAISSE" Then
Cel.EntireRow.Interior.ColorIndex = 35
Else
End If

Do
Set Cel = .FindNext(Cel)
If Cel.Offset(, 1) = "Toto" Then
Else
Cel.EntireRow.Interior.ColorIndex = 35
End If

Loop While Not Cel Is Nothing And Cel.Address <> firstAddress

End If
Next B

End Sub



Message d'erreur: il plante sur le findnext