2011-07-29 442 views
3
Sub main() 
    Dim count As Integer 
    Dim i As Integer 
    count = Range("Q" & Rows.count).End(xlUp).Row 
    MsgBox count 
    For i = 2 To count 
     If Cells(i, "Q").Value = 2 Then 
      Sheets(1).Rows(i).EntireRow.Delete 
     End If 
    Next i 
End Sub 

为什么代码不能马上工作?当我执行在Excel上面VBA代码,它删除某些行,然后用这条消息出来出来:删除特定列中具有特定值的行

run time error 13 

这是什么意思?有时候,我得到这个消息:

type mismatch 

在上面的VBA代码,我想删除其Q列值是2行,但它不工作。你能让我知道错误在哪里吗?

让我告诉你发生了什么。该代码工作,但它删除某些行,并与运行时错误13.中止当我打开我的EXCEL文件中看到的Q柱,我观察到的是,一些Q柱的行了#REF!

我想这可能是原因,但我怎么做了呢?我如何让我的代码正常工作?我有一个由1,2个值组成的Q列。其中有2个的Q列的行必须删除,我的意思是整行。

+1

我无法重现错误。当程序停止进入你的问题时,你可以编辑'i'的值吗? – Jacob

+0

您的测试数据的最后一行在Q列中是否有2个? – James

回答

1

在大工作表中循环遍历每行可能非常耗时。尝试使用find方法。同时关闭屏幕更新。

Sub HTH() 
    Dim rCell As Range 
    Dim strAddress As String 

    Application.ScreenUpdating = False 

    With ActiveSheet.Columns("Q") 
     Set rCell = .Find(What:=2, LookIn:=xlValues, SearchOrder:=xlByColumns) 

     If Not rCell Is Nothing Then 
      Do 
       strAddress = rCell.Address 
       rCell.EntireRow.Delete 
       Set rCell = .FindNext(Range(strAddress)) 
      Loop Until rCell Is Nothing 
     End If 

    End With 

    Application.ScreenUpdating = True 

End Sub 
2

如果列#10 = = 2,那么你删除列#10;在循环的下一次迭代中,您将检查行#11,该行现在具有行#12的值,因为它在删除后向上移动,这意味着您可以跳过正在删除行下面的任何行。

你可能要循环向后;

Sub main() 
    Dim count As Integer 
    Dim i As Integer 
    '//assuming all filled rows from Q2 downwards? 
    count = Range("Q2").End(xlDown).Row 

    For i = count To 2 Step -1 
     If Cells(i, "Q").Value = 2 Then 
      Sheets(1).Rows(i).EntireRow.Delete 
     End If 
    Next i 
End Sub 
+0

向后循环很棒。 ^^很好的答案! – aevanko

相关问题