はじめに:HSTACKがない?なら作ればいいじゃない!
最近のExcelにはHSTACKという便利な関数があり、これを使えば離れたセル範囲を簡単に「横方向」に連結できます。

しかし、現実のオフィス環境はどうでしょうか?
「会社のPCがいまだにExcel 2019で…」
「取引先に送るファイルだから、最新関数を使うとエラーになっちゃう…」
そんな「HSTACKを使いたくても使えない」という切実な状況、よくありますよね。
でも、そこで諦めて手作業でコピペするなんて、Excel使いの名折れです。
これができると何が嬉しいの?
あえてHSTACKを使わずに配列操作をマスターすることには、以下のような大きなメリットがあります。
今回は、A1:D10にあるデータを題材に、3つの「ミッション」を通して、配列結合の奥義を10個の数式で紹介します。
初心者の方も、パズル感覚で楽しんでいってください!
本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
冒険の準備:今回のターゲット
まずは、以下の配列がA1:D10に入力されているものとします。
=TRANSPOSE(SEQUENCE(4,10))

ここから、必要なデータを抜き出して、横にくっつけていきます。
【重要】配列定数({})について
今回の数式では {1,0} や {1,2} といった記述が頻出します。
これは「配列定数」と呼ばれ、数式の中で直接配列を作るテクニックです。
・カンマ(,)区切り:横方向(列)の配列
・セミコロン(;)区切り:縦方向(行)の配列
今回は「横に並べたい」ので、カンマ区切りが大活躍します!
ミッション1:不連続な列の結合(基本編)
関数の詳細な仕様については、Microsoft公式のヘルプも参考にしてください。
【目標】
離れている「A列」と「C列」をくっつけて、2列の表を作ってください。
{1,21;2,22;3,23;4,24;5,25;6,26;7,27;8,28;9,29;10,30}

数式1:IF関数で無理やり(変態的発想)
当ブログではおなじみ、まずはIF関数を使った力技から紹介します。
=IF({1,0},A1:A10,C1:C10)
【解説】
「IF関数って条件分岐でしょ?」と思いますよね。
でも配列定数を使うと魔法が起きます。
{1,0} は {TRUE, FALSE} と同じ意味です。
Excelはこれを「左側」と「右側」の箱として認識します。
- 1つ目(TRUE=左): 「真の場合」である
A1:A10を表示。 - 2つ目(FALSE=右): 「偽の場合」である
C1:C10を表示。
これだけで、2つの列が横に並びます。シンプルですが強力な、まさに変態的(褒め言葉)なテクニックです。

このテクニックを使って、VLOOKUP関数で左側のデータを取得する方法を以下の記事で紹介しています。
数式2:INDEX関数の王道
次に、最も汎用性が高く、理解しやすいのがこの方法です。
=INDEX(A1:D10,ROW(A1:D10),{1,3})
【解説】INDEX(範囲, 行, 列) を使用します。
・行:ROW(...)ですべての行を指定。
・列:{1,3} と指定することで、「1列目と3列目を持ってきて!」と命令しています。
飛び飛びの列を参照する際の基本テクニックです。

数式3:INDEXの隠された引数「領域番号」
続いて紹介するのは、知っている人が極めて少ないマニアックな技です。
=INDEX((A1:A10,C1:C10),ROW(A1:A10),,{1,2})
【解説:INDEX関数の第4引数「領域番号」とは?】
通常、INDEX関数は INDEX(範囲, 行, 列) で使いますが、実は第4引数まで指定できる「参照形式」という使い方があります。

=INDEX( (範囲1, 範囲2, ...), 行, 列, [領域番号] )
(範囲1, 範囲2, …) の指定方法:
第1引数に、複数の離れた範囲を指定したい場合、全体をカッコ () で囲み、カンマで区切ります。
今回は (A1:A10, C1:C10) とすることで、2つの飛び地を1つのグループとして渡しています。
領域番号とはなにか?:
第1引数で指定した範囲のうち、「何番目の範囲(領域)を使うか」を指定する番号です。
・領域1 = A列
・領域2 = C列

となります。今回は {1,2} と指定しているので、「1列目に領域1、2列目に領域2を表示せよ」となります。

豆知識:AREAS関数
ちなみに、このように指定された範囲が「いくつあるか」を数える AREAS という関数もあります。
=AREAS((A1:A10, C1:C10)) とすると「2」が返ります。
INDEX関数やAREAS関数は、このように複数の範囲(参照)を直接扱える数少ない関数です。

数式4:CHOOSE関数(古の技)
しかし、もっと昔からある、由緒正しい結合方法もあります。
=CHOOSE({1,2},A1:A10,C1:C10)
【解説】CHOOSE(インデックス, 値1, 値2...) は、インデックスに対応した値を返します。
インデックスに {1,2} を渡すことで、「1列目には値1(A列)、2列目には値2(C列)」というふうに、配列として結果を返してくれます。

数式5:CHOOSECOLS(最新の動的配列)
最新のExcelを使っているなら、これが一番簡単です。
=CHOOSECOLS(A1:D10,1,3)
【解説】
その名の通り「列を選ぶ(CHOOSE COLumnS)」関数です。
「元の表から、1列目と3列目を選んでね」と書くだけ。
配列定数 {} すら不要です。
ただし、あくまで「元の表から列を抜く」だけなので、行がズレている場合(次のミッション)には使えません。

ミッション2:行ズレありの結合(中級編)
【目標】
「A1:B5(左上)」と「C6:D10(右下)」をくっつけてください。
{1,11,26,36;2,12,27,37;3,13,28,38;4,14,29,39;5,15,30,40}

数式6:領域番号のフル活用
先ほど解説した「領域番号」テクニックの応用版です。
=INDEX((A1:B5,C6:D10),ROW(A1:A5),{1,2,1,2},{1,1,2,2})
【解説】
ここが今回一番の難所かもしれません!
まるで「DJが2つのレコード(領域)を交互にかける」かのように、INDEX関数がデータをピックアップしています。
作りたいのは「4列」の表です。
・第3引数(列):{1, 2, 1, 2} → 各レコードの「何曲目(列)」をかけるか?
・第4引数(領域):{1, 1, 2, 2} → 「どっちのレコード(領域)」をかけるか?
つまり…
1列目:領域1の1列目 (A列)
2列目:領域1の2列目 (B列)
3列目:領域2の1列目 (C列)
4列目:領域2の2列目 (D列)
これらをシンクロさせて、4列の配列を生成しています。

この配列定数を使用したテクニックは、以下の記事で詳しく解説しています。
数式7:CHOOSEでシンプルに
CHOOSE関数なら、もっと直感的に書けます。
=CHOOSE({1,2,3,4},A1:A5,B1:B5,C6:C10,D6:D10)
または、=CHOOSE(SEQUENCE(,4),A1:A5,B1:B5,C6:C10,D6:D10)
【解説】
A1:B5をまとめて指定せず、1列ずつバラバラにして 値1, 値2, 値3, 値4 として渡しています。
これなら「1列目はこれ、2列目はこれ…」と順番に並べるだけでOKです。

ミッション3:異なる列幅の結合(上級編)
【目標】
「A1:B5(2列幅)」と「D6:D10(1列幅)」を結合します。
2列のものと1列のものを、どうやって横に並べましょうか?
{1,11,36;2,12,37;3,13,38;4,14,39;5,15,40}

数式8:IF関数の限界突破
意地でもIF関数でやるんだ!という強い意志を感じる数式です。Z
=IF({1,1,0},A1:B5,D6:D10)
【解説】
この {1,1,0} という指定が超マニアックです!
これは「全体で3列作るよ」という宣言でもあります。
- 1列目 (1=TRUE):
A1:B5を参照します。範囲の先頭列(A列)が入ります。 - 2列目 (1=TRUE): また
A1:B5を参照します。ここでExcelの「スピルの隠れた性質」が発動します!

【スピルの隠れた性質:自動スライド】
広い範囲(2列以上)を連続して指定すると、Excelが気を利かせて「おっと、次は2列目(B列)を表示したいんだな?」と判断し、列を自動的にズラしてくれます。
- 3列目 (0=FALSE):
D6:D10(偽の場合)を参照して埋めます。
この仕様を知っていると、複雑な結合も怖くありません。

数式9:CHOOSEでも同じ考え方
CHOOSEの場合も、ロジックは同じです。
=CHOOSE({1,1,2},A1:B5,D6:D10)
【解説】
インデックスを {1, 1, 2} と指定しています。
・1列目:値1 (A1:B5) の1列目
・2列目:値1 (A1:B5) の2列目(ここで自動スライドが発動!)
・3列目:値2 (D6:D10) の1列目
「幅の広い範囲は、連続して指定すると勝手に列が進む」という挙動を知っていると、こんなに短く書けるんですね。

数式10:MAKEARRAYで現代的に
最後に、最新のLAMBDAヘルパー関数を使った方法です。
=MAKEARRAY(5,3,LAMBDA(r,c,IF(c<=2,INDEX(A1:B5,r,c),INDEX(D6:D10,r))))
【解説】
プログラミング的な発想です。
- 5行3列の箱を作れ
- もし列番号(c)が2以下なら A1:B5 から取れ
- それ以外なら D6:D10 から取れ
という命令を書いています。
非常に論理的で、どんな複雑な合体パズルでもこれなら解くことができます。

まとめ:HSTACKがなくても大丈夫!
今回は「HSTACK関数なしで配列を連結する」というミッションに挑戦しました。
IF({1,0},...) や INDEX の領域番号など、初めて見るテクニックもあったのではないでしょうか?
これらの技を知っていれば、古いExcel環境でも、複雑なデータ整形を数式だけで華麗にこなすことができます。
「道具(関数)がないなら、知恵で補う」。これぞExcelの醍醐味ですね!
ぜひ、実務の中でこっそり使って、同僚を驚かせてみてください!







