【问题标题】:Excel-2010 - CustomUI - Backstage : Errors when various files are opened in the same instanceExcel-2010 - CustomUI - Backstage:在同一实例中打开各种文件时出错
【发布时间】:2015-02-25 03:34:21
【问题描述】:

首先,我很高兴加入社区。我希望我们能经常交换意见。我是法国人,请原谅我在句子中的错误。

我试着解释我的问题:

我有一个“好”的想法,即使用我的 Excel 文件的 Backstage 创建一个小型仪表板。效果很好。

当此文件在同一个 Excel 实例中与另一个文件同时打开时,会出现问题。第二个文件试图访问我的工作簿的函数“Backstage_OnShow”和“Backstage_OnHide”,所以我有一条消息“无法运行宏'Backstage_OnShow'(或'Backstage_OnHide')。宏可能在此不可用工作簿...” 这是对法语错误消息的翻译。

如何才能不显示此消息,或者确保后台特定于我的文件而不是 Excel 实例?

我用我的代码 sn-ps 显示。会更清楚。

在我的 XML 中,我有这个:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad ="Ribbon_Load">
  <ribbon startFromScratch="false"/>
  <backstage onShow="Backstage_onShow" onHide="Backstage_onHide">
...
  </backstage>
</customUI>

在我的 Excel 文件中,我有这个:

Public Sub Ribbon_Load(ribbon As IRibbonUI)

  Set Ruban = ribbon

End Sub

Public Sub Backstage_onShow(ByVal contextObject As Object)

    'Rafraichissement du ruban
    Ruban.Invalidate

End Sub

Public Sub Backstage_onHide(ByVal contextObject As Object)



End Sub

所有这些都包含在 Excel 文件中,这是正常的。 在 Excel 2010 中,Excel 文件默认在同一个实例中打开,这并不困扰我,但是,当一个“普通”文件与我自定义的后台文件在同一个实例中打开时,普通文件会尝试,我不知道什么奇迹,访问功能 Backstage_onShow Backstage_onHide 并在我显示其后台时立即访问。然而,这个文件甚至不应该知道这些函数的存在,因为他们没有报告给他。

提前谢谢你。

此致,

帕特里斯。

PS:如果你想显示我的文件,这是link。当然是安全的代码 sn-ps!

【问题讨论】:

  • @mehow 听起来他想要自定义 UI XML 仅适用于仪表板文件,而不适用于在同一 Excel.Application 实例中打开多个工作簿时的其他文件。跨度>

标签: vba excel ribbonx


【解决方案1】:

@David,我有一个解决方案!!!!

感谢您花时间回答我!!!

我试着向你解释。

所以,如果我们想一想,我们会注意到问题是我们需要一个指定的地方来存储我们的代码 sn-ps。这个地方在 XLSTART !!!如果我们使用 PERSONAL.XLSB 来存储它:

Public Sub Ribbon_Load(ribbon As IRibbonUI)

  Set Ruban = ribbon

End Sub

Public Sub Backstage_onShow(ByVal contextObject As Object)

    'Rafraichissement du ruban
    Ruban.Invalidate

End Sub

Public Sub Backstage_onHide(ByVal contextObject As Object)

    'ErreurSaisieTaux = 0

End Sub

之后,我们可以像这样修改customui.xml:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad ="PERSONAL.XLSB!Ribbon_Load">
  <ribbon startFromScratch="false"/>
  <backstage onShow="PERSONAL.XLSB!Backstage_onShow" onHide="PERSONAL.XLSB!Backstage_onHide">
...
  </backstage>
</customUI>

我试过了,效果很好。

你觉得这个想法怎么样?您看到这种方法的缺点了吗?

帕特里斯。

【讨论】:

    【解决方案2】:

    Backstage 是Application 的一部分,您已指定应为onShowonHide 事件调用某些宏。

    Excel 将始终假定应在 ActiveWorkbook 的范围内找到不合格的宏,例如 Backstage_onShow。当ActiveWorkbook 中不存在此宏时,将引发错误。

    要解决此问题,请修改 XML 以使宏调用符合特定工作簿:

    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad ="Ribbon_Load">
      <ribbon startFromScratch="false"/>
      <backstage onShow="Exemple.xltm!Backstage_onShow" onHide="Exemple.xltm!Backstage_onHide">
    ...
      </backstage>
    </customUI>
    

    关于此方法是否适用于 XLTM 文件

    来自 cmets 的跟进:

    当你对 XLSM 文件使用上述方法时,包含Backstage_OnShow 宏的文件是打开的,因此调用Exemple.xlsm!Backstage_OnShow 工作,因为Exemple.xlsm 是一个打开的工作簿文件。

    当您对 XLTM 文件使用此方法时,从模板创建新文件时,带有 onShow ="Exemple.xltm!Backstage_OnShow 的显式 XML 将失败,因为找不到宏。找不到宏,因为 Exemple.xltm 不是 Workbooks 集合的有效成员。

    如果像您之前尝试的那样,XML 没有完全限定宏(例如,onShow="Backstage_OnShow),如果您导航到任何创建的打开工作簿,您将收到相同的错误XLTM,出于同样的原因:找不到宏。在这种情况下,在ActiveWorkbook的范围内找不到宏。

    这似乎根本不适用于 XLTM 文件(至少在没有相当大的努力的情况下并非如此)

    如果您创建一个自定义选项卡而不是劫持Backstage,那么您也许可以使其工作。

    或者,我认为您必须为文件的 每个 新实例修改 Ribbon XML,虽然可以修改 Ribbon XML,但我认为不可能这样做文件已打开。

    我能想到的最佳解决方案是创建一个插件或宏:

    1) 提示用户输入新文件名 2)从模板创建新文件,保存并关闭它 3)修改新文件的Ribbon XML的内容 4) 打开新文件

    你可以看到这个关于解压和修改 XML 的信息:

    http://www.jkp-ads.com/articles/Excel2007FileFormat02.asp)

    【讨论】:

    • 首先,非常感谢您的回答!这是一个非常好的主意!所以,我给你我的测试结果。我已经尝试过你的解决方案。它非常适用于 XLSM Excel 文件BUT,在我的情况下,我的文件是 Excel 电子表格模板 (XLTM),因此,每次打开它,文件名都会更改(增量)所以,错误消息引发了。我想到了另一种解决方案:我试图替换“Exemple.xltm!”通过“这本工作簿”。但是(是的,但总是在某个地方:-))它也不起作用(引发错误)提前谢谢你。此致,帕特里斯。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多