Voir le flux RSS

Pierre Fauconnier

Excel VBA: Modifier les données d'un tableau par formulaire

Noter ce billet
par , 07/08/2018 à 09h58 (277 Affichages)
Salut.

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

Nom : 2018-08-07 08_54_48-Window.png
Affichages : 115
Taille : 12,0 Ko



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.

Nom : 2018-08-07 08_53_44-Window.png
Affichages : 114
Taille : 5,7 Ko



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

Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
 
Public Result As Long
 
 
Private Sub btnCancel_Click()
  Result = 1
  Me.Hide
End Sub
 
Private Sub btnValidate_Click()
  Result = -1
  Me.Hide
End Sub

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.

Code VB : 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
Function UpdateContact(ByRef Data) As Long
  Unload usfContact
  With usfContact
    .tboID.Value = Data(1, 1)
    .tboFirstName.Value = Data(1, 2)
    .tboLastName.Value = Data(1, 3)
    .Show
    UpdateContact = .Result
    If .Result = -1 Then
      Data(1, 1) = .tboID.Value
      Data(1, 2) = .tboFirstName.Value
      Data(1, 3) = .tboLastName.Value
    End If
  End With
  Unload usfContact
End Function


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

Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Function getRow(ID As Long) As ListRow
  Dim Row
 
  Row = Evaluate("match(" & ID & ",t_Contacts[ID],0)")
  If Not IsError(Row) Then
    Set getRow = Range("t_Contacts").ListObject.ListRows(Row)
  End If
End Function

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…

Code VB : 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
17
18
Sub Test()
  Dim ID As Long
  Dim lr As ListRow
  Dim Data
  ID = 68
  Set lr = getRow(ID)
  If Not lr Is Nothing Then
    Data = lr.Range.Value
    If UpdateContact(Data) = -1 Then
      lr.Range.Value = Data
      MsgBox "Mise à jour effectuée"
    Else
      MsgBox "Erreur durant la mise à jour"
    End If
  Else
    MsgBox "La fiche n'a pas été trouvée"
  End If
End Sub

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… )

Bon travail avec nos outils préférés...
Miniatures attachées Fichiers attachés

Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Viadeo Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Twitter Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Google Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Facebook Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Digg Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Delicious Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog MySpace Envoyer le billet « Excel VBA: Modifier les données d'un tableau par formulaire » dans le blog Yahoo

Commentaires