Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comparer deux fichiers de 27000 lignes chacun : comment faire ?

15 réponses
Avatar
tictok
Bonjour a tous.
J'ai quelques problemes (doux euphemisme il est vrai :D) pour comparer la
cellule A d'un fichier avec la cellule A d'autre. Chaque fichier contient
environ 27000 lignes, donc ce n'est pas un petit fichier !
Les donnees des cellules a comparer sont des donnnees de type texte (non des
valeurs).
Je voudrais evidemment automatiser cette comparaison avec VBA.
Le temps d'execution en lui meme n'est pas trop genant. Si ca dure des
heures mais que ca marche c'est parfait !

Premier probleme : est t'il preferable de faire la comparaison entre les
deux fichiers ou de copier le contenu du second dans le premier ?
Ca ne me gene pas du tout de copier le contenu, j'ai un PC assez puissant
pour ca. C'est surtout pour un probleme de vitesse d'execution et de
stabilite.

Second probleme : j'ai differents cas :
Si je trouve la meme donnée dans les deux listes, alors faire l'action
ACTION1.
Si j'ai la donnée dans le premier fichier et pas dans le second, alors
faire ACTION2.
Si j'ai la donnée dans le second fichier et pas dans le premier, alors
faire ACTION3.

Troisième probleme : le fait de ne pas trouver une donnée du premier fichier
dans le second (et vice versa), peut on le faire en meme temps ou vaut t'il
mieux separer ces procedures ?

A la fin, il faudra avoir tout analyser.
Mon probleme est difficile, surtout a cause de la quantite de données a
traiter.
Je remercie beaucoup d'avance toute personne pouvant m'aider !

(J'ai essaye une macro venant de http://www.excelabo.net/xl/comparer.php
mais sans grand succes.)

5 réponses

1 2
Avatar
tictok
Re, ca ne marche pas du tout (enfin comme je l'esperais).
Je n'ai eu que 2 "ok" dans mon premier fichier, 1 "Cac" et 1 "ok" dans le
second.
J'avais reduit le ficheir a 8000 lignes environ (pour tester plus vite) et
j'ai fait ca comme changement :

Set Rg = .Range("A1:A" & Range("A8000").End(xlUp).Row) (8000 au lieu de
65536)

With Workbooks(NomAutreClasseur).Worksheets("Sheet1") (Sheet1 au lieu de
Sheet2).

Je reprecise que je ne veux faire une comparaison que par rapport a la
colonne A, et non la B ou une autre ... car le << For B = 1 To UBound(Tblo,
2) >> m'intrigue.
Il ne ferait pas la comparaison pour chaque colonne ainsi ?


"michdenis" escreveu na mensagem
news:
Bonjour Tictok

Renseigne la variable désignée dans la procédure...

pas le temps de tester

'--------------------------
Sub Comparer()

Dim Rg As Range, Rg1 As Range
Dim A As Long, B As Long
Dim X As Long, D As Long, G As Long
Dim Tblo As Variant, Tblo1 As Variant
Dim NomCeClasseur As String
Dim NomAutreClasseur As String


NomCeClasseur = ThisWorkbook.Name

'à renseigner la variable
NomAutreClasseur = Workbooks("NomDuClasseur).Name


With Workbooks(NomCeClasseur).Worksheets("Feuil1")
Set Rg = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

With Workbooks(NomAutreClasseur).Worksheets("Feuil2")
Set Rg1 = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo1 = Rg1
End With

Application.ScreenUpdating = False

For A = 1 To UBound(Tblo, 1)
For B = 1 To UBound(Tblo, 2)
If IsError(Application.Match(Tblo(A, B), Tblo1, 0)) Then
If Rg(A, B).Offset(, 2) = Rg1(A, B).Offset(, 2) Then
Rg(A, B).Offset(, 4) = "Cb"
End If
On Error GoTo 0
Else
If Rg(A, B).Offset(, 2) = Rg1(A, B).Offset(, 2) Then
Rg(A, B).Offset(, 4) = "ok"
Rg1(A, B).Offset(, 4) = "ok"
End If
End If
Next
Next

'ON INVERSE, COMPARAISON FAITE À PARTIR DE L'AUTRE PLAGE

For A = 1 To UBound(Tblo1, 1)
For B = 1 To UBound(Tblo1, 2)
If IsError(Application.Match(Tblo1(A, B), Tblo, 0)) Then
If Rg(A, B).Offset(, 2) = Rg1(A, B).Offset(, 2) Then
Rg1(A, B).Offset(, 4) = "CaC"
End If
On Error GoTo 0
End If
Next
Next

Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'--------------------------


Salutations!


"tictok" a écrit dans le message de
news:

Apres 10 minutes, la macro tournait toujours a 100% ... Je l'ai arrete. :(
Je ne veux pas avoir une liste des donnees uniques et trouvees dans les
deux

fichiers.

Je vais preciser les ACTION 1,2,3 de mon premier message.
- SI je trouve la meme donnee dans les deux fichiers (comparaison des
colonnes A), ALORS (la donnee de la cellule de la colonne C du premier
fichier est egale a celle du second fichier) ET (ecrire "OK" dans la
cellule

de la colonne E des deux fichiers ).
- SI je trouve la donnee dans le premier fichier et pas dans le second,
ALORS ecrire dans la cellule de la colonne E "CB".
- SI je trouve la donnee dans le second fichier et pas dans le premier,
ALORS ecrire dans la cellule de la colonne E "CaC".

Commme ca (si le programme marche bien), aucune cellule des colonnes E de
chaque fichier ne devrait etre vide. Chaque cellule des colonnes E devrait
contenir "OK" ou "CB" ou "Cac", mais ne peut etre vide.

Je vais corser le probleme car je veux que la macro soit contenue dans un
fichier externe : de ce fichier contentant la macro, je vais traiter les
deux fichiers. Est-ce possible ?

Voila, c'est complique mais si ca marche, ah je sens que je ferai chauffer
le processeur comme il a jamais vu ! LOL

En attendant une reponse
Tictok

"michdenis" escreveu na mensagem
news:
Bonjour Titok,

Voici une procédure qui compare les colonnes A de 2 fichiers.

A ) les 2 fichiers doivent être ouverts.

B ) Remplace ceci "ThisWorkbook.Name" par le nom du classeur dans le
second appel .


C ) résultats dans le classeur contenant cette procédure dans la feuille
résultat qui sera ajouté


Colonne A contiendra : les données qui sont présentes dans les 2
fichiers


Colonne B " " : les données uniques au classeur contenant
cette macro

Colonne C " " : les données uniques à l'autre classeur


'----------------------------------
Sub Comparer()

Dim Rg As Range, Rg1 As Range
Dim A As Long, B As Long
Dim X As Long, D As Long, G As Long
Dim Tblo As Variant, Tblo1 As Variant

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil1")
Set Rg = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil2")
Set Rg1 = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo1 = Rg1
End With

On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = False
On Error GoTo 0
Worksheets.Add.Name = "Résultat"

For A = 1 To UBound(Tblo, 1)
For B = 1 To UBound(Tblo, 2)
If IsError(Application.Match(Tblo(A, B), Tblo1, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
X = X + 1
Worksheets("Résultat").Range("B" & X) = Tblo(A, B)
On Error GoTo 0
Else
'Donnée est ds les 2 tableaux tblo = tblo1
'Appelle de ta procédure
G = G + 1
Worksheets("Résultat").Range("A" & G) = Tblo(A, B)
End If
Next
Next

'ON INVERSE, COMPARAISON FAITE À PARTIR DE L'AUTRE PLAGE

For A = 1 To UBound(Tblo1, 1)
For B = 1 To UBound(Tblo1, 2)
If IsError(Application.Match(Tblo1(A, B), Tblo, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
D = D + 1
Worksheets("Résultat").Range("C" & D) = Tblo1(A, B)
On Error GoTo 0
End If
Next
Next

Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------


Salutations!




"tictok" a écrit dans le message de
news:e$

Bonjour a tous.
J'ai quelques problemes (doux euphemisme il est vrai :D) pour comparer
la


cellule A d'un fichier avec la cellule A d'autre. Chaque fichier
contient


environ 27000 lignes, donc ce n'est pas un petit fichier !
Les donnees des cellules a comparer sont des donnnees de type texte (non
des

valeurs).
Je voudrais evidemment automatiser cette comparaison avec VBA.
Le temps d'execution en lui meme n'est pas trop genant. Si ca dure des
heures mais que ca marche c'est parfait !

Premier probleme : est t'il preferable de faire la comparaison entre les
deux fichiers ou de copier le contenu du second dans le premier ?
Ca ne me gene pas du tout de copier le contenu, j'ai un PC assez
puissant


pour ca. C'est surtout pour un probleme de vitesse d'execution et de
stabilite.

Second probleme : j'ai differents cas :
Si je trouve la meme donnée dans les deux listes, alors faire
l'action


ACTION1.
Si j'ai la donnée dans le premier fichier et pas dans le second,
alors


faire ACTION2.
Si j'ai la donnée dans le second fichier et pas dans le premier,
alors


faire ACTION3.

Troisième probleme : le fait de ne pas trouver une donnée du premier
fichier

dans le second (et vice versa), peut on le faire en meme temps ou vaut
t'il

mieux separer ces procedures ?

A la fin, il faudra avoir tout analyser.
Mon probleme est difficile, surtout a cause de la quantite de données a
traiter.
Je remercie beaucoup d'avance toute personne pouvant m'aider !

(J'ai essaye une macro venant de http://www.excelabo.net/xl/comparer.php
mais sans grand succes.)










Avatar
tictok
J'ai deux fichiers.
Ces fichiers ont plusieurs colonnes remplies.
Je veux comparer les colonnes A de chaque fichier.
Chaque cellule de la colonne A contient un code.
Quand j'ecris dans la colonne C, c'est exprès et je sais ce que je fais.
J'utilise la colonne E car elle n'est pas remplie et je peux donc m'en
servir.

Pour l'instant, je me base sur le second code donne par michdenis (pas le
premier !).
Mais j'ai du mal a comprendre pourquoi ca ne marche pas.

Pour repondre a ta question, on devrait se retrouver a la fois dans les
deuxiemes et troisiemes cas :
- deuxieme car il ne trouve pas "Toto"
- troisieme car il ne trouve pas "PasToto"
Si ca marche comme ca, c'est bon car pour moi Toto et PasToto sont bien deux
choses differentes !
Justement, le Application.Match fait bien une comparaison EXACTE ?

"Paul V." escreveu na mensagem
news:
Moi toujours pas comprendre.

Ok pour le début de ma comprenure ou compréhensivité. Je sais jamais.
Imaginons que dans le premier fichier tu ais Toto et dans le deuxième
fichier PasToto.
Est-on dans le deuxième cas ou le troisième. A mon avis, les deux ;-)
Alors que faire?

--
HTH

Paul V.

tictok wrote:
Bonjour Paul V.

- Les DEUX fichiers sont triés dans l'ordre croissant de la colonne
A, de la meme facon.
- Oui, les colonnes A a D contiennent des donnees. Je ne peux pas
trop modifier la structure de mes fichiers pour comparer.
- Oui et non. Je veux bien ecraser les valeurs, que la cellule ou on
va mettre la valeur (le premier ficheir donc) soit vide ou non.
- Je ne fais une comparaison que par rapport a la colonne A. Si les
colonnes B sont differentes, je m'en fous : je ne fais aucun manip
sur cette colonne B.

J'espere avoir bien repondu a tes questions.
Le code de michdenis n'a l'air pas mal, je vais le tester.

"Paul V." escreveu na mensagem
news:
Le problème est effectivement la quantité de données;

J'ai quelques questions.
Les données sont elles triées ?
Y a t-il autre chose dans les colonnes autres que C et E
Y a t-il toujours des données dans les deux fichiers pour les deux
classeurs?
Que faire si il y une donnée dans le premier qui n'est pas dans le
second fichier et que sur la même ligne il y a une donnée dans le
deuxième fichier qui n'est pas dans le premier?

--
HTH

Paul V.

tictok wrote:
Apres 10 minutes, la macro tournait toujours a 100% ... Je l'ai
arrete. :( Je ne veux pas avoir une liste des donnees uniques et
trouvees dans les deux fichiers.

Je vais preciser les ACTION 1,2,3 de mon premier message.
- SI je trouve la meme donnee dans les deux fichiers (comparaison
des colonnes A), ALORS (la donnee de la cellule de la colonne C du
premier fichier est egale a celle du second fichier) ET (ecrire
"OK" dans la cellule de la colonne E des deux fichiers ).
- SI je trouve la donnee dans le premier fichier et pas dans le
second, ALORS ecrire dans la cellule de la colonne E "CB".
- SI je trouve la donnee dans le second fichier et pas dans le
premier, ALORS ecrire dans la cellule de la colonne E "CaC".

Commme ca (si le programme marche bien), aucune cellule des colonnes
E de chaque fichier ne devrait etre vide. Chaque cellule des
colonnes E devrait contenir "OK" ou "CB" ou "Cac", mais ne peut
etre vide.

Je vais corser le probleme car je veux que la macro soit contenue
dans un fichier externe : de ce fichier contentant la macro, je vais
traiter les deux fichiers. Est-ce possible ?

Voila, c'est complique mais si ca marche, ah je sens que je ferai
chauffer le processeur comme il a jamais vu ! LOL

En attendant une reponse
Tictok

"michdenis" escreveu na mensagem
news:
Bonjour Titok,

Voici une procédure qui compare les colonnes A de 2 fichiers.

A ) les 2 fichiers doivent être ouverts.

B ) Remplace ceci "ThisWorkbook.Name" par le nom du classeur dans
le second appel .

C ) résultats dans le classeur contenant cette procédure dans la
feuille résultat qui sera ajouté

Colonne A contiendra : les données qui sont présentes dans les 2
fichiers Colonne B " " : les données uniques au
classeur contenant cette macro Colonne C " " : les
données uniques à l'autre classeur


'----------------------------------
Sub Comparer()

Dim Rg As Range, Rg1 As Range
Dim A As Long, B As Long
Dim X As Long, D As Long, G As Long
Dim Tblo As Variant, Tblo1 As Variant

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil1")
Set Rg = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil2")
Set Rg1 = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo1 = Rg1
End With

On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = False
On Error GoTo 0
Worksheets.Add.Name = "Résultat"

For A = 1 To UBound(Tblo, 1)
For B = 1 To UBound(Tblo, 2)
If IsError(Application.Match(Tblo(A, B), Tblo1, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
X = X + 1
Worksheets("Résultat").Range("B" & X) = Tblo(A, B)
On Error GoTo 0
Else
'Donnée est ds les 2 tableaux tblo = tblo1
'Appelle de ta procédure
G = G + 1
Worksheets("Résultat").Range("A" & G) = Tblo(A, B)
End If
Next
Next

'ON INVERSE, COMPARAISON FAITE À PARTIR DE L'AUTRE PLAGE

For A = 1 To UBound(Tblo1, 1)
For B = 1 To UBound(Tblo1, 2)
If IsError(Application.Match(Tblo1(A, B), Tblo, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
D = D + 1
Worksheets("Résultat").Range("C" & D) = Tblo1(A, B)
On Error GoTo 0
End If
Next
Next

Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------


Salutations!




"tictok" a écrit dans le message de
news:e$

Bonjour a tous.
J'ai quelques problemes (doux euphemisme il est vrai :D) pour
comparer la cellule A d'un fichier avec la cellule A d'autre.
Chaque fichier contient environ 27000 lignes, donc ce n'est pas un
petit fichier !
Les donnees des cellules a comparer sont des donnnees de type texte
(non des valeurs).
Je voudrais evidemment automatiser cette comparaison avec VBA.
Le temps d'execution en lui meme n'est pas trop genant. Si ca dure
des heures mais que ca marche c'est parfait !

Premier probleme : est t'il preferable de faire la comparaison
entre les deux fichiers ou de copier le contenu du second dans le
premier ? Ca ne me gene pas du tout de copier le contenu, j'ai un
PC assez puissant pour ca. C'est surtout pour un probleme de
vitesse d'execution et de stabilite.

Second probleme : j'ai differents cas :
Si je trouve la meme donnée dans les deux listes, alors faire
l'action ACTION1.
Si j'ai la donnée dans le premier fichier et pas dans le
second, alors faire ACTION2.
Si j'ai la donnée dans le second fichier et pas dans le
premier, alors faire ACTION3.

Troisième probleme : le fait de ne pas trouver une donnée du
premier fichier dans le second (et vice versa), peut on le faire
en meme temps ou vaut t'il mieux separer ces procedures ?

A la fin, il faudra avoir tout analyser.
Mon probleme est difficile, surtout a cause de la quantite de
données a traiter.
Je remercie beaucoup d'avance toute personne pouvant m'aider !

(J'ai essaye une macro venant de
http://www.excelabo.net/xl/comparer.php mais sans grand succes.)












Avatar
Paul V.
On avance.

Quelle action vois tu si on est à la fois dans le deuxième et troisième cas.

Autre question faut-il que la donnée dans A du premier classeur se retrouve
dans la même ligne dans la deuxième classeur ou peut-elle se retrouver dans
une autre ligne?


--
HTH

Paul V.

tictok wrote:
J'ai deux fichiers.
Ces fichiers ont plusieurs colonnes remplies.
Je veux comparer les colonnes A de chaque fichier.
Chaque cellule de la colonne A contient un code.
Quand j'ecris dans la colonne C, c'est exprès et je sais ce que je
fais. J'utilise la colonne E car elle n'est pas remplie et je peux
donc m'en servir.

Pour l'instant, je me base sur le second code donne par michdenis
(pas le premier !).
Mais j'ai du mal a comprendre pourquoi ca ne marche pas.

Pour repondre a ta question, on devrait se retrouver a la fois dans
les deuxiemes et troisiemes cas :
- deuxieme car il ne trouve pas "Toto"
- troisieme car il ne trouve pas "PasToto"
Si ca marche comme ca, c'est bon car pour moi Toto et PasToto sont
bien deux choses differentes !
Justement, le Application.Match fait bien une comparaison EXACTE ?

"Paul V." escreveu na mensagem
news:
Moi toujours pas comprendre.

Ok pour le début de ma comprenure ou compréhensivité. Je sais jamais.
Imaginons que dans le premier fichier tu ais Toto et dans le deuxième
fichier PasToto.
Est-on dans le deuxième cas ou le troisième. A mon avis, les deux ;-)
Alors que faire?

--
HTH

Paul V.

tictok wrote:
Bonjour Paul V.

- Les DEUX fichiers sont triés dans l'ordre croissant de la colonne
A, de la meme facon.
- Oui, les colonnes A a D contiennent des donnees. Je ne peux pas
trop modifier la structure de mes fichiers pour comparer.
- Oui et non. Je veux bien ecraser les valeurs, que la cellule ou
on va mettre la valeur (le premier ficheir donc) soit vide ou non.
- Je ne fais une comparaison que par rapport a la colonne A. Si les
colonnes B sont differentes, je m'en fous : je ne fais aucun manip
sur cette colonne B.

J'espere avoir bien repondu a tes questions.
Le code de michdenis n'a l'air pas mal, je vais le tester.

"Paul V." escreveu na mensagem
news:
Le problème est effectivement la quantité de données;

J'ai quelques questions.
Les données sont elles triées ?
Y a t-il autre chose dans les colonnes autres que C et E
Y a t-il toujours des données dans les deux fichiers pour les deux
classeurs?
Que faire si il y une donnée dans le premier qui n'est pas dans le
second fichier et que sur la même ligne il y a une donnée dans le
deuxième fichier qui n'est pas dans le premier?

--
HTH

Paul V.

tictok wrote:
Apres 10 minutes, la macro tournait toujours a 100% ... Je l'ai
arrete. :( Je ne veux pas avoir une liste des donnees uniques et
trouvees dans les deux fichiers.

Je vais preciser les ACTION 1,2,3 de mon premier message.
- SI je trouve la meme donnee dans les deux fichiers (comparaison
des colonnes A), ALORS (la donnee de la cellule de la colonne C du
premier fichier est egale a celle du second fichier) ET (ecrire
"OK" dans la cellule de la colonne E des deux fichiers ).
- SI je trouve la donnee dans le premier fichier et pas dans le
second, ALORS ecrire dans la cellule de la colonne E "CB".
- SI je trouve la donnee dans le second fichier et pas dans le
premier, ALORS ecrire dans la cellule de la colonne E "CaC".

Commme ca (si le programme marche bien), aucune cellule des
colonnes E de chaque fichier ne devrait etre vide. Chaque cellule
des colonnes E devrait contenir "OK" ou "CB" ou "Cac", mais ne
peut etre vide.

Je vais corser le probleme car je veux que la macro soit contenue
dans un fichier externe : de ce fichier contentant la macro, je
vais traiter les deux fichiers. Est-ce possible ?

Voila, c'est complique mais si ca marche, ah je sens que je ferai
chauffer le processeur comme il a jamais vu ! LOL

En attendant une reponse
Tictok

"michdenis" escreveu na mensagem
news:
Bonjour Titok,

Voici une procédure qui compare les colonnes A de 2 fichiers.

A ) les 2 fichiers doivent être ouverts.

B ) Remplace ceci "ThisWorkbook.Name" par le nom du classeur
dans le second appel .

C ) résultats dans le classeur contenant cette procédure dans la
feuille résultat qui sera ajouté

Colonne A contiendra : les données qui sont présentes dans les 2
fichiers Colonne B " " : les données uniques au
classeur contenant cette macro Colonne C " " : les
données uniques à l'autre classeur


'----------------------------------
Sub Comparer()

Dim Rg As Range, Rg1 As Range
Dim A As Long, B As Long
Dim X As Long, D As Long, G As Long
Dim Tblo As Variant, Tblo1 As Variant

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil1")
Set Rg = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil2")
Set Rg1 = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo1 = Rg1
End With

On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = False
On Error GoTo 0
Worksheets.Add.Name = "Résultat"

For A = 1 To UBound(Tblo, 1)
For B = 1 To UBound(Tblo, 2)
If IsError(Application.Match(Tblo(A, B), Tblo1, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
X = X + 1
Worksheets("Résultat").Range("B" & X) = Tblo(A, B)
On Error GoTo 0
Else
'Donnée est ds les 2 tableaux tblo = tblo1
'Appelle de ta procédure
G = G + 1
Worksheets("Résultat").Range("A" & G) = Tblo(A, B)
End If
Next
Next

'ON INVERSE, COMPARAISON FAITE À PARTIR DE L'AUTRE PLAGE

For A = 1 To UBound(Tblo1, 1)
For B = 1 To UBound(Tblo1, 2)
If IsError(Application.Match(Tblo1(A, B), Tblo, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
D = D + 1
Worksheets("Résultat").Range("C" & D) = Tblo1(A, B)
On Error GoTo 0
End If
Next
Next

Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------


Salutations!




"tictok" a écrit dans le message de
news:e$

Bonjour a tous.
J'ai quelques problemes (doux euphemisme il est vrai :D) pour
comparer la cellule A d'un fichier avec la cellule A d'autre.
Chaque fichier contient environ 27000 lignes, donc ce n'est pas
un petit fichier !
Les donnees des cellules a comparer sont des donnnees de type
texte (non des valeurs).
Je voudrais evidemment automatiser cette comparaison avec VBA.
Le temps d'execution en lui meme n'est pas trop genant. Si ca
dure des heures mais que ca marche c'est parfait !

Premier probleme : est t'il preferable de faire la comparaison
entre les deux fichiers ou de copier le contenu du second dans le
premier ? Ca ne me gene pas du tout de copier le contenu, j'ai un
PC assez puissant pour ca. C'est surtout pour un probleme de
vitesse d'execution et de stabilite.

Second probleme : j'ai differents cas :
Si je trouve la meme donnée dans les deux listes, alors faire
l'action ACTION1.
Si j'ai la donnée dans le premier fichier et pas dans le
second, alors faire ACTION2.
Si j'ai la donnée dans le second fichier et pas dans le
premier, alors faire ACTION3.

Troisième probleme : le fait de ne pas trouver une donnée du
premier fichier dans le second (et vice versa), peut on le faire
en meme temps ou vaut t'il mieux separer ces procedures ?

A la fin, il faudra avoir tout analyser.
Mon probleme est difficile, surtout a cause de la quantite de
données a traiter.
Je remercie beaucoup d'avance toute personne pouvant m'aider !

(J'ai essaye une macro venant de
http://www.excelabo.net/xl/comparer.php mais sans grand succes.)












Avatar
tictok
Pour info, la macro est dans le premier fichier.

Je viens de restester le code et j'ai rajoute le . devant le second Range
comme dit docm :
Set Rg = .Range("A1:A" & .Range("A8000").End(xlUp).Row)
et
Set Rg1 = .Range("A1:A" & .Range("A8000").End(xlUp).Row)
Ca marche toujours aussi mal.

Je ne comprends pas trop ta premiere question. Tu veux dire quand la
macros'execute ?
Ben, Excel "ne repond pas" (j'ai enleve Application.ScreenUpdating = False
pour voir l'evolution de la macro), et je ne peux donc voir ou en est la
macro

Pour la deuxieme question, la meme donnee a TRES PEU (voire aucune) chance
de se retrouver dans la meme ligne.
C'est pour ca que pour chaque code du premier fichier, il faudrait balayer
toute la colonne A du deuxieme fichier.
Cette methode serait evidemment tres longue mais au moins elle marcherait.
C'est celle employee par le code de michdenis ?


"Paul V." escreveu na mensagem
news:
On avance.

Quelle action vois tu si on est à la fois dans le deuxième et troisième
cas.


Autre question faut-il que la donnée dans A du premier classeur se
retrouve

dans la même ligne dans la deuxième classeur ou peut-elle se retrouver
dans

une autre ligne?


--
HTH

Paul V.

tictok wrote:
J'ai deux fichiers.
Ces fichiers ont plusieurs colonnes remplies.
Je veux comparer les colonnes A de chaque fichier.
Chaque cellule de la colonne A contient un code.
Quand j'ecris dans la colonne C, c'est exprès et je sais ce que je
fais. J'utilise la colonne E car elle n'est pas remplie et je peux
donc m'en servir.

Pour l'instant, je me base sur le second code donne par michdenis
(pas le premier !).
Mais j'ai du mal a comprendre pourquoi ca ne marche pas.

Pour repondre a ta question, on devrait se retrouver a la fois dans
les deuxiemes et troisiemes cas :
- deuxieme car il ne trouve pas "Toto"
- troisieme car il ne trouve pas "PasToto"
Si ca marche comme ca, c'est bon car pour moi Toto et PasToto sont
bien deux choses differentes !
Justement, le Application.Match fait bien une comparaison EXACTE ?

"Paul V." escreveu na mensagem
news:
Moi toujours pas comprendre.

Ok pour le début de ma comprenure ou compréhensivité. Je sais jamais.
Imaginons que dans le premier fichier tu ais Toto et dans le deuxième
fichier PasToto.
Est-on dans le deuxième cas ou le troisième. A mon avis, les deux ;-)
Alors que faire?

--
HTH

Paul V.

tictok wrote:
Bonjour Paul V.

- Les DEUX fichiers sont triés dans l'ordre croissant de la colonne
A, de la meme facon.
- Oui, les colonnes A a D contiennent des donnees. Je ne peux pas
trop modifier la structure de mes fichiers pour comparer.
- Oui et non. Je veux bien ecraser les valeurs, que la cellule ou
on va mettre la valeur (le premier ficheir donc) soit vide ou non.
- Je ne fais une comparaison que par rapport a la colonne A. Si les
colonnes B sont differentes, je m'en fous : je ne fais aucun manip
sur cette colonne B.

J'espere avoir bien repondu a tes questions.
Le code de michdenis n'a l'air pas mal, je vais le tester.

"Paul V." escreveu na mensagem
news:
Le problème est effectivement la quantité de données;

J'ai quelques questions.
Les données sont elles triées ?
Y a t-il autre chose dans les colonnes autres que C et E
Y a t-il toujours des données dans les deux fichiers pour les deux
classeurs?
Que faire si il y une donnée dans le premier qui n'est pas dans le
second fichier et que sur la même ligne il y a une donnée dans le
deuxième fichier qui n'est pas dans le premier?

--
HTH

Paul V.

tictok wrote:
Apres 10 minutes, la macro tournait toujours a 100% ... Je l'ai
arrete. :( Je ne veux pas avoir une liste des donnees uniques et
trouvees dans les deux fichiers.

Je vais preciser les ACTION 1,2,3 de mon premier message.
- SI je trouve la meme donnee dans les deux fichiers (comparaison
des colonnes A), ALORS (la donnee de la cellule de la colonne C du
premier fichier est egale a celle du second fichier) ET (ecrire
"OK" dans la cellule de la colonne E des deux fichiers ).
- SI je trouve la donnee dans le premier fichier et pas dans le
second, ALORS ecrire dans la cellule de la colonne E "CB".
- SI je trouve la donnee dans le second fichier et pas dans le
premier, ALORS ecrire dans la cellule de la colonne E "CaC".

Commme ca (si le programme marche bien), aucune cellule des
colonnes E de chaque fichier ne devrait etre vide. Chaque cellule
des colonnes E devrait contenir "OK" ou "CB" ou "Cac", mais ne
peut etre vide.

Je vais corser le probleme car je veux que la macro soit contenue
dans un fichier externe : de ce fichier contentant la macro, je
vais traiter les deux fichiers. Est-ce possible ?

Voila, c'est complique mais si ca marche, ah je sens que je ferai
chauffer le processeur comme il a jamais vu ! LOL

En attendant une reponse
Tictok

"michdenis" escreveu na mensagem
news:
Bonjour Titok,

Voici une procédure qui compare les colonnes A de 2 fichiers.

A ) les 2 fichiers doivent être ouverts.

B ) Remplace ceci "ThisWorkbook.Name" par le nom du classeur
dans le second appel .

C ) résultats dans le classeur contenant cette procédure dans la
feuille résultat qui sera ajouté

Colonne A contiendra : les données qui sont présentes dans les 2
fichiers Colonne B " " : les données uniques au
classeur contenant cette macro Colonne C " " : les
données uniques à l'autre classeur


'----------------------------------
Sub Comparer()

Dim Rg As Range, Rg1 As Range
Dim A As Long, B As Long
Dim X As Long, D As Long, G As Long
Dim Tblo As Variant, Tblo1 As Variant

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil1")
Set Rg = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil2")
Set Rg1 = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo1 = Rg1
End With

On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = False
On Error GoTo 0
Worksheets.Add.Name = "Résultat"

For A = 1 To UBound(Tblo, 1)
For B = 1 To UBound(Tblo, 2)
If IsError(Application.Match(Tblo(A, B), Tblo1, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
X = X + 1
Worksheets("Résultat").Range("B" & X) = Tblo(A, B)
On Error GoTo 0
Else
'Donnée est ds les 2 tableaux tblo = tblo1
'Appelle de ta procédure
G = G + 1
Worksheets("Résultat").Range("A" & G) = Tblo(A, B)
End If
Next
Next

'ON INVERSE, COMPARAISON FAITE À PARTIR DE L'AUTRE PLAGE

For A = 1 To UBound(Tblo1, 1)
For B = 1 To UBound(Tblo1, 2)
If IsError(Application.Match(Tblo1(A, B), Tblo, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
D = D + 1
Worksheets("Résultat").Range("C" & D) = Tblo1(A, B)
On Error GoTo 0
End If
Next
Next

Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------


Salutations!




"tictok" a écrit dans le message de
news:e$

Bonjour a tous.
J'ai quelques problemes (doux euphemisme il est vrai :D) pour
comparer la cellule A d'un fichier avec la cellule A d'autre.
Chaque fichier contient environ 27000 lignes, donc ce n'est pas
un petit fichier !
Les donnees des cellules a comparer sont des donnnees de type
texte (non des valeurs).
Je voudrais evidemment automatiser cette comparaison avec VBA.
Le temps d'execution en lui meme n'est pas trop genant. Si ca
dure des heures mais que ca marche c'est parfait !

Premier probleme : est t'il preferable de faire la comparaison
entre les deux fichiers ou de copier le contenu du second dans le
premier ? Ca ne me gene pas du tout de copier le contenu, j'ai un
PC assez puissant pour ca. C'est surtout pour un probleme de
vitesse d'execution et de stabilite.

Second probleme : j'ai differents cas :
Si je trouve la meme donnée dans les deux listes, alors faire
l'action ACTION1.
Si j'ai la donnée dans le premier fichier et pas dans le
second, alors faire ACTION2.
Si j'ai la donnée dans le second fichier et pas dans le
premier, alors faire ACTION3.

Troisième probleme : le fait de ne pas trouver une donnée du
premier fichier dans le second (et vice versa), peut on le faire
en meme temps ou vaut t'il mieux separer ces procedures ?

A la fin, il faudra avoir tout analyser.
Mon probleme est difficile, surtout a cause de la quantite de
données a traiter.
Je remercie beaucoup d'avance toute personne pouvant m'aider !

(J'ai essaye une macro venant de
http://www.excelabo.net/xl/comparer.php mais sans grand succes.)
















Avatar
michdenis
Bonjour Tictok,


" - SI je trouve la meme donnee dans les deux fichiers (comparaison des
colonnes A), ALORS (la donnee de la cellule de la colonne C du premier
fichier est egale a celle du second fichier) ET (ecrire "OK" dans la cellule
de la colonne E des deux fichiers )."

Ce que j'en comprends :

Si la cellule colonne A du Fichier 1 = cellule Colonne A fichier2

Je dois tester si la colonne c du fichier 1 sur la même ligne est égale à la cellule c du deuxième fichier sur la même
ligne

Si oui : Je dois mettre Ok dans la colonne E des 2 fichiers.

Si la cellule C1 du premier fichier est différent cellule C2 du deuxième fichier
Qu'est-ce qui se passe ?


C'est l'os dans la procédure ! ... sinon cela va fonctionner ... j'attends ta réponse pour la dernière mise à jour


Salutations!




"tictok" a écrit dans le message de news:
Apres 10 minutes, la macro tournait toujours a 100% ... Je l'ai arrete. :(
Je ne veux pas avoir une liste des donnees uniques et trouvees dans les deux
fichiers.

Je vais preciser les ACTION 1,2,3 de mon premier message.
- SI je trouve la meme donnee dans les deux fichiers (comparaison des
colonnes A), ALORS (la donnee de la cellule de la colonne C du premier
fichier est egale a celle du second fichier) ET (ecrire "OK" dans la cellule
de la colonne E des deux fichiers ).
- SI je trouve la donnee dans le premier fichier et pas dans le second,
ALORS ecrire dans la cellule de la colonne E "CB".
- SI je trouve la donnee dans le second fichier et pas dans le premier,
ALORS ecrire dans la cellule de la colonne E "CaC".

Commme ca (si le programme marche bien), aucune cellule des colonnes E de
chaque fichier ne devrait etre vide. Chaque cellule des colonnes E devrait
contenir "OK" ou "CB" ou "Cac", mais ne peut etre vide.

Je vais corser le probleme car je veux que la macro soit contenue dans un
fichier externe : de ce fichier contentant la macro, je vais traiter les
deux fichiers. Est-ce possible ?

Voila, c'est complique mais si ca marche, ah je sens que je ferai chauffer
le processeur comme il a jamais vu ! LOL

En attendant une reponse
Tictok

"michdenis" escreveu na mensagem
news:
Bonjour Titok,

Voici une procédure qui compare les colonnes A de 2 fichiers.

A ) les 2 fichiers doivent être ouverts.

B ) Remplace ceci "ThisWorkbook.Name" par le nom du classeur dans le
second appel .


C ) résultats dans le classeur contenant cette procédure dans la feuille
résultat qui sera ajouté


Colonne A contiendra : les données qui sont présentes dans les 2 fichiers
Colonne B " " : les données uniques au classeur contenant
cette macro

Colonne C " " : les données uniques à l'autre classeur


'----------------------------------
Sub Comparer()

Dim Rg As Range, Rg1 As Range
Dim A As Long, B As Long
Dim X As Long, D As Long, G As Long
Dim Tblo As Variant, Tblo1 As Variant

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil1")
Set Rg = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo = Rg
End With

With Workbooks(ThisWorkbook.Name).Worksheets("Feuil2")
Set Rg1 = .Range("A1:A" & Range("A65536").End(xlUp).Row)
Tblo1 = Rg1
End With

On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Résultat").Delete
Application.DisplayAlerts = False
On Error GoTo 0
Worksheets.Add.Name = "Résultat"

For A = 1 To UBound(Tblo, 1)
For B = 1 To UBound(Tblo, 2)
If IsError(Application.Match(Tblo(A, B), Tblo1, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
X = X + 1
Worksheets("Résultat").Range("B" & X) = Tblo(A, B)
On Error GoTo 0
Else
'Donnée est ds les 2 tableaux tblo = tblo1
'Appelle de ta procédure
G = G + 1
Worksheets("Résultat").Range("A" & G) = Tblo(A, B)
End If
Next
Next

'ON INVERSE, COMPARAISON FAITE À PARTIR DE L'AUTRE PLAGE

For A = 1 To UBound(Tblo1, 1)
For B = 1 To UBound(Tblo1, 2)
If IsError(Application.Match(Tblo1(A, B), Tblo, 0)) Then
'donnée ds tblo n'existe pas dans tblo1)
'Appelle de ta procédure Exemple pour faire copie
'Dans la feuille résultat de la données du claseur
'où est écrite la macro
D = D + 1
Worksheets("Résultat").Range("C" & D) = Tblo1(A, B)
On Error GoTo 0
End If
Next
Next

Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------


Salutations!




"tictok" a écrit dans le message de
news:e$

Bonjour a tous.
J'ai quelques problemes (doux euphemisme il est vrai :D) pour comparer la
cellule A d'un fichier avec la cellule A d'autre. Chaque fichier contient
environ 27000 lignes, donc ce n'est pas un petit fichier !
Les donnees des cellules a comparer sont des donnnees de type texte (non
des

valeurs).
Je voudrais evidemment automatiser cette comparaison avec VBA.
Le temps d'execution en lui meme n'est pas trop genant. Si ca dure des
heures mais que ca marche c'est parfait !

Premier probleme : est t'il preferable de faire la comparaison entre les
deux fichiers ou de copier le contenu du second dans le premier ?
Ca ne me gene pas du tout de copier le contenu, j'ai un PC assez puissant
pour ca. C'est surtout pour un probleme de vitesse d'execution et de
stabilite.

Second probleme : j'ai differents cas :
Si je trouve la meme donnée dans les deux listes, alors faire l'action
ACTION1.
Si j'ai la donnée dans le premier fichier et pas dans le second, alors
faire ACTION2.
Si j'ai la donnée dans le second fichier et pas dans le premier, alors
faire ACTION3.

Troisième probleme : le fait de ne pas trouver une donnée du premier
fichier

dans le second (et vice versa), peut on le faire en meme temps ou vaut
t'il

mieux separer ces procedures ?

A la fin, il faudra avoir tout analyser.
Mon probleme est difficile, surtout a cause de la quantite de données a
traiter.
Je remercie beaucoup d'avance toute personne pouvant m'aider !

(J'ai essaye une macro venant de http://www.excelabo.net/xl/comparer.php
mais sans grand succes.)





1 2