Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Création formulaire VBA

gui1987

XLDnaute Nouveau
Bonjour à vous,

Je suis nouveau sur le forum et novice en VBA et je souhaitais votre aide car je voudrais faire un formulaire pour des demandes d'achat avec différentes conditions mais je n'arrive pas à faire ce que je voudrais.
J'ai mis les instructions de ce que je voudrais arriver à faire dans le fichier excel joint, je pense que ça doit être faisable mais avec ma faible connaissance je n'y arrive pas.
Pouvez-vous m'aider ?
Si mes instructions ne sont pas claires n'hésitez pas à me demander à les éclaircir.
En espérant qu'une âme charitable saura m'aider
Merci d'avance
 

Pièces jointes

  • Formulaire DA.xlsm
    64.3 KB · Affichages: 72

gui1987

XLDnaute Nouveau
Non je ne souhaite pas que les lignes soient toujours ajoutées au début, c'est juste la 1ère fois que je fais ajouter alors l'implémentation se fait à partir de la ligne 3 et ensuite pas de souci ligne 4, ligne 5 etc mais pourquoi ça ne débute pas à partir de la ligne 2 ?

Ensuite pour la CBxNbDevis s'il n'est pas possible de la traiter directement avec la TBxMtt il me semble qu'il faut conserver une combobox car c'est pas un choix mais plutôt un "pense bête", lorsque montant < 5000€ alors il faut 1 devis, si entre 5000 et 25000€ alors 2 devis... Donc je ne souhaite pas que la personne indique le nb de devis qu'elle met mais plutôt un rappel de la règle. C'est moi qui impose ce choix.
Vous évoquez la possibilité d'utiliser une Private Sub TBxMtt_Change(), cela permettrait-il de se passer des 2 combobox citées dans les précédents messages afin d'alléger le formulaire ?

Merci
 

Dranreb

XLDnaute Barbatruc
Parce que le tableau n'était pas vide, vu qu'il contenait des lignes vides.
Non, ça ne permet pas de se passer de la CBxMontant dans l'état actuel des choses, mais ça peut permettre de la piloter. À moins que vous reprogrammiez dans l'UserForm toute la logique reflétée par la TabL dont on n'aurait alors plus besoin.
La CBxMttDevis, oui, ça pourrait permettre de s'en passer ainsi que de tout ce qui se rapporte à la TabD, y compris les dispositifs CLsD et CAsD, car ça semble beaucoup plus simple.
Mais si ce sont des pense bête, c'est dans des Label qu'il faut afficher ça, pas dans des TextBox, encore moins dans des ComboBox.
Toujours pas compris pourquoi c'est 'M'. Il n'y en a pas un seul dans 'Tableau export'. J'aurais mieux compris 'X' ! Mais si vous voulez le savoir je m'étais déjà heurté pour quelqu'un à un impossible CAsE qui se confondait avec le mot clé VBA Case !

Édition: J'ai redécouvert une méthode Filtrer de l'objet ComboBoxLiées dont j'avais oublié l'existence.
Elle pourrait peut être permettre, à terme, d'éliminer la CBxMontant …
 

Pièces jointes

  • CLsCAsGui1987.xlsm
    181.1 KB · Affichages: 6
Dernière édition:

gui1987

XLDnaute Nouveau
Bonjour et encore merci.

C'est parfait pour l'export des données ça débute bien à la ligne 2.
Concernant la CBxMontant c'est largement suffisant ce que vous avez fait pour la contrôler pas besoin d'aller plus loin.
Est-ce possible de faire la même chose pour la CBxMttDevis ?
Vous évoquez la possibilité de faire des labels pour les penses bêtes à quoi cela ressemblerait ? L'idée est de rappeler aux personnes qui vont faire la demande que lorsque c'est XXX € alors il y tant de devis à proposer.

Pour le M il n'y a aucune logique vu que le E ne fonctionnait pas j'ai pris une lettre au hasard mais effectivement le X aurait été plus intelligent.
 

Pièces jointes

  • CLsCAsGui1987.xlsm
    195.2 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Bonjour.
Oui, bien sûr il est possible d'ajouter un deuxième Select Case V dans la Sub TBxMtt_Change pour modifier aussi la CBxMttDevis.
Ce à quoi ça ressemblerait dépendrait de ce que vous leur mettriez comme BackColor et BorderStyle. 2 — fmSpecialEffectSunken me parait bien pour un Label d'information.
Les TextBox1 et TexBox2 devraient être remplacées par des LabPensBêt1 et LabPensBêt2 par exemple, car je doute qu'ils soient saisissables …
 
Dernière édition:

gui1987

XLDnaute Nouveau
Parfait j'ai réussi à lier le CBxMttDevis au TBxMtt donc c'est nickel.
Faut que je fasse le point sur ce que j'ai besoin d'autres comme information et je reviens vers vous si j'ai d'autres questions.
Merci encore
 

Pièces jointes

  • CLsCAsGui1987.xlsm
    195.3 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Je ne comprend vraiment pas la logique de la CBxNbDevis prise en charge par CLsD.
Si on y sélectionne quelque chose ça change la CBxMttDevis, ce qui ne devrait pas être possible
Ça devrait vraiment à mon avis être une TBxNbDevis, voire un LabNbDevis, pris en charge par CAsD !
 

gui1987

XLDnaute Nouveau
Bonjour,
J'ai 2 questions :
- comment faire en sorte que lorsque j'appuie sur CBnEffacer, la TBxMtt s'efface également ?
- comment faire en sorte que lorsque j'appuie sur CBnQuitter, on quitte le formulaire ?

J'ai essayé plusieurs solutions qui ont fonctionné mais le problème que j'ai rencontré est que lorsque je lançais le formulaire et que je le validais une 1ère fois lorsque je voulais faire une 2ème saisie alors les infos de la 1ère remontaient directement dans le formulaire lorsque je tapais dans TBxMtt.

Je ne sais pas pourquoi ça me faisait ça et si cela venait des modifs que j'avais faite sur la CBnEffacer et la CBnQuitter? Pouvez-vous m'aider ?

Merci d'avance
 

Pièces jointes

  • CLsCAsGui1987.xlsm
    185.2 KB · Affichages: 9

Dranreb

XLDnaute Barbatruc
Bonjour
Déjà, d'habitude j'utilise un seul bouton pour Effacer et Quitter. Encore que ça ne sert pas à grand chose puisqu'on peut fermer l'UserForm avec la croix de fermuture en haut à droite, mais ça permet de le fermer avec la touche Echap
S'il n'y a qu'une ligne pour un certain code projet, c'est normal qu'elle soit proposée à la modification jusqu'à ce que vous tapiez une date qui n'existe pas.
Pour vider les contrôles associés quand une ComboBox prise en charge par CLsD change, ajoutez une instruction CAsD.ValeursDepuis TVLD juste avant la End Sub de la Sub CLsD_Change
 

gui1987

XLDnaute Nouveau
Bonjour,
Cela veut sire que si vous appuyez sur le bouton Effacer ça quitte le formulaire ? C'est dommage sachant que lorsqu'on efface c'est généralement pour refaire une saisie ce qui nous oblige à rouvrir le formulaire.
Si je souhaite conserver le bouton Quitter quel est le code que je dois mettre ?

L'instruction CAsD.ValeursDepuis TVLD ne fonctionne pas et une erreur apparait lorsque je mets cette instruction avant la end sub de la sub CLsD_Change.

Merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pas s'il affiche "Effacer" bien sûr, seulement à la seconde fois, où il affiche après "Quitter".
Ce sont bien deux fonctions différentes mais sur le bouton actionnable aussi par touche Echap.
Sinon, un bouton juste pour quitter est inutile puisqu'il existe déjà en hau à droite de barre de titre de la fenêtre.
Zut ! J'ai oublié, pour pouvoir faire CAsD.ValeursDepuis TVLD, il faut aussi juste avant une instruction :
VB:
ReDim TVLD(1 To 1, 1 To CLsD.Colonnes.Count)
 

Dranreb

XLDnaute Barbatruc
Mais … dans le dernier classeur joint il n'y a toujours pas de ControlsAssocié pour la TabD !
Vous n'avez toujours pas remplacé la seconde ComboBox gérée pars CLsD par une TextBox gérée par CAsD ?
Écoutez je suis complètement perdu dans votre UserForm. Alors appliquez vous même le principe
Pour effacer les ComBoBox prises en charge par un ComboBoxLiées, on utilise simplement sa méthode Nettoyer. Pour effacer les contrôles associés correspondants, dans sa Sub _Change, si le nombre de lignes trouvées en correspondance est différent de 1 (argument NbrLgn) on lui fabrique un TVL vide (rappel: TVL: Tableau des Valeurs de la Ligne) qu'on demande au ControlsAssociés qui va avec d'appliquer par sa méthode ValeursDepuis (Parce que si NbrLgn = 1 c'est la _BingoUn qui est aussitôt exécutée après, et dans ce cas c'est le TVL pris de la ligne unique trouvée qu'on applique)
 
Dernière édition:

gui1987

XLDnaute Nouveau
Bonjour,

Et merci pour vos différents commentaires.
Pour la CAsD.ValeursDepuis TVLD, malgré l'ajout de l'instruction supplémentaire cela ne fonctionne toujours pas.
Concernant les autres commentaires je vous avoue que j'ai du mal à tout suivre... je trouve que le userform fonctionne pas mal même s'il doit effectivement y avoir des erreurs de codage.

J'ai une question concernant l'ajout de donnée dans l'onglet "Tableau_Export". Lorsque je fais une simulation avec le userform et que je sélectionne toutes les infos nécessaires avec comme hypothèse "Investissement" dans CBxTypeCde et que je fais Ajouter alors il n'y a pas de problème l'export se fait bien et quand je fais une nouvelle simulation alors je peux reprendre du début.


En revanche si je fais la même chose avec comme hypothèse "DA" dans CBxTypeCde et que je fais ajouter alors l'export fonctionne parfaitement mais lorsque je relance un nouveau formulaire alors ça me met en automatique les infos du formulaire que je viens d'exporter pour le modifier. Or je voudrais que ce soit comme dans l'exemple précédent ou lorsque je fais un ajout que je quitte le formulaire et que je le rouvre pour faire une nouvelle saisie il n'y ait pas l'implémentation automatique du dernier ajout.



Comment faire ?

Merci
 

Pièces jointes

  • Formulaire DA final.xlsm
    185.3 KB · Affichages: 5

Dranreb

XLDnaute Barbatruc
Bonjour.
Pénibles ces tableaux qui n'ont pas tous des colonnes à restituer en plus des colonnes à rechercher …
Ne pourriez vous mettre une colonne supplémentaire Observation à la fin de tous les tableaux et une TextBox correspondante, pour qu'il y ait toujours au moins un contrôle associé à définir ? Ça simplifierait les choses parce qu'à part quelques détails en plus pour la TabM, on pourrait programmer les _Change et _BingoUn partout de la même façon, sur ce modèle pour la TabL :
VB:
Private Sub CLsL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
   If NbrLgn = 1 Then Exit Sub
   LCouL = 0: ReDim TVLL(1 To 1, 1 To CLsL.Colonnes.Count)
   CAsL.ValeursDepuis TVLL
   End Sub
Private Sub CLsL_BingoUn(ByVal Ligne As Long)
   LCouL = Ligne: TVLL = CLsL.Lignes(LCouL).Range.Value
   CAsL.ValeursDepuis TVLL
   End Sub
Je crois que le problème que vous soulevez est dû à ce que lorsqu'il n'y a qu'un seul choix possible pour une ComboBox il est proposé d'office, et donc lors qu'il n'y a qu'une ligne exportée il ne peut que retomber sur tout ce qui la caractérise. Mais ça ne devrait pas géner parce qu'on peut toujours y taper du neuf par dessus, et alors ça effacera déjà ce qui n'y correspondra plus. Ça devrait s'arranger petit à petit à mesure qu'il y aura plus de lignes exportées
 
Dernière édition:

gui1987

XLDnaute Nouveau
Bonjour à vous,

Je reviens vers vous concernant mon formulaire de demande d'achat, j'ai à nouveau des questions :
- comme je l'ai expliqué dans mon message précédent il y a toujours le problème de l'implémentation automatique du dernier ajout. Il est impossible de faire 2 demandes d'achat car lorsque j'exporte une première demande cela ne pose pas de problème mais quand je rouvre le formulaire pour faire une 2ème demande et que je commence à taper un nouveau montant alors le montant de la demande d'achat remonte automatiquement avec toutes les données associées et je ne peux que modifier la 1ère demande et non en créer une 2ème différente.
- de plus, j'ai essayé d'apporter une modification au fichier avec la création d'une liste d'approbateur en fonction du numéro de section et du MttDevis mais ça ne remonte pas automatiquement dans les combobox liés. Je souhaiterai qu'en fonction du MttDevis et du numéro de section alors dans les CBxApprob, CBxApprob2 et CBxControleur cela remonte automatiquement. Comment faire ?

En PJ le formulaire.

Merci d'avance.
 

Pièces jointes

  • Formulaire DA final_v2.xlsm
    183.7 KB · Affichages: 11

Dranreb

XLDnaute Barbatruc
Bonjour.
Qu'est ce qui distingue la ligne à ajouter de l'existante, et est-ce renseigné dans une des ComboBox ?
Pour pouvoir ajouter une ligne il faut taper quelque chose qui n'existe pas dans une des ComboBox prise en charge par un ComboBoxLiées.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…