Probleme avec userform basique

SERIEUXETCOOL

XLDnaute Occasionnel
Bonjour le Forum,

Pour placer le contexte, je dispose d'un userform extrêmement basique et qui me sert de test pour le moment. Cet userform regroupe 3 boutons d'options, une texbox et un bouton d'action pour valider et sortir.

J'ai déjà placé mes principales règles conditionnelles et la mise en forme sommaire. Cet userform fonctionne presque bien. J'aimerais régler les 3 derniers détails manquants à savoir :

-Je dois écrire un nombre entier ou décimal dans la textbox et uniquement des chiffres. Jusque la sa marche. Le souci est que même si j'entre une valeur décimale dans la textbox, ma variable qui garde cette valeur ne retient qu'un nombre entier. Donc par ex j'entre un entier dans la texbox sa fonctionne, mais si j'entre un nombre à virgule alors je garde l'entier naturel tronqué ou arrondi je ne sais plus.
Or moi je veux pouvoir entrer une valeur entière ou décimale

-Deuxièmement, le nombre de caractère dans ma textbox est limité à 5 de mémoire. C'est à dire que si j'écris dans la textbox le nombre "123456789" et si je fais afficher le contenu de la variable, alors on affiche seulement "12345".
Sa ne ma va pas du tout. J'aimerais m'affranchir de cette limitation.

-Dernière remarque, mon objectif final est de stoker dans une première variable la valeur parmi les 3 boutons d'options puis dans une seconde variable de stocker la valeur contenue dans la textbox. Je dois récupérer le contenu de ces 2 variables pour pouvoir m'en servir par la suite dans ma macro. Et je ne veux pas écrire le contenu des variable dans une feuille excel !!! Simplement stoker la valeur dans une variable que je peux utiliser par la suite dans mon programme de macro.
La question est simple, comment fait on pour transférer le contenu d'un userform entrer par l'utilisateur dans une macro. Comment se fait ce lien ?
Moi j'ai trouvé l'astuce d'utiliser une variable publique à tout le programme (Macro+Userform). Bonne ou mauvaise solution ? Il y a t'il plus simple ou plus efficace ?

Je place ci-joint mon classeur Excel (Version 2007)

Merci à ceux qui pourront m'aider sur ce thème plutôt simple pour la majorité d'entre vous.

André

PS : Un grand merci à Robert qui m'a permis de débuter avec cet userform
 

Pièces jointes

  • MACRO+USERFORM V0.xls
    55 KB · Affichages: 75

Dull

XLDnaute Barbatruc
Re : Probleme avec userform basique

Salut SERIEUXETCOOL, le Forum

Il faudrait déclarer tes variables L et K. Pour éviter ce genre de problème prend l'habitude de placer Option Explicit en tête de Module qui t'obligera à les déclarer

Robert :), lui, a pris soin de le faire :)

Ici, pour ton Problème

Dim L as Long, K as Byte

Pour plus de renseignements place Option Explicit dans la loupe en haut à droite tu verra plein de fils qui en parlent.

De plus tu peux avantageusement changer ton Private Sub TextBox1_Change() par

Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0: MsgBox "saisie invalide"
End Sub
Bonne Journée
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Probleme avec userform basique

Bonjour André, Dull, bonjour le forum,

En pièce jointe ton fichier en utilisant les proposition que je t'avais faites dans la version 2...
 

Pièces jointes

  • André_v03.xls
    64 KB · Affichages: 75

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

Bonjour Robert, Dull, le forum

J'ai bien pris en compte ton nouveau fichier Robert. Hier, j'ai pris la peine de le modifier un peu car il n'était pas totalement à mon gout. Mais il semble que les petites modifications que j'ai faites gênent le reste.

Les 2 premiers problèmes que j'avais sont résolus maintenant (à savoir la limitaion du nombre de caractères ET le fait d'enregistrer un nombre entier quand on rentre un nombre décimal).
Si j'ai changé ton code d'hier Robert, c'est que j'aimerais que lorsque l'utilisateur tape un caractère non autorisé dans la texbox alors un message apparait directement pour avertir que le caractère n'est pas correct et l'effacer automatiquement. Dans ta version, on peut entrer des lettres sans problèmes et on est avertis de l'erreur qu'au moment de valider. Sa ne me conviens pas car sa peut prêter confusion. On ne dois entrer que des chiffres et une virgule. Voila pourquoi j'ai changé le code. Mais j'y suis pas arrivé on dirais bien^^

Il ne reste plus qu'a traiter le problème numéro 3 qui concerne le stokage des variables de l'userform via les modules de la macro. En effet, je me rends compte que je suis capable de faire afficher le contenu de la textbox ET des boutons d'option quand je suis dans la fenêtre de l'userform.
Cependant, dès que je valide l'user form, je ne parviens plus à conserver le contenu de ces 2 variables pour pouvoir les utiliser dans ma macro. Sa fonctionne pour les boutons d'options, mais pas pour la textbox. Sa m'affiche toujours la valeur de zéro.

On peut visualiser le contenu des variables sur la feuille excel en direct pour s'en rendre compte.

Je vais chercher du coté de "option explicite" pour voir si j'en apprends plus. Dans tous les cas, ce n'est pas normal que je parvienne à afficher la valeur des boutons option sur ma feuille excel mais pas la valeur de ma textbox ! Je dois avoir une incompatibilité de type je pense.

Bref je vais chercher un peu.
Je rajouterais, qu'utiliser la déclaration de variables publiques est "dérangeante" dans le sens ou je dois les déclarer avant le module général. Si je rajoute 45 Userform, je ne vais pas déclarer 45 variables publiques ??? Sa me parais trop suspect comme méthode. Sa fait pas "propre" du tout. Il doit y avoir un moyen de déclarer une variable depuis l'userform et de pouvoir utiliser le contenu de cette variable dans mon module. Peut être avec "option explicite" justement...
 

Pièces jointes

  • André_v04.xls
    62.5 KB · Affichages: 48
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

Re,

Je suis donc aller jeter un oeuil du coté de "option explicit".

Voila ce qu'il en sors avec un exemple clair (source Internet):

"Option Explicit en VBA t'obliges à déclarer tes variables, ça permet bien des erreurs, je vais essayer avec un exemple.

sub Bonjour()
dim Toto as string
Toto="bonjour"
msgbox tata
end sub

La procédure Bonjour fonctionne mais n'affichera rien dans le msgbox puisque tata n'est pas initialisée alors que si on mets Option Explicit en haut du module, on aura une erreur , et la ligne msgbox tata sera surlignée en jaune."

Malgré tout, je ne parviens pas à établir un lien de raisonnement entre mon problème initial et "option explicit".

Mon problème est le suivant : Lorsque l'utilisateur entre des valeurs dans un userform (plus précisément dans plusieurs contrôles), j'aimerais que dans mon module, je puisse stoker ces valeur dans une variable. Il me faut donc une variable commune à l'userform et au module. Mais la je trouve rien.

Pourtant il existe des formulaires de grande tailles. Comment gère ton les valeur entrées par l'utilisateur dans un userform sans devoir les coller dans une feuille Excel ???

C'est dingue sa^^
 

Etienne2323

XLDnaute Impliqué
Re : Probleme avec userform basique

Salut SERIEUXETCOOL, le fil,
je n'ai pas suivi le fil, mais à la lecture du dernier message, je me permet d'intervenir à titre informatif au niveau du userform et du module.

Tu dois savoir que tant que le userform n'est pas déchargé (Unload UserForm1), toutes les valeurs qu'il contient sont toujours accessibles de n'importe où (d'un module de feuille, d'un module traditionnel, du workbook ...)

Par exemple, tu n'as qu'à cacher ton userform avec
Code:
UserForm1.Hide
et ensuite aller récupérer les données que tu veux.

Par exemple, dans un module, après avoir caché le userform, il s'uffit qu'à nommer le userform dans lequel tu veux aller récupérer les données.

Code:
Dim Etienne as String
Etienne = UserForm1.Textbox1.Value

Ainsi, la variable Etienne ira stocker le contenu du Textbox1 qui se trouve dans le UserForm1.

Donc, en résumé, le but de la manoeuvre pour récupérer le contenu du UserForm1 est de cacher le UserForm à l'utilisateur avec un
Code:
UserForm1.Hide
sans faire le
Code:
Unload UserForm1
et ainsi accéder aux données avec la manière que je t'ai illustrée plus haut. Tu décharges le userform seulement lorsque tu as terminé d'utiliser les données qui s'y trouve.

J'espère que ça t'aide un peu.

Cordialement,

Étienne
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Probleme avec userform basique

Bonjour André, le fil, bonjjour le forum,

Option Explicit ne fait que t'obliger à déclarer les variables. Mais toi, tu as un problème de portée et durée de vie des variables. Je te recommande de lire le superbe travail de MyDearFriend à ce sujet...
Une variable déclarée publique (Public) est valable (ou a une portée) pour tout ton projet. C'est le seul moyen (sans copier/coller dans une cellule) de conserver une variable une fois l'Userform fermée (Unload). Si, comme tu le dis, tu as 45 Userform tu peux utiliser les mêmes variables pour plusieurs Userform à condition de les remettre à zéro à la fermeture de chacun. Où la solution proposée par Etienne (UserForm1.Hide) avec dans le code d'activation la remise à zéro de tous les contrôles...
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

Ah ben voila on y arrive enfin !!!

Dsl du retard mais j'étais entrain d'adapter doucement mon code.

Conclusion sa marche bien !

Donc Merci Etienne pour ton passage furtif sur mon post mais qui pourtant m'a enfin fait prendre conscience du lien entre variable de l'userform et du module.

Mon souci était qu'en sortant de l'userform je faisait unload. Du coup dans mon module la portée de la variable n'avais plus lieu d'être car je l'avais tuée. Il suffisait simplement de cacher l'userform de manière à conserver le contenu des variables dans mon module et ensuite une fois mes opérations réalisées, je tue l'userform une bonne fois pour toute.

C'est logique quand on prends conscience. Du coup j'ai tellement bien compris que je n'ai même plus besoin de déclarer un certains nombres de variables publiques. En effet, une fois l'userform masqué, j'accède à la text box avec
Code:
UserForm1.TextBox1.Value
et aux boutons d'options avec
Code:
For i = 1 To 3
    If UserForm1("OptionButton" & i).Value = True Then
    Cells(4, 2) = i
    End If
Next

C'est magique lol. Voila comment on fait un lien solide entre userform et module. La c'est du propre.

Donc merci à vous deux Robert et Etienne pour vos précieux conseils.

PS : je poste mon fichier qui fonctionne actuellement
 

Pièces jointes

  • André_v05.xls
    70 KB · Affichages: 64

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

Une dernière chose (principalement destinée pour Robert) mais aux autres aussi,

Comment empêcher et avertir directement l'utilisateur d'entrer un mauvais caractère dans la textbox ??? Dans la textbox je veux entrer uniquement des chiffres et une virgule. Rien d'autre. Alors j'aimerais que lorsque l'utilisateur entre une lettre (EX : "A") alors un message s'affiche directement pour dire que le caractère est incorrect.

Dans la version actuel, on peut entrer dans la textbox du text, et on est avertis de l'erreur seulement à la fin. C'est dommage je trouve, de faire remarquer l'erreur en fin de saisi.

Merci pour cette petite correction simpliste^^
 

Etienne2323

XLDnaute Impliqué
Re : Probleme avec userform basique

Salut André,
cette solution fonctionne très bien. C'est un exemple pour le Textbox1. À adapter pour les autres textbox.

VB:
Option Explicit

Const entrees_decimales_permises = ".,0123456789" & vbCr & vbBack
Const Point = "."
Const Virgule = ","

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    
    If KeyAscii = Asc(Point) Then
        If InStr(TextBox1, Virgule) = 0 Then
            KeyAscii = Asc(Virgule)
        Else
            KeyAscii = 0
        End If
    ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
        KeyAscii = 0
    ElseIf InStr(TextBox1, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
        KeyAscii = 0
    End If
    If KeyAscii = 13 Then SendKeys "{TAB}": KeyAscii = 0
    
End Sub

Cordialement,

Étienne
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

J'ai posté un message mais sa a du buger on dirais.

Je recommence plus simplement.

Etienne je ne parviens pas à insérer ton code au bon endroit de ma macro. J'ai remplacer la procédure de la texbox mais sa me génère une erreur quand j'insère un caractère.

Ne serait t'il pas plus simple de simplement modifier le fichier excel qui est présent 2 posts plus haut ?

Sinon je n'y arriverais pas sans avoir plus d'infos. Mes tests se sont soldés par des échecs en ce qui concerne ta modif.

De plus je me dois d'ajouter que tu as ajouté 3 "const" après "otion explicit". Or je me suis justement battu précédemment pour m'en affranchir !!! Alors j'aimerais autant que possible ne rien avoir après "option explicit". Et selon moi, il est possible de s'en passer.

Merci,
André
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Probleme avec userform basique

Bonjour André, Étienne, bonjour le forum,

En pièce jointe la version 6. Un peu différent de la proposition d'Étienne mais ça devrait répondre à tes attentes...
 

Pièces jointes

  • André_v06.xls
    76.5 KB · Affichages: 59

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

Robert,

Tes modifications sont presque en accords avec mes attentes finales. En effet, maintenant à chaque fois que l'utilisateur entre un caractère erroné il est averti de son erreur et du fait que le caractère soit supprimé.

Jusque la parfait.

MAIS

On ne peut pas entrer de virgule dans la textbox !!! Il doit s'agir d'une petite inattention de ta part surement. Ou alors je n'ai pas compris pourquoi tu as interdit le fait d'utiliser la virgule comme caractère.
Du coup, ben si je veux mettre un nombre à virgule je reçois un message d'erreur.
De plus j'ai bien remarqué que tu remplace le point par une virgule lorsque je tape un point. Le soucis c'est que même si je tape un point qui est ensuite convertit en virgule, la valeur de la variable de la textbox est reconnue par excel comme étant un nombre avec un point et non une virgule ! Le format de sortie n'est donc plus respecté. Et si j'utilise cette valeur pour des formules j'aurais des erreurs.

J'ai donc tranché : Les seuls caractères possibles sont donc "012345,6789" Si on tape un point on reçois une erreur nous invitant à entrer une virgule.

Est possible ou sa complique trop l'userform ?

Merci Robert
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Probleme avec userform basique

Bonjour le fil, bonjour le forum,

André je n'avais pas vu ton code dans le Module1... Pourquoi créer un nouveau bouton (qui couvre celui qui existe déjà) à chaque fois que tu cliques dessus ? Ça me semble incongru. J'ai effacé au moins 50 boutons dans ton fichier v06.
Aussi, je comprends pourquoi tu galérais à vouloir récupérer les variables après la fermeture de l'UserForm1 en passant la la procédure ANDRE.
De plus, pourquoi un message pour dire que l'UserForm1 va s'ouvrir. c'est inutile (à mon sens) et carrément casse-c... ! C'est comme les messages qui disent que tel ou tel caractère est interdit. À la longue ça saoule... Mais après tout les coups et les douleurs hein ! Ça ne se discute pas.

Pour la virgule tu avais raison. Comme j'utilise un clavier qwerty, le pavé numérique me fait un point (.) par défaut et donc je n'avais même pas essayé de taper une virgule via le clavier alphanumérique...

Dans la version 07 je me suis donc permis de te proposer ma vision des choses. La procédure ANDRE simplifiée. Plus de messages pour avertir de l'ouverture de l'UserForm1. Plus de messages pour indiquer si le caractère est valide ou pas. Si il est valide il s'affiche sinon rien ne se passe... tb est déclarée publique mais si tu ne dois plus l'utiliser après la fermeture de l'UserForm1, mieux vaut la déclarer au niveau UserForm.
 

Pièces jointes

  • André_v07.xls
    51.5 KB · Affichages: 50

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Probleme avec userform basique

Bonjour Robert, le Forum,

Ayé TOUT est finalement résolu. Je veux dire que maintenant, mon fichier Excel traite exactement ce que je veux qu'il fasse.

Robert, je sais que c'est Casse-C... de faire apparaître à chaque fois "le formulaire va arriver" etc etc. Mais n'oublie pas que je suis débutant et qu'il s'agit de mon tout premier userform. J'ai forcément besoin de poser des points de contrôles qui me permettent de suivre visuellement le déroulement du code et vérifier ce qu'il traite et à quel moment.

Je suis d’accord avec toi sa n'a pas d’intérêt d'annoncer la venue de l'userform, mais si tu l'annonce comme je le fais, tu arrive à mettre le programme en pause temporairement, de savoir ou tu en es dans ton code, de savoir à quel moment tu passe dans l'userform et à quel moment on en sort, de maîtriser la fonction "Show, Hide, Unload". Si je n'avance pas doucement de cette façon je suis noyé lol.
Tout comme le bouton pour lancer la Macro qui s'ajoute à chaque fois l'un sur l'autre. L'objectif c'est de lancer la Macro le plus vite possible sans passer par l'onglet "Affichage/Macro/Exécuter". Après qu'il s'ajoute les uns sur les autres je m'en fiche. Je n'en ai pas besoin pour la suite. C'est vraiment par fainéantise.

Et oui je suis débutant mais je suis curieux d'apprendre.

Donc dans ta dernière version du code, tu as tout simplifié. C'est bien. C'est ce que je vais faire à mon tour moi aussi. Mais je ne peux le faire que maintenant car je suis sur d'avoir vérifié tout les points de contrôles. Sa restait une macro de développement ;). Maintenant que l'userform fonctionne parfaitement, et bien hop direct copier/coller dans ma vrai macro et sa devrait marcher comme sur des roulettes normalement.

Du coup j'ai du remettre tout mes paramètres de tests, pendant le déroulement de l'userform ET après validation de l'userform. Notamment, malgré que tu es convertis la valeur de la texbox en Double dans l'userform, et bien quand j'insère le contenue de cette variable sous Excel ce n'est pas reconnu comme un Double. Sa me générait une erreur de format. Ce qui est gênant quand je vais faire des opérations sur cette valeur. D’où l’intérêt d'avoir placé un point de contrôle pendant l'userform et en sortie d'userform. J'ai du forcer la reconversion en double dans mon module. D'ailleurs je ne connaissais pas cette fonction. Fort pratique !

J'ai notamment remanié la saisi des caractères dans la Texbox. J'ai vu que tu avais autorisé l'insertion du point converti en virgule. J'ai jugé inutile cette action et j'ai tout simplifié. Les seuls caractères possibles sont les 10 chiffres de base et la virgule. Tout le reste n'est pas pris en compte.

J'ai également épuré pas mal de tes procédures "option" que tu as fais apparaitre. Sa ne me plaisais pas du tout, alors j'ai tout enlevé et tout simplifié (J'ai tout mis dans la procédure du "Bouton_and_clik" en fait. Sa va plus vite, sa supprime pleins de lignes, c'est plus logique à comprendre je trouve).

Et puis pour conclure, je le redis encore une fois : Je n'aime pas du tout la méthode qui consiste à mettre des variables publiques. Pour moi c'est nul ! (Je suis débutant, le jour ou je comprendrais l’intérêt des variables publiques je dirais plus sa. Mais pour l'heure c'est source de complication inutile. Bouuuh les variables publiques mdr). Du coup la encore, j'ai tout supprimé. C'est plus logique comme raisonnement selon moi.

Bon ben voila on y est arrivés tous ensembles. Bon travail. Donc encore une fois un grand merci à tous ceux qui m’ont aidé pour mon problème et qui sans le savoir m’ont fait progresser bien plus qu'ils ne le pensent. Je découvre les Macros et je trouve sa Génial tout simplement.


Évidement je poste la dernière version du fichier Excel qui fonctionne parfaitement. Si sa peut aider d'autres personnes tant mieux.

Cordialement André

Ps : Robert encore merci à toi ;). Je serais surement amené à repasser par ici je pense. Donc à bientôt^^
 

Pièces jointes

  • André_v8.xls
    63.5 KB · Affichages: 95

Discussions similaires

Statistiques des forums

Discussions
312 235
Messages
2 086 476
Membres
103 227
dernier inscrit
maloalek