Excel VBA 在整列中查找文本

Excel VBA Looking for Text in a Whole Column

我有以下代码可以在 "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:$I2754").AutoFilter Field:=9
    Sheets("OUTPUT").Select
End If
MsgBox "Sanity Check performed. " & Format(Now, "mmmm d, yyyy hh:mm AM/PM")
End Sub

非常感谢大家

报错,因为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.

我相信以下内容应该对您有所帮助,您应该尽量避免使用 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:$I$" & LastRow).AutoFilter Field:=9
    End If
    MsgBox "Sanity Check performed. " & Format(Now, "mmmm d, yyyy hh:mm AM/PM")
End Sub

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

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