發布時間:2024-01-24閱讀(14)
大家好,最近推出的內容是"VBA信息獲取與處理"中的部分內容,這套教程面向中高級人員,涉及范圍更廣,實用性更強,現在的內容是第四個專題"EXCEL工作表數據的讀取、回填和查找"的內容。
第五節 如何在單個工作表中查找某個給定值這個專題將的是工作表數據的操作,在前幾講中,我們講了工作表數據和VBA直接的傳輸,這講的內容仍是和工作表相關,就是如何在工作表中查找到某個值,在《VBA代碼解決方案》中,我也曾經講到過FIND方法,甚至提出這是LOOKUP函數的終結者。那么如何利用FIND方法解決問題呢?
1 Find方法和FindNext方法1) 我們先來看看FIND方法的語法和參數:
語法:expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SerchFormat)
參數expression是必需的,該表達式返回一個Range對象。
參數What是必需的,要搜索的數據,可為字符串或任意數據類型。
參數After是可選的,表示搜索過程將從其之后開始進行的單元格,必須是區域中的單個單元格。查找時是從該單元格之后開始的,直到本方法繞回到指定的單元格時,才對其進行搜索。如果未指定本參數,搜索將從區域的左上角單元格之后開始。
參數LookIn是可選的,信息類型。xlValues對應 值;xlFormulas 對應 公式;xlComments對應 批注
參數LookAt是可選的,可為XlLookAt常量的xlWhole 或xlPart之一。
參數SearchOrder是可選的,可為XlSearchOrder常量的xlByRows或xlByColumns之一。
參數SearchDirection是可選的,搜索的方向,可為XlSearchDirection常量的xlNext或xlPrevious之一。
參數MatchCase是可選的,若為True,則進行區分大小寫的查找。默認值為False。
參數MatchByte是可選的,僅在選擇或安裝了雙字節語言支持時使用。若為True,則雙字節字符僅匹配雙字節字符。若為False,則雙字節字符可匹配其等價的單字節字符。
參數SerchFormat是可選的,搜索的格式。
需要注意的是:每次使用Find方法后,參數LookIn、LookAt、SearchOrder 和MatchByte的設置將保存。如果下次調用Find方法時不指定這些參數的值,就使用保存的值。因此每次使用該方法時請明確設置這些參數。
2) FindNext方法繼續執行用Find方法啟動的搜索。查找下一個匹配相同條件的單元格并返回代表單元格的Range對象
語法:expression.FindNext(After)
參數expression是必需的,返回一個Range對象。
參數After是可選的,指定一個單元格,查找將從該單元格之后開始。
2 利用Find方法在工作表中實現單值查找為了實現在工作表中的單值查找,我們可以利用下面的代碼:
Sub MYNZI() 工作表唯一查詢
Dim FJX As Variant
Sheets("Sheet5").Select
Range("i2 : I3000").ClearContents
i = 2
Do While Cells(i, "h") <> ""
Cells(i, "h").Select
UU = Cells(i, "h")
Set FJX = Sheets("Sheet5").Columns("A").Find(UU, lookat:=xlWhole)
If Not FJX Is Nothing Then
Cells(i, "i") = Sheets("Sheet5").Cells(FJX.Row, 2).Value
End If
i = i 1
Loop
MsgBox ("OK")
End Sub
代碼截圖:

代碼講解:上述代碼實現了在工作表A列中查找H列的唯一值的方案,首先我們清空了要回填的數據區域Range("i2 : I3000").ClearContents,然后利用:
Set FJX = Sheets("Sheet5").Columns("A").Find(UU, lookat:=xlWhole)
來實現我們的查找,lookat:=xlWhole 是完全匹配,當然我們還可以利用其它參數來實現特定的匹配。
上面的這段代碼中我保留了工作表的名稱,這樣以后大家利用起來可以直接的拷貝代碼,進行必要的修改即可。當然,找到唯一的值后可以提取的數據可以根據實際情況需要做進一步的改進。
我們看看程序的運行結果:

為了實現在工作表中的多值查找我們可以使用FindNext方法,這個方法的好處就是可以查到多個值。在查找的過程中我們要設定起始位置,下面的代碼是比較經典的代碼,大家可以利用
Sub MYNZJ() 工作表非唯一查詢
Dim bcontinue As Boolean
Dim mysearch As Range
Dim myfind As Range
Dim fristmyfind As String
Sheets("Sheet6").Select
Range("i2 : I3000").ClearContents
i = 2
Do While Cells(i, "h") <> ""
Cells(i, "h").Select
bcontinue = True
Set mysearch = Sheets("Sheet6").Range("A1 : A" & Sheets("Sheet6").Range("A1").End(xlDown).Row)
Set myfind = mysearch.Find(what:=Cells(i, "h"), lookat:=xlWhole)
If Not myfind Is Nothing Then fristmyfind = myfind.Address
Do Until myfind Is Nothing Or Not bcontinue
Cells(i, "i") = Cells(i, "i") & " " & Sheets("Sheet6").Cells(myfind.Row, 2)
Set myfind = mysearch.FindNext(myfind)
If myfind.Address = fristmyfind Then bcontinue = False
Loop
Set myfind = Nothing
i = i 1
Loop
Set mysearch = Nothing
MsgBox ("OK!")
End Sub
代碼截圖:

代碼講解:
上述代碼實現了工作表A列中的多值查找,當在A列中存在H列的值時返回數值,注意這里的查找開始表示是fristmyfind = myfind.Address,一直循環到這個地址再次出現。
下面我們看看代碼的運行結果:

利用Find和FindNext方法從而實現了工作表中的單一值查詢和多值的查詢。
本節知識點回向:如何實現工作表中的單一值查詢?如何實現工作表中的多值查詢?
本專題參考程序文件:004工作表.XLSM

VBA是利用Office實現自己小型辦公自動化的有效手段,這是我對VBA的應用界定。在取代OFFICE新的辦公軟件沒有到來之前,誰能在數據處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!學習VBA是個過程,也需要經歷一種枯燥的感覺,如太白詩云:眾鳥高飛盡,孤云獨去閑。相看兩不厭,只有敬亭山。
"水善利萬物而不爭",綿綿密密,微則無聲,巨則洶涌。學習亦如此,知道什么是自己所需要的,不要蜷縮在一小塊自認為天堂的世界里,待到暮年時再去做自欺欺人的言論。要努力提高自己,用一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。愿力決定始終,智慧決定成敗。不管遇到什么,都是風景。看淡紛爭,看輕得失。茶,滿也好,少也好,不要計較;濃也好,淡也好,其中自有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。在后疫情更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。學習時微而無聲,利用時則巨則洶涌。
我記得20年前自己初學VBA時,那時的資料甚少,只能看源碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重復我之前的經歷,我根據自己多年VBA實際利用經驗,推出了六部VBA專門教程。
第一套:VBA代碼解決方案 是VBA中各個知識點的講解,覆蓋絕大多數的VBA知識點,初學必備;
第二套:VBA數據庫解決方案 數據庫是數據處理的專業利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法和實例操作,適合中級人員的學習。
第三套:VBA數組與字典解決方案 數組和字典是VBA的精華,字典是VBA代碼水平提高的有效手段,值得深入的學習,是初級及中級人員代碼精進的手段。
第四套:VBA代碼解決方案之視頻 是專門面向初學者的視頻講解,可以快速入門,更快的掌握這門技能。
第五套:VBA中類的解讀和利用 這是一部高級教程,講解類的虛無與肉身的度化,類的利用雖然較少,但仔細的學習可以促進自己VBA理論的提高。
第六套教程:《VBA信息獲取與處理》,這是一部高級教程,涉及范圍更廣,實用性更強,面向中高級人員。教程共二十個專題,包括:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪切板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等內容。如需要可以可以WeChat: NZ9668
學習的過程也是修心的過程,修一個平靜的心。在代碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心里沒有那么多邪知邪見,也就沒有那么多妄想。利人就是利己。這些教程也是為幫助大家起航,助上我自己之力,我的上述教程是我多的經驗的傳遞,大家可以根據以上資料1,3,2,6,5或者是4,3,2,6,5的順序逐漸深入的逐漸學習。

每一分收獲都是成長的記錄,怎無憑,正是這種執著,成就了朝霞的燦爛。最后將一闕詞送給致力于VBA學習的朋友,讓大家感受一下學習過程的枯燥與執著:
浮云掠過,暗語無聲,
唯有清風,驚了夢中啼鶯。
望星,疏移北斗,
奈將往事雁同行。
阡陌人,昏燈明暗,
忍顧長亭。
多少VBA人,
暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
分享成果,隨喜正能量
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖