通过VBA在Excel中启用COM加载项

通过VBA在Excel中启用COM加载项,excel,vba,hyperion,Excel,Vba,Hyperion,我需要通过VBA启用COM加载项。这些加载项已存在于COM加载项下,但在Excel崩溃时将被取消选中 Sub hyp() Dim objAddIn As Object For i = 1 To Application.COMAddIns.Count Set objAddIn = Application.COMAddIns.Item(i) On Error Resume Next If Application.COMAddIns.I

我需要通过VBA启用COM加载项。这些加载项已存在于COM加载项下,但在Excel崩溃时将被取消选中

Sub hyp()
    Dim objAddIn As Object
    For i = 1 To Application.COMAddIns.Count

        Set objAddIn = Application.COMAddIns.Item(i)
        On Error Resume Next
        If Application.COMAddIns.Item(i).Description = "Oracle Smart View for Office" Then
            'MsgBox Application.COMAddIns.Item(i).Description
            'NEED TO ENABLE THE COM ADDIN

        Else
        End If
    Next i
End Sub

注意:请参见下面BigBen的评论-这种方法可能并不总是有效,因为索引器并不总是与描述一致。如果您需要按描述搜索,那么Excel开发人员的答案可能是适用的(尽管我个人没有尝试过或需要)


对于为我工作的Excel开发人员的回答,一个更简单的替代方法是直接根据com外接程序的字符串名称为其编制索引,而不是使用整数索引循环com外接程序并与描述进行比较。特别是,这段代码对我很有用(我已经包括了一个连接和断开连接的版本):


我有前面提到的相同的系统块,其中系统权限不允许我使用Application.COMAddIns(Name).Connect=True。这是一种解决方法,但要使COM加载项框弹出,可以使用SendKeys将其拉出。请记住,SendKeys仅在Excel 2010以后的运行结束时执行,因此要使其正常工作,首先需要检查用户是否连接到加载项。如果是,请致电另一个sub;如果不使用SendKeys打开对话框并结束sub。这些按键对我有效,可能需要根据菜单中的选项数量进行一些编辑

Sub test()

'Checks if COM is installed and active
comFound = False
comRibbon = True
For i = 1 To Application.COMAddIns.Count
    If Application.COMAddIns(i).Description = "NAME" Then
        comFound = True
        If Application.COMAddIns(i).Connect = False Then
            comRibbon = False
        End If
        Exit For
    End If
Next i

'Exits sub if not installed
If comFound = False Then
    MsgBox ("You do not have NAME installed.")
    Exit Sub
End If

'Directs user to rest of code if active, otherwise opens dialog
If comRibbon = True Then
    Call test2
Else
    MsgBox ("Please select NAME in the following dialog before rerunning.")
End If

SendKeys "%FT{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{TAB}{TAB}{TAB}{DOWN}{DOWN}{TAB}~", True

End Sub

Sub test2()
    'Rest of code
End Sub

请注意,Description属性区分大小写。谢谢。。我尝试了相同的方法,但出现错误“此加载项是为这台计算机上的所有用户安装的,只能由管理员连接或断开连接”。当我在谷歌上搜索时,它说应用程序应该以管理员的身份运行。即使在那之后,它也没有给我一个错误,也没有起作用。我在想另一个办法。有没有办法弹出COM加载项窗口,以便我手动选中加载项框,我想要。以下是适用于Addins的代码。(不适用于COM加载项)Application.CommandBars(1).FindControl(ID:=943,recursive:=True).Execute我添加了一个新问题,因为我遇到了一个问题,它与@PerlBatch的注释有关,但这个问题的公认答案并没有解决:我没有测试这个问题,但是,您不能按名称为外接程序编制索引,而不是通过每个外接程序循环并针对名称变量进行测试吗?@ColmBhandal:否。只是一个说明-从中可以看出,您可以将索引或ProgID与
COMAddIns
集合一起使用-但这与描述不同,即“Oracle Smart View for Office”换句话说,在OP.中,
Application.COMAddIns(“Oracle Smart View for Office”).Connect将抛出一个超出范围的下标。感谢BigBen,我将添加到答案中。
Public Sub Connect_COM_AddIn(Name As String)
    Application.COMAddIns(Name).Connect = True
End Sub

Public Sub Disconnect_COM_AddIn(Name As String)
    Application.COMAddIns(Name).Connect = False
End Sub
Sub test()

'Checks if COM is installed and active
comFound = False
comRibbon = True
For i = 1 To Application.COMAddIns.Count
    If Application.COMAddIns(i).Description = "NAME" Then
        comFound = True
        If Application.COMAddIns(i).Connect = False Then
            comRibbon = False
        End If
        Exit For
    End If
Next i

'Exits sub if not installed
If comFound = False Then
    MsgBox ("You do not have NAME installed.")
    Exit Sub
End If

'Directs user to rest of code if active, otherwise opens dialog
If comRibbon = True Then
    Call test2
Else
    MsgBox ("Please select NAME in the following dialog before rerunning.")
End If

SendKeys "%FT{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{TAB}{TAB}{TAB}{DOWN}{DOWN}{TAB}~", True

End Sub

Sub test2()
    'Rest of code
End Sub