はじめに:Excelは、文字のパレットだ!
「Excelの関数で、文字列を操作する?」
そう思ったあなた、大正解!
CONCAT, TEXTJOIN, MID, REPLACE… Excelには、文字列を自在に操るための関数がたくさん用意されています。
でも、ちょっと待ってください!
もし、その操作を、INDEX関数と「配列定数」だけで、まるでアート作品を作るかのように実現できたとしたら…?
今回の記事は、Excelのセル範囲を「文字のパレット」に見立て、INDEX関数という「ピンセット」を使い、配列定数という「精密な設計図」に基づいて、一つの数式で様々な文字列や配列を組み上げる、超絶技巧の関数パズルです!

「INDEX関数で、そんなことできるの?」
できるんです!この冒険を通して、INDEX関数と配列定数の、知られざる本当の力を体感してください。
このミッションは、直接実務で役立つわけではないかもしれません。
しかし、INDEX関数、MID関数、そして配列定数を自在に操れるということを知ること、そのロジックを理解することこそが、あなたのExcelスキルを飛躍的に向上させる原動力になります。
さあ、「配列を制するものはExcelを制する!」を合言葉に、知的な冒険に出発しましょう!
本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
準備:文字のパレットを用意する
何事も、まずは準備から。まっさらなシートのA1セルを起点に、以下の10行3列(A1:J3)のキーボード配列(に似たもの)を作成してください。
(J3セルには半角スペース「” “」が入力されています。)
={"q","w","e","r","t","y","u","i","o","p";"a","s","d","f","g","h","j","k","l","";,"z","x","c","v","b","n","m",""," "}

これが、今回私たちが文字を拾い出す、唯一の「パレット」です。
そして、私たちのゴールは、このパレットだけを使い、たった一つの数式で、5つの異なる作品(文字列・配列)を創り出すことです。
5つのミッションで、「配列定数」をマスターせよ!
ミッション1:文字列 "excel" を創り出せ!

考えかた
まずは肩慣らしです。パレットから「e」「x」「c」「e」「l」の5文字を順番に拾い出し、CONCAT関数で連結して、一つの単語にします。
数式と解説
=CONCAT(INDEX(A1:J3,{1,3,3,1,2},{3,3,4,3,9}))
この数式の心臓部は、もちろんINDEX関数です。
INDEX(配列, 行番号, [列番号])の形で使いますが、今回は「行番号」と「列番号」に、配列定数を指定しています。
1. {1,3,3,1,2}: これが、拾いたい文字の「行番号」リストです。「e」は1行目、「x」は3行目、「c」は3行目…という対応です。

2. {3,3,4,3,9}: これが、「列番号」リストです。「e」は3列目、「x」は3列目、「c」は4列目…という対応です。

3. INDEX(A1:J3, {1,3,3,1,2}, {3,3,4,3,9}): INDEX関数は、この2つのリストを要素ごとにペアリングします。
- 1番目の要素:(1行目, 3列目) → “e“
- 2番目の要素:(3行目, 3列目) → “x“
- 3番目の要素:(3行目, 4列目) → “c“
- 4番目の要素:(1行目, 3列目) → “e“
- 5番目の要素:(2行目, 9列目) → “l“
結果として、{"e","x","c","e","l"}という横一列の配列(配列定数でカンマ,を使ったため)が生成されます。

最重要ポイント!ここで、行番号のリストを{1;3;3;1;2}のように縦(セミコロン区切り)にしてはいけません。
INDEX関数の引数に縦配列と横配列を渡すと、Excelは「行と列のすべての組み合わせ(総当たり)」の2次元配列を作ろうとしてしまい、意図した結果にならないのです。
1次元のリストが欲しい時は、行番号と列番号の配列の「形」を揃える(両方とも横、または両方とも縦)のが基本です!
下の画像のようになります。

4. CONCAT(...): 最後に、CONCAT関数が、{"e","x","c","e","l"}という配列の要素をすべて連結し、"excel"という一つの文字列を返します。

ミッション2:配列 {"good";"bad"} を創り出せ!

考えかた
次は、2行1列の「配列」として結果をスピルさせます。
まずINDEX関数で2行4列の文字の配列を作り、CONCATで連結。
最後にMID関数に「縦の配列定数」を渡すことで、文字列を2つに分割してスピルさせます。
数式と解説
=MID(CONCAT(INDEX(A1:J3,{2,1,1,2;3,2,2,3},{5,9,9,3;6,1,3,10})),{1;5},{4;3})
1. INDEX(A1:J3, {2,1,1,2;3,2,2,3}, {5,9,9,3;6,1,3,10}): 今回、INDEX関数の「行番号」と「列番号」には、2行4列の2次元配列定数を渡しています。
これにより、INDEX関数が返す結果も、同じ形の2次元配列になります。
- 1行目: (2,5)→”g”, (1,9)→”o”, (1,9)→”o”, (2,3)→”d”
- 2行目: (3,6)→”b”, (2,1)→”a”, (2,3)→”d”, (3,10)→” “
結果は {"g","o","o","d";"b","a","d"," "} となります。

本来このような工程は必要なく、2次元配列にする必要は全くありません。しかし、INDEX関数の挙動を紹介したかったので敢えて遠回りしています。
2. CONCAT(...): CONCAT関数は、2次元配列を「行ごと」に連結します。まず1行目の”good”、続いて2行目の”bad “が連結され、"goodbad "という一つの文字列ができます。

3. MID(..., {1;5}, {4;3}): 最後に、MID関数でこの文字列を分割します。
ここがミソ!第2引数(開始位置)と第3引数(文字数)に、{1;5}と{4;3}という「縦の配列定数」を渡しています。
- 1行目の計算:
MID("goodbad ", 1, 4)→"good" - 2行目の計算:
MID("goodbad ", 5, 3)→"bad"
結果として、{"good";"bad"}という縦2行の配列がスピルして表示されます!

ミッション3:文字列 "aBc" を創り出せ!
考えかた

今度は、パレットにない「大文字」を組み込みます。
文字コードを操る方法と、PROPER関数をハックする方法の2種類で挑みましょう。
数式1:UNICODE / UNICHARで文字コードを操る
=CONCAT(UNICHAR(UNICODE(INDEX(A1:J3,{2,3,3},{1,6,4}))+{0,-32,0}))
1. INDEX(A1:J3,{2,3,3},{1,6,4}): まず、パレットから {"a","b","c"} を抜き出します。

2. UNICODE(...): UNICODE関数で、各文字の文字コード(数値)に変換します。{97, 98, 99}

3. ... + {0,-32,0}: ここがトリック!この文字コードの配列に、{0,-32,0}という配列を足します。
アルファベットの小文字と大文字は、文字コードがちょうど「32」だけ離れているのです!{97+0, 98-32, 99+0} → {97, 66, 99}

4. UNICHAR(...): UNICHAR関数で、計算後の文字コードを再び文字に戻します。{97, 66, 99} → {"a","B","c"}
5. CONCAT(...): 最後に連結して、"aBc"の完成です!

数式2:PROPER関数をハックする
=CONCAT(MID(PROPER(CONCAT(INDEX(A1:J3,{3,2,3},{6,1,4}))),{2,1,3},1))
この数式は、一見不可解ですが、非常に巧妙です。
1. INDEX(A1:J3,{3,2,3},{6,1,4}): まず、”aBc”を作りたいのに、あえて {"b","a","c"} という順番で文字を抜き出します。

2. CONCAT(...): これを連結して "bac" という文字列を作ります。

3. PROPER(...): PROPER関数(単語の先頭文字を大文字にする)を使い、"Bac" という文字列に変換します。これで、欲しかった大文字の「B」が手に入りました!

4. MID(..., {2,1,3}, 1): 最後に、MID関数と配列定数を使って、この”Bac”という文字列を「並べ替え」ます。
MID("Bac", 2, 1)→ “a”MID("Bac", 1, 1)→ “B”MID("Bac", 3, 1)→ “c”
結果として {"a","B","c"} という配列が生成されます。
5. CONCAT(...): これを連結して、"aBc"の完成です。なんという執念!

ミッション4:配列 {"A","b";"c","D"} を創り出せ!

考えかた
ミッション1と3の合わせ技です。INDEX関数に2次元の配列定数を渡して2×2の配列を取り出し、同時に2次元の文字コード調整配列を使って、特定の位置だけを大文字にします。
数式と解説
=UNICHAR(UNICODE(INDEX(A1:J3,{2,3;3,2},{1,6;4,3}))+{-32,0;0,-32})
1. INDEX(A1:J3, {2,3;3,2}, {1,6;4,3}): ミッション2と同様、2次元の配列定数を渡します。
- (2,1)→”a”, (3,6)→”b”
- (3,4)→”c”, (2,3)→”d”
結果は {"a","b";"c","d"} という2×2の配列です。

2. UNICODE(...): 各文字の文字コード {97,98;99,100} を取得します。
3. ... + {-32,0;0,-32}: ここがクライマックス!2×2の「調整用」配列を足し合わせます。
・{97-32, 98+0; 99+0, 100-32} → {65,98;99,68}

4. UNICHAR(...): 最後に文字に戻します。{65,98;99,68} → {"A","b";"c","D"}
数式1つで、2×2の配列がスピルし、かつ大文字小文字が自在に操られました!

ミッション5:配列 {"Ab";"cD"} を創り出せ!

考えかた
これまでのすべてのテクニックを融合させた、集大成です。
ミッション4で2×2の配列を作り、それをCONCATで1本の文字列にし、ミッション2の方法で2行1列の配列に分割します。
数式と解説
=MID(CONCAT(UNICHAR(UNICODE(INDEX(A1:J3,{2,3;3,2},{1,6;4,3}))+{-32,0;0,-32})),{1;3},2)
1. UNICHAR(...): この部分は、アプローチ4の数式そのものです。これにより、{"A","b";"c","D"} という2×2の配列がメモリ上で生成されます。

2. CONCAT(...): CONCAT関数が、この2×2の配列を「行ごと」に連結します。1行目の”A”と”b”、2行目の”c”と”D”が順に連結され、"AbcD" という一つの文字列になります。

3. MID(..., {1;3}, 2): 最後に、ミッション2でも使った、MID関数と縦の配列定数を使った分割テクニックです。
- 1行目の計算:
MID("AbcD", 1, 2)→"Ab" - 2行目の計算:
MID("AbcD", 3, 2)→"cD"
結果として、{"Ab";"cD"}という、見事な2行1列の配列がスピルして表示されます!

まとめ:配列を制するものはExcelを制する!
たった一つのシンプルなゴールに対して、これほどまでに多様なアプローチが存在することに、楽しんでいただけたのではないでしょうか。
実務で” =CONCAT(MID(PROPER(CONCAT(INDEX(… “のような数式を書く日は、おそらく永遠に来ないでしょう(笑)。
しかし、今回の関数パズルたちは、決して無駄ではありません。
INDEX関数が行番号・列番号に配列定数(それも2次元の!)を受け取れること、MID関数が開始位置や文字数に配列定数を使えること、そしてUNICODEの「-32」のトリック…。
これらの知識は、あなたの「配列脳」を確実に鍛え、Excelの新しい可能性の扉を開いてくれます。
「配列を制するものはExcelを制する!」、この言葉を胸に、皆さんも自分だけの関数パズルを創造してみてくださいね!


