Colorer une cellule en fonction de la valeur de deux autres

Bonjour à tous,

Je me sers de ma macro pour comparer deux plages de données de taille différente et dans deux feuilles distinctes. Elle fonctionne, mais maintenant je veux pouvoir colorer une cellule en fonction du résultat de cette comparaison.

Sub Comparaison()
'Déclarations
Dim valeurA As String, valeurB As String            'Valeurs des cellules de la feuille 1
Dim valeurC As String, valeurD As String

Dim valeur1 As String, valeur2 As String            'Valeurs des cellules de la feuille 2
Dim valeur3 As String, valeur4 As String

Dim nblignesA As Long, nblignes1 As Long           'Position de la dernière cellule non vide
Dim valeurE As String, valeur5 As String

nblignesA = Workbooks("WB.xlsm").Worksheets("1").Range("A" & Rows.Count).End(xlDown).row
nblignes1 = Workbooks("WB.xlsm").Worksheets("2").Range("A" & Rows.Count).End(xlDown).row

'Compare toutes les valeurs de Import_CDR avec toutes celles de Import_Billrun
For i = 1 To nblignesA
valeurA = Workbooks("WB.xlsm").Worksheets("1").Range("A" & "B" & "C" & i).value
valeurB = Workbooks("WB.xlsm").Worksheets("1").Range("D" & "E" & "F" & i).value
valeurC = Workbooks("WB.xlsm").Worksheets("1").Range("G" & "H" & "I" & i).value
valeurD = Workbooks("WB.xlsm").Worksheets("1").Range("J" & i).value

For j = 1 To nblignes1
valeur1 = Workbooks("WB.xlsm").Worksheets("2").Range("A" & "B" & "C" & j).value
valeur2 = Workbooks("WB.xlsm").Worksheets("2").Range("D" & "E" & "F" & j).value
valeur3 = Workbooks("WB.xlsm").Worksheets("2").Range("G" & "H" & "I" & j).value
valeur4 = Workbooks("WB.xlsm").Worksheets("2").Range("J" & j).value

valeurE = valeurA + valeurB + valeurC + valeurD
valeur5 = valeur1 + valeur2 + valeur3 + valeur4

If valeurE = valeur5 Then

 'C'est ici que le problème se pose. Je voudrais colorer la première cellule à droite d'une valeur égale à celle de l'autre feuille.

    Workbooks("WB.xlsm").Worksheets("1").Range("K" & i).Select
    With Selection.Interior.Color = RGB(0, 255, 0)
    End With

End If

Next j
Next i

End Sub

Ci-joint mon fichier .xlsm pour vous aider à mieux comprendre mon but

En espérant avoir était compréhensible,

Cordialement

EDIT : l'exécution de la macro fera planter votre Excel

22wb.xlsm (16.25 Ko)

Re,

Avec ton avertissement ... je n'ai pas téléchargé ton fichier ...

A tester pour tes dernières lignes ... atouzazar ...

'Je voudrais colorer la première cellule à droite d'une valeur égale à celle de l'autre feuille.
    Workbooks("WB.xlsm").Worksheets("1").Range("K" & i).Offset(0,1).Interior.Color = RGB(0, 255, 0)

Ta ligne colore une case et puis le programme plante.. je pense que ça doit venir du reste du code ! merci en tout cas!

(Le .xlsm fera pas planter ton Excel si tu lance pas la macro )

Re,

Avec ton accord, je me suis permis de reprendre ta macro ... à la base ...

J'espère que cela correspond à ton attente ...

20wb.xlsm (16.39 Ko)

Re,

C'est vraiment nickel, seul problème c'est que, dans mon vrai classeur, les données sont presque toutes des strings (con comme je le suis, j'ai oublié de mettre des lettres dans mon exemple WB.xlsm) et que du coup, j'ai essayé d'adapter ta refonte de ma macro en déclarant comme ceci :

Dim valeurA As String
Dim valeurB As String
Dim valeurC As String
Dim valeurD As String
Dim valeur1 As String
Dim valeur2 As String
Dim valeur3 As String
Dim valeur4 As String
Dim nblignesA As Long
Dim nblignes1 As Long
Dim valeurE As String
Dim valeur5 As String
Dim i As Long
Dim j As Long
Dim wsh1 As Worksheet
Dim wsh2 As Worksheet

Et une erreur d'incompatibilité de type se produit au début du for :

 For i = 1 To nblignesA
      With wsh1
          'ici
          valeurA = .Range("A" & i) + .Range("B" & i) + .Range("C" & i)

Help ?

Merci à toi en tout cas!

EDIT : J'ai essayé de rajouter un Else pour colorer les cellules en rouges en cas de non égalité entre les deux lignes, et si une seule donnée est fausse, toute la colonne K devient rouge.

 If valeurE = valeur5 Then
                wsh1.Range("K" & i).Interior.Color = RGB(0, 255, 0)
                Else
                wsh1.Range("K" & i).Interior.Color = RGB(255, 0, 0)

Bonjour,

Deux petites remarques si tu le permets ...

1. Tu parles de ton vrai fichier qui n'a pas de valeurs ... OK ... mais comme veux-tu que je devine ...???

2. Ensuite ... tu fonçes tête baissée dans la macro ...

Tout d'abord quel est ton objectif ... ajouter des valeurs contenues dans des strings, concaténer des strings ...???

Joins donc ... un bout de fichier représentatif de ta situation ... çà évitera de refaire 36 fois les choses ...!!!

Bonjour,

Oui désolé, c'était pas un reproche c'est juste une erreur de ma part :p

Mon objectif c'est de concaténer des strings pour pouvoir les comparer (Comparer toutes les lignes de Feuil1 et Feuil2 entre elles, pour les cellules allant de A à J) et colorer en vert (EDIT : Et en rouge si les valeurs ne sont pas égales) la cellule K (dans la Feuil2) correspondant à cette ligne si cette ligne est égale à une ligne de Feuil1.

J'espère avoir été compréhensible.. en PJ un exemple des valeurs présentes dans les cellules.

Merci à toi !

12wb2.xlsm (8.82 Ko)

Re,

Merci pour le fichier ... et pour la clarification ...

Ci-joint ton fichier test ... avec ta macro re-visitée ...

29wb2.xlsm (16.14 Ko)

Re,

Tout d'abord, merci de ta réponse et de m'accorder de ton temps,

Ton code s'éxecute sans erreur, mais sur ma wsh2, qui comporte +-40 lignes, seule une cellule s'affiche en vert, alors que normalement ces 40 lignes correspondent à 40 autres lignes de la wsh1. De plus, la colonne K de la wsh2 (hormis une cellule en vert) est en rouge jusqu'à la ligne numéro 6151, ce qui correspond au nombre de lignes dans la wsh1.

Encore merci de ton aide, et fais moi savoir si tu as besoin de plus d'informations, n'hésite pas !

Re,

Il faut que tu comprennes que, de ton côté, tu commentes quelque chose que tu as sous les yeux ...

De mon côté, je dois utiliser ma boule de cristal ... qui, en ce moment, est en panne ...

Dans la mesure où j'ai déjà effectué des tests avec 50 lignes pour valider le code ... il y a certainement ... "autre chose"

Mais quoi ...

Le principe de base est une comparaison cellule par cellule ... ligne par ligne ...

Dans ton fichier réel, les deux bases de données sont-elles triées par les mêmes critères ...???

Re,

Je comprends très bien, mais étant donné que je suis en stage et que ces données sont confidentielles, je ne peux pas te partager mon classeur... Mais même si c'était le cas, étant donné que les données sont de la même forme que l'exemple de classeur que je t'ai donné dernièrement, je ne vois pas pourquoi ça ne fonctionne pas... J'ai analysé ton code et j'arrive pas à trouver le problème...

EDIT : J'avais pas vu ton EDIT, en effet peut-être que le problème vient du fait que dans wsh1, il y a certaines cellules dont la valeur est "undefined", mais sinon, la forme reste la même.

Re,

Difficile de t'en dire plus ...

Pour tes tests ... j'espère que tu sais que tu peux faire du "step-by-step" ...avec F8 ...

Que signifie exactement pour toi ... Undefined ...???

Re,

En fait, dans mon tableur, j'importe deux fichiers textes (respectivement sur wsh1 et wsh2), qui sont des sorties d'un logiciel utilisé par l'entreprise dans laquelle je suis en stage. De base, il y a des blancs à la place de undefined, j'ai mis undefined à la place juste pour pouvoir séparer la chaîne plus facilement.

Ceci-dit, dans WB2.xlsm, j'ai rajouté une ligne avec "undefined" dans wsh1 sans le mette dans wsh2, et pourtant le programme fonctionne quand même parfaitement, cette ligne se colore en rouge, mais ça ne déborde pas...

EDIT : Le step-by-step montre que le programme fonctionne bien... il boucle les "For" correctement et n'affiche pas d'erreur...


Re,

J'ai fait un test sur le fichier WB2, en effet, le programme continue de travailler même quand il est arrivé au bout de wsh2, c'est donc cela qui cause le coloriage de la colonne K jusqu'en bas... Mais cela n'explique pas pourquoi il ne trouve pas de correspondances entre wsh1 et 2 à part une.

Je précise que les lignes possédant les mêmes valeurs ne sont pas forcément au même endroit. (Par là, j'entend que la ligne 390 de wsh1 peut être égale à la ligne 4 de wsh2)

En PJ, le test effectué... qui fonctionne pourtant.

6wb2-1.xlsm (16.55 Ko)

Re,

Si tu veux bien retourner à mon dernier message de la page précédente ... et relire la dernière ligne ...

Re,

Comment ça par les mêmes critères?

Si c'est ce que tu entends, il y a autant de colonnes dans chaque wsh, et les données à l'intérieur sont de la même forme.

Re,

Dans ton fichier réel, les deux bases de données sont-elles triées par les mêmes critères ...???

Car

Le principe de base est une comparaison cellule par cellule ... ligne par ligne ... !!!

Re,

Oui, par exemple :

0x0189741121 2,01503E+13 10 98809157 98809157 99669634 8,8351E+17 N 0 0

Cette ligne est présente dans wsh1 et wsh2, et avec le même agencement.

Par exemple, chaque ligne de wsh2 est présente dans wsh1 parmi d'autres qui ne sont pas dans wsh2.

Donc je ne vois pas comment cela se fait que ça ne trouve qu'une ligne identique, étant donné qu'avec mon précédent code (ci-dessous) je trouvais toutes les lignes correspondantes.

Sub Comparaison()
'Déclarations
Dim valeurA As String, valeurB As String            'Valeurs des cellules de la feuille 1
Dim valeurC As String, valeurD As String

Dim valeur1 As String, valeur2 As String            'Valeurs des cellules de la feuille 2
Dim valeur3 As String, valeur4 As String

Dim nblignesA As Long, nblignes1 As Long           'Position de la dernière cellule non vide
Dim valeurE As String, valeur5 As String

nblignesA = Workbooks("WB.xlsm").Worksheets("1").Range("A" & Rows.count).End(xlDown).row
nblignes1 = Workbooks("WB.xlsm").Worksheets("2").Range("A" & Rows.count).End(xlDown).row

'Compare toutes les valeurs de Import_CDR avec toutes celles de Import_Billrun
For i = 1 To nblignesA
valeurA = Workbooks("WB.xlsm").Worksheets("1").Range("A" & "B" & "C" & i).value
valeurB = Workbooks("WB.xlsm").Worksheets("1").Range("D" & "E" & "F" & i).value
valeurC = Workbooks("WB.xlsm").Worksheets("1").Range("G" & "H" & "I" & i).value
valeurD = Workbooks("WB.xlsm").Worksheets("1").Range("J" & i).value

For j = 1 To nblignes1
valeur1 = Workbooks("WB.xlsm").Worksheets("2").Range("A" & "B" & "C" & j).value
valeur2 = Workbooks("WB.xlsm").Worksheets("2").Range("D" & "E" & "F" & j).value
valeur3 = Workbooks("WB.xlsm").Worksheets("2").Range("G" & "H" & "I" & j).value
valeur4 = Workbooks("WB.xlsm").Worksheets("2").Range("J" & j).value

valeurE = valeurA + valeurB + valeurC + valeurD
valeur5 = valeur1 + valeur2 + valeur3 + valeur4

If valeurE = valeur5 Then

    Workbooks("WB.xlsm").Worksheets("1").Range("K" & i).Select
    With Selection.Interior.Color = RGB(0, 255, 0)
    End With

End If

Next j
Next i

End Sub

Re,

Si tu le permets, ... la solution simple :

1. Tu importes tes deux fichiers dans tes deux onglets ...

2. Tu tries ton onglet 1 sur la première colonne dans l'ordre alphabétique

3. Tu tries ton onglet 2 sur la première colonne dans l'ordre alphabétique

4. Tu lances la macro de comparaison...

Bon Courage pour la suite ...

Re,

C'est pas bête du tout, je n'y avais même pas pensé...

Je vais modifier ma macro d'import pour pouvoir insérer un tableau, je te tiendrais au courant.

En tout cas, je tiens à te remercier pour la précieuse aide que tu m'as apporté, merci beaucoup !!

Cordialement

Re,

Merci pour tes remerciements ...

Rechercher des sujets similaires à "colorer fonction valeur deux"