iT邦幫忙

DAY 3
3

Excel VBA 的眉眉角角系列 第 3

Excel VBA 的眉眉角角Day3: For Each...Next 陳述式與模糊搜尋

Excel與資料庫的差異,就在於他的工作表一覽無遺,任何儲存格都可以放資料,資料存放方式較資料庫寬鬆,欄位以放第一列有沒有寫欄位名稱也沒任何影響,但也因此要搜尋資料時,也增加了不少困難度。

這裡要介紹另一個獨特的陳述式For Each...Next ,該陳述式可讓一個範圍值內的所有欄位或者陣列內的資料,逐一帶出。

另外要介紹的是Like 運算子,這部份與SQL語法就很接近,可以判斷是否「類似」描述的內容。

我們有個10x10的資料內容,儲存於A1到J10內,裡面存了100個姓名,透過程式,可逐一比對範圍內的每個儲存格是否包含「怡」或包含「婷」的字串,如果是的話,就印出儲存格位置與姓名。

以下為範例程式:

Sub Day3_迴圈控制與模糊搜尋()

Dim strKeyword1 As String
Dim strKeyword2 As String
Dim Rng As Object

strKeyword1 = "怡"
strKeyword2 = "婷"

For Each Rng In Range("A1:J10")
    If Rng.Text Like "*" & strKeyword1 & "*" Or _
       Rng.Text Like "*" & strKeyword2 & "*" Then
        Debug.Print Rng.Address & ": " & Rng.Text
    End If
Next

End Sub

以下逐行解釋

For Each Rng In Range("A1:J10")逐一帶出範圍內的每個儲存格

If Rng.Text Like "*" & strKeyword1 & "*" 如果該儲存格的文字內容類似strKeyword1代表的字串

Or _ 或者(底線為換行符號)

Rng.Text Like "*" & strKeyword2 & "*" Then該儲存格的文字內容類似strKeyword2代表的字串則

Debug.Print Rng.Address & ": " & Rng.Text印出儲存格位址與文字內容(中間冒號隔開)

其中,如果把Or改為And的話,就會變成尋找姓名包含「怡」以及「婷」的字串,當然,還可以透過括號與多個And、Or來進行更複雜的搜尋,以上的分享是否能激發更多想像空間?希望各位能舉一反三,多加運用。


上一篇
Excel VBA 的眉眉角角Day2:關於流程控制與儲存格的關係
下一篇
Excel VBA 的眉眉角角Day4: IsError與CVErr來檢測儲存格是否有錯誤發生
系列文
Excel VBA 的眉眉角角30

1 則留言

0
society520
iT邦新手 5 級 ‧ 2021-04-14 14:43:53

老師您好,針對 If Rng.Text Like "" & strKeyword1 & "" 中的*
代表什麼意思呢?

為何不能只寫成 If Rng.Text Like strKeyword1 就好了呢?

Andy Chiu iT邦研究生 3 級 ‧ 2021-04-14 19:50:43 檢舉

您好,是代表所有值,如果沒加,那只找跟strKeyword1相同的值,前後都加,就是前後夾雜者任何值,但中間有出現過strKeyword1就列出,好了,舉一反三一下,如果要尋找的是前面為strKeyword1值,後面為任何值,要怎麼寫?

原來如此,謝謝老師!
如果要尋找的是前面為strKeyword1值時,寫法應該是:

If Rang.Text Like strKeyword1 & "*"....
不知道這樣是否為正確解答呢?
由於是新手,還請老師多指教

我要留言

立即登入留言