Personnalisation des menus contextuels dans toutes les versions de Microsoft Excel

Résumé : Découvrez comme personnaliser des menus contextuels de la version Excel 97 jusqu’à la version Excel 2010.

Dernière modification : vendredi 24 avril 2015

S’applique à : Excel | Excel 2010 | Office 2007 | Office 2010 | SharePoint Server 2010 | VBA

Applies to:    Microsoft Excel 97 | Microsoft Excel 2000 | Microsoft Excel 2002 | Microsoft Excel 2003 | Microsoft Office Excel 2007 | Microsoft Excel 2010

Date de publication : novembre 2010

Sommaire

  • Vue d’ensemble des menus contextuels dans Microsoft Office

  • Vue d’ensemble des menus contextuels dans Excel

  • Personnalisation des menus contextuels dans Excel

  • Ajout de contrôles au menu contextuel de cellule à l’aide de code VBA

  • Ajout de contrôles au menu contextuel de cellule à l’aide de l’extensibilité du ruban

  • Ajout d’un menu dynamique au menu contextuel de cellule à l’aide du code VBA ou de l’extensibilité du ruban

  • Conseils et astuces relatifs au menu contextuel

  • Résumé

  • Ressources supplémentaires

Vue d’ensemble des menus contextuels dans Microsoft Office

Un menu contextuel est un menu qui s’affiche après une action de l’utilisateur, généralement après un clic droit. Dans Microsoft Office, un menu contextuel propose un ensemble limité de choix disponibles dans l’état actuel, ou le contexte, d’une application. Les choix disponibles sont généralement des actions associées à l’objet sélectionné, tel qu’une cellule ou une colonne.

Vue d’ensemble des menus contextuels dans Excel

Dans Microsoft Excel, le menu contextuel le plus couramment utilisé est le menu contextuel Cell. Il s’agit du menu qui s’affiche lorsque vous cliquez avec le bouton droit sur une cellule ou une sélection de cellules d’une feuille de calcul. Toutefois, vous pouvez personnaliser de nombreux autres menus contextuels. Par exemple, les menus contextuels Row et Column qui s’affichent lorsque vous cliquez avec le bouton droit sur les en-têtes de ligne ou de colonne. La figure 1 présente un menu contextuel Cell dans Microsoft Excel 2010.

Figure 1. Menu contextuel de cellule dans Excel 2010

Menu contextuel de cellule dans Excel 2010

Notes

La section NameX affichée au bas du menu est créée par le complément Microsoft qui sera présenté plus loin dans cet article.

Personnalisation des menus contextuels dans Excel

La seule façon de personnaliser des menus contextuels de la version Excel 97 jusqu’à la version Excel 2007 consiste à utiliser Microsoft Visual Basic pour Applications (VBA). Un exemple est indiqué plus loin dans l’article. Toutefois, dans Excel 2010, vous pouvez également modifier un menu contextuel à l’aide du même modèle d’extensibilité du ruban (RibbonX) qui vous permet de personnaliser les autres composants de l’interface utilisateur Microsoft Office Fluent pour inclure le ruban et le mode Backstage.

L’un des avantages de l’utilisation de RibbonX dans Excel 2010 concernant la personnalisation des menus contextuels est qu’il est possible d’ajouter des contrôles que vous ne pouvez pas ajouter à l’aide de VBA. La liste suivante présente les contrôles que vous pouvez ajouter à des menus contextuels.

  • bouton

  • case à cocher

  • contrôle

  • menu dynamique

  • galerie

  • menu

  • séparateur de menus

  • bouton partagé

  • bouton bascule

Toutefois, il est important de rappeler que vous pouvez uniquement utiliser RibbonX pour personnaliser les menus contextuels dans Excel 2010. Dans les autres versions d’Microsoft Excel, vous devez utiliser VBA et l’objet CommandBars.

Ajout de contrôles au menu contextuel de cellule à l’aide de code VBA

L’exemple suivant montre comment ajouter un bouton personnalisé, un bouton intégré (Enregistrer ) et un sous-menu dans la partie supérieure du menu contextuel Cell.

Notes

Il existe deux menus contextuels Cell dans Microsoft Excel. Le premier est le menu standard et le second est le menu affiché lorsque vous êtes en mode Aperçu des sauts de page. Ce mode vous permet de voir les données qui apparaissent sur chaque page et d’ajuster rapidement la zone d’impression ainsi que les sauts de page. Pour l’activer, cliquez sur Affichage, puis choisissez Aperçu des sauts de page. Si vous voulez modifier le deuxième type de menu, utilisez l’instruction suivante.

Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)

Ces informations s’appliquent également aux menus contextuels Row et Column.

Pour personnaliser le menu contextuel Cell, ajoutez un module général au projet VBA dans votre classeur. Ouvrez Visual Basic Editor en appuyant sur Alt+F11, cliquez sur Insérer , puis sur Module . Collez ou entrez les six sous-routines suivantes dans le module. La première macro ajoute les contrôles au menu contextuel Cell. La deuxième macro supprime les contrôles à partir du menu contextuel Cell. Des balises sont ajoutées aux contrôles, puis utilisées pour les supprimer. Les quatre autres macros s’exécutent lorsque vous cliquez sur le bouton ou sur l’une des trois options dans le sous-menu. Dans cet exemple, les quatre dernières macros modifient la casse du texte dans une cellule.

Sub AddToCellMenu()
    Dim ContextMenu As CommandBar
    Dim MySubMenu As CommandBarControl

    ' Delete the controls first to avoid duplicates.
    Call DeleteFromCellMenu

    ' Set ContextMenu to the Cell context menu.
    Set ContextMenu = Application.CommandBars("Cell")

    ' Add one built-in button(Save = 3) to the Cell context menu.
    ContextMenu.Controls.Add Type:=msoControlButton, ID:=3, before:=1

    ' Add one custom button to the Cell context menu.
    With ContextMenu.Controls.Add(Type:=msoControlButton, before:=2)
        .OnAction = "'" & ThisWorkbook.Name & "'!" & "ToggleCaseMacro"
        .FaceId = 59
        .Caption = "Toggle Case Upper/Lower/Proper"
        .Tag = "My_Cell_Control_Tag"
    End With

    ' Add a custom submenu with three buttons.
    Set MySubMenu = ContextMenu.Controls.Add(Type:=msoControlPopup, before:=3)

    With MySubMenu
        .Caption = "Case Menu"
        .Tag = "My_Cell_Control_Tag"

        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "UpperMacro"
            .FaceId = 100
            .Caption = "Upper Case"
        End With
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "LowerMacro"
            .FaceId = 91
            .Caption = "Lower Case"
        End With
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "ProperMacro"
            .FaceId = 95
            .Caption = "Proper Case"
        End With
    End With

    ' Add a separator to the Cell context menu.
    ContextMenu.Controls(4).BeginGroup = True
End Sub

Sub DeleteFromCellMenu()
    Dim ContextMenu As CommandBar
    Dim ctrl As CommandBarControl

    ' Set ContextMenu to the Cell context menu.
    Set ContextMenu = Application.CommandBars("Cell")

    ' Delete the custom controls with the Tag : My_Cell_Control_Tag.
    For Each ctrl In ContextMenu.Controls
        If ctrl.Tag = "My_Cell_Control_Tag" Then
            ctrl.Delete
        End If
    Next ctrl

    ' Delete the custom built-in Save button.
    On Error Resume Next
    ContextMenu.FindControl(ID:=3).Delete
    On Error GoTo 0
End Sub

Sub ToggleCaseMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        Select Case cell.Value
        Case UCase(cell.Value): cell.Value = LCase(cell.Value)
        Case LCase(cell.Value): cell.Value = StrConv(cell.Value, vbProperCase)
        Case Else: cell.Value = UCase(cell.Value)
        End Select
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Sub UpperMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        cell.Value = UCase(cell.Value)
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Sub LowerMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        cell.Value = LCase(cell.Value)
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Sub ProperMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        cell.Value = StrConv(cell.Value, vbProperCase)
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Copiez les deux procédures d’événement suivantes dans le module ThisWorkbook de votre classeur. Ces événements ajoutent automatiquement les contrôles au menu contextuel Cell lorsque vous ouvrez ou activez le classeur, et suppriment les contrôles lorsque vous fermez ou désactivez le classeur.

Private Sub Workbook_Activate()
    Call AddToCellMenu
End Sub

Private Sub Workbook_Deactivate()
    Call DeleteFromCellMenu
End Sub

Ensuite, enregistrez, fermez et rouvrez le classeur pour voir les modifications apportées au menu contextuel Cell. Le menu contextuel Cell doit à présent ressembler au menu présenté dans la figure 2.

Figure 2. Menu contextuel de cellule personnalisé

Menu contextuel de cellule personnalisé

Ajout de contrôles au menu contextuel de cellule à l’aide de l’extensibilité du ruban

Dans l’exemple suivant, vous allez créer les mêmes boutons et sous-menu que dans l’exemple décrit précédemment. Cette fois, vous allez utiliser RibbonX pour créer les contrôles dans Excel 2010. Cette option n’est pas disponible dans la version Excel 97 jusqu’à la version Excel 2007.

Notes

Pour plus d’informations sur l’utilisation de l’éditeur d’interface utilisateur personnalisée et l’utilisation de RibbonX pour personnaliser l’interface utilisateur Microsoft Office Fluent, voir le site web de Ron concernant le ruban.

L’identificateur du menu contextuel Cell en mode Aperçu des sauts de page dans Excel 2010 est différent de celui du menu contextuel Cell standard. Vous pouvez trouver cet identificateur et les ID des autres menus contextuels en utilisant le complément Microsoft décrit plus loin dans cet article.

Pour ajouter le code XML afin d’ajouter des contrôles au menu contextuel

  1. Ouvrez un nouveau classeur dans Excel 2010 et enregistrez-le en tant que classeur prenant en charge les macros (.xlsm).

  2. Fermez le classeur.

  3. Ouvrez le classeur dans l’éditeur d’interface utilisateur personnalisée (voir la remarque précédente pour plus d’informations), cliquez sur Insérer , puis choisissez Composant WebPart de l’interface utilisateur personnalisée Office 2010.

  4. Insérez le code XML suivant dans la fenêtre Composant WebPart de l’interface utilisateur personnalisée Office 2010.

    <customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui">
       <contextMenus>
          <contextMenu idMso="ContextMenuCell">
             <button idMso="FileSave" insertBeforeMso="Cut" />
             <button id="MyButton" label="Toggle Case Upper/Lower/Proper"
                 insertBeforeMso="Cut" 
                 onAction="ToggleCaseMacro" 
                 imageMso="HappyFace"/>
             <menu id="MySubMenu" label="Case Menu" insertBeforeMso="Cut"  >
                <button id="Menu1Button1" label="Upper Case" 
                   imageMso="U" onAction="UpperMacro"/>
                <button id="Menu1Button2" label="Lower Case" 
                   imageMso="L" onAction="LowerMacro"/>
                <button id="Menu1Button3" label="Proper Case" 
                   imageMso="P" onAction="ProperMacro"/>
             </menu>
            <menuSeparator id="MySeparator" insertBeforeMso="Cut" />
          </contextMenu>
       </contextMenus>
    </customUI>
    
  5. Enregistrez et fermez l’éditeur.

  6. Ouvrez le classeur dans Excel 2010.

  7. Copiez ou entrez les quatre macros suivantes dans Visual Basic Editor dans un module général et enregistrez le classeur.

    Sub ToggleCaseMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            Select Case cell.Value
            Case UCase(cell.Value): cell.Value = LCase(cell.Value)
            Case LCase(cell.Value): cell.Value = StrConv(cell.Value, vbProperCase)
            Case Else: cell.Value = UCase(cell.Value)
            End Select
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
    Sub UpperMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            cell.Value = UCase(cell.Value)
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
    Sub LowerMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            cell.Value = LCase(cell.Value)
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
    Sub ProperMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            cell.Value = StrConv(cell.Value, vbProperCase)
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
  8. Dans le classeur, si vous cliquez avec le bouton droit sur une cellule contenant du texte, vous pouvez constater que le menu contextuel Cell a été modifié.

  9. Sélectionnez les options de modification de la casse dans la partie supérieure du menu contextuel pour voir les modifications apportées au texte de la cellule.

Avertissement

Lorsque vous fermez le classeur, chaque contrôle que vous avez ajouté est supprimé du menu contextuel Cell. Toutefois, si vous ouvrez un autre classeur à partir du classeur actif, le bouton Enregistrer intégré précédemment et ajouté au menu contextuel Cell n’est pas supprimé. Ce problème survient lors de l’ajout de contrôles intégrés à un menu contextuel. Si ce problème vous dérange, vous pouvez insérer un bouton personnalisé, au lieu d’un contrôle intégré, qui appelle une macro exécutant la commande Enregistrer intégrée.

Pour ajouter un bouton personnalisé avec une commande intégrée, remplacez l’instruction <button idMso="FileSave" insertBeforeMso="Cut" /> par l’instruction suivante <button id="DuplicateBuiltInButton1" label="Save" insertBeforeMso="Cut" onAction="BuiltInSaveCommand" imageMso="FileSave"/>. Ensuite, dans Visual Basic Editor, ajoutez la macro suivante qui est appelée par l’attribut onAction.

Sub BuiltInSaveCommand(control As IRibbonControl)
    CommandBars.ExecuteMso "FileSave"
End Sub

En outre, vous pouvez également utiliser la méthode ActiveWorkbook.Save. Toutefois, si vous utilisez la méthode ExecuteMso, vous pouvez exécuter n’importe quel contrôle intégré dans l’interface utilisateur Microsoft Office Fluent.

Ajout d’un menu dynamique au menu contextuel de cellule à l’aide du code VBA ou de l’extensibilité du ruban

Les menus dynamiques pointent vers des procédures de rappel qui créent des menus au moment de l’exécution. Le contrôle dynamicMenu inclut l’attribut getContent qui pointe vers une procédure de rappel GetContent.

L’exemple suivant présente le code XML RibbonX qui permet de créer un menu dynamique dans le menu contextuel Cell.

<customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenu idMso="ContextMenuCell">
         <dynamicMenu id="MyDynamicMenu" 
            label= "My Dynamic Menu" imageMso="HappyFace" 
            getContent="GetContent" insertBeforeMso="Cut"/>
      </contextMenu>
   </contextMenus>
</customUI>

Par exemple, le code VBA suivant permet de créer un menu dynamique au moment de l’exécution à l’aide de deux boutons. Par conséquent, le menu n’est pas créé tant que l’utilisateur ne clique pas sur l’option de menu dans le menu contextuel.

Sub GetContent(control As IRibbonControl, ByRef returnedVal)
    Dim xml As String

    xml = "<menu xmlns=""https://schemas.microsoft.com/office/2009/07/customui"">" & _
          "<button id=""but1"" imageMso=""Help"" label=""Help"" onAction=""HelpMacro""/>" & _
          "<button id=""but2"" imageMso=""FindDialog"" label=""Find"" onAction=""FindMacro""/>" & _
          "</menu>"

    returnedVal = xml
End Sub

Sub HelpMacro(control As IRibbonControl)
    MsgBox "Help macro"
End Sub

Sub FindMacro(control As IRibbonControl)
    MsgBox "Find macro"
End Sub

Vous pouvez télécharger trois classeurs d’exemple qui ajoutent un menu dynamique au menu contextuel Cell en fonction du nom d’utilisateur, de la langue régionale utilisée dans Excel ou de la valeur de la cellule active (Formule, Vide, Numérique ou Texte). Vous pouvez trouver toutes les informations relatives à l’exemple dans le classeur approprié et télécharger les trois classeurs depuis le site web de Ron.

Conseils et astuces relatifs au menu contextuel

Cette section vous montre comment modifier le code présenté dans cet article afin de rendre vos procédures plus souples.

Dans l’exemple VBA au début de cet article, vous avez vu comment modifier le menu contextuel Cell à l’aide des événements Activate et Deactivate du classeur pour appeler une macro dans le but de créer et de supprimer les options de menu.

Vous pouvez modifier l’événement Activate dans l’exemple suivant pour créer différents menus pour divers utilisateurs. Ceci vous permettra de créer un menu doté de différents ensembles de contrôles personnalisés pour chaque utilisateur.

Private Sub Workbook_Activate()
    Dim sUserName As String
    sUserName = Application.UserName

    Select Case sUserName
    Case "Ron de Bruin": Call AddToCellMenu
    Case "Nancy Davolio": Call AddToCellMenu2
    Case Else: Call AddToCellMenu3
    End Select
End Sub

Un autre exemple consiste à vérifier la langue régionale utilisée dans Excel dans l’événement Activate afin de pouvoir créer des légendes dans le menu contextuel rédigées dans la langue de l’utilisateur. Dans l’exemple suivant, si un utilisateur néerlandais ou allemand ouvre le classeur, une autre macro est appelée en fonction du paramètre de langue régionale défini sur son ordinateur.

Private Sub Workbook_Activate()
    Dim LangID As Long
    LangID = Application.International(xlCountryCode)

    Select Case LangID
    Case 31: Call AddToCellMenuInDutch
    Case 49: Call AddToCellMenuinGerman
    Case Else: Call AddToCellMenu
    End Select
End Sub

Notes

Pour plus d’informations sur les problèmes d’ordre international dans Excel, voir la page web correspondante sur le site web de Ron de Bruin.

L’instruction VBA suivante vous montre comment activer et désactiver le contrôle de commentaire Insérer dans le menu contextuel Cell dans la version Excel 97 jusqu’à la version Excel 2010 : Application.CommandBars("Cell").FindControl(ID:=2031).Enabled = False.

Notes

Le complément décrit à la fin de cet article vous montre comment trouver l’ID de chaque contrôle dans un menu contextuel.

Vous pouvez également utiliser une macro semblable à la suivante afin d’ajouter l’ID à la légende. Souvenez-vous que le menu contextuel Cell n’est pas exactement identique dans chaque version d’Excel.

Sub Add_ID_To_ContextMenu_Caption()
' Add the Id to the caption of the context menu controls.
    Dim ctl As CommandBarControl
    For Each ctl In Application.CommandBars("Cell").Controls
        On Error Resume Next
        ctl.Caption = ctl.ID & " ::: " & ctl.Caption
        On Error GoTo 0
    Next ctl
End Sub

Sub Reset_ContextMenu()
' Remove the Id of the caption of the context menu controls.
    Dim ctl As CommandBarControl
    Dim myPos As Long
    For Each ctl In Application.CommandBars("Cell").Controls
        myPos = InStr(1, ctl.Caption, " ::: ", vbTextCompare)
        If myPos > 0 Then
            ctl.Caption = Mid(ctl.Caption, myPos + 4)
        End If
    Next ctl
End Sub

Sub Reset_ContextMenu_To_Factory_Defaults()
    Application.CommandBars("Cell").Reset
End Sub

Vous pouvez utiliser les événements Activate et Deactivate décrits précédemment pour activer et désactiver les contrôles.

Pour désactiver le contrôle Supprimer dans le menu contextuel Cell à l’aide de RibbonX, ajoutez l’instruction <button idMso="CellsDelete" enabled="false" /> au contrôle contextMenu dans le code XML présenté précédemment à la section Ajout de contrôles au menu contextuel de cellule à l’aide de l’extensibilité du ruban de cet article.

Comme vous pouvez le voir dans cette instruction, pour désactiver un contrôle dans un menu contextuel, vous devez connaître l’ID du contrôle (idMso). Toutefois, ceci peut poser problème dans la mesure où ces informations ne sont pas disponibles pour chaque contrôle dans un menu contextuel particulier. Par exemple, cela est vrai pour les menus contextuels Cell, Row et Column. Il ne semble pas y avoir de liste d’ID de contrôle pris en charge dans RibbonX. Vous pouvez utiliser une solution de contournement qui consiste à utiliser du code VBA pour désactiver un contrôle spécifique semblable à celui décrit dans la section précédente.

Alors, comment pouvez-vous trouver les noms des autres menus contextuels que vous souhaitez modifier ? La macro suivante permet d’ajouter un bouton avec le nom du menu au bas de chaque menu contextuel. Vous ne pouvez pas voir un nom sur chaque menu contextuel lors de son exécution dans Excel 2007 ou Excel 2010. Par exemple, vous ne verrez pas le nom du menu lorsque vous cliquez avec le bouton droit sur une forme ou une image dans Excel 2007 ou Excel 2010. Par conséquent, vous ne pouvez pas modifier ces menus dans Excel 2007 ou Excel 2010 à l’aide de VBA.

Sub Add_Name_To_Contextmenus()
    Dim Cbar As CommandBar
    For Each Cbar In Application.CommandBars
        With Cbar
            If .Type = msoBarTypePopup Then
                On Error Resume Next
                With .Controls.Add(Type:=msoControlButton)
                    .Caption = "Name for VBA = " & Cbar.Name
                    .Tag = "NameButtonInContextMenu"
                End With
                On Error GoTo 0
            End If
        End With
    Next
End Sub

Sub Delete_Name_From_Contextmenus()
    Dim Cbar As CommandBar
    Dim ctrl As CommandBarControl

    For Each Cbar In Application.CommandBars
        With Cbar
            If .Type = msoBarTypePopup Then
                For Each ctrl In .Controls
                    If ctrl.Tag = "NameButtonInContextMenu" Then
                        ctrl.Delete
                    End If
                Next ctrl
            End If
        End With
    Next
End Sub

Utilisez les liens suivants pointant vers des fichiers comportant les ID de contrôle et l’image de contrôle FaceIds de chaque contrôle dans presque chaque menu contextuel lorsque vous modifiez les menus contextuels à l’aide de VBA.

  • Utilisez le complément BtnFace de Jim Rech pour rechercher chaque image de contrôle FaceId sur la page web suivante.

  • Pour rechercher les ID de contrôle et les ID d’image de contrôle, consultez la page web suivante d’Ole P. Erlandsen.

  • Consultez la page web de John Walkenbach pour rechercher tous les ID d’image de contrôle.

Utilisez le lien suivant pour accéder à des fichiers contenant les valeurs du contrôle idMso ou les valeurs imageMso de chaque contrôle dans presque chaque menu contextuel lorsque vous modifiez les menus contextuels à l’aide de RibbonX.

http://www.rondebruin.nl/ribbon.htm#images

Utilisez le complément Microsoft COM pour rechercher le nom de chaque menu contextuel dans Microsoft Office 2010. Il ajoute un bouton à la fin des menus contextuels qui permet de rechercher le nom de la plupart d’entre eux.

Résumé

Cet article illustre les points suivants :

  • Dans Excel 97 jusqu’à Excel 2003, vous pouvez ajouter des contrôles à chaque menu contextuel à l’aide de code VBA (même si la procédure n’a pas été testée pour chaque scénario), mais vous ne pouvez pas modifier ces menus à l’aide de RibbonX.

  • Dans Excel 2007, vous pouvez ajouter des contrôles à presque tous les menus contextuels à l’aide de code VBA. Toutefois, vous ne pouvez pas modifier certains menus contextuels, tels que les menus Shapes et Picture à l’aide de VBA. De plus, vous ne pouvez pas les modifier à l’aide de RibbonX.

  • Dans Excel 2010, vous pouvez ajouter des contrôles à presque tous les menus contextuels à l’aide de code VBA. Les mêmes restrictions relatives à la modification de certains menus contextuels à l’aide de VBA dans Excel 2007 s’appliquent. En outre, vous pouvez ajouter des boutons et des menus à tous les menus contextuels à l’aide de RibbonX, mais si vous voulez désactiver ou redéfinir des contrôles, vous ne pourrez peut-être pas trouver les ID appropriés (idMso).

Ressources supplémentaires

Pour plus d’informations sur les sujets décrits dans cet article, cliquez sur les liens suivants :