--------------------------------------------------------------------------------
1. Find方法的作用
Find方法將在指定的單元格區域中查找包含參數指定數據的單元格,若找到符合條件的數據,則返回包含該數據的單元格;若未發現相匹配的數據,則返回Nothing。該方法返回壹個Range對象,在使用該方法時,不影響選定區域或活動單元格。
--------------------------------------------------------------------------------
2. Find方法的語法
[語法]
<單元格區域>.Find (What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])
[參數說明]
(1)<單元格區域>,必須指定,返回壹個Range對象。
(2)參數What,必需指定。代表所要查找的數據,可以為字符串、整數或者其它任何數據類型的數據。對應於“查找與替換”對話框中,“查找內容”文本框中的內容。
(3)參數After,可選。指定開始查找的位置,即從該位置所在的單元格之後向後或之前向前開始查找(也就是說,開始時不查找該位置所在的單元格,直到Find方法繞回到該單元格時,才對其內容進行查找)。所指定的位置必須是單元格區域中的單個單元格,如果未指定本參數,則將從單元格區域的左上角的單元格之後開始進行查找。
(4)參數LookIn,可選。指定查找的範圍類型,可以為以下常量之壹:xlValues、xlFormulas或者xlComments,默認值為xlFormulas。對應於“查找與替換”對話框中,“查找範圍”下拉框中的選項。
(5)參數LookAt,可選。可以為以下常量之壹:XlWhole或者xlPart,用來指定所查找的數據是與單元格內容完全匹配還是部分匹配,默認值為xlPart。對應於“查找與替換”對話框中,“單元格匹配”復選框。
(6)參數SearchOrder,可選。用來確定如何在單元格區域中進行查找,是以行的方式(xlByRows)查找,還是以列的方式(xlByColumns)查找,默認值為xlByRows。對應於“查找與替換”對話框中,“搜索”下拉框中的選項。
(7)參數SearchDirection,可選。用來確定查找的方向,即是向前查找(XlPrevious)還是向後查找(xlNext),默認的是向後查找。
(8)參數MatchCase,可選。若該參數值為True,則在查找時區分大小寫。默認值為False。對應於“查找與替換”對話框中,“區分大小寫”復選框。
(9)參數MatchByter,可選。即是否區分全角或半角,在選擇或安裝了雙字節語言時使用。若該參數為True,則雙字節字符僅與雙字節字符相匹配;若該參數為False,則雙字節字符可匹配與其相同的單字節字符。對應於“查找與替換”對話框中,“區分全角/半角”復選框。
(10)參數SearchFormat,可選,指定壹個確切類型的查找格式。對應於“查找與替換”對話框中,“格式”按鈕。當設置帶有相應格式的查找時,該參數值為True。
(11)在每次使用Find方法後,參數LookIn、LookAt、SearchOrder、MatchByte的設置將保存。如果下次使用本方法時,不改變或指定這些參數的值,那麽該方法將使用保存的值。
在VBA中設置的這些參數將更改“查找與替換”對話框中的設置;同理,更改“查找與替換”對話框中的設置,也將同時更改已保存的值。也就是說,在編寫好壹段代碼後,若在代碼中未指定上述參數,可能在初期運行時能滿足要求,但若用戶在“查找與替換”對話框中更改了這些參數,它們將同時反映到程序代碼中,當再次運行代碼時,運行結果可能會產生差異或錯誤。若要避免這個問題,在每次使用時建議明確的設置這些參數。
3. Find方法使用示例
3.1 本示例在活動工作表中查找what變量所代表的值的單元格,並刪除該單元格所在的列。
‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub Find_Error()
Dim rng As Range
Dim what As String
what = "Error"
Do
Set rng = ActiveSheet.UsedRange.Find(what)
If rng Is Nothing Then
Exit Do
Else
Columns(rng.Column).Delete
End If
Loop
End Sub
‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3.2 帶格式的查找
本示例在當前工作表單元格中查找字體為"Arial Unicode MS"且顏色為紅色的單元格。其中,Application.FindFormat對象允許指定所需要查找的格式,此時Find方法的參數SearchFormat應設置為True。
‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub FindWithFormat()
With Application.FindFormat.Font
.Name = "Arial Unicode MS"
.ColorIndex = 3
End With
Cells.Find(what:="", SearchFormat:=True).Activate
End Sub
‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[小結] 在使用Find方法找到符合條件的數據後,就可以對其進行相應的操作了。您可以:
(1)對該數據所在的單元格進行操作;
(2)對該數據所在單元格的行或列進行操作;
(3)對該數據所在的單元格區域進行操作。
--------------------------------------------------------------------------------
4. 與Find方法相聯系的方法
可以使用FindNext方法和FindPrevious方法進行重復查找。在使用這兩個方法之前,必須用Find方法指定所需要查找的數據內容。
4.1 FindNext方法
FindNext方法對應於“查找與替換”對話框中的“查找下壹個”按鈕。可以使用該方法繼續執行查找,查找下壹個與Find方法中所指定條件的數據相匹配的單元格,返回代表該單元格的Range對象。在使用該方法時,不影響選定區域或活動單元格。
4.1.1 語法
<單元格區域>.FindNext(After)
4.1.2 參數說明
參數After,可選。代表所指定的單元格,將從該單元格之後開始進行查找。開始時不查找該位置所在的單元格,直到FindNext方法繞回到該單元格時,才對其內容進行查找。所指定的位置必須是單元格區域中的單個單元格,如果未指定本參數,則將從單元格區域的左上角的單元格之後開始進行查找。
當查找到指定查找區域的末尾時,本方法將環繞至區域的開始繼續查找。發生環繞後,為停止查找,可保存第壹次找到的單元格地址,然後測試下壹個查找到的單元格地址是否與其相同,作為判斷查找退出的條件,以避免出現死循環。當然,如果在查找的過程中,將查找到的單元格數據進行了改變,也可不作此判斷,如下例所示。
4.1.3 對VBA幫助系統上的壹點疑問探討
在VBA幫助系統中,介紹Find方法和FindNext方法所使用的示例好像有點問題:當在Excel中運行時,雖然運行結果正確,但是在運行到最後時,會報錯誤:運行時錯誤’91’:對象變量或With塊變量未設置。究其原因,可能是對象變量c的問題,因為當進行查找並將相應的值全部改變後,最後變量c的值為Nothing。將其稍作改動後,運行通過。
原示例代碼如下:(大家也可參見VBA幫助系統Find方法或FindNext方法幫助主題)
本示例在單元格區域A1:A500中查找值為2的單元格,並將這些單元格的值變為5。
With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
經修改後的示例代碼如下,即在原代碼中加了壹句錯誤處理語句On Error Resume Next,忽略所發生的錯誤。
Sub test1()
Dim c As Range, firstAddress As String
On Error Resume Next
With Worksheets(1).Range("a1:a15")
Set c = .Find(2, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
或者,將代碼作如下修改,即去掉原代碼中最後壹個判斷循環的條件c.Address <> firstAddress,因為本程序的功能是在指定區域查找值為2的單元格並替換為數值5,當程序在指定區域查找不到數值2時就會退出循環,不涉及到重復循環的問題。
Sub test2()
Dim c As Range, firstAddress As String
With Worksheets(1).Range("a1:a15")
Set c = .Find(2, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing
End If
End With
End Sub
您也可以試試該程序,看看我的理解是否正確,或者還有什麽其它的解決辦法。
4.2 FindPrevious方法
可以使用該方法繼續執行Find方法所進行的查找,查找前壹個與Find方法中所指定條件的數據相匹配的單元格,返回代表該單元格的Range對象。在使用該方法時,不影響選定區域或活動單元格。
4.2.1 語法
<單元格區域>.FindPrevious(After)
4.2.2 參數說明
參數After,可選。代表所指定的單元格,將從該單元格之前開始進行查找。開始時不查找該位置所在的單元格,直到FindPrevious方法繞回到該單元格時,才對其內容進行查找。所指定的位置必須是單元格區域中的單個單元格,如果未指定本參數,則將從單元格區域的左上角的單元格之前開始進行查找。
當查找到指定查找區域的起始位置時,本方法將環繞至區域的末尾繼續查找。發生環繞後,為停止查找,可保存第壹次找到的單元格地址,然後測試下壹個查找到的單元格地址是否與其相同,作為判斷查找退出的條件,以避免出現死循環。
4.2.3 示例
在工作表中輸入數據,至少保證在A列中有兩個單元格輸入了數據“excelhome”。
在VBE編輯器中輸入下面的代碼測試Find方法、FindNext方法、FindPrevious方法,體驗各個方法所查找到的單元格位置。
‘- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub testFind()
Dim findValue As Range
Set findValue = Worksheets("Sheet1").Columns("A").Find(what:="excelhome")
MsgBox "第壹個數據發現在單元格:" & findValue.Address
Set findValue = Worksheets("Sheet1").Columns("A").FindNext(After:=findValue)
MsgBox "下壹個數據發現在單元格:" & findValue.Address
Set findValue = Worksheets("Sheet1").Columns("A").FindPrevious(After:=findValue)
MsgBox "前壹個數據發現在單元格" & findValue.Address
End Sub