Excel 工作簿导致 Excel 在打开另一个工作簿时崩溃 - 确定了 4 个影响因素,但实际原因未知

Excel workbook causes Excel to crash when opening another workbook - 4 contributing factors identified but actual cause unknown

我在 Excel 中遇到了一个不寻常的错误,它会导致整个程序在没有警告、任何形式的错误通知(包括启动时)或任何崩溃确认的情况下崩溃。当我打开一个特定的工作簿然后尝试打开另一个工作簿时,就会发生这种情况;此时 Excel 实际上只是“结束任务”本身。

我试过有问题的工作簿副本,似乎已将其缩小为四个因素的组合。如果删除这些因素中的任何一个,错误似乎不会发生,并且在新工作簿中创建它们似乎会导致问题发生(即它是可复制的,而不仅仅是那个特定的原始工作簿)。

这四个因素如下:

因素 1 和 2 在包含日期的单元格上(比方说 B2;但请参阅我的附加说明):

在这个阶段,我可能会调整 1+ 个因素来避免该错误,但我很想了解发生了什么,然后再决定下一步的最佳行动方案是什么。任何 help/support 将不胜感激,如果需要,我很乐意提供其他信息等。

补充说明:

检测到场景
提供 office 32 位版本和您列出的一个 add-in 我至少可以从以下因素之一得到一些指示:

我注意到当您在工作簿上有 UDF(即使您没有使用来自 Oracle 的任何 functionality/API)和编码的用户表单时,启用 Oracle Smart View 会导致显示错误“内存不足” (即使他们根本没有被调用,或者在另一个打开的 WB 中,甚至在关闭规定的 WB 之后)。我不太确定这种情况是否发生在 Oracle 的 64 位版本中,但至少我可以确认这种行为在 32 位机器中奇怪地发生:

有时,此消息会在应用程序尝试显示时崩溃 excel,恕不另行通知。

附带说明:条件格式过多会导致导航速度缓慢和性能问题,因为它们 volatile. I do not recommend to use conditional formatting due to this and some other problems along the line, like

我发现了一些 fixes/workarounds:

  1. 清除临时文件:有时这有助于 oracle 内存处理,请咨询您的 IT 部门,但执行“%temp%”删除所有文件并重新启动是安全的。
  2. 清除Java 临时文件:转到控制面板->Java 32 位。在“常规”选项卡中,转到“Internet 临时文件”部分,然后点击设置并单击“删除文件”。
  3. 彻底的解决方案:从 COM Add-Ins 禁用 Oracle Add-In 并测试禁用此错误是否仍然发生。

根据你的情况,我很确定它与UDF有关。尝试一些文件中没有 UDF 的场景,条件格式也可能导致它,我会做一些测试来确认是不是这种情况。我很确定通过执行前面的操作,您将深入了解根本原因,如果是这种情况,您唯一的方法就是根据需要计算公式并且不要将 UDF 留在工作簿中,这对用户来说可能是个麻烦,但总的来说,它会加快速度,并且这种方法在导航和性能方面会带来更流畅的体验。话虽如此,通过引用您的因素 1 和 4,我会将那部分更改为:

 Sub Exec_ColorFormatting()
 Const TxtRangeForConditional As String = "B2:C100"
 Const TxtSheetForConditional As String = "Sheet1"
    Dim RangeForConditional As Range: Set RangeForConditional = Sheets(TxtSheetForConditional).Range(TxtRangeForConditional)
    Dim CounterRowRange As Long
    Dim CounterColRange As Long
    For CounterColRange = 1 To RangeForConditional.Columns.Count
    For CounterRowRange = 1 To RangeForConditional.Rows.Count
    If CheckIfDate(RangeForConditional.Cells(CounterRowRange, CounterColRange)) = False Then ' 1. If CheckIfDate(RangeForConditional.Cells(CounterRowRange, CounterColRange)) = False
    RangeForConditional.Cells(CounterRowRange, CounterColRange).Interior.Color = vbRed
    'Or if you want a custom color use the RGB
    'RangeForConditional.Cells(CounterRowRange, CounterColRange).Interior.Color =  = RGB(255, 0, 0)
    End If ' 1. If CheckIfDate(RangeForConditional.Cells(CounterRowRange, CounterColRange)) = False
    Next CounterRowRange
    Next CounterColRange
 End Sub
Function CheckIfDate(Test_Cell As Range) As Boolean
    CheckIfDate = IsDate(Test_Cell)
End Function

我会设置一个形状来调用 Exec_Formatting:这将以用户按下按钮为代价来平衡加速。