Excel – 工作簿很慢,崩溃了很多

我们有一个工作簿,我们与5个用户共享并持续使用。 我们有大约1800条logging和26列数据。 数据是VLOOKUPS,标准值的混合。 我有3个macros的运行和2个条件格式规则和5张带有dumpdata(一个包含17Klogging和40列数据)的表单。

我们尝试删除所有不需要的额外function,并用标准文本replace它们,但是我们没有注意到其中的差异。

该工作簿不断崩溃,即使我们不触摸它,只需点击它,它会冻结,可能需要10分钟才能再次使用。 我也注意到它占用了相当多的资源(CPU有时达到100%),当你保存它使用100%的CPU。

有没有人有一些想法如何加快我们的工作簿,或至less停止文件崩溃? 🙂


在Sheet1(语音)中调用

Private Sub Worksheet_Change(ByVal Target As Range) '43 = ok '41 = NOK 'check if change happened in column A If Target.Column = 1 Then 'check if changed value is X If Target.Value Like "*x*" Then 'add datestamp if it is Cells(Target.Row, 43).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") Else End If If Target.Value Like "*NOK*" Then Cells(Target.Row, 41).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") Else End If End If End Sub 

在ThisWorkbook中调用

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Set shtVO = Sheets("Voice") endRowVO = shtVO.Range("J" & Rows.Count).End(xlUp).Row For Row = 2 To endRowVO If IsEmpty(shtVO.Cells(Row, 28).Value) = False Then If shtVO.Cells(Row, 3).Value <> shtVO.Cells(Row, 28).Value Then If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then Else shtVO.Cells(Row, 1).Value = shtVO.Cells(Row, 1).Value + "CheckDoneDate" End If Else If shtVO.Cells(Row, 3).Value = shtVO.Cells(Row, 28).Value Then If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then shtVO.Cells(Row, 1) = Replace(shtVO.Cells(Row, 1), "CheckDoneDate", "") End If End If End If Else If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then shtVO.Cells(Row, 1) = Replace(shtVO.Cells(Row, 1), "CheckDoneDate", "") End If End If Next Row End Sub 

称为模块1

 Sub DateNow() ActiveCell.Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") End Sub Sub UpdateLinks() ' ' Update Links ' 'ActiveWorkbook.UpdateLink Name:="F:\VOICE.xlsm", Type:=xlExcelLinks 'ActiveWorkbook.CalculateFull End Sub 

当前状态:阅读我的答案。

一个Excel公式重新计算它的参数何时改变(或者当任何单元改变时,如果函数是不稳定的)。

您案例中的一个计算工作stream程示例是:

  • 您可以更改第1栏中的音色表单元格。
  • 所有引用数据表的VLOOKUP都将被重新计算。
  • 为更改的单元格启动Worksheet_Change 。 从处理程序中,您修改同一个表的第41或43列。
  • 所有引用数据表的VLOOKUP都将被重新计算。
  • Worksheet_Change为列41/43中更改的单元格激发。 什么也没做。

对于每一行,保存也是如此。

您可以:

  • 如果可能的话,使VLOOKUP看起来不像第41列。 这将消除第二次重算。
  • 切换到手动重新计算。

一些可能性

您的Worksheet_Change更改事件将导致自己的另一个触发器。 它不是太糟糕,因为它testing的单元格是第1列和第41/43列的变化,但值得修复。 可能没有太大的区别。

另外,如果表单“语音”单元格可能会在表单未被激活时通过代码进行更改,您将得到意外的结果。 将表限定符添加到范围调用来解决。

 Private Sub Worksheet_Change(ByVal Target As Range) '43 = ok '41 = NOK 'check if change happened in column A If Target.Column = 1 Then 'check if changed value is X Application.EnableEvents = False ' <-- Add This If Target.Value Like "*x*" Then 'add datestamp if it is Me.Cells(Target.Row, 43).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") ' <--- ' Else <--- don't need this 'End If ' --> change to ElseIf (assuming conditions are mutually exclusive) ElseIf Target.Value Like "*NOK*" Then Me.Cells(Target.Row, 41).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") ' <--- 'Else <--- don't need this End If End If Application.EnableEvents = True ' <-- Add This End Sub 

类似于_BeforeSave – 禁用事件以避免_Change射击

好的,我做了以下的事情,我实现了从创build一个新文件清理它的每个解决scheme,以编辑macros,所以他们不处理不必要的项目(allthough我不使用它了,我仍然复制它未来!)。

我将工作簿分成两个工作簿。 一张工作簿(一张我们总是用的)。 这包含VLOOKUPS,其他function,buttonmacros和2条件格式。 我删除了所有的转储表,并改变了macros的工作方式(button而不是onchange或beforesave)。

第二个文件成为我的疑难解答 这包含我所有的工作表,但没有macros,没有条件格式。 第一个工作簿中的一个工作表仅使用对单元格的引用显示。 此文件仅用于故障排除。

  • 这似乎更有效率
  • 更less的加载时间
  • 崩溃较less(仍然有,但只是偶尔,而不是所有的时间:P)

谢谢大家的时间和精力,希望今后也能帮助到别人。 🙂