我的macros在未定义的迭代之后冻结

我有一个macros,检查列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无法跟上更新屏幕的速度,因为你正在用“有效表单上的某些事情已经改变”来轰炸屏幕,并且一度放弃并让macros完成而不用担心刷新 -至less这就是我的理解(可能不完全是这样)。

尝试这个:

 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