Userform, DatePicker, TimePicker, et autres

mromain

XLDnaute Barbatruc
Bonjour,

Ce post sert à présenter une "boite à outils" que j'ai développée pour me faciliter la création de formulaires de saisie simples.

L'idée de base de ce projet était de trouver un moyen simple de mettre en œuvre les contrôles/automatisme récurremment implémentés dans mes formulaires de saisie.

La solution est une sorte de "surcouche" des contrôles de formulaires existant. Elle permet par exemple de dire :
  • telle Textbox et de type date, avec tel format, sa saisie est obligatoire, et doit être comprise dans tel créneau ;
  • telle Textbox et de type heure ;
  • telle Textbox et de type "path de dossier", sa saisie est obligatoire ;
Elle offre aussi la possibilité d'ajouter facilement des pickers :
ExemplePickers.png


Avec cette solution, un contrôle devient un ensemble de contrôles de formulaires au sens propre du terme.
Par exemple, un contrôle de type date peut représenter cet ensemble de contrôles :

ExempleDatePicker.png

  1. une Textbox (ou un Label) : contrôle principal qui va contenir la valeur de la date sélectionnée ;
  2. optionnellement, un Button permettant d'ouvrir le date-picker (par défaut un double-clic sur le contrôle principal ouvre également le date-picker) ;
  3. optionnellement, un Button permettant de supprimer la valeur actuelle (par défaut un clic-droit sur le contrôle principal efface la valeur) ;
  4. optionnellement, un SpinButton permettant de modifier la valeur ;
  5. optionnellement, un Label contenant la description du contrôle.

Cette solution permet également d'automatiser la validation de saisie de l'ensemble des contrôles du formulaire, de mettre en surbrillance les contrôles avec données invalides et de retourner les messages d'erreur de saisie.

Pour mettre en œuvre cette solution sur un formulaire de saisie, il faut ajouter le formulaire FrmManager dans le projet VBA, puis dans le code du formulaire de saisie, il faut :
  • ajouter la propriété Manager permettant d'accéder au manager de contrôles ;
  • ajouter la procédure InitControls permettant d'initialiser les contrôles du formulaire ;
  • appeler cette procédure à l'initialisation du formulaire.
VB:
'propriété permettant d'accéder au manager de contrôles
Public Property Get Manager() As FrmManager
Static s_o_frmManager As FrmManager
    If s_o_frmManager Is Nothing Then Set s_o_frmManager = New FrmManager
    Set Manager = s_o_frmManager
End Property

'procédure permettant d'initialiser les contrôles du formulaire
Private Sub InitControls()
    With Me.Manager
        .AddControl("FolderTest").InitFolderOpenPicker Txt_PathFolder, ...
        .AddControl("FileOpenTest").InitFileOpenPicker Txt_PathFileOpen, ...
        .AddControl("FileSaveAsTest").InitFileSaveAsPicker Lbl_PathFileSaveAs, ...
        .AddControl("DateTest").InitDatePicker Lbl_Date, ...
        .AddControl("TimeTest").InitTimePicker Txt_Time, ...
        .AddControl("Numérique").InitNumericTextBox Txt_TxtNum, ...
        .AddControl("Textuel").InitTextBox Txt_Txt, ...
        .AddControl("CBox").InitComboBox CBox_Cbox, ...
        .AddControl("Check").InitCheckBox ChexkBox_ChkBox, ...
    End With
End Sub

'appel de l'initialisation des contrôles du formulaire
Private Sub UserForm_Initialize()
    InitControls
End Sub

C'est au niveau de la procédure InitControls qu'on va définir les différents contrôles du formulaire et leur comportement.
La fonction AddControl prend en paramètre la clef du contrôle et retourne le nouveau contrôle créé. Il est initialisé dans la foulée avec la procédure .InitXxxxx.
Il existe autant de procédure d'initialisation (.InitXxxxx) que de "types de contrôle".
Chacune de ces procédures d'initialisation possède un paramètre obligatoire (le contrôle de formulaire "mappé") et plusieurs paramètres facultatifs et spécifique au "type de contrôle".

Les contrôles possèdent un ensemble de propriétés communes :
  • ControlKey
    Permet d'accéder à la clef du contrôle (définie au moment du AddControl). En lecture seule.
  • ControlValue
    Permet de lire/modifier la valeur du contrôle.
  • ControlCaption
    Permet de lire/modifier la description du contrôle.
  • ControlDisplayValue
    Permet d'accéder à la valeur affichée du contrôle (diffère de ControlValue uniquement pour les contrôles de type date-picker ou time-picker). En lecture seule.
  • ControlEnabled
    Permet de verrouiller/déverrouiller l'ensemble des contrôles de formulaire liés au contrôle.
  • ControlVisible
    Permet de masquer/afficher l'ensemble des contrôles de formulaire liés au contrôle.

Ensuite, le Manager du formulaire permet :
  • d'accéder à la Collection de contrôles (via Me.Manager.CollControls).
    Par exemple :
    VB:
        'définir la date du jour dans le contrôle "DateTest"
        Me.Manager.CollControls("DateTest").ControlValue = Date
        'verrouiller le contrôle "FileOpenTest"
        Me.Manager.CollControls("FileOpenTest").ControlEnabled = False
        'afficher dans la console d'exécution le valeurs non vides du formulaire
        For Each ctrl In Me.Manager.CollControls
            If Not IsEmpty(ctrl.ControlValue) Then Debug.Print ctrl.ControlDisplayValue
        Next ctrl
  • de contrôler la saisie et récupérer la liste des erreurs (donnée manquante ou non conforme).
    VB:
    Dim l_v_inputErrors As Variant
        l_v_inputErrors = Me.Manager.GetInputErrors()
        If Not IsEmpty(l_v_inputErrors) Then
            MsgBox "Erreurs de saisie :" & vbNewLine & "  > " & Join(l_v_inputErrors, vbNewLine & "  > ")
        End If
    La fonction Manager.GetInputErrors() possède deux paramètres facultatifs :
    • la langue (français par défaut ou anglais) pour définir dans quelle langue sont retourné les messages d'erreur ;
    • le booléen HighlightErrors (True par défaut) pour savoir s'il faut mettre en surbrillance les contrôles avec une erreur de saisie.

Le fichier joint Exemple.xlsm contient :
  • le formulaire FrmManager contenant le code de la solution proposée ci-dessus ;
  • un exemple de saisie avec un formulaire "lié" à un ListObject et permettant d'éditer une personne ;
  • un formulaire permettant de présenter l'ensemble des contrôles.


A+
 

Pièces jointes

  • Exemple.xlsm
    134.9 KB · Affichages: 67

Discussions similaires

Statistiques des forums

Discussions
313 769
Messages
2 102 234
Membres
108 181
dernier inscrit
Chr1sD