Si l'on veut se passer des tableaux structurés, on peut quand même rendre la procédure générique, soit en liant un tout petit peu le code à l'emplacement des données, soit en passant par une plage nommée.

Voici un code de transfert possible, parmi d'autres. On remarque qu'ici on ne parle pas de la position des données, ni de la feuille sur laquelle on va les placer. On reçoit un userform, une plage qui correspond à la plage d'intitulés de la plage de stockage, et un tableau de valeurs qui contient les paires de valeurs Colonne/Contrôle... Les valeurs sont placées "à la queue leu leu" et la procédure boucle dessus par pas de 2.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub AddDataFromUserform(usf As msforms.UserForm, Header As Range, map)
  Dim r As Range
  Dim Col
  Dim i As Long, j As Long
 
  If Header.CurrentRegion.Rows.Count = 1 Then
    Set r = Header.Offset(1)
  Else
    Set r = Header.Offset(Header.CurrentRegion.Rows.Count)
  End If
 
  For i = LBound(map) To UBound(map) Step 2
    Col = Application.Match(map(i), Header, 0)
    If Not IsError(Col) Then r(Col).Value = usf.Controls(map(i + 1)).Value
  Next i
End Sub


Dans un userform doté de deux contrôles tboFirstname et tboLastname, on utilise une procédure qui appelle la procédure ci-dessus en lui passant les paramètres.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Private Sub btnValidate_Click()
  TransferData
End Sub
 
Sub TransferData()
  AddDataFromUserform Me, Feuil1.Range("d3:e3"), Array("nom", "tbolastname", "prénom", "tbofirstname")
End Sub

On voit que TransferData fait ici référence à une plage précise d'une feuille, mais on pourrait côté Excel nommer cette plage, par exemple ContactHeader pour pouvoir la déplacer sans devoir modifier le code. On retrouve alors la souplesse de l'utilisation du tableau structuré et les boucles qui évitent les offset et le couplage fort code/Feuille

Nom : 2020-11-12_192227.png
Affichages : 64
Taille : 4,9 Ko

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Sub TransferData()
  AddDataFromUserform Me, Range("ContactHeader"), Array("nom", "tbolastname", "prénom", "tbofirstname")
End Sub

Il fonctionne dans une configuration "correcte" (rien ne touche la plage des intitulés à gauche, en haut ou à droite) et , a priori, la plage de données ne contient pas une ligne de total. Bien sûr, on pourrait écrire du code pour tenir compte de ces cas, mais l'important n'est pas là. Le code exposé ci-dessus illustre qu'avec ou sans tableaux structurés, on a souvent intérêt, par économie de code et donc de risques de bugs, de rendre son code générique en utilisant le moins possible de codage "métier" en dur.