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 :
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 :
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 :
C'est au niveau de la procédure
La fonction
Il existe autant de procédure d'initialisation (
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 :
Ensuite, le
Le fichier joint Exemple.xlsm contient :
A+
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 ; - …
- un date-picker (basé sur le magnifique travail de BrunoM45) ;
- un time-picker ;
- des file-picker et folder-picker.
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 :
- une
Textbox
(ou unLabel
) : contrôle principal qui va contenir la valeur de la date sélectionnée ; - 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) ; - optionnellement, un
Button
permettant de supprimer la valeur actuelle (par défaut un clic-droit sur le contrôle principal efface la valeur) ; - optionnellement, un
SpinButton
permettant de modifier la valeur ; - 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 duAddControl
). 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 deControlValue
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 (viaMe.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
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+