我有一个复杂的工作簿,有相当多的代码,并被许多用户分散在不同的地方......并且我不是一个专业的程序员。
在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
感谢。
答案 0 :(得分:0)
我不知道这个答案是否适用于这种情况,但我偶然发现了这些Q&amp; A链接(在查看我自己的类似问题时),并认为它们可能会有所帮助(因为编辑功能区有时需要使用ActiveX)。
ragoran; 2010-07-22 ExpertsExchange表示他在57121
代码中遇到错误Workbook_Open
(wsPrimary
是预先退出表的代号),
错误说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或更高版本中表现不同。