【问题标题】:Delete Specific rows in Excel删除 Excel 中的特定行
【发布时间】:2014-09-16 13:49:20
【问题描述】:

我想创建一个 for 循环来检查我拥有的工作表中的所有行,并希望此代码能够删除某些列中包含指定内容的行(即,如果列 K 包含“June”删除该行。有没有办法对此进行编码?

*编辑 我有代码可以在一列中搜索条件,但现在我需要它来根据两列中的数据搜索和删除行。即如果K列的数据匹配单元格AJ1(已经有)并且J列的数据匹配AK1,则删除这些行。

我的代码是这样的:

Sub DeleteRows()

Sheets("Sheet1").Select
Dim rFind As Range
Dim rDelete As Range
Dim strSearch As String
Dim iLookAt As Long
Dim bMatchCase As Boolean

strSearch = Range("AJ1")


iLookAt = xlWhole
bMatchCase = False

Set rDelete = Nothing

Application.ScreenUpdating = False

With Sheet1.Columns("K:K")

    Set rFind = .Find(strSearch, LookIn:=xlValues, LookAt:=iLookAt, SearchDirection:=xlPrevious, MatchCase:=bMatchCase)
    If Not rFind Is Nothing Then
        Do
            Set rDelete = rFind
            Set rFind = .FindPrevious(rFind)
            If rFind.Address = rDelete.Address Then Set rFind = Nothing
            rDelete.EntireRow.Delete
        Loop While Not rFind Is Nothing
    End If
End With
Application.ScreenUpdating = True

结束子

【问题讨论】:

  • 是的,有办法。尝试编写它,然后返回您的代码并描述您遇到的任何问题。或者尝试在此处搜索已经提出和回答的许多类似问题:stackoverflow.com/search?q=vba+delete+rows

标签: excel delete-row vba


【解决方案1】:

作为一般经验法则,您应该尽可能避免在 Excel VBA 中循环遍历单元格。循环单元格是slow and inefficient。考虑到您的程序范围,这可能无关紧要,但这是需要考虑的事情。如果您是 VBA 编程新手,那么尽早养成良好习惯尤为重要。

这是一个解决方案,使用Range.Find 方法 (MSDN reference) 收集要删除的行范围,然后在一个语句中将它们全部删除。

Sub DeleteRows()

    Dim rngResults As Range, rngToDelete As Range
    Dim strFirstAddress As String

    With Worksheets("Sheet1").UsedRange 'Adjust to your particular worksheet

        Set rngResults = .Cells.Find(What:="June") 'Adjust what you want it to find
        If Not rngResults Is Nothing Then

            Set rngToDelete = rngResults

            strFirstAddress = rngResults.Address

            Set rngResults = .FindNext(After:=rngResults)

            Do Until rngResults.Address = strFirstAddress
                Set rngToDelete = Application.Union(rngToDelete, rngResults)
                Set rngResults = .FindNext(After:=rngResults)
            Loop

        End If

    End With

    If Not rngToDelete Is Nothing Then rngToDelete.EntireRow.Delete

    Set rngResults = Nothing

End Sub

【讨论】:

  • 如果我希望删除的内容被引用到一个单元格(六月在单元格 AJ1 中)并且我将它插入到代码中,它不起作用。这是为什么呢?
  • 我有点困惑。如果您希望在工作表“Sheet1”上删除包含“June”的行,这应该 这样做(我对其进行了测试,它似乎工作正常)。我不完全知道“如果我希望删除的内容被引用到单元格”是什么意思。您想通过单元格引用而不是值进行搜索?我们可能需要将lookin:=xlValues 添加到.Cells.Find(What:="June")
  • 抱歉,措辞不佳。我希望宏在单元格包含单元格 AJ1 中的值时删除行,而不是“六月”。
  • 您应该能够将.Cells.Find(What:="June") 更改为.Cells.Find(What:="AJ1", LookAt:=xlPart, LookIn:=xlFormulas)。这将搜索单元格的公式并查找对 AJ1 的任何引用,如果存在对 AJ1 的引用,则该行将被标记为删除。我在这里假设您正在使用公式并以某种方式引用单元格 AJ1 来获取该值。
【解决方案2】:

这将处理 24000 行, 进行调整以满足您的需求:

Sub RowKiller()
    Dim K As Range, rKill As Range
    Set K = Range("K2:K4000")
    Set rKill = Nothing
    For Each r In K
        v = r.Text
        If InStr(1, v, "June") > 0 Then
            If rKill Is Nothing Then
                Set rKill = r
            Else
                Set rKill = Union(r, rKill)
            End If
        End If
    Next r

    If Not rKill Is Nothing Then
        rKill.EntireRow.Delete
    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多