您可以创建一个类模块作为对象库的代理——包装其他过程所需的所有方法、属性和常量。
所有这些过程都将以相同的方式使用代理类,因此您不需要修改这些过程来在早期绑定和后期绑定之间切换。 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
如果 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
然后,使用代理类的程序可以检查属性以查看 Excel 是否可用。
Public Property Get ExcelAvailable() As Boolean
ExcelAvailable = blnExcelAvailable
End Property
我认为这种方法是可行的,并且它满足您的要求AFAICT。不过,我不确定这是否合理。回到 Excel 的示例,您可以对其对象模型的可管理子集执行类似的操作。但如果您需要它的全部或大部分方法、属性和常量,代理类将是一项艰巨的任务。
我个人不会使用这种方法。对于我来说,像 mwolfe02 和 JP 一样管理早期/后期绑定的工作量更少。描述。然而,我的印象是,这对你的情况来说是更沉重的负担,所以也许你愿意在这样的事情上投入比我更多的努力。