【问题标题】:Windows(ThisWorkbook.Name).Visible = True causes error on Excel's auto-recovered filesWindows(ThisWorkbook.Name).Visible = True 导致 Excel 的自动恢复文件出错
【发布时间】:2017-09-29 15:38:00
【问题描述】:

2 个月前我问过这个问题: Autosaved file error on Macro Enabled Excel file

感谢@YowE3K,他将我推荐给 Workbook_Open 事件,因为当我尝试恢复(重新打开)文件时出现问题。今天深入研究了一下,发现我得到的原因是:

 Run-time error '9'

 Subscript out of range

错误是:

Windows(ThisWorkbook.Name).Visible = True

我不知道它是如何变成 False 但是,当我尝试打开自动恢复文件时,我意识到文件正在正常打开,我的表单正在正常打开,但是当表单消失时,错误出现,名称文件更改为 Microsoft Excel,一切都从屏幕上消失,所有 Excel 功能区冻结,我只能转到开发人员选项卡,没有任何改变。

所以我认为,excel 无法在窗体(我的 Excel 启动画面)消失后将 Windows(ThisWorkbook.Name).Visible 变为 True。

我怎样才能避免这种情况?我不想删除我喜欢的启动画面,但有时我也需要使用自动恢复文件。

Similar issue from Microsoft's page 和 XL2003: Changing ThisWorkbook.Windows().Visible property during Workbook_BeforeClose event prevents workbook from closing 对我一点帮助都没有。

【问题讨论】:

    标签: vba excel error-handling runtime-error


    【解决方案1】:

    代码失败是因为当 Excel 恢复文件时,它会在窗口的标题中添加一些文本,因此“FileName.xlsx”变成类似于“FileName.xlsx [用户上次保存的版本]”。 所以使用如下例程:

    Sub ShowaWindow(sFileName As String)
        Dim oWb as Workbook
        For Each oWb In Workbooks
            If lCase(owb.Name) = lCase(sFileName) Then
                oWb.Windows(1).Visible = True
                Exit For
            End If
        Next
    End Sub
    

    【讨论】:

    • 逻辑很棒,但我无法使用例程,我该如何应用它?我的代码在 workbook_open 事件中(真正的代码在我之前的帖子中,我在这个问题的开头提到过)我尝试单独使用这个例程并将其调用到 workbook_open 事件中(而不是 workbook.name.visible =真线)但没有用。我还尝试将工作簿名称定义为字符串名称,然后尝试调用此名称,但它也不起作用。
    • 而不是 Windows(ThisWorkbook.Name).Visible = True 你使用 ShowaWindow(ThisWorkbook.Name)
    • 哇,这就像一个魅力!你能解释一下这些代码到底做了什么吗?为什么只是 Dim name1 as String name 1= ThisWorkbook.name Windows(name1).Visible = True 代码不起作用? (我也认为你的回答很有用,但我的观点不足以增加它的遗憾。感谢您解决了我的这个大问题)
    • 我的代码有效,因为它首先找到工作簿对象本身,然后简单地激活它的第一个窗口,而不是依赖于通过使用其标题(您使用的方法)来激活窗口,这可能会也可能不会与您要激活的工作簿的名称相同。
    • 如果您首先引用了您需要的工作簿 (ThisWorkbook),那么循环遍历 Workbooks 以查找名称与 ThisWorkbook.Name 匹配的 oWb 有什么意义?我认为我下面的答案更干净。
    【解决方案2】:

    Windows(ThisWorkbook.Name) 是获取工作簿窗口的一种常见但完全错误的方法,它迟早会给你Run-time error '9' Subscript out of range。

    正确的解决方案(我想,我们会看看效果如何)是使用Workbook.Windows() 集合。

    由于 Excel 支持多个窗口(工作簿中的“视图”,请参阅an explanation here),因此要以正确的方式进行操作需要考虑您需要在哪个或哪些窗口上进行操作。特别是,ActiveSheet 在同一工作簿的两个不同窗口中可能不同...

    鉴于大多数人不知道此功能,我决定始终使用第一个窗口 (Workbook.Windows(1)),如下所示:

    Private Sub FreezePanes()
        With ThisWorkbook.Windows(1)
            If .FreezePanes Then .FreezePanes = False
            .SplitColumn = 0
            .SplitRow = 1
            .FreezePanes = True
        End With
    End Sub
    

    为确保这不会导致奇怪的结果,我想在为我的工作簿打开多个窗口时做一些事情。

    最初我试图在访问 wb.Windows(1) 之前关闭额外的窗口,但很快发现关闭错误的窗口并继续运行 VBA 代码会导致 Excel 崩溃并决定采取更安全的方法:在做任何其他事情之前,我检查工作簿是否有多个窗口,如果有,建议关闭它们并要求用户重试:

    Public Function CheckForExtraWindowsAndWarn(wb As Workbook) As Boolean
        If wb.Windows.Count > 1 Then
            If MsgBox("... Close the extra windows?", vbQuestion + vbYesNo, APP_TITLE) = vbYes Then
                While wb.Windows.Count > 1
                    wb.Windows(wb.Windows.Count).Close
                Wend
            End If
            CheckForExtraWindowsAndWarn = True
        Else
            CheckForExtraWindowsAndWarn = False
        End If
    End Function
    
    ' in the top-level macro, before doing anything:
    If CheckForExtraWindowsAndWarn(ThisWorkbook) Then Exit Sub
    

    相关信息:

    • 当通过字符串索引访问Application.Windows() 集合时,它似乎通过其Caption 查找窗口(最好的来源是文档中的这句话:“此示例将窗口命名为活动工作簿“合并资产负债表”。此名称随后用作 Windows 集合的索引。”)。当多个窗口具有相同的Caption 时,返回的窗口似乎是最近活动的。
    • 当您尝试使用 Windows(ThisWorkbook.Name) 时,已知会发生 Run-time error '9' Subscript out of range 错误,并且:
      • 工作簿已“修复”(因为 Excel 在 Caption 中指出:“WorkbookName [Repaired]”)
      • 如果为工作簿打开了多个带有默认标题的窗口(因为它们的标题是:“WorkbookName:1”、“..:2”等)
      • 如果在 Windows 资源管理器的设置中启用了“隐藏已知文件类型的扩展名”(但我无法重现此设置)

    【讨论】:

    • 感谢 Nickolay 的广泛回答,这很清楚。 @jkpieterse 的解决方案也是基于 workbook.windows(1) 已经解决了这个问题。
    • 是的,解决方案的所有功劳归于@jkpieterse。我写这个答案是为了从提交消息中指向某个地方,因为似乎没有令人满意的描述它如何在任何地方工作..
    • 我喜欢您避免使用Windows("MyWorkbook"),但我认为遍历相关窗口是一种更通用的解决方案(仅包括一个窗口的特殊情况),正如我在回答中所写:stackoverflow.com/a/58047995/6306782
    • @z32a7ul 好吧,当然,如果您有时间并且需要正确支持多个窗口 - 去吧!就我而言,Windows 有很多用途,包括一些未维护的代码和像 this 这样的黑客攻击,所以我决定接受警告。
    【解决方案3】:

    Win10-Excel 2016组合的情况 工作簿.激活 前 WorkBook.Parent.Windows.(WoorkBook.Name).Visible = True

    解决了错误'9'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多