Besoin d'aide sur Userform

yolojo

XLDnaute Junior
Bonjour à tous et en particulier à DRANREB,
Je me permet de publier ce post suite à un fichier pour la gestion de commande de parfums qui m'avait été créer par DRANREB il y a quelques années maintenant et qui me donnait entière satisfaction.
Le soucis est qu'aujourd'hui le périmètre de ma clientele à évoluer et je souhaiterais également faire évoluer ton fichier.
Bien sur les années ont passé mais je ne me suis guère amélioré en programmation VBA !
C'est pourquoi je me permet de revenir vers vous pour savoir si vous pourriez m'aider pour les modifications que je souhaite apporter.
en fait j'ai modifié le Userform "Formulaire" en créant:
- un bouton "Nouveau client" qui devrait effacer toutes les données du formulaire sauf le "total de commande" contrairement au bouton "effacer" qui supprime les données saisies sauf le nom du client
- un Label "total Client" qui devrait prendre en compte le total de la commande correspondant au client contrairement au Label "Total commande" qui regroupe le total de tout les clients

Merci par avance de votre aide
Cordialement
 

Fichiers joints

yolojo

XLDnaute Junior
Merci pour ta réponse
Je comprends ton point de vue et ce n’est pas non plus le but de ma demande.
Pour preuve et malgré mes piètres connaissances, j’ai apporté certaines modifications de mon niveau à ta version d’origine .
Si je fais cette demande, c’est que j’ai déjà essayé de résoudre mon problème moi même mais sans que cela soit concluant.
En fait je ne comprends pas la structure de ton fichier.
Je ne vois pas à quoi servent les modules MDictionnArbo ainsi que module de classe : ComboBoxLiés, ComboBoxMembre et TableIndex.
Pour ma première demande,j’ai essayé de me servir de ce que tu as fais avec le bouton « effacer ».
Mais là encore je ne comprends pas dans la fonction CBL. Nettoyer à quoi correspond CBL.
Pour le second point, c’est encore pire, je ne retrouve même pas comment est gérer le LabelTotal. Ça m’aurait sans doute aidé pour faire mon LabelTotalClient !
Donc malgré mes lacunes je pense avoir exploré plusieurs pistes ( peut être mauvaises !) mais on ne peut pas dire que je n’ai pas essayé.
Malheureusement vous parlez un langage qui m’est totalement incompréhensible. J’ai l’impression d’être au milieu d’un groupe de personnes qui ne parle pas la même langue que moi !
Quoi qu’il en soit croyez bien que je ne souhaitais pas qu’on me livre la solution toute faite mais réellement avoir des explications qui me permettront de pouvoir les dupliquer et les adapter dans d’autres projets .
Encore désolé d’avoir abusé de votre temps
Cordialement
 
Dernière édition:

yolojo

XLDnaute Junior
Après pour me depanner j'ai utilisé la commande suivante pour vider les TextBox Nom et Prénom

Private Sub CmdChgtClient_Click()
Textclient.Text = ""
TextPrenom.Text = ""
End Sub

C'est moins recherché que ce que tu peux faire mais au moins ça fonctionne !
 

Dranreb

XLDnaute Barbatruc
D'accord, on va pet être pouvoir s'entendre alors.
CBL est déclaré en tête de l'UserForm comme variable objet globale privée de type ComboBxLiés avec évènements. C'est aussi le nom d'un module de classe définissant ce type d'objet, et contenant quelques commentaires guides d'utilisation pour chaque méthode et propriété.
Les choses ayant évolué depuis cette demi douzaine d'années, je ne propose plus cet objet, mais un nouveau très voisin dont le nom est passé au féminin: ComboBoxLiées, n'utilisant plus de dictionnaire arborescent. Il ne contient plus de commentaires mais est disponible comme complément intallable à partir d'un fichier Excel muni d'une grande page d'aide.
Le LabelTotal n'est pas calculé dans l'UserForm mais dans la feuille "Choix": c'est la cellule I10, en référence d'un nom "TotalCmd" dans le classeur.
 

yolojo

XLDnaute Junior
Bonsoir,
Je te remercie de tes explications qui sont certainement très claires pour un initié mais qui reste encore trop flou pour un novice comme moi !
variable objet globale privée, ComboBxLiés avec évènements, module de classe , tout ces termes sont de l'hébreux pour moi o_O
Si tu as ton fichier qui est associé à une page d'explications, je suis preneur.
En attendant, j'ai réussi à obtenir ce que je souhaitais faire.
Bien sur la méthode est très basic mais le résultat escompté est au rendez-vous
Seul petit bémol, j'ai été obligé de créer de nouveaux calculs sous excel car je ne sais pas comment faire directement en VBA
Petit avantage (Il faut bien se consoler comme on peu ;)) cela me permet de faire une liste déroulante pour récupérer le montant des commandes de chaque Client (mais malheureusement rempli de doublons :mad:)
Je vous joint le fichier pour vous donner un aperçu de mes piètres modifications
Cordialement
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Une variable est globale quand elle est déclarée au début d'un module, préalablement à toute procédure. Elle est alors partagée par toutes ses procédures et conservée entre leurs exécutions, contrairement aux variable déclarées dedans, qui sont locales et perdues quand elles se terminent. Et c'est une variable objet si son type de donnée est un type d'objet défini par une bibliothèque mise en référence ou par un module de classe.
Je ne déclare plus, désormais, les variables globales avec Dim, c'est toujours Public ou Private. Private quand je veux qu'elle soit inconnue à l'extérieur du module, Public dans un module standard si elle doit être connue dans l'ensemble du projet, ou dans un module objet si c'en est une propriété.
Pour faire les calculs aisément en VBA il manque des choses me semble-t-il. Il faudra peut être un deuxième objet ComboBoxLiées basé sur les commandes, des ComboBox pour saisir ou retrouver un nom/prénom de client et une ListBox reproduisant ses commandes.
Voici le classeur précurseur du complément muni de la définition de l'objet ComboBoxLiées, muni de la feuille d'aide.
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
N'hésite pas à poser d'autre questions pour acquérir ces notions.

On parle de module objet pour tout module ne faisant pas partie de la rubrique Modules du projet VBA. Ça englobe ceux des objets implantés par l'application hôte (rubrique Microsoft Excel Objets), les UserForm (rubrique Feuilles) et les Modules de classe. La notion de classe est très importante en VBA. Elle englobe les définitions de types d'objets fournies dans les bibliothèques en référence. Le module de classe n'est qu'un cas particulier, celui de la définition dans le projet lui même d'un type d'objet.

Un module de classe est à la fois un modèle d'objet, son plan de construction et la programmation destinée à fonctionner sur les exemplaires qui en seront créés. On préfèrera ce mot "exemplaire" à l'anglicisme "instance" du jargon informatique. Le nom du module de classe devient aussi le nom du type de donnée objet qu'il définit, de sorte qu'on peut le préciser derrière As dans une déclaration Dim, Private ou Public.
Dans la programmation extérieure au module de classe on ne voit de celui ci que les éléments y ayant l'attribut Public, mais, à la différence d'un module standard, on ne peut y accéder qu'à condition de le faire précéder d'un point, puis encore devant, à moins d'une instruction With préalable la précisant déjà, d'une expression représentant un exemplaire de cet objet (sinon: erreur de compilation). S'il s'agit d'une variable, il faut en outre qu'une expression de son type lui ait été affectée par un Set (sinon: erreur d'exécution, cette fois). Fort heureusement, l'expression formée du mot clé New suivi du type d'objet (qui est en même temps le nom de son module de classe) représente un exemplaire tout juste créé de ce type d'objet *.
Propriétés et méthodes sont les appellations conventionnelles de ces éléments visibles de l'extérieur du module de classe, déjà vues dans l'aide de VBA à propos des objets de bibliothèques fournies. Une chose déclarée Public dans un module de classe a un statut de propriété quand il s'agit d'une simple variable, d'une Function ou d'une Property Get dépourvues de paramètre, ou d'une Property Let ou Set munie du seul faux paramètre formel représentant la valeur à lui attribuer. Dans tous les autre cas il s'agit d'une méthode, en particulier quand c'est une Sub avec ou sans paramètre.
Enfin, un objet peut aussi décréter des évènements dans un autre module objet. Pour cela, il doit y être déclaré en tête avec le mot clé WithEvents. Cela a pour conséquence d'installer son nom dans la liste de gauche (Objet) qui surmonte la fenêtre de code. S'il y est sélectionné, celle de droite (Procédure) propose les différents modèles de procédures pouvant être installés automatiquement pour profiter de ces évènements. Le nom des procédures installées seront de la forme NomObjet_NomÉvènement. Dans le module de classe, ces évènements sont déclarés au moyen d'instructions Event, et, lors des exécutions, décrétés par des RaiseEvent.
Pour être tout à fait complet, il ne resterait qu'un tout petit point à aborder à propos d'une espèce bien étrange de module de classe: le module d'interface. Mais je crois que ça suffit pour aujourd'hui !

* Attention le mot clé New n'est malheureusement pas applicable à un type d'objet défini par un complément xlam en référence: j'ignore pourquoi, mais l'objet doit être impérativement créé par lui. C'est pourquoi mon CBxL est équipé d'une fonction ComboBoxLiées, écrite dans un module Création, qui en renvoie un nouvel exemplaire.
 

yolojo

XLDnaute Junior
Ouahou !!! si ça c'est pas de l'explication o_O
Il va me falloir un moment pour la digérer celle là !
Chapeau Monsieur DRANREB. Le pire c'est que tu as l'air d'expliquer cela aussi facilement et simplement que 2 + 2 font 4
Je ne te cache pas que je n'ai pas saisie grand chose, mais ça m'intéresse de comprendre donc je vais me pencher sur le sujet.
Par contre, avant de vouloir faire des grandes phrases dans cette nouvelle langue qu'est le VBA, ne devrait-je pas commencer par apprendre à dire oui/non, merci , bonjour, les choses de base quoi ?
Je reviens vers toi dès que j'aurais des questions (et à mon avis il va y'en avoir !)

Comment certaines personnes font pour être aussi intelligentes alors que moi, je suis aussi bête :D
 

yolojo

XLDnaute Junior
Bonjour Danreb,
Cela fait plusieurs semaines que je tente désespérément de comprendre tes explications, mais c'est vraiment du chinois pour moi, et c'est pas faute d'essayer.
J'ai donc essayé l'apprentissage directement par l'action en modifiant plusieurs elements de mon fichier qui fonctionne bien pour essayer de voir sur quelle ligne du programme je pouvais agir et comprendre comment cela fonctionne. Sur le moment j'avais l'impression de comprendre. Je me suis donc lancé dans la création d'un nouveau fichier sur les base de ce que tu m'avais créer, mais là rien ne fonctionne comme je le souhaiterais.
Te serait-il possible de m'aiguiller sur mes erreurs ? Y a t-il une solution pour comprendre lors du "debeugage" d'où vient l'erreur ?
Merci d'avance pour ta patience
Cordialement
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonsoir.
Si vous voulez utiliser plusieurs ComboBoxLiées s'appliquant sur des tableaux différents il faut leur donner des noms différents.
Inutile de préciser toute la plage à la méthode Plage. La 1ère ligne suffit, il se débrouille pour trouver la totalité des lignes même quand elle n'a pas fait l'objet d'une mise sous forme de tableau Excel (ListObject) ce qui néanmoins serait mieux quand même.
 

yolojo

XLDnaute Junior
Bonjour et merci beaucoup pour ta réponse.
Je pense que le soucis est bien là, c’est que je ne comprends pas de quoi tu parles !
Lorsque tu parles de « ComboBoxLiées », pourrais tu me donner un exemple de ce genre d’éléments dans mon fichier pour savoir de quoi il s’agit. Même chose lorsque tu emploi le terme « la plage à la méthode Plage », je ne vois pas à quoi cela correspond.
Je suis désolé, je comprends vite mais il faut m’expliquer longtemps :)
À bientôt
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Les types d'objets définis par les modules de classe existant dans ton fichier sont un peu passés de mode.
J'ai un nouveau jeux de modules de service pour ça qui effectue les classements par fusions au lieu de procéder par Quick-Sort.
Je ne sais pas quoi dire de plus que ce qui est expliqué en détail au poste #8. Il faut avoir tout compris et connaitre par cœur ce qui y est expliqué.
Alors relis le, et dès qu'il y a une phrase dont tu ne comprends pas le sens, essaye de me décrire ce qui gène ta compréhension afin que je puisse peut être apporter des précisions dans l'espoir que tu puisses continuer à étudier le reste pour finir par bien savoir tout ça à fond.
 
Dernière édition:

yolojo

XLDnaute Junior
Ok merci bien,
J'ai commencé a essayer d'apprendre quelque terme du language mais sans avoir compris les bases et la structure de VBA. C'est pour cela que je suis perdu aujourd'hui lorsque tu me parles de certaines choses.
Je vais devoir tout reprendre depuis le debut car j'ai beau relire, découper toutes les phrase pour les interpréter, il ya toujours des termes qui ne me parle pas.
J'ai peur d'abuser de ton temps, si je dois t'interpeler à chaque phrase que je ne comprends pas
Connaitrais-tu un liens qui pourrais reprendre tous les termes employé sous VBA voir même expliquez chaque fonctionnalité du logiciel VBA. ça pourrait sans doute m'aider à mieux comprendre tous ses termes(
Modules du projet, module de classe,
modèle d'objet,
type de donnée objet, etc...) et surtout ça me permettrait d'acquérir les bases necessaires.
Il existe peut-être aussi des modules de formation en ligne ?
Je te remercie pour ta patience
Cordialement
 

Dranreb

XLDnaute Barbatruc
Bonjour.
On voit assez bien cette structure dans l'explorateur de projet. Le projet c'est l'unité la plus grande pouvant contenir d'autres choses. Un projet VBA est attaché à un classeur Excel (sauf aussi quand c'est une bibliothèque, mais qu'on n'y voit alors pas). Un module ça correspond à toute ligne qui y est attachée en dessous dans l'explorateur, et on y voit qu'il en existe de plusieurs sortes regroupés en grandes rubriques.
Un type de donnée objet c'est une notion fondamentale. En réalité ce n'est qu'un pointeur. C'est à dire une zone de mémoire destinée à contenir une adresse au lieu d'un nombre, texte, logique etc. des autres types de données. Cette adresse désignera une structure de données constituant un exemplaire de cet objet. Je schématise là, parce que ce n'est vrai que pour les infos. La programmation associée à l'objet, elle, n'est pas attachée à l'exemplaire mais au type de l'objet. C'est juste pour tenter d'expliquer le concept.
Mais une fois qu'on a pris soin de lui assigner son adresse (c'est l'instruction Set qui fait ça), on accède à un truc qui le concerne, pareillement que ce soit une méthode ou une propriété, en mettant derrière le nom de la variable objet un point suivi du nom du truc qu'on veut.

Remarque: La nouvelle mouture de service ne supporte plus les noms de plage en String comme spécification de colonne. Elle supporte toujours des String, mais ce doit alors obligatoirement être des titres de colonnes dans une plage ayant fait l'objet d'une mise sous forme de tableau, laquelle a donc créé un ListObject pour cette plage, lequel est détecté et reconnu par l'objet ComboBoxLiées.
 

Fichiers joints

Dernière édition:

Discussions similaires


Haut Bas