2

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

我试图解释我的问题:

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

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

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

我用我的代码片段展示。会更清楚。

在我的 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:如果您想显示我的文件,这是一个链接。这当然是一个安全的代码片段!

4

2 回答 2

1

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

谢谢你花时间回答我!!!

我试着向你解释。

所以,如果我们想一想,我们会注意到问题是我们需要一个指定的地方来存储我们的代码片段。这个地方在 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>

我已经尝试过了,它有效。

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

帕特里斯。

于 2013-09-04T14:45:08.793 回答
0

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

Excel 将始终假定不合格的宏,例如,Backstage_onShow应该在ActiveWorkbook. 当 中不存在此宏时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 文件

评论的跟进:

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

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

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

似乎这根本不适用于 XLTM 文件(至少不是没有相当大的努力)

Backstage如果您创建自定义选项卡而不是劫持您,则可能可以使其工作。

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

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

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

您可以查看以下内容以获取有关解压缩和修改 XML 的信息:

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

于 2013-08-28T15:14:13.337 回答