Excel-2010 - CustomUI - Backstage:在同一实例中打开各种文件时出错

时间:2013-08-28 09:35:30

标签: excel vba excel-vba ribbonx

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

我试着解释我的问题:

我有一个“好”的想法,即使用我的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:如果你想显示我的文件,这是一个link。这当然是一个安全的代码片段!

2 个答案:

答案 0 :(得分: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>

我已经尝试过并且有效。

您如何看待这个想法?你看到这种方法的缺点吗?

帕特里斯。

答案 1 :(得分: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工作,因为{{1是一个打开的工作簿文件。

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

如果您以前尝试过,XML没有完全限定宏(例如Exemple.xltm),那么当您导航到不由XLTM创建,出于同样的原因:无法找到宏。在这种情况下,无法在onShow="Backstage_OnShow

的范围内找到宏

看起来这可能不适用于XLTM文件(至少没有相当大的努力)

如果您创建自定义标签ActiveWorkbook,而不是劫持Backstage,则可以使其正常工作。

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

我能想到的最佳解决方案是创建一个加载项或宏:

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

您可以看到有关解压缩和修改XML的信息:

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