我有一个带有这个循环的宏,需要花费很多时间:
Dim tempval As String
Dim row As Integer, col As Integer
Application.ScreenUpdating = False
For row = 2 To 500 Step 1
tempval = ""
For col = 7 To 15 Step 1
tempval = tempval & Cells(row, col).Value
Cells(row, col).Value = ""
Next col
Cells(row, 7).Value = tempval
For col = 8 To 16 Step 1
tempval = tempval & Cells(row, col).Value
Cells(row, col).Value = ""
Next col
Cells(row, 8).Value = tempval
Next row
Application.ScreenUpdating = True
Range("LibAnglais2:LibAnglais9").Select
Selection.Delete Shift:=xlToLeft
Range("LibFrancais2:LibFrancais9").Select
Selection.Delete Shift:=xlToLeft
在此循环之前和之后都有代码。 使用此循环,代码需要3分钟才能结束。没有,需要30秒。 但是当我在循环期间点击excel窗口时(你知道程序运行时,你点击,窗口变成了白色模糊屏幕),点击后我的宏完成了约45秒......
你知道为什么吗?如何解决这个问题以获得更快的宏?
答案 0 :(得分:1)
有时VBA需要更快地处理消息。我真的不知道为什么,但如果我的一些宏行为像我那样在DoEvents
之前的循环中添加一个Next
行并且它确实奇迹。不建议用于更复杂的应用程序。您可以在此处找到对它的说明:https://support.office.com/en-us/article/DoEvents-Function-7af41eca-88e0-470d-adaf-0b3d4c2575b0
所以你的代码是:
DoEvents
Next row
HTH
答案 1 :(得分:1)
直接从工作表中处理批量加载的变量数组。使用Join Function进行连接(Chr(124)
是'pipe'字符)并将处理后的值返回到工作表 en masse 。
Option Explicit
Sub sonic()
Dim r As Long, vTMPs() As Variant, vVALs() As Variant
Application.ScreenUpdating = False
Application.EnableEvents = True
Application.Calculation = xlCalculationManual
With Worksheets("Sheet1")
vTMPs = .Range("G2:P500").Value2
ReDim vVALs(LBound(vTMPs, 1) To UBound(vTMPs, 1), LBound(vTMPs, 2) To 2)
For r = LBound(vVALs, 1) To UBound(vVALs, 1)
vVALs(r, 1) = Join(Array(vTMPs(r, 1), vTMPs(r, 2), vTMPs(r, 3), vTMPs(r, 4), _
vTMPs(r, 5), vTMPs(r, 6), vTMPs(r, 7), vTMPs(r, 8)), Chr(124))
vVALs(r, 2) = Join(Array(vTMPs(r, 2), vTMPs(r, 3), vTMPs(r, 4), vTMPs(r, 5), _
vTMPs(r, 6), vTMPs(r, 7), vTMPs(r, 8), vTMPs(r, 9)), Chr(124))
Next r
.Range("G2:P500").ClearContents
.Range("G2").Resize(UBound(vVALs, 1), UBound(vVALs, 2)) = vVALs
Application.ScreenUpdating = True
'I don't know what the following is supposed to do
.Range("LibAnglais2:LibAnglais9").Delete Shift:=xlToLeft
.Range("LibFrancais2:LibFrancais9").Delete Shift:=xlToLeft
End With
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub
答案 2 :(得分:0)
好的伙计们,所以,我找到了解决方案。 事实上,我的代码中有另一个子:
Private Sub Worksheet_Change(ByVal Target As Range)
每次修改单元格时代码都会传递给此子代码。 所以我提出了一个:
Application.EnableEvents = False
在我的代码上,它的工作! 谢谢你的帮助!
编辑:事实上,问题并没有完全解决......我注意到代码在保存工作表之后需要花费很多时间,或者只是在修改代码之后......你有解决方案吗?