Renvoyer texte avec checkbox

Bonjour à tous

Voici mon petit soucis je n'arrive pas à renvoyé d'un userform, (UserForm2), le texte quand je le coche ou décoché le checbox vers mon tableau excel, selon ce que je lui ai défini

Et je récupere autre valeur quand je le récupere dans l'Userform1

Et dernier petit soucis comment obliger le remplissage des champs sauf le champ e

Merci d avance de votre aide

24projet.xlsm (25.52 Ko)

Bonjour,

La propriété par défaut est Value, et tu utilises le libellé (propriété Caption).

Merci MFerrand

pour m'avoir répondu

Donc ce n'est pas la bonne solutions ?

Je tai expliqué ce que tu fais : tu modifies la propriété Caption du Userform selon que la propriété Value (coché ou non ) est VRAI ou FAUX. Tu affectes la valeur de la propriété Value, tu as donc VRAI ou FAUX dans la cellule !

Le sachant, tu rectifies selon ce que tu veux faire !!

[NB- Si tu mentionnes le nom d'un contrôle tout seul, s'il ne peut être invoqué en tant qu'objet c'est sa propriété par défaut qui est retenue, laquelle est Value...

Pour ma part je trouve préférable, s'agissant des contrôles de mentionner systématiquement la propriété recherchée, ayant parfois eu des surprises avec certaines données... ]

Désolé MFerrand

Je ne comprend pas ce que tu m'explique

Il vaudrait mieux comprendre pour pouvoir utiliser les Userforms et leurs contrôles, et même VBA tout court car la notion d'objet, de propriété et de propriété par défaut fait partie des rudiments de VBA !

Merci MFerrand

J'ai enfin compris ce que tu voulez me dire

Je suis long a la détente ^^

Il me reste plus qu'a trouvé comment rendre obligatoire la saisie des champs sauf 1

21projet.xlsm (26.84 Ko)

Vu la façon dont tu codes l'affectation, sans tableau et sans boucle, il te suffit supprimer l'affectation du champ que tu veux éviter.

Bonjour à tous

Merci pour tes conseil MFerrand

j'ai reussi à obligé la saisie de mes champs

Maintenant j'essaye d'améliorer mon code, aurais tu des conseils MFerrand stp

Merci d avance

27projet.xlsm (29.01 Ko)

Bonjour,

Sans doute, mais il serait bon d'abord que tu explique la finalité de ton projet (car c'est à partir de ce qu'on veut faire que le comment le faire le mieux se pose...) et pourquoi tu as 2 Userforms quasi identiques...

Cordialement.

Bonjour

l'UserForm1 sert à recherché et le second sert à rentré les informations

Bonjour,

J'ai procédé à un examen panoramique de ton projet, et pour préparer le terrain j'ai commencé par par supprimer tous les commentaires et indenter les procédures...

Il me faudrait avant d'entrer dans le vif du sujet (et commencer par fusionner les 2 Userform en 1, un suffit pour remplir toutes les fonctions), quelques informations sur la nature des données à insérer dans la base (les intitulés par lettres sont peu éclairants et le type exact de données risque toujours d'avoir une incidence qu'il vaut mieux anticiper).

J'ai souvenir en particulier d'une exception dont tu as parlé concernant la colonne E, qui n'apparaît nullement dans le projet que j'ai, et il serait bon que j'en sache un peu plus là-dessus s'il faut en tenir compte.

Attends-toi à voir globalement diminuer le volume de code, à la fois parce que la fusion éliminera la répétition d'éléments communs, et aussi parce que tu initialises des propriétés par défaut qui soit se fixent au niveau conception dans la fenêtre de propriété, soit sont des propriétés que les contrôles ont par défaut sans qu'on ait à intervenir, ce qui éliminera le code afférent.

J'ai noté que tu lances à l'ouverture le Userform de recherche, on ouvrira donc en mode recherche (toutefois, tant que la base est vide, il n'y a rien à rechercher...) En principe le mode recherche est également destiné à pouvoir modifier un enregistrement de la base, mais je n'ai rien vu en ce sens ? Il serait bon de m'éclairer sur ce point et confirmer ou non la faculté de modifier...

Je peux prévoir que la bascule entre ajout (nouvel enregistrement) et modif (si modif il y a) se fasse automatiquement (le programme peut détecter...) et dans ce cas, par sécurité on a un bouton Ajout (ou Nouveau) et un bouton Modifier dont seul celui correspondant au mode en cours est actif. (NB- la bascule est détectée automatiquement selon qu'il y a sélection d'un élément existant dans la Combo de recherche, ou saisie d'un élément non présent dans la liste.)

Ou bien on peut laisser la bascule entre les modes à l'initiative de l'utilisateur (OptionButton) et selon son choix, la Combo de recherche est affichée ou masquée (alternativement avec une TextBox de saisie). Dans ce cas, un seul bouton de validation...

Indique-moi tes préférences en la matière. Il n'y a pas de raison objective à privilégier l'un ou l'autre, c'est une question de préférence personnelle...

Cordialement.

Bonjour MFerrand

Merci de ton attention.

j'aimerai laisser la bascule entre les modes à l'initiative de l'utilisateur

Merci d avance

Bonjour,

J'en prends note, mais mes questions ne se limitaient pas à ce point !

Si tu ne me donne pas plus d'indication sur les données (type exact des données de chaque colonne) et sur la colonne E, tu risques fort d'avoir quelques surprises par la suite...

Cordialement.

Mon but pour l'instant est d'apprendre et de voir et apprendre a faire un code propre.

Donc je n'ai pas de type exact de donnée à te fournir

Cordialement.

Bonjour,

Voilà donc un modèle à étudier... fait à partir de ton projet initial avec un certain nombre de modification.

Un seul Userform (qui fusionne les fonctions des deux précédents).

Les contrôles ont été renommés (c'est toujours conseillé, pour les rendre plus parlants, éventuellement raccourcir les noms (ça, c'est un critère perso auquel je tiens ! , pour faciliter la réalisation de boucles pour les parcourir).

Pour faciliter les boucles, on prend souvent un même nom générique pour une série de contrôles auquel on ajoute un numéro d'ordre. Je ne l'ai pas fait ici, mais ça n'empêche pas de faire des boucles (rien ne l'empêche ! ). Ici j'ai utilisé l'intermédiaire d'un tableau des parties variables des noms de contrôle pour boucler... mais il y a d'autres méthodes (par exemple l'utilisation du Tag comme identifiant de la fonction du contrôle, on boucle alors sur tous les contrôles et on agit selon le Tag)...

ComboBox (renommée cbxA) : une TextBox est superposée sur la Combo (nommée tbA), quand l'un est visible l'autre ne l'est pas selon qu'on est en mode Rechercher ou Nouveau.

Comme tu ouvrais sur la recherche, par défaut la Combo est visible et la TextBox non (NB- les propriétés par défaut se mettent "en dur" dans la fenêtre de propriétés, dans le code on s'occupe des changements).

Les autres TextBox sont renommés tbB à E.

Deux OptionButton rajoutés (opbR et opbN) : Rechercher et Nouveau. Par défaut opbR est à True, donc l'autre à False.

Deux ChckBox (chbF et chbG). Deux boutons : Valider (cbValid) et Quitter (cbQuit).

Une variable module : lgn, accueille le numéro de ligne lorsqu'une sélection est faite dans la Combo, est à 0 si on est en mode Nouveau (la procédure de validation lui affectera le numéro de ligne).

La colonne A de la base est nommée (nom dynamique utilisant la fonction DECALER) : colA. Le dimensionnement de la plage nommée est fait sur le nombre de valeurs de la colonne, sans ôter 1 pour compenser l'en-tête. La plage nommée inclut donc une ligne vide à la fin (la ligne d'insertion d'un nouvel élément), ce qui permet qu'elle soit toujours définie même si la base est vide.

Cette plage est utilisée pour alimenter la liste de la Combo, pour prélever les données alimentant les TextBox et autres contrôles, et pour affecter les données validées.

L'utilisation de cette plage nommée (donc accessible directement par son nom) permet de se passer de toute référence à la feuille.

Voilà pour les données générales.

Suite -

J'ai laissé le lancement à l'ouverture du classeur, mais j'ai rajouté un bouton sur la feuille pour qu'on puisse le relancer après l'avoir fermé.

La proc. d'initialisation est réduite : elle teste si la plage nommée a plus d'une ligne. Si c'est le cas, elle lance une proc. InitListe qui initialise la ComboBox.

La proc. distingue le cas où la base ne comprend qu'une ligne (utilisation de AddItem, List ne fonctionnerait pas)...

Cette proc. vide la liste éventuellement existante (ce n'est nécessaire que dans un cas qui peut ne pas se produire, mais comme il est possible... cas où la liste ne comprend qu'un item, des changements successifs de mode pourraient aboutir à ajouter le même item à la liste (le seul) à chaque retour sur Rechercher.

Si la base est vide (la plage n'a alors qu'une ligne), ce qui se produira lors du démarrage avec base vide, le mode Rechercher ne pouvant rien offrir, on bascule en mode Nouveau d'office en mettant opbN à True. C'est tout ce que fait la proc. d'initialisation, car la mise à True de opbN va actionner la procédure liée au bouton d'option, laquelle se charge du reste : masquer la Combo, afficher la TextBox alternative (la vider au cas où...), lancer une proc. InitCtrl qui vide les autres contrôles (pas nécessaire au départ, mais la proc. se déclenchera essentiellement sur action de l'utilisateur...), mettre la variable lgn à 0.

Cela devrait te suffire pour démarrer... mais 2 ou 3 points d'explication complémentaire seront peut-être utiles :

Pour les CheckBox j'ai bien sûr conservé ton utilisation de Caption. Mais ne s'agissant pas dans ton projet d'une données à saisie obligatoire, j'ai passé à True la propriété TripleState, les CheckBox peuvent ainsi prendre la valeur Null et ont cette valeur par défaut.

La sélection d'un élément dans la ComboBox (voir la proc. attachée) entraîne l'extraction de la propriété ListIndex (en ajoutant 1 à sa valeur) dans une variable. Si la variable est supérieure à 0 (un élément a été sélectionné), alors : on lance la proc. InitCtrl (qui vide les contrôles, la sélection pouvant succéder directement à une sélection antérieure), sa valeur est affectée à lgn (numéro de ligne dans la plage) et une proc. AffichSelec assortie du numéro de ligne en argument est lancée, qui ira chercher les données dans la base pour les affecter aux contrôles.

Si la valeur de la variable est nulle (ListIndex = -1), on teste la valeur de la Combo. Si elle est vide, on lance aussi la proc. InitCtrl pour les vider. J'ai d'ailleurs omis (je viens de voir) le retour de lgn = 0, qu'il serait prudent de rajouter.

Mais si la Combo contient une valeur alors que ListIndex est à -1, c'est qu'on est dans le cas où l'utilisateur a modifié manuellement le contenu de la Combo qui n'est donc plus dans la liste, mais dans ce cas on ne bouge pas...)

NB- Cet aspect pourrait entraîner des désagréements avec la proc. Change qui se déclenche éventuellement plusieurs fois lors de saisie manuelle, si elle peut matcher sur un item de la liste... A surveiller pour éventuellement basculer le déclenchement sur un autre évènement.

Pour le reste, tu noteras l'utilisation assez générale de tableaux... Je n'ai pas testé tous les cas possibles qui se présenteront, donc à toi de dire si des dysfonctionnement surviennent et dans quels cas...

Et si tu as besoin d'explications sur d'autres points, tu demandes !

Cordialement.

Bonjour MFerrand

Merci beaucoup de ton aide, je suis entrain de regarder ton code en ce moment,

Je m'aperçois que j'ai encore boulot a apprendre sur le vba

Je passe mon sujet en résolu, par contre je te tiens au courants des tests

Encore un grand merci

Cordialement.

Rechercher des sujets similaires à "renvoyer texte checkbox"