前景提要
經過了之前一段時間的學習,我們大致瞭解了單元格內容的提取,拆分等操作,同時也是延伸到了單元格公式等內容的擴充套件
相信大家對於這部分的知識,應該有了一定的瞭解了。
今天我們繼續按照計劃往下走,來學習下單元格內容的查詢
說到內容的查詢,小夥伴們肯定會丟個白眼給我,並在內心丟給我一張圖
Excel的查詢功能早就根深蒂固了,大家在日常的工作中也會經常使用到,但是不知道大家有沒有這樣的體會,Excel的查詢,每次都只能展示一個結果,看起來非常的不方便,要檢視所有的結果,還需要展開來看
非常的不舒服,能不能將所需要查詢的結果,高亮在原始資料中,這樣我們也能一目瞭然呢?
這是我在日常工作中經常會有的想法,有想法就要有行動,所以今天我就直接用VBA來實現這樣的想法。
場景說明
這是我們今天的資料來源,我們要實現的目標是,將查詢的結果,直接在原資料中表現出來,高亮出來,這樣我們看起來也是更加的方便。
程式碼區
Sub test()
Dim rng As Range, trng As Range, frng$, a As Range
s = Application。InputBox(“查詢內容的確定”, “請輸入查詢內容”, , , , , , 3)
With ActiveSheet。UsedRange
Set rng = 。Find(s)
If Not rng Is Nothing Then
frng = rng。Address
Set trng = rng
Else
MsgBox “無匹配資料”
Exit Sub
End If
Do
Set rng = 。Find(s, after:=rng)
rng。Select
If frng <> rng。Address Then
Set trng = Union(trng, rng)
Else
Exit Do
End If
Loop
End With
trng。Interior。Color = vbRed
End Sub
程式碼並不算是很長,直接來看看效果
從上面的動圖中我們可以將這兩種查詢方式,進行一個鮮明的對比,同樣是資料的查詢,VBA的查詢,能夠清晰的將結果直接在資料來源中展示出來,並且高亮,結果一目瞭然。
而相對的,Excel自帶的查詢功能,雖然也可以找到資料,但是返回的結果差強人意
一比較就知道哪種效果更加的好了
程式碼解析
老規矩,既然實現了效果,我們就來進入到程式碼的解析。
今天程式碼的核心其實就是單元格的查詢
在Excel中我們都是按下CTRL+F實現查詢功能的,那麼在VBA中呢?
Set rng = 。Find(s)
也是這樣簡單的一句話,find的就是查詢的意思,非常好理解。
然後進入今天的程式碼核心邏輯。
單元格查詢的邏輯才是程式碼的核心。
Set rng = 。Find(s)
If Not rng Is Nothing Then
frng = rng。Address
Set trng = rng
Else
MsgBox “無匹配資料”
Exit Sub
End If這是最開始的一段程式碼,這段程式碼要實現的內容是什麼呢?
在整個rng這個中查詢滿足條件的第一個單元格
如果第一個單元格存在,才需要後面的操作,繼續尋找第二個
反之如果第一個單元格都不存在,就說明這個區域並沒有我們要找的資料,可以直接結束程式了。
如果存在第一個單元格,我們先將這個單元格重新定義為trng
然後得到trng的單元格位置,如何得到單元格的位置呢?
frng = rng。Address
為什麼要獲得單元格的位置呢?是不是很好奇?別急,我們先繼續往下走
有了第一個單元格之後,我們就可以查詢第二個單元格了
如何查詢第二個單元呢?
Set rng = 。Find(s, after:=rng)‘第二個單元格
Set rng = 。Find(s)’第一個單元格
我們將這兩個程式碼放在一起比較一下
方法都是一樣的,都是透過rng。find方法,唯一不同的就是在查詢第二個單元格的時候,多了後面一部分
after:=rng
這是什麼意思呢?
after明顯就是後面的意思,rng就是我們上面已經得到的第一個單元格,合起來就是從第一個單元格往後找,看下圖
此B3這個單元格往後找,才會來到C6這個單元格,如果 after:=rng這句話,那麼會是什麼結果呢?
從上面的結果來看,最終返回的結果只有第一個單元格高亮了。
綜上說明,如果沒有after:=rng的話,程式碼是不會繼續往下查詢的,只會找到第一個單元格就跳出迴圈了,這點,大家在使用的時候要注意
這是要注意的第一個點
上面我們不是留下一個小懸念,為什麼我們要獲得第一個單元格的位置呢?
現在就用到了。
If frng <> rng。Address Then
這裡為什麼還要判斷一下位置呢?
雖然我們要找的是第二個單元格,但是不排除單元格區域內有且僅有一個滿足條件的,如果這個時候不作出判斷的話,就會一直無限死迴圈了。
這是要注意的第二個點
來看看實際的案例
可以看到,這兩個rng的位置是完全不同的,這樣就可以判斷,還存在第二個單元格,以此類推
最後利用單元格的union方法,將所有的單元格都彙總起來
一次性填充顏色高亮,就可以了
Set trng = Union(trng, rng)