【发布时间】:2017-01-12 01:08:18
【问题描述】:
编辑:我真正的问题是如何测试是否设置了已实例化的对象。我并不是真的想“纠正”我的代码。这只是一个例子。
我有一个返回工作簿的函数:
编辑:添加代码
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
在另一个子中,我想检查该对象是否由函数正确设置。我通常对对象做这样的事情:
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
【问题讨论】:
-
你能发布实际代码吗?
Sub GetWb() as Workbook至少是一个语法错误,'code here to set the proper workbook很可能是问题所在。 -
我认为您的解决方案很接近 - 可能有更好的方法来编写它,但想法是一样的 - 在尝试访问
Workbook对象时捕获错误。只需将其包装到返回Boolean的Function中即可 - 一切就绪。 -
我在函数中添加了代码。
-
如果你注释掉
set w = GetWb,第一个sn-p会发生什么? -
编辑:我真正的问题是如何测试是否设置了已实例化的对象。我并不是真的想“纠正”我的代码。它只是一个例子。