我的宏在一定程度的迭代后冻结

时间:2015-05-25 19:39:58

标签: excel vba excel-vba excel-2010

我有一个宏来检查列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

谢谢

1 个答案:

答案 0 :(得分:2)

正如您所注意到的,它实际上并未冻结。只是Excel无法及时更新屏幕以及用#34轰炸它,并且活动表上的内容发生了变化。事件,并且在某一时刻它放弃并让宏完成而不必担心刷新 - 至少我是如何理解它的(可能不是完全什么& #39; s继续)。

试试这个:

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