2017-09-12 34 views
1

我想創建一個公式,它返回兩個不同長度數組的連接。如果可能的話,我需要將這個串聯作爲另一個公式的一部分,我想避免使用「helper」行。有沒有辦法在Excel中連接兩個數組而不使用VBA?

查看下面的例子數據。

enter image description here

的目標是讓輸出是{10;11;12;13;20;21;22}。當然,這可以很容易地被硬編碼到公式中,但是這些值是動態的,所以這不是一種選擇。

我試過如下:

{A1:A4;B1:B3} 

但這顯然不是有效的Excel語法。

有沒有解決方案?

回答

3

Excel無法以您描述的方式直接連接數組(即將它們背靠背組合)。但是,如果不使用幫助函數,則會出現(複雜)解決方案。

基本上你需要做的是將{10;11;12;13}轉換爲{10;11;12;13;0;0;0}並將{20;21;22}轉換爲{0;0;0;0;20;21;22}。一旦你有了這個結果,你可以添加兩個長度爲7的數組來得到想要的結果。

那麼如何將零添加到數組的開頭或結尾呢?

答案是以巧妙的方式使用矩陣乘法(MMULT Excel內置函數)。

我就不解釋了所有的數學領域的,爲什麼是這樣的結果,因爲我覺得它變得太偏離主題,從規劃,但最終下面的矩陣乘法公式給出你想要的結果:

[1 0 0 0] [10] [10] 
[0 1 0 0] * [11] = [11] 
[0 0 1 0] [12] [12] 
[0 0 0 1] [13] [13] 
[0 0 0 0]   [ 0] 
[0 0 0 0]   [ 0] 
[0 0 0 0]   [ 0] 

或Excel,您可以鍵入這個讓你的結果:(我加了換行以提高可讀性)

= MMULT({1,0,0,0; 
     0,1,0,0; 
     0,0,1,0; 
     0,0,0,1; 
     0,0,0,0; 
     0,0,0,0; 
     0,0,0,0},A1:A4) 

如果選中該公式中的單元格,然後按F9鍵,你應該注意到它會給你想要的結果{10;11;12;13;0;0;0}

類似地,下面的公式將獲得您的{0;0;0;0;20;21;22}所期望的結果:

= MMULT({0,0,0; 
     0,0,0; 
     0,0,0; 
     0,0,0; 
     1,0,0; 
     0,1,0; 
     0,0,1},B1:B3) 

這兩個值求和一起將得到所期望的最終結果是{10;11;12;13;20;21;22}


注意

在這一點上,這可能足夠的信息,爲您的慾望/需求。但是,對於大型數組,將這些1和0的矩陣硬編碼到公式中可能太麻煩。如果是這種情況,請繼續閱讀,告訴您如何自動生成1和0的這些矩陣,而不是對它們進行硬編碼。


我們如何自動生成這些1和0的大矩陣?

同樣沒有解釋太多的「爲什麼」,因爲我覺得討論會太長和題外話,這裏是產生1和0以上的第一矩陣公式:

= (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) 
    =COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(A1:A4)))))+0 

的式1的的第二矩陣和0是稍有不同:

= (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) 
    =(COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(B1:B3))))+ROWS(A1:A4)))+0 

最終公式

最終的公式來連接兩個(垂直)陣列是如下:(加入以增強其可讀性的幾個換行符)

= MMULT(
    (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) 
    =COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(A1:A4)))))+0, 
    A1:A4) 
+MMULT(
    (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) 
    =(COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(B1:B3))))+ROWS(A1:A4)))+0, 
    B1:B3) 

FINAL NOTES/THOUGHTS

的優勢,使用這個公式是它允許數組連接而不使用VBA。缺點是這種連接數組的方法只能使用數字,而不能使用文本。 (這是因爲MMULT需要數字。)

+1

結合沒有揮發性公式:'= MMULT( (ROW($ A $ 1:INDEX($ A:$ A,ROWS($ A $ 1:$ A $ 4)+ ROWS($ B $ 1:$ B $ 3))) = COLUMN($ A $ 1:INDEX($ 1:$ 1,ROWS($ A $ 1:$ A $ 4))))+ 0, $ A $ 1:$ A $ 4) + MMULT( (ROW($ A $ 1:INDEX($ A:$ A,ROWS($ A $ 1:$ A $ 4)+ ROWS($ B $ 1:$ B $ 3) )) =(COLUMN($ A $ 1:INDEX($ 1:$ 1,ROWS($ B $ 1:$ B $ 3))))+ ROWS($ A $ 1:$ A $ 4))+ 0, $ B $ 1: $ B $ 3)' –

+0

謝謝Scott。如果有周圍使用'INDIRECT(ADDRESS(一種方法,我一直在想......'但我通常避免檢查整個行/列(例如'A:A')的公式,因爲在我看來,這樣的會慢下來考慮到電子表格中包含從字面上超過一百萬行。正在使用你的方法不是'INDIRECT'? – ImaginaryHuman072889

+1

有在索引到全列不損害更高效/行,因爲它僅設置在其中查找的範圍,它實際上並沒有加載全範圍到內存中。它不使用任何比'更多的內存$ A $ 7' –

0

對於什麼是值得的,這裏是一個連接任意兩個垂直數組的解決方案(沒有數據必須是數字的限制)。

這裏是陣列式:(例如結合A1:A4C7:C9

= INDEX(CHOOSE({1,2},A1:A4,C7:C9), 
    N(IF({1},ROW(INDEX($A:$A,1):INDEX($A:$A,ROWS(A1:A4)+ROWS(C7:C9)))-IF(
    ROW(INDEX($A:$A,1):INDEX($A:$A,ROWS(A1:A4)+ROWS(C7:C9)))<=ROWS(A1:A4),0,ROWS(A1:A4)))), 
    N(IF({1},2-(ROW(INDEX($A:$A,1):INDEX($A:$A,ROWS(A1:A4)+ROWS(C7:C9)))<=ROWS(A1:A4))))) 

這裏是陣列式到兩個水平陣列(例如A1:D1C3:E3

= INDEX(CHOOSE({1;2},A1:D1,C3:E3), 
    N(IF({1},2-(COLUMN(INDEX($1:$1,1):INDEX($1:$1,COLUMNS(A1:D1)+COLUMNS(C3:E3))) 
    <=COLUMNS(A1:D1)))),N(IF({1},COLUMN(INDEX($1:$1,1):INDEX($1:$1,COLUMNS(A1:D1)+ 
    COLUMNS(C3:E3)))-IF(COLUMN(INDEX($1:$1,1):INDEX($1:$1,COLUMNS(A1:D1)+COLUMNS(C3:E3))) 
    <=COLUMNS(A1:D1),0,COLUMNS(A1:D1))))) 
相關問題