我的宏在未定义的迭代次数后冻结

My macro freezes after an undefined amount of iterations

我有一个宏,用于检查 Q 列中的某些名称是否出现在 A 列(按字母顺序排列)中,如果出现,则将它们打印在 S 列中。但是,每次我 运行 它都会在未定义的迭代次数(永远不会在相同的迭代次数)后冻结,所以很难知道发生了什么。如果我 运行 它有一个断点并在每次迭代时按 F5 它不会冻结,问题是我有成千上万的名字要比较而且我真的不想按 F5 很多次。

这是我的代码:

Sub test()
    Range("Q2").Select
    analizados = 0
    falsos = 0
    Do Until IsEmpty(ActiveCell)
        id1 = ActiveCell.Value
        primera = Left(id1, 1)
        Range("A2").Select
        Do While Not ActiveCell.Value Like "" & primera & "*"
            ActiveCell.Offset(1, 0).Select
        Loop
        Do While ActiveCell.Value Like "" & primera & "*"
            If id1 = ActiveCell.Value Then
                Range("S2").Select
                ActiveCell.Offset(falsos, 0).Select
                ActiveCell.Value = id1
                falsos = falsos + 1
                Exit Do
            End If
            ActiveCell.Offset(1, 0).Select
        Loop
        analizados = analizados + 1
        Range("Q2").Select
        ActiveCell.Offset(analizados, 0).Select
    Loop
End Sub

谢谢

如您所见,它实际上并没有冻结。只是 Excel 跟不上你用 "something has changed on the active sheet" 事件轰炸它的速度来更新屏幕,并且在某一时刻它 放弃了 并让宏完成而不用刷新 - 至少我是这样理解的(可能 完全 虽然发生了什么)。

试试这个:

Sub Test()
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    '...
    '(rest of your code)
    '...

CleanExit:
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox Err.Description
    Resume CleanExit
End Sub

基本上你会告诉 Excel 在你完成之前不要费心重绘:这会大大加快你的循环。

您可能还想将此与 Application.CalculationApplication.Cursor 的不同设置结合起来;为了更好的用户体验,您可以使用状态栏告诉用户稍等一下:

Sub Test()
    On Error GoTo ErrHandler
    Application.StatusBar = "Please wait..."
    Application.ScreenUpdating = False
    '...

    '...
CleanExit:
    Application.StatusBar = False
    Application.ScreenUpdating = True
    Exit Sub