OVH Cloud OVH Cloud

Comparaison 2 fichiers xls : trouver les ajouts

12 réponses
Avatar
Phullbrick
Toute d'abord bonjour !

mon probl=E8me, j'extrais des donn=E9es d'une base online que je
sauvegarde chaque jour dans une feuille excel diff=E9rente

ex data24012005.xls et data25012005.xls

La structure du tableau (plusieurs colonnes) est tjrs la m=EAme.
Simplement, chaque jour mon fichier sauvegard=E9 est enrichi de
nouvelles donn=E9es en plus des pr=E9c=E9dentes, donc plus de lignes.

Je souhaiterais comparer celui du jour =E0 celui de la veille et
extraire dans une feuille ce qui est nouveau entre les deux avec les
les donn=E9es compl=E8tes nouvelles.
Pouvez-vous m'aider ?

D'avancer merci !

Phull

10 réponses

1 2
Avatar
Daniel
Bonjour.
Peux-tu préciser si la comparaison doit se faire sur l'ensemble de la ligne
ou sur une cellule spécifique de la ligne ?
Cordialement.
Daniel
"Phullbrick" a écrit dans le message de news:

Toute d'abord bonjour !

mon problème, j'extrais des données d'une base online que je
sauvegarde chaque jour dans une feuille excel différente

ex data24012005.xls et data25012005.xls

La structure du tableau (plusieurs colonnes) est tjrs la même.
Simplement, chaque jour mon fichier sauvegardé est enrichi de
nouvelles données en plus des précédentes, donc plus de lignes.

Je souhaiterais comparer celui du jour à celui de la veille et
extraire dans une feuille ce qui est nouveau entre les deux avec les
les données complètes nouvelles.
Pouvez-vous m'aider ?

D'avancer merci !

Phull
Avatar
Phullbrick
la comparaison doit se faire sur l'ensemble des 2 feuilles et ne
m'extraire que la ligne (avec toutes les colonnes) qui est nouvelle

actuellement j'utilise access en fusionnant mes deux fichiers dans un
seul que j'importe sous access, puis une query avec comptage sur une
colonne et affichage uniquement si compte = 1 ce qui signifie que la
valeur est unique dans la table

si je pouvais automatiser cela sous excel ça serait beaucoup plein
chouette ;-D
Avatar
Phullbrick
j'ai répondu trop vite et mal lu ton message, mea culpa

la comparaison doit se faire une seule cellule de la ligne, disons A1.

c'est une liste de clients :

1. chaque semaine apparaissent de nouveaux clients
2. le chiffre des clients augmentent aussi chaque jour

ce que je cherche à extraire ce sont les nouveaux clients donc le
point 1. et meilleure façon est de surveiller l'apparition d'un
nouveau compte client en cellule A1

merci :)
Avatar
Daniel
Bonjour.
Avec un peu de chance, le code suivant peut faire l'affaire :
FV.xls est le classeur veille, FJ.xls le classeur jour et classeur4.xls le
classeur résultat.

Sub Test()
Dim c As Range, Ctr As Integer
Workbooks("classeur4.xls").Activate
Range("A1").Select
Workbooks("FJ.xls").Activate
For Each c In Range("A:A")
Workbooks("FV.xls").Activate
Ctr = WorksheetFunction.CountIf(Range("A:A"), c.Value)
If Ctr = 0 Then
Workbooks("classeur4.xls").Activate
Range(ActiveCell, ActiveCell.Offset(0, 4)).Value = Range(c,
c.Offset(0, 4)).Value
ActiveCell.Offset(1, 0).Select
End If
If c.Value = "" Then Exit Sub
Next c
End Sub

Cordialement.
Daniel
"Phullbrick" a écrit dans le message de news:

Toute d'abord bonjour !

mon problème, j'extrais des données d'une base online que je
sauvegarde chaque jour dans une feuille excel différente

ex data24012005.xls et data25012005.xls

La structure du tableau (plusieurs colonnes) est tjrs la même.
Simplement, chaque jour mon fichier sauvegardé est enrichi de
nouvelles données en plus des précédentes, donc plus de lignes.

Je souhaiterais comparer celui du jour à celui de la veille et
extraire dans une feuille ce qui est nouveau entre les deux avec les
les données complètes nouvelles.
Pouvez-vous m'aider ?

D'avancer merci !

Phull
Avatar
anomymousA
bonjour,

je voudrais compléter. to code fonctionne sans problème. On pourrait peut
etre le rendre encore plus performant en evitant les accès fréquents aux
fichiers par la méthode activate que tu fais dans ta boucle for next.
Le gain de temps peut être important lorsqu'il y a beaucoup d'éléments à
comparer.Sur un essai de 1000 elements à rechercher parmi 1000 elements, le
temps entre une macro qui accède frequemment aux classeurs et une autre qui
fait sans accès est de 1 à 6 sur ma machine ( 3s pour le 1er pour 0.5s dans
le 2nd).

le code possible pourrait être le suivant p.e si on considère qu'on compare
les cellules d ela colonne A de chaque fichier et qu'on envoie le résultat
dans la colonne A du fichier reception

Workbooks("fichancien.xls").Activate
Set rngA = Workbooks("fichancien.xls").Sheets(1).Range(Cells(1, 1),
Cells(Rows.Count, 1).End(xlUp))
Workbooks("fichnouveau.xls").Activate
Set rngB = Workbooks("fichnouveau.xls").Sheets(1).Range(Cells(1, 1),
Cells(Rows.Count, 1).End(xlUp))

rw = 1
For Each cell In rngB
If Application.CountIf(rngA, cell.Value) = 0 Then
Workbooks("reception.xls").Sheets(1).Cells(rw, 1).Value = cell.Value
rw = rw + 1
End If
Next

Par contre, je confirme que ces opérations de comparaison sont toujours plus
rapides par CountIf ( NB.SI) que par Vlookup (RECHERCHEV).

A+


Bonjour.
Avec un peu de chance, le code suivant peut faire l'affaire :
FV.xls est le classeur veille, FJ.xls le classeur jour et classeur4.xls le
classeur résultat.

Sub Test()
Dim c As Range, Ctr As Integer
Workbooks("classeur4.xls").Activate
Range("A1").Select
Workbooks("FJ.xls").Activate
For Each c In Range("A:A")
Workbooks("FV.xls").Activate
Ctr = WorksheetFunction.CountIf(Range("A:A"), c.Value)
If Ctr = 0 Then
Workbooks("classeur4.xls").Activate
Range(ActiveCell, ActiveCell.Offset(0, 4)).Value = Range(c,
c.Offset(0, 4)).Value
ActiveCell.Offset(1, 0).Select
End If
If c.Value = "" Then Exit Sub
Next c
End Sub

Cordialement.
Daniel
"Phullbrick" a écrit dans le message de news:

Toute d'abord bonjour !

mon problème, j'extrais des données d'une base online que je
sauvegarde chaque jour dans une feuille excel différente

ex data24012005.xls et data25012005.xls

La structure du tableau (plusieurs colonnes) est tjrs la même.
Simplement, chaque jour mon fichier sauvegardé est enrichi de
nouvelles données en plus des précédentes, donc plus de lignes.

Je souhaiterais comparer celui du jour à celui de la veille et
extraire dans une feuille ce qui est nouveau entre les deux avec les
les données complètes nouvelles.
Pouvez-vous m'aider ?

D'avancer merci !

Phull





Avatar
AV
Par contre, je confirme que ces opérations de comparaison sont toujours plus
rapides par CountIf ( NB.SI) que par Vlookup (RECHERCHEV).


Mais moins que par Match (EQUIV)
;-)
AV

Avatar
anomymousA
bonjour,

non, 0.85s pour match et 0.53s pour count.if.
record battu. ceci dit, peut être il y a plus peut etre plus rapide en
bricolant mieux le code que je me suis fait pour comprarer avec la fonction
match

For Each cell In rngB

On Error Resume Next
Myvar = Application.WorksheetFunction.Match(cell.Value, rngA, 0)

If Err.Number <> 0 Then
Err.Clear
Workbooks("reception.xls").Sheets(1).Cells(rw, 1).Value = cell.Value
rw = rw + 1
End If
Next

une idée surement ?

A+


Par contre, je confirme que ces opérations de comparaison sont toujours plus
rapides par CountIf ( NB.SI) que par Vlookup (RECHERCHEV).


Mais moins que par Match (EQUIV)
;-)
AV






Avatar
AV
une idée surement ?


Peut-être sans traiter l'erreur :

For Each cell In [rngB]
If Not IsNumeric(Application.Match(cell.Value, [rngA], 0)) Then
'blabla
Next

Sur 1000 cellules ça met (à vue de nez et sur ma bécane) 2s ..mais j'ai la
flemme de tester précisément ...

AV

Avatar
anonymousA
re,

finalement, j'y comprends pas grand chose puisque j'ai refait un esai
avec une autre liste de données et là , oh miracle , MATCH a battu countif.
puet-être qu'au dela d'un certain nombre de données, les courbes de
réponse en temps n'étant pas linéaires, MATCH finit par battre COUNTIF.
Va savoir.
Sujet intéréssant intellectuellement parlant cependant.

A+



une idée surement ?



Peut-être sans traiter l'erreur :

For Each cell In [rngB]
If Not IsNumeric(Application.Match(cell.Value, [rngA], 0)) Then
'blabla
Next

Sur 1000 cellules ça met (à vue de nez et sur ma bécane) 2s ..mais j'ai la
flemme de tester précisément ...

AV





Avatar
AV
Perso, je ne trouve aucun cas de figure (difficile évidemment de faire des tests
totalement exhaustifs..) où COUNTIF et plus rapide que MATCH
Plus la plage est grande et plus l'écart est flagrant

AV
1 2