Sub Transferer()
Dim i As Integer
Dim j As Integer
Dim Ind As Integer
Dim NbLig As Integer
Dim Trouvé As Boolean
Dim LigDest As Integer
Dim RefDev As String
Dim TSCommande As ListObject
Dim TSMaj As ListObject
Dim TabCommande() As Variant
Dim TabMaj() As Variant
Dim NbCol As Integer
Dim start As Single
start = Timer
Application.ScreenUpdating = False
'Définition des Tables structurées
Set TSCommande = Sheets("Commande").ListObjects("TbCommande")
Set TSMaj = Sheets("MAJ").ListObjects("TbMaj")
With TSCommande 'avec la TS "TbCommande"
TabCommande = .DataBodyRange.Value '.ListColumns(1).DataBodyRange.Resize(, 10).Value 'on met tout (sauf la ligne d'entete) dans un tablo VBA
End With
With TSMaj 'avec la TS "TbMaj"
TabMaj = Application.WorksheetFunction.Transpose(.DataBodyRange) '.Value 'Application.WorksheetFunction.Transpose(.ListColumns(1).DataBodyRange.Resize(, 10).Value) 'on met tout (sauf la ligne d'entete) dans un tablo VBA
End With
NbCol = UBound(TabCommande, 2)
NbLig = UBound(TabMaj, 2)
NbLig = 0 'initialisation
For i = LBound(TabCommande, 1) To UBound(TabCommande, 1) 'pour chaque ligne du tablo
RefDev = TabCommande(i, 1) 'on récupère la Ref dans la colonne 1
Trouvé = False 'initialisation
For Ind = LBound(TabMaj, 2) To UBound(TabMaj, 2) 'on cherche si la référence est déjà dans le tablo TabMaj
If TabMaj(1, Ind) = RefDev Then 'on la trouve
LigDest = Ind 'on note la ligne
Trouvé = True 'on met à vrai
Exit For 'on sort de la boucle
End If
Next Ind
If Not Trouvé Then 'si pas trouvé (on a donc parcouru TOUT le tablo
NbLig = NbLig + 1 'on ajoute une ligne
ReDim Preserve TabMaj(1 To NbCol, 1 To NbLig) 'on dimensionne le tablo TabMaj
LigDest = NbLig 'on note la ligne
End If
For j = 1 To 10 'on remplit les infos pour les colonnes A:J
TabMaj(j, LigDest) = TabCommande(i, j)
Next j
For j = 16 To 18 'on remplit les infos pour les colonnes P:R
TabMaj(j, LigDest) = TabCommande(i, j)
Next j
For j = 42 To 48 'on remplit les infos pour les colonnes AP:AV
TabMaj(j, LigDest) = TabCommande(i, j)
Next j
Next i
With TSMaj 'avec la table
Dim ListCol
Dim ExtractCol
Dim TabTransp
.DataBodyRange.Delete
.ListRows.Add
ListCol = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
TabTransp = Application.WorksheetFunction.Transpose(TabMaj)
ExtractCol = Application.Index(TabTransp, Evaluate("row(1:" & UBound(TabTransp) & ")"), ListCol)
.DataBodyRange(1, 1).Resize(UBound(ExtractCol, 1), 10) = ExtractCol 'on bascule le résultat
ListCol = Array(16, 17, 18)
ExtractCol = Application.Index(TabTransp, Evaluate("row(1:" & UBound(TabTransp) & ")"), ListCol)
.DataBodyRange(1, 16).Resize(UBound(ExtractCol, 1), 3) = ExtractCol 'on bascule le résultat
ListCol = Array(42, 43, 44, 45, 46, 47, 48)
ExtractCol = Application.Index(TabTransp, Evaluate("row(1:" & UBound(TabTransp) & ")"), ListCol)
.DataBodyRange(1, 42).Resize(UBound(ExtractCol, 1), 7) = ExtractCol 'on bascule le résultat
End With
MsgBox "durée du traitement: " & Timer - start & " secondes"
Application.ScreenUpdating = True
End Sub