1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| Sub MAJ_Tableau()
'--- il est présumé que les colonnes sont exactement dans le même ordre dans les 2 tableaux
Dim wsExp As Worksheet, loListe As ListObject, loData As ListObject
Dim rCell As Range, kR As Long, kRL As Long, kRD As Long
Dim kRdata0 As Long, kRliste0 As Long
Dim rListe As Range, rData As Range, rValData As Range, rValListe As Range
Dim sCid As String, sCval As String
'--- initialise
Set wsExp = ThisWorkbook.Worksheets("Explications")
Set loListe = ThisWorkbook.Worksheets("Liste").ListObjects("Tableau1")
Set loData = ThisWorkbook.Worksheets("DataImport").ListObjects("Tableau2")
sCid = wsExp.Range("L6").Value '--- titre colonne identifiant unique
sCval = wsExp.Range("E3").Value '--- titre colonne dont les valeurs sont à mettre à jour
kRL = loListe.ListRows.Count + 1
kRD = loData.ListRows.Count
'--- plage de données de la colonne sCid
Set rListe = loListe.ListColumns(sCid).Range
Set rData = loData.ListColumns(sCid).Range
Set rValListe = loListe.ListColumns(sCval).Range
Set rValData = loData.ListColumns(sCval).Range
kRdata0 = loData.HeaderRowRange.Row - 1
kRliste0 = loListe.HeaderRowRange.Row - 1
'Debug.Print rListe.Address, rData.Address
'--- supprime lignes de "Liste" qui n'existent plus dans "DataImport"
With rListe
For kR = kRL To 1 Step -1 '--- va en remontant
Set rCell = rData.Find(.Cells(kR, 1).Value, , , xlWhole)
If rCell Is Nothing Then
'--- la ligne n'existe plus
.Cells(kR, 1).Interior.Color = vbRed
'.Rows(kR).Delete Shift:=xlUp '--- supprime la ligne
Else
'--- la ligne existe
'--- reprend valeur de cellule du tableau Data dans tableau Liste
rValListe.Cells(kR, 1).Value = rValData.Cells(rCell.Row - kRdata0, 1).Value
End If
Next kR
End With
'--- ajoute lignes de "DataImport" qui n'existent pas dans "Liste"
kRL = loListe.ListRows.Count
With rData
For kR = 2 To kRD + 1
Debug.Print .Cells(kR, 1)
If WorksheetFunction.CountIf(rListe, .Cells(kR, 1)) = 0 Then
'.Cells(kR, 1).Interior.Color = vbYellow
kRL = kRL + 1 '--- n° ligne suivante
loListe.ListRows.Add '--- ajoute ligne au tableau
'--- copie valeurs de toute la ligne du tableau Data dans tableau Liste
loListe.ListRows(kRL).Range.Value = loData.ListRows(kR - 1).Range.Value
End If
Next kR
End With
'--- nettoie
Set rCell = Nothing
Set rValListe = Nothing
Set rValData = Nothing
Set rListe = Nothing
Set rData = Nothing
Set loListe = Nothing
Set loData = Nothing
Set wsExp = Nothing
End Sub |
Partager