为什么当我在 Word 中插入的表格内单击时,我的自定义右键单击菜单代码不起作用?VBA的

Why is my customized Right Click Menu code won't work when I click inside an inserted table in Word? VBA

提问人:D.P. OL' RACE 提问时间:7/22/2021 最后编辑:D.P. OL' RACE 更新时间:7/26/2021 访问量:628

问:

我有一个 Word VBA 模板,可以容纳旧版本和新版本。发布在下面容纳旧风格。新的是一个加载项,也可以正常工作。问题很简单,自定义菜单在插入的表格外部单击鼠标右键时起作用,但在其中单击鼠标右键时不起作用。PS:我实际上并不认为发布此代码真的是必要的,因为自定义菜单似乎在表格中不起作用。

Public Sub BuildCustomMenus2()
    On Error Resume Next
    With Application.CommandBars("Menu Bar")
        .Controls("rate1").Delete
    End With
    
    Dim aVal As Single
    aVal = ToDoubleFromString(Application.Version)
    

    If aVal < 12 Or Trim$(GetSetting("rate1", "Narrative Software", "NoWordRibbon")) = "Yes" Then
        If ThisDocument.Application.Windows.count > 0 Then SetN1Defaults
        
        Dim vCtrlCount As Integer
        Dim ctrlControl As CommandBarControl
    
        'delete any previously created custom toolbars and rebuild
        On Error Resume Next
        With Application.CommandBars("Menu Bar")
            .Controls("rate1").Delete
        End With
    
        vCtrlCount = CommandBars("Menu Bar").Controls.count
        vCtrlCount = vCtrlCount + 1
    
        With CommandBars("Menu Bar").Controls
            .Add(Type:=msoControlPopup, BEFORE:=vCtrlCount).Caption = "&rate1"
        End With
    
        'add more macros to options here...and create
        'sub...add to select case statement
        
        '1. Add the buttons
        '2. title caption
        '3. Display only the caption text
        '4. call procedure to pass button call
        Set ctrlControl = CommandBars("Menu Bar").Controls("rate1").Controls.Add(msoControlButton)
        ctrlControl.Caption = "Navigate"
        ctrlControl.Style = msoButtonIconAndCaption
        ctrlControl.OnAction = "RunDocMap"
        ctrlControl.FaceId = 1714
        
        
        Set ctrlControl = CommandBars("Menu Bar").Controls("rate1").Controls.Add(msoControlButton)
        ctrlControl.Caption = "Mark Active Edit"
        ctrlControl.Style = msoButtonIconAndCaption
        ctrlControl.OnAction = "MarkActiveEdit"
        ctrlControl.FaceId = 279
        
        Set ctrlControl = CommandBars("Menu Bar").Controls("rate1").Controls.Add(msoControlButton)
        ctrlControl.Caption = "Go to Active Edit"
        ctrlControl.Style = msoButtonIconAndCaption
        ctrlControl.OnAction = "GoToActiveEdit"
        ctrlControl.FaceId = 39    

结束副

VBA MS-Word

评论

0赞 Pᴇʜ 7/22/2021
全部删除,看看你得到什么错误。这些行隐藏所有错误消息,直到错误仍然发生。如果你看不到错误,你就无法修复它们,如果你不修复它们,你的代码就无法工作。删除它们!• 阅读 VBA 错误处理 – 完整指南可能会对您有所帮助。On Error Resume NextEnd Sub
0赞 D.P. OL' RACE 7/23/2021
代码很好。我明白你的意思。这与错误处理无关。对于发布此代码,我深表歉意。无论如何,我仍然遵循了您的建议,没有发生错误。我的问题很简单。尝试创建一个简单的代码,在右键单击弹出菜单中添加子菜单。当你看到它很好时,尝试在你的Word文档中插入一个表格,并在其中右键单击,看到所有自定义的右键单击菜单都不会显示。错误在这里不是问题。我在Excel中读到了一个与此类似的单元格问题,但也没有得到解答。
0赞 Timothy Rylatt 7/23/2021
您确实意识到上面的代码适用于 Word 2003 或更早版本,不是吗?
0赞 John Korchok 7/23/2021
CommandBars 在 14 年前就被弃用了,你很幸运你得到了任何结果。这是 Greg Maxeys 关于该主题的页面,可能会有一些帮助: gregmaxey.com/word_tip_pages/customize_shortcut_menu.html 考虑修改 RibbonUI XML,这是自定义上下文菜单的当前技术。
0赞 Timothy Rylatt 7/23/2021
@JohnKorchok - 仅当 Word 版本号小于 12(即 2003 或更早版本)时,代码才有效。它根本不适用于功能区版本。

答:

0赞 Eugene Astafiev 7/26/2021 #1

在 Microsoft Office 2010 之前,在 Microsoft Office Fluent 功能区用户界面 (UI) 中自定义上下文(右键单击)菜单的唯一方法是使用 CommandBars 解决方案。在 Office 2010 中,您可以自定义内置上下文菜单,就像自定义功能区 UI 的其他组件一样。此基于 XML 的上下文菜单扩展性模型基于熟悉的功能区扩展性模型。这意味着,您可以使用当前用于自定义功能区 UI 的相同 XML 标记和回调。

MS Office 2010 中已弃用命令栏。使用 Fluent UI(又名功能区 UI)在 Office 2010 及更高版本中自定义上下文菜单。有关详细信息,请参阅在 Office 2010 中自定义上下文菜单。例如:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenu idMso="ContextMenuText">
         <button idMso="FontDialog" visible="false" />
         <toggleButton id="MyToggle" label="My Toggle Button" />
         <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" />
         <menuSeparator id="MySeparator" />
         <menu id="MySubMenu" label="My Submenu" >
            <button id="MyButton2" label="Button on submenu" />
         </menu>
         <gallery id="galleryOne" label="My Gallery">
            <item id="item1" imageMso="HappyFace" />
            <item id="item2" imageMso="HappyFace" />
            <item id="item3" imageMso="HappyFace" />
            <item id="item4" imageMso="HappyFace" />
         </gallery>
         <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" />
      </contextMenu>
   </contextMenus>
</customUI>

如果表是嵌入的 OLE 对象(Excel 工作表),则在这种情况下,您需要在 Excel 中自定义上下文菜单。

评论

0赞 D.P. OL' RACE 7/26/2021
谢谢!不幸的是,我刚刚发现我们的加载项包含一个编译文件,其中的 XML 是。因此,这使我们可以选择模仿我们拥有的所有功能或尝试反编译它并进行必要的更改。谢谢。至少我们知道我们将从哪里开始。