comparer deux feuilles excel

6 réponses
Avatar
claude
bonjour (soir ) à tous
j'aimagine que ma question est récurrente ...
j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
feuille

j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille, mais
j'ai peur que çà soit très long pour plusieurs milliers de lignes
correct ou çà va durer des heures ???

merci d'avance
claude

6 réponses

Avatar
Papyjac
Bonjour Claude

Pour ce type de problème j'utilise la méthode suivante :
1. Je me positionne dans l'onglet source
2. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T1 en
mémoire
3. Je me positionne dans l'onglet cible
4. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T2 en
mémoire
5. Je comprare en mémoire les colonnes que je souhaite et détecte les
différences ou les ressemblances
6. Je restitue le résultat dans l'onglet cible (ou source) mais il faut
éviter d'utiliser une couleur, mieux vaut ajouter une colonne résultat VRAI
ou faux
7. Tu exploites manuellement ce résultat à ta convenance avec des tri des
filtres ....

Je n'ai rien trouvé de plus performant car je ne lit qu'une seule fois
chaque onglet
Et la comparaison en mémoire est quasi immédiate
Bien penser à supprimer le mode de calcul automatique et le raffrachissement
d'écran


--
Papyjac


"claude" a écrit :

bonjour (soir ) à tous
j'aimagine que ma question est récurrente ...
j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
feuille

j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille, mais
j'ai peur que çà soit très long pour plusieurs milliers de lignes
correct ou çà va durer des heures ???

merci d'avance
claude





Avatar
claude
bonne idée
merci
;-))
claude


"Papyjac" a écrit dans le message de
news:
Bonjour Claude

Pour ce type de problème j'utilise la méthode suivante :
1. Je me positionne dans l'onglet source
2. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T1
en
mémoire
3. Je me positionne dans l'onglet cible
4. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T2
en
mémoire
5. Je comprare en mémoire les colonnes que je souhaite et détecte les
différences ou les ressemblances
6. Je restitue le résultat dans l'onglet cible (ou source) mais il faut
éviter d'utiliser une couleur, mieux vaut ajouter une colonne résultat
VRAI
ou faux
7. Tu exploites manuellement ce résultat à ta convenance avec des tri des
filtres ....

Je n'ai rien trouvé de plus performant car je ne lit qu'une seule fois
chaque onglet
Et la comparaison en mémoire est quasi immédiate
Bien penser à supprimer le mode de calcul automatique et le
raffrachissement
d'écran


--
Papyjac


"claude" a écrit :

bonjour (soir ) à tous
j'aimagine que ma question est récurrente ...
j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
feuille

j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille,
mais
j'ai peur que çà soit très long pour plusieurs milliers de lignes
correct ou çà va durer des heures ???

merci d'avance
claude







Avatar
claude
merci de l'idée
en fait j'ai essayé par le méthode find en jonglant d'une feuille à l'autre
excel est tellement puissant que çà ne prend pas beaucoup de temps

mais c'est toujours bon de comparer les idées
et puis le simple fait d'exposer son problème permet d'avancer
:--))
claude





"Papyjac" a écrit dans le message de
news:
Bonjour Claude

Pour ce type de problème j'utilise la méthode suivante :
1. Je me positionne dans l'onglet source
2. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T1
en
mémoire
3. Je me positionne dans l'onglet cible
4. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T2
en
mémoire
5. Je comprare en mémoire les colonnes que je souhaite et détecte les
différences ou les ressemblances
6. Je restitue le résultat dans l'onglet cible (ou source) mais il faut
éviter d'utiliser une couleur, mieux vaut ajouter une colonne résultat
VRAI
ou faux
7. Tu exploites manuellement ce résultat à ta convenance avec des tri des
filtres ....

Je n'ai rien trouvé de plus performant car je ne lit qu'une seule fois
chaque onglet
Et la comparaison en mémoire est quasi immédiate
Bien penser à supprimer le mode de calcul automatique et le
raffrachissement
d'écran


--
Papyjac


"claude" a écrit :

bonjour (soir ) à tous
j'aimagine que ma question est récurrente ...
j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
feuille

j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille,
mais
j'ai peur que çà soit très long pour plusieurs milliers de lignes
correct ou çà va durer des heures ???

merci d'avance
claude







Avatar
Fredo P
JB n'étant pas la pour te répondre, trois routine de sa composition
Sub ComparaisonChamp()
t = Timer()
Application.ScreenUpdating = False
Set MonDico1 = CreateObject("Scripting.Dictionary")
Set MonDico2 = CreateObject("Scripting.Dictionary")
Workbooks("classeur1.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico1.Exists(C.Value) Then MonDico1.Add C.Value, C.Address
Next
Workbooks("classeur2.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico2.Exists(C.Value) Then MonDico2.Add C.Value, C.Address
Next
Workbooks("classeur1.xls").Activate
For Each e In MonDico1
Range(MonDico1.Item(e)).Font.Color = IIf(MonDico2.Exists(e), vblack,
vbRed)
Next
[C1] = Timer - t
Application.ScreenUpdating = True
MsgBox Timer() - t
End Sub

Sub ComparaisonColonne()
t = Timer()
F = 1 'no feuille
Application.ScreenUpdating = False
Set MonDico1 = CreateObject("Scripting.Dictionary")
Set MonDico2 = CreateObject("Scripting.Dictionary")
Workbooks("classeur1.xls").Activate
For Each C In
Sheets(F).Range("A1:A450").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico1.Exists(C.Value) Then MonDico1.Add C.Value, C.Address
Next
Workbooks("classeur2.xls").Activate
Sheets(F).Activate
For Each C In
Sheets(F).Range("A1:A450").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico2.Exists(C.Value) Then MonDico2.Add C.Value, C.Address
Next

Workbooks("classeur1.xls").Activate
Sheets(F).Activate
For Each e In MonDico1
If Not MonDico2.Exists(e) Then
Range(MonDico1.Item(e)).Font.Color = vbRed
Else
Range(MonDico1.Item(e)).Font.Color = vbBlack
End If
Next
Application.ScreenUpdating = True
[C1] = Timer - t
MsgBox Timer() - t
End Sub
Sub ComparaisonChamptriple()
t = Timer()
Application.ScreenUpdating = False
Set MonDico1 = CreateObject("Scripting.Dictionary")
Set MonDico2 = CreateObject("Scripting.Dictionary")
Workbooks("classeur1.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico1.Exists(C.Value) Then MonDico1.Add C.Value, C.Address
Next
Workbooks("classeur2.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico2.Exists(C.Value) Then MonDico2.Add C.Value, C.Address
Next
"claude" a écrit dans le message de news:
4937096f$0$8428$
merci de l'idée
en fait j'ai essayé par le méthode find en jonglant d'une feuille à
l'autre
excel est tellement puissant que çà ne prend pas beaucoup de temps

mais c'est toujours bon de comparer les idées
et puis le simple fait d'exposer son problème permet d'avancer
:--))
claude





"Papyjac" a écrit dans le message de
news:
Bonjour Claude

Pour ce type de problème j'utilise la méthode suivante :
1. Je me positionne dans l'onglet source
2. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T1
en
mémoire
3. Je me positionne dans l'onglet cible
4. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T2
en
mémoire
5. Je comprare en mémoire les colonnes que je souhaite et détecte les
différences ou les ressemblances
6. Je restitue le résultat dans l'onglet cible (ou source) mais il faut
éviter d'utiliser une couleur, mieux vaut ajouter une colonne résultat
VRAI
ou faux
7. Tu exploites manuellement ce résultat à ta convenance avec des tri
des
filtres ....

Je n'ai rien trouvé de plus performant car je ne lit qu'une seule fois
chaque onglet
Et la comparaison en mémoire est quasi immédiate
Bien penser à supprimer le mode de calcul automatique et le
raffrachissement
d'écran


--
Papyjac


"claude" a écrit :

bonjour (soir ) à tous
j'aimagine que ma question est récurrente ...
j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
feuille

j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille,
mais
j'ai peur que çà soit très long pour plusieurs milliers de lignes
correct ou çà va durer des heures ???

merci d'avance
claude











Avatar
Papyjac
Bonjour claude

Il y a toujours plusieurs solutions pour résoudre une question. La meilleure
solution est celle qu'on maitrise soi-même

En ce qui concerne la performance, elle est surtout due à ton micro plutôt
qu'à Excel. Mais j'ai constaté que certaines fonctions simples d'excel était
très gourmante en VBA (par exemple les motifs) quand on les exécute des
milliers de fois.
Mais même si ça prend quelques minutes, c'est toujours mieux que de faire
soi-même des milliers de clic

Au plaisir de te rendre service ultérieurement

--
Papyjac


"claude" a écrit :

merci de l'idée
en fait j'ai essayé par le méthode find en jonglant d'une feuille à l'autre
excel est tellement puissant que çà ne prend pas beaucoup de temps

mais c'est toujours bon de comparer les idées
et puis le simple fait d'exposer son problème permet d'avancer
:--))
claude





"Papyjac" a écrit dans le message de
news:
> Bonjour Claude
>
> Pour ce type de problème j'utilise la méthode suivante :
> 1. Je me positionne dans l'onglet source
> 2. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T1
> en
> mémoire
> 3. Je me positionne dans l'onglet cible
> 4. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T2
> en
> mémoire
> 5. Je comprare en mémoire les colonnes que je souhaite et détecte les
> différences ou les ressemblances
> 6. Je restitue le résultat dans l'onglet cible (ou source) mais il faut
> éviter d'utiliser une couleur, mieux vaut ajouter une colonne résultat
> VRAI
> ou faux
> 7. Tu exploites manuellement ce résultat à ta convenance avec des tri des
> filtres ....
>
> Je n'ai rien trouvé de plus performant car je ne lit qu'une seule fois
> chaque onglet
> Et la comparaison en mémoire est quasi immédiate
> Bien penser à supprimer le mode de calcul automatique et le
> raffrachissement
> d'écran
>
>
> --
> Papyjac
>
>
> "claude" a écrit :
>
>> bonjour (soir ) à tous
>> j'aimagine que ma question est récurrente ...
>> j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
>> j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
>> feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
>> feuille
>>
>> j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille,
>> mais
>> j'ai peur que çà soit très long pour plusieurs milliers de lignes
>> correct ou çà va durer des heures ???
>>
>> merci d'avance
>> claude
>>
>>
>>





Avatar
claude
bonjour
impressionnantes les macros
merci beaucoup
:-)))
claude



"Fredo P" a écrit dans le
message de news:
JB n'étant pas la pour te répondre, trois routine de sa composition
Sub ComparaisonChamp()
t = Timer()
Application.ScreenUpdating = False
Set MonDico1 = CreateObject("Scripting.Dictionary")
Set MonDico2 = CreateObject("Scripting.Dictionary")
Workbooks("classeur1.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico1.Exists(C.Value) Then MonDico1.Add C.Value,
C.Address
Next
Workbooks("classeur2.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico2.Exists(C.Value) Then MonDico2.Add C.Value,
C.Address
Next
Workbooks("classeur1.xls").Activate
For Each e In MonDico1
Range(MonDico1.Item(e)).Font.Color = IIf(MonDico2.Exists(e),
vblack, vbRed)
Next
[C1] = Timer - t
Application.ScreenUpdating = True
MsgBox Timer() - t
End Sub

Sub ComparaisonColonne()
t = Timer()
F = 1 'no feuille
Application.ScreenUpdating = False
Set MonDico1 = CreateObject("Scripting.Dictionary")
Set MonDico2 = CreateObject("Scripting.Dictionary")
Workbooks("classeur1.xls").Activate
For Each C In
Sheets(F).Range("A1:A450").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico1.Exists(C.Value) Then MonDico1.Add C.Value,
C.Address
Next
Workbooks("classeur2.xls").Activate
Sheets(F).Activate
For Each C In
Sheets(F).Range("A1:A450").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico2.Exists(C.Value) Then MonDico2.Add C.Value,
C.Address
Next

Workbooks("classeur1.xls").Activate
Sheets(F).Activate
For Each e In MonDico1
If Not MonDico2.Exists(e) Then
Range(MonDico1.Item(e)).Font.Color = vbRed
Else
Range(MonDico1.Item(e)).Font.Color = vbBlack
End If
Next
Application.ScreenUpdating = True
[C1] = Timer - t
MsgBox Timer() - t
End Sub
Sub ComparaisonChamptriple()
t = Timer()
Application.ScreenUpdating = False
Set MonDico1 = CreateObject("Scripting.Dictionary")
Set MonDico2 = CreateObject("Scripting.Dictionary")
Workbooks("classeur1.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico1.Exists(C.Value) Then MonDico1.Add C.Value,
C.Address
Next
Workbooks("classeur2.xls").Activate
For Each C In
Sheets(1).Range("A1:B5000").SpecialCells(xlCellTypeConstants, 23)
If Not MonDico2.Exists(C.Value) Then MonDico2.Add C.Value,
C.Address
Next
"claude" a écrit dans le message de news:
4937096f$0$8428$
merci de l'idée
en fait j'ai essayé par le méthode find en jonglant d'une feuille à
l'autre
excel est tellement puissant que çà ne prend pas beaucoup de temps

mais c'est toujours bon de comparer les idées
et puis le simple fait d'exposer son problème permet d'avancer
:--))
claude





"Papyjac" a écrit dans le message de
news:
Bonjour Claude

Pour ce type de problème j'utilise la méthode suivante :
1. Je me positionne dans l'onglet source
2. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T1
en
mémoire
3. Je me positionne dans l'onglet cible
4. Je stocke en mémoire les colonnes dont j'ai besoin dans un tableau T2
en
mémoire
5. Je comprare en mémoire les colonnes que je souhaite et détecte les
différences ou les ressemblances
6. Je restitue le résultat dans l'onglet cible (ou source) mais il faut
éviter d'utiliser une couleur, mieux vaut ajouter une colonne résultat
VRAI
ou faux
7. Tu exploites manuellement ce résultat à ta convenance avec des tri
des
filtres ....

Je n'ai rien trouvé de plus performant car je ne lit qu'une seule fois
chaque onglet
Et la comparaison en mémoire est quasi immédiate
Bien penser à supprimer le mode de calcul automatique et le
raffrachissement
d'écran


--
Papyjac


"claude" a écrit :

bonjour (soir ) à tous
j'aimagine que ma question est récurrente ...
j'ai deux feuilles contenant pas mal de lignes (plusieurs milliers)
j'aimerai écrire une macro qui parte d'une feuille, aille dans l'autre
feuille marquer (en couleur par exemple) ceux qui ne sont pas dans la
feuille

j'ai pensé à boucler sur chaque ligne avec un find sur l'autre feuille,
mais
j'ai peur que çà soit très long pour plusieurs milliers de lignes
correct ou çà va durer des heures ???

merci d'avance
claude