Bonsoir Patrick,
Mon problème a été résolu avec un adorable contributeur de forum Ce code m’est personnel mais je le partage car il fonctionne très bien.
Au final nous avons, par rapport à un fichier source mis à jour depuis une base SQL, mis à jour tous les onglets commençant par FR. FR dans notre cas correspondant à une colonne de notre fichier source qui correspond à une région (FR - FRANCE). SI l’enregistrement existe dans la base SQL et pas dans l’onglet correspondant alors on le créé. Si par contre l’enregistrement existe dans l’onglet mais pas dans la base alors on l’archive.
ça parait simple …
Ci-dessous le code
Sub MAJ()
Dim C As Range, Ligne As Long, D As Range, L As Long
Dim Plg As Range, Col As Long, Array1, Arrray2, PlgA As Range
Dim Sh As Worksheet, Plg1 As Range
Array1 = Array(« 1 », « 0 », « 10 », « 33 », « 5 », « 65 », « 66 », « 55 », « 8 », « 6 », « 59 », « 12 », « 13 », « 15 », « 14 », « 16 », « 62 », « 57 », « 4 »)
With Sheets(« Base SQL »)
For Each C In .Range(« BH2 », .Cells(.Rows.Count, 60).End(xlUp))
Set Plg = .Range(.Cells(C.Row, 1), .Cells(C.Row, « BN »))
With Sheets(.Cells(C.Row, 61).Value)
If Application.CountIf(.[A:A], Plg(1)) = 0 Then
Ligne = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(Ligne, 2) = Date
.Cells(Ligne, 1) = Plg(1)
For i = 2 To 18
.Cells(Ligne, i + 1) = Plg(Array1(i))
Next i
End If
End With
Next C
End With
'MAJ Archive
Set Plg = Sheets(« base SQL »).[A:A]
Set PlgA = Sheets(« Archivage »).[A:A]
For Each Sh In Sheets
If Left(Sh.Name, 2) = « FR » Then
With Sh
For i = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
If Application.CountIf(Plg, .Cells(i, 1).Value) = 0 And _
Application.CountIf(PlgA, .Cells(i, 1).Value) = 0 Then
Set Plg1 = .Cells(i, 1).Resize(, 27)
With Sheets(« Archivage »)
L = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Plg1.Copy
.Cells(L, 1).PasteSpecial xlValues
.Cells(L, 28) = Date
Plg1.EntireRow.Delete
End With
End If
Next i
End With
End If
Next Sh
End Sub