Excel VBA: Enregistrer un formulaire dans un tableau structuré (Tableau vers feuille formulaire) (2)
par
, 24/06/2021 à 08h37 (7116 Affichages)
Salut.
Dans ce billet, je développais une fonction générique permettant de transférer les données d'un formulaire feuille de calcul vers un tableau structuré:
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Function AddData(Tablename As String, Map) Dim r As Long Dim i As Long Dim t As ListObject Set t = Range(Tablename).ListObject r = t.ListRows.Add.Index For i = LBound(Map) To UBound(Map) Step 2 t.ListColumns(Map(i + 1)).DataBodyRange(r).Value = Range(Map(i)).Value Next i Set t = Nothing End Function
Aujourd'hui, nous allons travailler dans l'autre sens et ce billet va illustrer le transfert d'un tableau structuré ou table de données vers un formulaire à des fins de modification, par exemple1.
On notera au passage que cette fonction est quasi identique à celle qui transfère les données dans le sens Formulaire => Table, la différence principale étant dans la ligne qui transfère la valeur (Range(Formulaire).Value = Range(Table).Value au lieu de Range(Table).Value = Range(Formulaire).Value). Une autre différence est que que la fonction reçoit l'index de la ligne du tableau qu'il faut transférer dans le formulaire2. Afin de faciliter les copier-coller des lignes qui créent l'array de mappage, j'ai laissé l'ordre des valeurs dans l'array identique à celui de la fonction AddData vue dans le billet cité plus haut.
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Function ReadData(Tablename As String, Index As Long, Map) Dim i As Long Dim t As ListObject Set t = Range(Tablename).ListObject For i = LBound(Map) To UBound(Map) Step 2 Range(Map(i)).Value = t.ListColumns(Map(i + 1)).DataBodyRange(Index).Value Next i Set t = Nothing End Function
Cette fonction de transfert pourra être appelée pour n'importe quelle paire table/formulaire du classeur. Ici, je l'appelle pour récupérer dans le formulaire les données d'un contact:
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Function ReadContact() ReadData "t_contacts", 2, VBA.Array("fc_Prénom", "Prénom", "fc_Nom", "Nom", "fc_DN", "Date naissance", "fc_Actif", "Actif", "fc_Service", "Service") End Function
A nouveau, on notera que pour une autre paire formulaire/table, on utilisera la fonction ReadData avec les données y associées. Si je dois transférer les données de facturation du tableau des factures vers le formulaire d'encodage, j'utilise la même fonction générique avec les arguments qui conviennent:
Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Function ReadInvoice() ReadData "t_FacturesVente", 2, VBA.Array("fv_Date", "Date", "fv_Numéro", "Numéro", "fv_Client", "Client", "fv_htva", "HTVA", "fv_Tva", "TVA", "fv_Tvac", "TVAC") End Function
Comme vous le voyez, il est inutile de réinventer la roue à chaque fois. Cette fonction générique trouvera sa place dans le module xlTools qui contient les outils génériques liés à Excel (voir mon billet à ce sujet).
1 On notera que l'on pourrait réaliser la même chose pour transférer les données d'une table vers une fiche A4 à imprimer, par exemple.
2 La fonction ReadData a la responsabilité unique de transférer les données de la table vers le formulaire, mais pas de déterminer quelle ligne doit être transférée. C'est pourquoi elle doit recevoir l'index de la ligne qui sera déterminé en amont.