Excel 関数パズル!ジグザグ連番に挑戦

Excel 関数パズル!ジグザグ連番に挑戦 Excel

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

はじめに:ただの連番じゃ、つまらない!

「Excelで連番を作るなら、フィルハンドルをドラッグでしょ?」

そう思ったあなた、大正解!

ほとんどの場合、それが最も簡単で分かりやすい方法です。

でも、ちょっと待ってください!

もし、ただまっすぐに並んだ連番ではなく、こんなふうに…左右に揺れる「ジグザグの連番」を作りたくなったら、どうしますか?

Excelの説明画像

「え、こんなのどうやって作るの?手作業で一個ずつ入力するの?」

そんな退屈なことはさせません!今回の記事は、この美しいジグザグ模様を、Excelの「数式」だけで作り出す、思考のパズルです。

古典的なテクニックから、最新の強力な関数まで、なんと9種類ものアプローチでこの問題に挑みます。

目的は、

同じゴールに対して、いかに多くの道筋が存在するかを知り、Excelの柔軟性と表現力の豊かさを体感すること!

きっと、「こんな関数あったんだ!」「こんな使い方ができるなんて!」という発見があるはずです。

今回は、分かりやすさを重視して、1から20までの連番をA1:B20の範囲に作成することに挑戦します。

さあ、あなたのExcel関数への理解がさらに深まるかもしれない、楽しい冒険に出発しましょう!


Part 1:いにしえの技 – フィルコピーで作るジグザグ

まず、Excelの古き良き時代から伝わる、数式をコピーしていく方法です。

スピル機能がなかった頃、先人たちはこのような知恵で問題を解決していました。

しかし、このような配列を作ることはなかったと思います。笑

アプローチ1:IF + MOD(王道の論理パズル)

考えかた

ジグザグ模様は、言い換えれば「市松模様(チェッカーボード)」の位置に数字を配置することですよね。

つまり、セルの「行番号」と「列番号」が、それぞれ偶数か奇数かを判定すれば、この市松模様のロジックは作れそうです。

「奇数行・奇数列」と「偶数行・偶数列」の場所にだけ数字を置く、というルールを数式で表現してみましょう!

数式と解説

A1セルに、以下の数式を入力します。

=IF(MOD(ROW(A1),2)=MOD(COLUMN(A1),2),ROW(A1),"")

Excelの説明画像

入力したら、この数式をA1:B20の範囲にコピーしてください。

Excelの説明画像

この数式の心臓部は、MOD(ROW(A1),2)=MOD(COLUMN(A1),2) の部分です。

MOD(ROW(A1),2): 行番号を2で割った余りを求めます。奇数行なら「1」、偶数行なら「0」が返ります。

MOD(COLUMN(A1),2): 列番号を2で割った余りを求めます。A列(1列目)は「1」、B列(2列目)は「0」です。

... = ...: この二つの結果が等しいかどうかを判定します。

Excelの説明画像
  •  A1セル:行(奇数)の余り1 = 列(奇数)の余り1 → TRUE
  •  B1セル:行(奇数)の余り1 ≠ 列(偶数)の余り0 → FALSE
  •  A2セル:行(偶数)の余り0 ≠ 列(奇数)の余り1 → FALSE
  •  B2セル:行(偶数)の余り0 = 列(偶数)の余り0 → TRUE

IF(..., ROW(A1), ""): そして、IF関数が、判定結果がTRUEなら行番号そのものを、FALSEなら空白(””)を表示しているのです。見事なロジックですよね!

Excelの説明画像

アプローチ2:REPT(もう一つの王道)

考えかた

ロジックは先ほどと全く同じですが、IF関数の代わりにREPT関数を使ってみましょう。

REPT関数は、通常は文字を繰り返すための関数ですが、ちょっとした裏ワザがあるのです。

数式と解説

A1セルに、以下の数式を入力し、同じくA1:B20の範囲にコピーします。

=REPT(ROW(A1), MOD(ROW(A1),2)=MOD(COLUMN(A1),2))

この数式、一体どうなっているのでしょうか?

REPT(ROW(A1), ...): REPT関数は、REPT(繰り返したい文字, 回数) のように使います。今回は「行番号」を繰り返そうとしています。

Excelの説明画像

... MOD(...) = MOD(...): 第2引数の「回数」の部分には、アプローチ1と全く同じ論理式が入っています。

Excelでは、計算式の中で論理値を使うと、TRUEは「1」、FALSEは「0」として扱われます。

Excelの説明画像

つまり、条件に合うセルでは「行番号を1回繰り返す(=行番号を表示する)」、

合わないセルでは「行番号を0回繰り返す(=何も表示しない)」という命令になり、

IF関数と全く同じ結果を生み出すのです。面白い使い方ですよね!

Excelの説明画像

このままでは、数値が文字列として表示されているので、値に変換する必要がある場合は、以下のような数式にする必要があります。

=IFERROR(VALUE(REPT(ROW(A1), MOD(ROW(A1),2)=MOD(COLUMN(A1),2))),"")

VALUE関数で数値に変換しようとすると、残念ながら空白はエラーになります。

なので、IFERROR関数を使用してエラー処理をする必要があるのですが、今回はそこまで厳密に扱うつもりはないので、詳細は省略しますね。


Part 2:現代の魔法 – スピルで作るジグザグ

さて、ここからが本番です!

現代のExcelが誇る「スピル」機能と、強力な新関数たちを使って、たった一つの数式でこのジグザグ模様を一気に描き出します。

アプローチ3:IF + ISEVEN(シンプルなスピル配列)

A1セルに以下の数式を一つ入力するだけで、A1:B20の範囲に結果が自動で展開(スピル)されます。

=IF(ISEVEN(ROW(A1:A20)+COLUMN(A1:B1)),ROW(A1:A20),"")

Excelの説明画像

ROW(A1:A20): まず、ROW関数が {1;2;3;...;20} という、20行1列の「縦配列」を作ります。

Excelの説明画像

COLUMN(A1:B1): 次に、COLUMN関数が {1,2} という、1行2列の「横配列」を作ります。

Excelの説明画像

... + ...: この「縦配列」と「横配列」を足し算すると、Excelは自動的に配列を拡張(ブロードキャスト)し、20行2列の巨大な足し算の表をメモリ上で作ります。

Excelの説明画像

これを「動的配列」と呼びます。

ISEVEN(...): その足し算の結果が偶数かどうかをISEVEN関数が判定し、{FALSE,TRUE;TRUE,FALSE;...}という市松模様のTRUE/FALSE配列を作ります。

Excelの説明画像

IF(..., ROW(A1:A20), ""): 最後に、判定結果がTRUEの場所にだけ、ROW(A1:A20)が返す行番号の配列を表示させているのです。

アプローチ4:INDEX + TRANSPOSE(技巧派パズル)

=INDEX(IF(ISODD(TRANSPOSE(SEQUENCE(2,21))),TRANSPOSE(SEQUENCE(2,21))-{0,21},""),SEQUENCE(20),SEQUENCE(,2))

これは非常に技巧的で、まるで頭の体操のような数式です。

TRANSPOSE(SEQUENCE(2,21)): まず、SEQUENCE(2,21)で2行21列の連番配列を作り、それをTRANSPOSE関数で行と列を入れ替えて、21行2列の配列 {1,22; 2,23; ...} を生成します。

Excelの説明画像

IF(ISODD(...), ..., ""): 次に、この配列の数値が奇数かどうかを判定し、奇数だけを残します。結果は {1,""; "",23; 3,""; ...} という、歯抜けの配列になります。

Excelの説明画像

...-{0,21}: ここが最大のトリック!この歯抜けの配列から、{0,21}という横配列を引き算します。

Excelは賢いので、1列目からは0を、2列目からは21を引いてくれます。結果、{1,""; "",2; 3,""; ...} という、ほぼ完成形のジグザグ配列が生まれるのです!

Excelの説明画像

INDEX(..., SEQUENCE(20), SEQUENCE(,2)): 最後に、INDEX関数が、この21行2列の配列から、必要な「20行2列」の部分だけを綺麗に抜き出して、完成です。

Excelの説明画像

アプローチ5:CHOOSE(左右への振り分け)

=CHOOSE({1,2},IF(ISODD(SEQUENCE(20)),SEQUENCE(20),""),IF(ISEVEN(SEQUENCE(20)),SEQUENCE(20),""))

この数式は、「左の列」と「右の列」を別々に作り、最後に合体させるという、非常に賢いアプローチです。

IF(ISODD(SEQUENCE(20)),SEQUENCE(20),""): まず、SEQUENCE関数で1から20の連番を作り、ISODD関数で奇数行かどうかを判定します。

奇数行にだけ連番を配置した、1列目の配列 {1;"";3;"";...} が完成します。

IF(ISEVEN(SEQUENCE(20)),SEQUENCE(20),""): 同じように、今度はISEVEN関数で偶数行かどうかを判定し、偶数行にだけ連番を配置した、2列目の配列 {"";2;"";4;...} を作ります。

Excelの説明画像

CHOOSE({1,2}, ...): そして、CHOOSE関数が、{1,2}という配列定数を使って、

「1番目の引数(奇数列)を1列目に、2番目の引数(偶数列)を2列目に配置しなさい」

と命令し、2つの配列を合体させて2列のジグザグ配列を生成します。

これは、配列を結合するための伝統的なテクニックの一つです。

Excelの説明画像

アプローチ6:HSTACK(最新・最強の合体術)

=HSTACK(IF(MOD(SEQUENCE(20),2)=1,SEQUENCE(20),""),IF(MOD(SEQUENCE(20),2)=0,SEQUENCE(20),""))

アプローチ5のCHOOSEを使った方法は少しトリッキーでしたよね?
そこで登場するのが、最新関数HSTACKです!

【HSTACK関数の使い方】
HSTACK関数は、複数の配列を「水平方向(Horizontally)」にガチャンと連結する、非常にシンプルで強力な関数です。=HSTACK(配列1, 配列2, ...) のように使います。

この数式は、アプローチ5と全く同じように「奇数だけの列」と「偶数だけの列」を別々に作り、最後にそれをHSTACKで横に連結しているだけ。

CHOOSEよりもずっと直感的で分かりやすいですね!

Excelの説明画像

アプローチ7:WRAPROWS(1次元からの再構築)

=WRAPROWS(LET(s,SEQUENCE(40),IF(MOD(s,4)<=1,CEILING(s/2,1),"")),2)

これは、また全く違う角度からのアプローチです。

【WRAPROWS関数の使い方】
WRAPROWS関数は、1列(または1行)の長い配列を、指定した数で「折り返して(Wrap)」複数行の配列に変換する関数です。
=WRAPROWS(1次元配列, 折り返す数) のように使います。

この数式は、まずLET関数を使って、{1;"";"";2;3;"";"";4;...} のような、40個の要素を持つ「1次元の長い配列」を作り出します。(この配列を作るロジック自体も非常に巧妙です!)

Excelの説明画像

そして、最後にWRAPROWS関数が、この長い配列を「2個ずつ」折り返していくことで、目的の20行2列のジグザグ配列を再構築しているのです。

Excelの説明画像

まさにパズルですよね!

アプローチ8:MAKEARRAY + LAMBDA(無からの創造)

=MAKEARRAY(20,2,LAMBDA(r,c,IF(MOD(r,2)=MOD(c,2),r,"")))

ここからは、Excelの新次元を切り開くLAMBDA(ラムダ)関数の登場です!

【LAMBDAとMAKEARRAYの使い方】
LAMBDAは、自分だけのオリジナル関数を作る機能です。
そして、MAKEARRAYは、MAKEARRAY(行数, 列数, LAMBDA(r, c, 計算式)) のように使い、指定したサイズの配列を、LAMBDAで作った計算ルールに従ってゼロから生成する、まさに「創造主」のような関数です。
r」は行番号、「c」は列番号を意味します。

この数式は、「20行2列の配列を作る。各セルの値は、IF(MOD(r, 2) = MOD(c, 2), r, "")というルールで決めなさい」と命令しています。

お気づきですか?この計算ルール、アプローチ1で使ったものと全く同じですよね!

MAKEARRAYは、フィルコピーが必要だった古典的なロジックを、スピル機能の世界に昇華させてくれる、非常にエレガントな関数なのです。

Excelの説明画像

アプローチ9:REDUCE + LAMBDA(積み上げの美学)

=DROP(REDUCE(HSTACK("",""),SEQUENCE(20),LAMBDA(a,b,VSTACK(a,IF(MOD(b,2)=1,HSTACK(b,""),HSTACK("",b))))),1)

さあ、最後は最も難解で、しかし最も強力な方法の一つ、REDUCE関数です!

【REDUCE関数の使い方】
REDUCEは、REDUCE(初期値, 配列, LAMBDA(a, b, 計算式)) のように使います。
配列の各要素を順番に取り出し(b)、前のステップまでの計算結果(a)と合わせて、新しい計算結果を「蓄積(Accumulate)」していく、まるでループ処理のような関数です。

この数式は、

1. 空っぽの2列の配列からスタートし(HSTACK("",""))、

2. 1から20までの数字(SEQUENCE(20))を一つずつ取り出し、

3. その数字が奇数なら {数字, ""}、偶数なら {"", 数字} という新しい行を作り、

4. 前のステップまでに積み上げた配列の下に、新しい行をどんどん追加(VSTACK)していく…

という処理を20回繰り返しています。

Excelの説明画像

最後に、DROP関数で、最初の不要な空っぽの行を削除して完成です。

Excelの説明画像

一行一行、配列を組み立てていく様子は、まさに職人技ですね!

まとめ:同じゴール、無限のアプローチ

たった一つのシンプルなゴールに対して、これほどまでに多様なアプローチが存在することに、驚かれたのではないでしょうか。

古いけれど堅実なロジック、最新関数を使ったエレガントな解決策、そして一見難解でも強力なループ処理まで。

どの数式が優れている、というわけではありません。それぞれの数式に、それぞれの美学と歴史があります。

今回の関数パズルが、皆さんの「数式の引き出し」を増やし、Excelの持つ無限の可能性を感じるきっかけになれば、これほど嬉しいことはありません。


今回登場した関数リスト

比較的古い関数

  • IF(論理式, 値が真の場合, [値が偽の場合]): 条件を判定し、処理を分岐させます。
  • ROW([参照]): セルの行番号を返します。参照を範囲にすると、行番号の配列になります。
  • COLUMN([参照]): セルの列番号を返します。参照を範囲にすると、列番号の配列になります。
  • MOD(数値, 除数): 割り算の「余り」を返します。周期的な計算が得意です。
  • REPT(文字列, 繰り返し回数): 指定した文字列を、指定した回数だけ繰り返します。
  • ISEVEN(数値): 数値が偶数ならTRUEを返します。
  • ISODD(数値): 数値が奇数ならTRUEを返します。
  • SEQUENCE(行, [列], [開始], [ステップ]): 連続した数値の配列を生成します。
  • INDEX(配列, 行番号, [列番号]): 配列の中から、指定した行と列の位置にある値を取り出します。
  • TRANSPOSE(配列): 配列の行と列を入れ替えます。
  • CHOOSE(インデックス, 値1, [値2], …): インデックス番号に基づいて、リストから値を選択します。配列操作にも使えます。

新しい関数

  • HSTACK(配列1, [配列2], …): 複数の配列を水平方向(横)に連結します。
  • VSTACK(配列1, [配列2], …): 複数の配列を垂直方向(縦)に連結します。
  • WRAPROWS(ベクトル, 折り返す数, [空白処理]): 1次元の配列を指定した数で折り返し、2次元の配列に変換します。
  • LET(名前1, 値1, [名前2, 値2…], 計算): 数式内で計算結果や値に名前をつけ、可読性を高めます。
  • MAKEARRAY(行数, 列数, LAMBDA): LAMBDAで定義したルールに従って、指定したサイズの配列を生成します。
  • REDUCE(初期値, 配列, LAMBDA): 配列の各要素を順番に処理し、結果を蓄積していきます。
  • DROP(配列, 行数, [列数]): 配列の先頭または末尾から、指定した数の行または列を削除します。
  • LAMBDA(引数, 計算式): オリジナルのカスタム関数を作成する機能。他の関数と組み合わせて使います。
タイトルとURLをコピーしました