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:条件格式规则的公式为:=NOT(OR(CheckIfDate($B2),$B2=""))
(CheckIfDate 函数包含在因子 4 中)
因素 2:条件格式规则的公式为:=AND($B2-TODAY()>1,$B2-TODAY()<=10)
因子 3:另一个包含公式 =IF($B2="","",IF($B2-TODAY()<=1,5,IF($B2-TODAY()<=10,4,IF($B2-TODAY()<=30,3,IF($B2-TODAY()<=90,2,1)))))
因子 4:具有以下代码的 VBA 函数:
Option Explicit Function CheckIfDate(Test_Cell as Range) as Boolean CheckIfDate = IsDate(Test_Cell) End Function
在这个阶段,我可能会调整 1+ 个因素来避免该错误,但我很想了解发生了什么,然后再决定下一步的最佳行动方案是什么。任何 help/support 将不胜感激,如果需要,我很乐意提供其他信息等。
补充说明:
我可以确认这不是特定于机器的(我能够在同事的机器上重现该问题)
似乎这个错误不会影响 Excel 的所有版本,甚至可能是特定于有问题的版本。正在使用的是 32 位 Office Professional Plus 2016 版本(内部版本号为 16.0.5254.1000)。我尝试在 64 位 365 版本(内部版本号 16.0.14729.20254)上复制它,这似乎没有问题;因此让我觉得这个问题可能与 32 位限制有关?
就上述两个单元格位置而言,它们的位置与发生的问题之间似乎存在一些弱点 link。我能够确定,当它们像我的示例一样彼此相邻时,就会出现问题,但是当它们离得更远时,问题似乎不会触发。可以这么说,我还不确定 'trip' 点有多远;但看起来它们之间可能有几列 and/or 行并且问题仍然存在(因此这不是“它们必须直接相邻”的情况)
我最初的想法是,在试图确定导致错误的确切因素时,它与 TODAY() 是一个易变函数这一事实有关,它在这里被大量使用。但是鉴于 Factor 1 不包括该函数,我不再那么确定了。然而,这 4 个因素之间明显的 link 是它们都以某种形式或形式与日期相关;但这可能是巧合。
检测到场景
提供 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:
- 清除临时文件:有时这有助于 oracle 内存处理,请咨询您的 IT 部门,但执行“%temp%”删除所有文件并重新启动是安全的。
- 清除Java 临时文件:转到控制面板->Java 32 位。在“常规”选项卡中,转到“Internet 临时文件”部分,然后点击设置并单击“删除文件”。
- 彻底的解决方案:从 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:这将以用户按下按钮为代价来平衡加速。
我在 Excel 中遇到了一个不寻常的错误,它会导致整个程序在没有警告、任何形式的错误通知(包括启动时)或任何崩溃确认的情况下崩溃。当我打开一个特定的工作簿然后尝试打开另一个工作簿时,就会发生这种情况;此时 Excel 实际上只是“结束任务”本身。
我试过有问题的工作簿副本,似乎已将其缩小为四个因素的组合。如果删除这些因素中的任何一个,错误似乎不会发生,并且在新工作簿中创建它们似乎会导致问题发生(即它是可复制的,而不仅仅是那个特定的原始工作簿)。
这四个因素如下:
因素 1 和 2 在包含日期的单元格上(比方说 B2;但请参阅我的附加说明):
因子 1:条件格式规则的公式为:
=NOT(OR(CheckIfDate($B2),$B2=""))
(CheckIfDate 函数包含在因子 4 中)因素 2:条件格式规则的公式为:
=AND($B2-TODAY()>1,$B2-TODAY()<=10)
因子 3:另一个包含公式
=IF($B2="","",IF($B2-TODAY()<=1,5,IF($B2-TODAY()<=10,4,IF($B2-TODAY()<=30,3,IF($B2-TODAY()<=90,2,1)))))
因子 4:具有以下代码的 VBA 函数:
Option Explicit Function CheckIfDate(Test_Cell as Range) as Boolean CheckIfDate = IsDate(Test_Cell) End Function
在这个阶段,我可能会调整 1+ 个因素来避免该错误,但我很想了解发生了什么,然后再决定下一步的最佳行动方案是什么。任何 help/support 将不胜感激,如果需要,我很乐意提供其他信息等。
补充说明:
我可以确认这不是特定于机器的(我能够在同事的机器上重现该问题)
似乎这个错误不会影响 Excel 的所有版本,甚至可能是特定于有问题的版本。正在使用的是 32 位 Office Professional Plus 2016 版本(内部版本号为 16.0.5254.1000)。我尝试在 64 位 365 版本(内部版本号 16.0.14729.20254)上复制它,这似乎没有问题;因此让我觉得这个问题可能与 32 位限制有关?
就上述两个单元格位置而言,它们的位置与发生的问题之间似乎存在一些弱点 link。我能够确定,当它们像我的示例一样彼此相邻时,就会出现问题,但是当它们离得更远时,问题似乎不会触发。可以这么说,我还不确定 'trip' 点有多远;但看起来它们之间可能有几列 and/or 行并且问题仍然存在(因此这不是“它们必须直接相邻”的情况)
我最初的想法是,在试图确定导致错误的确切因素时,它与 TODAY() 是一个易变函数这一事实有关,它在这里被大量使用。但是鉴于 Factor 1 不包括该函数,我不再那么确定了。然而,这 4 个因素之间明显的 link 是它们都以某种形式或形式与日期相关;但这可能是巧合。
检测到场景
提供 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:
- 清除临时文件:有时这有助于 oracle 内存处理,请咨询您的 IT 部门,但执行“%temp%”删除所有文件并重新启动是安全的。
- 清除Java 临时文件:转到控制面板->Java 32 位。在“常规”选项卡中,转到“Internet 临时文件”部分,然后点击设置并单击“删除文件”。
- 彻底的解决方案:从 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:这将以用户按下按钮为代价来平衡加速。