使用VBA在工作表或單元格區域中查找某項數據時,我們通常使用For…Next循環,這在小範圍中使用還可以,但應用在大量數據中查找時,會耗費較多時間。
而在Excel工作表中,通常使用菜單“編輯>>查找”命令或按Ctrl F組合鍵,在“查找和替換”對話框中來迅速查找所需的數據。在VBA中,我們也能使用這種方法,這在下面的内容中介紹。
為什麼要使用Find方法呢?最主要的原因是查找的速度。如果要使用VBA代碼在包含大量數據的單元格區域中查找某項數據,應該使用Find方法。
例如,在工作表Sheet1的單元格IV65536中輸入fanjy,然後運行下面的代碼:
Sub QuickSearch()
If Not Sheet1.Cells.Find("fanjy") Is Nothing Then MsgBox "已找到fanjy!"
End Sub
再試試下面的代碼:
Sub SlowSearch()
Dim R As Range
For Each R In Sheet1.Cells
If R.Value = "fanjy" Then MsgBox "已找到fanjy!"
Next R
End Sub
比較一下兩段代碼的速度,可知第一段代碼運行很快,而第二段代碼卻要執行相當長的一段時間。
下面介紹一些擴展Find方法的技術。
我們能夠使用Find方法查找單元格區域的數據,但是沒有一個方法能夠返回一個Range對象,該對象引用了含有所查找數據的所有單元格,下面提供了一個FindAll函數來實現此功能。此外,Find方法的另一個不足之處是不支持通配符字符串,引用了與所提供的通配符字符串相匹配的單元格。
FindAll函數
這個程序在參數SearchRange所代表的區域中查找所有含有參數FindWhat代表的值的單元格,SearchRange參數必須是一個單獨的單元格區域對象,FindWhat參數是想要查找的值,其它參數是可選的且與Find方法的參數意思相同。
FindAll函數的代碼如下:
Option Compare Text
Function FindAll(SearchRange As Range, FindWhat As Variant, _
Optional LookIn As XlFindLookIn = xlValues, Optional LookAt As XlLookAt = xlWhole, _
Optional SearchOrder As XlSearchOrder = xlByRows, _
Optional MatchCase As Boolean = False) As Range
返回SearchRange區域中含有FindWhat所代表的值的所有單元格組成的Range對象
' 其參數與Find方法的參數相同
' 如果沒有找到單元格,将返回Nothing.
Dim FoundCell As Range
Dim FoundCells As Range
Dim LastCell As Range
Dim FirstAddr As String
With SearchRange
Set LastCell = .Cells(.Cells.Count)
End With
Set FoundCell = SearchRange.Find(what:=FindWhat, after:=LastCell, _
LookIn:=LookIn, LookAt:=LookAt, SearchOrder:=SearchOrder, MatchCase:=MatchCase)
If Not FoundCell Is Nothing Then
Set FoundCells = FoundCell
FirstAddr = FoundCell.Address
Do
Set FoundCells = Application.Union(FoundCells, FoundCell)
Set FoundCell = SearchRange.FindNext(after:=FoundCell)
Loop Until (FoundCell Is Nothing) Or (FoundCell.Address = FirstAddr)
End If
If FoundCells Is Nothing Then
Set FindAll = Nothing
Else
Set FindAll = FoundCells
End If
End Function
使用上面代碼的示例:
Sub TestFindAll()
Dim SearchRange As Range
Dim FoundCells As Range
Dim FoundCell As Range
Dim FindWhat As Variant
Dim MatchCase As Boolean
Dim LookIn As XlFindLookIn
Dim LookAt As XlLookAt
Dim SearchOrder As XlSearchOrder
Set SearchRange = ThisWorkbook.Worksheets(1).Range("A1:L20")
FindWhat = "A" '要查找的文本,可根據實際情況自定
LookIn = xlValues
LookAt = xlPart
SearchOrder = xlByRows
MatchCase = False
Set FoundCells = FindAll(SearchRange:=SearchRange, FindWhat:=FindWhat, _
LookIn:=LookIn, LookAt:=LookAt, SearchOrder:=SearchOrder, MatchCase:=MatchCase)
If FoundCells Is Nothing Then
Debug.Print "沒有找到!"
Else
For Each FoundCell In FoundCells.Cells
Debug.Print FoundCell.Address, FoundCell.Text
Next FoundCell
End If
End Sub
上面的代碼中,列出了查找區域中含有所要查找的數據的所有單元格的地址以及相應文本。不僅可以找出所有含有所查找數據的單元格地址,而且也可以對這些單元格進行一系列操作,如格式化、更改數據等。
小夥伴,大家一起學習Excel VBA知識,一起進步。同時歡迎大家幫忙轉發并關注,謝謝大家的支持!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!