【问题标题】:Status of a variable set to a workbook after the workbook has been closed工作簿关闭后设置到工作簿的变量的状态
【发布时间】:2014-11-14 02:59:45
【问题描述】:

我有一个简单的问题(我认为)。假设我将 Book1 中标准模块中的全局变量设置为打开的(不同的)工作簿:

Public Sub InitGlobals()
    Set gwkb = Workbooks("book2.xlsx")
End Sub

现在我手动关闭 book2.xlsx。 gwkb 的状态如何?这是我在即时窗口中运行各种测试时得到的结果:

?gwkb is nothing
False
?isempty(gwkb)
False
?isnull(gwkb)
False

但是,如果我询问 gwkb 的任何属性,例如 gwkb.Name,我会收到一个自动化错误。

我的问题是:有没有一种方法可以测试这种情况,而无需使用某种“On Error Resume Next”测试?

感谢您的帮助。

【问题讨论】:

  • 以下post 是测试工作簿是否仍然打开的好方法。
  • @Gary's Student & PortlandRunner -- 感谢您的快速回复,但我真的不想测试 book2.xlsx 是否打开。我想知道使用 gwkb 是否仍然“安全”。例如,在我的应用程序中,我不知道 gwkb 设置为的确切文件名,但如果我尝试使用 gwkb.Name,则会收到错误消息。我想我想知道在 VBA 中是否可能存在 gwkb 的状态/测试,而不是“什么都没有”、“isNull”或“isEmpty”,以确定它是否仍然可以用作对象。也许我唯一的选择是编写一个像“bIsOK(gwkb)”这样的函数来检查错误?再次感谢。
  • 如果 gwkb 仍然存在,那是因为您将其声明为公共或全局,而不是在子/函数内部,也没有将其作为参数传递。所以变量名仍然存在,但链接到一个空工作簿(或对象,取决于你如何声明它 - 未显示在你的代码中 -)

标签: excel vba


【解决方案1】:

如果 Book2 最初是打开的并且可能是关闭的,那么循环打开的书籍将找不到它:

Public Sub InitGlobals()
    Dim gwkb As Workbook, wb As Workbook
    Set gwkb = Workbooks("Book2.xlsx")
    gwkb.Close
    For Each wb In Workbooks
        If wb.Name = "Book2" Then
            MsgBox wb.Name & " is open "
        End If
    Next wb
End Sub

【讨论】:

  • if not iserror(gwkb) then msgbox gwkb.name ,有时在i= application.match () 之后用于测试 i 变量是否返回空结果
  • 顺便说一下 +1 表示这种不使用错误句柄的好方法。可以把它变成一个函数并经常使用它^^
  • @PatrickLepelletier .....这是一个权衡....不使用错误处理,但使用循环......如果有很多工作簿,这可能会降低效率同时开放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2019-03-03
  • 2023-02-09
相关资源
最近更新 更多