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有什么办法吗?
您可以创建一个类模块作为对象库的代理 - 包装其他过程所需的所有方法,属性和常量.
所有这些过程都将以相同的方式使用代理类,因此您无需修改这些过程以在早期和晚期绑定之间切换.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.描述.不过我的印象是,在你的情况下,这会更加繁重,所以也许你愿意投入比我更多的努力.
归档时间: |
|
查看次数: |
2502 次 |
最近记录: |