Vba Excel-2010-自定义UI-后台:在同一实例中打开不同文件时出错
首先,我很高兴加入这个社区。我希望我们能经常交换意见。我是法国人,请原谅我句子中的错误 我试图解释我的问题: 我有一个“好”主意,就是使用Excel文件的后台创建一个小仪表板。它工作得很好Vba Excel-2010-自定义UI-后台:在同一实例中打开不同文件时出错,vba,excel,ribbonx,Vba,Excel,Ribbonx,首先,我很高兴加入这个社区。我希望我们能经常交换意见。我是法国人,请原谅我句子中的错误 我试图解释我的问题: 我有一个“好”主意,就是使用Excel文件的后台创建一个小仪表板。它工作得很好 在Excel的同一实例中,当此文件与另一个文件同时打开时,会出现问题。第二个文件试图访问我的工作簿的函数“Backstage\u OnShow”和“Backstage\u OnHide”,因此我收到一条消息“无法运行宏“Backstage\u OnShow”(或“Backstage\u OnHide”)。该宏
在Excel的同一实例中,当此文件与另一个文件同时打开时,会出现问题。第二个文件试图访问我的工作簿的函数“Backstage\u OnShow”和“Backstage\u OnHide”,因此我收到一条消息“无法运行宏“Backstage\u OnShow”(或“Backstage\u OnHide”)。该宏可能在此工作簿中不可用……”后台是
应用程序的一部分,并且您已经指定应该为onShow
和onHide
事件调用某些宏
Excel将始终假定在ActiveWorkbook
的范围内应该找到不合格的宏,例如Backstage\u onShow
。当活动工作簿
中不存在此宏时,将引发错误
要解决此问题,请修改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\u OnShow
宏的文件将打开,因此调用example.XLSM!后台演示
工作,因为example.xlsm
是一个打开的工作簿文件
在XLTM文件上使用此方法时要从模板创建新文件,带有onShow=“example.XLTM!Backstage_onShow
的显式XML将失败,因为找不到宏。找不到宏是因为example.XLTM
不是工作簿集合的有效成员
如果如您先前尝试的那样,XML没有完全限定宏(例如,onShow=“Backstage\u onShow
),那么如果您导航到任何由XLTM创建的而不是的打开工作簿,您将得到相同的错误,原因相同:找不到宏。在这种情况下,在ActiveWorkbook
的范围内找不到宏
这似乎根本不适用于XLTM文件(至少不需要付出很大的努力)
如果您没有劫持后台
而是创建了一个自定义选项卡,那么您可能可以让它工作
或者,我认为您必须为文件的每个新实例修改功能区XML,虽然可以修改功能区XML,但我认为在文件打开时不可能这样做
我能想到的最佳解决方案是创建一个外接程序或宏,它可以:
1) 提示用户输入新文件名
2) 从模板创建新文件,保存并关闭它
3) 修改新文件的功能区XML的内容
4) 打开新文件
有关解包和修改XML的信息,请参见以下内容:
)@David,我有一个解决办法
谢谢你花时间回答我
我试着向你解释
因此,如果我们想一下,我们注意到问题是我们需要一个指定的位置来存储代码片段。这个地方在一开始!!!如果我们使用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>
...
我已经试过了,而且效果很好
你觉得这个主意怎么样?你看到这种方法的缺点了吗
Patrice.你是在问@mehow吗?听起来他想要的是,当在同一个Excel.Application实例中打开多个工作簿时,自定义UI XML仅应用于仪表板文件,而不应用于其他文件。首先,非常感谢你的回答!这是一个非常好的主意!!!所以,我给你我测试的结果。我试过你的解决办法。它可以很好地处理XLSM Excel文件,但在我的例子中,我的文件是Excel电子表格模板(XLTM),因此,每次打开它时,文件名都会更改(增量),因此仍会引发错误消息。我想到了另一个解决方案:我试图用“ThisWorkbook”替换“example.xltm!”。但是(是的,总是a,但在某个地方:-)它不起作用(错误增加)提前谢谢。真的,帕特里斯。
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 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>