根据搜索键 VBA 删除行

Posted

技术标签:

【中文标题】根据搜索键 VBA 删除行【英文标题】:Delete Row based on Search Key VBA 【发布时间】:2012-11-28 21:47:31 【问题描述】:

我正在尝试使用 VBA 删除在 B 列中找到值“X”的 每一 行。但是,我遇到了三个问题:

    我无法使用 cells.find 方法让我的 VBA 代码从活动单元格向下移动到下一个单元格 (B3)(请参见下面的代码) 我的代码不会删除在 B 列中找到值“X”的整行 B 列中的数据量可能会有所不同:它可以在今天的 B10 或明天的 B100 结束(参见下面的屏幕截图)

我们将不胜感激。

Sub RemoveRows()   
    Dim strLookFor As String
    Dim strRow As String

    Worksheets("Sheet1").Range("B2").Activate

    strLookFor = "X"
    strRow = Range("B2").Address

    Do Until ActiveCell.Value = ""        
        MsgBox (ActiveCell.Value)        
        If ActiveCell.Value = strLookFor Then
            Rows.Delete (strRow)
        End If            
        strRow = Cells.Find(what:=strLookFor).Address
    Loop

    MsgBox ("Deleted all rows with value " & strLookFor)    
End Sub

【问题讨论】:

【参考方案1】:

使用AutoFilter 比范围循环更有效

Sub QuickCull()
Dim ws As Worksheet
Dim rng1 As Range
Set ws = Sheets("Sheet1")
Set rng1 = ws.Range(ws.[b2], ws.Cells(Rows.Count, "B").End(xlUp))
Application.ScreenUpdating = False
With ActiveSheet
        .AutoFilterMode = False
        rng1.AutoFilter Field:=1, Criteria1:="X"
        rng1.Offset(1, 0).EntireRow.Delete
        .AutoFilterMode = False
    End With
Application.ScreenUpdating = True
End Sub

【讨论】:

自动过滤器非常有趣。我现在正在研究它。非常感谢! 我对这个主题真的很陌生;你能解释一下这两行是做什么的吗? 1- Set rng1 = ws.Range(ws.[b2], ws.Cells(Rows.Count, "B").End(xlUp)) 和 2- rng1.Offset(1, 0).EntireRow.Delete @Zeinab Abbasi :即使已经很晚了,它也可以帮助其他人:Set rng1 = ws.Range(ws.[b2], ws.Cells(Rows.Count, "B").End(xlUp)) 正在指定从 B2 到 B 中最后一行的范围...Rows.Count, "B").End(xlUp) 计算列中的行B. 由于中间可能有空行,因此建议从下向上开始计数以获取最后使用的行。 Offset 说:保留标题 Row(1) 但除此之外,删除符合条件的整行。 (手动点击一个过滤器,将可见的过滤器限制为该过滤器并选择其余的,然后点击 DEL )希望有所帮助。 @AnyOneElse 很好的澄清 - 我错过了最初的后续查询 @AnyOneElse,绝对为时已晚:D;但感谢您的回复。你真是太好了! :)【参考方案2】:
dim x as long
dim r as long
dim sht as worksheet

set sht = Worksheets("Sheet1")
r = sht.Cells(rows.count,2).end(xlup).row 

for x = r to 2 step -1
    with sht.cells(x,2)
        if .value = "X" then .entirerow.delete
    end with 
next x

【讨论】:

【参考方案3】:

这应该可行:

Sub DeleteRowsWithX()

maxRow = ActiveSheet.UsedRange.Rows.Count

For i = 1 To maxRow
    Do While (StrComp(ActiveSheet.Cells(i, 2).Text, "X", vbTextCompare) = 0)
        Rows(i).Select
        Selection.Delete Shift:=xlUp
   Loop
Next

End Sub

【讨论】:

我建议在行中倒退。正如您现在拥有的那样,如果有 2 行连续的行中包含 X,它将丢失 这将无法正常工作。如果有连续的行带有“X”,那么它将跳过删除每隔一个。 感谢您的提示。已更正

以上是关于根据搜索键 VBA 删除行的主要内容,如果未能解决你的问题,请参考以下文章

excel vba 实现跨表单(sheet) 搜索 - 显示搜索行记录搜索历史

点击搜索框时会自动弹出以前的搜索历怎么才能删除 按DEl键不行360清除也不行 修改win7资源管理器也不行

VBA搜索值并从列表中删除(for循环太慢)

如何在VBA中的用户窗体上使用组合框和文本框来搜索和查找活动Excel电子表格中的数据?

linux命令

Excel VBA 根据某些遭遇删除行