【问题标题】:VBA: test if workbook is nothingVBA:测试工作簿是否什么都不是
【发布时间】: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 对象时捕获错误。只需将其包装到返回 BooleanFunction 中即可 - 一切就绪。
  • 我在函数中添加了代码。
  • 如果你注释掉set w = GetWb,第一个sn-p会发生什么?
  • 编辑:我真正的问题是如何测试是否设置了已实例化的对象。我并不是真的想“纠正”我的代码。它只是一个例子。

标签: vba excel


【解决方案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

【讨论】:

  • 虽然这将解决问题,但我真正的问题是如何测试是否设置了已实例化的对象。我并不是真的想“纠正”我的代码。它只是一个例子。我正在收集没有更好的方法,我应该按照我的方式去做,或者像你在这里所说的那样不返回任何东西。
  • 嗯,但是对于工作簿,它永远不会发生,如果你执行 `Dim x As Workbook` 并且检查它什么都没有。创建实例而不设置值的唯一方法是Dim x As New Workbook,但这种情况是无用的,因为每次您尝试使用它而不设置任何工作簿时它都会启动 spraion err: 429。 Overkill 是用 New 关键字声明并捕获错误 429。
  • @mountainclimber 我还注意到,与您自己创建的对象相比,使用“系统”对象(如WorkbookWorksheets 集合)时会有一些不同。无法使用Is Nothing 检查就是一个例子。另一个是 - 我有通用函数来检查集合中是否存在项目并且它不适用于Worksheets,即使它理论上是Collection(文档说)。您对应用程序对象所能做的就是反复试验,看看什么是有效的。 :-(
猜你喜欢
  • 1970-01-01
  • 2012-01-18
  • 2013-12-23
  • 2015-06-29
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多