【问题标题】:Sheet name does not exist when obviously it does工作表名称显然不存在
【发布时间】:2019-09-30 20:59:10
【问题描述】:

在过去的几周里,我一直在开发 VBA、UserForm1 程序,我进行了多次测试,从未遇到过这个问题。 下面显示的代码是初始化例程的一部分。我对程序做了一些改进,代码比讨论的代码更深入。现在,我无法通过程序中的这一点。我将“激活”替换为“选择”,但这并不影响结果,即中止运行。

请,有人可以建议我做错了什么吗?或者,一个经过数十次测试的程序怎么会突然凭空出现故障?

    '======================================================================
    Dim WPA() As Variant             'Workbook path for Category Class
    Dim WBA() As Variant             'Workbook name for Category Class
    Dim WSA() As Variant             'Worksheet name for Category Class
    '======================================================================
    Dim WBK() As Workbook

    ..........
    Set WBK(S) = Workbooks.Open(WPA(S))
    Workbooks(WBA(S)).Worksheets(WSA(S)).Activate   'Activate Worksheet
    NWS(S) = CheckSheetExists(WSA(S))               'Check for Worksheet
    ..........

   Function CheckSheetExists(SheetName) As Boolean
   CheckSheetExists = Evaluate("ISREF('" & SheetName & "'!A1)")
   If CheckSheetExists = False Then
       MsgBox "Worksheet " & SheetName & " does not exist. Run aborted."
       End                        '<==================Run aborts
   End If
   End Function

【问题讨论】:

  • 你需要将End替换为Exit Function,见docs.microsoft.com/en-us/office/vba/language/reference/…
  • 工作簿路径、工作簿名称和工作表名称都可以从工作表对象(.Parent.Path.Parent.Name.Name)访问。当单个数组或工作表对象集合就足够时,我看不出有任何理由将它们捕获在三个单独的数组中。虽然这可能不是问题的根源,但它有助于简化代码。
  • 请包含minimal reproducible example。截至目前,尚不清楚工作表“显然”存在(真的吗?在哪个工作簿中?您确定工作表名称中没有导致错误结果的前导/尾随空格吗?等等)
  • 感谢您的宝贵建议,但是,我可以向您保证,我已经检查过了,但我感谢您的怀疑。我是 VBA David 的新手,所以我如何在这个论坛上证明我对工作表存在的断言的信心。让我们在工作表存在的前提下工作,哪些情况会导致问题?
  • 关于您对工作簿路径、工作簿名称和工作表的评论,这在当时似乎是一个简单的解决方案,因为我说我是 VBA 的新手。程序中没有任何信息是硬编码的,所有文件名和过程名都保存在名为 Template 的控制表上。但是,现在您已经用(.Parent.Path、.Parent.Name 和 .Name)启发了我。我将对程序的第 2 版进行调查。所以谢谢你。

标签: excel vba


【解决方案1】:

您好像在使用全局变量?

如果是这样,您应该意识到它们并不像您预期​​的那样永久。 有很多事情会导致全局变量重置并变得未定义。

有关更多信息,请参阅此答案:https://stackoverflow.com/a/7043901/1473412

使用“结束”

未处理的运行时错误

编辑代码

关闭包含 VB 项目的工作簿

是否有可能“对程序的增强,在代码中比所讨论的代码更深入”,导致其中一种情况发生,从而重置全局变量?

如果您必须使用全局变量,您可以将它们安全地存储在工作表中。或者,每次您尝试使用一个时,您都可以检查它是否已定义,如果没有,请重新定义它?

【讨论】:

  • 感谢您的建议,但是所有全局变量(如果这是我正在使用的)(VBA 新手)都保存在名为模板的工作簿中的各种工作表中。初始化例程将所有路径名、工作簿名称和工作表名称读取到各种数组中,请参见示例代码:
  • 但这就是我的意思。数组是全局变量。它们可能在初始化例程运行和您实际使用它们之间被重置。我并不是说这是问题所在,但这肯定是我要检查的第一件事。在代码中断之前添加一个断点,看看您的数组是否包含您认为应该包含的内容。
  • 谢谢,下次出错我会检查的。但是,只是为了给您反馈,我关闭了所有 excel 工作簿,然后重新启动了 excel,您不知道吗,它运行良好。但是我收到了一些非常有用的提示,我感谢这个社区中的每个人的建议。
【解决方案2】:

这是个好问题,据我所知,Storaxs 的回答应该已经解决了这个问题。

但是,当发生这种情况时,我会尝试创建一个全新的工作簿并将所有这些代码粘贴到其中(仅针对相关工作表),然后将所有单元格数据复制到新工作表中。

这曾经救过我一次,在这种情况下它也可以帮助你。

我还建议不要删除旧工作簿,以防万一你不移植所有内容。

如果这仍然不起作用,请告诉我们,我们将继续调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多