4つの(たとえば)列のデータがあり、それぞれが動的/スピル配列です。それらを別の列に「スタック」して、4つのオリジナルの「スプライス」を含む単一の動的/スピル配列を生成したいと思います。
VBAを使用せずに実行したいので、4つの初期配列のいずれかのサイズが変更された場合、最小限の変更が必要であり、理想的には、スプライシングに使用される式などを変更する必要はありません。
「ヘルパー」列の作成を含む方法はすでにありますが、理想的ではありません。これは次のように機能します(例 ここ ):
それは機能しますが、(少なくとも)2つの明らかな制限があります。
私がlikeしたいのは、それぞれC8、D8、E8、およびF8をルートとする4つの初期配列が与えられた場合(添付の例による)、このようなものを突き出すことができるようにすることです単一のセルに:
=(C8#、D8#、E8#、F8#)
そしてそれをすべて持っているJust Work。
何か案は?
P.S. DropBoxのExcelファイルへのリンクを使用して例を示しました。しかし、人々が私のようであるならば、彼らはインターネット上のランダムな男からのランダムなリンクをクリックすることに熱心ではないでしょう。私はそうしないことを知っています! (とはいえ、これはマルウェアをすべてにドロップしようとする非常に長い方法であるため、私が推測することは常にあります。:-))したがって、添付する、またはそうでない場合は、そのようなものを提供するより良い方法がある場合ファイル、聞いていただければ幸いです。
[〜#〜] vba [〜#〜]を避けたいとのことですが。ただし、再検討する場合:
VBAユーザー定義関数を使用する場合は、標準の配列数式をスタックするのと同じ方法で動的配列をスタックできます。
列[〜#〜] a [〜#〜]および[〜#〜のデータから開始するとします。 ] b [〜#〜]そして列[〜#〜] b [〜#〜]列[〜#〜] a [〜#〜]の一意のアイテムのすぐ下:
まず、このUDFを標準モジュールに入力します。
Public Function stack(arr1 As Variant, arr2 As Variant)
Dim i As Long, a
ReDim temp2(1 To UBound(arr1) + UBound(arr2))
i = 1
For Each a In arr1
temp2(i) = a
i = i + 1
Next a
For Each a In arr2
temp2(i) = a
i = i + 1
Next a
stack = Application.Transpose(temp2)
End Function
次に、C1に次のように入力します。
=stack(UNIQUE(A1:A7),UNIQUE(B1:B8))
注:
試してみてください:
B1: =FILTERXML("<t><s>" & SUBSTITUTE(TEXTJOIN(",",TRUE,TRANSPOSE($C$8:$F$17)),",","</s><s>")&"</s></t>","//s")
TEXTJOIN
は、範囲内の空白以外のエントリのコンマ区切りリストを作成します。TRANSPOSE
して、順序が行ではなく列であるようにします(これは、このタイプの範囲参照の通常のケースです。XML
を作成します。FILTERXML
は、各ノードを個別の配列要素に分割します。これにより、動的配列機能を使用して、列をSPILL
下に移動します。注:式では、ハードコードされた範囲を使用しました参照。ただし、私が持っていない情報によっては、ダイナミックレンジ参照を使用することもできます。しかし、それは範囲がどのように変化するかによって異なります。
最も簡単な方法は、これをテーブルにすることです。その場合、行/列を追加/削除/挿入すると、参照は自動的に展開/縮小されます
テーブルは、こぼれた配列ではうまく機能しません。
C12: =IFERROR(INDEX(SEQUENCE(C$6,1,IF(COLUMNS($A:A)=1,1,COLUMNS($A:A)*6),1),ROWS($1:1)),"")
また、上記と同じ式で範囲参照としてTable1
を使用しました。
そしてもちろん、数式は自動的にFill Down
します。
サンプルシート:
動的にこぼれた配列(テーブルの使用を排除する)を本当に使用したい場合は、サンプルワークシートで、次のような配列を動的に定義できます。
=$C$11:INDEX($A:$XFD,MAX($6:$6)+10,COUNT($6:$6)+2)
式は次のようになります。
=FILTERXML("<t><s>" & SUBSTITUTE(TEXTJOIN(",",TRUE,TRANSPOSE($C$11:INDEX($1:$1048576,MAX($6:$6)+10,COUNT($6:$6)+2))),",","</s><s>")&"</s></t>","//s")
ExcelがA:XFD
を1:1048576
に変更したことに注意しますが、それらは同じ領域(シート全体)を参照しています。