RECHERCHEV en VBA avec décalage de cellule

Bonjour à tous,

J'ai regardé plusieurs sites mais je ne trouve pas ce que je souhaite réaliser. J'ai une feuille Excel avec plusieurs colonnes.

  • Coffret
  • Option
  • Encombrement
  • Référence
  • Prix Tarif

Un coffret peut avoir plusieurs options. Je souhaite que le contenu de la cellule remplisse le contenu d'une checkbox et décaler la cellule tant que le coffret en question a des options. Ensuite, il faut cacher les checkbox non utilisés.

Exemple :

Coffret 1 Option 1 (qui se trouve dans la cellule à côté) -> Je remplis la checkbox 1

Coffret 1 Option 2 -> Je remplis la checkbox 2

etc. tant que je trouve Coffret 1

Si je choisis Coffret 2

Coffret 2 Option 1 -> Je remplis la checkbox 1

Coffret 2 Option 2 -> Je remplis la checkbox 2

etc. tant que je trouve Coffret 2

J'ai oublié de préciser que c'est dans une UserForm.

Ca c'est la première étape parce que dans un deuxième temps je voudrais regrouper des options et remplir soit des checkbox combobox.

Si vous avez des pistes (d'abord pour la première étape), je suis preneur.

Merci !

Mouthou

10option.xlsx (14.47 Ko)

Bonjour Mouthou et bienvenue,

Le fichier que tu as joint (.xlsx) ne contient pas de UserForm (et encore moins de code) ... c'est volontaire?

Si tu repasses par ici, qu'est-ce que tu entends par "remplir des CheckBox" ?

Pourquoi ne pas afficher, dans une ListBox, les différentes options, en fonction du coffret sélectionné? Cette ListBox peut éventuellement afficher des cases à cocher, et être de type multiSelect

Une illustration de ce début de proposition, en annexe.

[Edit:] Salut Theze

16usf-mouthou.xlsm (24.17 Ko)

Bonjour,

Je ne vois pas trop ce que tu veux faire !

Je suis parti du principe que tu veux faire un choix d'option pour plusieurs coffrets en même temps donc, pour ça le code crée à la volée (de façon dynamique) des listes de choix en MultiSelect avec case à cocher en fonction du nombre de coffrets (pour l'exemple, j'ai ai créé 9) ainsi qu'un bouton pour valider les différents choix et pour l'exemple, le résultat est inscrit en colonne G et H. Le classeur contient un module de classe pour gérer l'événement Click() du bouton en appelant une Sub dans le formulaire (je sais, pas d'encapsulation mais c'est pour faire simple). A toi de tester pour voir si c'est ce que tu recherche !

Bonjour Theze,

Je te remercie pour ton retour. Je regarde et te dis ça

A toute !

Mouthou

Salut Theze,

Je fais un exemple pour te montrer ce que je recherche. Je teste et te tiens au courant.

Mouthou

Bonjour U.Milité et Theze,

Je vous remercie pour votre aide !

Ci-joint mon fichier de base qui contient la UserForm. La première page est correcte, je sélectionne le coffret puis je passe à la page 2. C'est dans cette page où je galère.

Je n'ai pas mis de test si on n'a pas sélectionné un coffret dans la listbox de la page 1. Je devrais mais lorsque je le fais, Page1 s'affiche mais pas le contenu...

J'ai mis ce que je souhaite avec la page 3.

Merci encore pour votre aide !

Mouthou

Bonjour U.Milité,

J'ai zappé ton message ! Merci de m'accueillir !

Ce n'était pas volontaire de ne pas avoir mis mon code au départ. Je viens de le mettre pour que Theze et toi ayez une meilleure visu de ce que je veux réaliser.

Je débute sur VBA. J'ai fait quelques codes pour voir comment ça fonctionne et en cherchant sur le net, j'ai trouvé un bout de code sympa qui correspond à la Page1. Je l'ai adapté et enlevé des choses.

Je ne connaissais pas le MultiSelect. C'est utile en tout cas !

Merci encore pour ton aide !

Mouthou

Bonjour,

Ce n'était pas volontaire de ne pas avoir mis mon code au départ. Je viens de le mettre pour que Theze et toi ayez une meilleure visu de ce que je veux réaliser.

On aurait gagné du temps, si tu l'avais fait dès le départ ... en tout cas moi Je ne serais même pas intervenu dans un projet avec des modules de classe et un UserForm multiPage.

Comme, en outre, je ne sais toujours pas clairement ce que tu cherches à faire (je ne connais rien non plus au domaine d'activité qui est abordé), je ne pourrai être d'aucun secours. Désolé

Bonjour,

On aurait gagné du temps, si tu l'avais fait dès le départ ...

D'accord avec toi U. Milité !

Donc si je comprend ce que tu veux, c'est remplacer tes cases à cocher par une ListBox MultiSelect ?

Bonsoir U.Milité et Theze,

Je suis encore désolé mais très franchement vous m'avez bien aidé. J'ai adapté vos codes dans le dernier fichier joint à ce message et j'ai complété ma base (Je travaille dans les pompes de relevage).

Dans chaque gamme de coffret, j'ai deux tailles pour chaque puissance (Feuille Taille Coffret). Chaque taille de coffret possède un encombrement maximal.

Quelle que soit la taille, un coffret a déjà des composants qui prennent de la place. Par défaut, on prend la taille la plus petite. Lorsqu'on choisit les options, on a un encombrement qui sera ajouté à l'encombrement déjà pris. Si on dépasse l'encombrement de la taille choisie, on passe automatiquement sur la seconde.

Lorsqu'on insère une réserve de place (30% par exemple), je dois recalculer l'encombrement total.

Enfin, en fonction de tous ces éléments, on sort les références dans une dernière feuille.

Exemple 1 :

J'ai choisi un coffret Standard 1 pompe pour une puissance de 9,5 à 11 kW - 20 à 25 A dans la première page. Dans la deuxième page, je choisi mes options (par exemple, Verrine 24V LED rouge, Mesure, Transmetteur Sofrel)

Quelque part dans cette même page, je retrouve un combobox (qui n'est pas dans ma userform) où il y a les deux tailles (j'ai mis en vert les deux références dans la feuille Taille_Coffret) : 950 x 530 x 230 et 1000 x 647 x 300. Par défaut, on prend la plus petite (950 x 530 x 230). Il y a un encombrement max de 840 mais j'ai déjà pris 490. Mes options prennent une place de 295 (0 + 80 + 215). Donc 490 + 215 = 705. Donc, ça passe par rapport à 840. Si j'appuie sur un bouton, je souhaite avoir les références. Le résultat attendu sera donc :

Standard 1 pompe 9,5 à 11 kW - 20 à 25 A Ref_Coffret7 Prix 200 €

Verrine 24V LED rouge Réf 2 Prix 100 €

Mesure Réf 8 Prix 100 €

Transmetteur Sofrel Réf 18 Prix 100 €

Exemple 2 :

Je reprends le même exemple mais je souhaite avoir une réserve de place (30%) Donc 705 x 1,3 = 916,5. Dans ce cas, la taille choisie précédemment ne convient pas et je dois basculer sur la deuxième taille. Le résultat attendu sera cette fois-ci :

Standard 1 pompe 9,5 à 11 kW - 20 à 25 A Ref_Coffret14 Prix 200 €

Verrine 24V LED rouge Réf 2 Prix 100 €

Mesure Réf 8 Prix 100 €

Transmetteur Sofrel Réf 18 Prix 100 €

Les codes que vous m'avez faits m'ont déjà bien aidés. Je ne sais pas quelle est la meilleure méthode. Concernant le module de classe, il était déjà présent dans le modèle que j'ai utilisé. J'ai mis certaines lignes en commentaires.

J'ai l'impression que c'est du recherchev mais c'est bizarre...

Pouvez-vous encore m'aidé si'l vous plaît ? En espérant que c'est plus clair pour vous.

Merci !

Mouthou

Bonjour,

On voit déjà mieux ce que tu voudrais faire, avec ces explications.

Le problème est souvent d'intervenir dans un code écrit par quelqu'un d'autre (avec un projet déjà "touffu", comme le tien auquel tu ajoutes encore des modules complémentaires. Au passage, quand tu "récupères" du code trouvé sur le net, l'usage veut qu'on cite ses sources, par respect pour leurs auteurs).

À force de récupérer des bouts de droite et de gauche, ça devient embrouillé:

La recherche des deux tailles de coffrets me semblerait plus simple à réaliser (et sans doute plus prioritaire aussi ) que l'utilisation de la mollette de la souris dans une liste déroulante.

Ceci étant posé, les "ListBox" peuvent être MultiSelect, comme tu l'as découvert mais aussi multi-colonnes. Quand tu garnis ta ListBox2 du nom des options proposées, tu pourrais aussi stocker dans une 2e colonne de cette ListBox, l'encombrement de chaque option. De cette manière, chaque fois que tu sélectionnes une option, tu peux calculer l'encombrement total, en additionnant le contenu de la 2e colonne. On peut aussi stocker les autres infos relatives aux options dans une 3e, 4e, etc. colonne. On peut également n'y stocker que le n° des lignes des options, pour récupérer les données par la suite.

Bonjour U.Milité,

Je te remercie pour ton retour.

Pour la source, j'ai trouvé le code sur ce site : http://boisgontierjacques.free.fr/. C'est en le parcourant que j'ai découvert des choses intéressantes.

Je suis complètement d'accord avec toi sur le code "touffu" mais je voulais comprendre comment il fonctionnait. Je t'avoue qu'il y a des choses qui m'échappent comme l'objet dictionary. Mon but était de ne pas trop changer la philosophie du code (même si je pense qu'il peut être amélioré pour l'usage que j'en fais).

Le Cb = Array(1, 1, 1, 1, 1, 1) était d'origine. J'ai l'impression que c'est pour les colonnes de la listbox1 et elle se rafraîchit en fonction des choix des combobox.

Du coup, entre temps, j'ai continué à bosser et je te mets le code en pièce jointe. Je me suis inspiré du code que tu m'as fourni la première fois pour remplir ma combobox7 et récupérer les informations d'encombrement max et encombrement déjà pris.

Lorsque j'ajoute la deuxième et la troisième colonne et que j'insère ce code :

If Label27.Caption = "" Then Exit Sub

For lig = 2 To Sheets("Option").Cells(Rows.Count, 1).End(xlUp).Row

If Sheets("Option").Cells(lig, 1) = Label27.Caption Then ListBox2.AddItem (Sheets("Option").Cells(lig, 2))

ListBox2.List(ListBox2.ListCount - 1, 1) = Sheets("Option").Cells(lig, 3)

ListBox2.List(ListBox2.ListCount - 1, 2) = Sheets("Option").Cells(lig, 4)

Next lig

J'ai une erreur à partir de la ligne ListBox2.List(ListBox2.ListCount - 1, 1) = Sheets("Option").Cells(lig, 3) lorsque je choisis un coffret (FGC 400 par exemple). Ca fonctionne pour le premier coffret... Bizarre. Peux-tu m'indiquer où est mon erreur ?

--> Je viens de comprendre mon erreur. Ca vient du if qui ne se terminait pas avec un End If. Je l'ai mis comme ça

If Label27.Caption = "" Then Exit Sub

For lig = 2 To Sheets("Option").Cells(Rows.Count, 1).End(xlUp).Row

If Sheets("Option").Cells(lig, 1) = Label27.Caption Then

ListBox2.AddItem (Sheets("Option").Cells(lig, 2))

ListBox2.List(ListBox2.ListCount - 1, 1) = Sheets("Option").Cells(lig, 3)

ListBox2.List(ListBox2.ListCount - 1, 2) = Sheets("Option").Cells(lig, 4)

End If

Next lig

Comment fais-tu pour effectuer la somme et l'afficher ?

Je t'ai mis le code

Merci !

Mouthou

Bonsoir,

J'avais continué d'essayer de m'y retrouver de mon côté ... et j'ai avancé d'une manière un peu différente (avec ce que j'ai cru comprendre).

J'ai mis en commentaire tout ce qui concernait la gestion de la mollette (ça n'apportait rien pour l'instant, mais ça me désencombre )

Je n'ai apporté de modifs qu'à la fin de la Sub MultiPage1_Change() et ajouté une Sub ListBox2_Change()

La ListBox2 affiche 2 colonnes (on peut en ajouter ou en masquer).

Ceci n'a rien d'un travail abouti: ce sont juste deux labels qui se mettent à jour dans le bas de la page2 du UserForm. La première additionne (ou soustrait) les valeurs d'encombrement pour chaque option sélectionnée. La seconde affiche, par défaut la taille du coffret le plus petit. Son encombrement s'ajoute aux valeurs des options. La référence du coffret est modifiée, lorsque l'encombrement total (coffret + options) dépasse l'encombrement max ... toujours si j'ai compris !?

Tu verras bien si ça t'aide à avancer ...

Bonsoir U.Milité,

Je te remercie pour ton message ! Tu as tout compris de ce que je voulais !

Ton code m'a une nouvelle fois bien aidé ! C'est chouette !

Avec tout ça, je vais pouvoir bien avancer.

Merci pour ta précieuse aide !

A bientôt !

Mouthou

Rechercher des sujets similaires à "recherchev vba decalage"