Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何从工具-->引用中自动检查“Microsoft ActiveX数据对象x.x库”?_Excel_Vba - Fatal编程技术网

Excel 如何从工具-->引用中自动检查“Microsoft ActiveX数据对象x.x库”?

Excel 如何从工具-->引用中自动检查“Microsoft ActiveX数据对象x.x库”?,excel,vba,Excel,Vba,我们与客户共享Excel宏MS Access项目 他们不知道如何从工具->参考中选择“Microsoft ActiveX数据对象x.x库” 有自动更新MS ADO库设置的代码吗 注:在Office中,我们使用MS 2010。我认为客户的办公室正在使用Micorsoft XP。我建议上面使用后期绑定,但您可以这样做。我的代码与PPT 2010中使用的完全一样,应该很容易适应Access,但我从未使用Access 您可能需要更改ADODBReference常量以在XP中使用。或者,您可以添加另一个常

我们与客户共享Excel宏MS Access项目

他们不知道如何从工具->参考中选择“Microsoft ActiveX数据对象x.x库”

有自动更新MS ADO库设置的代码吗


注:在Office中,我们使用MS 2010。我认为客户的办公室正在使用Micorsoft XP。

我建议上面使用后期绑定,但您可以这样做。我的代码与PPT 2010中使用的完全一样,应该很容易适应Access,但我从未使用Access

您可能需要更改ADODBReference常量以在XP中使用。或者,您可以添加另一个常量和逻辑检查,以查看从适当的目标路径加载的应用程序版本

Public Const ADODBReference As String = "C:\Program Files (x86)\Common Files\System\ado\msado15.dll"

Sub PPT_AddRefToADODBLibrary()
'Adds a programmatic reference to ADODB library if one doesn't already exist
'ADODBReference is a public const refers to Microsoft ActiveX Data Objects 6.0 Library

    If Not PPT_RefExists(ADODBReference, "Microsoft ActiveX Data Objects 6.0 Library") Then
        Application.VBE.ActiveVBProject.References.AddFromFile _
            ADODBReference
    Else:
        'Already installed
    End If

End Sub
上面的子函数调用此自定义函数,该函数首先迭代活动引用

Function PPT_RefExists(refPath As String, refDescrip As String) As Boolean
'Returns true/false if a specified reference exists, based on LIKE comparison
' to reference.description.
Dim ref As Variant
Dim bExists As Boolean

'Assume the reference doesn't exist
bExists = False

For Each ref In Application.VBE.ActiveVBProject.References
    If ref.Description Like refDescrip Then
        PPT_RefExists = True
        Exit Function
    End If
Next
PPT_RefExists = bExists
End Function

我认为迟订是唯一的办法。 我为我的办公室制作了一个基于Excel的应用程序,每次我准备新版本时,我都要访问大约10%的用户来添加参考资料。 我发现,由于这些计算机有不同的Windows版本,对于某些dll,在每台计算机上都没有版本。 这使得从代码中添加引用更加困难,我不想使用后期绑定。
遗憾的是,我使用的dll的大部分功能在所有版本中都是兼容的。

尝试用如下代码简单地打开它:

Application.VBE.ActiveVBProject.References.AddFromFile "C:\Program Files (x86)\Common Files\System\ado\msado15.dll"
您可能会遇到三个问题:它已安装、已安装早期版本、文件路径无效。因此,我的逻辑如下:

代码循环遍历所有引用,并检查是否安装了Microsoft ActiveX Data Objects 6.0库的引用。 如果未安装,则会尝试使用错误处理进行安装。 如果出现故障,则表示在循环时可以检查安装的早期版本,即Microsoft ActiveX Data Objects 2.8,或者文件路径无效。 代码:


您可以使用后期绑定。请参阅上面的答案。您当然可以检查Application.Version来确定加载哪个DLL,甚至可以检查操作系统信息,以及一些简单的条件逻辑来路由正确的路径。
Sub AddReferenceMicrosoftActiveXDataObjectsLibrary()
    Const MyRefPath As String = "C:\Program Files (x86)\Common Files\System\ado\msado15.dll"
    Dim ref As Variant
    Dim IsInstalled As Boolean: IsInstalled = False

    For Each ref In Application.VBE.ActiveVBProject.References
        Debug.Print ref.FullPath
        If ref.FullPath = MyRefPath Then IsInstalled = True
    Next

    If IsInstalled = False Then
        On Error GoTo err:
        Application.VBE.ActiveVBProject.References.AddFromFile MyRefPath
        On Error GoTo 0
        Debug.Print "Just installed"
        Exit Sub
    Else
        Debug.Print "Already installed"
    End If  
Exit Sub
err:
    MsgBox "Probably earlier version of Microsoft ActiveX Data Objects is already installed or other error occurred"
End Sub