【问题标题】:Excel VBA: Delete rows if value not equal to a value?Excel VBA:如果值不等于值则删除行?
【发布时间】:2018-11-21 19:58:26
【问题描述】:

所以我一直在努力寻找为什么我的代码没有工作,但每次我尝试时,我都会得到一个没有任何改变的结果。有人可以告诉我我错过了什么吗?抱歉,我是个新手,但我正在努力。

   Dim Cell As Range

With Sheets(1)
    ' loop column D until last cell with value (not entire column)
    For Each Cell In .Range("D2:D" & .Cells(.Rows.Count, "D").End(xlUp).Row)
        If Cell.Value <> 110 Then
            Rows(Cell.Row).EntireRow.Delete
        End If
    Next Cell
End With

【问题讨论】:

  • 尝试将. 添加到Rows(Cell.Row).EntireRow.Delete
  • 2 件事。如果要删除行,则需要向后遍历集合。此外,您需要完全符合 Rows(Cell.Row).EntireRow.Delete 的要求。
  • 非常抱歉,您能解释一下资格的含义吗?
  • Cell.EntireRow.Delete 会更直接

标签: excel vba


【解决方案1】:

使用excel的内置函数代替循环,更简洁。

With Sheets(1).UsedRange
    .AutoFilter Field:=4, Criteria1:="<>110"
    .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .AutoFilter
End With

如果您坚持循环,请使用以下代码:

With Sheets(1).UsedRange
    For lrow = .Rows.Count To 2 Step -1
        If .Cells(lrow, 4).Value <> 110 Then .Rows(lrow).Delete
    Next lrow
End With

【讨论】:

  • 非常感谢!是的,我会更多地研究内置函数以变得更好,但是这两个代码都运行良好,谢谢。
  • @ElAsado,请注意。您可能需要在此处将 "=110" 更改为 "&lt;&gt;110",因为您的标题和原始帖子建议您删除 D 列不等于 110 的行。但除此之外,我认为您很好。
  • @Reafidy:您可能没有注意到,第一个解决方案会删除第 1 行,而不管内容如何。知道如何解决吗?
【解决方案2】:

未经测试,但可能类似于:

Option explicit

Sub DeleteRows()

With thisworkbook.worksheets(1)
    ' loop column D until last cell with value (not entire column)

Dim lastRow as long
lastRow = .Cells(.Rows.Count, "D").End(xlUp).Row

Dim rowIndex as long
For rowIndex = lastRow to 2 step -1

If .cells(rowIndex, "D").value2 <> 110 then
.cells(rowIndex, "D").entirerow.delete
End if

Next rowIndex

End With

End sub

如果您有很多行,您可以使用union 构建一个包含所有要删除的行的范围,然后一次性删除它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2017-11-24
    相关资源
    最近更新 更多