我的宏在未定义的迭代次数后冻结
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.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
我有一个宏,用于检查 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.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