Bonjour le fil, bonjour le forum,
Le code ci-dessous te propose d'ouvrir les fichiers source un à un. Les doublons sont traités à la fin quand toutes les données ont été importées :
Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim BDO As FileDialog 'déclare la variable BDO (Boîte de Dialogue d'Ouverture)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim K As Integer 'déclare la variable K (incrément)
Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("Recap_ABS_TR") 'définit l'onglet destination OD
ici: 'étiquette
'si "Non au message, va à l'étiquette "fin"
If MsgBox("Vous devez ouvrir un classeur source, voulez-vous le faire ?", vbYesNo, "ATTENTION") = vbNo Then GoTo fin
Set BDO = Application.FileDialog(msoFileDialogOpen) 'définit la boîte de dialogue d'ouverture BDO
BDO.AllowMultiSelect = False 'n'autorise la sélection que d'un seul fichier
BDO.Show 'affiche BDA
If BDO.SelectedItems.Count > 0 Then Workbooks.Open (BDO.SelectedItems(1)) 'ouvre le ficher sélectionné
Set CS = ActiveWorkbook 'définit le classeur source CS
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set OS = CS.Worksheets("Recap_ABS_TR") 'définit l'onglet source OS (génère une erreur si cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'supprime l'erreur
MsgBox "Ce fichier ne contient pas d'onglet nommé " & Chr(34) & "Recap_ABS_TR" & Chr(34) & "!" 'message
GoTo ici 'va á l'étiquette "ici"
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
'définit la cellule de destination DEST (première cellule vide de la colonne A de l'onglet OD)
Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0)
OS.Range("A1").CurrentRegion.Offset(1, 0).Copy DEST 'copie les données de l'onglet source et les colle dans DEST
CS.Close False 'ferme le classeur source CS sans enregistrer
GoTo ici 'va à l'étiquette ici
fin: 'étiquette
TV = OD.Range("A1").CurrentRegion 'définit le tablreau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 2) & " " & TV(I, 3) & " " & TV(I, 5)) = "" 'alimente le dictionnaire D avec la concaténation du matricule, du code et de la date
Next I 'prochaine ligne de la boucle
If D.Count = 0 Then Exit Sub 'si le dictionnaire est vide, sort de la procédure
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictoionnaire D asns doublon
For J = 0 To UBound(TMP) 'boucole 1 : sur tous les éléments J du tableau temporaire TMP
K = 0 'initialise la variable K
For I = UBound(TV, 1) To 2 Step -1 'boucle inversée 2 : sur toutes les lignes I du tableau des valeurs TV (de la dernière à la seconde)
'si la concaténation matricule, code, date de la boucle 2 est égale à l'élément J de la boucle 1, incrémente K
If TV(I, 2) & " " & TV(I, 3) & " " & TV(I, 5) = TMP(J) Then K = K + 1
If K > 1 Then OD.Rows(I).Delete: K = 0 'si K est supérieure à 1, supprime la ligne I, re initialise K
Next I 'prochaine ligne de la boucle 2
Next J 'prochain élément de la boucle 1
End Sub