J'ai créé une fonction publique pour tester si tous les champs de mes userforms ont été remplis. Et je suis totalememt bloqué car lors de l'exécution de la fonction, d'après celle-ci tous les contrôles sont vides...
Je suis perdu...
Voici le code!
Public Function Fields_Check(ActiveUserForm As String)
'Définit les variables
Dim MyControls As Control
'Teste si tout les champs sont remplis
For Each MyControls In VBA.UserForms.Add(ActiveUserForm).Controls
If TypeOf MyControls Is msforms.TextBox Then
If MyControls.Value = "" Then
MsgBox "Veuillez remplir tous les champs", vbExclamation + vbOKOnly + vbApplicationModal, "Informations"
Arret = True
Exit Function
End If
End If
If TypeOf MyControls Is msforms.ComboBox Then
If MyControls.Value = "" Then
MsgBox "Veuillez remplir tous les champs", vbExclamation + vbOKOnly + vbApplicationModal, "Informations"
Arret = True
Exit Function
End If
End If
If TypeOf MyControls Is DTPicker Then
If MyControls.Value = "" Then
MsgBox "Veuillez remplir tous les champs", vbExclamation + vbOKOnly + vbApplicationModal, "Informations"
Arret = True
Exit Function
End If
End If
Next
End Function
Le Mycontrols.value ne retourne rien même s'ils sont remplis! (la fonction se trouve dans un module séparé des userforms)
Public Function Fields_Check(ByVal MyUserForm As UserForm) As Boolean
Dim FieldsOk As Boolean
FieldsOk = True
On Error Resume Next
For Each MyControl In MyUserForm.Controls
If MyControl.Value = "" Then
MsgBox "Veuillez remplir tous les champs", vbOKOnly, "Informations"
FieldsOk = False
Exit For
End If
Next ctl
On Error GoTo 0
Fields_Check = FieldsOk
End Function
Il faut passer directement le UserForm Concerné à la fonction et elle retourne True si les champs sont remplis et Faux sinon.
PS: Elle traite tout les controles et si un n'a pas de propriété Value, l'erreur qui aurait été générée est ignorée grace à la ligne On Error Resume Next.
Merci Ayr! Ca marche à merveille, j'avais pas pensé à déclarer la variable en tant que UserForm,... ;-) Mais là ça m'a éviter de passer une deuxième nuit blanche...
Je reviens pour dire que la fonction que j'ai proposé est à peu près, complètement foireuse
Et si elle marche c'est dans des cas particuliers. La gestion d'erreur est mal faites et de plus des objets autres que combo, textbox et autres objets de saisie on une propriété value et pourrai être pris en compte alors qu'il ne le devraient pas...
Il y avait aussi une petite erreur à la fin du next...
Promis je me fouetterai plus tard mais pour l'instant je voudrait proposer une correction. Donc, plus de gestion d'erreur mais un controle du type des objets testés, comme tu le proposai Amartin6.
Public Function Fields_Check(ByVal MyUserForm As UserForm) As Boolean
Dim FieldsOk As Boolean
Dim MyControl As Control
FieldsOk = True
For Each MyControl In MyUserForm.Controls
If TypeOf MyControl Is msforms.TextBox Or TypeOf MyControl Is msforms.ComboBox Then
If MyControl.Value = "" Then
MsgBox "Veuillez remplir tous les champs", vbOKOnly, "Informations"
FieldsOk = False
Exit For
End If
End If
Next MyControl
Fields_Check = FieldsOk
End Function
Je te laisse le soin de d'ajouter au test du type d'objets, ceux que tu veux prendre en compte aussi. Notamment le DatePicker.
Voilà, encore désolé de ne pas avoir mieux contôlé mon code et en espérant que celle-ci soit plus sur.