首先,我很高兴加入社区。我希望我们经常可以交换意见。我是法国人,请原谅我在句子中的错误。
我试着解释我的问题:
我有一个“好”的想法,即使用我的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。这当然是一个安全的代码片段!
答案 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
的一部分,您已指定应为onShow
和onHide
事件调用某些宏。
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的信息: