VBA:测试工作簿是否为空

时间:2017-01-11 16:47:21

标签: vba excel-vba excel

编辑:我真正的问题是如何测试是否设置了实例化的对象。我并不是真的想要"纠正"我的代码。这只是一个例子。

我有一个返回工作簿的函数:

编辑:添加了代码

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

1 个答案:

答案 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