XMATCH的實例應用:生卒年份的查詢-完萬用字元的比對(4/5)

使用XMATCH函數,進行生卒年份的查詢-執行萬用字元的比對。

在XMATCH函數的第三個參數match_mode其第四種比對模式稱之為萬用字元比對,使用的方式與XLOOKUP函數的第5個參數值Search_Mode有著如出一轍的用法,只要參數值設定為2,即可查找符合萬用字元(*或?)比對的資料項目。例如:只要輸入查詢值的局部資料就可以進行資料的查找比對。以下的實作範例是一份著名歷史學家名冊列表,透過XMATCH函數的設計,可以在僅輸入出生年份、僅輸入過世的年份,或者局部的生卒年份,也可以順利找到相對的位置。譬如:僅輸入「1019」就可以找出「生卒年份」欄位裡包含此數字的相對位置。

若是輸入的內容包含了萬用字元「*」號,也可以免去輸入冗長的文字數,而更彈性的找出生卒年份資料的相對位置。

在此範例的設計上,將查詢值lookup_value參數設定為儲存格H5,並在此內容的前後藉由&符號的運算,串接萬用字元「*」字串,參數值寫成 "*"&H5&"*" 而完整的XMATCH函數如下:

=XMATCH("*"&H5&"*",生卒年份,2)

所以,不論在儲存格H5裡輸入了什麼內容,前後都會加上萬用符號「*」的功能特性進行資料的查詢。因此,僅在儲存格H5裡輸入「1086」,便可以傳回「6」的結果,表示在生卒年份的欄位裡,首次出現「1086」這個數字內容的儲存格,正是此欄位的第6個索引位置。

在查詢值lookup_value參數的設定上,可以善用萬用字元裡的星號「*」號及問號「?」號,再與指定的字串進行串接運算,以查找符合所需的資料。例如:若lookup_value為:

"*-17??年*"

則代表要查找的資料是不論出生年份,但過世年份必須是1700年代的資料。以這個範例檔案來看,生卒年份欄位裡第3個索引位置的內容是符合的,因此,透過XMATCH函數對此參數的設定進行查找,將會傳回整數「3」的結果。

從生卒年份欄位的內容可以瞭解出生年份與過世年份之間是以「-」符號分隔,若有不確定或者不知的年份,則會有一個問號「?」標示。因此,若想查詢出生年份不詳,尾字有「?」,而且過世年份的尾數(個位數)是5的生卒年份資料,應該可以將如下字串設定為lookup_value:

"*?-*5年"

意即查詢「-」之前是不限字數的任意字元但尾字必須是「?」的資料,而同時「-」之後也必須是不限字數的任意字元但尾字是「5年」二字。但是,執行XMATCH函數後,傳回的結果好像不是我們想像中的結果喔!此次的執行XMATCH傳回的結果是「2」,表示生卒年份欄位裡第2個索引位置的內容是符合的,但是這個索引位置的內容是「673年-735年」,雖說過世年份「735年」的確是符合了我們所定義的查詢需求「"*?-*5年"」後半段的準則,過世年份的尾數(個位數)是5的資料,但前半段的準則想查詢出生年份不詳,尾字有「?」內容,好像就視而不見並未處理耶!因為,看了一下目前生卒年份欄位裡的資料,第8個索引位置的「500年?-565年」應該才是符合的。查詢的結果應該傳回「8」怎麼會是「2」呢?

其實,原因很簡單,在lookup_value裡的內容敘述,就是我們想要查找的內容,在此輸入「5」就是要尋找包含「5」的資料;在此輸入「年」就是要尋找包含「年」的資料,但是,若是輸入問號「?」就並不是要尋找包含問號「?」的資料喔!因為,問號「?」在此是屬於萬用字元符號,代表一個字的任意字元,所以,輸入一個問號「?」並不是去查找一個問號「?」。那麼,要怎麼解決真的只是要查找一個問號「?」的需求呢?那就在問號「?」的前面再加一個波浪字元「~」,形成「~?」那就代表真的是要查找問號「?」本身這個符號囉!因此,我們改寫一下上述的lookup_value參數為:

"*~?-*5年"

這次真的就可以順利的查找到出生年份不詳,且過世年份是「5年」結尾的資料,其位於生卒年份欄位裡的第8個索引位置。

在使用萬用字元符號「*」「?」描述查詢準則的定義時,這兩符號的特定意義是「*」代表不限字數的任意字元,而「?」代表一個字的任意字元。因此,若比對資料時,真的是要查找有沒有問號「?」字元的存在,則查詢準則的描述就必須在「?」號的前面加上「~」符號,形成「~?」才能代表代要比對查找「?」號,而非萬用字元的功用。同理,若在比對資料時,真的是要查找是否有無星號「*」字元的存在,查詢準則的描述就必須在「*」號的前面加上「~」符號,形成「~*」才能代表代要比對查找「*」號。所以,波浪符號「~」也算是有特定意義的萬用字元,用來表示要查找的文字是問號「?」或星號「*」。那麼。若是查詢準則的描述裡真的就是要查找「~」號呢?那就必須撰寫成「~~」喔!

(文章內容實作範例下載)