Comparer deux fichierx excel et traitement des lignes

OOLIVE

XLDnaute Occasionnel
Bonjour à tous,

Je vais essayer d'expliquer mon besoin en espérant qu'il intéresse l'un d'entre vous :)

Toutes les semaines, je reçois un fichier ayant plus de 3000 lignes à traiter... L'objectif est de trouver facilement les modifications qui ont pu être faite entre la semaine avant et la semaine actuelle.. Dans mon fichier, cela correspond à :

Semaine S-1 : V010115
Semaine S : V140115.

Le fichier de la semaine S-1 a déjà été intégrée dans ma base de donnée et j'aimerais mettre en place une macro permettant de comparer les deux fichiers pour savoir qu'est ce qui a changé..

Les éléments clés sont : la colonne A (Info) et la colonne E (To_DO).

L'idée est que:

Si les données des colonnes A & E sont présentes dans les deux onglets et identiques , on supprime la ligne (pas besoin de réintégrer 2 fois la ligne),

Si les données des colonnes A & E sont présentes dans les deux onglets mais pas identiques, on garde les données de l'onglet V14015 (On intègre les modifications dans la base de données)

Si les données des colonnes A & E sont présentes dans l'onglet V010115 et pas dans le nouveau, on supprime la ligne (car les données ne sont plus utiles),
Si les données des colonnes A & E sont présentes dans le nouveau et pas dans V010115, on garde la ligne (nouveauté à intégrer dans la base)..

Je vous ai mis un fichier avec... Le résultat souhaité est celui présenté dans l'onglet "Import"..

Merci d'avance à celui ou ceux qui voudront m'aider :)

Olivier.
 

Pièces jointes

  • Test.xlsx
    9.6 KB · Affichages: 34
  • Test.xlsx
    9.6 KB · Affichages: 42
  • Test.xlsx
    9.6 KB · Affichages: 38

OOLIVE

XLDnaute Occasionnel
Re : Comparer deux fichierx excel et traitement des lignes

Bonjour à tous,

Je fais suite à mon message puisque personne ne me répond :/

Je cherche pas à ce que quelqu'un fasse le code à ma place.. Mais si quelqu'un pouvait me donner des pistes à suivre, ca serait super..

Je ne sais pas du tout comment attaquer mon problème!

Merci à vous & bonne journée
 

laurent950

XLDnaute Accro
Re : Comparer deux fichierx excel et traitement des lignes

Bonjour,

Cela devrais être bon, j'ai laisser décomposé cette macro

Voici le code source :


VB:
Sub test()

' Semaine - 1 (V010115)
Dim Fsmoin1 As Worksheet
Set Fsmoin1 = Worksheets("V010115")
Dim TabFsmoin1() As Variant
TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(6, 4))

' Semaine en cours (V140115)
Dim Fs As Worksheet
Set Fs = Worksheets("V140115")
Dim TabFs() As Variant
TabFs = Fs.Range(Fs.Cells(2, 1), Fs.Cells(6, 4))

' Creation d'un Nouveau tableau regroupant les 2
Dim TabRes() As Variant
ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 7)
Dim cpt, i As Integer
cpt = 0

' Semaine - 1 (V010115)
For i = 1 To UBound(TabFsmoin1, 1)
    For j = 1 To UBound(TabFsmoin1, 2)
        TabRes(i, 1) = Fsmoin1.Name
        TabRes(i, j + 1) = TabFsmoin1(i, j)
    Next j
Next i

' Semaine en cours (V140115)
For i = UBound(TabFs, 1) + 1 To UBound(TabRes, 1)
    For j = 1 To UBound(TabFs, 2)
        TabRes(i, 1) = Fs.Name
        TabRes(i, j + 1) = TabFs(i - UBound(TabFs, 1), j)
    Next j
Next i

' Les conditions (Doublon pour identique)
For i = 1 To UBound(TabRes, 1)
    For j = i + 1 To UBound(TabRes, 1)
        If TabRes(i, 2) & TabRes(i, 5) = TabRes(j, 2) & TabRes(j, 5) Then
            TabRes(j, 7) = "Identique"
        End If
    Next j
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' Les conditions (Difference)
For i = 1 To UBound(TabRes, 1)
    For j = i + 1 To UBound(TabRes, 1)
        If TabRes(i, 2) = TabRes(j, 2) And TabRes(i, 5) <> TabRes(j, 5) Then
            TabRes(j, 7) = "Modifier"
        End If
    Next j
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' Les conditions (suprimer)
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 1) = Fsmoin1.Name And TabRes(i, 7) = "" Then
        TabRes(i, 7) = "suprimer"
    End If
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' Les conditions (crée)
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 1) = Fs.Name And TabRes(i, 7) = "" Then
        TabRes(i, 7) = "crée"
    End If
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' colle les données dans le tableau
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 7) <> "suprimer" And TabRes(i, 7) <> "Modifier" Then
        cpt = cpt + 1
    End If
Next i

' Tableau restitution final annalyse
' Creation d'un Nouveau tableau regroupant les 2
Dim TabFinal() As Variant
ReDim TabFinal(1 To cpt, 1 To 5)
cpt = 1

' colle les données dans le tableau
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 7) = "crée" Or TabRes(i, 7) = "Modifier" Then
        TabFinal(cpt, 1) = TabRes(i, 2)
        TabFinal(cpt, 2) = TabRes(i, 3)
        TabFinal(cpt, 3) = TabRes(i, 4)
        TabFinal(cpt, 4) = TabRes(i, 5)
        TabFinal(cpt, 5) = TabRes(i, 7)
        cpt = cpt + 1
    End If
Next i

Cells(2, 7).Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal

End Sub

Ps : a tester sur plus de ligne.

Laurent
 

Pièces jointes

  • Test (3).xlsm
    27 KB · Affichages: 42
  • Test (3).xlsm
    27 KB · Affichages: 54
  • Test (3).xlsm
    27 KB · Affichages: 56

OOLIVE

XLDnaute Occasionnel
Re : Comparer deux fichierx excel et traitement des lignes

Bonjour Laurent,

Merci pour ta réponse.. Effectivement, comme j'avais précisé, j'étais loin d'attaquer le problème de la bonne façon...
Je test ça en début d'après midi et reviendrais vers toi pour t'informer.

Merci mille fois :)
 

gosselien

XLDnaute Barbatruc
Re : Comparer deux fichierx excel et traitement des lignes

Bonjour,

très belle manière d'expliquer un code bien clair !
j'applaudis et j'étudie ce code

une question déjà (par curiosité)

ici:

TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(6, 4))

pourquoi ne pas chercher de A2 à la dernière cellule de la colonne D au cas (très probable) où la liste s'allonge des 2 côtés ?


Patrick
 
Dernière édition:

laurent950

XLDnaute Accro
Re : Comparer deux fichierx excel et traitement des lignes

Bonjour goselien,

effectivement j'aurais pu faire cela :
VB:
' Methode 1
DernLigne = Range("A65536").End(xlUp).Row
DernCol = Range("A1").End(xlToRight).Column

' Methode 2
DernLigne = Cells(65536, 1).End(xlUp).Row
DernCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

' Soit
MsgBox Fsmoin1.Cells(65536, 1).End(xlUp).Row - 1
MsgBox Fsmoin1.Cells(1, Fsmoin1.Cells.Columns.Count).End(xlToLeft).Column
TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(Cells(65536, 1).End(xlUp).Row, Fsmoin1.Cells(1, Fsmoin1.Cells.Columns.Count).End(xlToLeft).Column))
 
Dernière édition:

OOLIVE

XLDnaute Occasionnel
Re : Comparer deux fichierx excel et traitement des lignes

Bonjour vous deux,

j'ai apporté une modification justement là dessus en intégrant une variable car mon fichier était qu'un aperçu... Mon fichier a en fait 44 colonnes et x lignes :

Dim derlig5 as Long
derlig5 = Range("AM65536").End(xlUp).Row
' Semaine - 1 (V010115)
Dim Fsmoin1 As Worksheet

Set Fsmoin1 = Worksheets("TIERS150115")
Dim TabFsmoin1() As Variant
TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(derlig5, 44))


Par contre, je rencontre un problème à ce niveau :

' Creation d'un Nouveau tableau regroupant les 2
Dim TabRes() As Variant
ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 7)
Dim cpt, i As Integer
cpt = 0

' Semaine - 1 (V010115)
For i = 1 To UBound(TabFsmoin1, 1)
For j = 1 To UBound(TabFsmoin1, 2)
TabRes(i, 1) = Fsmoin1.Name
TabRes(i, j + 1) = TabFsmoin1(i, j)
Next j
Next i

Il m'indique que l'indice n'appartient pas à la selection.. Ca ne serait pas lié à la ligne : ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 7) ?
 

laurent950

XLDnaute Accro
Re : Comparer deux fichierx excel et traitement des lignes

ici la redimension du tableau soit
ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 7) = 7 est égale au 4 colonne D'origine + 3
il faut donc 44 colonne + 3
ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 47)

I faut Modifier la macro les référence pour prendre en compte votre nouveau c'est à adapter mais le principe
est là
 

OOLIVE

XLDnaute Occasionnel
Re : Comparer deux fichierx excel et traitement des lignes

D'accord.. Je t'avoue que je cherche tant bien que mal à comprendre et modifier là..

C'est la première fois que je sollicite autant VBA dans ces codes.. et ca m'échappe royalement !

Je continue de chercher à modifier et je reviendrais vers toi si jamais je n'y arrive pas.. tu es ok avec ça ?
 

gosselien

XLDnaute Barbatruc
Re : Comparer deux fichierx excel et traitement des lignes

Si ça peut te consoler, je fais un "peu" de vba, et moi aussi je patauge; je cherche d'ailleurs à changer le nombre de lignes dans les 2 tableau et donc le code du début...Ca pourrait me servir :)
j'aime bien ce code sans tout comprendre à cause (notamment) des tableaux :)

P.
 

laurent950

XLDnaute Accro
Re : Comparer deux fichierx excel et traitement des lignes

Je vais essayer de la commenté cette macro pour vous deux et je la reposte

VB:
Sub test()

' Semaine - 1 (V010115)
Dim Fsmoin1 As Worksheet
Set Fsmoin1 = Worksheets("V010115")
Dim TabFsmoin1() As Variant
' ci en fixe je copie en mémoire les ligne et colonne du tableau de la
' feuille V010115 soit :
' Les lignes Fsmoin1.Cells(2, 1) = A2 ici
' 2 pour Numéro de ligne = 1
' 1 Numéro de colonne = A
' TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(6, 4))

' Ci dessous en variable autoajustable
' Derniere ligne de la colonne A de la feuille V010115
MsgBox Fsmoin1.Cells(65536, 1).End(xlUp).Row - 1
' Derniere colonne de la la premiere ligne de la feuille V010115
MsgBox Fsmoin1.Cells(1, Fsmoin1.Cells.Columns.Count).End(xlToLeft).Column
' ici en une seul fois la plage copier en mise en mémoire tableau soit :
' plage A2:D6
TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(Cells(65536, 1).End(xlUp).Row, Fsmoin1.Cells(1, Fsmoin1.Cells.Columns.Count).End(xlToLeft).Column))

' Semaine en cours (V140115)
' Ideme ci dessus même méthode.
Dim Fs As Worksheet
Set Fs = Worksheets("V140115")
Dim TabFs() As Variant
'TabFs = Fs.Range(Fs.Cells(2, 1), Fs.Cells(6, 4))
TabFs = Fs.Range(Fs.Cells(2, 1), Fs.Cells(Cells(65536, 1).End(xlUp).Row, Fs.Cells(1, Fs.Cells.Columns.Count).End(xlToLeft).Column))

' Creation d'un Nouveau tableau regroupant les 2
Dim TabRes() As Variant
' Ici c'est un tableau viérge en mémoire
' il aura la capacité du nombre de ligne des deux tableaux
' TabFsmoin1 et TabFs
' Pour connaitre le :
' Nombre de ligne d'un tableau c'est cette instruction --- >>>  UBound(TabFsmoin1, 1) ici 5 ligne
' Nombre de colonne d'un tableau c'est cette instruction --- >>>  UBound(TabFsmoin1, 2) ici 4 colonne

' Ont peux aussi alloué des colonnes suplémentaire j'en ai alloué 3 suplémentaire
' Comme le tableau a 4 colonnes avec des valeurs je crée 3 de plus vides d'ou :
' UBound(TabFsmoin1, 2) ici 4 colonne + 3 vides = 7 colonnes.
' L'astuce pour dimensionné du nombre de ligne suffisantes je fais une addition
' du nombres total des deux tableaux soit
' UBound(TabFsmoin1, 1) ici 5 ligne + UBound(TabFs, 1) ici 5 ligne = 10 lignes

' ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 7)
' OU
ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To UBound(TabFsmoin1, 2) + 3)
Dim i As Integer

' ici je copie les valeurs des deux précédents tableau en mémoire :
' TabFsmoin1 et TabFs
' dans un seul est unique que j'ai crée plus haut avec mes explication pour
' en faire un seul ou il y aura toute les donnés

' Semaine - 1 (V010115)
For i = 1 To UBound(TabFsmoin1, 1) ' Ici de i = 1 er ligne à derniére ligne TabFsmoin1
    For j = 1 To UBound(TabFsmoin1, 2) 'Ici de j = 1 er colonne à derniére colonne TabFsmoin1
        ' Fsmoin1.Name (Fsmoin1 = Objet) et propriété Name le nom de l'objet = Nom de la feuille
        ' qui est copier dans la premiére colonne du tableau
        ' et ci dessous la suite des infos copier dans le nouveau tableau.
        TabRes(i, 1) = Fsmoin1.Name ' Ici je décide que ma premiere colonne sera le nom de la feuille
        TabRes(i, j + 1) = TabFsmoin1(i, j) ' ici la deuxiéme colonne sera les info de la 1 er colonne TabFsmoin1 [j + 1]
    Next j
Next i

' ci dessous pricinpe ideme avec position et astuce expliqué
' le premier tableau a 5 ligne et je dois continué sur la 6 ligne du nouveau
' tableau TabRes qui en contient 10
' donc
' For i = UBound(TabFs, 1) + 1 To UBound(TabRes, 1)
' de i = 5 ligne du tableau TabFs à 10 ligne du tableau TabRes
' Semaine en cours (V140115)
For i = UBound(TabFs, 1) + 1 To UBound(TabRes, 1) ' de i = 5 ligne du tableau TabFs à 10 ligne du tableau TabRes
    For j = 1 To UBound(TabFs, 2) 'Ici de j = 1 er colonne à derniére colonne TabFs
        TabRes(i, 1) = Fs.Name
        ' explication :
        ' TabFs(i - UBound(TabFs, 1), j)
        ' i au tous début est = en faite 6
        ' donc le tableau n'a que 5 lignes
        ' d' ou 6 - 5 = 1 soit la premiere ligne du tableau
        ' Donc i [=6] - UBound(TabFs, 1) [=5] c'est a dire 1 soit la ligne 1
        ' Bien sur j = La colonne position
        TabRes(i, j + 1) = TabFs(i - UBound(TabFs, 1), j)
    Next j
Next i

' A voir au pas a pas pour comprendre.
' C'est comme pour identifier les doublons
' on fait une double boucle de balayage
' pour identifié les doublons = "Identiques"
' Les conditions (Doublon pour identique)
For i = 1 To UBound(TabRes, 1) ' i = premiere ligne du tableau tester
    For j = i + 1 To UBound(TabRes, 1) ' j = 2 éme ligne du tableau tester
    ' c'est pour voir se qui est en double
        If TabRes(i, 2) & TabRes(i, 5) = TabRes(j, 2) & TabRes(j, 5) Then
            TabRes(j, 7) = "Identique"
        End If
    Next j
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' on fait une double boucle de balayage
' pour identifié les Modification = "Modifier"
' Les conditions (Difference)
For i = 1 To UBound(TabRes, 1)
    For j = i + 1 To UBound(TabRes, 1)
        If TabRes(i, 2) = TabRes(j, 2) And TabRes(i, 5) <> TabRes(j, 5) Then
            TabRes(j, 7) = "Modifier"
        End If
    Next j
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' Ici suprimé c'est a dite
' si la case ou il n'y a pas de identique (doubon) ou Modifier et donc vide
' et que la colonne correspond a Fsmoin1.Name soit nom de la feuille V010115
' inutil de conservé
' Les conditions (suprimer)
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 1) = Fsmoin1.Name And TabRes(i, 7) = "" Then
        TabRes(i, 7) = "suprimer"
    End If
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

' Ici suprimé c'est a dite
' si la case ou il n'y a pas de identique (doubon) ou Modifier et donc vide
' et que la colonne correspond a Fs.Name soit nom de la feuille V140115
' c'est une ligne a crée
' Les conditions (crée)
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 1) = Fs.Name And TabRes(i, 7) = "" Then
        TabRes(i, 7) = "crée"
    End If
Next i

'Cells(23, 1).Resize(UBound(TabRes, 1), UBound(TabRes, 2)) = TabRes

Dim cpt As Integer
' ici c'est un compteur
' pour compté le nombre de case de la colonne ou
' il n'y a pas inscrit en mémoire
' suprimer ou modifier
' dans cette exemple il y en a 3
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 7) <> "suprimer" And TabRes(i, 7) <> "Modifier" Then
        cpt = cpt + 1
    End If
Next i

' Tableau restitution final annalyse
' Creation d'un Nouveau tableau regroupant les 2
Dim TabFinal() As Variant
' ici on dimensione juste du nombre de ligne = au compteur soit cpt
' el le nombre de colonne necéssaire soir 5
ReDim TabFinal(1 To cpt, 1 To 5)

' ici on réinitialise le cpt (compteur à 1)
cpt = 1
' colle les données dans le tableau
' les donner juste utile dans le tableau ou seront affichier
' vers excel les données final

For i = 1 To UBound(TabRes, 1)
    ' ' si les case de la colonne à crée ou modifier alors ont fait cette action si dessous
    If TabRes(i, 7) = "crée" Or TabRes(i, 7) = "Modifier" Then
        TabFinal(cpt, 1) = TabRes(i, 2) ' ligne 1 soit cpt et ici la colonne N° 2 du TabRes copier dans la colone 1 de TabFinal
        TabFinal(cpt, 2) = TabRes(i, 3) ' etc
        TabFinal(cpt, 3) = TabRes(i, 4)
        TabFinal(cpt, 4) = TabRes(i, 5)
        TabFinal(cpt, 5) = TabRes(i, 7)
        cpt = cpt + 1 ' incremente le compteur de + 1
    End If
Next i

' Ici ont restitu le tableau dans la cellule du tableau excel
' Cells(2, 7) 2 pour ligne 2 et 7 pour colonne N°7
Cells(2, 7).Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal

End Sub

Laurent
 

Pièces jointes

  • Test (3) détail.xlsm
    31 KB · Affichages: 39
Dernière édition:

OOLIVE

XLDnaute Occasionnel
Re : Comparer deux fichierx excel et traitement des lignes

Gosselien,

Si je comprend ton besoin (qui est le mien aussi), j'ai réussi à intégrer le nbre de lignes sous forme d'une variable :
Dim derlig1 as Long
derlig1 = Range("AM65536").End(xlUp).Row

Que j'intègre du coup ici :

TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(derlig5, 44))


Là où je ne comprend vraiment rien, c'est comment modifier les colonnes sur lesquelles faire les tests (Colonne C au lieu de la colonneA et colonn AM au lieu de la colonne D).

SI jamais tu connais la réponse, je suis preneur.
 

gosselien

XLDnaute Barbatruc
Re : Comparer deux fichierx excel et traitement des lignes

quand on parle de cells ou de range, le premier argument est TOUJOURS la ligne et puis la colonne
par ex: si on mets cells(0,1), c'est la même ligne que la cellule active , colonne A
range(2,1) = ligne2 colonne 1
et comme tu fais une variable derlig1 , peux , je pense, faire une variable aussi pour la colonne
Mais l'auteur du code pourra mieux expliquer ça que moi :)
 

Discussions similaires

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg