我今天早上来上班,开始处理我昨天离开的同一个档案。现在,只要宏为单元格指定值或清除它们,Excel就会慢下来。在我离开之前它很快就闪电了,现在一次需要2-3秒才能为一个单元格赋值。
现在,具有类似宏的其他文件运行正常。这发生在另一个文件一段时间后,所以我恢复到该文件的先前版本,它工作正常,而慢文件继续工作缓慢。我想我现在可以做到这一点,但在这种情况下,需要花费大量工作才能将该文件带到我拥有此版本的位置。我想知道是否有人知道可能会发生什么。这是Excel文件不时做的事情之一(就像一种文件损坏),还是有修复?
我已经提供了下面的宏,尽管只要将值分配给单元格,它就会在整个文件中发生。我通过表示<---SLOW HERE
来标记故障区域。
我知道这听起来很模糊,我知道我很少继续下去。也许信息不足,但这就是我的全部。没有理由(我可以看到)这应该发生。我甚至重新启动了计算机......以防万一问题出在Excel外部。没有变化。
如果您需要更多信息,我会尽力说明,如果可以的话。感谢您的帮助和理解。
示例宏:
Sub DeleteButton1_Click()
Call UnlockSettingsWorksheet
Sheet24.Range("C18:E18").Value = "" <---SLOW HERE
Dim i As Long
For i = 18 To 21
Sheet24.Range("C" & i & ":E" & i).Value = Sheet24.Range("C" & i + 1 & ":E" & i + 1).Value <---SLOW HERE
Next
Sheet24.Range("C22:E22").Value = "" <---SLOW HERE
Call LockSettingsWorksheet
End Sub
答案 0 :(得分:0)
正如评论中所提到的,可能有很多因素导致了这种变化:
在这些事件中触发的任何操作:
外部链接,以及移动或删除的外部文件
如果文件已损坏,并且可行,请尝试从头开始重新创建,然后先运行此功能
如果它没有损坏,我尝试的第一件事就是在宏之前禁用所有Excel功能:
Sub DeleteButton1_Click()
'UnlockSettingsWorksheet
FastWB '<--- Disables all Application and Worksheet level settings
With ThisWorkbook.Worksheets("Sheet24") 'Fully qualified worksheet
.Range("C18:E18").Value2 = vbNullString
Dim i As Long
For i = 18 To 21
.Range("C" & i & ":E" & i).Value2 = .Range("C" & (i + 1) & ":E" & (i + 1) ).Value2
Next
.Range("C22:E22").Value2 = vbNullString
End With
XlResetSettings '<--- Restores all Excel settings to defaults
'LockSettingsWorksheet
End Sub
Public Sub FastWB(Optional ByVal opt As Boolean = True)
With Application
.Calculation = IIf(opt, xlCalculationManual, xlCalculationAutomatic)
.DisplayAlerts = Not opt
.DisplayStatusBar = Not opt
.EnableAnimations = Not opt
.EnableEvents = Not opt
.ScreenUpdating = Not opt
End With
FastWS , opt
End Sub
Public Sub FastWS(Optional ByVal ws As Worksheet, Optional ByVal opt As Boolean = True)
If ws Is Nothing Then
For Each ws In Application.ThisWorkbook.Sheets
OptimiseWS ws, opt
Next
Else
OptimiseWS ws, opt
End If
End Sub
Public Sub OptimiseWS(ByVal ws As Worksheet, ByVal opt As Boolean)
With ws
.DisplayPageBreaks = False
.EnableCalculation = Not opt
.EnableFormatConditionsCalculation = Not opt
.EnablePivotTable = Not opt
End With
End Sub
Public Sub XlResetSettings() 'default Excel settings
With Application
.Calculation = xlCalculationAutomatic
.DisplayAlerts = True
.DisplayStatusBar = True
.EnableAnimations = False
.EnableEvents = True
.ScreenUpdating = True
Dim ws As Worksheet
For Each ws In Application.ThisWorkbook.Sheets
With ws
.DisplayPageBreaks = False
.EnableCalculation = True
.EnableFormatConditionsCalculation = True
.EnablePivotTable = True
End With
Next
End With
End Sub
这可能会消除一些VBA原因
答案 1 :(得分:0)
我开始注意到Range.Value = ...
的操作在升级到64位版本后非常慢。除了.ScreenUpdating
和.Calculation
之类的常规内容之外,我发现还有两件事可以显着提高速度:
在操作之前将光标更改为xlWait
,完成后将其更改为xlDefault
。
Public Sub MyMacro()
On Error Goto Exception
Application.Cursor = xlWait
' Do something here.
Exception:
Application.Cursor = xlDefault
End Sub
使用.Value2
代替.Value
Sheet1.Range("A1").Value2 = "The quick brown fox jumps over the lazy dog."