2017-04-20 72 views
1

我目前正在尝试创建一个循环,将查看列C从第5行开始,并比较该列中的每个单元格,直到它到达该列中最后使用的单元格。 每个单元格将检查8个变量,看它是否匹配。如果单元格不匹配任何变量,则必须删除整行。VBA循环遍列来比较每个单元格与变量,并删除该行,如果它不匹配

我现在的尝试是这样的:

Dim AC as long 
Dim LastRow as long 
AC=5 
LastRow= Activesheet.range("A" & Rows.count).end(xlup).row 
For AC = 5 To LastRow 
      With Cells(AC, "C") 
      Do Until Cells(AC, "C").Text = OC1 Or Cells(AC, "C").Text = OC2 Or Cells(AC, "C").Text = OC3 Or Cells(AC, "C").Text = OC4 Or Cells(AC, "C").Text = NC1 Or Cells(AC, "C").Text = NC2 Or Cells(AC, "C").Text = NC3 Or Cells(AC, "C").Text = NC4 
       Rows(AC).EntireRow.Delete 
      Loop 
     End With 
    Next AC 

这应该确保,一旦行已被删除新的一行了它的位置(防爆删除整个行5会导致第6行成为第5行。 )所以它应该在出现匹配时退出Do循环,抓住下一个行号并重复,直到出现另一个匹配。只有代码一直抛出执行中断错误。有人可以告诉我我做错了什么吗?

+0

是否真正产生一个错误,或做它会陷入无限循环? – YowE3K

回答

0

如果您的代码导致无限循环,当你试图杀死无限循环只产生你的错误,你可以使用下面的代码:

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

Dim AC As Long 
Dim LastRow As Long 
AC = 5 
LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
Do While AC <= LastRow 
    If Cells(AC, "C").Text <> OC1 And _ 
     Cells(AC, "C").Text <> OC2 And _ 
     Cells(AC, "C").Text <> OC3 And _ 
     Cells(AC, "C").Text <> OC4 And _ 
     Cells(AC, "C").Text <> NC1 And _ 
     Cells(AC, "C").Text <> NC2 And _ 
     Cells(AC, "C").Text <> NC3 And _ 
     Cells(AC, "C").Text <> NC4 Then 
     Rows(AC).Delete 
     LastRow = LastRow - 1 
    Else 
     AC = AC + 1 
    End If 
Loop 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 

与你目前的方式的问题做事情是这样的,一旦你接近LastRow(假设你已经删除了任何先前的行),你正在查看空行并因此无限删除它们。


或者,当然了,你可以使用删除行的更普遍接受的方式 - 这是在底部开始向上安装:

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

Dim AC As Long 
Dim LastRow As Long 
LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row 
For AC = LastRow To 5 Step -1 
    If Cells(AC, "C").Text <> OC1 And _ 
     Cells(AC, "C").Text <> OC2 And _ 
     Cells(AC, "C").Text <> OC3 And _ 
     Cells(AC, "C").Text <> OC4 And _ 
     Cells(AC, "C").Text <> NC1 And _ 
     Cells(AC, "C").Text <> NC2 And _ 
     Cells(AC, "C").Text <> NC3 And _ 
     Cells(AC, "C").Text <> NC4 Then 
     Rows(AC).Delete 
    End If 
Next 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
+0

LastRow应该计算最后使用的行没有工作表,我相信? 它也立即出错,当我逐步浏览时,它仍然在第一行(第5行) – user7898186

+0

'LastRow'被计算为包含列A中最后一个非空单元格的行。什么错误是代码生成? (它适用于我,但也许我的测试数据和实际数据之间有差异,导致它的问题。) – YowE3K

+0

我交换了我的代码,它似乎现在工作。它必须经历一个疯狂的数据量,所以它需要运行一段时间。你的代码与我的代码相比是非常干净的,但是我仍然觉得我的代码应该已经成功了...哪些不明白为什么我的代码不工作会比我的代码不工作lol – user7898186

相关问题