编辑:我真正的问题是如何测试是否设置了实例化的对象。我并不是真的想要"纠正"我的代码。这只是一个例子。
我有一个返回工作簿的函数:
编辑:添加了代码
Sub GetWb() as Workbook
Application.DisplayAlerts = False
Application.EnableEvents = False
On Error Resume Next
Set wM = Application.Workbooks.Open("Z:\somepath.xlsm", ReadOnly:=True)
Application.EnableEvents = True
Application.DisplayAlerts = True
On Error GoTo 0
end sub
在另一个sub中,我想检查该对象是否由该函数正确设置。我通常会用对象做这样的事情:
dim w as Workbook
set w = GetWb
if w is nothing then
debug.print "no workbook"
else
debug.print "workbook"
end if
但是,is nothing
测试不起作用,因为该对象已实例化,但未设置,因此它是某种东西,而不是任何东西。
我采用了这个丑陋的解决方案,效果很好:
dim w as Workbook
set w = GetWb
on error goto someerrorhandling
if w.name = "" then
end if
on error goto 0
'other code here
someerrorhandling:
msgbox "no workbook"
换句话说,我检查对象的属性是否强制错误。必须有更好/更清洁的方式。
我查了一下这个链接说明我这样做是最好的方法: VBA: Conditional - Is Nothing
答案 0 :(得分:1)
更改GetWB的错误处理,使其不返回任何错误,也使用Function而不是sub。
Function GetWb() As Workbook
Application.DisplayAlerts = False
Application.EnableEvents = False
On Error GoTo errHandler:
Set GetWb = Application.Workbooks.Open("Z:\somepath.xlsm", ReadOnly:=True)
Application.EnableEvents = True
Application.DisplayAlerts = True
errHandler:
If Err.Number <> 0 Then
Set GetWb = Nothing
Application.EnableEvents = True
Application.DisplayAlerts = True
End If
End Function