2012-06-18 81 views
5

使用自定义用户界面XML文件在Access中添加多个自定义功能区选项卡时,选中的功能区选项卡在表单关闭时会变回第一个自定义选项卡。是否可以防止MS Access在使用自定义功能区时自动更改所选功能区选项卡?

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

问题可以很容易地证明:

  1. 打开数据库RibbonTest.accdb,
  2. 开关TAB2和打开窗体2使用色带上的按钮,并
  3. 关闭窗体2。

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

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

我们调查了一种解决方法,我们以编程方式存储选定的选项卡,并在我们认为需要时将其还原。但是,要做到这一点很困难。 (这里没有用于自动化功能区的Office API,但是this article helped。)

是否有其他人遇到此问题?你有没有找到一种方法来防止标签自动更改?

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

回答

3

潜在的解决方法

我的东西跨跌跌撞撞一直工作对我来说是隐藏使用可见的标签中的XML第一个标签。我没有做太多的测试,但我有隐藏的标准Home标签副本(不知道它是否需要填充选项卡)。在我看来,由于Access在关闭表单时实际上不能激活隐藏的选项卡,它仍然保留在当前选定的选项上。

我不知道这是不是在Access 2013中修复的,但是希望这些信息对于某个人来说不是太晚了。

+0

优秀 - 标记为答案而不是我的解决方法。 – Olly

1

似乎有一种方式来获得所选择的选项卡(如你所提到的,可能已经为代码,你可以找到here

在RibbonCode模块: 保存ribbonObject到模块-variable: 在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 
+0

谢谢形式!目前我们正在使用类似的东西,但是(通常情况下是变通办法)并不完美。例如,当功能区被最小化时,我们的解决方法会导致一些奇怪的行为。我很想知道是否有一种方法可以使Access独自离开功能区! – Olly

0

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

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

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

所以关于我这里唯一的建议是尝试和尽可能限制大多数形式到一个选项卡。另一个技巧是,虽然菜单中可能按“任务类型”分组,因此您可能会有一个菜单级联到一大堆报告。现在,随着对发票工作时,色带,那么你必须:

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

因此,所有上述选项是不同的东西,但组中的一个丝带让你得到一个完成任务。

因此,这里的想法是将功能区选项不是按照所有报告等选项进行分组,而是根据执行一项任务创建功能区,其中包括用户在给定时间对给定任务所需的选项。

如上所述,上述可能不是您的问题的解决方案,但避免额外的标签通常会解决很多这些问题。

+0

谢谢您的建议。我们没有调查你描述的Form.RibbonName属性,但可悲的是这不是我们的解决方案。我们不使用上下文功能区;我们只是拥有一个带有许多选项卡的大功能区,我们可以使用这些选项卡来访问我们项目中的表单。有趣的是,我们遇到的问题是在SP1中引入的,显然是因为添加了“修复”以使Form.RibbonName属性正常工作。 – Olly

1

这是一个错误!

MS支持已接受此错误提交,并对Office 2010 SP1发表评论:“已实施的更改允许我们使用选项卡的TCID跟踪每个数据库对象(表单,报告等)的活动选项卡,当你的对象之间移动的活动选项卡将被恢复。然而自定义选项卡都使用相同的TCID值,所以这种变化的自定义选项卡激活的标签会一直移动到第一个自定义选项卡。

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

解决办法

以下信息已被证明对我们有用的在创造一种变通方法。

  1. 请参阅Johanness上述关于IRibbonUI.ActivateTab方法的答案。这是在Office 2010中引入的。
  2. 没有用于获取当前选定选项卡的Office API(AFAIK)。因此我们使用来自this article的代码很有帮助。我们
    • 创建数组时,我们生成包含每个功能区选项卡的id值丝带,
    • 手柄Form_Deactivate,并用它在另一个隐蔽的形式来启动一个定时器,并存储所选选项卡的索引,
    • Timer_Tick处理程序中隐藏的形式,我们停止计时器,并期待其索引我们存储在Form_Deactivate标签的id值,
    • 激活使用IRibbonUI.ActivateTab的标签。
  3. This article显示了一个有趣的用途的IRibbonUI.InvalidategetVisible回调来选择一个特定的标签。
+0

感谢您花时间为可能的解决方法添加有用的信息。 –

4

这一行修复该问题:

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

只是让你的第一个选项卡中<tabs>。非常感谢Scott的潜在解决方法! (试图投票和/或评论,但只是注册了不够的声誉。)与其他复杂的解决方法相比,这节省了数小时(或数天)的工作量!谢谢!

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 

创建一个名为“zFrmRibbonSelect” MS Access中的窗体,并把所谓的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 

对于接近使用下面的代码INT形式

Private Sub Form_Close() 
'Select Correct Tab Menu Item 
    SendKeys "%Y" & eRibTabs.StockAndParts 
    SendKeys "{ESC}" 
    SendKeys "{ESC}" 
End Sub 
相关问题