大家好,我們今日講解「如何在多個工作表中查找某個給定值」,這節內容是「VBA信息獲取與處理」教程中第四個專題「EXCEL工作表數據的讀取、回填和查找」的第六節。
第六節 如何在多個工作表中查找某個給定值
大家好,我們今天講這個專題的最後一講,如何在多個工作表中查找某個給定值,當然要求這個給定的值在一個工作表中要是單一的值,如果是多個值我們可以稍微改一下代碼即可,我們不再做詳細講解。
1 在多個工作表中查找給定值要首先求出每個工作表的名稱
求出每個工作表的名稱,我們只需用ThisWorkbook.Worksheets.Item(i).Name即可以完成,我們看下面的代碼:
Dim WSArray()
n = ThisWorkbook.Worksheets.Count
ReDim WSArray(1 To n)
For i = 1 To n
WSArray(i) = ThisWorkbook.Worksheets.Item(i).Name
Next
代碼解讀:
上述代碼首先建立了一個動態數組WSArray(),這個動態數組將用來存儲各個工作表的名稱。變量n指的是當前工作薄所有工作表的數量,取得這個數量後,我們重讀這個動態數組,然後給數組賦值。
2 利用單值查找的程序完成餘下的工作
當我們取得後每個工作表的名稱後,我們就可以在每個工作表中進行查找,並將結果放到Cells(i, "i")單元格中,我們看下面的代碼:
Sheets("Sheet7").Select
Range("i2 : I3000").ClearContents
i = 2
Do While Cells(i, "h") <> ""
UU = Cells(i, "h")
For t = 1 To n
Set FJX = Sheets(WSArray(t)).Columns("A").Find(UU, lookat:=xlWhole)
If Not FJX Is Nothing Then
Cells(i, "i") = Cells(i, "i") & " " & Sheets(WSArray(t)).Cells(FJX.Row, 2).Value
End If
Next
Set FJX = Nothing
i = i + 1
Loop
代碼講解:Cells(i, "i") = Cells(i, "i") & " " & Sheets(WSArray(t)).Cells(FJX.Row, 2).Value 這句代碼中Sheets(WSArray(t))就是正在執行查找的工作表的名稱。這個名稱由數組的值確定,對於每個工作表都執行類似的操作後,指定單元格中就得到了最後的查詢結果。另外需要注意的是我這裡給出的是一個完全匹配查找,大家在實際利用的時候可以進行換成不完全匹配查找。
3 多工作表查詢的總代碼
最後我給出整個過程的代碼:
Sub MYNZK() '多工作表,每個工作表為唯一查詢
Dim WSArray()
Dim FJX As Variant
n = ThisWorkbook.Worksheets.Count
ReDim WSArray(1 To n)
For i = 1 To n
WSArray(i) = ThisWorkbook.Worksheets.Item(i).Name
Next
Sheets("Sheet7").Select
Range("i2 : I3000").ClearContents
i = 2
Do While Cells(i, "h") <> ""
UU = Cells(i, "h")
For t = 1 To n
Set FJX = Sheets(WSArray(t)).Columns("A").Find(UU, lookat:=xlWhole)
If Not FJX Is Nothing Then
Cells(i, "i") = Cells(i, "i") & " " & Sheets(WSArray(t)).Cells(FJX.Row, 2).Value
End If
Next
Set FJX = Nothing
i = i + 1
Loop
MsgBox ("OK")
End Sub
代碼截圖:
代碼的注意點:工作表名稱的利用要注意是當前正在查詢工作表,被查詢的數據位於Sheets("Sheet7")的H列,結果返回到I列。
由於代碼比較簡單,這裡就不再過多的講解了,下面看返回的結果:
最後我再給出幾個問題的引申:
1)如果要查詢的工作表是給定的呢?該如何處理?
2)如果每個工作表中的數據不是唯一的值,該如何處理?
本節知識點回向:如何實現多工作表中的查詢?實現過程中的關鍵點是什麼?
本專題參考程序文件: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人,
暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
分享成果,隨喜正能量