VBA – 当我在这个过程中点击时,macros完成得更快

我有一个这个循环的macros需要很多时间:

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窗口(你知道一个程序运行时,你点击,窗口变成一个白色的模糊屏幕),我点击了大约45s后,我的macros完成…

你有一个想法,为什么? 而如何解决这个有一个更快的macros?

使用直接从工作表批量加载的变体数组。 使用连接函数进行连接( Chr(124)是“pipe道”字符)并将处理后的值一起返回到工作表。

 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 

有时VBA需要处理消息更快。 我真的不知道为什么,但如果我的一些macros的行为像我在循环添加一个DoEvents行之前, Next ,它奇迹。 不推荐用于更复杂的应用程序。 在这里你可以find它的描述: https : //support.office.com/en-us/article/DoEvents-Function-7af41eca-88e0-470d-adaf-0b3d4c2575b0

所以你的代码是:

 DoEvents Next row 

HTH

好吧,我find了解决办法。 实际上,我在代码中有另一个子类:

Private Sub Worksheet_Change(ByVal Target As Range)

每次单元格被修改时,代码都会传递给这个子类。 所以我把一个:

 Application.EnableEvents = False 

在我的代码上,这是工作! 谢谢你的帮助 !

编辑:事实上,问题并没有完全解决…我注意到,保存工作表或修改代码后,代码需要很多时间…你有一个解决scheme?