Option Explicit
Sub Copier_Alternant()
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 NomPrenom As String
Dim TSAlternant As ListObject
Dim TSArchiveAlternant As ListObject
Dim TabAlternant() As Variant
Dim TabArchiveAlternant() As Variant
Dim LastLine As Integer
Dim TabNew() As Variant
Dim NbNew As Integer
Dim NbCol As Integer
Application.ScreenUpdating = False
'Définition des Tables structurées
Set TSAlternant = Sheets("Import").ListObjects("TbAlternant")
Set TSArchiveAlternant = Sheets("Archive Alternant").ListObjects("TbArchiveAlternant")
With TSAlternant 'avec la TS "TSAlternant"
If .ListRows.Count = 0 Then Exit Sub
'MsgBox TSAlternant.ListColumns(1).DataBodyRange(1)
TabAlternant = .DataBodyRange.Value2 '.ListColumns(1).DataBodyRange.Resize(, 11).Value 'on met tout (sauf la ligne d'entete) dans un tablo VBA
End With
With TSArchiveAlternant 'avec la TS "TSArchiveAlternant"
If .ListRows.Count = 0 Then 'la table Maj est vide
'on copie directement le contenu de la commande vers Maj
.ListRows.Add 'on ajoute une ligne vide
.DataBodyRange(1, 1).Resize(UBound(TabAlternant, 1), UBound(TabAlternant, 2)) = TabAlternant 'on colle directement le TabAlternant
'MsgBox "durée du traitement: " & Timer - start & " secondes"
Application.ScreenUpdating = True
Exit Sub ' et c'est fini
Else
TabArchiveAlternant = Application.WorksheetFunction.Transpose(.DataBodyRange) 'on met tout (sauf la ligne d'entete) dans un tablo VBA
NbLig = UBound(TabArchiveAlternant, 2) 'on récupère le nombre de lignes
'MsgBox UBound(TabArchiveAlternant, 1)
End If
End With
NbCol = UBound(TabAlternant, 2) 'on récupère le nombre de colonnes
NbNew = 0 'initialisation du nombre de nouvelles lignes
For i = LBound(TabAlternant, 1) To UBound(TabAlternant, 1) 'pour chaque ligne du tablo
NomPrenom = TabAlternant(i, 1) 'on récupère la Ref dans la colonne 1
Trouvé = False 'initialisation
For Ind = LBound(TabArchiveAlternant, 2) To UBound(TabArchiveAlternant, 2) 'on cherche si la référence est déjà dans le tablo TabArchiveAlternant
If TabArchiveAlternant(1, Ind) = NomPrenom 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é alors qu'on a parcouru TOUT le tablo
NbNew = NbNew + 1 'on ajoute une ligne
ReDim Preserve TabNew(1 To NbCol, 1 To NbNew) 'on dimensionne le tablo NbNew
For j = LBound(TabAlternant, 2) To UBound(TabAlternant, 2) 'on rempli avec TOUTE la ligne
TabNew(j, NbNew) = TabAlternant(i, j)
Next j
Else 'on ne remplit que certaines colonnes
For j = 1 To 11 'on remplit les infos pour les colonnes [NOM - PRENOM]:[COMMENTAIRES] COL 1 à COL 11
TabArchiveAlternant(j, LigDest) = TabAlternant(i, j)
Next j
End If
Next i
With TSArchiveAlternant 'avec la table
Dim ListCol
Dim ExtractCol
Dim TabTransp
ListCol = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) 'liste des colonnes à extraire du tablo
If .ListRows.Count = 1 Then 'si UNE seule ligne dans TSArchiveAlternant (avant le transfert) ==> le transpose d'une ligne vers une colonne ne fonctionne pas ==> on créé manuellement le tabtransp
ReDim TabTransp(1 To 1, 1 To NbCol)
For j = LBound(TabArchiveAlternant, 1) To NbCol
TabTransp(1, j) = TabArchiveAlternant(j, 1)
Next j
Else
TabTransp = Application.WorksheetFunction.Transpose(TabArchiveAlternant) 'on peut directement transposer
End If
ExtractCol = Application.Index(TabTransp, Evaluate("row(1:" & UBound(TabTransp) & ")"), ListCol) 'on extrait les colonnes
.DataBodyRange(1, 1).Resize(1, UBound(ExtractCol, 1)) = ExtractCol 'on bascule le résultat
If NbNew <> 0 Then 'si on a des nouvelles lignes ==> on les colle en bas de tablo
LastLine = .ListRows.Add.Index
.DataBodyRange(LastLine, 1).Resize(UBound(TabNew, 2), UBound(TabNew, 1)) = Application.WorksheetFunction.Transpose(TabNew)
End If
End With
'MsgBox "durée du traitement: " & Timer - start & " secondes"
Application.ScreenUpdating = True
End Sub