我们有一个工作簿,我们与5个用户共享并持续使用。我们有大约1800条记录和26列数据。数据是VLOOKUPS,标准值的混合。我有3个宏运行和2个条件格式规则和5个带dumpdata的表(一个包含17K记录和40列数据)。
我们已尝试删除所有不需要的额外功能,并将其替换为标准文字,但我们没有发现差异。
工作簿不断崩溃,即使我们不触摸它,只是在里面点击它,它会冻结,可能需要10分钟才能再次使用。我还注意到它占用了相当多的资源(CPU有时会达到100%)并且当你保存它时会使用100%的CPU。
有没有人对如何加速我们的工作簿或至少阻止文件崩溃有所了解? :)
在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
当前状态:阅读我的回答。
答案 0 :(得分:2)
Excel公式在其参数更改时重新计算(或者当任何单元格更改时,如果函数是不稳定的),则重新计算。
您的案例中的示例计算工作流程将是:
VLOOKUP
。Worksheet_Change
。从处理程序中,修改同一表的第41或43列。VLOOKUP
。Worksheet_Change
。什么都不做。对于每一行的保存也是如此。
你可以:
VLOOKUP
看起来不如第41列。这将消除第二次重新计算。答案 1 :(得分:2)
几种可能性
您的Worksheet_Change
更改事件将导致另一个触发器。它不是太糟糕,因为它测试的细胞是第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
触发
答案 2 :(得分:1)
好的,我做的是以下内容,我实现了每个人的解决方案,从创建一个新文件到清理它来编辑宏,所以他们不会处理不必要的项目(尽管我有点不喜欢和#39 ;再使用它,我仍然将它复制到未来!)。
我将工作簿分成两个工作簿。一张工作簿,一张(我们经常使用的一张)。这包含VLOOKUPS,其他功能,按钮宏和2条件格式。我删除了所有转储页并更改了宏的工作方式(按钮而不是onchange或beforesave)。
第二个文件成了我的疑难解答文件。这包含我的所有工作表,但没有宏,没有条件格式。仅使用对单元格的引用显示第一个工作簿中的一个工作表。此文件仅用于故障排除。
感谢大家的时间和精力,我希望这也能帮助将来的人们。 :)