Besoin d'aide avec VBA

yolojo

XLDnaute Occasionnel
Bonjour, j'ai crée ( avec l'aide précieux de certains d'entre vous) un fichier pour gérer les commandes de parfums de mon CE. Le fichier fonctionne normalement avec des listes déroulantes en cascades directement en validation de données.
J'ai voulu l'améliorer en ajoutant un formulaire et là malheureusement mes compétences en VBA me font défaut. J'ai essayé avec plusieurs codes trouvé sur le net, voir même avec des codes tout fait, mais cela ne marche pas. Je n'arrive pas à :
- Gérer les listes déroulantes en cascades
- sélectionner mon choix de saisie (soi en entrant le nom soi avec le numéro)
- faire fonctionner des message d'alerte lorsque des cases ne sont pas remplies (défaut débogage)
- Rentrer les données du formulaire dans mon tableau récapitulatif
Bref, pas grand chose fonctionne !!!
Je vous joints mon fichier si vous avez des idées et surtout des explications.
Merci d'avance
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d'aide avec VBA

Oh, la ! 3 postes d'un coup ! Reprenons tout dans l'ordre.
Bon alors, L'aide avec F1 est aussi claire que la programmation des codes !!!!!
Oui, oui, tout à fait d'accord ! Tout cela est en effet très clair. (Je dis ça juste pour te mettre en rogne :rolleyes:, mais en réalité j'espère que ça le deviendra avec le temps pour toi, aux quelques imperfections réelles près de l'aide)
Qu'en penses- tu ?
Que c'est déjà bien d'avoir déduit, essayons de transformer en compréhension.
PlgTablo est déclaré As Range et en Public dans le module de classe ComboBoxLiés. Vous pouvez y voir derrière cette description:
Propriété. Plage des lignes entières couvertes par le tableau. À votre disposition. Initialisée par méthode Plage.
C'est donc une propriété de son instance CBL (faut vous habituer au jargon, y a pas, même s'il fait mal aux oreilles) en tant qu'objet Range, et représente, puisqu'on y a indiqué des lignes entières, la plage indiquée au CBL.Plage dans Userform_Initialize, donc le tableau dans la feuille "Liste" de CodeName Feuil4.
Il s'agit de l'intersection de la ligne de numéro LaLigne de cet objet Range et de la colonne de nom de plage "Tarif" indiquée entre crochets droits ce qui forme aussi une expression Range.
Dois-je modifié les 5 plages de nom dans la feuille "Liste" comme cela: =Liste!$E$2:$E$ pour que cela fonctionne correctement ?
C'est le modèle pour le nom "Condit" seulement je suppose. Non, une colonne entière c'est =Liste!$E:$E
Par contre concernant UserForm.Initialize, et ListObject , je ne vois pas ce que tu veux dire
Tout ce que je sais c'est qui est possible en Excel 2010 de convertir une liste en tableau et que cela donne lieu à la création d'un objet de type ListObject. Celui ci garantit que les colonnes nommée dedans sont automatiquement ajustée au nombre de lignes de cet objet en cas d'ajouts et suppressions. Je l'utiliserait surement, intégré même à mes modules de service, si je pouvais.

P.S. Et encore un poste !
Je n'ai pas de problème de mon coté pour nommer les colonnes entières. Mais peut être cela devient-il impossible une fois la liste convertie en tableau, ce qui aurait été fait ? Dans ce cas il faut trouver l'objet ListObject et passer carrément, tant qu'à faire, sa propriété Range à la méthode CBL.Plage. C'est facile, il appartient très probablement à une collection ListObjects de Feuil4. Les simplifications proposées plus haut s'appliqueront alors: plus besoin d'intersections.

À + en espérant que les chose soient un peu plus claires, sinon, demande encore.
 
Dernière édition:

yolojo

XLDnaute Occasionnel
Re : Besoin d'aide avec VBA

"C'est donc une propriété de son instance CBL "
Ok reprenons depuis le début. CBL ??? avec F1, ca ne me donne rien.
qu'est ce que c'est ? C'est une variable, c'est un code ? sa veux dire quoi ?

Sa pourrais m'aider déjà à comprendre cela:
Private Sub UserForm_Initialize()
'Lancement du formulaire
Set CBL = New ComboBoxLiés
CBL.Plage Feuil4.Rows(2).Resize(Feuil4.[A65000].End(xlUp).Row - 1)
CBL.CorrespRequise = True
CBL.Add Me.ComboMarque, "Marque"
CBL.Add Me.ComboN°, "Numéro"
CBL.Add Me.ComboNom, "Désign"
CBL.Add Me.ComboContenu, "Condit"
CBL.Actualiser
HabiliterContrôles
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d'aide avec VBA

C'est normal que l'aide ne donne rien pour CBL: ce n'est pas un élément du langage ni des classes de l'interface Excel, c'est moi qui l'ai déclaré tout en tête du module de l'userform: Dim WithEvents CBL As ComboBoxLiés et cela signifie qu'il représentera ce qu'on appelle une instance de cette classe, une fois qu'on lui aura alloué ses ressources de mémoire, ce qui est le but de l'instruction Set CBL = New ComboBoxLiés.
Le fonctionnement du reste est expliqué en commentaire derrière chaque propriété et méthode du module ComboBoxLiés (attention c'est un module de classe, dans la dernière rubrique, pas un module ordinaire)
Mais si quoi que ce soit manque pour la clarté, dis le moi.
 
Dernière édition:

yolojo

XLDnaute Occasionnel
Re : Besoin d'aide avec VBA

ok, la c'est clair
maintenant
CBL.Plage Feuil4.Rows(2).Resize(Feuil4.[A65000].End(xlUp).Row - 1)
Pourquoi feuil4 alors qu'il n'y en a que 3 ????
Que signifie exactement cette ligne ?
genre dernier ligne de .....
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d'aide avec VBA

C'est sûr que personnellement je redonne toujours un nom mnémonique, commençant toutefois généralement par un F, aux constantes VBA représentant les objets Worksheet du classeur. C'est, dans la fenêtre de propriété, la 1ère "(Name)" annoncée comme ça entre parenthèses, parce que l'autre, plus bas, c'est le nom Excel de la feuille. On l'appele aussi parfois son CodeName, bien que ceci désigne en réalité une propriété String qui reproduit ce nom.
Donc l'expression Range passée en paramètre à la méthode Plage désigne la ligne 2 de cette feuille, redimensionnée au nombre de lignes défini par le numéro de ligne absolu de la dernière cellule renseignée de la colonne A (en remontant depuis la 65000ième jusqu'a la 1ère non vide trouvée) diminuée de 1. Mais cela pourrait devenir inutile de faire comme ça, en spécifiant peut être plutôt Feuil4.ListObjects(1).Range si toutefois ça existe.
 
Dernière édition:

yolojo

XLDnaute Occasionnel
Re : Besoin d'aide avec VBA

oula, je crains de ne pas comprendre !!!
Je pense qu'il va falloir être réaliste, je dois arrêter de te faire perdre ton temps (qui plus est un dimanche) pour tenter de m'expliquer des choses dont je ne connais même pas les bases. J'ai à peine intégrer instinctivement la fonction If/Then,Else ou les cells,range, et autres variables. Je ne vois pas comment à ce stade, je pourrais comprendre quoi que ce soit à tes explications et même si j'arrive à comprendre certaines choses en lisant tes codes, je suis incapable de la reproduire sur un autre exemple.
Le problème ne vient pas de toi mais bel et bien de moi, qui n'est pas encore prêt à jouer dans la cours des grands.
Je te remercie quand même de ta patience et si tu peux regarder pour finaliser temps perdu mon fichier avec cette histoire de prix total par client , je t'en serais reconnaissant. Pour ma formation il faut que je reprenne depuis le début.
Je t'ai envoyé un mail l'autre jour. Si tu veux y répondre je conserverais ton adresse précieusement pour plus tard.
Désolé mais merci quand même
 

Dranreb

XLDnaute Barbatruc
Re : Besoin d'aide avec VBA

Qu'est ce qui n'est encore pas clair dans ma dernière explication ? Tu as bien la fenêtre de propriété dans l'éditeur VBA, sinon touche F4 pour l'afficher. tu vois bien que quand tu sélectionne le module "Feuil4 (Liste)" ton fameux "Feuil4" y est indiqué par 3 fois, dont la 3ième dans les propriétés où il peut être changé !?
Je ne souhaite pas recevoir de courriel privé ni donc en envoyer, mais toi tu devrais autoriser dans ton profil les messages privés sur ce site pour qu'on puisse répondre à ceux que tu envoies.

P.S. Je réfléchirai à la suite des développements. J'ai même réfléchi là quelques instants, et il m'est venu une question: Ne va t-il pas y avoir besoin d'un numéro de commande pour distinguer des commandes différentes d'un même client ? Et une date de commande ?
La saisie du nouveau client pourrait se faire dans un ComboBox qui permettrait aussi d'en sélectionner un existant parmi les lignes de commandes en cours. Je sens vaguement qu'on va utiliser un second ComboBoxLiés pour les clients. Ou au moins un dictionnaire arborescent pour isoler toutes les lignes d'un même client, voire d'une même commande. Tu as le module MDictionnArbo, autant s'en servir.

À +
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
248

Statistiques des forums

Discussions
312 493
Messages
2 088 957
Membres
103 990
dernier inscrit
lamiadebz