Bonjour à tous,
Je souhaiterais trouver, s'il existe, le code VBA qui permet de simuler un clic sur un des boutons du Ruban. Savez-vous si cela est possible ?
Merci
Version imprimable
Bonjour à tous,
Je souhaiterais trouver, s'il existe, le code VBA qui permet de simuler un clic sur un des boutons du Ruban. Savez-vous si cela est possible ?
Merci
bonjour
exemple je clique sur le bouton souligné
Code:
1
2
3 Sub testcliccmbCtrl() CommandBars.FindControl(ID:=115).Execute End Sub
Salut.
Il faut remplacer IdMso par l'identifiant du bouton du ruban. Tu peux connaître l'identifiant d'un bouton du ruban via Fichier/Options/Personnaliser le ruban, puis passer la souris sur le bouton souhaité dans une des deux listes. L'IdMso du bouton apparaîtra en infobulle.Code:Application.CommandBars.ExecuteMso IdMso
Par exemple, si tu veux ajouter un segment sur un tableau structuré, tu peux utiliser Application.CommandBars.ExecuteMso "TableSlicerInsert"
Il est préférable d'utiliser ExecuteMso plutôt que la méthode de Patrick qui ne fonctionne pas pour tous les contrôles du ruban. Par exemple, pour placer un segment sur un tableau structuré, tu peux utiliser CommandBars.FindControl(id:=24998).Execute (encore faut-il connaître l'ID...), mais si tu veux "cliquer" sur "Lignes à bande" pour mettre/enlever l'alternance de couleurs sur les lignes d'un tableau structuré, tu devras utiliser Application.CommandBars.ExecuteMso "TableStyleBandedRows", car CommandBars.FindControl(id:=12480).Execute ne fonctionne pas et lève une exception.
Sur https://www.microsoft.com/en-us/down....aspx?id=50745, tu peux télécharger un zip contenant une kyrielle de fichiers Excel reprenant les Noms des contrôles et leurs ID numériques.
re
@pierre
Attention tout de meme en cas de ribbon custom au controls qui reprennent les idmso de controls existants dans le xml ( a tester)
Ben, teste-le, alors, au lieu de venir soulever un problème qui n'existe pas :weird:
La question initiale porte sur le fait d'activer par vba des actions du ruban. Ton code déclenche a priori l'action d'un contrôle de commandbar. Tu es donc encore une fois hors sujet! Dès lors, il me semble normal d'utiliser ExecuteMso.
Si tu crées un bouton en lui attribuant un idMso, l'action qui sera réalisée sera identique à celle du bouton original. Un OnAction est inopérant sur un bouton créé en utilisant un idMso.
Si tu rediriges l'action d'un bouton "natif" avec une commande dans le xml de ton ruban personnalisé, le bouton "natif" lancera l'action que tu as redéfinie.
Tu ne peux pas avoir plusieurs boutons avec des idMso identiques qui agiraient de manière différente, ça mettrait à mal la définition même d'un ID, il me semble.
Si tu rediriges l'action d'un idMso sur une procédure perso (possible en utilisant les noeuds Commands et Command dans le xml de ton ruban perso), le bouton qui utilise cet idMso lancera ta procédure perso, que ce soit par clic dans Excel ou par ExecuteMso en VBA.
Bref, je ne comprends pas bien le sens de ta remarque et n'en saisis pas la pertinence :koi:
re
Pierre
exemple de copie dans un autre
il me semble que ca embarque tout non?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon startFromScratch="false"> <tabs> <!-- Ajoute un nouvel onglet nommé OngletPerso --> <tab id="OngletPerso" label="Mes fonctions préférées" visible="true"> <!-- Ajoute le groupe standard 'bibliothèque de fonctions' --> <group idMso="GroupFunctionLibrary" /> </tab> </tabs> </ribbon> </customUI>
j'ai deux classeurs dans le quel j'ai copié le groupe des outils texte du tabhome dans mon onglet perso et je n'ai rien ajouté les fonctions sont opérantes
je testerais demain a l'atelier
Ben oui ça embarque tout, et alors? Que cherches-tu à tester ou à prouver par là? Que n'as-tu pas compris dans mon message précédent?
Dit autrement: Les boutons qui ont le même idMso enclenchent la même action.. Ca saurait difficilement être plus clair. Ca dit quand même bien que tu peux avoir plusieurs boutons avec le même idMso mais ils lanceront forcément la même action. Qu'est-ce que tu ne comprends pas dans cette phrase?
Dans le classeur test-ruban, j'utilise le ruban perso suivant:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon startFromScratch="false"> <tabs> <tab id="dvp" visible="true" label="DVP"> <group id="groMso" visible="true" label="tests"> <button idMso="TableSlicerInsert" size="normal" visible="true" /> </group> <group id="groMso1" visible="true" label="tests 1"> <button idMso="TableSlicerInsert" onAction="PersoSlicer" size="normal" visible="true" /> </group> </tab> </tabs> </ribbon> </customUI>
En allant sur l'onglet DVP du ruban, il y a donc deux groupes contenant chacun un bouton TableSlicerInsert. Dans le groupe groMso1, j'ai renseigné un onAction, mais, comme je l'ai déjà dit, OnAction est inopérant sur les idMso. Si tu es dans le tableau et que tu cliques sur un de ces boutons, ou sur le bouton natif d'insertion d'un segment du tab "Création tableau", ou sur le même bouton placé sur la barre d'accès rapide, tu pourras insérer un segment. Il en va de même si tu lances la macro SimulateMso => logique.
Dans le classeur test-ruban-1, je redirige l'action de TableSlicerInsert grâce au ruban qui utilise une redirection de commande:
Dans CE classeur, TabSlicerInsert est redirigé vers la procédure Test. Que tu cliques sur le bouton natif, sur un des boutons présents dans l'onglet DVP ou sur le bouton d'ajout d'un segment que tu aurais mis sur la barre d'accès rapide, tu déclencheras la procédure Test. Idem si tu lances la macro SimulateMso de ce fichier (ça n'a évidemment pas de sens de faire cela, ceci dit).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <commands> <command idMso="TableSlicerInsert" onAction="Test" /> </commands> <ribbon startFromScratch="false"> <tabs> <tab id="dvp" visible="true" label="DVP"> <group id="groMso" visible="true" label="tests"> <button idMso="TableSlicerInsert" size="normal" visible="true" /> </group> <group id="groMso1" visible="true" label="tests 1"> <button idMso="TableSlicerInsert" onAction="PersoSlicer" size="normal" visible="true" /> </group> </tab> </tabs> </ribbon> </customUI>
De plus, sauf à créer un ruban FromScratch, ça n'a pour moi pas de sens d'embarquer tout un groupe MSO dans un onglet perso.
Je rappelle qu'au départ, tu parles de Application.CommandBars.FindControl(id:=...).Execute qui n'est pas une réponse valide puisque le demandeur parle expressément du ruban => Application.CommandBars.ExecuteMso ...