excel 外接程序IRibbonUI回调和.Invalidate在安装任何其他具有自己IRibbonUI的外接程序后失败

relj7zay  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(252)

**描述:**这是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
  • 任何想法,特别是简单的解决这个问题的方法都是非常欢迎的,非常感谢
pxiryf3j

pxiryf3j1#

解决了。
我所有插件的XML文件的第一行看起来像这样,这是前面描述的所有问题的来源。

<customUI onLoad="OnLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">

不同加载项中onLoad过程的相同名称导致所描述的行为,包括安装2个或多个同名加载项时出现的上述错误。将onLoad过程重命名为不同名称可立即解决所有问题。
帮助我的来源:https://excelguru.ca/debugging-ribbonx-invalidateinvalidatecontrol-failures%E2%80%A6/

相关问题