Valeurs d'un Userform contenu dans une variable [Résolu]

Signaler
Messages postés
44
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
21 septembre 2009
-
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
-
Bonsoir,

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)

Merci pour votre aide!

7 réponses

Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
Bonsoir,

Essaye ça :

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.

A+
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
Arrgggg !!!! J'ai oublié une ligne !!!!

La définition de MyControl...

Dim MyControl As Control

A ajouter avant ou après
Dim FieldsOk As Boolean



Mais tu l'avais fait dans ta fonction.

J'en profite pour (me ) rappeler qu'il vaut mieux mettre Option Explicit en tête de module pour s'obliger à déclarer les variables...
Messages postés
44
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
21 septembre 2009

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

Merci encore!
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
Ha ben ça fait plaisir, si je comprend bien, je suis aussi efficace qu'un somnifère

Bonne Nuit alors
Messages postés
7
Date d'inscription
lundi 21 septembre 2009
Statut
Membre
Dernière intervention
24 septembre 2009

Salut,

Suite aux infos de ayr, me voilà! Je prends le code, je le copie ailleurs sur mon programme et j'essai d'appeler la fonction... C'est ça la procédure?
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
Bonjour,

oui, tu peux commencer par ça mais je te propose de continuer la discussion sur ton propre sujet.

A+
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Statut
Membre
Dernière intervention
13 décembre 2009
1
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.