在通过早期绑定使用它之前,我可以使用后期绑定来检查库的存在吗?

Gar*_*ill 3 vba late-binding early-binding

我喜欢在我的VBA项目中使用早期绑定,因为我喜欢在开发过程中自动完成方法名称等.我也很有信心知道编译器会在我拼写错误的方法名称时发出警告.

但是,要使用早期绑定,我需要添加对相关库的引用(例如,"Microsoft Scripting Runtime").这对于那样的"标准"库来说很好,但有时我想使用可能存在或不存在于用户机器上的库.

理想情况下,如果库不存在(例如"xyz未安装在此计算机上,因此无法使用此功能"),我希望显示有用的消息.如果我只使用后期绑定,那么我可以这样做:

Dim o As Object
Set o = CreateObject("foo", "bar")

If o Is Nothing Then
    MsgBox "nope"
End If
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加了对库的引用以便使用早期绑定,那么如果库不存在,则在加载VBA项目时会出现编译错误.因此,没有代码运行(包括检测库不存在的代码).

围绕这个捕获22有什么办法吗?

Han*_*sUp 6

您可以创建一个类模块作为对象库的代理 - 包装其他过程所需的所有方法,属性和常量.

所有这些过程都将以相同的方式使用代理类,因此您无需修改​​这些过程以在早期和晚期绑定之间切换.Intellisense会向您展示您使用代理类公开的所有内容.

该类将是在早期和晚期绑定之间切换的单一控制点.你提到Excel作为一个例子:

#Const DevStatus = "PROD"
#If DevStatus = "DEV" Then
    Private objApp As Excel.Application
    Private objBook As Excel.Workbook
    Private objSheet As Excel.Worksheet
#Else 'assume PROD
    Private objApp As Object
    Private objBook As Object
    Private objSheet As Object
#End If
Run Code Online (Sandbox Code Playgroud)

如果有可能Excel不能安装在任何用户的计算机上,您可以在课程初始化期间检查其可用性.

Dim blnExcelAvailable As Boolean

Private Sub Class_Initialize()
    blnExcelAvailable = IsExcelAvailable()
End Sub

Private Function IsExcelAvailable() As Boolean
    Dim blnReturn As Boolean
    Dim objTest As Object

On Error GoTo ErrorHandler

    Set objTest = CreateObject("Excel.Application")
    blnReturn = True

ExitHere:
    On Error GoTo 0
    Set objTest = Nothing
    IsExcelAvailable = blnReturn
    Exit Function

ErrorHandler:
    blnReturn = False
    GoTo ExitHere
End Function
Run Code Online (Sandbox Code Playgroud)

然后,使用代理类的过程可以检查属性以查看Excel是否可用.

Public Property Get ExcelAvailable() As Boolean
    ExcelAvailable = blnExcelAvailable
End Property
Run Code Online (Sandbox Code Playgroud)

我认为这种方法是可行的,它满足您的要求AFAICT.但是,我不确定这是否合理.回到Excel的示例,您可以为其对象模型的可管理子集执行类似的操作.但是如果你需要它的全部或大部分方法,属性和常量,那么代理类将是一项艰巨的任务.

我个人不会使用这种方法.对于我来说,管理早期/晚期绑定的工作不如mwolfe02和JP.描述.不过我的印象是,在你的情况下,这会更加繁重,所以也许你愿意投入比我更多的努力.