对于您的第一次方法更改ws.Range("A")
to ws.Range("A: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
对于第二种方法,您正在使用Bingo
作为变量而不是字符串文字。这是我为什么添加的一个很好的例子Option Explicit
到我所有代码模块的顶部,因为当您尝试运行代码时,它会引导您到这个“变量”,它是未定义的,根本不打算成为变量。
此外,当您使用With...End With
你需要一段时间.
在你参考之前Cells
, so Cells
应该.Cells
。这模仿了正常的限定行为(即 Sheet1.Cells.Find..)
Change Bingo
to "Bingo"
并改变Cells
to .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
Update
In my
With Sheet1
.....
End With
The Sheet1
指工作表的代码名称,而不是工作表本身的名称。例如,假设我打开一个新的空白 Excel 工作簿。默认工作表只是Sheet1
。我可以在代码中引用它,代码名称为Sheet1
或者我可以用索引来引用它Sheets("Sheet1")
。使用代号的优点是,即使更改工作表的名称,代号也不会改变。
继续这个例子,假设我重命名了Sheet1
to Data
。使用Sheet1
将继续工作,因为代码名称没有改变,但现在使用Sheets("Sheet1")
将返回错误,并且该语法必须更新为工作表的新名称,因此需要Sheets("Data")
.
在 VB 编辑器中你会看到类似这样的内容:
请注意,即使我将名称更改为Data
,仍然有一个Sheet1
向左转。这就是我所说的代号的意思。
The Data
可以通过两种方式引用工作表:
Debug.Print Sheet1.Name
Debug.Print Sheets("Data").Name
两者都应该返回Data
有关工作表代码名称的更多讨论可以找到here http://www.ozgrid.com/VBA/excel-vba-sheet-names.htm.