6

当自定义 UI XML 文件用于在 Access 中添加多个自定义功能区选项卡时,只要关闭表单,选定的功能区选项卡就会变回第一个自定义选项卡。

我们以编程方式从 VBA 加载自定义功能区。我创建了一个重现问题的 accdb。该文件夹还包括一个包含功能区定义的 XML 文件。它必须与 .accdb 文件位于同一目录中。

这个问题很容易证明:

  1. 打开数据库 RibbonTest.accdb,
  2. 切换到 Tab2 并使用功能区上的按钮打开 Form2,然后
  3. 关闭 Form2。

请注意,Tab1 现在处于活动状态。

当然,在这个小例子 db 中,这个问题似乎很小。但是,我们有一个非常大的项目,其中包含许多自定义选项卡,每个选项卡都包含许多组和按钮。我们的用户确实感到非常沮丧,因为他们每次关闭表单时都会在功能区上丢失自己的位置。

我们研究了一种解决方法,我们以编程方式存储选定的选项卡并在我们认为需要时恢复它。然而,事实证明很难可靠地做到这一点。(没有像这样自动化功能区的 Office API,但这篇文章有所帮助。)

有没有其他人遇到过这个问题?您是否找到了防止选项卡自动更改的方法?

编辑:似乎这个问题是在 Office 2010 SP1中实施的修复程序中引入的。(对不起,没有链接:不要认为我可以有两个以上。) RTM 版本中不存在该问题。SP1 的修复列表包括:“当用户返回到该对象时,Access 不会激活或返回用户到先前打开的数据库对象的正确功能区选项卡。” 似乎他们已尝试修复 Form.RibbonName 属性(支持上下文功能区)的使用,但在此过程中破坏了默认功能区。

4

6 回答 6

6

这一行解决了这个问题:

<tab id="tabBogus" label="Bogus" visible="false"></tab>

只需将其设为<tabs>. 非常感谢斯科特的潜在解决方法答案!(试图投票和/或评论,但只是注册所以没有足够的声誉。)与其他复杂的解决方法相比,这节省了数小时(或数天)的工作!谢谢!

于 2013-09-20T03:18:30.523 回答
4

潜在的解决方法

我偶然发现对我有用的是使用可见标记隐藏 XML 中的第一个选项卡。我没有对其进行太多测试,但我有一个隐藏的标准主页选项卡的副本(不知道它是否需要成为填充选项卡)。在我看来,由于 Access 在您关闭表单时实际上无法激活隐藏选项卡,因此它仍保留在当前选定的选项卡上。

我不知道这是否已在 Access 2013 中修复,但希望这些信息对某人有用还为时不晚。

于 2013-08-19T21:33:18.380 回答
2

这是一个错误!

MS 支持已为此接受了一个错误提交,并评论了 Office 2010 SP1,“实施的更改允许我们使用选项卡的 TCID 跟踪每个数据库对象(表单、报告等)的活动选项卡,以便在您移动在对象之间恢复活动选项卡。但是自定义选项卡都使用相同的 TCID 值,因此通过此更改,自定义选项卡的活动选项卡将始终移动到第一个自定义选项卡。 "

我们希望他们将来会发布一个修补程序来解决这个问题。

解决方法

以下信息已证明对我们创建解决方法很有用。

  1. 请参阅上面 Johanness 关于IRibbonUI.ActivateTab方法的答案。这是在 Office 2010 中引入的。
  2. 没有用于获取当前选定选项卡的 Office API (AFAIK)。因此,我们使用本文中的代码很有帮助。我们
    • 当我们生成包含id每个功能区选项卡值的功能区时创建一个数组,
    • 处理Form_Deactivate并使用它以另一种隐藏形式启动计时器,并存储所选选项卡的索引,
    • Timer_Tick隐藏形式的处理程序中,我们禁用计时器并查找id我们存储索引的选项卡的值Form_Deactivate,并且
    • 使用IRibbonUI.ActivateTab激活选项卡。
  3. 本文展示了一个有趣的IRibbonUI.Invalidate用法和getVisible选择特定选项卡的回调。
于 2012-06-21T14:33:13.317 回答
1

在与您的功能区选项卡编号相对应的通用代码模块中创建一个枚举器变量 (ALT+Y)

' Used By Send Keys to Select Correct Ribbon Tab.
Enum eRibTabs
    DataEntry = 1
    Reporting = 2
    StockAndParts = 3
    AdminFinance = 4
    DataImport = 5
    OtherAdmin = 6
    Admin = 7
    LocalSystem = 8
End Enum

在 ms Access 中创建一个名为“zFrmRibbonSelect”的表单,并放置一个名为 txtTabValue 的未绑定文本框,然后将以下代码放入您的新表单中。(建议将表单模式设置为隐藏。

Private Sub Form_Current()
' Select Correct Tab Menu Item
Me.txtTabValue = Me.OpenArgs

End Sub

Private Sub Form_Close()
'Select Correct Tab Menu Item
Dim varTab As Variant

varTab = Me.txtTabValue

SendKeys "%Y" & varTab
SendKeys "{ESC}"
SendKeys "{ESC}"

End Sub

Private Sub Form_Timer()
DoCmd.Close acForm, Me.Name, acSaveNo
End Sub

将表单计时器间隔设置为 500,并检查属性框中计时器显示的事件等。

在您的报告中输入以下代码:(使用您想要的枚举器值。)

Private Sub Report_Close()
'Select Correct Tab Menu Item
 DoCmd.OpenForm "zFrmRibbonSelect", , , , , acHidden, eRibTabs.StockAndParts
End Sub

对于关闭的表单,请在表单中使用以下代码

Private Sub Form_Close()
'Select Correct Tab Menu Item
    SendKeys "%Y" & eRibTabs.StockAndParts
    SendKeys "{ESC}"
    SendKeys "{ESC}"
End Sub
于 2014-04-07T21:00:30.013 回答
1

似乎有一种方法可以获取选定的选项卡(正如您所提到的,并且可能已经有了代码,并且您可以在此处找到)

在 RibbonCode 模块中:将ribbonObject 保存到模块变量中:在 xml 中更改第一行:

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

并添加:

Private MyRibbon as IRibbonUI
Private ActiveRibbonTab as string

Sub OnRibbonLoad(ribbon As IRibbonUI)
  Set MyRibbon = ribbon
End Sub

Sub RememberRibbonTab
  ActiveRibbonTab=<Do the IAccessibleMagic here>   
End

Sub RecallActiveTab
  If ActiveRibbonTab<>"" then MyRibbon.ActivateTab(ActiveRibbonTab)
  ActiveRibbonTab=""
End

现在在每种形式中添加

Private Sub Form_Close()
  Remember_RibbonTab
End Sub

Private Sub Form_GotFocus()
  RecallActiveTab
End Sub
于 2012-06-19T10:05:32.463 回答
0

实际上,一种行之有效的方法是减少或消除您打开的表单中的选项卡。如果您指定功能区(属性表中的其他选项卡),那么当您在表单之间切换时,功能区显示的切换会自动且无需代码。

现在虽然这并不是真正解决您的问题的方法,但这里的想法和概念是,如果您必须开始编写一堆代码来参与并切换到哪个选项卡,那么正如您所指出的那样,这真的变得很困难。

如 Access/office 2010 所述,您可以使用代码设置活动选项卡(此功能在 Access/office 2007 中不可用)。

因此,我在这里的唯一建议是尽可能尝试将大多数表单限制为一个选项卡。另一个提示是,虽然在菜单中可能按“任务类型”分组,因此您可能有一个级联到一大堆报告的菜单。现在在处理发票时使用功能区,那么您有:

Create invoice
Balance invoice
Post invoice
Print invoice (a report).

因此,上述所有选项都是不同的东西,但都集中在一个功能区中,让您可以完成一项工作。

因此,这里的想法是不按选项类型(例如所有报告)对功能区选项进行分组,而是根据执行一项任务(包括用户在给定时间对给定任务所需的选项)进行分组 + 创建功能区。

如前所述,以上可能无法解决您的问题,但通常避免使用其他选项卡可以解决很多此类问题。

于 2012-06-19T20:44:33.140 回答