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