Vba Excel宏查找文本并从中选择下一行

Vba Excel宏查找文本并从中选择下一行,vba,excel,Vba,Excel,我需要一个宏来查找此文本: “XYZ”和“*报告” 然后选择从XYZ到*报告的行,并删除包括所选内容在内的所有行 我已经做到了: Sub DelWordsCol() Dim c As Range Dim d As Range Dim SrchRng Set SrchRng = ActiveSheet.Range("A1", ActiveSheet.Range("A65536").End(xlUp) Do set c=SrchRng.Fin

我需要一个宏来查找此文本: “XYZ”和“*报告”

然后选择从XYZ到*报告的行,并删除包括所选内容在内的所有行

我已经做到了:

Sub DelWordsCol()

    Dim c As Range
    Dim d As Range
    Dim SrchRng

    Set SrchRng = ActiveSheet.Range("A1", ActiveSheet.Range("A65536").End(xlUp)

    Do
      set c=SrchRng.Find("XYZ", LookIn:=xlValues)
      if not c Is Nothing Then c.EntireRow.Delete
    Loop while Not c Is Nothing

    Do 
      set d=SrchRng.Find("*Report", LookIn:=xlValues)
       if not d Is Nothing Then d.EntireRow.Delete
    Loop while Not c Is Nothing

End Sub
'我不能使用resize,因为从“XYZ”到“*.Report”的行数可以是8或9或任何值。
'我可以删除特定行,但不能删除从“XYZ”到“*Report”的范围。

您的代码不清楚您是否正在查找部分匹配项

Sub DelWordsCol()

    Dim c As Long, d As Long
    Dim strA As String, strB As String

    strA = "XYZ"
    strB = "Report"

    With Worksheets("Sheet4")   '<~~ set this worksheet reference properly!
        With Intersect(.Columns(1), .UsedRange)
            'shift one row down off the header row
            With .resize(.rows.count - 1, 1).offset(1, 0)
                Do While Not IsError(Application.Match(strA, .Cells, 0))
                    c = Application.Match(strA, .Cells, 0)
                    If Not IsError(Application.Match(strB, .Cells.Offset(c, 0), 0)) Then
                        d = Application.Match(strB, .Cells.Offset(c, 0), 0)
                        .Cells(c, 1).Resize(d + 1, 1).EntireRow.Delete
                    Else
                        Exit Do
                    End If
                Loop
            End With
        End With
    End With

End Sub
Sub-DelWordsCol()
尺寸c等于长,d等于长
作为字符串的Dim strA,作为字符串的strB
strA=“XYZ”
strB=“报告”

使用工作表(“Sheet4”)”如果已确定c和d,则只需使用这两个单元格来定义和删除范围:

Option Explicit
Sub DelRange()
    Dim c As Range
    Dim d As Range
    Const lSrchCol As Long = 1 'searching column A

With ActiveSheet.Columns(lSrchCol)
    Set c = .Find(what:="XYZ", LookIn:=xlValues)
    Set d = .Find(what:="*Report", LookIn:=xlValues)
End With

If Not c Is Nothing And Not d Is Nothing Then _
    Range(c, d).EntireRow.Delete

End Sub
如果列中可能有多个XYZ和报表对,则可能需要使用.Find中的一些其他可选参数以增强稳健性

如果有多对,那么您可能需要指定起点,并设置Do。。。循环,当c和d为空时退出


如果有可能在报告之后出现第一个XYZ,您可能还需要检查以确保它们的顺序正确,否则将删除错误的行。

感谢Ron的帮助,但范围在我的数据之间。所以我不能用这个。有人回答了。感谢堆,宏在列A中找到包含XYZ的行;然后是包含报表的下一行;并从下一行中删除所有行,包括下一行。这不是你想要的吗?我的错误应该说清楚。抱歉,新加入论坛。这些是将报表转换为excel后产生的标题。如;单元格A1有“XYZ”单元格A7有“报告”(垃圾)。然后是A8:A15表(良好数据)。A16:A22垃圾数据。等等。。我必须找到从“XYZ”到“Report”之间的行。删除,然后转到下一步。不过非常感谢。现在我有了代码,只是我需要宏离开搜索的第一个实例。然后开始宏。天哪,你是最棒的。在这上面花了很多时间。太完美了。谢谢你!!你能帮我做一件事吗。如果找到XYZ的第一个实例,则转到下一个范围并启动宏。可以让宏忽略找到“XYZ”的第一个实例并转到下一个实例,然后执行宏吗?您应该能够在循环中放置变量类型为
long
的计数器。到目前为止,您尝试了什么?我使用了您的宏原样并有效。因此,strA和StrB设置正确,并且删除它们之间的行。但是我没有头球。因此,宏应该忽略StrA和strB的第一个实例。然后做宏。好的,我想我现在明白了。我将工作区域向下移动了一行以保留标题。