Vba Excel-2010-自定义UI-后台:在同一实例中打开不同文件时出错

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文件的后台创建一个小仪表板。它工作得很好


在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>