Excel在Workbook_Open上崩溃

时间:2017-05-12 09:45:55

标签: excel vba excel-vba

我有一个复杂的工作簿,有相当多的代码,并被许多用户分散在不同的地方......并且我不是一个专业的程序员。 在Workbook_Open事件中,我处理启动画面,密码保护并显示主要工作表并设置一些全局变量。 这个文件已经合理稳定地运行了几个月,但最近我开始使用Ribbon来改进用户界面(目标是替换用作菜单的浮动表单)。然后它变得不稳定,经常在打开文件时崩溃Excel。总体而言,情况与此非常相似:Excel [VBA] crashes on Workbook Open when activating a sheet。 我已经删除(或评论过)与Ribbon相关的所有代码但没有成功,并且上面的线程中建议的Wait命令也没有帮助。

如果在受保护模式下打开工作簿,然后启用了代码,则它会顺利运行。更有趣的是,如果我在不保存的情况下将其关闭,下次打开它时它会运行良好,而不需要保护模式。但是一旦我保存文件,它就会在下次打开时崩溃。

事实上,事故并非即时发生;似乎代码处于无限循环中。如果我进入VBAProject窗口,标题栏显示“[running ...]”(或类似的东西 - 我的安装是法语...),如果之前打开ThisWorkbook模块,我们看不到代码,而是屏幕某些部分的一些冻结图像。当我试图中断执行时,它真的崩溃了。

我已经导出,删除并重新导入了所有代码和表单 - 没有运气。 代码通常受密码保护,但我将其删除以进行测试。现在我不知道该怎么做。有什么想法吗?

Open事件的代码是:

Dim S As Object, rng As Range

'On Error GoTo Terminate

Application.Wait Now + #12:00:05 AM#

Application.ScreenUpdating = False
Application.EnableEvents = False
NSheets = Me.Sheets.Count

For Each S In Me.Sheets
    Set rng = AuxTables.Range("AT_SheetNames").Find(S.CodeName, , xlValues, xlWhole)
    If Not rng Is Nothing Then
        'Set sheet visibility
        If S.CodeName <> "Warning" Then S.Visible = Val(rng.Offset(0, 16))
        'Ensure all standard tabs are protected
        S.Protect Password:="xxxx", UserInterfaceOnly:=True, DrawingObjects:=False, _
            Contents:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
            AllowFormattingRows:=True
        S.EnableOutlining = True
        'Erase marker of Degraded Mode
        S.Range(IIf(S.CodeName <> "CashCurves", "C", "B") & "1").ClearContents
        Call SetSheetsDefaults(S)
    End If
Next S

Warning.Visible = xlHidden

Call EnableRecalculate(True)
bl_UpdateSupplySummary = True
Application.EnableEvents = True
Application.ScreenUpdating = True
On Error Resume Next
    AppActivate Application.Caption, True
    Cover.Activate

Exit Sub

Terminate:
    Dim Msg As String
    Msg = "Description: " & Err.Description & Chr(10)
    Msg = Msg & "Module: Workbook" & Chr(10)
    Msg = Msg & "Procedure: Open" & Chr(10) & Chr(10)
    Msg = Msg & "Execution will be interrupted." & Chr(10) & Chr(10)
    Msg = Msg & "Please print this screen and send it to xxx@company.com"
    MsgBox Msg, vbCritical, "Unexpected Error " & Err.Number
    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub

感谢。

1 个答案:

答案 0 :(得分:0)

我不知道这个答案是否适用于这种情况,但我偶然发现了这些Q&amp; A链接(在查看我自己的类似问题时),并认为它们可能会有所帮助(因为编辑功能区有时需要使用ActiveX)

ragoran; 2010-07-22 ExpertsExchange表示他在57121代码中遇到错误Workbook_OpenwsPrimary是预先退出表的代号),

  

错误说wsPrimary没有退出(呃!......但它就在那里!)如果我停止宏执行,电子表格会继续打开,然后每件事都恢复正常。

     

似乎在电子表格完成初始化所有对象列表之前,宏正在运行...

他找到的解决方案是:

  

在坚果shell中,如果您在某些电子表格上有activeX控件,并且控件绑定到工作表单元格的userform,并且您在设计模式下打开表单时编译VBA,则可能会导致文件中出现一些不一致这将创造我的行为。 ....这是我的情况。

     

解决方案是在运行时而不是设计时绑定控件。

另外,对ragoran问题的回答是this link (ExpertsExchange),问题在于

  

当我尝试以Compatablity模式保存时,我得到“未初始化的ActiveX控件无法转换为所选的文件格式。如果继续,控件将会丢失。”

Rory Archibald(2007-04-16)回复

  

“如果工作簿包含被认为不安全的初始化(UFI)的ActiveX控件,则在将工作簿保存为早期的Excel文件格式时会丢失它们。您可能希望将这些控件标记为安全初始化(SFI)如果您使用未初始化的ActiveX控件打开一个设置为高安全性的工作簿,则必须先使用消息栏启用它们,然后才能初始化它们。“

我确实意识到他们描述的症状似乎与OP无关;但是,这些问题发生在Excel 2003/2007中,并且 - 如果它们仍然是问题 - 可能在Excel 2010或更高版本中表现不同。