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 :
<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'activation ou de désactivation. -->
<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 :
Option
Explicit
Public
objRuban As
IRibbonUI
Public
boolResult As
Boolean
'Callback for customUI.onLoad
'Est déclenché lors du chargement du ruban personnalisé.
Sub
RubanCharge
(
ribbon As
IRibbonUI)
boolResult =
False
Set
objRuban =
ribbon
End
Sub
'Callback for Bouton1 onAction
'La procédure déclenchée lorsque vous cliquez sur le bouton.
Sub
ProcLancement
(
control As
IRibbonControl)
MsgBox
"ma procédure."
End
Sub
'Callback for Bouton1 getEnabled
'Active ou désactive le bouton en fonction de la variable boolResult
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):
Option
Explicit
'Evenement Change dans la feuille de calcul.
Private
Sub
Worksheet_Change
(
ByVal
Target As
Range)
'Vérifie si la cellule A1 est modifiée et si la cellule contient la valeur 1.
If
Target.Address
=
"$A$1"
And
Target =
1
Then
boolResult =
True
Else
boolResult =
False
End
If
'Rafraichit le bouton personnalisé
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 :
<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 :
'Callback for customUI.loadImage
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 :
<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'activation ou de désactivation. -->
<button
id
=
"Bouton1"
label
=
"Lancement"
onAction
=
"ProcLancement"
size
=
"normal"
imageMso
=
"Repeat"
getEnabled
=
"Bouton1_Enabled"
/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Dans un module standard :
Option
Explicit
Public
MonRuban As
IRibbonUI
Public
boolResult As
Boolean
'Callback for customUI.onLoad
'Est déclenché lors du chargement du ruban personnalisé.
Sub
RubanCharge
(
ribbon As
IRibbonUI)
boolResult =
False
Set
MonRuban =
ribbon
End
Sub
'Callback for Bouton1 onAction
'La procédure déclenchée lorsque vous cliquez sur le bouton.
Sub
ProcLancement
(
control As
IRibbonControl)
MsgBox
"ma procédure."
End
Sub
'Callback for Bouton1 getEnabled
'Active ou désactive le bouton en fonction de la variable boolResult
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):
'Evenement Change dans la feuille de calcul.
Private
Sub
Worksheet_Change
(
ByVal
Target As
Range)
'Vérifie si la cellule A1 est modifiée et si la cellule contient la valeur 1.
If
Target.Address
=
"$A$1"
Then
_
boolResult =
Target =
1
'Rafraichit le bouton personnalisé
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 :
<customUI
xmlns
=
"http://schemas.microsoft.com/office/2006/01/customui"
>
<commands>
<command
idMso
=
"Copy"
getEnabled
=
"macroGetEnabled"
/>
</commands>
</customUI>
Dans un module standard du classeur :
'Callback for Copy getEnabled
Sub
macroGetEnabled
(
control As
IRibbonControl, ByRef
returnedVal)
'Désactive la commande si le classeur est ouvert en lecture seule.
returnedVal =
Not
ThisWorkbook.ReadOnly
'Nota:
'Le raccourci clavier (Ctrl+C) n'est pas désactivé.
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 :
<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 :
Option
Explicit
Private
Sub
Workbook_Open
(
)
boolResult =
False
End
Sub
Dans un module standard du classeur :
Option
Explicit
Public
boolResult As
Boolean
Public
objRuban As
IRibbonUI
'Callback for customUI.onLoad
'Est déclenché lors du chargement du ruban personnalisé.
Sub
RubanCharge
(
ribbon As
IRibbonUI)
Set
objRuban =
ribbon
End
Sub
'Callback for ToggleButton01 onAction
'Récupère la valeur du bouton bascule puis désactive ou réinitialise la commande
'prédéfinie 'Recherche'
Sub
ModifStatutBoutonRecherche
(
control As
IRibbonControl, pressed As
Boolean
)
boolResult =
pressed
objRuban.Invalidate
End
Sub
'Callback for FindDialogExcel onAction
'Réattribue temporairement la commande 'Recherche' ou la réinitialise
'en fonction de la valeur de la variable boolResult (utilisation du tooggleButton)
Sub
MaRecherchePerso
(
control As
IRibbonControl, ByRef
cancelDefault)
If
boolResult Then
MsgBox
"Le bouton 'Recherche' est temporairement désactivé"
'Vous pouvez éventuellement ajouter vos procédures de
'recherche personnelles.
'
cancelDefault =
True
Else
cancelDefault =
False
End
If
End
Sub
'Callback for ToggleButton01 getLabel
'Attribue une étiquette au bouton bascule en fonction de sa position
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 :
<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:
'Callback for Copy getVisible
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é :
<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 :
Option
Explicit
'Callback for bouton01 getKeytip
'Définit le raccourci clavier qui va être associé au bouton.
Sub
DefinitRaccourci
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
"XL"
End
Sub
'Callback for bouton01 onAction
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 :
<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>
Dans le module objet "ThisWorkbook" du classeur :
Option
Explicit
'Définit les caractère utilisables pour la saisie du mot de passe
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 :
Option
Explicit
Option
Base 1
Public
Cible As
String
Public
MonRuban As
IRibbonUI
Public
Tableau As
Variant
'Callback for customUI.onLoad
'Définit l'objet ruban
Sub
objRuban
(
ribbon As
IRibbonUI)
Set
MonRuban =
ribbon
End
Sub
'Callback for gallery01 getItemCount
'Définit le nombre d'élément dans la galerie
Sub
NbCaracteres
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
UBound
(
Tableau) +
1
End
Sub
'Callback for gallery01 getItemLabel
'Création des éléments dans la galerie
Sub
LabelCaractere
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
returnedVal =
Tableau
(
index)
End
Sub
'Callback for gallery01 onAction
'Met à jour le label après avoir sélectionné un caractère dans la galerie
Sub
SelectCaractere
(
control As
IRibbonControl, id As
String
, index As
Integer
)
Cible =
Cible &
Tableau
(
index)
MonRuban.InvalidateControl
"LC01"
End
Sub
'Callback for LC01 getLabel
'Affiche des asteriques dans le label en lieu et place des caractères
Sub
ContenuLabel
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
Application.WorksheetFunction.Rept
(
"*"
, Len
(
Cible))
End
Sub
'Callback for Bt01 onAction
'Validaton du mot de passe
Sub
ValidationMdP
(
control As
IRibbonControl)
MsgBox
"Confirmation du mot de passe : ("
&
Cible &
")"
Cible =
""
MonRuban.InvalidateControl
"LC01"
End
Sub
'Callback for Bt02 onAction
'réinitialisation: Efface le contenu du label en cas d'erreur
'de saisie.
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 :
<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 :
'Callback for button01 getImage
Sub
MacroChargementImage
(
control As
IRibbonControl, ByRef
returnedVal)
Set
returnedVal =
LoadPicture
(
"C:\dossier\"
&
control.Tag
)
End
Sub
A noter que la fonction d'appel getImage ne fonctionne pas pour les images personnelles stockées
directement dans le classeur (_rels\customUI\images\NomFichier.png).
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 :
<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 :
'Callback for bouton01 getScreentip
Sub
AideBouton
(
control As
IRibbonControl, ByRef
returnedVal)
'L'infobulle est stockée dans la colonne A de la Feuil2
'l'attribut Tag permet de définir la ligne correspondante
returnedVal =
Worksheets
(
"Feuil2"
).Cells
(
CDec
(
control.Tag
), 1
)
End
Sub
'Callback for bouton01 getSupertip
Sub
AideComplementaire
(
control As
IRibbonControl, ByRef
returnedVal)
'L'infobulle est stockée dans la colonne A de la Feuil2
returnedVal =
Worksheets
(
"Feuil2"
).Cells
(
CDec
(
control.Tag
), 2
)
End
Sub
'Callback for bouton01 onAction
'Macro associée aux boutons
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.
<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 :
'Callback for bouton01 getDescription
'Une description est associée à chaque bouton
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
'Callback for bouton01 onAction
Sub
MacroVerif
(
control As
IRibbonControl)
End
Sub
'Callback for bouton02 onAction
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 :
<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 :
'Callback for bouton01 getSize
'Attribue une taille aux boutons
Sub
MacroGetSize
(
control As
IRibbonControl, ByRef
returnedVal)
Select
Case
control.id
'Attribue la taille 'large' au premier bouton
Case
"bouton01"
: returnedVal =
1
'Attribue la taille 'normal' au deuxième bouton
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.
<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 :
Option
Explicit
'Callback for CheckBox1 getPressed
'Définit le statut de la case à cocher
Sub
MacroGetPressed
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
True
End
Sub
'Callback for CheckBox1 onAction
'Renvoie la valeur de la case à cocher lorsque vous cliquez dessus
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'.
<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 :
Option
Explicit
'Callback for DropDown01 getItemCount
'Définit le nombre d'éléments dans le menu déroulant
Sub
MacroGetItemCount
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
5
End
Sub
'Callback for DropDown01 getItemID
'Attribue un id à chaque élément
Sub
MacroGetItemID
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
returnedVal =
"strID"
&
index +
1
End
Sub
'Callback for DropDown01 getItemLabel
'Attribue un label à chaque élément
Sub
MacroGetItemLabel
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
returnedVal =
"LeLabel "
&
index +
1
End
Sub
'Callback for DropDown01 onAction
'Est déclenché lorsque vous sélectionné un élément dans le menu déroulant
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 :
<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 :
Option
Explicit
Option
Compare Text
Dim
x As
Integer
Private
Sub
Workbook_Open
(
)
Const
Cible =
&
H27 'définit le répertoire "Mes images"
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)
'Récupére le chemin du répertoire Windows "Mes images"
Chemin =
objFolder.Self.Path
'boucle sur tous les fichiers du repertoire
For
Each
strFileName In
objFolder.Items
'pour extraire uniquement les images type .jpg
If
strFileName.IsFolder
=
False
And
Right
(
strFileName, 4
) =
".jpg"
Then
x =
x +
1
ReDim
Preserve
Tableau
(
1
To
2
, 1
To
x)
'Enregistre le nom du fichier dans la premiere dimension du tableau
Tableau
(
1
, x) =
strFileName
Resultat =
""
'Boucle sur les propriétés de chaque fichier:
'ces informations seront affichées dans les info-bulles des éléments de
'la galerie.
For
i =
0
To
34
If
objFolder.GetDetailsOf
(
strFileName, i) <>
""
Then
_
Resultat =
Resultat &
objFolder.GetDetailsOf
(
strFileName, i) &
vbLf
Next
'Enregistre les propriétés dans la deuxième dimension du tableau
Tableau
(
2
, x) =
Resultat
End
If
Next
End
Sub
Dans un module standard du classeur :
Option
Explicit
Public
Chemin As
String
Public
Tableau
(
) As
String
'Callback for Galerie01 onAction
'définit la procédure déclenchée lorsque vous
'cliquez sur un élément de la galerie.
Sub
ActionElementGalerie
(
control As
IRibbonControl, id As
String
, index As
Integer
)
MsgBox
"Vous avez cliqué sur l'image '"
&
Tableau
(
1
, index +
1
) &
"'"
End
Sub
'Callback for Galerie01 getShowImage
'Définit si l'image de la galerie doit être affichée
Sub
MacroShowImage
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
True
End
Sub
'Callback for Galerie01 getShowLabel
'Définit si le label de la galerie doit être affichée
Sub
MacroShowLabel
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
True
End
Sub
'Callback for Galerie01 getItemCount
'Définit le nombre d'éléments de la galerie
'(la taille maxi du tableau = nombre de fichiers .jpg)
Sub
MacroGetItemCount
(
control As
IRibbonControl, ByRef
returnedVal)
'La variable VarTab doit impérativement être de type Variant.
Dim
VarTab As
Variant
On
Error
Resume
Next
'VarTab va prendre la valeur Empty si le tableau est vide.
VarTab =
UBound
(
Tableau)
On
Error
GoTo
0
If
IsEmpty
(
VarTab) Then
returnedVal =
0
Else
returnedVal =
UBound
(
Tableau, 2
)
End
If
End
Sub
'Callback for Galerie01 getItemImage
'Charge les images pour chaque élément de la galerie
Sub
MacroGetItemImage
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
Set
returnedVal =
LoadPicture
(
Chemin &
"\"
&
Tableau
(
1
, index +
1
))
End
Sub
'Callback for Galerie01 getItemLabel
Sub
MacroGetItemLabel
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
returnedVal =
Tableau
(
1
, index +
1
)
End
Sub
'Callback for Galerie01 getItemScreenTip
Sub
MacroGetItemScreenTip
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
returnedVal =
"Propriétés de '"
&
Tableau
(
1
, index +
1
) &
"'"
End
Sub
'Callback for Galerie01 getItemSuperTip
'Ajoute des informations sur les propriétés de l'image dans chaque infobulle
Sub
MacroGetItemSuperTip
(
control As
IRibbonControl, index As
Integer
, ByRef
returnedVal)
returnedVal =
Tableau
(
2
, index +
1
)
End
Sub
'Callback for Galerie01 getItemHeight
'Définit la hauteur de l'image qui va s'afficher dans la galerie
Sub
MacroGetItemHeight
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
50
End
Sub
'Callback for Galerie01 getItemWidth
'Définit la largeur de l'image qui va s'afficher dans la galerie
Sub
MacroGetItemWidth
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
50
End
Sub
'Callback for Galerie01 getSelectedItemIndex
'Permet de définir un élément de la galerie (à partir de son index) qui sera sélectionné
'par défaut lors de l'ouverture.
Sub
MacroSelItemIndex
(
control As
IRibbonControl, ByRef
returnedVal)
'0 = le premier élément de la galerie
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 :
<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 :
Option
Explicit
Dim
Cible As
String
'Callback for editBox01 getText
'Spécifie une donnée par défaut pour le contrôle editBox
Sub
MacroGetText
(
control As
IRibbonControl, ByRef
returnedVal)
Cible =
1234
returnedVal =
Cible
End
Sub
'Callback for editBox01 onChange
'Récupère le contenu du contrôle editBox dans la variable 'Cible'
Sub
RecupDonnee
(
control As
IRibbonControl, text As
String
)
Cible =
text
End
Sub
'Callback for button01 onAction
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 :
<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 :
'Callback for Galerie01 getSelectedItemID
'Permet de définir un élément de la galerie (à partir de son identificateur unique 'id')
'qui sera sélectionné par défaut lors de l'ouverture.
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 :
<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.
Option
Explicit
'Callback for ListeDynamique getContent
'Procédure pour construire le menu dynamique
Public
Sub
CreationMenuDynamique
(
ctl As
IRibbonControl, ByRef
content)
'ouverture de la balise menu
content =
"<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
'liste les feuilles de calcul du classeur actif
content =
content &
ListeFeuilles
(
ActiveWorkbook)
'liste les feuilles graphiques du classeur actif
content =
content &
ListeCharts
(
ActiveWorkbook)
'fermeture de la balise
content =
content &
"</menu>"
End
Sub
Private
Function
ListeFeuilles
(
Wb As
Workbook) As
String
Dim
strTemp As
String
Dim
Ws As
Worksheet
' Insertion d'un titre de menu
strTemp =
"<menuSeparator id=""Feuilles"" title=""Feuilles""/>"
' ajoute un bouton dans le menu pour chaque feuille du classeur
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
'Liste les feuilles graphiques contenues dans le classeur
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
'Active la feuille sélectionnée lorsque vous cliquez sur un nom
'dans le menu.
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 :
<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 :
'Callback for Separator01 getTitle
'indique le titre du menu séparateur
Sub
MacroTitreMenuSeparator
(
control As
IRibbonControl, ByRef
returnedVal)
returnedVal =
ThisWorkbook.Name
End
Sub
IV. Liens▲
Création de rubans personnalisés sous Microsoft Access 2007 ,
par Christophe Warin.
Customizing the 2007 Office Fluent Ribbon for Developers
Custom UI Editor Tool
La FAQ Access
La FAQ Excel
Le XML dans Microsoft Office (OpenXML),
par Olivier Lebeau.
2007 Office System Document: Lists of Control IDs
La personnalisation du ruban sous Excel 2007
V. Remerciements▲
Je remercie toute l'équipe Office de DVP et particulièrement
Olivier Lebeau,
Argyronet,
Ouskelnor,
pour la relecture et la correction du tutoriel.
VI. Téléchargement▲