Excel VBA在整个列中查找文本

时间:2018-07-20 07:51:26

标签: excel vba excel-vba excel-2010

我有以下代码可在“ I”列中找到短语“ Please Review”,如果找不到显示消息,则必须运行其余代码,但不喜欢我的IF代码:

Sub OUTPUT()

    Sheets("OUTPUT").Select
    If Range("a2").Value < 1 Then
    Else
    Range("A2:I" & Range("A1").End(xlDown).Row + 1).ClearContents
    End If
    Sheets("SF Data").Select
    If Range("I2:I192754").Value <> "Please Review" Then
    MsgBox "Nudda"
    Else
    Columns("A:I").Select
    Selection.AutoFilter
    Range("I2").Select
    ActiveSheet.Range("A1:I" & Range("A1").End(xlDown).Row + 1).AutoFilter Field:=9, Criteria1:= _
        "Please Review"
    Range("A2:I" & Range("A1").End(xlDown).Row + 1).Select
    Selection.SpecialCells(xlCellTypeVisible).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("OUTPUT").Select
    Range("A2").Select
    ActiveSheet.Paste
    Sheets("SF Data").Select
    ActiveSheet.Range("$A$1:$I$192754").AutoFilter Field:=9
    Sheets("OUTPUT").Select
End If
MsgBox "Sanity Check performed. " & Format(Now, "mmmm d, yyyy hh:mm AM/PM")
End Sub

非常感谢你们

3 个答案:

答案 0 :(得分:3)

我相信以下内容可以为您提供帮助,您应该避免使用Select&Activate语句,也要声明工作表中的代码更易读,找到我使用Find方法并将结果分配给Range变量的字符串看看是否发现任何东西:

Sub OUTPUT()
Dim wsOut As Worksheet: Set wsOut = Sheets("OUTPUT")
Dim wsSF As Worksheet: Set wsSF = Sheets("SF Data")
'Declare and set the worksheets you are working with
Dim FoundPlease As Range
Dim LastRow As Long

    If wsOut.Range("A2").Value > 1 Then wsOut.Range("A2:I" & wsOut.Range("A1").End(xlDown).Row + 1).ClearContents
    'Clear contents if A2 > 1
    LastRow = wsSF.Cells(wsSF.Rows.Count, "I").End(xlUp).Row
    'find the last row with data on Column I in SF Data
    Set FoundPlease = wsSF.Range("I2:I" & LastRow).Find(What:="Please Review", LookAt:=xlWhole)
    'Search for "Please Review" on Column I in SF Data

    If FoundPlease Is Nothing Then 'if not found
        MsgBox "Nudda"
    Else 'if found
        wsSF.Cells.AutoFilter
        wsSF.Range("A1:I" & wsSF.Range("A1").End(xlDown).Row + 1).AutoFilter Field:=9, Criteria1:="Please Review"
        wsSF.Range("A2:I" & wsSF.Range("A1").End(xlDown).Row + 1).SpecialCells(xlCellTypeVisible).Copy
        wsOut.Range("A2").PasteSpecial xlPasteAll
        wsSF.Range("$A$1:$I$" & LastRow).AutoFilter Field:=9
    End If
    MsgBox "Sanity Check performed. " & Format(Now, "mmmm d, yyyy hh:mm AM/PM")
End Sub

答案 1 :(得分:1)

出现错误,因为Range("I2:I192754").Value <> "Please Review"有点非法。如果要检查范围中的一个单元格中是否存在字符串“ Please Review”,则可以考虑使用=CountIf()函数:

Sub TestMe()

    If WorksheetFunction.CountIf(Range("I2:I192754"), "Please Review") > 0 Then
        Debug.Print WorksheetFunction.CountIf(Range("I2:I192754"), "Please Review")
    End If

End Sub

稍后,您可以看看这个主题-How to avoid using Select in Excel VBA

答案 2 :(得分:1)

一种方法是分别检查每个单元格:

Dim TextFound As Boolean

TextFound=False

For Each cell In Range("I2:I192754")
    If cell.value="Please Review" Then
        TextFound=True
        Exit For
    End If
Next

If TextFound Then
    ...
Else
    ...
End IF
相关问题