我有一个宏来检查列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
谢谢
答案 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.Calculation
和Application.Cursor
的不同设置结合使用;为了更好的用户体验,您可以使用状态栏告诉用户稍等一下:
Sub Test()
On Error GoTo ErrHandler
Application.StatusBar = "Please wait..."
Application.ScreenUpdating = False
'...
'...
CleanExit:
Application.StatusBar = False
Application.ScreenUpdating = True
Exit Sub