VBA - 在此过程中点击时,宏完成得更快

时间:2016-05-06 07:38:31

标签: excel vba excel-vba

我有一个带有这个循环的宏,需要花费很多时间:

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秒......

你知道为什么吗?如何解决这个问题以获得更快的宏?

3 个答案:

答案 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

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

编辑:事实上,问题并没有完全解决......我注意到代码在保存工作表之后需要花费很多时间,或者只是在修改代码之后......你有解决方案吗?