Personnalisation du ruban:
Les fonctions d'appel CallBacks
Date de publication : 16 Juillet 2008 , Date de mise à jour : 02 Aout 2008
Par
SilkyRoad (silkyroad.developpez.com)
Ce tutoriel présente les fonctions d'appel CallBacks sous Excel2007.
I. Introduction
II. Description des arguments contenus dans les fonctions d'appel
III. Les fonctions d'appel
III-1. onLoad
III-2. loadImage
III-3. getEnabled
III-4. onAction
III-5. getVisible
III-6. getKeytip
III-7. getLabel
III-8. getImage
III-9. getScreentip
III-10. getSupertip
III-11. getDescription
III-12. getShowImage
III-13. getShowLabel
III-14. getSize
III-15. getPressed
III-16. getItemCount
III-17. getItemID
III-18. getItemImage
III-19. getItemLabel
III-20. getItemScreentip
III-21. getItemSupertip
III-22. getText
III-23. onChange
III-24. getSelectedItemID
III-25. getSelectedItemIndex
III-26. getContent
III-27. getItemHeight
III-28. getItemWidth
III-29. getTitle
IV. Liens
V. Remerciements
VI. Téléchargement
I. Introduction
Le tutoriel précédent (
La personnalisation du ruban),
présentait les attributs et les contrôles utilisables dans vos projets. Ce nouvel article
décrit les fonctions d'appel VBA (CallBacks).
Une partie des attributs contenus dans le fichier xml de personnalisation peuvent être
associés à des fonctions d'appel VBA. Les paramètres définis dans votre code xml sont
alors liés à des procédures placées dans un module standard du classeur. Vous pouvez
déclencher une macro depuis le ruban (à l'aide des événements onAction, onChange ...), mais
également gérer dynamiquement, paramétrer et modifier les attributs des contrôles par VBA, en leur
ajoutant le préfixe
get.
La caractéristique d'un attribut
getNomAttribut est de pouvoir mettre à jour
dynamiquement sa propriété NomAttribut.
Par exemple, au lieu d'indiquer le paramètre
itemHeight="LaValeur"
explicitement en dur dans le fichier xml de personnalisation, vous écrirez
getItemHeight="NomMacroDefinitionHauteurItem".
Ensuite, il vous restera à placer la fonction d'appel dans un module standard du classeur:
Sub NomMacroDefinitionHauteurItem(control As IRibbonControl, ByRef returnedVal).
Les chapitres suivants décrivent les fonctions disponibles et proposent quelques exemples
d'utilisation.
Remarques :
Bien entendu les CallBacks ne fonctionnent pas si vous désactivez les macros à
l'ouverture du classeur.
Attention à bien respecter la casse lorsque vous rédigez vos codes dans le fichier xml
de personnalisation.
II. Description des arguments contenus dans les fonctions d'appel
Les fonctions sont constituées d'arguments qui récupèrent des informations dans le ruban
ou y renvoient des paramètres.
Voici une description des éléments présents dans les fonctions CallBacks:
L'argument control.
Exemple: Sub ___OnAction(control As IRibbonControl)
Cet argument identifie le contrôle manipulé par VBA. Il possède 3 propriétés en lecture seule:
* id est l'identifiant unique qui permet d'identifier chaque contrôle. Si vous attribuez la
même procédure à plusieurs contrôles du fichier xml de personnalisation, l'id vous permet de
repérer lequel est en cours d'utilisation.
* tag est l'information personnelle complémentaire du contrôle, que vous avez défini dans
le fichier xml.
* context (Je n'ai pas réussi à le faire fonctionner).
Le mot clé Byref.
Exemple : Sub ___GetEnabled(control As IRibbonControl, ByRef enabled)
Lorsqu'un argument est précédé du mot clé ByRef, cela signifie que
la donnée spécifiée dans votre fonction va être utilisée pour mettre à jour l'attribut du contrôle.
Quand la procédure est appelée par l'application, un objet IRibbonControl représentant le
contrôle est défini. Le code vérifie la propriété 'id' de l'objet et en fonction de sa
valeur, il assigne une donnée à la variable. Par exemple : enabled = True.
L'argument pressed.
Exemple : Sub ____OnAction(control As IRibbonControl, pressed As Boolean)
Cet argument renvoie la valeur Vrai si le contrôle est coché (pour les checkBox) ou si la
touche est enfoncée (pour les toggleButton). La valeur Faux est renvoyée dans le cas contraire.
L'argument index.
Exemple : Sub ___GetItemLabel(control As IRibbonControl, index As Integer, ByRef label)
Cet argument définit le numéro de l'élément dans les contrôles de type menu déroulant
(ComboBox, dropDown , Gallery).
0= le premier élément dans la liste
1= le deuxième élément
... etc ...
L'argument Id.
Exemple : Sub NomProcedure(control As IRibbonControl, Id As String,
index As Integer)
Cet argument renvoie l'identificateur unique de l'item sélectionné (pour les contrôles dropDown
et Gallery).
L'argument text.
Exemple : Sub ___OnChange(control As IRibbonControl, text As String)
Renvoie la donnée contenue dans les contrôles de saisie (editBox, comboBox).
III. Les fonctions d'appel
III-1. onLoad
La fonction
onLoad s'applique au contrôle
customUI.
Elle définit la procédure VBA qui doit être déclenchée lors du chargement du ruban.
Il est possible d'appliquer des actualisations à n'importe quel
moment par macro, grâce à la fonction de rappel
onLoad.
Ce rappel est déclenché une seule fois,
après l'ouverture du classeur. Celui-ci va charger une variable objet qui déclarée
avec un type
IRibbonUI et sera placée dans un module standard.
Par exemple :
Public objRuban As IRibbonUI.
L'objet IRibbonUI possède deux méthodes :
Invalidate() qui actualise en une seule fois tous
les contrôles personnalisés du classeur.
InvalidateControl(ControlID As String) qui actualise un contrôle
particulier (ControlID correspond à l'identificateur unique du contrôle).
Cet exemple active un bouton de manière conditionnelle.
Le contrôle est utilisable uniquement si le contenu de la cellule A1 contient la valeur 1.
Placez ce code dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RubanCharge">
<!-- onLoad="RubanCharge" est déclenché lors du chargement du ruban personnalisé. -->
<ribbon startFromScratch="false">
<tabs>
<tab id="OngletPerso" label="OngletPerso" visible="true">
<group id="Projet01" label="Projet 01">
<!-- onAction="ProcLancement" définit la macro déclenchée lorsque vos cliquez sur le bouton. -->
<!-- getEnabled="Bouton1_Enabled" gére la condition d
<button id="Bouton1" label="Lancement" onAction="ProcLancement" size="normal"
imageMso="Repeat" getEnabled="Bouton1_Enabled"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Ouvrez le classeur Excel. Validez l'éventuel message d'erreur "Impossible d'exécuter la macro
'RubanCharge'...". Ce message est normal car le classeur ne contient pas encore les fonctions
de rappel.
Placez ce code dans un module standard :
| Vba |
Option Explicit
Public objRuban As IRibbonUI
Public boolResult As Boolean
Sub RubanCharge(ribbon As IRibbonUI)
boolResult = False
Set objRuban = ribbon
End Sub
Sub ProcLancement(control As IRibbonControl)
MsgBox "ma procédure."
End Sub
Sub Bouton1_Enabled(control As IRibbonControl, ByRef returnedVal)
returnedVal = boolResult
End Sub
|
Et placez ce code dans le
module objet Worksheet de la feuille (où vous allez modifier le contenu
de la cellule A1):
| Vba |
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And Target = 1 Then
boolResult = True
Else
boolResult = False
End If
If Not objRuban Is Nothing Then objRuban.InvalidateControl "Bouton1"
End Sub
|
Refermez puis ré-ouvrez le classeur (les macros doivent impérativement être activées).
La variable "objRuban" va être chargée depuis la procédure "RubanCharge" :
Set objRuban = ribbon
Si les conditions sont ensuite remplies (en fonction des modifications dans la cellule A1), le
contrôle "Bouton1" va être activé ou désactivé.
Rappel:
Pour les contrôles de type comboBox, gallery et dynamicMenu, vous pouvez insérer l'attribut
invalidateContentOnDrop dans le fichier xml de personnalisation afin d'actualiser
automatiquement le contenu du contrôle lorsque celui-ci est sélectionné.
III-2. loadImage
La fonction
loadImage s'applique au contrôle
customUI.
Elle définit la procédure VBA qui va charger des images. De cette manière, toutes les
images sont récupérées en une seule fois, au moment ou vous activez un élément personnalisé
de votre ruban.
Cet exemple suppose qu'il existe des images nommées "logo16.gif" et "lapin4.gif" dans le
répertoire "C:\dossier\". Les noms de fichiers sont spécifiés dans l'attribut image
(image="logo16.gif").
Placez ce code dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
loadImage="MacroChargementImage">
<ribbon>
<tabs>
<tab id="Tab01" label="Test" >
<group id="Groupe01" label="Essai chargement image">
<button id="button01"
size="large"
image="logo16.gif"/>
<button id="button02"
size="large"
image="lapin4.gif"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Et la fonction de chargement d'image, à placer dans un module standard :
| Vba |
Sub MacroChargementImage(imageID As String, ByRef returnedVal)
Set returnedVal = LoadPicture("C:\dossier\" & imageID)
End Sub
|
III-3. getEnabled
La fonction getEnabled s'applique aux contrôles command, button, checkBox,
comboBox, dropDown, dynamicMenu, editBox, gallery, labelControl, menu,
splitButton, toggleButton.
Elle spécifie une valeur booléenne qui indique si le contrôle doit être activé (true ou 1) ou
désactivé (false ou 0).
Cet exemple active un bouton personnalisé uniquement si la cellule A1
contient la valeur 1.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RubanCharge">
<!-- onLoad="RubanCharge" est déclenché lors du chargement du ruban personnalisé. -->
<ribbon startFromScratch="false">
<tabs>
<tab id="OngletPerso" label="OngletPerso" visible="true">
<group id="Projet01" label="Projet 01">
<!-- onAction="ProcLancement" définit la macro déclenchée lorsque vos cliquez sur le bouton. -->
<!-- getEnabled="Bouton1_Enabled" gère la condition d
<button id="Bouton1" label="Lancement" onAction="ProcLancement" size="normal"
imageMso="Repeat" getEnabled="Bouton1_Enabled"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard :
| Vba |
Option Explicit
Public MonRuban As IRibbonUI
Public boolResult As Boolean
Sub RubanCharge(ribbon As IRibbonUI)
boolResult = False
Set MonRuban = ribbon
End Sub
Sub ProcLancement(control As IRibbonControl)
MsgBox "ma procédure."
End Sub
Sub Bouton1_Enabled(control As IRibbonControl, ByRef returnedVal)
returnedVal = boolResult
End Sub
|
Dans le module objet Worksheet de la feuille (où vous allez modifier le
contenu de la cellule A1):
| Vba |
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then _
boolResult = Target = 1
If Not MonRuban Is Nothing Then MonRuban.InvalidateControl "Bouton1"
End Sub
|
Les fonctions d'appel peuvent également être appliquées aux commandes prédéfinies.
Un exemple qui désactive la commande "Copier" si le classeur est ouvert en lecture seule :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<commands>
<command idMso="Copy"
getEnabled="macroGetEnabled"/>
</commands>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Sub macroGetEnabled(control As IRibbonControl, ByRef returnedVal)
returnedVal = Not ThisWorkbook.ReadOnly
End Sub
|
III-4. onAction
La fonction onAction s'applique à tous les contrôles.
Elle est déclenchée lorsque vous cliquez sur le contrôle afin de l'utiliser.
Vous trouverez de nombreux exemples dans les différents chapitres de ce tutoriel.
Une deuxième utilisation de la fonction onAction, consiste à désactiver temporairement
et réattribuer des procédures personnelles aux commandes prédéfinies du ruban (onAction Repurposed).
Dans ce cas, la procédure contient un deuxième argument : 'cancelDefault'.
Sub NomProcedure(control As IRibbonControl, ByRef cancelDefault).
Pour désactiver la commande prédéfinie, spécifiez cancelDefault = True.
Pour réinitialiser la commande, indiquez cancelDefault = False.
Cet exemple ajoute un onglet 'test' qui contient un bouton bascule (toogleButton). Si vous cliquez
dessus, la commande prédéfinie 'Recherche' (onglet Accueil/groupe Edition) est désactivée.
Réutilisez le bouton pour réinitialiser la commande 'Recherche'.
Placez ce code dans le fichier xml de personnalisation du classeur :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="RubanCharge" >
<commands>
<command idMso="FindDialogExcel" onAction="MaRecherchePerso" />
</commands>
<ribbon startFromScratch="false">
<tabs>
<tab id="Tab01" label="Test" >
<group id="Groupe01" label="essai de réattribution d'un contrôle prédéfini">
<toggleButton id="ToggleButton01"
imageMso="SheetProtect"
size="large"
getLabel="MacroGetLabel"
onAction="ModifStatutBoutonRecherche" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans le module objet "ThisWorkbook" du classeur :
| Vba |
Option Explicit
Private Sub Workbook_Open()
boolResult = False
End Sub
|
Dans un module standard du classeur :
| Vba |
Option Explicit
Public boolResult As Boolean
Public objRuban As IRibbonUI
Sub RubanCharge(ribbon As IRibbonUI)
Set objRuban = ribbon
End Sub
Sub ModifStatutBoutonRecherche(control As IRibbonControl, pressed As Boolean)
boolResult = pressed
objRuban.Invalidate
End Sub
Sub MaRecherchePerso(control As IRibbonControl, ByRef cancelDefault)
If boolResult Then
MsgBox "Le bouton 'Recherche' est temporairement désactivé"
cancelDefault = True
Else
cancelDefault = False
End If
End Sub
Sub MacroGetLabel(control As IRibbonControl, ByRef returnedVal)
If boolResult Then
returnedVal = "Bouton 'Recherche' Désactivié"
Else
returnedVal = "Bouton 'Recherche' opérationnel"
End If
End Sub
|
III-5. getVisible
La fonction getVisible s'applique aux contrôles tabSet, tab, group, box, button,
buttonGroup, checkBox, comboBox, dropDown, dynamicMenu, editBox, gallery, labelControl,
menu, separator, splitButton, toggleButton.
Elle renvoie une valeur booléenne qui indique si le contrôle est visible (true) ou
masqué (false).
Dans cet exemple, le bouton "Copier" qui placé dans un onglet personnel sera visible
uniquement si le nom de l'utilisateur de la session est "mimi".
Placez ce code dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="TB01" label="Test">
<group id="GR01" label="Essais de bouton">
<button idMso="Copy" size="normal" getVisible="SiUtilisateur" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur:
| Vba |
Sub SiUtilisateur(control As IRibbonControl, ByRef returnedVal)
returnedVal = Environ("username") = "mimi"
End Sub
|
Remarque :
La fonction d'appel getVisible ne marche pas sur les onglets prédéfinis si ceux-ci ont
préalablement été masqués par l'attribut startFromScratch="true".
III-6. getKeytip
La fonction
getKeytip s'applique aux contrôles
tab, group, button, checkBox,
comboBox, dropDown, dynamicMenu, editBox, gallery, menu, splitButton, toggleButton.
Elle définit la procédure VBA qui associera un raccourci clavier au contrôle.
Les raccourcis clavier sont composés de 1 à 3 caractères maximum et sont accessibles après
l'utilisation de la touche ALT.
Exemple à placer dans le fichier de personnalisation, pour associer le raccourci "XL" au bouton
personnalisé :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="TB01" label="Test">
<group id="GR01" label="Essais de bouton">
<button id="bouton01"
imageMso="RefreshStatus"
onAction="MacroBouton"
size="normal"
getKeytip="DefinitRaccourci" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard :
| Vba |
Option Explicit
Sub DefinitRaccourci(control As IRibbonControl, ByRef returnedVal)
returnedVal = "XL"
End Sub
Sub MacroBouton(control As IRibbonControl)
MsgBox "Vous avez cliqué sur le bouton '" & control.id & "'"
End Sub
|
III-7. getLabel
La fonction
getLabel s'applique aux contrôles
tab, group, button, checkBox,
comboBox, dropDown, dynamicMenu, editBox, gallery, labelControl, menu, toggleButton.
Elle définit la chaîne de caractères qui va s'afficher dans l'attribut "label"
(étiquette) du contrôle.
Le code suivant permet de saisir un mot de passe depuis le ruban et de l'afficher
sous forme d'astérisques dans le label (getLabel="ContenuLabel").
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="objRuban">
<ribbon>
<tabs>
<tab id="Essai" label="Essai" >
<group id="MdP" label="Mot de passe">
<gallery id="gallery01"
size="normal"
imageMso="CalculateNow"
label="Saisissez le mot de passe:"
columns="6"
rows="6"
getItemCount="NbCaracteres"
showItemLabel="true"
getItemLabel="LabelCaractere"
screentip="Sélectionnez les caractéres dans la galerie,
puis validez le mot de passe."
onAction="SelectCaractere" >
<button id="Bt02" label="Effacer la saisie."
imageMso="ClearMenu" onAction="EffaceContenuLabel"/>
</gallery>
<box id="Box01" boxStyle="horizontal">
<labelControl id="LC01" getLabel="ContenuLabel" />
</box>
<button id="Bt01" imageMso="FileStartWorkflow" size="normal"
label="Validez le mot de passe" visible="true" onAction="ValidationMdP" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
| Vba |
Option Explicit
Private Sub Workbook_Open()
Tableau = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", _
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", _
"W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
End Sub
|
Dans un module standard du classeur :
| Vba |
Option Explicit
Option Base 1
Public Cible As String
Public MonRuban As IRibbonUI
Public Tableau As Variant
Sub objRuban(ribbon As IRibbonUI)
Set MonRuban = ribbon
End Sub
Sub NbCaracteres(control As IRibbonControl, ByRef returnedVal)
returnedVal = UBound(Tableau) + 1
End Sub
Sub LabelCaractere(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = Tableau(index)
End Sub
Sub SelectCaractere(control As IRibbonControl, id As String, index As Integer)
Cible = Cible & Tableau(index)
MonRuban.InvalidateControl "LC01"
End Sub
Sub ContenuLabel(control As IRibbonControl, ByRef returnedVal)
returnedVal = Application.WorksheetFunction.Rept("*", Len(Cible))
End Sub
Sub ValidationMdP(control As IRibbonControl)
MsgBox "Confirmation du mot de passe : (" & Cible & ")"
Cible = ""
MonRuban.InvalidateControl "LC01"
End Sub
Sub EffaceContenuLabel(control As IRibbonControl)
Cible = ""
MonRuban.InvalidateControl "LC01"
End Sub
|
III-8. getImage
La fonction getImage s'applique aux contrôles group, button, comboBox, dropDown,
dynamicMenu, editBox, gallery, menu, toggleButton.
Elle permet de charger ou de modifier dynamiquement par VBA une image stockée sur le
disque dur. L'objet image qui va être passé à l'argument returnedVal doit être
de type IPictureDisp (Utilisez la fonction LoadPicture).
L'exemple permet de charger une image stockée dans le répertoire "C:\dossier\" et dont
le nom est spécifié dans l'attribut "tag" du bouton.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="Tab01" label="Test" >
<group id="Groupe01" label="Essai chargement image">
<button id="button01"
getImage="MacroChargementImage"
tag="logo16.gif"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard de votre classeur :
| Vba |
Sub MacroChargementImage(control As IRibbonControl, ByRef returnedVal)
Set returnedVal = LoadPicture("C:\dossier\" & control.Tag)
End Sub
|
III-9. getScreentip
La fonction
getScreentip s'applique aux contrôles
group, button, checkBox,
comboBox, dropDown, dynamicMenu, editBox, gallery, labelControl, menu, toggleButton.
Elle définit la procédure VBA qui associe une petite info-bulle d'information pour
le contrôle.
Cet exemple crée une info-bulle pour chaque bouton. Les données à afficher sont stockées
dans la colonne A de la Feuil2. L'attribut "tag" permet de définir la ligne qui
doit être associée à chaque contrôle.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="Tab01" label="Test" >
<group id="Groupe01" label="Essai getScreentip et getSupertip">
<button id = "bouton01"
imageMso="MacroSecurity"
getScreentip="AideBouton"
getSupertip="AideComplementaire"
onAction = "MaProcedure"
tag="1" />
<button id = "bouton02"
imageMso="ShowClipboard"
getScreentip="AideBouton"
getSupertip="AideComplementaire"
onAction = "MaProcedure"
tag="2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Sub AideBouton(control As IRibbonControl, ByRef returnedVal)
returnedVal = Worksheets("Feuil2").Cells(CDec(control.Tag), 1)
End Sub
Sub AideComplementaire(control As IRibbonControl, ByRef returnedVal)
returnedVal = Worksheets("Feuil2").Cells(CDec(control.Tag), 2)
End Sub
Sub MaProcedure(control As IRibbonControl)
MsgBox "Ma procédure lancée depuis le bouton '" & control.id & "'"
End Sub
|
III-10. getSupertip
La fonction
getSupertip s'applique aux contrôles
group, button, checkBox,
comboBox, dropDown, dynamicMenu, editBox, gallery, labelControl, menu, splitButton,
toggleButton.
Elle définit une info-bulle complémentaire pour le contrôle. Celui-ci s'affiche à la
suite des informations indiquées dans l'attribut "screentip".
Consultez l'exemple proposé dans le chapitre
getScreenTip.
Les données à afficher sont stockées
dans la colonne B de la Feuil2. L'attribut "tag" permet de définir la ligne qui
doit être associée à chaque contrôle.
Vous noterez que les éventuels retours à la ligne que vous appliquez dans les
cellules (ALT+ENTREE) apparaissent également dans l'info-bulle.
Dans le fichier xml de personnalisation :
III-11. getDescription
La fonction
getDescription s'applique aux contrôles
button, checkBox,
dynamicMenu, gallery, menu, toggleButton.
Elle définit la chaîne de caractères qui va s'afficher dans l'attribut "description"
du contrôle.
L'exemple ci-dessous utilise la fonction d'appel getDescription afin de compléter la
description des boutons, depuis le code VBA.
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="Tab01" label="Test">
<group id="Groupe01" label="essai getDescription">
<menu id="menu01"
label="Export"
imageMso ="FileCompatibilityChecker"
itemSize="large" >
<button id="bouton01"
label="Vérification"
imageMso="MacroSecurity"
getDescription="MacroDescription"
onAction="MacroVerif"/>
<button id="bouton02"
label="Transfert"
imageMso="FileStartWorkflow"
getDescription="MacroDescription"
onAction="MacroTransfert"/>
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Sub MacroDescription(control As IRibbonControl, ByRef returnedVal)
Select Case control.id
Case "bouton01": returnedVal = "Vérifier la structure des données"
Case "bouton02": returnedVal = "Envoyer les données"
End Select
End Sub
Sub MacroVerif(control As IRibbonControl)
End Sub
Sub MacroTransfert(control As IRibbonControl)
End Sub
|
III-12. getShowImage
La fonction
getShowImage s'applique aux contrôles
button, comboBox,
dropDown, dynamicMenu, editBox, gallery, menu, toggleButton.
Elle renvoie une valeur booléenne qui va indiquer si l'image associée au contrôle
doit être affichée ou pas.
Consultez le chapitre consacré à
getItemImage
(getShowImage="MacroShowImage") pour visualiser un exemple.
III-13. getShowLabel
La fonction
getShowLabel s'applique aux contrôles
button, comboBox,
dropDown, dynamicMenu, editBox, gallery, labelControl, menu, splitButton, toggleButton.
Elle renvoie une valeur booléenne qui va indiquer si l'étiquette associée au contrôle
doit être affichée ou pas.
Consultez le chapitre consacré à
getItemImage
(getShowLabel="MacroShowLabel") pour visualiser un exemple.
III-14. getSize
La fonction
getSize s'applique aux contrôles
button, dynamicMenu, gallery,
menu, splitButton, toggleButton.
Elle attribue une taille au contrôle. Vous pouvez spécifier 2 valeurs :
* 0 indique que la taille est 'normal'.
* 1 indique que la taille est 'large'.
Une taille 'normal' tient sur une ligne dans le ruban, et l'étiquette est positionnée sur le
côté de l'icône.
Une taille 'large' correspond à 3 lignes 'normal' de hauteur, et l'étiquette est positionnée
sous l'icône.
Cet exemple place deux boutons dans le ruban: le premier de taille 'large' et le deuxième
de taille 'normal' afin que vous puissiez visualiser la différence de présentation entre les deux
options.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="tab1" label="Test" >
<group id="GR01" label="Essai getSize boutons">
<button id="bouton01"
imageMso="PictureBrightnessGallery"
label="Bouton 01"
getSize="MacroGetSize" />
<button id="bouton02"
imageMso="PictureBrightnessGallery"
label="Bouton 02"
getSize="MacroGetSize" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Sub MacroGetSize(control As IRibbonControl, ByRef returnedVal)
Select Case control.id
Case "bouton01": returnedVal = 1
Case "bouton02": returnedVal = 0
End Select
End Sub
|
III-15. getPressed
La fonction getPressed s'applique aux contrôles checkBox, toggleButton.
Elle permet de définir le statut du contrôle :
* True (Lorsque le bouton bascule est activé ou que la case est cochée).
* False (Lorsque le bouton bascule est désactivé ou que la case est décochée).
Cet exemple permet de paramétrer le contrôle 'checkBox' en vue de lui affecter la valeur
True (Coché) lors de l'ouverture du classeur.
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="tab1" label="Test" >
<group id="GR01" label="Essai de checkbox">
<checkBox id="CheckBox1"
label="Option"
onAction="Validation"
getPressed="MacroGetPressed" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Option Explicit
Sub MacroGetPressed(control As IRibbonControl, ByRef returnedVal)
returnedVal = True
End Sub
Sub Validation(control As IRibbonControl, pressed As Boolean)
MsgBox pressed
End Sub
|
III-16. getItemCount
La fonction
getItemCount s'applique aux contrôles
comboBox, dropDown, gallery.
Elle définit le nombre d'éléments qui va être intégré dans le contrôle.
Consultez l'exemple proposé dans le chapitre
getLabel
(getItemCount="NbCaracteres"): la procédure récupère la taille de
la variable tableau pour
déterminer le nombre d'éléments que va contenir le contrôle gallery.
III-17. getItemID
La fonction getItemID s'applique aux contrôles comboBox, dropDown, gallery.
Elle attribue un identificateur unique 'id' à chaque élément du contrôle.
Cet exemple crée 5 éléments dans un contrôle 'dropDown', qui vont être nommés 'strID1' à
'strID5'.
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="TB01" label="Test">
<group id="GR01" label="Essais getItemID">
<dropDown id="DropDown01"
getItemCount="MacroGetItemCount"
getItemID="MacroGetItemID"
getItemLabel="MacroGetItemLabel"
onAction="LancementProcedure" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Option Explicit
Sub MacroGetItemCount(control As IRibbonControl, ByRef returnedVal)
returnedVal = 5
End Sub
Sub MacroGetItemID(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = "strID" & index + 1
End Sub
Sub MacroGetItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = "LeLabel " & index + 1
End Sub
Sub LancementProcedure(control As IRibbonControl, id As String, index As Integer)
MsgBox "Vous avez sélectionné l'id : '" & id & "'"
End Sub
|
III-18. getItemImage
La fonction
getItemImage s'applique aux contrôles
comboBox, dropDown, gallery.
Elle définit l'image qui va être associée à un élément particulier du contrôle.
Cet exemple extrait les images .jpg contenues dans le répertoire spécial Windows "Mes images"
(dont le chemin est généralement
"C:\Documents and Settings\nom_utilisateur\Mes documents\Mes images").
Les images sont affichées dans la galerie sous forme de miniature. Chaque élément de
la galerie possède une info-bulle qui contient des informations sur
les propriétés
des images listées.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon startFromScratch="false">
<tabs>
<tab id="Tab01" label="Browser d'images" >
<group id="Groupe01" label="Mes images">
<gallery id="Galerie01"
label="Affichez la prévisualisation d'images"
imageMso="ObjectPictureFill"
columns="3"
onAction="ActionElementGalerie"
getShowImage="MacroShowImage"
getShowLabel="MacroShowLabel"
getItemCount="MacroGetItemCount"
getItemImage="MacroGetItemImage"
getItemLabel="MacroGetItemLabel"
getItemScreentip="MacroGetItemScreenTip"
getItemSupertip="MacroGetItemSuperTip"
getItemHeight="MacroGetItemHeight"
getItemWidth="MacroGetItemWidth"
getSelectedItemIndex="MacroSelItemIndex" >
</gallery>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans le module objet "ThisWorkbook" du classeur :
| Vba |
Option Explicit
Option Compare Text
Dim x As Integer
Private Sub Workbook_Open()
Const Cible = &H27
Dim objShell As Object, objFolder As Object
Dim strFileName As Object
Dim Resultat As String
Dim i As Integer
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Cible)
Chemin = objFolder.Self.Path
For Each strFileName In objFolder.Items
If strFileName.IsFolder = False And Right(strFileName, 4) = ".jpg" Then
x = x + 1
ReDim Preserve Tableau(1 To 2, 1 To x)
Tableau(1, x) = strFileName
Resultat = ""
For i = 0 To 34
If objFolder.GetDetailsOf(strFileName, i) <> "" Then _
Resultat = Resultat & objFolder.GetDetailsOf(strFileName, i) & vbLf
Next
Tableau(2, x) = Resultat
End If
Next
End Sub
|
Dans un module standard du classeur :
| Vba |
Option Explicit
Public Chemin As String
Public Tableau() As String
Sub ActionElementGalerie(control As IRibbonControl, id As String, index As Integer)
MsgBox "Vous avez cliqué sur l'image '" & Tableau(1, index + 1) & "'"
End Sub
Sub MacroShowImage(control As IRibbonControl, ByRef returnedVal)
returnedVal = True
End Sub
Sub MacroShowLabel(control As IRibbonControl, ByRef returnedVal)
returnedVal = True
End Sub
Sub MacroGetItemCount(control As IRibbonControl, ByRef returnedVal)
Dim VarTab As Variant
On Error Resume Next
VarTab = UBound(Tableau)
On Error GoTo 0
If IsEmpty(VarTab) Then
returnedVal = 0
Else
returnedVal = UBound(Tableau, 2)
End If
End Sub
Sub MacroGetItemImage(control As IRibbonControl, index As Integer, ByRef returnedVal)
Set returnedVal = LoadPicture(Chemin & "\" & Tableau(1, index + 1))
End Sub
Sub MacroGetItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = Tableau(1, index + 1)
End Sub
Sub MacroGetItemScreenTip(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = "Propriétés de '" & Tableau(1, index + 1) & "'"
End Sub
Sub MacroGetItemSuperTip(control As IRibbonControl, index As Integer, ByRef returnedVal)
returnedVal = Tableau(2, index + 1)
End Sub
Sub MacroGetItemHeight(control As IRibbonControl, ByRef returnedVal)
returnedVal = 50
End Sub
Sub MacroGetItemWidth(control As IRibbonControl, ByRef returnedVal)
returnedVal = 50
End Sub
Sub MacroSelItemIndex(control As IRibbonControl, ByRef returnedVal)
returnedVal = 0
End Sub
|
Cet exemple présuppose bien entendu que le nombre d'images ne soit pas trop important et
que leur taille en ko soit raisonnable ... ;o)
III-19. getItemLabel
La fonction
getItemLabel s'applique aux contrôles
comboBox, dropDown, gallery.
Elle définit la chaîne de caractères qui va s'afficher pour un élément spécifique du
contrôle.
Consultez les exemples proposés dans les chapitres
getLabel
(getItemLabel="LabelCaractere") et
getItemImage
(getItemLabel="MacroGetItemLabel") : les
procédures récupèrent le contenu de la variable tableau afin de créer une
étiquette pour chaque élément du contrôle gallery.
III-20. getItemScreentip
La fonction
getItemScreentip s'applique aux contrôles
comboBox, dropDown, gallery.
Elle définit une info-bulle pour un élément particulier du contrôle.
Consultez l'exemple proposé dans le chapitre
getItemImage
(getItemScreentip="MacroGetItemScreenTip"). Le code permet d'afficher le nom du fichier
associé à l'image.
III-21. getItemSupertip
La fonction
getItemSupertip s'applique aux contrôles
comboBox, dropDown, gallery.
Elle définit une info-bulle complémentaire pour un élément particulier du contrôle.
Les données s'affichent à la suite des informations indiquées dans l'attribut "screentip".
Consultez l'exemple proposé dans le chapitre
getItemImage
(getItemSupertip="MacroGetItemSuperTip"). Le code permet d'afficher les propriétés des
fichiers (Date de création, modification, taille en ko, dimensions en pixels ...etc...)
lorsque vous passez le curseur de la souris sur les images.
III-22. getText
La fonction getText s'applique aux contrôles comboBox, editBox.
Elle spécifie une donnée par défaut pour le contrôle.
Cet exemple affiche la valeur '1234' dans le contrôle 'editBox' dès l'activation
de l'onglet nommé 'OngletPerso'.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="OngletPerso" label="Test">
<group id="GR01" label="Exemple utilisation editBox">
<box id="Box01" boxStyle="horizontal">
<editBox id="editBox01"
label="Saisissez le code :"
onChange="RecupDonnee"
getText="MacroGetText" />
</box>
<button id="button01"
onAction="ValidationCode"
label="Validez le code"
imageMso="FileServerTasksMenu"
size="normal"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Option Explicit
Dim Cible As String
Sub MacroGetText(control As IRibbonControl, ByRef returnedVal)
Cible = 1234
returnedVal = Cible
End Sub
Sub RecupDonnee(control As IRibbonControl, text As String)
Cible = text
End Sub
Sub ValidationCode(control As IRibbonControl)
MsgBox Cible
End Sub
|
III-23. onChange
La fonction
onChange s'applique aux contrôles
comboBox, editBox.
Elle est déclenchée lorsqu'une modification est apportée dans la zone de saisie du contrôle et dès
que celui perd le focus. A noter que l'événement n'est pas activé si vous remplacez des caractères
à l'identique.
Consultez l'exemple proposé dans le chapitre
getText
(onChange="RecupDonnee").
III-24. getSelectedItemID
La fonction getSelectedItemID s'applique aux contrôles dropDown, gallery.
Elle définit un élément de la galerie (à partir de son identificateur unique 'ID') qui sera
sélectionné par défaut lors de l'ouverture.
Remarque :
Les fonctions getSelectedItemIndex et getSelectedItemID ne peuvent pas être utilisées
ensemble, pour un même contrôle. Lors de l'ouverture du classeur vous aurez un message
d'erreur :"Les attributs s'excluant mutuellement 'getSelectedItemID' et
'getSelectedItemIndex' sont spécifiés.
Ce code permet de définir l'item nommé 'lettre02' comme élément sélectionné par défaut, dans
le contrôle 'gallery'.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon startFromScratch="false">
<tabs>
<tab id="Tab01" label="Onglet perso" >
<group id="Groupe01" label="Essai">
<gallery id="Galerie01"
label="Test"
columns="3"
imageMso="InkHighlighter"
showImage="true"
showLabel="true"
getSelectedItemID="MacroSelItemID" >
<item id="lettre01" label="A" />
<item id="lettre02" label="B" />
<item id="lettre03" label="C" />
<item id="lettre04" label="D" />
<item id="lettre05" label="E" />
<item id="lettre06" label="F" />
</gallery>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Sub MacroSelItemID(control As IRibbonControl, ByRef returnedVal)
returnedVal = "lettre02"
End Sub
|
III-25. getSelectedItemIndex
La fonction
getSelectedItemIndex s'applique aux contrôles
dropDown, gallery.
Elle définit un élément de la galerie (à partir de son index) qui sera sélectionné
par défaut lors de l'ouverture.
Remarque :
Les fonctions getSelectedItemIndex et getSelectedItemID ne peuvent pas être utilisés
ensemble, pour un même contrôle. Lors de l'ouverture du classeur vous aurez un message
d'erreur :"Les attributs s'excluant mutuellement 'getSelectedItemID' et
'getSelectedItemIndex' sont spécifiés.
Consultez l'exemple proposé dans le chapitre
getItemImage
(getSelectedItemIndex="MacroSelItemIndex").
III-26. getContent
La fonction
getContent s'applique au contrôle
dynamicMenu.
Elle déclenche une procédure VBA qui va définir le code xml de
personnalisation à la volée, pour le contrôle dynamicMenu.
Le code suivant, placé dans le fichier xml, crée un menu dynamique qui liste les feuilles de
calcul et les feuilles
graphiques du classeur actif. Chaque type de feuille est regroupé dans un menu de
séparation (contrôle menuSeparator). L'élément sélectionné active la feuille
correspondante.
Dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="Ongletperso" label="Liste feuilles">
<group id="GR01" label="Test">
<dynamicMenu id="ListeDynamique"
label="Liste feuilles"
getContent="CreationMenuDynamique"
invalidateContentOnDrop="true"
size="normal"
imageMso="PrintTitles"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Ensuite, placez ces procédures dans un module standard du classeur.
| Vba |
Option Explicit
Public Sub CreationMenuDynamique(ctl As IRibbonControl, ByRef content)
content = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
content = content & ListeFeuilles(ActiveWorkbook)
content = content & ListeCharts(ActiveWorkbook)
content = content & "</menu>"
End Sub
Private Function ListeFeuilles(Wb As Workbook) As String
Dim strTemp As String
Dim Ws As Worksheet
strTemp = "<menuSeparator id=""Feuilles"" title=""Feuilles""/>"
For Each Ws In Wb.Worksheets
strTemp = strTemp & _
"<button " & _
CreationAttribut("id", "Bt" & Ws.Name) & " " & _
CreationAttribut("label", Ws.Name) & " " & _
CreationAttribut("tag", Ws.Name) & " " & _
CreationAttribut("onAction", "ActivationFeuille") & "/>"
Next
ListeFeuilles = strTemp
End Function
Private Function ListeCharts(Wb As Workbook) As String
Dim strTemp As String
Dim Ch As Chart
If Wb.Charts.Count = 0 Then Exit Function
strTemp = "<menuSeparator id=""charts"" title=""charts""/>"
For Each Ch In Wb.Charts
strTemp = strTemp & _
"<button " & _
CreationAttribut("id", "Bt" & Ch.Name) & " " & _
CreationAttribut("label", Ch.Name) & " " & _
CreationAttribut("tag", Ch.Name) & " " & _
CreationAttribut("onAction", "ActivationFeuille") & "/>"
Next
ListeCharts = strTemp
End Function
Function CreationAttribut(strAttribut As String, Donnee As String) As String
CreationAttribut = strAttribut & "=" & Chr(34) & Donnee & Chr(34)
End Function
Sub ActivationFeuille(control As IRibbonControl)
Sheets(control.Tag).Activate
End Sub
|
III-27. getItemHeight
La fonction
getItemHeight s'applique au contrôle
gallery.
Elle définit la hauteur (en pixels) de chaque élément qui va s'afficher dans la galerie.
Remarque :
Vous ne pouvez spécifier qu'une seulz dimension pour l'ensemble des éléments d'un
contrôle.
Consultez l'exemple proposé dans le chapitre
getItemImage
(getItemHeight="MacroGetItemHeight").
III-28. getItemWidth
La fonction
getItemWidth s'applique au contrôle
gallery.
Elle définit la largeur (en pixels) de chaque élément qui va s'afficher dans la galerie.
Remarque :
Vous ne pouvez spécifier qu'une seule dimension pour l'ensemble des éléments d'un
contrôle.
Consultez l'exemple proposé dans le chapitre
getItemImage
(getItemWidth="MacroGetItemWidth").
III-29. getTitle
La fonction
getTitle s'applique au contrôle
menuSeparator.
Elle définit un titre pour le contrôle.
L'exemple suivant insère une séparation entre le premier et le deuxième bouton dans un contrôle
menu. Le nom du classeur est récupéré dans la fonction d'appel 'getTitle' et apparaît
dans le titre du contrôle 'menuSeparator'.
Placez ce code dans le fichier xml de personnalisation :
| Xml |
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="TB01" label="Test">
<group id="GR01" label="Essais">
<menu id="Menu01" label="Test menuSeparator" itemSize="normal">
<button id="bouton01" imageMso="ShapeStylesGallery" label="Bouton 01" />
<menuSeparator id="Separator01"
getTitle="MacroTitreMenuSeparator" />
<button id="bouton02" imageMso="ShapeChangeShapeGallery" label="Bouton 02" />
<button id="bouton03" imageMso="SelectionPane" label="Bouton 03" />
<button id="bouton04" imageMso="ObjectsGroup" label="Bouton 04" />
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
|
Dans un module standard du classeur :
| Vba |
Sub MacroTitreMenuSeparator(control As IRibbonControl, ByRef returnedVal)
returnedVal = ThisWorkbook.Name
End Sub
|
IV. Liens
V. Remerciements
VI. Téléchargement


Les sources présentées sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance.
Par contre, la page de présentation constitue une
oeuvre intellectuelle protégée par les droits d'auteurs.
Copyright ©
2008
Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et
de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans
de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la
SACD.