Décalage surlignage [Résolu]

Signaler
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
-
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour, suite à un nouveau problème haut en couleur, je reviens vers vous.

Je cherche à surligner dans le fichier referenceX les lignes qui sont pareilles que dans Nom1. Pour la ligne B colonne 1 à 9 surlignes.

Cependant voici les trois solutions que j'ai trouvées, et qui bien évidemment ne marchent pas:
- La solution entirerow qui surligne l'ensemble de la ligne, ce que je ne souhaite pas.

- la solution (commentaire dans macro); cel.Range(Cells(B, 1), Cells(B, 9)).Interior.ColorIndex = 25
avec cette ligne, j'ai bien le surlignage mais de la colonne 3 à 11, il y a donc un décalage de deux colonnes.

- Ma dernière solution: 'cel.offset(,-2).Range(Cells(B, 1), Cells(B,9)).Interior.ColorIndex = 26
avec cette ligne, j'ai bien les colonnes 1 à 9 de surligner. Cependant, les lignes ne correspondent plus (décalage de 2)

Voici mon problème illustrer:


        Set referenceX = Workbooks(NomX).Worksheets("sheet1")
            Y = referenceX.Range("B3").End(xlDown).Row ' on calcule le nombre de ligne dans le fichier référence
    
       
            For B = 4 To Y
                 Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).Find(referenceX.Cells(B, 7))

                     If Not cel Is Nothing Then
                      firstAddress = cel.Address
                        Do
                            Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).FindNext(cel)
        
                            If cel.Offset(, 1) = referenceX.Cells(B, 8).Value Then
                                'cel.Range(Cells(B, 1), Cells(B, 9)).Interior.ColorIndex = 25
                               cel.EntireRow.Interior.ColorIndex = 26
                               'cel.offset(,-2).Range(Cells(B, 1), Cells(B, 9)).Interior.ColorIndex = 26
                            Else
                            End If
            
                        Loop While Not cel Is Nothing And cel.Address <> firstAddress

                    End If
            Next B


J'espère avoir été claire dans mes explications, merci de me demander plus d'infos si besoin.

Je vous remercie de votre aide.

21 réponses

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

Pour info, ton code MarcPL ne marchait pas.

J'ai finalement trouvé, la solution.

            For B = 4 To Y
                 Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).Find(referencex.Cells(B, 7))
 
                     If Not cel Is Nothing Then
                      firstAddress = cel.Address
                        Do
                            Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).FindNext(cel)
                            If cel.Offset(, 1).Value = referencex.Cells(B, 8).Value Then
                               Range(Cells(cel.Row, 1), Cells(cel.Row, 7)).Interior.ColorIndex = 41 4'VOICI LA LIGNE QUI MARCHE
                            Else
                            End If
                        Loop While Not cel Is Nothing And cel.Address <> firstAddress
 
                    End If
            Next B


problème résolu.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Bonjour,
Je préfère te répondre ainsi et te laisser appliquer, hein.
cel est donc l'adresse de la cellule correspondant au critère de recherche.
cel.row et cel.column sont donc ses numéros de rang et de colonne.
un range se définit par une cellule de départ cells(x0,y0) et une cellule de fin cells(x1,y1)
Interior.color est à appliquer au range ainsi défini.
Voilà.
________________________
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
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Attention, hein :
un range se définit par une cellule de départ cells(x0,y0) et une cellule de fin cells(x1,y1)
=== >>>
Cells(x0,y0) et cells(x1,y1) concernent la feuille active et ne sont pas :
cel.cells(x0,0) et cel.cells(x1,y1)


________________________
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
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Comme tu l'as bien dis, Cel indique les cellules qui correspondent aux critères. Et c'est bien ça que je souhaite.

Les cellules qui correspondent au critère se trouvent dans cel. Je souhaite que dans cette adresse, il surligne de la colonne 1 à 9 et c'est tout.

J'ai bien compris ce que tu as dis (enfin je pense) mais ça ne correspond pas au problème.Puisque si j'applique ce que j'ai compris que tu as dis c'est bien cette ligne:


cel.Range(Cells(B, 1), Cells(B, 9)).Interior.ColorIndex = 25


Et ça met bien en couleur ce que j'ai mis dans mon post plus haut.

Sinon, autre test, j'ai cette ligne à la place des autres que j'avais testées:

Range(Cells(B, 1), Cells(B, 9)).Interior.ColorIndex = 26


Sauf que j'avais déjà fait, et ça me surligne les mêmes numéros de lignes pas là où se trouve les mêmes contenus de cellules.

Cette ligne donne pareil (j'ai tenté au cas où c'était le classeur qui n'était pas reconnu mais bon, il surlignait déjà dans le bon, pas les bons trucs):

Workbooks(Nom1).Worksheets("Caisse").Range(Cells(B, 1), Cells(B, 9)).Interior.ColorIndex = 27


Je sais que c'est un problème avec la définition du cel. Mais pour le coup, je sèche.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Ecoute,
Je crois que tu te compliques beaucoup la vie et ne te concentres pas suffisamment.
Je vais donc te le faire. On revient à ton tout premier message )===>>
Qu'est Test, très précisément ? (on ne le voit pas). On voit bien que c'est dans Test, que tu cherches, mais on ne sait pas trop ce que c'est. Est-ce une Feuille, un Range ?
- En peu de mots tu veux chercher dans quelle plage (exactement) de quelle feuille de quel classeur ?
- confirme-moi que ce que tu veux y chercher est bien la valeur du contenu de la colonne 7 de Workbooks(NomX).Worksheets("sheet1"), pour chaque ligne comprise entre 4 et Y
- je vois que tu utilises un Find "récursif", c'est à dire que tu cherches non pas uniquement si cette valeur est présente dans la plage dans laquelle tu cherches, mais que tu cherches également toutes les occuyrences de cette correspondance. Pourquoi ? Car je ne comprends alors pas, puisque une seule ligne à surligner au bout du compte.
En d'autres termes : sois extrêmement (et uniquement techniquement) très précis sur les tenants et aboutissants (uniquement techniquement).


________________________
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
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

test=worbooks("toto").worksheets("tutu")

Je vais tenter d'être clair:

Je cherche les valeurs d'un classeur "tata" colonne 7 ligne de 4 à Z dans le classeur "toto" colonne 3 ligne 4 à Y.

Jusque là ça va.

La valeur du classeur "tata" colonne 7; peut-être plusieurs fois dans la colonne 3 de "toto".

JE cherche alors à savoir si pour la colonne d'après dans "tata" c'est la même chose pour la colonne d'après dans "toto".

Si c'est le cas, alors on surligne la ligne colonne 1 à 9.

Est ce que ça te convient?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Je ne vois alors pas ce que vient faire ta récursivité (ton loop) dans ton code !
Il te faut donc :
1) définir la dernière ligne remplie de la colonne 3 de ton classeur toto
elle est
derligtoto = workbooks("toto").sheets(""blablatoto").range("C" & rows.count).end(xlup).row

2) définir de la même manière la dernière ligne remplie de la colonne 7 dans ton classeur tata
derligtata = workbooks("ara").sheets(""blablatata").range("G" & rows.count).end(xlup).row


Boucler (boucle sur i) de 3 à derligtoto sur ton classeur toto
Pour chaque tour : lire workbooks("toto").sheets("blablatoto").Range("C" & i).value === appelons-là achercher
chercher achercher dans Workbooks("tata").sheets("blablatata).Range("G4:G" & derligtata)
pas de loop ici ! Si trouvé (si not nothing) suffit ! soit cel si trouvé.
et si trouvé :
1) lire suivantetata = cel.offset(0,1).value
2) lire suivantetoto = workbooks("toto").sheets("blablatoto").Range("D" & i).value
3) dire :
si suivantetata suivantetoto alorsW>>
 workbooks("toto").sheets("blablatoto").Range("A" & i & ":" & "I" & i).Interiror.colorindex = .....

Voilà !
Ca, c'est la méthode classique. Passe cette étape avec succès et reviens. Si tu fais cela bien, je te montrerai alors une autre méthode, bien plus rapide et efficace et t'en montrerai le code en le commentant, cette fois.
Mais je tiens à ce que tu sdaches d'abord le faire en méthode "bourrin".
____________________
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
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

C'est tellement bourrin que je comprends rien. J'arrive même pas à distinguer les commentaires du code là.

JE comprends pas à partir de boucle i? C'est qui i?

Un petit Dim .. as s'impose je pense... En tout cas ça m'aide moi... Là je bug sur tout le reste.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
i c'est quoi ? C'est ton
For B = 4 To Y
que j'appelle for i = 4 to derligtoto

Et tout ce que j'ai écrit est simple, pour peu que tu commences à analyser un chouiya et que tu te concentres, plutôt qu'autre chose (c'est cela, le développement) !
J'attends cet effort.
________________________
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
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Voilà ce que j'ai compris de ton post:
En plus ça plante au Set SuivReferenceX .
Autant dire que je dois rien avoir compris je suppose.

            For I = 4 To Y
                 Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).Find(referencex.Cells(I, 7))

                     If Not cel Is Nothing Then
                      firstAddress = cel.Address
                        Do
                            Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).FindNext(cel)
                            Set SuivReferenceX = cel.Offset(, 1).Value
                            Set SuivTest = Test.Range("D" & I).Value
                            
                            If SuivReferenceX = SuivTest Then
                               
                               cel.EntireRow.Interior.ColorIndex = 46
                               
                            Else
                            End If
            
                        Loop While Not cel Is Nothing And cel.Address <> firstAddress

                    End If
            Next I
Messages postés
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

JE précise que pour avoir le nombre de lignes dans les deux fichiers, je n'ai pas testé sur les colonnes que tu as mis, car les cellules peuvent être vides alors que yen a une remplie après.
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Bonjour !   Set sert à pointer une variable sur un objet, or .value n'en est pas un ...

Comme deux valeurs sont comparées, pourquoi ne pas les tester directement ?
                        Do
                            Set cel = Test.Range(Test.[C3], Test.Cells(Z, 3)).FindNext(cel)
                            
                            If cel.Offset(, 1).Value = Test.Range("D" & I).Value Then
                                cel.EntireRow.Interior.ColorIndex = 46
                            End If
                        Loop While cel.Address <> firstAddress

___________________________________________________________________________________________________________________
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
Au fait ton décalage proviendrait peut-être du fait que tu déclenches le FindNext trop tôt dans ta boucle,
regardes dans ton post précédent pour le Find dans lequel je t'avais aidé ...

___________________________________________________________________________________________________________________
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

Pour te répondre, j'ai volontairement mis le findnext avant le if (contrairement à ce que tu as mis dnas l'autre post) car ça ne marchait tout simplement pas, ça fait planter excel.

Et il est plus logique de définir le cel avec offset avant de le tester, plutôt que de le tester avant d'avoir défini.

Je reste donc dans un flou total.

J'ai l'impression que je vais être contrainte de passer par mon imbrication de For plutôt que de passer par find et findnext...

C'est dommage cette macro ma donnait exactement ce que je voulais, c'est juste le surlignage je voulais de la colonne 1 à 9 et pas 1 à .... mais bon...

Puisque c'est comme ça...

Si quelqu'un a une réponse qui adapte ma macro et qui ne me fait pas tout recommencer (comme les premiers postes.) faites le moi savoir.

Merci de votre aide en tout cas.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Je t'ai pourtant dit (et redit) que ton Loop (et donc le findnext) étaient ici totalement inutiles ! Un seul Find suffit.
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
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Et moi je te dis qu'à partir du moment où dans le fichier où on cherche il y a plusieurs occurences, pour qu'il relève toutes les occurences, il faut un find next. Sinon il s'arrête à la première occurence trouvée, comme me l'a très bien expliqué MarcPL.

C'est bizarre, j'ai bien enlever mon do et tout et tout, résultat: tout plante, il ne relève bien que la première occurence trouvée.

Ce que tu ne comprends pas, c'est que ma macro marche très bien, ce n'est que le surlignage qui pose problème. Il va falloir comprendre ça.

Mon seul et unique problème: on surligne tout la ligne alors que je veux surligner que de la colonne 1 à 9.

Point barre.

Merci
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Oui mais pour moi ton FindNext interviendrait trop tôt, il ferait zapper la première occurence ...

Sinon pour les colonnes 1 à 9 :
                            If cel.Offset(, 1).Value = Test.Range("D" & I).Value Then
                                R = cel.Row
                                Test.Range(Test.Cells(R, 1), Test.Cells(R, 9)).Interior.ColorIndex = 46
                            End If

___________________________________________________________________________________________________________________
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
220
J'ai de plus en plus l'impression de ce qu'un énorme malentendu est présent, hein !
Si, comme te l'ai compris :
- tu as une feuille (appelons-la atraiter)
- tu as une feuille (appelons-la ouchercher)
- tu veux chercher dans ouchercher une valeur achercher se trouvant sur une ligne L sur atraiter
- tu veux surligner dans atraiter si occurrence de achercher trouvée dans ouchercher
Je ne vois pas pourquoi chercher toutes les occurrences éventuelles de achercher dans ouchercher. D'autant que tu ne surlignes alors que la ligne L de ta boucle dans atraiter.
C'est ta boucle de parcours de atraiter, qui passe en revue tout ce qu'il y a à chercher (tous les achercher, un par un) dans ouchercher, pas des FindNext sur ouchercher !.

Si, par contre, ton mécanisme de pensée est autre et que les tenants et aboutissants sont autres, expose-le sdonc plus clairement que tu ne l'as fait !

________________________
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
68
Date d'inscription
mercredi 23 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

j'ai X lignes dans le fichier d'où je pars.
Pour chaque ligne (for B=4 to Y) je vais regarder dans le fichier où chercher (à la colonne 3) si l'occurrence existe.

Le find next permet de trouver toutes les occurences dans ouchercher d'une même valeur de àtraiter.

Il a ça place.

si tu es pommé, ce problème a déjà été résolu par MarcPL ici:
http://www.vbfrance.com/forum/sujet-FONCTION-FIND-RENVOIE-ADRESSE_1595098.aspx


MarcPL, je te tiens au courant pour cette solution, je ne suis plus au boulot, je verrai demain.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
220
Ouais ...
"paumé" ", dis-tu ?
Je vous laisse donc continuer ainsi. En voyant votre résultat, je ne serai plus "paumé" du tout quant aux tenants et aboutissants.
J'interviendrai alors et tu verras la différence de rapidité ...Pour être plus clair, j'ai déjà prévu toutes les interprétations possibles
J'attends maintenant le code complet, conduit à son terme et définitivement arrêté. Il me "parlera" plus que tout le reste.
A bientôt, 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
1 2