Q:某些情況下,我們可能要統(tǒng)計帶有分隔符的字符串中不重復(fù)的子字符串?dāng)?shù)。如下所示,我想知道單元格A1中不重復(fù)的數(shù)字有幾個,應(yīng)該怎么編寫公式?
A:下面的數(shù)組公式可以完成單元格A1的字符串不重復(fù)值的統(tǒng)計:
=SUM(N(MATCH(TRIM(MID(SUBSTITUTE(A1,”,”,REPT(“”,999)),ROW(INDIRECT(“1:” &LEN(A1)-LEN(SUBSTITUTE(A1,”,”,””))+1))*999-998,999)),TRIM(MID(SUBSTITUTE(A1,”,”,REPT(“”,999)),ROW(INDIRECT(“1:” &LEN(A1)-LEN(SUBSTITUTE(A1,”,”,””))+1))*999-998,999)), )=ROW(INDIRECT(“1:”& LEN(A1)-LEN(SUBSTITUTE(A1,”,”,””))+1))))
結(jié)果為6。注意,公式輸入完成后要按下Ctrl+Shift+Enter組合鍵。
公式解析
這么長的公式,一看到可能被嚇著了,讓我們來看看這個復(fù)雜的公式是怎么得來的。
上面的公式可以簡化為:
=SUM(N(MATCH(單元格中的子字符串組成的數(shù)組, 單元格中的子字符串組成的數(shù)組, )=連續(xù)數(shù)字組成的數(shù)組))
其中,生成單元格中的子字符串組成的數(shù)組的公式:
TRIM(MID(SUBSTITUTE(A1,”,”,REPT(“”,999)),ROW(INDIRECT(“1:” &LEN(A1)-LEN(SUBSTITUTE(A1,”,”,””))+1))*999-998,999))
ROW(INDIRECT(“1:”& LEN(A1)-LEN(SUBSTITUTE(A1,”,”,””))+1))獲得從1至子字符串個數(shù)的連續(xù)數(shù)字。本例中,單元格中的子字符串組成的數(shù)組為:
{“1″;”2″;”3″;”1″;”2″;”3″;”4″;”5″;”6”}
上述數(shù)組作為MATCH函數(shù)的參數(shù),查找每個子字符串在上面數(shù)組中出現(xiàn)的位置,得到下面的數(shù)組:
{1;2;3;1;2;3;7;8;9}
公式中的:
ROW(INDIRECT(“1:”& LEN(A1)-LEN(SUBSTITUTE(A1,”,”,””))+1))
生成由連續(xù)的數(shù)字組成的數(shù)組:
{1;2;3;4;5;6;7;8;9}
上面生成的兩個數(shù)組進(jìn)行比較:
{1;2;3;1;2;3;7;8;9}={1;2;3;4;5;6;7;8;9}
得到由布爾值組成的數(shù)組:
{TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE}
其中的TRUE表明是不重復(fù)的值,F(xiàn)ALSE表明值出現(xiàn)的重復(fù)。因?yàn)椴恢貜?fù)值出現(xiàn)的位置應(yīng)該與其在子字符串中的位置一致,也就是說比較的結(jié)果為TRUE;如果位置不一致,則前面已經(jīng)出現(xiàn)過該子字符串,即為重復(fù)值,比較的結(jié)果為FALSE。
N函數(shù)將上述布爾值數(shù)組轉(zhuǎn)換成由和1組成的數(shù)組:
{1;1;1; ; ; ;1;1;1}
數(shù)組中元素之和即為不重復(fù)的值的個數(shù)。