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.
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 !
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 !
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
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 !
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 !
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
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
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)
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
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 !
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.
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 !
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 !
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
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