はじめに:その表、ギュウギュウ詰めになっていませんか?
Excelでリストやシフト表を作っているとき、こんな風に思ったことはありませんか?
「データとデータの間が詰まりすぎてて見にくいなぁ…」
「1行ずつ空白行が入っていれば、もっと見やすくなるのに!」
例えば、こんな社員リストがあったとします。
{"社員01";"社員02";"社員03"...}

これを、手作業で行を挿入するのではなく、数式一発でこんな風に変換できたら最高ですよね?
{"社員01";"";"社員02";"";"社員03"...}

これは、シフト表のガントチャートを見やすくしたり、印刷用の帳票を整えたりする時に、地味ながら絶大な効果を発揮するテクニックです。
※空白行を入れている例(下の画像)

今回は、この「配列の間に空白を差し込む」というミッションに、3つのアプローチで挑戦します。
「たかが空白、されど空白」
このパズルが解けたとき、Excelの配列操作をまた一つ深く理解しているはずです!
上記の、ガントチャートを使用したシフト表の作成については、
Excelでバーが伸びるシフト表を作る方法にて紹介しています!
本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
準備:テストデータ(行間のない配列)
まずは準備です。まっさらなシートのA1セルを起点に、以下のリストを作成してください。
※以下の数式をA1セルに貼り付けます!
={"社員01";"社員02";"社員03";"社員04";"社員05";"社員06"}

まずはこの「空白のないデータ」を使って、行間にきれいに空白を挿入できるか試していきます。
そして後半では、あえて「元データに空白が含まれている場合」の挙動も検証しますよ!

アプローチ1:TOCOL & HSTACK(横に付けて縦にする)
考えかた
まずは、最も直感的な方法です。
元のデータの「右隣」に空白(ダミーデータ)をくっつけて、それを「縦一列」に並べ直せば、データ→空白→データ…という順序になりますよね?

数式と解説
=LET(
元, A1:A6,
行数, ROWS(元),
並び, TOCOL(HSTACK(元, SEQUENCE(行数)*0)),
値, IF(並び=0, "", 並び),
DROP(値, -1)
)
【関数の解説】
・LET(名前1, 値1, 名前2, 値2, ..., 計算式):数式内で変数を使えるようにして、見やすくする関数です。
・ROWS(範囲):範囲内の行数を返します。
・HSTACK(配列1, 配列2):配列を横方向(水平)に連結します。
・SEQUENCE(行, [列], [開始], [目盛り]):連番を作成します。
・TOCOL(配列):多次元配列を縦一列の配列に変換します。
・DROP(配列, 行数):配列の先頭または末尾から指定した行数を削除します。
【ロジックの分解】
並び:TOCOL(HSTACK(元,SEQUENCE(行数)*0))
まず、SEQUENCE(6)*0 で「0」が6個並んだ縦配列を作ります。
これを元のデータの右に結合します。

{"社員01", 0; "社員02", 0; ...} という2列のデータができます。
これを TOCOL で縦一列にすると、{"社員01"; 0; "社員02"; 0; ...} となります。

値:IF(並び=0, "", 並び)
ダミーとして入れた「0」を、本物の「空白(””)」に変換します。

DROP(..., -1):
このままだと、一番最後にも空白(0から変換されたもの)がついてしまいます。
今回のルールは「最後には入れない」なので、DROP関数で末尾の1行を削除して完成です!

ここまでのロジックをLET関数で整理します。

検証:元データに「空白」があったら?
では、意地悪な検証をしてみましょう。
A3セルの「社員03」を消して、元データ自体に空白を作ってみてください。
={"社員01";"社員02";"";"社員04";"社員05";"社員06"}
結果はどうなりましたか?
{"社員01";"";"社員02";"";"";"";"社員04"...}

お見事!
「社員02」の下の挿入された空白行と、「社員04」の上の挿入された空白行の間に、元々のA3セルの空白もしっかり反映されています。
IF(並び=0, "", ...) の処理により、ダミーの0も、元データの空白(Excelでは0として扱われることが多い)も、まとめて「””」に変換されるため、破綻することなく動作するのです。
アプローチ2:INDEX & SEQUENCE(計算で場所を指定)
考えかた
次は、数学的なアプローチです。
新しい配列の「奇数番目」にはデータを、「偶数番目」には空白を入れる、というルールを数式で作ります。
数式と解説
=LET(
元, A1:A6,
行数, ROWS(元),
並び, SEQUENCE(行数*2-1),
値, INDEX(元, (並び+1)/2),
IF(MOD(並び, 2)=1, IF(値="", "", 値), "")
)
【関数の解説】
・INDEX(範囲, 行番号):指定した位置のデータを取り出します。
・MOD(数値, 除数):割り算の余りを求めます。
【ロジックの分解】
並び:SEQUENCE(行数*2-1)
最終的な行数は「元の行数 × 2 – 1」になります(間の数なので)。
1から11までの連番を作ります。
値:INDEX(元, (並び+1)/2)
ここがポイント!連番を加工して、参照したい行番号を作ります。
- 1番目 → (1+1)/2 = 1 → 1行目
- 2番目 → (2+1)/2 = 1.5 → 1行目(INDEXは小数を切り捨てます!)
- 3番目 → (3+1)/2 = 2 → 2行目
これで、{"社員01"; "社員01"; "社員02"; "社員02"...} という、同じデータが2回ずつ続く配列が仮想的に作られます。

IF(MOD(並び, 2)=1, ...)
「奇数番目(1, 3, 5…)」ならデータを表示し、「偶数番目(2, 4, 6…)」なら空白にします。

これで、ダブっていたデータの片方が空白に変わり、目的の配列が完成します!

古いExcel(2019以前)で再現する数式
「LET関数もSEQUENCE関数も使えない!」
そんな環境でも諦めないでください。
先ほどのロジックを、昔ながらの関数だけで書き換えてみましょう。
=IF(MOD(ROW(INDIRECT("A1:A"&ROWS(A1:A6)*2-1)),2)=0,"",IF(INDEX(A1:A6,(ROW(INDIRECT("A1:A"&ROWS(A1:A6)*2-1))+1)/2)="","",INDEX(A1:A6,(ROW(INDIRECT("A1:A"&ROWS(A1:A6)*2-1))+1)/2)))
長い!
ですが、やっていることは同じです。
・SEQUENCE(行数*2-1) の代わりに ROW(INDIRECT("A1:A" & 行数*2-1)) を使って連番を作っています。
・変数が使えないので、同じ計算式(INDEXなど)を何度も書いています。
Excel 2019以前をお使いの方は、範囲を選択して数式を入力し、Ctrl + Shift + Enter で「配列数式」として確定してください。
Excel 2021以降、またはWeb版Excelなら、そのまま入力するだけでスピルして表示されます!

アプローチ3:REDUCE & VSTACK(積み上げ方式)
考えかた
最後は、プログラミング的な「ループ処理」の発想です。
データを上から順番に取り出し、「今までのデータの下に、『新しいデータ』と『空白』を積む」という作業を繰り返します。
数式と解説
=LET(
元, A1:A6,
配列, REDUCE("", 元, LAMBDA(累積, 値, VSTACK(累積, IF(値="", "", 値), ""))),
DROP(DROP(配列, 1), -1)
)
【関数の解説】
・REDUCE(初期値, 配列, LAMBDA(累積, 変数, 計算式)):配列の要素を一つずつ取り出し、累積して計算します。
・VSTACK(配列1, 配列2):配列を縦方向(垂直)に連結します。
【ロジックの分解】
REDUCE & VSTACK
初期値「””」からスタートし、各データが来るたびに VSTACK(累積, データ, "") を実行します。
つまり、「これまでの束」の下に「データ」を置き、さらにその下に「空白」を置く、というサンドイッチを積み重ねていきます。

DROP(DROP(配列, 1), -1)
この方法だと、スタート時の初期値「””」が先頭に残り、各ループの最後につけた「””」が末尾に残ってしまいます。
そこで、DROP(..., 1) で先頭の1行を消し、DROP(..., -1) で末尾の1行を消すことで、形を整えています。

【注意点】
このREDUCEを使った方法は非常に強力ですが、元の配列にエラー値(#N/Aなど)が含まれていると、数式全体がエラーになってしまいます。
エラーが含まれる可能性がある場合は、アプローチ1か2がおすすめです。

応用編:2次元配列(複数列)でもできる?
「名前」の隣に「ID」があるような、2列以上のデータでも同じことができるでしょうか?
アプローチ2(INDEX & SEQUENCE)を少し改造すれば、簡単に対応できます!
A1:B6に以下のデータがあるとします。
{"社員01","A123";"","";"社員02","A456";"","";"社員03","A789";"","";"社員04","B123";"","";"社員05","B456";"","";"社員06","B789"}

以下の数式で2列の配列に対応できます!
=LET(
元, A1:B6,
行数, ROWS(元),
並び, SEQUENCE(行数*2-1),
値, INDEX(元, (並び+1)/2, {1,2}),
IF(MOD(並び, 2)=1, IF(値="", "", 値), {"", ""})
)
【変更点】
1. INDEX(..., {1,2}):列番号を {1, 2} と配列で指定することで、1列目と2列目の両方を同時に取得します。
2. {"", ""}:空白を挿入する際、1列だけの "" ではなく、2列分の空白 {"", ""} を指定します。
これで、2列のデータも綺麗に行間を空けて表示されましたね!

3列、4列と増えても、{1,2,3} や {"","",""} の部分を増やすだけで対応可能です。
もちろん、空白やエラー値があっても問題なく動作します。
まとめ:空白でデザイン力アップ!
この技術は、単なる暇つぶしではありません。
実務でも以下のようなシーンで大活躍します。
- 印刷用リストの作成:行間に空白を入れることで、手書きでメモを書き込めるスペースを作れます。
- ガントチャートの視認性向上:バーチャートが密集していると見づらいですが、1行空けるだけで劇的に見やすくなります。
- ダッシュボードのデザイン:データをブロックごとに分けたい時、数式だけでレイアウトを調整できます。
- CSV出力前の整形:システム連携などで「データ区切り行」が必要な場合にも対応できます。
「データを加工する」だけでなく、「データの見せ方を整える」のも、Excel関数の重要な役割です。
ぜひ、あなたのシートにも「余裕のある空白」を取り入れて、ワンランク上の資料を作ってみてくださいね!



