récupération valeurs userform

jhlamoustache

XLDnaute Occasionnel
Chers amis du forum, bonjour

Je me tourne vers vous car je galère pour récupérer les données de mon formulaire fmChoix. Je n'ai pas réussi avec une matrice.

Je souhaite que pour chaque checkbox coché, au moins un entier positif non nul soit saisi dans l’un ou l’autre textbox en regard, sinon msgbox « Veuillez saisir un valeur » , et focus sur le premier textbox non renseigné.

Et je souhaite que pour chaque checkbox coché, soit recopié dans la zone de collage en première colonne son caption, en deuxième et troisième colonnes les valeurs respectives des textbox en regard.

Qui acceptera de me rédiger le code qui convient du bouton « valider » ?
 

Pièces jointes

  • Récup fm Choix.xlsm
    23.4 KB · Affichages: 41

Robert

XLDnaute Barbatruc
Repose en paix
Re : récupération valeurs userform

Bonjour JHLamoustache, bonjour le forum,

EN pièce jointe ton fichier modifié avec le code commenté. Pour faciliter l'écriture du code, j'ai renommé checkboxes et textboxes avec le principe suivant CBX
[X] pour la checkbox, TBX[X]1 pour la première textbox relationnée à la checkbox et TBX[X]2 pour la seconde.

J'ai aussi utilisé un module de classe pour les textboxes qui évite la fastidieuse répétition de l'événement KeyPress pour chacune d'entre elles. L 'utilisateur ne peut rentrer qu'une valeur numérique entière dans les textboxes.

Au bouton Valider final, les vérifications sont faites et, si tout est ok, les données sont renvoyées dans le tableau...
 

Pièces jointes

  • JHLamoustache_v01.xlsm
    33.7 KB · Affichages: 51

jhlamoustache

XLDnaute Occasionnel
Re : récupération valeurs userform

Bonsoir Roland,
merci de ton aide.
Voilà, j’ai ajouté une feuille « Liste Collections » et codé le chargement des CBX comme à l’origine de mon projet. (avec mes commentaires de débutant)
Mais il doit y avoir plus simple en utilisant typeof.
Je vais tâcher de coder le report des valeur en utilisant la plage nommée Zone_de_collage
 

Pièces jointes

  • JHLamoustache_v03.xlsm
    34.3 KB · Affichages: 32
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : récupération valeurs userform

Bonjour JHLamoustache (t'as pas un nom plus court ?), bonjour le forum,

En pièce jointe la version 4 où les contrôles se créent à la volée. J'ai ajouté une seconde UserForm (UserFrom1) que tu devras juste adapter à ton cas. Il y aura certainement des variables à renommer...
Attention ! La plage nommée Bricolage ne contenait que les cellules de la colonne A. L'intersection avec la colonne B était donc vide. J'ai fait comme pour les deux autres Utilisateurs, j'ai pris les lignes entières...
Le fichier :
 

Pièces jointes

  • JHLamoustache_v04.xlsm
    51.7 KB · Affichages: 52

jhlamoustache

XLDnaute Occasionnel
Re : récupération valeurs userform

Bonsoir le forum, Bonsoir Robert,
Pourquoi t’ai-je appelé Roland ??? Pour ce qui me concerne JH convient très bien.
Bizarre la zone bricolage, mais c'est anecdotique.
Tu as fait un travail épatant, et je t’en remercie.

Très malin le compte de collections pour initialiser le formulaire avec le bon nombre de CBX et TBX.
Par contre, comme tu l’avais évoqué, si la quantité de CBX devient trop importante, certains contrôles et boutons ne seront pas accessibles (hors écran). J’ai déjà ce problème. D’où la reconstruction du fmChoix en gauche et droite, qui tient sur mon petit écran (plus petit qu’au boulot). Il faudrait donc pour I =1 mettre CBX1, TBX11 et TBX12 à gauche, puis pour I = 2 mettre CBX2, TBX21, et TBX22 à droite. Et redéfinir Me.Height = HF + ((NB+1)/2 * 22) (je pense). Et s’occuper du top des boutons.

Pour le tabindex (pourquoi 4 ? je ne sais pas) et (pourquoi 5 ? je ne sais pas), je crois que c’est parce que il faut compter les 3 labels déjà présents en plus des contrôles ajoutés. J’ai lu dans l’aide que « Pour une valeur de la propriété TabIndex supérieure à la plus grande valeur d'index, le système redéfinit cette valeur sur la valeur maximale autorisée ». C’est ce qui se passe dans la procédure :
nombre initial de contrôles 5 (3 labels + 2 boutons)
nombre ajouté (3 * 9) = 27
total 32 contrôles
index max : 31
Me.CommandButton1.TabIndex = (3 * NB) + 4 'définit l'ordre de tabulation du bouton "Annuler" (pourquoi 4 ? je ne sais pas) Calculé 31 Renvoie 31
Me.CommandButton2.TabIndex = (3 * NB) + 5 'définit l'ordre de tabulation du bouton "Valider"(pourquoi 5 ? je ne sais pas) Calculé 32 Renvoie 31 et Me.CommandButton1.TabIndex corrigé à 30.
Si tu mets 3 et 4 ça fonctionne.
….
J’ai fait « tourner » et il apparait 2 indésirables :

Premièrement : Remplir un TBX sans CBX correspondant coché est possible. Or il peut s’agir d’une erreur de l’utilisateur :
Soit qu’il ait oublié de coché le CBX,
soit qu’il se soit trompé de ligne et rempli un (les) TBX au dessus ou au dessous.
Dans les deux cas, il faut l’avertir de cette anomalie

Deuxièmement : A la fin de la procédure, l’utilisateur est censé vérifier ce qui a été renvoyé. S’il veut modifier son choix il recommence. A la fin de la deuxième procédure, les nouvelles valeurs sont ajoutées dans les lignes qui suivent ce qui ne reflète pas son dernier choix. Je propose d’ajouter quelque part dans le code du bouton Valider : range(« Zone_de_collage »). ClearContents.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : récupération valeurs userform

Bonjour JH, bonjour le forum,

En pièce jointe la version 05 qui s'adapte en largeur (mais tu auras aussi un problème dans la largeur si trop de collections, plus que 27...).
• J'ai modifié le bug des textboxes contenant des valeurs si les chekcboxes dont elles dépendent ne sont pas cochées.
• J'ai aussi modifié le bouton Annuler qui est devenu Sortir. Du coup l'UserForm reste affiché après la validation. Cela permet à l'utilisateur de comparer les données de l'UserForm et celles renvoyées dans le tableau.
• J'avais, dans un premier temps, placé la mise à zéro :

Code:
Range("Zone_de_collage").ClearContents 'supprime d'éventuelles anciennes données
juste avant le renvoi des données dans le tableau avec le bouton Valider. Mais, j'ai préféré le faire au clic sur le bouton Démarrer de l'onglet Feuil1 pour garder les dernières valeur toujours visibles tant qu'on n'a pas relancer l'UserForm. Tu choisiras ce qui te convient le mieux...
 

Pièces jointes

  • JHLamoustache_v05.xlsm
    49.1 KB · Affichages: 38

jhlamoustache

XLDnaute Occasionnel
Re : récupération valeurs userform

Bonsoir Robert, bonsoir le forum
La lecture du code est vraiment une mine d’informations très instructives et éducatives. C’est un puissant antidote contre les coups de poing rageurs sur le bureau, les souris volantes et autres documents souillés par le café renversé… Merci de partager ton savoir.
Merci également pour les corrections.
D’accord pour les boutons sortir qui est équivalent, je pense, à « Enregistrer », et le bouton valider qui maintient le formulaire visible. Par contre il faudrait placer ici la mise à zéro Range("Zone_de_collage").ClearContents 'supprime d'éventuelles anciennes données.
Car sinon les choix successifs s’incrémentent, et que dans mon projet la Feuil1 ne comportera pas de bouton démarrer. En réalité, feuil1 est un nouveau classeur, créé d’après un modèle ad hoc, sur lequel on colle les données du formulaire et qui est ensuite sauvegardé. C’est en quelque sorte un bon de commande. On ne peut pas y voir plusieurs fois la même collection avec des quantités différentes.
Encore un indésirable : sur le formulaire, si rien n’est coché ni rempli, l’action sur le bouton valider n’entraîne rien d’apparent, mais ne permet pas à l’utilisateur de renoncer. Il faudrait donc un troisième bouton « Abandonner » ou « Renoncer » auquel cas le nouveau classeur ne serait pas sauvegardé.
Dans le même esprit, il faudrait coder le queryclose pour s’assurer de la décision de l’utilisateur :
Si rien n’est coché ou saisi, alors être sûr du renoncement ; ou si quelque chose est coché ou saisi, véritable renoncement, ou revenir au formulaire ?
En tous cas, gros gros merci pour l’aide fournie. Et rapide qui plus est.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : récupération valeurs userform

Bonjour JH, bonjour le forum,

En fait l'actuel bouton Sortir correspond exactement à ton bouton Abandonner ou Renoncer. Je n'ai rien prévu pour enregistrer car tu ne l'avais jamais demandé. La version 06 avec l'effacement des anciennes données au bouton Valider.
 

Pièces jointes

  • JHLamoustache_v06.xlsm
    50.4 KB · Affichages: 34

jhlamoustache

XLDnaute Occasionnel
Re : récupération valeurs userform

Bonjour le forum, bonjour Robert,

Merci de l’attention que vous portez à mon projet.
J’ai changé dans le code la commande de hauteur de l’userform1 comme suit :
Me.Height = IIf(NB < 10, HF + (CH * 23), HF + (9 * 23)) 'définit la hauteur de l'UserFomr1
'boutons
Me.CommandButton1.Top = IIf(NB < 10, HB + (CH * 23), HB + (9 * 23)) 'position haute du bouton "Annuler"
Me.CommandButton2.Top = IIf(NB < 10, HB + (CH * 23), HB + (9 * 23)) 'position haute du bouton "Valider"
Car sinon, plus on ajoutait de contrôles, plus la hauteur finale diminuait

J’ai ajouté une variable CO pour plus de robustesse (enfin j’espère).
Dim CO As Integer 'déclare la variable CO (colonne)
Définie comme suit :
CO = Plage(1).Column 'définit la colonne de la première collection
Utilisée comme cela :
A.Caption = Sheets("Liste Collections").Cells(LI, CO).Offset(I - 1, 0).Value 'définit la propriété [Caption] de la CheckBox

Concernant les boutons, c’est exact : je ne me suis pas exprimé assez clairement.
Le bouton sortir correspond bien à un abandon.
Le bouton Valider actuel correspond plutôt à un aperçu de la commande. Il faut peut-être le renommer « Aperçu ». A noter que la msgbox ne devrait pas apparaître lors du premier clic sur ce bouton.

Je pense qu’il faudrait ajouter un bouton « Commander » qui, lui, enregistrerait la commande définitivement. Qu’en pensez-vous ? J’avoue que j’ai du mal à concevoir clairement le logigramme avant de coder (voir PJ).

Pouvez-vous à nouveau m’aider ?
 

Pièces jointes

  • JHLamoustache_v07.xlsm
    38.7 KB · Affichages: 37
  • logigramme.xls
    17 KB · Affichages: 56

Robert

XLDnaute Barbatruc
Repose en paix
Re : récupération valeurs userform

Bonjour JH, bonjour le forum,

• Ok pour la hauteur, ne n'est qu'en testant qu'on affine...
• Pas compris la variable CO ? À moins que dans ton fichier d'origine tu aies des données, dans l'onglet Liste Collections, ailleurs que dans les colonnes A (pour l'utilisateur) et B (pour la collection). Sinon cette variable n'est pas nécessaire puisque ça sera toujours la colonne 2...
• Dans mes fichiers j'ai l'Option Explicit en haut de chaque module qui m'oblige à déclarer toutes mes variables. La ligne :

Code:
Set ExpBes = Workbooks.Add(Template:="E:\Expression de besoin.xltm")
provoque donc un plantage que je corrige en rajoutant la déclaration :
Code:
Dim ExpBes As Workbook
Mais sans ce fichier je ne peux aller plus loin et comprendre... J'attends donc le fichier Expression de besoin.xltm pour aller plus loin...

Tu as du mal à concevoir le logigramme ? Et moi donc ! c'est la première fois que j'en vois un... Imagine comme ça m'impressionne grave ! Surtout qu'il est super bien fait...
 

jhlamoustache

XLDnaute Occasionnel
Re : récupération valeurs userform

Bonsoir le forum, bonsoir Robert,

Pour CO, c'est vrai que dans mon projet, la colonne "nomcoll" est la 3 ème. En général je travaille avec des cellules, lignes, colonnes et plages nommées. Cela évite qu'en cas de déplacement de ces objets ce soit le foutoir dans le code et les mises à jour qui s'en suivent, même pour ces petits fichiers de développement que l'on s'échange. Autrement dit, si tu recherches une colonne nommée, et que tu affectes sa propriété column à la variable CO, le code est toujours à jour. Du moins je l'espère.
J'ai moi aussi l'option explicit, mais j'ai l'habitude de déclarer mes variables publiques. Ca m’évite de les redéfinir dans chaque procédure. Par contre il faut être rigoureux et ne pas s’emmêler les crayons dans leur utilisation. J’ai d’ailleurs ajouté un module pour y déclarer ma variable ExpBes
J’ai changé le codage de DEST car avec le fichier « expression de besoin1 » ci-joint sinon, pour le report des données, End(xlUp).offset planterait.
Ce fichier, transforme le en un modèle, car je n’ai pas de parc excel homogène (xlt, xltx,…), et adapte son chemin car ce forum n'accepte pas de fichier modèle. Pour ce faire, j’ai mis mon code en commentaire. (Set ExpBes = Workbooks.Add(Template:="E:\Expression de besoin.xltx")
J'ai transformé valider en aperçu, et j’ai ajouté un nouveau bouton valider sans code. celui-ci devrait être le même qu’aperçu, mais après on enregistre le fichier et on ferme l’user form.
Pour le logigramme, j’essaie d’en faire un, ça aide bien en général. Et si je n’y arrive pas c’est que ça ne sent pas bon. C’est le cas.
En résumé sortir referme le fichier créé sans l’enregistrer, aperçu est à peu près correct, et valider enregistre le fichier créé, ferme l’userform, et revient sur la feuille de départ.
Dans l’espérance de te lire prochainement, merci
 

Pièces jointes

  • JHLamoustache_v08.xlsm
    44.7 KB · Affichages: 43
  • Expression de besoin1.xlsx
    7.9 KB · Affichages: 34
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16