【问题标题】:Deleting rows having a specific value in a specific column删除特定列中具有特定值的行
【发布时间】:2011-07-29 13:10:04
【问题描述】:
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!

我认为这可能是原因,但我该如何弥补呢?如何使我的代码正常工作?我有一个 Q 列,其中包含 1,2 个值。 Q列有2的行必须删除,我是说整行。

【问题讨论】:

  • 我无法重现该错误。当程序停止进入您的问题时,您能否编辑i 的值?
  • 你的测试数据最后一行的Q列有2吗?

标签: vba excel


【解决方案1】:

如果第 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

【讨论】:

  • 向后循环很棒。 ^^ 不错的答案!
【解决方案2】:

在大型工作表中循环遍历每一行可能会很耗时。尝试使用 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

【讨论】:

    最近更新 更多