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

首先,我很高兴join社区。 我希望我们经常交stream意见。 我是法国人,所以请原谅我的错误。

我试图解释我的问题:

我有“好”的想法,使用我的Excel文件的后台创build一个小仪表盘。 它工作得很好。

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

我怎么能不做这个消息,或者确保后台是特定于我的文件而不是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:这是一个链接,如果你想显示我的文件。 这当然是一个安全的代码片段!

@大卫,我有一个解决scheme!

感谢您花时间回答我!

我试图解释你。

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

我已经尝试过,它的工作原理。

你觉得这个主意怎么样? 你看到这个方法的缺点吗?

帕特里斯。

Backstage是Application一部分,并且您已经指定应该为onShowonHide事件调用某些macros。

Excel将始终假定在ActiveWorkbook范围内find一个不合格的macros,例如Backstage_onShow 。 当ActiveWorkbook中不存在此macros时,将引发错误。

要解决此问题,请修改XML以使macros调用限定特定的工作簿:

 <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_OnShowmacros的文件已打开,因此调用Exemple.xlsm!Backstage_OnShow工作,因为Exemple.xlsm是一个打开的工作簿文件。

当您在XLTM文件上使用此方法时 ,若要从模板中创build新文件,显示的带有onShow ="Exemple.xltm!Backstage_OnShow XML将失败,因为无法find该macros,因为Exemple.xltm不是Workbooks集合的有效成员。

如果像以前一样尝试XML没有完全限定macros(例如, onShow="Backstage_OnShow ),那么如果导航到任何不是由XLTM创build的打开的工作簿,则会出现相同的错误,原因如下:找不到macros,在这种情况下,macros在ActiveWorkbook的范围内找不到。

看来这可能不适用于一个XLTM文件 (至less不是没有很大的努力)

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

或者,我认为你将不得不修改function区的XML文件的每个新的实例,虽然可以修改function区的XML,我认为这是不可能的,当文件打开。

我能想到的最佳解决scheme是创build一个插件或macros:

1)提示用户input新文件名2)从模板创build新文件,保存并closures它3)修改新文件的function区XML的内容4)打开新文件

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

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