Combobox en cascade

Bonjour,

c'est la première fois que je vais sur un forum EXCEL VBA. Je suis novice en VBA mais en cherchant et en mettant bout à bout des codes, j'ai commencé à mettre en place mon projet. C'est un programme de commande de fuel. Nous recevons des appels d'agriculteurs. Ils disent leur ville et leur nom et leur commande de fuel. Une fois la journée terminée, nous envoyons la commande à un fournisseur de fuel.

Evidemment étant novice, il y a de nombreux problème à mon programme. Je fais appel à ce forum et à votre expérience pour m'aider.

Je commence avec mon 1er problème. Dans le 1er Combox, je tape par exemple A la première lettre d'une ville et ca bug.

Je n'arrive pas à télécharger mon fichier sur le site un peu gros??? ou puis je le télécharger. Merci d'avance

Bonsoir,

Si même zippé ton fichier est trop gros, utilise :

http://cjoint.com

Cordialement.

https://www.cjoint.com/c/FEbtLQmYssC.

Merci pour la réponse.

salut,

il n'y a que la 1ére ville qui bug, pas celles qui suivent.

j'ai démasqué tes onglets et vu que l'ortographe de la 1ere ville est AIRE SUR LA LYS alors que ta combobox mets AIRESSURLALYS.

il faut que tu vois avec la cellule de selection de zone, si tu sais ou elle est, entre le formulaire et l'onglet tdcville.

a+

Fronck

Je te remercie de m'avoir répondu.

Mais la combobox1 fait référence au nom "VILLE" de l'onglet Agriculteurs pas de tcdville. C'est le code en rouge qui revient en surbrillance qui peut etre pose problème.je ne sais pas

Dim NomRange As String

NomRange = CaracSpec(ComboBox1.Value)

If NomDefini(NomRange) Then

ComboBox2.List = Application.Transpose(Range(NomRange))

Else

ComboBox2.AddItem """Aucune commune"""

End If

End Sub

Merci

Merci

salut Vbanovice,

ce qui pose probléme est que l'ortographe est pas la même.

la combo box fonctionne patout ailleurs, donc ce n'est pas son code qui bug.

Et si tu corriges celle de cette ville dans l'onglet agriculteurs, çà bug plus.

a+

Fronck

Bonjour,

D'abord,

  • si tu laissait VBA mettre les procédures évènementielles à la place qu'il leur réserve,
  • si tu mettais les autres dans la zone "General" en tête de module,
  • si tu déclarais toutes tes variables en tête de procédure systématiquement, comme il se doit,
  • si tu indentais ton code !
  • si tu netoyais de toutes les procédures vides de code...

et je laisse de côté les aspects "excusables" pour un débutant :

  • non renommage des contrôles....
  • commandes superflues...
etc.

et ce n'est sûrement pas exhaustif, on y verrait plus clair.

En attendant, tous tes noms qui ne réfèrent qu'à une seule cellule vont déclencher la même d'impossibilité de définir la propriété List.

L'utilisation de la propriété RowSource aurait certainement été mieux venue dans ce cas.

Ton projet a assez belle allure, mais je crois qu'il y a une vérification générale à faire avant d'être engagé à un point où tu auras beaucoup plus de difficultés à apporter des modifications...

Ta liste principale comporte 2 blancs qui même s'ils ne déclenchent pas d'erreur, poseront quelque problème à un moment ou un autre. La liste n'est pas nommé de façon dynamique ce qui ne permettra pas son adaptabilité aux variations. La multiplication de noms susceptibles de changer n'est pas sans doute la meilleure solution (un nom stable dont le contenu peut varier serait sûrement préférable).

Et pour les contrôles, ne pas oublier qu'il ont des valeurs de propriétés par défaut, qu'on définit à la conception, et qui évitent nombre de commande inutile à l'ouverture...

Ce n'est qu'un survol...

Cordialement.

Je te remercie MFERRAND pour ta réponse.

J'annalyse ta réponse et je reviens un peu plus tard. Le temps manque toujours.

Cordialement

Merci aussi à Fronck.

Le temps manque toujours.

Certes ! Mais tu as intérêt à en prendre présentement pour mieux assoir ton projet... tu en retrouveras le bénéfice plus tard...

Cordialement et bonne journée.

Bon c'est pas gagné mais je recommence un peu au début pour la serie de code. Je vais aller étape par étape.

Je commence avec ma première combobox pour afficher les villes sans doublons et par ordre alphabétique.

J'aimerai avoir un avis

https://www.cjoint.com/c/FEdvSIrzy8C

Salut

comme vous voulez aller étape par étape, je te propose de laisser l'ordre alphabétique des villes a part ce n est pas une grande chose

la grande taille de votre fichier est a cause de l image et encore est de mauvaise qualite pour l impression de la comande

alors je te propose d allez

dans la feuille : "Carnet de commande" puis affichage >>> mise en page

vous constater que la taille de la feuille est 21*27

changer l image par une autre qui represente la signe de votre societe et placer la dans un coin convenable

puis preparer les places des autre information pour les inserer apartir de userform ( date , fournisseur,...)

puis le tableau

et enfin la signiature et le cache ajuster tou ca pour etre a linterieure de feuille de taille 21*27

apres decider ce qui est le premier archiver un client ou imprimer une feuille puis archiver le client

et ........................

Bonsoir,

Je regarderai en détail dès que possible. Mais premières constatations à l'ouverture :

- Pas d'erreur au lancement du formulaire et il y a bien une liste dans le Combo mais le "aa" n'a rien à y faire, ni le nombre d'éléments vides en fin de liste. Et les "_" entre les mots ne sont guère élégants.

- L'Initialize se retrouve pas mal surcharchée ! Et sauf à être un maniaque du code, il y a un équilibre à trouver entre traitement par code VBA et éléments Excel classique en tenant compte de ce qui ne peut que relever du code, et de la plus ou moins grande facilité de faire d'une façon ou de l'autre et des avantages respectifs qu'on peut y trouver. Ce qui peut s'inscrire de façon définitive sans recourir au code doit être préféré. Par ailleurs, l'Initialize n'est pas vraiment le lieu pour y fourrer des procédures qui peuvent être réalisées avant lancement du Userform.

- Un défaut qui demeure dans ta base réside dans la ligne vide séparant la ligne d'en-tête du reste. C'est à proscrire.

- Je suppose que tu as réalisé manuellement la liste en L, à moins que je n'ai pas vu la procédure à cet égard. En tout cas, cette liste peut être réalisée en filtrage avancé et mise à jour de la même façon, et là en VBA car c'est nettement plus facile (une ligne de code). Mais il convient ensuite qu'elle soit nommée en plage dynamique, et ce une fois pour toutes !

- Il y a aussi un dispositif à mettre en place pour nommer de façon unique une liste variable selon le choix de la ville pour alimenter de façon homogène le combo dépendant.

Je vois dès que possible pour te faire des propositions pratiques.

Cordialement.

Bonjour,

J'ai revu ton Userform à peu près jusqu'à avant validation. Je te détaillerai ça après vérification.

J'ai un doute sur un point : j'ai considéré les prix figurant sur ta feuille prix de fuel, comme des prix unitaire, portant par tranche sur des quantités variables, et vu l'ordre de grandeur aux 1000 litres. Mais comme je ne vois nulle part d'emplacement pour un résultat calculé... j'aimerais bien que tu me dises ce qu'il en est à ce propos.

Ce à quoi j'ai procédé :

  • supprimé la ligne vide dans ta base,
  • nommé dynamiquement la colonne Ville de la base,
(tu verras dans le gestionnaire de noms, la façon de donner des noms dynamiques : ils utilisent la fonction DECALER...)

le nom BaseVille correspond à la colonne remplie, libellé inclus, car le nom sera utilisé pour le filtrage,

- procédure de Tri de la base sur la colonne Ville suivi de filtrage avancé produisant une liste des villes (en X pour laisser du champ à droite de la base),

Tu étudieras cette procédure comparativement au code que tu avais fourré dans l'Initialize : 1 ligne pour le Tri (la méthode classique Range.Sort est beaucoup moins gourmande en volume que la méthode Worksheet.Sort que fourgue l'enregistreur...), 1 pour effacer l'ancienne liste et 1 pour le filtrage donnant la nouvelle liste.

  • lancement de cette procédure par un bouton (dans la base en C1) : on n'a en principe à la lancer que lorsqu'on a modifié la base, mais il est éventuellement possible de l'appeler à partir de n'importe quelle procédure...
  • nommé dynamiquement cette liste (libellé non inclus), le nom est affecté à la propriété RowSource du ComboBox,
  • nommé une plage résultant du choix de la ville dans le Userform : cela entraîne l'affectation de la ville choisie en Z1, ce qui permet de définir en colonne Nom de la base une plage décalée du rang de Z1 dans la colonne Ville et dont le nombre de ligne correspond au nombre de valeurs correspondant à Z1,
  • quand Z1 est vide, le nom existe mais ne définit aucune plage, lors d'un choix de ville, la ville est affectée à Z1 est la plage est définie : elle est affectée à chaque fois la propriété RowSource du Combo nom, mais c'est toujours le même nom de plage qui est affecté.

La suite (concernant le userform proprement dit) plus tard.

Cordialement.

Re bonjour,

Il me semble que tu n'as aucun besoin du bouton Ajouter un client : lorsqu'une commande est programmée, ville, nom, quantité, qualité (le reste venant automatiquement), tu valides. La validation entraîne l'inscription sur le carnet de commande et réinitialise le formulaire pour un nouveau client.

L'ajout se fait donc automatiquement, tant que tu en ajoutes, jusqu'à ce que tu imprimes...

Cordialement.

Bonjour,

Voici à quoi servirai mon projet:

1. Nous sommes une association : une petite partie des revenus de l'association se font à partir des commisions que nous gagnons sur les commandes de fuel

2. En début de semaine, nous envoyons un appel d'offre de prix à différents fournisseurs de fuel. Nous choississons bien sur le meilleur prix. Il y a un prix de 1000L à 1999L, un prix un peu plus intéressant de 2000L à 3499 L et aussi au dessus de 3500 L

3. Les agriculteurs nous appelent pour commander du fuel pour leur tracteur(appelé GNRQS= GNR qualité supérieur) ou alors du fuel pour leur maison ou appareil de chauffage pour leur batiment d'elevage Le minimum de la commande est 1000L.

Il nous donne leur ville, leur nom et leur commande.

4. Sur le feuille de commande, que nous envoyons chaque jour par fax ou par mail au fournisseur de fuel choisi, à une certaine heure, doit figurer le nom de l'agriculteur, le nom de l'entreprise de l'agriculteur, l'adresse, le numéro de portable et/ou le numéro fixe, le litrage, la qualité du fuel (GNRQS ou FQS fuel qualité supérieur) et le prix du fuel.

5. Ceux à quoi je veux arriver avec le formulaire : Je choisi la ville (1ere combobox), à partir de là, dans la 2ème combobox doit s'afficher tous les clients de la ville, je choisi l'agriculteur, à partir de là s'affiche le nom de l'entreprise correspondant, l'adresse et les numéros de téléphone.

Je note le litrage et je choisis la qualité du fuel, à partir de là s'affiche le prix du fuel.

Il y a d'éventuelles observations : urgence de la commande, ou à livrer un certain jour....

Je valide alors la commande qui s'inscrit sur la feuille de commande.

Au bout de la journée, j'imprime la feuille de commande et elle est envoyée au fournisseur de fuel.

Toutes les commande doivent etre aussi archivée pour pouvoir calculer plus tard la commission qui nous reviens.

J'aimerais aussi, mais c'est un peu plus accesoire de mettre les prix unitaire en archive pour pouvoir suivre l'évolution des prix (avec un graphique)et renseigner l'agriculteur sur l'évolution des prix.

Le bouton "ajouter un client " c'est pour insérer dans la base de données les nouveaux abonnés aux service.

Merci à vous.

Cordialement

Bonjour,

Avant que je me lance dans le retour de ton fichier avec explications, il reste ce problème de prix qu'il faut que j'ajuste...

J'avais bien conclu que le minimum de commande était 1000 l, et donc ton prix tarif m' avait paru être un prix unitaire pour 1000 l.

J'ai donc introduit le calcul du prix selon la quantité commandée et la qualité retenue, les 2 déterminant un tarif unitaire, multiplié par le nombre de milliers de litres pour donner le prix total.

Il faut me confirmer ou m'infirmer ça. Et aussi si le prix à porter sur le carnet de commande est le prix total à payer où le prix tarif.

De façon que j'ajuste l'ensemble en fonction de tes indications.

Cordialement.

Bonjour,

le prix total n'a pas beoin d'apparaitre. sur le Userform, seulement le prix tarif. ex: si je mets QUANTITE : 1600L QUALITE : GNRQS alors le prix du fournisseur de 1000L à 1999L doit s'afficher dans la zone commande et apres validation les données sont mis sur le carnet de commande et pas de prix total. Merci.

Cordialement

Je prends note pour demain. Je ferai les modifications nécessaires.

Pas prévu de travailler cette nuit

Bonne soirée.

Bonjour,

Je ne vais peut-être pas avoir le temps de fournir ici toutes les explications nécessaires, mais n'hésite pas à demander sur ce qui t'interpelle ou que tu ne comprends pas d'emblée.

J'ai procédé au renommage des contrôles du Userform.

Cela facilite la compréhension en circulant dans le code, et le cas échéant cela facilite aussi leur utilisation.

Tu verras de façon générale pour l'ensemble, je ne vais détailler que les TextBox :

  • la série Prix de fuel, renommée : tbPrx1 à 6
  • la série fournisseur, renommée : tbFnr1 à 5
  • la série commande, renommée : tbCQuant et tbCPrix
Cela permet le cas échéant d'utiliser des boucles pour les alimenter, en évitant une énumération exhaustive, toujours fastidieuse.

La feuille Prise de Commande a été réaménagée, son utilité était indécise... : le nom, et les éléments de commande : quantité, qualité, prix et observations, sont alimentés par la saisie sur Userform (les formules sont conservées pour les autres éléments). La suppression des lignes intermédiaires permet une correspondance des lignes avec les colonnes du Carnet de commande.

On inscrit donc à partir de cette feuille en validant la commande : la procédure d'inscription se réduit ainsi à une seule ligne.

A l'ouverture du Userform (par sécurité) et à l'issue de chaque validation, les données variables de la feuille sont effacées.

Au lancement du Userform, la proc. Initialize procède à l'inscription des données prix de fuel et des données fournisseur dans les TextBox correspondants. Les données fournisseur proviennent de la feuille Fournisseur : si on change de fournisseur et que le fournisseur est bien inscrit sur la feuille Fournisseur, il n'y a en principe rien à changer pour que cela continue de fonctionner.

L'utilisateur sélectionne la ville, puis le nom (je ne m'étends pas sur la question "cascade" exposée lors d'un post précédent), les données client s'affichent, il sert ensuite la commande, quantité et qualité, le prix s'affiche, il peut valider : la proc. vérifie qu'il y ait un nom, un prix (donc, quantité et qualité servies), et calcule la ligne d'inscription, et signale si on est sur la dernière ligne (et invalide le bouton, qui devra donc être réactivé après impression si on n'a pas fermé le formulaire ; si le bouton est actif alors que le carnet de commande est plein, la validation est bloquée.)

La procédure d'impression te reste à définir. Il faudra prévoir d'insérer en fin de cette proc. une réactivation du bouton de validation.

(Chaque chose en son temps !)

Il conviendra aussi (je ne l'ai pas encore fait) de verrouiller les TextBox alimentés automatiquement. Les risques sont limités dans la mesure où les données client ne proviennent pas des TextBox et le prix est inséré par une procédure annexe déclenchée par les saisies quantité et qualité qui met également le prix dans le TB (les seuls risques qui demeurent sont : modification des prix issus de la feuille Prix par l'utilisateur, qui fausserait le prix, et saisie d'un prix par l'utilisateur sans saisir quantité et/ou qualité qui permettrait une validation erronée).

Il sera donc bon d'y procéder en mettant la propriété Locked des contrôles concernés à True.

Je crois avoir fait à peu près le tour. Je te laisse donc voir la chose, tester les fonctionnalités, et poser les questions sur ce qui t'interroge, avant de discuter de la suite (impression...). Quant à l'ajout client, il n'est pas inutile de le déclencher éventuellement de ce formulaire mais il te reste un formulaire d'ajout à construire...

Cordialement.


https://www.cjoint.com/c/FEgmHPWZnoy

Rechercher des sujets similaires à "combobox cascade"