我想創建一個公式,它返回兩個不同長度數組的連接。如果可能的話,我需要將這個串聯作爲另一個公式的一部分,我想避免使用「helper」行。有沒有辦法在Excel中連接兩個數組而不使用VBA?
查看下面的例子數據。
的目標是讓輸出是{10;11;12;13;20;21;22}
。當然,這可以很容易地被硬編碼到公式中,但是這些值是動態的,所以這不是一種選擇。
我試過如下:
{A1:A4;B1:B3}
但這顯然不是有效的Excel語法。
有沒有解決方案?
我想創建一個公式,它返回兩個不同長度數組的連接。如果可能的話,我需要將這個串聯作爲另一個公式的一部分,我想避免使用「helper」行。有沒有辦法在Excel中連接兩個數組而不使用VBA?
查看下面的例子數據。
的目標是讓輸出是{10;11;12;13;20;21;22}
。當然,這可以很容易地被硬編碼到公式中,但是這些值是動態的,所以這不是一種選擇。
我試過如下:
{A1:A4;B1:B3}
但這顯然不是有效的Excel語法。
有沒有解決方案?
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
需要數字。)
對於什麼是值得的,這裏是一個連接任意兩個垂直數組的解決方案(沒有數據必須是數字的限制)。
這裏是陣列式:(例如結合A1:A4
和C7: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:D1
和C3: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)))))
結合沒有揮發性公式:'= 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)' –
謝謝Scott。如果有周圍使用'INDIRECT(ADDRESS(一種方法,我一直在想......'但我通常避免檢查整個行/列(例如'A:A')的公式,因爲在我看來,這樣的會慢下來考慮到電子表格中包含從字面上超過一百萬行。正在使用你的方法不是'INDIRECT'? – ImaginaryHuman072889
有在索引到全列不損害更高效/行,因爲它僅設置在其中查找的範圍,它實際上並沒有加載全範圍到內存中。它不使用任何比'更多的內存$ A $ 7' –