Gestion de plusieurs combobox dans le ruban
Bonsoir à tous,
Je galère sur la création de mon ruban personnaliser, j'ai réussi en piochant du code à droite, à galopin, à faire à peu près ce dont j'ai besoin ! Dans mon idée je voulais 3 comboboxs pour controler ma plage de donnée, en les utilisants comme filtre.
Pour la première aucun problème j'ai rapatrié les données type "trimestre" pour la seconde pour les mois n'ayant pas réussi j'ai utiliser un exemple trouver sur un fichier généreusement donnée par galopin, et pour la troisième type "semaine" je voulais continué sur une combobox et y associer ma plage de donnée de la Colonne O de mon onglet parametre. j'ai utiliser Custom UI editor pour le code pas de pb mais je n'arrive pas à sélectionner des données différentes de ma Combo trimestre car contrairement au vb classique ou je nommais mes combso, avec cette mise en ruban je n'arrive pas à différencier mes deux comboboxs ( à aucun moment je présice le nom de la combo dans mon vb !!)
Etant néophyte dans la construction du ruban si une âme charitable pouvait m'expliquer comment faire
Mon fichier un actuellement très bordélique mais vous retrouverez un module ruban et un combo !
Merci pour vos idées
[Edit] j'ai résolu finalement le probleme mais un autre suis
Bonjour,
Tu n'as pas besoin de préciser le nom du combo puisque chacun à sa macro onAction.
Si tu es dans la macro "galopin" attribué à Combo1 rien ne t'empêche (entre autre) de stocker dans une variable publique la valeur de Combo1 (ou son ListIndex) afin de pouvoir la récupérer ultérieurement.
pareil pour Combo2 ou Combo3
Pfff... Quel bazar ! On croirait la chambre de ma fille avant qu'elle vire sa cuti !
A+
Merci Galopin pour les précisions, mais je reste bloquer devant deux points,
ou mettre le code pour le onAction?
Est il possible de dimensionner ( agrandir) la taille des combobox pour que l'ensemble du texte soit visible dedans? ( je suppose que c'est dans le XML)
Je joins mon fichier en état, j'ai commencé à faire un callback for Combo1 onChange qui devrai remettre les valeurs des autres combo à -1 et filtré WsPlan en colonne 2 mais ca ne marche pas j'ai du louper une étape!
Merci pour vos idées et / ou solutions
ou mettre le code pour le onAction ?
Dans un module standard (ruban par exemple) avec ses copains...
dimensionner ( agrandir) la taille des comboboxµ
Essaie avec l'attribut :
sizeString : Spécifie un littéral tel que "MMMMM", qui indique la largeur du contrôle.
<comboBox id="Combo2"
imageMso="ConditionalFormattingHighlightDateOccuring"
label="Semaine :"
getItemCount="NbItemCombo"
getItemLabel="ComboLabel"
sizeString="MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"
invalidateContentOnDrop="true" />A+
Bonsoir Galopin,
Ca c'est impécable
sizeString="MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"Parcontre je dois être vraiment une bille ! tous mon ruban reste inactif, seul les 2 bouton que tu m'avais passé fonctionne !
Bon inactif par tout a fait, j'arrive quand même à les remplir avec des listes provenant de mes paramètres par contre je n'arrive pas à filtré le calendrier (onglet plan) selon la valeur de l'index de la combobox
J'ai commencer à faire ceci pour la combo1
'Callback for Combo1 onChange
Sub MyMacro(control As IRibbonControl, text As String)
If Combo1.ListIndex = -1 Then Exit Sub
On Error Resume Next
Application.ScreenUpdating = False
Combo2.ListIndex = -1
Combo3.ListIndex = -1
Combo4.ListIndex = -1
WsPlan.ShowAllData
WsPlan.Range("Calend").AutoFilter Field:=2, Criteria1:=Combo1.ListIndex + 1
End Subj'ai du louper une étape, et plus je lis les forums, moins je pige comment faire
Je te parle même pas de mon bouton impression ou j'ai juste le droit à " Argument non facultatif".....
et c'est là que j'ai pris la fin de la boite de doliprane
Bref j'ai quand même préparer mon fichier en version "pluspropre"
Si tu as des explications pour que ma combo1 ruban fasse au moins un truc.... ( ce que je faisais bien avec une combobox directement sur la feuille)
Merci
Hum...
#1 : Je trouve que tu t'enquiquines bien pour un résultat hypothétique !
#2 : Je suis loin d'être un spécialiste dans les personnalisations du ruban. A mon avis ça devrait être réservé à ceux qui exploitent déjà au moins à plus de 3 % Les ressources d'Excel et de VBA. Comme moi je ne dépasse guère les 5 % je me contente généralement de la possibilité d'inhiber complètement le ruban.
#3 : Je te donne juste un modèle un peu plus complet qui permet de capter un mécanisme de sélection, récupération des valeurs, action. En cas de plantage fermer le classeur :
Bien sur il est très facile de le planter : C'est une démo pas une appli finalisée. Mais sur le principe ça marche très bien.
La démo ci jointe permet (grâce aux boutons de renvois) de transférer un ligne sélectionnée dans une feuille (jour) vers une autre feuille (autre jour)
Sélectionnez une ligne du Lundi > Cliquez Renvois/Jeudi : la ligne est transférée vers Jeudi
On peut également envoyer une ligne de ce Casier00 (classeur maitre) vers un classeur "enfant" (Casier01.xlsm, Casier02.xlsm...)
Pour cela il doit y avoir autant de classeurs enfants que d'iD dans la feuille "param" (masquée)
Chaque classeur enfant doit comporter les onglets Lundi, Mardi, Mercredi...
Sélectionner une ligne du Lundi > Transfert/Transférer à : Sélectionner un destinataire puis sélectionner un jour puis Cliquer sur Validation : Si le casier cible et le jour cible est créé, la ligne est copiée et triée. Sinon le gestionnaire d'erreur intervient...
Nota : Il n'est pas nécessaire de créer tous les classeurs cibles, ni les feuilles cibles, pour se rendre compte que ça marche ! Mébon...
En résumé le classeur maitre est conçu pour être cloné (mais avec un ribbon normal !) autant de fois que de casier : Dans le but "in fine" de dispatcher individuellement les données centralisées...
#4 : Revoir le #1 !
A+
Super, merci Galopin,
je vais essayer de décortiquer ce code pour prendre ce dont j'ai besoin ! ( bon c'est pas gagné lol)
A bientôt
Bonjour à tous,
Petite victoire, j'ai enfin réussi à faire interagir mes combo avec ma feuille, ainsi que l'ensemble de mes boutons!
Par contre je me suis retrouvé devant une situation dont je n'ai pas trouver de solution satisfaisante...
dans le Call back Onchange je suis tombé sur un drôle de problème impossible de récupérer la valeur équivalente au ListIndex que j'utilise normalement avec mes combo feuille ou userform!
pourtant dans le callback
'Callback for Combo1 getItemLabel
'Index est défini par la valeur saisie dans la fonction de rappel NbItemCombo
Sub ComboLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
If WsPrm.Range("H2").End(xlDown).Row = 0 Then Exit Sub
'Alimente le Combobox à partir des données de la plage de cellules
returnedVal = WsPrm.Cells(index + 2, 8)
End Subl'index est integer et ramène bien la position numerique (0 pour la première, 1 pour la seconde etc....) du coup j'ai voulu l'applique index as integer dans le call back Onchange. Mais la "valeur integer" n'est pas reconnu pour ce call back seul String est accepté
Sub ChangeCB1(control As IRibbonControl, index As String)
On Error Resume Next
WsPlan.ShowAllData
WsPlan.Range("$B$1:$B$377").AutoFilter Field:=1, Criteria1:=index, _
Operator:=xlOr, Criteria2:="=5"Ainsi je récupère l'intituler du champs sélectionné, peu pratique mais pas trop gênant. Mais avez vous des explications, pourquoi l'index dans certain cas accepte l'integer et d'en d'autre le string
Du coup mon seul probleme reste maintenant de vidé les valeurs affichées dans les 3 combo ( actuellement au nombre de 4) pour les "reset" ( equivalent listindex=-1) lorsque j'utilise la 4eme. je n'ai rien vu sur le net que je comprenne.
Sinon j'ai cherché du coté du code vba
If Not MonRuban Is Nothing Then MonRuban.InvalidateControle "combo2"mais le invalidate contrôle n'est pas prix en compte dans mon call back. j'ai même tenter de recharger les combo en appelant le callback ComboLabel2 ( de ma combo2, car lorsque les combo sont charger la combo est "vide" de cararctère) mais impossible d'appeler un call back depuis un autre !
il me reste peut être une solution à tester mais je voulais avoir votre avis ( vu que je n'ai pas le custom ui sur mon lieu de travail) c'est l'utilisation de getEnabled qui pourrai d'après mes lectures peut être convenir. mais mon niveau ne me permet pas d'appréhender complétement si je me dirige vers la solution.
Dernière question pour mon module d'impression je voulais récupérer la valeur de index de la combobox utilisé ( donc apparemment pas possible) y a t il moyen de stocker ( en vb?) la valeur de la dernière combo utilisé? ( a part écrire dans un coin de ma feuille paramètre la dernière sélection.
Merci au courageux qui on lu jusque là !
A mon avis ça devrait être réservé à ceux qui exploitent déjà au moins à plus de 3 % Les ressources d'Excel ....
Aie je pensais que tu tournais autour de 90% ! moi je dois être 0.0001% alors
Si vous avez quelques réponses ( ou des exemples) à mes questions je suis preneur!
Les fonctions de rappel (comme les événementielles de feuilles) ont une syntaxe bien précise : Le type est immuable. Par contre tu peux mettre les noms de variable que tu veux, ça ne changera pas le Type pour autant.
Dans une évènementielle de feuille "Target" est un Range Tu peux l'appeler "Papillon" ou "Galopin" ce sera toujours un Range.
Dans ta fonction de rappel c'est pareil : que tu l'appelles "ItemID" "Index" ou "Libellule" ce paramètre sera toujours un string.
Tu dois utiliser les syntaxes fournie par Custom UI. Si tu inventes tes propres syntaxes c'est sur que ça marchera pas !
Je sais pas si tu as exploité à donf le lien que tu cites mais c'est pourtant bien documenté (et un Ribbon perso pour ACCESS n'est pas différent d'un Ribbon perso pour Excel...)
Il y est également clairement exprimé que les fonctions de rappel (et de Callback sont uniques même si tu dois leur affecter plusieurs objets. Regarde sur mon fichier joint précédemment, dans la Sub Ribbon_GetLabel je distingue les différents boutons par :
i = CInt(Right(control.ID, 1))J'aurai pu faire de même avec mes combos, mais comme je n'en ai que deux j'ai juste utilisé un
If control.ID = "dropDown1" Then Le Else correspond à forcément à l'autre...
Rien ne t'empêche de faire de même avec tes combos et comme tu as un arsenal de combo tu utiliseras un
i = CInt(Right(control.ID, 1))et un Select Case.... Mais la encore ça suppose que tu utilises une sémantique courte et intelligible (incrémentée)
A+
ok merci pour ces quelques explications je vais racheter une boite de doliprane et je reprend les explications du lien.
Donc si j'ai bien compris je ne pourrais jamais dans le OnChange de mes combo récupérer le numéro d'indexation de la saisie!
Je me repenche dès que possible sur la structure du casier00, mais je n'est pas eu l'impression que les combobox était "réinitialiser" après les différentes sélections.
Select Case.... Mais la encore ça suppose que tu utilises une sémantique courte et intelligible (incrémentée)
Encore merci Galopin
"je ne pourrais jamais dans le OnChange de mes combo"
Sissi !
Mais ça sert à quoi que je te serve des exemples sur un plateau ?
Et comment tu crois que moi je récupère le nom et le jour de semaine ?
C'est le rôle du 2° paramètre (itemIndex) :
'Callback for List1 et 2 onAction
Sub Ribbon_OnAction_List(control As IRibbonControl, itemID As String, itemIndex As Integer)Moi j'utilise onAction je n'ai pas testé onChange mébon je suppose que ça ne doit pas être bien différent...
(Vérifier la syntaxe pour onChange...)
A+
bah j'avais essayé avec le itemIndex mais j'ai peut êtres fait de la m****** du coup j'ai contourné le problème ainsi
Dim ind, lig As Integer
WsPlan.ShowAllData
ind = -1
lig = 2
While (ind = -1)
If (WsPrm.Cells(lig, 8) = index) Then
ind = lig - 1
WsPlan.Range("$B$1:$B$377").AutoFilter Field:=1, Criteria1:=ind, _
Operator:=xlOr, Criteria2:="=5"
End If
lig = lig + 1
Wendje réindexe d'après la liste de mon onglet paramètre, du coup j'ai découvert le While, j'ai quand même de bon gros trous dans mes connaissances ! ( si j'avais su qu'il existait celui là! au moin je dormirai un peu moins bête ce soir!!
oulala !
Quand je disais que j'étais nul, il y avait du vrai !
Le grand chêne a d'abord été un gland...
Mince j ai dû tomber en zone sterile
Mais Heureusement, même dans les désert les plus arides, parfois il pleut
Bref pour être plus sérieux je valide le sujet je laisse mon fichier exemple tout est dans le module Combo ( original non?)
3 Combo sur 4 ( pas encore ecrit la macro de la dernière) filtrent la page et lorsque l'une des 4 combo est sélectionnée les autres se réinitialisent.
Merci Galopin
Bon comme dirait certain, Ya plus Ka !
[Edit] Voici la dernière version du fichier avec les 4 comboboxs qui se réinitialisent, le code est un peu plus optimisé. Egalement 3 boutons va et vient qui se réinitialisent entre eux