为什么VBA代码对ACCESS的内置菜单、内置工具栏和功能区不起作用?

VSofHeSheShen 0 信誉分
2025-12-21T12:09:05.7+00:00

首先说明,通过手动操作ACCESS选项窗体,可以处理ACCESS所有菜单,而本提问是针对使用代码的疑问,请用VBA代码为我解惑。

再者,不知道ACCESS是否只有通过CommandBar才可以处理这类菜单/工具栏,如果有其它解决方式,请一并指教。

以下,先讲述一下我使用CommandBar的情况:

'可以创建窗体的快捷菜单,完全没有问题。

Dim CommandBar1 As Office.CommandBar

Set CommandBar1 = Application.CommandBars.Add(Name:="自定义名称", Position:=msoBarPopup, MenuBar:=False, Temporary:=True)

下述是需要解答的问题:

'问题一:执行下述语句并创建的多个工具栏,全部挤在菜单-加载项-一个命令栏内,设置RowIndex不同的属性值没有发生作用。该如何令每一个创建的自定义工具栏都有一个独立的命令栏?

Application.CommandBars.Add(Name:="自定义名称", Position:=msoBarTop, MenuBar:=False, Temporary:=True)

'问题二:怎样通过CommandBar引用ACCESS内置菜单或自定义的功能区,更改它们的属性。

For J = 1 To Application.CommandBars.Count Step 1

Debug.Print Application.CommandBars(J).Name      '没有显示“Menu Bar”

Next J

'再执行这段语句

With Application.CommandBars("Menu Bar")

For J = 1 To .Controls.Count Step 1

    Debug.Print .Controls(J).Caption

    If .Controls(J).Caption = "帮助(&H)" Then .Controls(J).Visible = False   '不报错,也不隐藏

Next J

.Visible = False        '此句则报错:此方法作用于CommandBar时失败

End With

''使用USysRibbons表的XML语句能够在ACCESS菜单栏添加自定义的多个菜单和多个命令栏,但依然无法通过前述方式引用它并修改属性,甚至上述循环语句都不能列出这种方式创建的对象。

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnRibbonLoad" loadImage="GetImage">

<ribbon startFromScratch="false">

<tabs>

  <tab idMso="TabCreate" visible="False"/>      '加入这句则创建不成功

  <tab id="Four" label="Four" visible="true">

    <group id="Group3" label="Group3">

      <button id="Test" label="测试" enabled="true" onAction="Test2"/>

    </group>

  </tab>

</tabs>

</ribbon>

</customUI>

程序过程极需要改变菜单上某些控件的状态令用户一目了然,若能解决,请告知我如何答谢你。

此外,我在自己的电脑以管理员身份安装系统和软件,难道是我的Microsoft 365的账号有权限问题而导致上述异常?

Microsoft 365 和 Office | Access | 家庭版 | Windows
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Dora-T 8,675 信誉分 Microsoft 外部员工 仲裁人
    2025-12-22T03:04:05.11+00:00

    注意:此回复为自动翻译,因此可能包含语法错误或不自然的表达。 

    您好 VSofHeSheShen

    感谢您联系 Microsoft Q&A 论坛。 

    根据您的描述,我理解您正在尝试使用 VBA 和 CommandBars 来隐藏“帮助”菜单并在 Access 中创建自定义工具栏,但未能如预期工作。 

    根据我的研究,您的 CommandBar 代码不起作用的原因是 Access 2007 及更高版本用功能区(Ribbon)界面替代了传统的 CommandBar 系统。CommandBars 现在仅在上下文菜单(弹出菜单)中可靠工作。当您尝试在窗口顶部创建自定义工具栏时,它们会自动归入“加载项”选项卡,而不是作为独立工具栏显示。 

    此外,传统的“菜单栏” CommandBar 已被功能区取代,这也是您的代码无法找到或修改它的原因。通过 USysRibbons 创建的功能区自定义使用基于 XML 的系统,与 CommandBars 集合分开运行,因此无法通过 CommandBar 方法访问或修改它们。 

    如果您希望隐藏“帮助”和“创建”选项卡,同时以编程方式控制功能区,可以考虑使用功能区 XML 自定义方法。 

    我在自己的环境中测试过,这种方法效果很好。您可以参考以下步骤: 

    1.创建 USysRibbons 表 

    -创建一个名为 USysRibbons 的表。 

    -添加两列:RibbonName(短文本)和 RibbonXML(长文本)。 

    -添加一行,RibbonName = “MyCustomRibbon”,并在 RibbonXML 中粘贴以下 XML: 

    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="OnRibbonLoad"> 
      <ribbon startFromScratch="true"> 
        <tabs> 
          <tab idMso="TabHomeAccess" visible="true"/> 
          <tab idMso="TabCreate" visible="false"/> 
          <tab idMso="TabExternalData" visible="true"/> 
          <tab idMso="TabDatabaseTools" visible="true"/> 
          <tab id="CustomTab" label="My Custom Tab"> 
            <group id="CustomGroup" label="My Commands"> 
              <button id="btn1" label="My Button" onAction="ButtonClick"/> 
            </group> 
          </tab> 
        </tabs> 
      </ribbon> 
    </customUI>
    

     注意:使用 startFromScratch="true" 会默认隐藏所有内置选项卡(包括“帮助”和“创建”)。然后您可以手动添加要保持可见的选项卡,并设置 visible="true"。请确保在 visible 属性中使用小写的 true 或 false,因为 XML 区分大小写,使用 True 或 False 可能会导致错误。 

    2:创建 VBA 模块 

    -按 Alt+F11 打开 VBA 编辑器。 

    -进入 工具 > 引用,勾选 Microsoft Office 16.0 Object Library。 

    -插入一个新模块并添加以下代码: 

    Option Compare Database 
    Option Explicit 
    Public MyRibbon As IRibbonUI 
    Sub OnRibbonLoad(ribbon As IRibbonUI) 
    Set MyRibbon = ribbon 
    End Sub 
    Sub ButtonClick(control As IRibbonControl) 
    MsgBox "Button clicked: " & control.ID 
    End Sub 
    Sub RefreshRibbon() 
    If Not MyRibbon Is Nothing Then 
    MyRibbon.Invalidate 
    End If 
    End Sub
    

    3:启用自定义功能区 

    -完全关闭数据库。 

    -重新打开并进入 文件 > 选项 > 当前数据库。 

    -在“功能区名称”中选择 MyCustomRibbon。 

    -点击 确定 并重新启动数据库。 

    重新打开后,您会看到“帮助”选项卡已隐藏,并且您拥有一个带有可动态修改控件的自定义选项卡,可以通过 VBA 调用 RefreshRibbon() 来刷新。 

    用户的图像

    请注意,上面的图片是英文版本。我们很抱歉无法提供中文版本。如有需要,请自行翻译。

    这种方法可以让您完全控制哪些选项卡可见,并允许您添加自定义功能。问题与您的 Microsoft 365 帐户权限无关,而是由于传统 CommandBar 系统与现代功能区界面之间的架构差异。 

    希望这对您有所帮助!如果您需要进一步的协助,或者我在您的问题中有任何误解,请随时纠正我并告诉我。 


     如果此答案对您有帮助,请点击“接受答案”,并友好地点赞。若您对此答案有其他问题,请点击“评论”。   

    注意:如果您希望收到此线程的相关电子邮件通知,请按照我们的文档中的步骤启用电子邮件通知功能 

    0 个注释 无注释

你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。