HSTACKがない?Excelで離れた列を横に結合する10の配列テクニック

HSTACKがない?Excelで離れた列を横に結合する10の配列テクニック 実務の深淵

はじめに:HSTACKがない?なら作ればいいじゃない!

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

Excelの説明画像

しかし、現実のオフィス環境はどうでしょうか?

「会社のPCがいまだにExcel 2019で…」
「取引先に送るファイルだから、最新関数を使うとエラーになっちゃう…」

そんな「HSTACKを使いたくても使えない」という切実な状況、よくありますよね。

でも、そこで諦めて手作業でコピペするなんて、Excel使いの名折れです。

これができると何が嬉しいの?

あえてHSTACKを使わずに配列操作をマスターすることには、以下のような大きなメリットがあります。

  • 古いExcel環境でも戦える: バージョンや互換性を気にせず、涼しい顔でデータを整形できるようになります。
  • 関数の「真の力」を理解できる: INDEX関数の領域番号や、IF関数の配列処理など、普段意識しない関数のマニアックな挙動を深く理解することで、応用力が飛躍的に向上します。
  • 「発想力」が鍛えられる: 専用の便利機能がない状況でどう解決するか?というパズルを解くことで、Excelスキル全体の底上げになります。

今回は、A1:D10にあるデータを題材に、3つの「ミッション」を通して、配列結合の奥義を10個の数式で紹介します。

初心者の方も、パズル感覚で楽しんでいってください!

本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!

冒険の準備:今回のターゲット

まずは、以下の配列がA1:D10に入力されているものとします。

=TRANSPOSE(SEQUENCE(4,10))

Excelの説明画像

ここから、必要なデータを抜き出して、横にくっつけていきます。

【重要】配列定数({})について
今回の数式では {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}

Excelの説明画像

数式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つの列が横に並びます。シンプルですが強力な、まさに変態的(褒め言葉)なテクニックです。

Excelの説明画像

このテクニックを使って、VLOOKUP関数で左側のデータを取得する方法を以下の記事で紹介しています。

数式2:INDEX関数の王道

次に、最も汎用性が高く、理解しやすいのがこの方法です。

=INDEX(A1:D10,ROW(A1:D10),{1,3})

【解説】
INDEX(範囲, 行, 列) を使用します。

・行:ROW(...)ですべての行を指定。
・列:{1,3} と指定することで、「1列目と3列目を持ってきて!」と命令しています。

飛び飛びの列を参照する際の基本テクニックです。

Excelの説明画像

数式3:INDEXの隠された引数「領域番号」

続いて紹介するのは、知っている人が極めて少ないマニアックな技です。

=INDEX((A1:A10,C1:C10),ROW(A1:A10),,{1,2})

【解説:INDEX関数の第4引数「領域番号」とは?】

通常、INDEX関数は INDEX(範囲, 行, 列) で使いますが、実は第4引数まで指定できる「参照形式」という使い方があります。

Excelの説明画像

=INDEX( (範囲1, 範囲2, ...), 行, 列, [領域番号] )

(範囲1, 範囲2, …) の指定方法:
第1引数に、複数の離れた範囲を指定したい場合、全体をカッコ () で囲み、カンマで区切ります。
今回は (A1:A10, C1:C10) とすることで、2つの飛び地を1つのグループとして渡しています。

領域番号とはなにか?:
第1引数で指定した範囲のうち、「何番目の範囲(領域)を使うか」を指定する番号です。

・領域1 = A列
・領域2 = C列

Excelの説明画像

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

Excelの説明画像

豆知識:AREAS関数
ちなみに、このように指定された範囲が「いくつあるか」を数える AREAS という関数もあります。

=AREAS((A1:A10, C1:C10)) とすると「2」が返ります。

INDEX関数やAREAS関数は、このように複数の範囲(参照)を直接扱える数少ない関数です。

Excelの説明画像

数式4:CHOOSE関数(古の技)

しかし、もっと昔からある、由緒正しい結合方法もあります。

=CHOOSE({1,2},A1:A10,C1:C10)

【解説】
CHOOSE(インデックス, 値1, 値2...) は、インデックスに対応した値を返します。

インデックスに {1,2} を渡すことで、「1列目には値1(A列)、2列目には値2(C列)」というふうに、配列として結果を返してくれます。

Excelの説明画像

数式5:CHOOSECOLS(最新の動的配列)

最新のExcelを使っているなら、これが一番簡単です。

=CHOOSECOLS(A1:D10,1,3)

【解説】
その名の通り「列を選ぶ(CHOOSE COLumnS)」関数です。

「元の表から、1列目と3列目を選んでね」と書くだけ。
配列定数 {} すら不要です。

ただし、あくまで「元の表から列を抜く」だけなので、行がズレている場合(次のミッション)には使えません。

Excelの説明画像

ミッション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}

Excelの説明画像

数式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列目:領域11列目 (A列)
2列目:領域12列目 (B列)
3列目:領域21列目 (C列)
4列目:領域22列目 (D列)

これらをシンクロさせて、4列の配列を生成しています。

Excelの説明画像

この配列定数を使用したテクニックは、以下の記事で詳しく解説しています。

数式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です。

Excelの説明画像

ミッション3:異なる列幅の結合(上級編)

【目標】
「A1:B5(2列幅)」と「D6:D10(1列幅)」を結合します。

2列のものと1列のものを、どうやって横に並べましょうか?

{1,11,36;2,12,37;3,13,38;4,14,39;5,15,40}

Excelの説明画像

数式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の「スピルの隠れた性質」が発動します!
Excelの説明画像

【スピルの隠れた性質:自動スライド】
広い範囲(2列以上)を連続して指定すると、Excelが気を利かせて「おっと、次は2列目(B列)を表示したいんだな?」と判断し、列を自動的にズラしてくれます。

  • 3列目 (0=FALSE): D6:D10 (偽の場合)を参照して埋めます。

この仕様を知っていると、複雑な結合も怖くありません。

Excelの説明画像

数式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列目

「幅の広い範囲は、連続して指定すると勝手に列が進む」という挙動を知っていると、こんなに短く書けるんですね。

Excelの説明画像

数式10:MAKEARRAYで現代的に

最後に、最新のLAMBDAヘルパー関数を使った方法です。

=MAKEARRAY(5,3,LAMBDA(r,c,IF(c<=2,INDEX(A1:B5,r,c),INDEX(D6:D10,r))))

【解説】
プログラミング的な発想です。

  1. 5行3列の箱を作れ
  2. もし列番号(c)が2以下なら A1:B5 から取れ
  3. それ以外なら D6:D10 から取れ

という命令を書いています。

非常に論理的で、どんな複雑な合体パズルでもこれなら解くことができます。

Excelの説明画像

まとめ:HSTACKがなくても大丈夫!

今回は「HSTACK関数なしで配列を連結する」というミッションに挑戦しました。

IF({1,0},...)INDEX の領域番号など、初めて見るテクニックもあったのではないでしょうか?

これらの技を知っていれば、古いExcel環境でも、複雑なデータ整形を数式だけで華麗にこなすことができます。

「道具(関数)がないなら、知恵で補う」。これぞExcelの醍醐味ですね!

ぜひ、実務の中でこっそり使って、同僚を驚かせてみてください!

タイトルとURLをコピーしました