Microsoft 365 Copier des données d'un fichier à un autre en vérifiant si elles existent déjà

Rhyukane

XLDnaute Nouveau
Bonjour,

Grâce à l'aide de ce forum j'ai réussi à créer ma macro pour copier les 3 onglets d'un fichier source dans 3 tableaux structurés situés sur 3 onglets distincts d'un second fichier.

Je cherche actuellement à savoir si il est possible de vérifier si les lignes copiées du fichier source (qui changera régulièrement) sont déjà existantes dans le fichier de destination et de ne copier que les nouvelles lignes en dessous de celles existantes dans le fichier de destination.

Pouvez vous me dire si cela est faisable et dans l'idéal m'aider à écrire ce code ou en tout cas m'aiguiller ?

Je vous joins mon code actuel.

Merci par avance pour votre aide.

Rhyukane

VB:
Sub CopyData()

Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Dim lastRow As Long

Dim CD2 As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD2 As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TS2 As ListObject 'déclare la variable TS (Tableau Structuré)
Dim CS2 As Workbook 'déclare la variable CS (Classeur Source)
Dim OS2 As Worksheet 'déclare la variable OS (Onglet Source)
Dim R2 As Range 'déclare la variable R (Recherche)
Dim LI2 As Integer 'déclare la variable LI (Ligne)
Dim PL2 As Range 'déclare la variable PL (PLage)
Dim NL2 As Integer 'déclare la variable NL (Nombre de Lignes)
Dim lastRow2 As Long

Dim CD3 As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD3 As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TS3 As ListObject 'déclare la variable TS (Tableau Structuré)
Dim CS3 As Workbook 'déclare la variable CS (Classeur Source)
Dim OS3 As Worksheet 'déclare la variable OS (Onglet Source)
Dim R3 As Range 'déclare la variable R (Recherche)
Dim LI3 As Integer 'déclare la variable LI (Ligne)
Dim PL3 As Range 'déclare la variable PL (PLage)
Dim NL3 As Integer 'déclare la variable NL (Nombre de Lignes)
Dim lastRow3 As Long


Set CD = ThisWorkbook 'définit la classeur destination CD
Set OD = CD.Worksheets(1) 'définit l'onglet destination OS (à adapter à ton cas)
Set TS = OD.ListObjects(1) 'définit le tableau structuré TS (à adapter à ton cas)
Set CS = Application.Workbooks.Open("adresse Fichier source") 'définit la classeur source (à adapter à ton cas)
Set OS = CS.Worksheets("Dossiers terminés") 'définit l'onglet source OS (à adapter à ton cas)

Set CD2 = ThisWorkbook 'définit la classeur destination CD
Set OD2 = CD2.Worksheets(2) 'définit l'onglet destination OS (à adapter à ton cas)
Set TS2 = OD2.ListObjects(1) 'définit le tableau structuré TS (à adapter à ton cas)
Set CS2 = Application.Workbooks.Open("adresse Fichier source ") 'définit la classeur source (à adapter à ton cas)
Set OS2 = CS2.Worksheets("Dossiers abandonnés") 'définit l'onglet source OS (à adapter à ton cas)
Set CD3 = ThisWorkbook 'définit la classeur destination CD
Set OD3 = CD3.Worksheets(3) 'définit l'onglet destination OS (à adapter à ton cas)
Set TS3 = OD3.ListObjects(1) 'définit le tableau structuré TS (à adapter à ton cas)
Set CS3 = Application.Workbooks.Open("adresse Fichier source ") 'définit la classeur source (à adapter à ton cas)
Set OS3 = CS3.Worksheets("RDV annulés") 'définit l'onglet source OS (à adapter à ton cas)


With OS 'définit la plage PL (à adapter à ton cas)
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set PL = .Cells(2, 1).Resize(lastRow - 1, 27)
End With

With OS2 'définit la plage PL (à adapter à ton cas)
lastRow2 = .Cells(.Rows.Count, 1).End(xlUp).Row
Set PL2 = .Cells(2, 1).Resize(lastRow2 - 1, 29)
End With

With OS3 'définit la plage PL (à adapter à ton cas)
lastRow3 = .Cells(.Rows.Count, 1).End(xlUp).Row
Set PL3 = .Cells(2, 1).Resize(lastRow2 - 1, 28)
End With


NL = PL.Rows.Count 'définit le nombre de lignes NL

NL2 = PL2.Rows.Count 'définit le nombre de lignes NL

NL3 = PL3.Rows.Count 'définit le nombre de lignes NL


Set R = TS.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TS)

Set R2 = TS2.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TS)

Set R3 = TS3.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TS


If R Is Nothing Or TS.ListRows.Count = 0 Then 'si aucune occurrence n'est trouvée ou si TS ne contient pas encore de ligne
TS.ListRows.Add 'ajoute une ligne à TS
LI = TS.ListRows.Count 'définit la ligne LI (dernière ligne de TS)
Else 'sinon (au moins une occurrence est trouvée)
LI = R.Row - TS.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-têtes de TS)
End If 'fin de alcondition

If R2 Is Nothing Or TS2.ListRows.Count = 0 Then 'si aucune occurrence n'est trouvée ou si TS ne contient pas encore de ligne
TS2.ListRows.Add 'ajoute une ligne à TS
LI2 = TS2.ListRows.Count 'définit la ligne LI (dernière ligne de TS)
Else 'sinon (au moins une occurrence est trouvée)
LI2 = R2.Row - TS2.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-têtes de TS)
End If 'fin de alcondition

If R3 Is Nothing Or TS3.ListRows.Count = 0 Then 'si aucune occurrence n'est trouvée ou si TS ne contient pas encore de ligne
TS3.ListRows.Add 'ajoute une ligne à TS
LI3 = TS3.ListRows.Count 'définit la ligne LI (dernière ligne de TS)
Else 'sinon (au moins une occurrence est trouvée)
LI3 = R3.Row - TS3.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-têtes de TS)
End If 'fin de alcondition


TS.Resize TS.Range.Resize(TS.ListRows.Count + NL, TS.ListColumns.Count) 'redimensionne TS

TS2.Resize TS2.Range.Resize(TS2.ListRows.Count + NL2, TS2.ListColumns.Count) 'redimensionne TS

TS3.Resize TS3.Range.Resize(TS3.ListRows.Count + NL3, TS3.ListColumns.Count) 'redimensionne TS


PL.Copy TS.DataBodyRange(LI, 1) 'copie la plage PL dans la donnée ligbne LI colonne 1 de TS

PL2.Copy TS2.DataBodyRange(LI2, 1) 'copie la plage PL dans la donnée ligbne LI colonne 1 de TS

PL3.Copy TS3.DataBodyRange(LI3, 1) 'copie la plage PL dans la donnée ligbne LI colonne 1 de TS


CS.Close (True)


End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 924
Membres
101 841
dernier inscrit
ferid87