Userform et classeur Excel

Bonjour à tous !

Je reviens vers vous aujourd'hui car je débute à peine sur la création d'une userform ! Et j'aurais besoins de votre aide pour pouvoir coder toutes mes petites ComboBox et zone de texte modifiable...

En effet, j'ai créer toutes mes Userform (en multipage), et j'aimerais savoir comment coder ces ComboBox et zone de texte modifiable pour que chaque entrée de ma Userform se recopie automatiquement dans mon fichier Excel dans la bonne colonne et ligne ainsi que dans une feuille spécifique du classeur.

Voici un exemple :

Dans le fichier Excel que je vous joins, J'aimerais que (dans l'onglet "Accueil" de ma Userform), par exemple pour la première ligne "adresse du site" que le texte que l'on rentrera dans la zone de texte modifiable (à coté), soit recopié dans la feuille "Informations générales" en colonne G ligne 6.

De même, dans ma ComboBox "Pays" de l'onglet Accueil de ma Userform, j'aimerais afficher les valeurs se trouvant en colonne P de ma feuille "Informations générales" (France, Suisse, etc.) et une fois que cette liste déroulante est créer, j'aimerais que la valeur choisi dans cette liste (dans la Userform) soit recopié automatiquement en colonne G ligne 10 de ma feuille "Informations générales".

J'espère avoir été clair dans mes explications... J'espère également qu'une personne pourra m'éclairer sur les codes à utiliser car même en regardant des tutoriels sur internet je n'arrive pas à afficher une quelconque valeur....

Merci à tous pour votre aide et bonne journée !

Bonjour,

Si tu souhaite simplement mettre à jour les valeurs en fonction du contenu de ta ComboBox, il te suffit de rajouter une fonction par ComboBox (ou tout autre élément) dans le code de ton formulaire.

Double clique sur l'un de tes champs, cela devrait d'ajouter une fonction « ComboBoxX_Change », ajoute-y simplement la ligne que tu veux.

Exemple :

Private Sub ComboBox1_Change()
    ThisWorkbook.Sheets("Informations générales").Range("G6") = ComboBox1
End Sub

J'espère que ça te suffit comme réponse, n'hésite pas à demander plus de détails si besoin.

Bonjour Siritani !

Merci pour ton aide, cela fonctionne parfaitement en ce qui concernant le recopiage des entrées dans ma feuille de calcul.

J'aurais une autre questions, sais-tu comment créer une liste déroulante à partir d'une liste se trouvant dans ma feuille de calcul (pour l'afficher dans une ComboBox) qui sera ensuite recopier dans ma feuille de calcul à une certaine ligne et colonne ?

Merci beaucoup pour ton aide précieuse !


Également, j'ai oublié, est-il possible de recopier une valeur qui s'affiche automatiquement dans ma feuille de calcul, dans ma UserForm (dans une ComboBox ou une zone de texte ?).

Merci à vous

Bonjour Lamonfle,

En PJ un exemple d'application avec les codes nécessaires pour gérer un éventail de contrôles dans des UserForms.

Certains événements se déclenchent à partir des contrôles des UserForms, d'autres à partir des boutons posés sur les feuilles.

L'idée générale est la suivante :

  • laisser à Excel ce qu'il sait faire tout seul (Recherches, Filtres, etc... sur des données réparties dans des listes - 1 liste par feuille)
  • assister l'utilisateur dans les opérations de gestion (Ajout, Modification, Suppression, écriture automatisée des formules)
  • protéger les données, les formules et la structure des feuilles (gestion automatisée de la protection)

Ce n'est qu'une suggestion parmi différentes méthodes ! Espérant avoir aidé,

A+ Daniel

108gestion-de-stock.xlsm (140.11 Ko)

Bonjour Daniel,

Merci pour ta participation, ton fichier me permettra d'approfondir mes connaissances en Excel même si je t'avoue que j'ai quand même assez de mal à tous comprendre étant donné que mes connaissances en VBA sont extrêmement limitées...

Mais je suis preneur de tout document pouvant m'expliquer le fonctionnement complet des Maccros afin de m'auto-former (je ne demande que ça).

En fait, pour mon projet j'ai besoins de 3 choses :

1- savoir comment créer une liste déroulante avec une ComboBox (à partir de valeurs de ma feuille de calcul ou en ajoutant directement les valeurs dans mes maccros) pour ensuite que le choix de la liste déroulante soit recopier dans ma feuille de calcul

2- Afficher dans mes "zones de textes" de ma Userform, des valeurs présente dans ma feuille de calcul

3- (bonus) faire une multiplication entre deux valeurs présentes dans mes zones de textes ou comboBox pour l'afficher dans une autre zone de texte de ma Userform.

En tout cas je te remercie Daniel, si tu as des documents intéressants pour apprendre le VBA je suis preneur et tu peux m'écrire en MP

Ok, je te confirme que tous tes besoins sont couverts dans l'exemple de Gestion de Stocks fourni :

- rechercher "Afficher_Form_Modif_Entrée", par exemple, dans le code, pour voir les instructions qui se rapportent au chargement dans les contrôles des UserForms de valeurs présentes dans les cellules ;

- rechercher les événements "Bouton_Valider_Click" dans le code pour voir les instructions qui répercutent les données des UserForms dans les cellules, et les contrôles effectués à cette occasion

- rechercher l'instruction "Formula"dans le code pour voir comment écrire une formule dans des cellules à partir du UserForm

Voilà, tout n'est pas optimal sans doute, mais c'est une piste...

Tout le reste est sur ce forum !

A+ Daniel

Tout d'abord je tiens à dire que je n'ai pas ouvert le classeur de Daniel, je ne peux pas le télécharger d'ici, donc tu risque de retrouver ce que je te dis là dans le fichier qu'il t'a transmis.

Sinon, pour les ComboBox (et les ListBox) je ne suis pas un expert, mais j'ai fais deux-trois tests et je peux déjà te dire ça :

Tu ajoute un élément dans la liste avec la propriété AddItem :

ComboBox1.AddItem "Ce que tu veux ajouter"

Tu peux définir directement la liste de ta ComboBox avec la propriété List (et tu peux utiliser une colonne de ton classeur) :

ComboBox1.List = ThisWorkbook.Sheets(1).Range("A1:A4").Value

Tu change la valeur de ta ComboBox avec la propriété Value :

ComboBox1.Value = "Valeur de la ComboBox"

Tu peux également définir la valeur en fonction de son numéro dans la liste déjà définie avec la propriété ListIndex :

ComboBox1.ListIndex = 0 'Prend la première valeur de la liste

Tu peux placer ce code dans la fonction Initialize de ton UserForm, ou dans la fonction Activate en fonction de tes besoins. La fonction Initialize se lance à la première ouverture de ton UserForm, c'est à dire que si tu le masque et le ré-appelle, les données ne seront pas rechargées. Alors que la fonction Activate te permettra de changer les données chaque fois que tu ré-active ton UserForm.

Tu peux également regarder les autres fonctions disponibles pour ton UserForm, il te suffit de double-cliquer dessus, et de choisir la fonction dans le champs situé en haut à droite de l'éditeur (par défaut, il te propose la fonction Click)

Comme je ne suis pas sûr d'être très clair, voici un exemple de ce que tu peux faire (il te faudra au préalable remplir les cases A1 à A4 dans la feuille N°1 de ton classeur si tu veux le tester) :

Private Sub UserForm_Initialize()
    ComboBox1.List = ThisWorkbook.Sheets(1).Range("A1:A4").Value
    ComboBox1.ListIndex = 1
End Sub

Pour ton Bonus :

Soit tu utilise une formule, soit tu peux utiliser quelque chose comme ça :

Dim i As Integer

For i = 1 To 4
    With ThisWorkbook.Sheets(1)
        ComboBox1.AddItem .Cells(i, 1).Value * .Cells(i, 2).Value 'Ai * Bi
    End With
Next

Bonjour à tous !

Veuillez m'excuser pour mon retard, je n'ai pas pu me connecter sur le forum avant aujourd'hui...

Un grand merci à Dan et Siritani pour votre aide, j'ai réussis à incrémenter mes listes déroulantes ce qui est déjà un très bon point !

Pour le bonus également cela fonctionne !

J'ai quand même une petite dernière question...

J'ai essayer et j'ai un début de piste..; mais cela ne fonctionne pas correctement. En effet, j'aimerais que la valeur choisis dans le ComboBox soit retranscris dans une cellule bien précise de ma feuille Excel. Le problème est que lorsque je choisis une valeur dans le ComboBox, seule la première valeur se recopie, peu importe qu'on sélectionne la 3ième par exemple.. Auriez vous une idée ?

Voici mon code (qui ne fonctionne pas vraiment) :

ComboBox248.List = ThisWorkbook.Sheets("formulaire").Range("A2:A3").Value

' J'insère la valeur de ma liste déroulante dans la cellule correspondante

ThisWorkbook.Sheets("Clims existantes").Range("A10") = ComboBox248.List

' seule la première valeur de ma ComboBox est recopié (les autres ne sont pas sélectionnées)

Auriez vous une solution ?

Merci !

Lamonfle a écrit :

ThisWorkbook.Sheets("Clims existantes").Range("A10") = ComboBox248.List

Essaie

Lamonfle a écrit :

ThisWorkbook.Sheets("Clims existantes").Range("A10") = ComboBox248.value

Bonjour Dan !

Effectivement j'y avais pensé, mais quand je mets ".Value" rien ne s'affiche. Seulement avec ".List" ma macro me renvoie une valeur...

Peux-tu joindre ton fichier ?

bien-sûr, le voici

Oula...

Je m'attendais à trouver une procédure de validation pour ton problème, mais je ne trouve qu'une procédure Form Initialize, qui ne correspond pas à ce que tu veux faire puisqu'elle se déroule au chargement du formulaire et non suite à une modification des contrôles...

Il faudrait écrire un bout de code lancé par un click sur un bouton Validation, par exemple... mais je ne vois pas non plus de liste organisée où tes données seraient écrites en sortie de formulaire... Dans ce cas, la propriété value pourra être utilisée pour affecter une cellule...

Bref, je ne sais pas si je vais pouvoir t'aider bien au-delà, parce que pour ce qui me concerne, je n'ai pas vraiment l'habitude d'organiser mes données comme cela... (voir mon exemple de gestion de stock)...

Mais peut-être que ton fichier joint ne reflète qu'une partie du travail... C'est ce que laissent présager les références aux feuilles absentes de ton envoi...

A+ Daniel

oui effectivement Dan, mon fichier étant très volumineux (12Mo) je suis obligé d'enlever toutes les bases de données et autres... Puis-je te l'envoyer par un autre moyen si tu veux le regarder en entier ?

Je m'attendais à trouver une procédure de validation pour ton problème, mais je ne trouve qu'une procédure Form Initialize, qui ne correspond pas à ce que tu veux faire puisqu'elle se déroule au chargement du formulaire et non suite à une modification des contrôles...

Justement, j'utilise "Initialize" car je débute en Excel... Mais c'est effectivement ce que je voudrais faire, garder mes données et les afficher en fonction de ce que l'on rentre dans l'Userform.

Si tu le souhaites, je peux te le transférer par un autre moyen, en MP peut-être ?

merci

Comment dire... il y a plusieurs choses que je modifierais dans l'approche, et je ne pense pas que l'envoi de ton fichier me permette de le faire vu les volumes de données...

Ce que je pourrais te conseiller avant d'aller plus loin, ce serait la méthode suivante :

1- identifier les feuilles nécessaires (sites, chambres froides, clims, etc...) et construire les listes à raison d'une liste par feuille, contenant tout ce qu'il faut pour :

  • faire les calculs internes à une feuille (rédiger des formules vérifiées), relier les feuilles entre elles (totaliser les données d'un site, par exemple)
  • pouvoir filtrer simplement les données (d'un site, par exemple), mais aussi plus tard faire le diagnostic d'un site à l'aide des filtres élaborés, voire éditer la fiche signalétique d'un site ou d'une installation
  • fournir des facilités et des contrôles de saisie avec les données de validation, illustrer le tout avec les mises en forme conditionnelles
  • éliminer les cas d'énumérations (clim 1, clim 2, clim 3) et remplacer cela par des saisies organisées en liste (une ligne par clim)
  • confectionner des tableaux de bord et autres stats avec des tableaux croisés dynamiques

2 - une fois ce travail effectué, et seulement à ce moment là, construire les formulaires (un par feuille ?), dans le but de mieux contrôler la saisie, d'assister et conduire les utilisateurs...

Avec cette méthode, on commence par faire fonctionner le classeur sans les formulaires, uniquement avec les feuilles, notamment parce que les modifications de code VBA, nécessaires pour les seuls formulaires, coûtent de plus en plus cher au fur et à mesure de l'avancée du projet...

Mais encore un fois, tu as peut-être déjà fait ce travail, même s'il ne se voit pas dans ton envoi...

Dans ce cas, essaie de placer l'écriture de la propriété Value comme suggéré, c'est-à-dire à la sortie du formulaire...

A+ Daniel

Bonjour Dan, bonjour le forum !

J'ai enfin réussi en tapant la formule ci-dessous ! je ne comprends pas pourquoi ça n'a pas marché des le début... mais ce qui est important c'est que ça marche désormais !

ThisWorkbook.Sheets("feuilleXXX").Range("G10").Value = ComboBox7.Value

j'aurais aimé savoir une dernière petite infos en passant !

Comment faire pour enregistrer les informations que je tape dans ma Userform (Combobox ou textBox) sachant qu'elles s'écrivent dans mes feuilles de calculs afin que ma Userform ne soit pas vide quand je la ré-ouvre ? (avec un bouton par exemple pour enregistrer ?)

Est existe-t-il une formule afin de pouvoir passer d'un onglet à l'autre de ma Userform multi page ? (peut-être peut on combiner mes deux questions ?, c'est à dire enregistrer en cliquant sur le bouton pour passer à l'onglet suivant de ma Userform multi page ?)

Merci beaucoup et bonne journée à tous !

On peut tout faire (ou presque) avec Excel et VBA... Du plus simple au plus compliqué....

Tu as choisi de démarrer avec le plus compliqué (voir ton UserForm1)... (et encore, en général, un assistant de saisie comme celui que tu projettes permet en principe de revenir en arrière, avec un bouton "Précédent" par exemple)...

En repartant de mon exemple de Gestion des Stocks, tu trouveras toutes les méthodes et instructions pour les interactions entre une feuille et un UserForm... Mais cela suppose de commencer avec des choses simples, pour bien anticiper les choix stratégiques successifs, comme la nécessité d'un bouton "Précédent", qui pose de vraies questions :

  • faut-il écrire les données du formulaire dans les cellules des feuilles après la saisie dans chaque onglet de formulaire, ou bien sur validation globale du formulaire ?
  • dans le premier cas, il faut donner la possibilité de retrouver les valeurs d'origine si l'utilisateur abandonne la saisie...
  • dans le deuxième, il faut rédiger tout le code d'écriture dans les cellules à la suite, avec un risque d'erreurs important...
  • dans les deux cas, le formulaire ne sera exploitable que quand tout sera terminé, et les modifications qui découlent souvent de l'usage coûteront très cher...

Voilà, je sais que ça n'est pas ce que tu voulais entendre, mais perso, je créerais plusieurs formulaires différents (un par liste ou feuille), et je n'attaquerais le deuxième que quand je serais satisfait de la structure des données dans le classeur et de mon premier formulaire...

A+ Daniel

Merci pour ton aide Dan,

Mais malheureusement je ne peux pas me permettre de faire comme dans ton fichier "gestion de stock". En effet, ce programme s'adressera à des clients qui ne devront voir seulement ce formulaire et non le fichier Excel dans sa totalité (totalement incompréhensible pour un utilisateur non avertit).

J'ai réussis à naviguer entre mes différents onglets via un simple bouton (suivant & précédent) voici le code tout simple pour ceux qui en ont besoins :

Private Sub CommandButton1_Click()

MultiPage1.Value = 1

End Sub

Il ne me reste plus qu'à réussir à afficher de façon automatique certaines infos ce trouvant dans mes cellules de mon fichier Excel.

Je clôture le sujet, merci pour ton aide !

Lamonfle a écrit :

Il ne me reste plus qu'à réussir à afficher de façon automatique certaines infos ce trouvant dans mes cellules de mon fichier Excel.

Pas sûr que tu reviennes là-dessus, mais tant pis :

Parmi les méthodes pour charger les infos des cellules dans le formulaire, il y en a une qui n'est pas souvent utilisée, et je trouve cela bien dommage, car c'est la plus simple, et aussi celle qui profite le mieux de ce qu'Excel sait faire tout seul :

Cela consiste simplement à charger les infos de la ligne de la cellule active.

L'utilisateur n'a qu'à sélectionner la ligne voulue (avec les moyens qu'Excel met à notre disposition, comme la recherche CTRL+F ou les filtres, etc.), puis à cliquer sur un bouton Modifier. Le code se charge (voir les exemples dans Gestion des Stocks plus haut dans ce même sujet) d'approvisionner les contrôles du formulaire avec les valeurs de la ligne courante...

Pas besoin dans ce cas de prévoir, dans le formulaire, des contrôles et des modules complexes pour la recherche de l'enregistrement à modifier : on est dessus !

Espérant avoir aidé,

A+ Daniel

Rechercher des sujets similaires à "userform classeur"