**描述:**这是Excel 2013 VBA案例。我创建了加载项,它应该能够从存储在全局变量“listOfAddIns”中的加载项列表安装和卸载其他加载项,该变量是变量类型的数组数组,称为“valueArray”。有“组控制”按钮(用于安装或卸载所有可用的加载项)和“单独控制”toogle按钮(用于安装或卸载特定的加载项)。我使用了大量回调函数,用于从VBA完全自定义所有元素。
**问题:**安装/卸载没有自己的功能区选项卡的外接程序时,一切正常。一旦安装的外接程序有了自己的功能区选项卡,我就无法再使用功能区对象。使方法无效并调用回调。我收到以下描述不佳的错误消息:
Run-Time error'-2147467259(80004005)': Method 'Invalidate' of object 'IRibbonUI' failed
**我的想法:**根据描述的症状,我怀疑不同插件的IRibbonControl存在一些重复问题。尽管我做了很多努力,但我还是无法解决这个问题。
CustomUI XML的相关部分:
<customUI onLoad="OnLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id = "INST1ID" label="Installer">
<group id="GroupControls" label="Group controls">
<button id="B1ID" label="Install All" size="large" onAction="InstallAll" imageMso="AcceptInvitation" />
<button id="B2ID" label="Uninstall ALL" size="large" onAction="UninstallAll" imageMso="MasterViewClose" />
</group>
<group id="IndividualControls" label="Individual controls">
<toggleButton id="TB1ID" imageMso="HappyFace" label="AddIn1" onAction="TBsControl" size="large" tag="1" getEnabled="TBsGetEnabled" getPressed="TBsGetPressed" getVisible="TBsGetVisible" />
<toggleButton id="TB2ID" imageMso="HappyFace" label="AddIn2" onAction="TBsControl" size="large" tag="2" getEnabled="TBsGetEnabled" getPressed="TBsGetPressed" getVisible="TBsGetVisible" />
<toggleButton id="TB3ID" imageMso="HappyFace" label="AddIn3" onAction="TBsControl" size="large" tag="3" getEnabled="TBsGetEnabled" getPressed="TBsGetPressed" getVisible="TBsGetVisible" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
加载子文件:
Public Sub OnLoad(ribbon As IRibbonUI)
Set ribbonObject = ribbon
End Sub
“集团控制”示例的主要程序:
Public Sub InstallAll(control As IRibbonControl)
Call ResetSomePublicVariables
Call CreateEntryValuesAndFillToListOfAddIns
Call CheckAvailabilityAndInstallationOfAddInsAndFillToListOfAddIns
Call UpdateListOfAddInsToInstallAllAvailableAddIns
Call InstallOrUninstallAddInsDueToListOfAddIns
ribbonObject.Invalidate
End Sub
“个体对照”和扩展第4次提交的主要程序:
Public Sub TBsControl(control As IRibbonControl, pressed As Boolean)
Call ResetSomePublicVariables
Call CreateEntryValuesAndFillToListOfAddIns
Call CheckAvailabilityAndInstallationOfAddInsAndFillToListOfAddIns
Call UpdateListOfAddInsDueToToogleButtonRequest(control.tag, pressed)
Call InstallOrUninstallAddInsDueToListOfAddIns
ribbonObject.Invalidate
End Sub
Public Sub UpdateListOfAddInsDueToToogleButtonRequest(tag As Long, pressed As Boolean)
Dim valueArray() As Variant
valueArray = listOfAddIns(tag)
If pressed = True Then
valueArray(VAColumnIndex_Installed) = 1
Else
valueArray(VAColumnIndex_Installed) = 0
End If
listOfAddIns(tag) = valueArray
End Sub
回调示例:
Public Sub TBsGetVisible(control As IRibbonControl, ByRef returnedVal)
For Each Item In listOfAddIns
If control.tag = Item(VAColumnIndex_Number) Then
returnedVal = True
Exit For
Else
returnedVal = False
End If
Next Item
End Sub
- 我没有使用自定义UI编辑器或类似的软件,我想它在这个阶段不会有帮助
- 我试着将onLoad子模块移到ThisWorkbook模块。我明白,将回调移到ThisWorkbook是错误的。我也试着将ThisWorkbook和ThisAddin前缀移到IRibbonControl参数,但这也是错误的。到目前为止,我试图以某种方式区分最终的IRibbonControl重复(只是我的想法)。
- 我尝试在其他加载项中重命名IRibbonUI对象,但没有任何进展。
- 我读了很多资料,看到了很多关于微软的例子和不同的方法,StackOverflow在下面的链接上,但它并没有帮助我解决这个问题。https://excelguru.ca/?s=ribbon+part
- 任何想法,特别是简单的解决这个问题的方法都是非常欢迎的,非常感谢
1条答案
按热度按时间pxiryf3j1#
解决了。
我所有插件的XML文件的第一行看起来像这样,这是前面描述的所有问题的来源。
不同加载项中onLoad过程的相同名称导致所描述的行为,包括安装2个或多个同名加载项时出现的上述错误。将onLoad过程重命名为不同名称可立即解决所有问题。
帮助我的来源:https://excelguru.ca/debugging-ribbonx-invalidateinvalidatecontrol-failures%E2%80%A6/