Excel VBA查找匹配值的行号

Cat*_*ogs 5 excel vba excel-vba

我一直在尝试几种不同的方法来查找bingo(由星号列出和分隔)的行号,但似乎都没有.我究竟做错了什么?在所有情况下,我都试过寻找Bingo和"Bingo".

Sub Find_Bingo()

Dim wb As Workbook
Dim ws As Worksheet
Dim FoundCell As Range
Set wb = ActiveWorkbook
Set ws = ActiveSheet

    Const WHAT_TO_FIND As String = "Bingo"

    Set FoundCell = ws.Range("A").Find(What:=WHAT_TO_FIND)
    If Not FoundCell Is Nothing Then
        MsgBox (WHAT_TO_FIND & " found in row: " & FoundCell.Row)
    Else
        MsgBox (WHAT_TO_FIND & " not found")
    End If

'************

    With Sheet1
        Set FoundCell = Cells.Find(What:=Bingo, After:=.Cells(1, 1), _
 LookIn:=xlValues, lookat:= xlPart, SearchOrder:=xlByRows, _ 
 SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    End With

'************

Set FoundCell = Sheets("Sheet1").Columns("E").Find(Bingo, ActiveSheet.Cells(2, 2), LookIn:=xlValue, lookat:=xlWhole)

'************

FoundCell = Range("A:M").Find(Bingo)

'************

FoundCell = Application.WorksheetFunction.Match(Bingo, Range("A1:A200"), 0)

'************

FoundCell = Worksheets("Sheet1").Columns(1).Find(Bingo).Row

'************

Range("A:A").Find(Bingo, Range("A1")).Row

'************

ActiveWorkbook.Worksheets("Sheet1").Columns(1).Find(Bingo).Select

'************
End Sub
Run Code Online (Sandbox Code Playgroud)

Sou*_*ire 15

对于您的第一个方法更改ws.Range("A")为ws.Range("A:A")将搜索列的全部,就像这样:

Sub Find_Bingo()

        Dim wb As Workbook
        Dim ws As Worksheet
        Dim FoundCell As Range
        Set wb = ActiveWorkbook
        Set ws = ActiveSheet

            Const WHAT_TO_FIND As String = "Bingo"

            Set FoundCell = ws.Range("A:A").Find(What:=WHAT_TO_FIND)
            If Not FoundCell Is Nothing Then
                MsgBox (WHAT_TO_FIND & " found in row: " & FoundCell.Row)
            Else
                MsgBox (WHAT_TO_FIND & " not found")
            End If
End Sub
Run Code Online (Sandbox Code Playgroud)

对于第二种方法,您使用的Bingo是变量而不是字符串文字.这是我添加Option Explicit到所有代码模块顶部的一个很好的例子,因为当你尝试运行代码时,它将引导你到这个未定义的"变量",而不是一个变量.

此外,当您使用时,With...End With您需要一段时间.才能参考Cells,所以Cells应该是.Cells.这模仿了正常的限定行为(即Sheet1.Cells.Find ..)

更改Bingo到"Bingo"和改变Cells,以.Cells

With Sheet1
        Set FoundCell = .Cells.Find(What:="Bingo", After:=.Cells(1, 1), _
        LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    End With

If Not FoundCell Is Nothing Then
        MsgBox ("""Bingo"" found in row " & FoundCell.Row)
Else
        MsgBox ("Bingo not found")
End If
Run Code Online (Sandbox Code Playgroud)

更新

在我的

With Sheet1
    .....
End With
Run Code Online (Sandbox Code Playgroud)

该Sheet1指工作表的代号,工作表本身不是名称.例如,假设我打开一个新的空白Excel工作簿.默认工作表就是Sheet1.我可以在代码中引用代码名称,Sheet1或者我可以用索引引用它Sheets("Sheet1").使用代号的优点是,如果更改工作表的名称,它不会更改.

继续这个例子,假设我改名Sheet1为Data.使用Sheet1将继续工作,因为代码名称不会更改,但现在使用Sheets("Sheet1")将返回错误,并且该语法必须更新为工作表的新名称,因此它需要Sheets("Data").

在VB编辑器中,您会看到如下内容:

代码对象资源管理器示例

请注意,即使我将名称更改为Data,仍然有一个Sheet1左侧.这就是我所说的代号.

该Data工作表可以通过两种方式进行引用:

Debug.Print Sheet1.Name
Debug.Print Sheets("Data").Name
Run Code Online (Sandbox Code Playgroud)

两者都应该回归 Data

有关工作表代码名称的更多讨论,请参见此处.