IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Alimenter un Combobox dans le ruban lors d'un changement d'onglet.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    Par défaut Alimenter un Combobox dans le ruban lors d'un changement d'onglet.
    Bonjour à la communauté.
    Je cherche à alimenter un combobox de mon ruban dès que je change de feuille, donc, en résumer :
    - Je pense que ça commence ici : "Workbook_SheetActivate",
    - vider le combo concerné (nom du ruban : "MonRuban", étonnant, non ? / Nom du Combo dans le contenu XML : id="ComboTypLign"),
    - ensuite, remplir ce combo avec les cellules de la feuille nouvellement active : AA1 à AJ1.
    Mes contraintes :
    - j'utilise le ruban car il sera toujours présent et que celà permet à l'utilisateur de créer des tonnes d'onglets, en ayant toujours le ruban...
    - Ce ruban me donne des libertés que les ActiveX (ou bouton insérés dans la feuille) ne me donneront jamais.
    - Mon classeur devrait être utilisé par un maximum de personne, sans rien installer, juste en ouvrant le XLSM, et sans aucunes connaissances particulières pour les utilisateurs (je cherche à servir le plus grand nombre).
    Je vous remercie pour votre lecture, et si quelqu'un a une astuce, un conseil, une solution, je suis preneur...
    Bonne soirée (ou bonne journée) à la communauté...
    Denis...

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi ne pas utiliser les menus personnalisés (anciennes barres à outils) les CommandBarPopup et CommandBarButton que l'on peut créer automatiquement à l'ouverture d'Excel et piloté par une macro-complémentaire (Add-In) ?
    J'utilise cela depuis près de 20 ans

    A lire éventuellement
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    Par défaut
    Bonjour Philippe, et merci pour ton aide.
    Je souhaite placer toutes mes macros dans un seul onglet du ruban, j'aimerais rester dans une configuration uniquement type "ruban".
    En outre, je ne sais pas si les utilisateurs sauront ou aimeront utiliser les barres de commandes en plus du ruban.
    Denis.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    C'est possible si ton ruban est construit par un xml que tu as créé et ajouté mais à mon avis, ce n'est pas possible pour un ruban créé via "modifier le ruban". Or, je suppose que c'est la deuxième méthode que tu as utilisée pour créer l'onglet perso. Peux-tu préciser comment tu as créé le ruban?

    Perso, je trouve aussi que le ruban est plus adapté aux versions actuelles que l'ancien CommandBar, même si je reconnais que c'est un peu plus délicat à mettre en place, notamment parce qu'il faut blinder son code pour éviter de stopper le projet VBA en erreur.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    Par défaut
    Salut Pierre, et merci pour ton aide.
    J'ai créé le contenu XML de mon ruban avec Custom UI Editor. j'ai déjà plusieurs macros actives et qui fonctionnent parfaitement.
    Mais je ne sais que "exécuter" un bouton, j'ignore totalement comment "remplir" un combo dans le ruban.
    J'ai à mon actif, des centaines de UserForm contenant parfois des ComboBox, en VBA "pure" (sans ruban), ça je me débrouille plutôt bien.
    Denis.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    La mise en oeuvre est (un peu) plus complexe que pour un commndbar.

    Au niveau du fichier xml du ruban

    Variabilisation du ruban

    Il faut prévoir de récupérer le ruban dans une variable publique. Cela s'effectue par une fonction CallBack qui est appelée au chargement du ruban grâce à la propriété onLoad. Le xml doit prévoir cela dans la balise customUI:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RibbonInitialize">

    Propriétés du combobox

    Au niveau du combobox, il faut prévoir trois propriétés qui renseigneront les procédures CallBack pour gérer l'alimentation du combobox et récupérer le choix opéré:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <comboBox
      id="cb1"
      onChange="cbChange"
      getItemLabel="cbGetLabel"
      getItemCount="cbGetCount"
    />


    Voici le xml de base pour la gestion d'un combobox par vba
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RibbonInitialize">
    	<ribbon startFromScratch="false">
    		<tabs>
    			<tab id="ribMain" label="Test" visible="true">
    				<group id="grActions" visible="true" label="Actions">
    					<comboBox
    						id="cb1"
    						onChange="cbChange"
    						getItemLabel="cbGetLabel"
    						getItemCount="cbGetCount"
    					/>
    				</group>
    			</tab>
    	   </tabs>
    	</ribbon>
    </customUI>

    Au niveau du code VBA

    • On prévoit une variable publique qui récupère le ruban passé par la CallBack;
    • On crée les macros renseignées dans le onLoad du ruban ainsi que dans les trois propriétés du combobox onChange, getItemLabel et getItemCount.



    Ces macros seront écrites dans un module standard. On peut bien entendu prévoir un seul cbGetCount etcbGetItemLabel pour tous les combo à gérer avec un Select Case sur l'ID du control récupéré, comme pour les onAction des boutons.

    Voici un exemple pour charger les noms des feuilles hormis la feuille active dans le combo et pour récupérer le nom choisi dans le combo. On remarque que le chargement s'effectue en deux temps:
    1. déterminer le nombre d'items du combobox (cbGetItemCount);
    2. charger chaque item (cbGetItemLabel). cbGgetItemLabel sera appelé le nombre de fois renseigné lors de l'exécution de cbGetItemCount.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Explicit
     
    Public MainRibbon As IRibbonUI
     
    Sub RibbonInitialize(Item As IRibbonUI)
      Set MainRibbon = Item
    End Sub
     
    Sub cbChange(control As IRibbonControl, text As String)
      MsgBox text
    End Sub
     
    Sub cbGetCount(control As IRibbonControl, ByRef count)
      count = Worksheets.count - 1
    End Sub
     
    Sub cbGetLabel(control As IRibbonControl, index As Long, label)
      If index >= ActiveSheet.index - 1 Then
        label = Worksheets(index + 2).Name
      Else
        label = Worksheets(index + 1).Name
      End If
    End Sub
    cbGetItemCount puis cbGetitemLabel seront appelés lors du rafraichissement du ruban grâce à MainRibbon.Invalidate. On pourrait aussi prévoir de ne rafraichir que le combobox avec MainRibbon.InvalidateControl "cb1". Dans l'exemple repris ci-dessus, on invoquera le rafraichissement du ruban lors d'un changement de feuille avec ce code, placé dans le module ThisWorkbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      If Not MainRibbon Is Nothing Then MainRibbon.InvalidateControl "cb1"
    End Sub

    Deux choses importantes:
    1. Le XML est sensible à la casse. Il faut être particulièrement attentif aux codages des propriétés: onChange <> onchange!!
    2. MainRibbon est une variable publique qui est valorisée UNIQUEMENT lors du chargement du ruban, c'est-à-dire AVANT le Workbook_Open. On ne sait pas le recharger par la suite, de sorte que si le code est arrêté suite à un débogage, la variable est réinitialisée. Cela veut dire qu'il faut prévoir le coup au niveau de Invalidate (avec un If Not MainRibbon Is Nothing Then ) et que le ruban ne sera plus dynamique après plantage, obligeant à fermer puis ouvrir le classeur pour le recharger. Il faut donc être particulièrement attentif à une gestion blindée des erreurs avec On Error...
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    Par défaut
    Salut Pierre.
    La vache, je viens d'en apprendre bien plus que dans tous les tutos que j'ai lu...
    Je te remercie... Amplement, et grandement...
    Je vais prendre connaissance de tes codes... Je vais les disséquer et reviendrai ici pour t'en faire part...
    Un grand merci pour ton aide... Réellement...
    Denis...

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Content pour toi. N'hésite pas si tu as des questions.

    Bonne soirée
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Problème d'Utilisation d'un combobox dans le Ruban
    Par broch002 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/02/2013, 18h44
  2. [Toutes versions] Alimenter un ComboBox dans un Userform
    Par irthen dans le forum VBA Word
    Réponses: 10
    Dernier message: 24/01/2013, 21h40
  3. Réponses: 3
    Dernier message: 16/09/2008, 17h08
  4. [Excel2007] Gérer un Combobox dans un ruban personnalisé
    Par SilkyRoad dans le forum Contribuez
    Réponses: 3
    Dernier message: 01/12/2007, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo