Question récurrente sur le forum Excel-VBA: Comment modifier les données d'un tableau par formulaire?
Si l'on travaille avec une version récente d'Excel (au moins la 2007, pas si récente ), on s'appuiera évidemment sur les tableaux structurés, qui permettent une gestion aisée des données, tant avec Excel qu'en VBA.
Si l'on respecte les standards de la programmation (une fonction pour chaque chose, le userform uniquement pour collecter les données, …), il devient très simple de créer du code qui permet de modifier les données d'un tableau par formulaire.
Pour l'exemple, je m'appuierai sur un tableau structuré t_Contacts contenant trois colonnes
Un userform contenant les contrôles tboID, tboFirstName et tboLastName pour les textbox, btnValidate et btnCancel pour les deux boutons vient compléter l'arsenal.
Fidèle au principe que le userform, à part vérifier la cohérence des donnés saisies, ne fait rien (pas de récupération de données, pas de transfert dans le tableau, … RIEN!), je propose donc le code très minimaliste suivant, qui modifie la valeur de la propriété Result du userform pour que le code appelant puisse identifier le bouton sur lequel l'utilisateur a cliqué.
OptionExplicitPublic Result AsLongPrivateSub btnCancel_Click()
Result = 1
Me.Hide
EndSubPrivateSub btnValidate_Click()
Result = -1
Me.Hide
EndSub
Pour alimenter le userform avec les données, on utilisera dans un module standard une fonction qui reçoit un tableau (array) en argument ByRef (ca permet de recevoir le tableau passé et non une copie de celui-ci), et on chargera les textbox et autres contrôles avec les données du tableau. Après que le userform ait été masqué et en fonction du bouton cliqué, on replacera dans le tableau les valeurs des textbox et on valorisera la fonction de mise à jour.
Toujours dans le module standard, on a besoin de récupérer la ligne du tableau structuré qui contient les données à modifier par userform. C'est une fonction qui s'en chargera, en utilisant la fonction VBA/Excel Evaluate qui renvoie la position d'une valeur grâce à Match (fonction Excel EQUIV).
Function getRow(ID AsLong)As ListRow
Dim Row
Row = Evaluate("match(" & ID & ",t_Contacts[ID],0)")IfNot IsError(Row)ThenSet getRow = Range("t_Contacts").ListObject.ListRows(Row)EndIfEndFunction
Il reste à faire prendre la mayonnaise avec une procédure placée elle aussi dans un module standard et qui:
récupère la ligne du tableau;
transfère les données de la ligne dans un array;
appelle la fonction de mise à jour de l'array;
en fonction du résultat de cette fonction, transfère l'array à la ligne du tableau structuré.
On remarquera ici que le transfert des donnés entre la ligne du tableau et un array s'effectue en une ligne, quel que soit le nombre de colonnes du tableau…
Sub Test()Dim ID AsLongDim lr As ListRow
Dim Data
ID = 68Set lr = getRow(ID)IfNot lr IsNothingThen
Data = lr.Range.Value
If UpdateContact(Data) = -1Then
lr.Range.Value = Data
MsgBox "Mise à jour effectuée"Else
MsgBox "Erreur durant la mise à jour"EndIfElse
MsgBox "La fiche n'a pas été trouvée"EndIfEndSub
Et voilà le travail. Vous voyez, ce n'est pas compliqué, si vous découpez votre code en fonctions dont la tâche est bien délimitée, et si vous travaillez avec les tableaux structurés qui facilitent énormément la gestion des données avec Excel et VBA (je ne le répéterai jamais assez… )