|
今天我們要解決的是這樣一個問題:
假設我們面對這樣一份原始數(shù)據(jù),B列記錄每個條目的數(shù)量?,F(xiàn)在要求你根據(jù)這份數(shù)據(jù)生成一個結(jié)果表,其中對應于A列的每一個條目,在結(jié)果表中都有多行,行數(shù)由B列的數(shù)量確定。比如,條目A對應數(shù)量為3,在結(jié)果表中,A就有3行。如下圖:
這個問題在實際中直接遇到的機會并不太大,但是在解決其他問題時經(jīng)常會遇到。因為這是解決其他很多問題的一個中間步驟。 使用傳統(tǒng)方法的話,在Excel中要想解決這個問題,只能是手工操作了。頂多利用一些“高超的”技巧加快速度。實際上也很麻煩。 用Power Query可以解決這個問題,方法我們以前介紹過。雖然這也是一個自動化方案,但是畢竟又添加了一個實體,很啰嗦。而且考慮這個問題往往是作為中間步驟出現(xiàn)的,因此,Power Query并不是一個最優(yōu)的方案。 于是,重擔落在了Excel函數(shù)上。 利用Excel函數(shù)式編程可以比較巧妙地解決這個問題。 先來看解決的思路。 很多人一開始想到的是使用循環(huán)來處理。但是這個問題用循環(huán)來處理會比較啰嗦。 簡單思路是這樣的:
這里每一步都可以用Excel函數(shù)輕松實現(xiàn)。 不過這個思路簡化了其中的復雜性。因為我們實際中遇到的A列名稱很可能不是簡單的一個字母的形式,而是多個字符,變長的名稱,比如:張三豐,郭靖,上官婉兒等等。 這樣的話,從表2轉(zhuǎn)為表3就會遇到困難。 所以我們需要稍微修正一下這個思路:
其中,表2跟前一個思路差不多,仍然是重復 n 次。但是重復的時候包括“,“;這一步可以使用公式: =REPT(A2 &",",B2) 表3不再拆分成多列,而是將表2合并成一個字符串,注意合并的時候行分隔符也是用”,”。這一步的公式如下: =TEXTJOIN(",",,F2:F5)注意表3中有的地方有兩個連續(xù)的逗號“,”。 表4可以通過表3拆分得到, =TEXTSPLIT(A8,,",",TRUE) 注意第四個參數(shù)是TRUE,表示忽略空白值。 最終,我們可以使用這樣一個公式完成這個工作: =LET( data, A2:B5, dataRept, REPT(CHOOSECOLS(data,1) & ",", CHOOSECOLS(data,2)), TEXTSPLIT( TEXTJOIN(",",,dataRept), , ",", TRUE ))其中, 第2行實現(xiàn)了思路中的表2; 第5行實現(xiàn)了思路中的表3; 第4~9行完成了最后的結(jié)果,將表3拆分為表4。 |
|
|
來自: zonge > 《ExcelEasy》