Rapport de message :*
 

Re: envoyer les infos d'un userform vers un tableau

Titre du sujet : Re: envoyer les infos d'un userform vers un tableau
par Guy le 03/09/2009 22:19:36

Bonjour Claude,

Effectivement la chose est un tant soit peu compliqué mais pas tant que ça.

Nous voulons lier différents contrôles d'un formulaire à une plage d'une feuille de calcul (de préférence nommée).

Dans le formulaire en question il peut y avoir toutes sorte de contrôles : des images, des boutons, des combobox, des zones de texte, des labels, etc.

Pour distinguer les contrôles dont nous voulons extraire l'information qui sera stockée dans la plage nous utiliserons la propriété Tag des contrôles. Par convention  nous affectons à la propriété Tag des contrôles choisis une chaîne de caractère qui porte le nom exact du champ de la plage nommée.

Dans l'exemple livre de compte2_Mod2.xls les noms des champs de la plage nommée "BaseDeDonnées" sont :

Date | Type de paiement | Catégorie | Divers | Crédit | Débit

Si tu examines les Tags des contrôles dans le formulaire frmExemple1 tu pourras établir la liste suivante:

                 Contrôle            |Type de contrôle        |Tag
  txtDate            |TextBox          |Date
  txtMontant         |TextBox          |Débit
  cboTypeDePaiement  |ComboBox         |Type de paiement
  cboCategorie       |ComboBox         |Catégorie
  cmdEnregistrer     |CommandButton    |
vide

Dans la plage "BaseDeDonnées" les champs sont :

|Date | Type de paiement | Catégorie | Divers | Crédit | Débit|

À noter que les contrôles de type TextBox et les contrôles de type ComboBox possèdent tous deux une propriété Text.

Nous avons donc inclus dans le contrôle lui-même le nom de la cible dans la plage.
Tu auras noté aussi que les propriétés Tag portent exactement le nom des colonnes de la plage "BaseDeDonnées" dont les noms de champs sont en feuil2 C6-H6.

Il est important que ces chaînes (des Tags et de la ligne d'en-tête de la plage) soit rigoureusement identiques : accents, majuscules et espaces compris.

Nous disposons donc d'un moyen simple de lier

txtDate.Text            -> "BaseDeDonnées": Date
txtMontant.Text         -> "BaseDeDonnées": Débit
cboTypeDePaiement.Text  -> "BaseDeDonnées": Type de paiement
cboCategorie.Text       -> "BaseDeDonnées": Catégorie

Dans le formulaire frmExemple1 la procédure UserForm_Initialize() nous sert à inscrire les contrôles dont nous voulons extraire la propriété Text dans une collection nommée ColControle et déclarée dans frmExemple1 :

Private Sub UserForm_Initialize()
 
  Set ColControle = New Collection


  ColControle.Add Me.txtDate
  ColControle.Add Me.cboCategorie
  ColControle.Add Me.cboTypeDePaiement
  ColControle.Add Me.txtMontant

End Sub


À noter que la collection ne porte que les contrôles dont nous avons besoin et pas cmdEnregistrer.

C'est la référence à cette collection que nous passons ensuite à la fonction :
Enregistrer(ColControle As Collection) du module modEnregistrer.

Cette fonction parcourt tous les éléments de la collection envoyée en paramètre et assigne à la bonne cellule de la bonne colonne le contenu de la propriété Text de l'élément (qui est soit un TextBox, soit un ComboBox).

  For Each Controle In ColControle


Il nous importe peu, pas du tout même, de savoir si c'est l'un ou l'autre type de contrôle (TextBox ou ComboBox) puisque les deux types ont une propriété Text.

Or pour connaître «la bonne colonne» où déposer l'information on effectue une recherche dans l'en-tête de la plage "BaseDeDonnées" pour extraire le numéro de colonne correspondant au Tag du contrôle avec la ligne d'instruction suivante :

NoColonne = WorksheetFunction.Match(Controle.Tag, PlageBase.Rows(1), 0)

Ou PlageBase porte une référence à la plage nommée "BaseDeDonnées" avec l'instruction :

Set PlageBase = Range(Names("BaseDeDonnées").RefersTo)

Donc, à partir de la propriété Tag correctement inscrite nous obtenons le no. de colonne où doit être déposé le .Text du contrôle.

Set CelluleAjout = PlageBase.Columns(NoColonne).Range("A1").End(xlDown).Offset(1, 0)

  CelluleAjout = Controle.Text

C.Q.F.D

J'espère que cela éclaire un peu ta lanterne. Reste, évidemment à expliquer plus en détails le moyen de former une plage nommée dynamique à plusieurs colonne comme "BaseDeDonnées".  Ce sera pour une prochaine, en attendant tu peux t'amuser à modifier les Tags des contrôles et voir où sont déposés les données et si des erreurs se produisent. Par exemple change le Tag de txtMontant de Débit en Crédit et note que la donnée txtMontant.Text se retrouve dans la colonne Crédit.

Simple, non?

Guy