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

laurent950

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

quand on parle de cells ou de range, le premier argument est TOUJOURS la ligne = Oui et puis la colonne = oui

par ex: si on mets cells(0,1) dans excel sa commence forcément a 1 soit cells(1,1)

c'est la même ligne que la cellule active , colonne A = je sais pas je comprend pas ?

range(2,1) = ligne2 colonne 1 = oui

et comme tu fais une variable derlig1 , peux , je pense, faire une variable aussi pour la colonne = Oui c'est fait :

' derniere ligne non vide colonne A
MsgBox Cells(65536, 1).End(xlUp).Row

' derirene colonne non vide ligne 1
MsgBox Cells(1, Cells.Columns.Count).End(xlToLeft).Column

Mais l'auteur du code pourra mieux expliquer ça que moi = j'ai tous détailler pour vous
 
Dernière édition:

OOLIVE

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

Merci Laurent950 pour ton temps et ton aide précieuse (solide!)

Malheureusement, je n'arrive pas à me retrouver dans ton code.. De 1 parce que c'est au délà de mes compétences (je le reconnais ^^) mais également parce que 2, je ne sais plus quelle partie agit sur quoi et quelle valeur sont prise en compte..

Les seuls informations que j'ai à ma disposition (une fois compiler dans le meme fichier), c'est les deux onglets V010115 et V140115. Rien de plus, rien de moins.

C'est à dire que dans le fichier que je te joins là, le 3ème onglet est le résultat que je souhaiterais (onglet à intégrer car inexistant au départ de la macro).. Le traitement des lignes étant fais apparament via le Ubound.

Et les cellules à comparer sont uniquement celle de la colonne C et la colonne AM.. Le reste étant un peu superflu.

C'est le résultat de cette analyse qui détermine l'action à faire "Créer, Modifier ou Supprimer.

Aurais-tu l'aimabilité d'adapter le code à mon fichier car je n'y arrive pas moi :(..

Je pense qu'une fois adaptée, ca m'aidera à y voir plus clair..

Merci encore de ton aide précieuse
 

Pièces jointes

  • Test.xlsx
    12.7 KB · Affichages: 32
  • Test.xlsx
    12.7 KB · Affichages: 40
  • Test.xlsx
    12.7 KB · Affichages: 41

gosselien

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

Tu aurais dû mettre directement un exemple avec les titres de colonnes (39 colonnes et pas 4 donc), c'est pour ça que c'est difficile pour toi ) présent d'adapter...
Peso, je suis incapable à ce stade de modifier mais je trouve le code et les explications de Laurent super !!!
Merci à lui de cette explication que je garde sous le coude pour m'en inspirer un jour

Patrick
 

OOLIVE

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

Gosselien,

C'est ce que je me suis dis aussi. Je pensais juste que le code serait plus compréhensible (pour ma part) et que je pourrais le modifier moi-même pour l'adapter à mes besoins.

Si j'avais su...
 

laurent950

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

suite :

code modifier :

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(7, 39))

' 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(7, 39))

' Creation d'un Nouveau tableau regroupant les 2
Dim TabRes() As Variant
ReDim TabRes(1 To UBound(TabFsmoin1, 1) + UBound(TabFs, 1), 1 To 42)
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, 3) = TabFsmoin1(i, 3)
        TabRes(i, 4) = TabFsmoin1(i, 4)
        TabRes(i, 39) = TabFsmoin1(i, 39)
    'Next j
    For j = 1 To UBound(TabFsmoin1, 2)
        If j <> 1 And j <> 3 And j <> 4 And j <> 39 Then
            TabRes(i, j) = TabFsmoin1(i, j)
        End If
    Next
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, 3) = TabFs(i - UBound(TabFs, 1), 3)
        TabRes(i, 4) = TabFs(i - UBound(TabFs, 1), 4)
        TabRes(i, 39) = TabFs(i - UBound(TabFs, 1), 39)
    'Next j
    For j = 1 To UBound(TabFs, 2)
        If j <> 1 And j <> 3 And j <> 4 And j <> 39 Then
            TabRes(i, j) = TabFs(i - UBound(TabFs, 1), j)
        End If
    Next
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, 3) & TabRes(i, 39) = TabRes(j, 3) & TabRes(j, 39) Then
            TabRes(j, 42) = "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, 3) = TabRes(j, 3) And TabRes(i, 39) <> TabRes(j, 39) Then
            TabRes(j, 42) = "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, 42) = "" Then
        For j = i + 1 To UBound(TabRes, 1)
            If TabRes(i, 3) = TabRes(j, 3) Then
                TabRes(i, 41) = "suprimer Doublon !"
            End If
        Next j
        If TabRes(i, 41) = "suprimer Doublon !" Then
        TabRes(i, 42) = "suprimer Doublon !"
        Else
        TabRes(i, 42) = "suprimer"
        End If
    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, 42) = "" Then
        TabRes(i, 42) = "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, 42) <> "suprimer Doublon !" And TabRes(i, 42) <> "Identique" 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 12, 1 To 39)
cpt = 1

' colle les données dans le tableau
For i = 1 To UBound(TabRes, 1)
    If TabRes(i, 42) = "suprimer" Or TabRes(i, 42) = "Modifier" Or TabRes(i, 42) = "crée" Then
        TabFinal(cpt, 3) = TabRes(i, 3)
        TabFinal(cpt, 4) = TabRes(i, 4)
        TabFinal(cpt, 39) = TabRes(i, 39)
        TabFinal(cpt, 1) = TabRes(i, 42)
    For j = 1 To UBound(TabRes, 2) - 3
        If j <> 1 And j <> 3 And j <> 4 And j <> 39 Then
            TabFinal(cpt, j) = TabRes(i, j)
        End If
    Next
    cpt = cpt + 1
    End If
Next i

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

End Sub

Il a fallu faire quelque modif et un peux de ruse
en espèrent que cela corresponde
c'était un bonne exercice

Laurent
 

Pièces jointes

  • Test version final.xlsm
    27.5 KB · Affichages: 38
Dernière édition:

OOLIVE

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

Bonsoir Laurent,

Merci de ta réponse & content que mon problème t'ait plu. :)

J'peux pas essayer le fichier avant lundi car pas d'ordi ce week-end!

Je regarde lundi et te tiendrais informer :)

J'ai + ou - compris là où j'ai buggé tout a l'heure donc croisons les doigts !!

Bon week-end à toi!

OOLIVE
 

OOLIVE

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

Bonjour Laurent,

Je reviens vers toi concernant toute l'aide que tu m'as apporté pour te dire que ca fonctionne parfaitement !!!

2-3 bricoles à faire de mon côté pour adapter tout ton code à mon besoin réel...

Merci encore. Au plaisir!

OOLIVE.
 

OOLIVE

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

Laurent,

Dernière question.. Le nom de mes onglets n'étant toujours les mêmes (on récupère la date du jour pour le onglet de la semaine en cours, la date du fichier de la dernière importation pour l'onglet de la semaine -1), j'ai tenté une intégration d'une variable de cette façon :

Semaine - 1 (Onglet2)
Dim Fsmoin1 As Worksheets
Dim WsName As String
WsName = Sheets(2).Name
Set Fsmoin1 = Worksheets(WsName)
Dim TabFsmoin1() As Variant
TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(7, 39))


Cette variable ne veut pas fonctionner.. Wsname s'appelle bien correctement (19-01-2015) mais au moment du set, plus rien... Serais-tu d'où ca vient ?

Merci.
 

laurent950

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

Bonjour,

peut étre comme cela :

''''''''''''''''''''Semaine - 1 (Onglet2) ' je sais pas a quoi sert cette ligne ? inutile je pense
Dim WsName As String
'''''''''''''''''''''WsName = Sheets(2).Name ' inutile ici c'est du texte (String) et
'''''''''''''''''''''pas une variable de type objet feuilles (Worksheets)

Dim Fsmoin1 As Worksheets
Set Fsmoin1 = Worksheets(Sheets(2).Name)
Dim TabFsmoin1() As Variant
TabFsmoin1 = Fsmoin1.Range(Fsmoin1.Cells(2, 1), Fsmoin1.Cells(7, 39))
 

OOLIVE

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

Je te confirme, les premières lignes servent à rien.

J'avais mis ça sous forme de String car je ne pensais pas pouvoir intégrer directement (sheets(2).name)..

Quoiqu'il en soit, ca ne fonctionne pas non plus... le résultat est le même..
 

laurent950

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

Sub test()

'''''''tu fais une erreur ici en mettant un s à ----->>> Dim Fsmoin1 As Worksheets il n y a jamais de s
'''''' c'était normal que cela ne fonctionne pas ensuite
'''''' Sheets(2).Name ----->> Sheets(2) sheets c'est la feuilles et 2 c'est l'index soit le deuxième
'''''''onglet en partant de gauche vers la droite et name le nom de cette onglet = feuille


''''''''''' Correction
Dim Fsmoin1 As Worksheet
Set Fsmoin1 = Worksheets(Sheets(2).Name)

Fsmoin1.Cells(1, 1) = "test"
MsgBox Fsmoin1.Cells(1, 1)

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 188
dernier inscrit
evebar