一段时间后,Excel停止响应-for循环vba

时间:2015-12-13 17:00:21

标签: excel vba excel-vba for-loop match

当我运行以下代码时,excel会在一段时间后停止响应(5-6秒)

它的作用:

获取e1支票中的值,如果两张wown中的任何一张都存在 如果是,则将e1得到它的值的行移到另一张wr 如果没有找到,那就什么都不做了

Option Explicit

Sub RemoveEmail()
Dim wi, wn, wo, wr As Worksheet
Dim e1
Dim FinalRowI, FinalRowN, FinalRowO, FinalRow
Dim i, j

Set wi = Sheet2
Set wn = Sheet3
Set wo = Sheet4
Set wr = Sheet5

FinalRowI = wi.Range("B1048576").End(xlUp).Row
FinalRowN = wn.Range("C1048576").End(xlUp).Row
FinalRowO = wo.Range("C1048576").End(xlUp).Row

FinalRow = WorksheetFunction.Max(FinalRowN, FinalRowO)

For i = 2 To FinalRowI
e1 = Trim(wi.Range("B" & i).Text)
    For j = 2 To FinalRow
        If Trim(wn.Range("C" & j).Text) = e1 Or Trim(wo.Range("C" & j).Text) = e1 Then
         wi.Cells(i, "A").EntireRow.Cut Destination:=wr.Range("A" & wr.Rows.Count).End(xlUp).Offset(1)
        Else: End If
        Application.CutCopyMode = False
    Next j
Next i

End Sub

1 个答案:

答案 0 :(得分:1)

您不应该检查Range.Text property,除非有一些单元格格式会改变结果。对于文本(电子邮件......?),Range.Value2 property是最有效的。此外,一旦您找到匹配并且 xlCut 该行的原始行,就没有必要继续循环。继续使用下一个值。

destroy()

有关为什么For i = 2 To FinalRowI e1 = Trim(LCase(wi.Range("B" & i).Value2)) 'unless you have formatting you want to check, .Text is inefficient For j = 2 To FinalRow If Trim(lcased(wn.Range("C" & j).Value2)) = e1 Or Trim(LCase(wo.Range("C" & j).Value2)) = e1 Then wi.Cells(i, "A").EntireRow.Cut Destination:=wr.Range("A" & wr.Rows.Count).End(xlUp).Offset(1) Exit For 'you've cut out the row. no need to continue End If 'Application.CutCopyMode = False 'no need for this on a cut Next j Next i 不必要的详细信息,请参阅Should I turn .CutCopyMode back on before exiting my sub procedure?

建议使用原生工作表COUNTIF function切换到此方法。

Application.CutCopyMode = False

MATCH function效率更高,但您必须测试IsError两次(每个工作表一次。