2017-09-12 8 views
1

異なる長さの2つの配列の連結を返す数式を作成しようとしています。私はこの結合を別の式の一部として必要とし、可能ならば「ヘルパー」行を避けたいと思います。VBAなしでExcelで2つの配列を連結する方法はありますか?

以下の例のデータを参照してください。

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の2つの配列を一緒に追加して、目的の結果を得ることができます。

どのように配列の先頭または末尾にゼロを追加しますか?

答えは、巧みな方法で行列乗算(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;20;21;22}ある所望の最終結果を取得すると共に、これらの2つの値を加算

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

同様に、以下の式を使用すると、{0;0;0;0;20;21;22}の所望の結果を得るであろう。


NOTE

この時点で、このご要望/ニーズに十分な情報かもしれません。しかし、大規模な配列の場合、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の最初の行列を生成する式があるの多くを説明せずに再

第2の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 

FINAL FORMULA

2つ(垂直)配列を連結するための最終的な式は以下である:(増加可読性のために追加いくつかの改行)

= 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( (行:$ A:$ A、行:$ A $ 1:$ A $ 4)+行($ B $ 1:$ B $ 3)) = COLUMN $ 1:INDEX($ 1:$ 1、ROWS($ A $ 1:$ A $ 4)))))+ 0、($ A:$ A、ROWS($ A $ 1:$ A $ 4)+ ROWS($ B $ 1:$ B $ 3)は、 )0) =(COLUMN($ A $ 1、INDEX($ 1:$ 1、ROWS($ B $ 1:$ B $ 3))))+ ROWS($ A $ 1:$ A $ 4))+ 0、 $ B $ 1: $ B $ 3) ' –

+0

Scottに感謝します。私はいつも '間接(住所。(...'。)を使う方法があるかどうか疑問に思っていました。しかし、普通は行/列全体をチェックしないでください。あなたのメソッドを「間接」よりも効率的に使用していますか? – ImaginaryHuman072889

+1

見た目の範囲を設定するだけで、完全な列/行に対するINDEXに損害はありません。 '$ A $ 7'よりもメモリを使用していません –

0

2つの任意の2つの垂直配列を連結するソリューションがあります(ただし、データは数値でなければなりません)。ここ

は、配列数式である(例えば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))))) 

そして、ここでは、揮発せずに2つの水平アレイ(例えば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))))) 
関連する問題