Comparer deux feuilles Excel! Pourquoi mon programme ne marche pas!???

dannie_m Messages postés 2 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 2 février 2006 - 1 févr. 2006 à 14:03
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 3 févr. 2006 à 17:28
Salut,

Je suis une débutante en VBA. Je dois faire le plus rapidement possible la comparaison de deux feuilles Excel. J'ai fais comme j'ai pu en lisant d'autres codes.

Je dois comparer les éléments de la 2ème colonne de chacune des feuilles. Cette colonne est la clé de tri et chaque élément de la colonne 2 est unique pour chaque feuille.

Sur une 3ème feuille, je dois écrire le résultat où on ajoute deux colonnes: 1 pour un "switch appartient à feuille1", 1 pour un "switch appartient à feuille2":
-si l'argument de la colonne 2 appartient seulement à la feuille 1, switch1 Y et switch 2 N , les valeurs des autres colonnes sont celles de la feuille1.
-si l'argument de la colonne 2 appartient seulement à la feuille 2, les switch sont inversés et les autres colonnes sont = à celles de la feuille2.
-si l'argument de la colonne 2 appartient au deux feuilles, on teste les valeurs des autres colonnes, elles seront égales aux valeurs de la feuille 2. Si ces valeurs sont différentes de celles de la feuille1, on les affiche en rouge.


J'ai mis des espions et dans la fenêtre, je vois la valeurs des variables qui est "out of context" après avoir rempli la deuxième ligne... J'ai cherché mais je ne vois pas pourquoi ça s'arrête après cette ligne. J'ai essayé pour plusieurs cas: feuilles identiques, premier élément le même, etc... j'ai souvent le "out of context" après la boucle "for sur col"

Please, j'ai besoin d'aide... Je sais que mon code n'est pas évolué et même compliqué pour ce que je dois faire. J'aimerais juste que ça marche pour plus d'une ligne... Après je pourrai tester si j'ai tout mon tableau correct.

Voilà ce que j'ai écrit:
Sub ComparaisonTableau()

'LES FEUILLES DOIVENT ÊTRE TRIEES!!!!

'ARGTBL doît être la deuxième colonne


Application.ScreenUpdating = False

Dim i, j, m, l As Variant
Dim U, W As Long
Dim k As Integer
Dim col As Integer
Dim S1 As Boolean
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim cf1 As String, cf2 As String
Dim cf3 As String, cf4 As String

Set ws1 = Worksheets("sheet1")
Set ws2 = Worksheets("sheet2")

i = 1
j = 0
k = j
l = k

With ws1.UsedRange
U = .Rows.Count
End With

With ws2.UsedRange
W = .Rows.Count
End With

S1 = False

'L'indice i sera utilisé pour parcourir la colonne des arguments de la table 1
'L'indice j sera utilisé pour parcourir la colonne des arguments de la table 2
'L'indice k sera utilisé pour sauvegarder l'indice d'un élément table2 trouvé
'L'indice l sera utilisé pour sauvegarder la longueur entre deux éléments table2 correspondant à table1.

'Titre de la feuille de résultat
Worksheets(3).Cells(1, 1).Value = "NUMTBL"
Worksheets(3).Cells(1, 2).Value = "ARGTBL"
Worksheets(3).Cells(1, 3).Value = "SWIEUR" 'Y si appartient à la table 1
Worksheets(3).Cells(1, 4).Value = "SWIREC" 'Y si appartient à la table 2
Worksheets(3).Cells(1, 5).Value = "LIBEL2"
Worksheets(3).Cells(1, 6).Value = "CODTB1"
Worksheets(3).Cells(1, 7).Value = "CODTB2"
Worksheets(3).Cells(1, 8).Value = "CODTB3"
Worksheets(3).Cells(1, 9).Value = "CODTB4"
Worksheets(3).Cells(1, 10).Value = "CODTB5"
Worksheets(3).Cells(1, 11).Value = "CODTB6"
Worksheets(3).Cells(1, 12).Value = "MONTAN1"
Worksheets(3).Cells(1, 13).Value = "MONTAN2"
Worksheets(3).Cells(1, 14).Value = "MONTAN3"
Worksheets(3).Cells(1, 15).Value = "MONTAN4"
Worksheets(3).Cells(1, 16).Value = "MONTAN5"
Worksheets(3).Cells(1, 17).Value = "MONTAN6"
Worksheets(3).Cells(1, 18).Value = "TAUX1"
Worksheets(3).Cells(1, 19).Value = "TAUX2"
Worksheets(3).Cells(1, 20).Value = "SWIT01"
Worksheets(3).Cells(1, 21).Value = "SWIT02"
Worksheets(3).Cells(1, 22).Value = "SWIT03"
Worksheets(3).Cells(1, 23).Value = "SWIT04"
Worksheets(3).Cells(1, 24).Value = "SWIT05"
Worksheets(3).Cells(1, 25).Value = "SWIT06"
Worksheets(3).Cells(1, 26).Value = "SWIT07"
Worksheets(3).Cells(1, 27).Value = "SWIT08"
Worksheets(3).Cells(1, 28).Value = "SWIT09"
Worksheets(3).Cells(1, 29).Value = "SWIT10"
Worksheets(3).Cells(1, 30).Value = "SWIT11"
Worksheets(3).Cells(1, 31).Value = "SWIT12"
Worksheets(3).Cells(1, 32).Value = "SWIT13"
Worksheets(3).Cells(1, 33).Value = "SWIT14"
Worksheets(3).Cells(1, 34).Value = "SWIT15"
Worksheets(3).Cells(1, 35).Value = "ZONTBL"

m = 2

'Pour chaque élément de la table 1
For i = 1 To U
S1 = False
j = k + 1
While (j <W Or S1 False)
cf1 = ""
cf2 = ""
'On Error Resume Next
cf1 = ws1.Cells(i, 2).FormulaLocal
cf2 = ws2.Cells(j, 2).FormulaLocal
'On Error GoTo 0
If cf1 = cf2 Then
'test sur les arguments des tables
l = j - k
k = j
If l > 1 Then

'On a passé plusieurs arguments de la table 2 avant de trouver l'argument ok
'Vu que les fichiers sont triés et ARGTBL sensé être unique, on peut les ajouter
While l > 1
Worksheets(3).Cells(m, 1).Value = Worksheets(1).Cells(1, 1).Value
Worksheets(3).Cells(m, 2).Value = Worksheets(2).Cells(j - (l - 1), 2).Value
Worksheets(3).Cells(m, 3).Value = "N"
Worksheets(3).Cells(m, 4).Value = "Y"
For col = 3 To 34
Worksheets(3).Cells(m, col + 2).Value = Worksheets(2).Cells(j - (l - 1), col).Value
Next col
End
m = m + 1
l = l - 1
Wend

End If
' on doît aussi mettre l'élément j
Worksheets(3).Cells(m, 1).Value = Worksheets(1).Cells(1, 1).Value
Worksheets(3).Cells(m, 2).Value = Worksheets(2).Cells(j, 2).Value
Worksheets(3).Cells(m, 3).Value = "Y"
Worksheets(3).Cells(m, 4).Value = "Y"

' alors on fait un check des autres colonnes

For col = 3 To 34

cf3 = ""
cf4 = ""

On Error Resume Next
cf3 = ws1.Cells(i, col).FormulaLocal
cf4 = ws2.Cells(j, col).FormulaLocal

On Error GoTo 0
If cf3 = cf4 Then
'If Worksheets(1).Cells(i, col) = Worksheets(2).Cells(j, col) Then
With Worksheets(3)
.Range(.Cells(m, col + 2), .Cells(m, col + 2)).Font.Color = vbBlack
End With
'Worksheets(3).Cells(m, col + 2).Font.Color = vbBlack
Worksheets(3).Cells(m, col + 2).Value = Worksheets(2).Cells(j, col).Value
Else
With Worksheets(3)
.Range(.Cells(m, col + 2), .Cells(m, col + 2)).Font.Color = vbRed
End With
'Worksheets(3).Cells(m, col + 2).Font.Color = vbRed
Worksheets(3).Cells(m, col + 2).Value = Worksheets(2).Cells(j, col).Value
End If

Next col
End
m = m + 1
S1 = True 'on a trouvé un argument qui convient

Else

j = j + 1

End If


Wend

If (S1 = False And j > W) Then
'C'est le cas où l'argument appartient à table1 et pas à table2
Worksheets(3).Cells(m, 1).Value = Worksheets(1).Cells(1, 1).Value
Worksheets(3).Cells(m, 2).Value = Worksheets(1).Cells(i, 2).Value
Worksheets(3).Cells(m, 3).Value = "Y"
Worksheets(3).Cells(m, 4).Value = "N"
For col = 3 To 34
Worksheets(3).Cells(m, col + 2).Value = Worksheets(2).Cells(i, col).Value
Next col
End
m = m + 1
End If

Next i

End

Application.ScreenUpdating = True

End Sub

3 réponses

Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
1 févr. 2006 à 16:13
Petite question bête, je regarde ton code et je commence à me demander si je comprends bien ce que tu veux faire :

Arrête moi si je me trompe, sur ta 3ème feuille, tu veux créer 2 colonnes qui contiendront Y ou N suivant qu'une valeur de cette feuille appartienne ou non à une des 2 feuilles ou les 2.

Si c'est bien ça, pourquoi faire un code aussi compliqué alors qu'avec quelques formules dans Excel, tu obtiens la même chose ?

Si tu combines les formules SI et RECHERCHEV, tu obtiendras la même chose sans taper une seule ligne de code.

Sinon, c'est que je n'ai pas bien compris.
Précise un peu plus, non pas ton code, mais ce que tu veux obtenir.

Molenn.
0
dannie_m Messages postés 2 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 2 février 2006
2 févr. 2006 à 18:51
Je veux mettre sur la troisième feuille des switchs mais aussi la valeur des autres colonnes qui sont liées à l'argument comparé.
Si les switchs sont tous les deux à Y, alors, je dois comparer les arguments de ces "autres colonnes" et mettre les cellules dans une autre couleurs si les éléments liés à un argument commun sont différents sur la feuille 1 et la feuille 2.
Exemple:
Feuille1:
ARGTBL MONTAN LIBEL
1 40 lala
2 50 lolo
4 60 lulu
6 70 lili

Feuille2:
ARGTBL MONTAN LIBEL
0 10 lala
2 40 lolo
4 60 lolo
8 70 lili

Sur la feuille 3:
ARGTBL MONTAN LIBEL SWI01 SWI02
0 10 lala N Y
1 40 lala Y N
2 40(rouge) lolo Y Y
4 60 lulu(rouge) Y Y
etc

J'avais essayé avec VLOOKUP mais je ne voyais pas comment mettre un formattage conditionnelle par rapport aux valeur surles feuille 1 et 2.

Je dois appliquer ce formattage à un grand nombre de fichiers.... Une macro avait l'air plus facile à appliquer.

Mon code était presque ok. J'ai trouvé des petits problèmes dans la synthaxe. C'est un peu tordu, je sais... Mais je ne suis pas très ingénieuse ;(
En plus, ce n'est pas rapide pour de longues feuilles différentes.

Merci quand même...

Dannie
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
3 févr. 2006 à 17:28
On peut faire ce que tu veux sans aucune ligne de code tu sais ? (oui oui, je le dis souvent ces moments, mais bon, mettre du code bien lourd alors qu'on peut obtenir le même résultat avec les formules d'Excel, c'est quand même plus sympa je trouve, et moins lourd à l'utilisation)

Alors, pour tes colonnes de la feuille 3 qui contiennent les switch.
Tu as 2 solutions :
La première
Colonne 4 Colonne 5
1: SWI01 SWI02
2: =Formule1 =Formule2

Formule1 :
SI(ESTERREUR(RECHERCHEV(A2;Feuil1!A:A;1;FAUX))VRAI;"N";"Y")
Formule2 :
SI(ESTERREUR(RECHERCHEV(A2;Feuil2!A:A;1;FAUX))VRAI;"N";"Y")
Cette formule marquera dans la cellule un Y si l'argument de ta feuille 3 se trouve sur la feuille 1, et donc un N s'il ne s'y trouve pas.
Et donc idem pour la feuille 2 dans la 2ème colonne.

2ème possibilité :
Si j'ai bien compris, la seule chose qui t'intéresse, c'est lorsque tes 2 switchs sont à Y.
Avec la formule =Et(D2="Y";E2="Y"), ça te marquerait dans une nouvelle colonne VRAI si les 2 swicths sont sur Y.

On en arrive donc à une simplification :
dans la colonne D, mets en D2 la formule suivante :
ET(SI(ESTERREUR(RECHERCHEV(A2;Feuil1!A:A;1;FAUX))VRAI;"N";"Y")="Y";SI(ESTERREUR(RECHERCHEV(A2;Feuil2!A:A;1;FAUX))=VRAI;"N";"Y")="Y")
Ca te marquera VRAI si l'argument se trouve sur tes 2 feuilles à la fois et FAUX dans les autres cas.

Hop, avec une simple formule, tu auras ton calcul avec rafraichissment automatique en fonctiond des données entrées dans les feuilles 1 et 2


On arrive maintenant à ton problème, faire ressortir les différences :
La comparaison n'est pas très compliquée, mais pour cela, j'ai besoin de comprendre ta logique.
Je détaille. Dans ton exemple :
Feuille 3, ARGTBL 2.
Cet argument se retrouve à la fois sur la feuille 1 (données : 50 Lolo) et la feuille 2 (données : 40 Lolo).
Sur la feuille 3 se trouve donc reporté 40 Lolo avec 40 en rouge (le rouge je comprends, 40, c'est celle des 2 données qui est différente). Tu as donc reporté les données de la feuille 2

Feuille 3, ARGTBL 4.
Cet argument se retrouve à la fois sur la feuille 1 (données : 60 Lulu) et la feuille 2 (données : 60 Lolo).
Sur la feuille 3 se trouve donc reporté 60 Lulu avec Lulu en rouge (celle des 2 données qui est différente). Tu as donc reporté les données de la feuille 1

Ma question : Pourquoi une fois tu reportes les données de la feuille 1 en erreur, et la fois d'après la feuille 2 ?

Avec cette réponse, on pourra étudier le reste du cas.
Mais d'un autre côté, si tu as compris ce que j'ai fait avant, tu devrais pouvoir trouver le reste ^^



Et je maintiens. Non au codage !!! C'est la solution de dernier recours !!! :p
Molenn
0
Rejoignez-nous