Windows(ThisWorkbook.Name).Visible = True会导致Excel自动恢复的文件出错

2个月前我已经问过这个问题: 在启用macros的Excel文件上自动保存文件错误

感谢@ YowE3K,当我尝试恢复(重新打开)文件时,他将Workbook_Open事件引荐给我,因为问题正在发生。 今天我深深地关注它,发现我得到的原因:

Run-time error '9' Subscript out of range 

错误是:

Windows(ThisWorkbook.Name).Visible = True

我不知道它是如何变成False的,但是当我试图打开自动恢复文件时,我意识到文件正常打开,我的表单正常打开,但是当表单消失时,错误会通过,文件的名称更改为Microsoft Excel,所有内容都从屏幕上消失,所有的Excelfunction区冻结,我只能进入开发人员选项卡,没有任何改变的情况。

所以我认为,excel以某种方式不能将Windows(ThisWorkbook.Name).Visible转换为True(我的Excel Splash Screen)消失后。

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

微软的页面和XL2003的 类似问题 :改变ThisWorkbook.Windows()。Workbook_BeforeClose事件期间的Visible属性可以防止工作簿closures ,根本没有帮助我。

代码失败,因为当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 

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

正确的解决scheme(我想,我们将看到它是如何)是使用Workbook.Windows()集合。

由于Excel支持多个窗口(工作簿中的“视图”,请参阅此处的解释 ),以正确的方式进行操作需要考虑需要操作的窗口或窗口。 特别是,对于同一个工作簿, ActiveSheet在两个不同的窗口中可能会有所不同…

鉴于大多数人都不知道这个function,我决定总是使用第一个窗口( 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)之前closures额外的窗口,但很快发现,closures错误的窗口并继续运行VBA代码可能会导致Excel崩溃,并决定采取一种更安全的方法:在执行任何其他操作之前,检查是否有多个窗口的工作簿,如果有,build议closures他们,并要求用户再次尝试:

 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 

相关信息:

  • 当通过string索引访问Application.Windows()集合时,它看起来是通过其Caption来查找窗口的(最好的来源是文档中的这句话: “这个例子在活动工作簿中名称窗口”Consolidated Balance工作表“,然后使用该名称作为Windows集合的索引。” )。 当多个窗口具有相同的Caption ,返回的窗口似乎是最近活动的。
  • Run-time error '9' Subscript out of range当您尝试使用Windows(ThisWorkbook.Name)和下列命令时,已知下Run-time error '9' Subscript out of range错误:
    • 工作簿被“修复”(因为Excel表示在Caption :“WorkbookName [修复]”)
    • 如果为工作簿打开了多个带默认标题的窗口(因为它们的标题是:“WorkbookName:1”,“..:2”等等)
    • 如果在Windows资源pipe理器的设置中启用了“隐藏已知文件types的扩展名”(我不能重现这个)