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
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.
Partager