在單元格A2中給定一個字符串值,僅由大寫字母組成且字符長度至少為2。在單元格B2中輸入公式:如果A2中字符串的各個字符按字母升序排列(從左到右),則返回TRUE;否則返回FALSE。如圖1所示。
圖1
先不看答案,自已動手試一試。
公式
在單元格B2中的公式為:
=AND(GESTEP(MMULT(CODE(MID(A2,ROW(INDEX(A:A,1):INDEX(A:A,LEN(A2)-1))+{0,1},1)),{-1;1}),0))
向下拖拉即可。
公式解析
首先,讓我們看一下公式中的用于生成要傳遞給MID函數(shù)的參數(shù)的數(shù)組的結(jié)構(gòu):
ROW(INDEX(A:A,1):INDEX(A:A,LEN(A2)-1))
該構(gòu)造與下面的標準結(jié)構(gòu)返回相同的數(shù)組:
ROW(INDIRECT(“1:”&LEN(A2)-1))
兩者比較,后者更具有易失性。
如果單元格A2中的字符串為“AABBCCCC”,很顯然有8個字符,可以得到:
ROW(INDEX(A:A,1):INDEX(A:A,7))
轉(zhuǎn)換為:
ROW(A1:A7)
得到:
{1;2;3;4;5;6;7}
現(xiàn)在,大多數(shù)解決方案在這里所做的就是首先將此數(shù)組傳遞給MID函數(shù)作為其參數(shù)start_num的值:
MID(A2,{1;2;3;4;5;6;7},1)
轉(zhuǎn)換為:
{“A”;”A”;”B”;”B”;”C”;”C”;”C”}
然后,使用下面的數(shù)組執(zhí)行類似運算:
{2;3;4;5;6;7;8}
代入MID函數(shù):
MID(A2,{2;3;4;5;6;7;8},1)
轉(zhuǎn)換為:
{“A”;”B”;”B”;”C”;”C”;”C”;”C”}
最后,對這兩個數(shù)組進行比較。沒錯!這是針對本問題的一種合理的解決方案。
實際上我們可以一步生成這兩個數(shù)組,而不是用這種方式生成兩個單獨的數(shù)組。只需要確保能夠?qū)λ玫降膯蝹€數(shù)組執(zhí)行我們所需的比較。這里的技術(shù)是,將數(shù)組:
{1;2;3;4;5;6;7}
與下面的數(shù)組相加:
{0,1}
注意,該數(shù)組必須與前面的數(shù)組正交。由于第一個是單列數(shù)組,因此需要確保第二個是單行數(shù)組。因此:
{1;2;3;4;5;6;7}+{0,1}
由第二個數(shù)組中的兩個值與第一個數(shù)組中的每個值相加,得到:
{1,2;2,3;3,4;4,5;5,6;6,7;7,8}
此時,公式轉(zhuǎn)換為:
=AND(GESTEP(MMULT(CODE(MID(A2,{1,2;2,3;3,4;4,5;5,6;6,7;7,8},1)),{-1;1}),0))
先看這部分:
MID(A2,{1,2;2,3;3,4;4,5;5,6;6,7;7,8},1)
轉(zhuǎn)換為:
{“A”,”A”;”A”,”B”;”B”,”B”;”B”,”C”;”C”,”C”;”C”,”C”;”C”,”C”}
可以看到,包含與先前兩個獨立數(shù)組完全相同的元素,盡管它們組合成一個7行2列的數(shù)組。
現(xiàn)在,獲取每個字符的ASCⅡ編碼:
CODE({“A”,”A”;”A”,”B”;”B”,”B”;”B”,”C”;”C”,”C”;”C”,”C”;”C”,”C”})
得到:
{65,65;65,66;66,66;66,67;67,67;67,67;67,67}
現(xiàn)在必須確保可以相應(yīng)地操縱上述數(shù)組,將每行中的兩個元素彼此相減。仍然使用矩陣運算,很容易解決:
MMULT({65,65;65,66;66,66;66,67;67,67;67,67;67,67},{-1;1})
結(jié)果為:
{0;1;0;1;0;0;0}
這類似于在兩個單獨的數(shù)組之間進行比較:
{“A”;”A”;”B”;”B”;”C”;”C”;”C”}<{“A”;”B”;”B”;”C”;”C”;”C”;”C”}
然后將得到的TRUE/FALSE值轉(zhuǎn)換成等價的數(shù)值。
最后,簡單地查詢該數(shù)組的哪個元素大于或等于0(這實際上意味著一個元素的ASCII碼與上一個元素的ASCII碼之差大于或等于0,即等效于前面的字符等于或小于后面的字符):
=AND(GESTEP({0;1;0;1;0;0;0},0))
轉(zhuǎn)換為:
=AND({1;1;1;1;1;1;1})
結(jié)果為:
TRUE
小結(jié)
1.學(xué)習(xí)Excel怎么處理兩個正交且元素數(shù)量不同的數(shù)組的運算。
2.學(xué)習(xí)如何通過數(shù)組運算比較兩組值的大小。