Excelに追加されたSEQUENCE関数の真のポテンシャル

Excelの新しいバージョンに搭載された、連番を作成するSEQUENCE関数の動作がかなり面白いので紹介します。
この関数は連番の一覧表を作成する関数なので、スピル範囲を出力します。
スピルについては、こちらの記事が詳しいです。

<a href="https://qiita.com/yosatonet/items/2fc441343d210a484789">新しいExcelの一番の変更点は「スピル」？</a>

SEQUENCE関数はどうやら単純な連番作成だけではないようです。
# SEQUENCE関数のキホン
SEQUENCE関数は単体では単純に連番の一覧表を作成します。

```
=SEQUENCE(5)
```
の結果は次の通り、縦に１から５までの連番です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/a0b6c8e5-4eab-6484-1b90-670231c37c2d.png)

```
=SEQUENCE(1,5)
```
の結果は次の通り、横に１から５までの連番です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/1a5eb381-75b1-a062-857b-dde577a1dfc2.png)

```
=SEQUENCE(5,3)
```
の結果は次の通り、縦５行、横３列の１から１５までの連番です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/42357f52-067f-f306-e2ce-324a295623ae.png)

```
=SEQUENCE(5,3,11)
```
の結果は次の通り、縦５行、横３列の１１から２５までの連番です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/76d26924-9f76-3ef9-853a-ec9873fe7fd8.png)

```
=SEQUENCE(5,3,11,10)
```
の結果は次の通り、縦５行、横３列の１１から１０ステップの１５１までの連番です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/a256da50-0069-9f64-7bce-25c970a6981d.png)

# IF関数と組み合わせる
SEQUENCE関数とIF関数を組み合わせてみます。

```
=IF(SEQUENCE(5,3)<=3,{"A","B","C"},SEQUENCE(5,3))
```
１から５までの１行目には、A、B、Cの項目名が入り、それ以下では連番になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/4bc49828-cd87-43d6-29c6-28c41f56bcc2.png)

連番が４から始まるのは気に入らないので、１から始まるように、連番作成部分を-2から始まるようにします。

```
=IF(SEQUENCE(5,3)<=3,{"A","B","C"},SEQUENCE(5,3,-2))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/e67021db-4390-cf54-7921-8d4f81ddf5f8.png)

# さらにMOD関数と組み合わせる
SEQUENCE関数とIF関数にMOD関数を組み合わせてみます。

```
=IF(MOD(SEQUENCE(5,3),3)=1,{"A";"B";"C";"D";"E"},SEQUENCE(5,3))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/c96fd8cd-89b5-d9ed-2f76-cc47a66b8427.png)
１列目にアルファベットを表示しました。
# SEQUENCE関数を複数使う
SEQUENCE関数の中にSEQUENCE関数を使ってみます。
その前に、セルE1に、次の関数を入れてみます。

```
=SEQUENCE(5,1)
```
セルF1に、次の関数を入れてみます。

```
=SEQUENCE(5,1,10,10)
```
セルG1に、次の関数を入れてみます。

```
=SEQUENCE(5,1,100,100)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/da4923a7-7fa0-03e5-481c-b0916933be0c.png)

ここまでで３ブロックが出来上がります。
次にセルA1に、次の関数を入れてみます。

```
=SEQUENCE(1,3)
```
横に１から３の数字が並びました。
この数字ごとに、E、F、G列の内容をぶら下げてみましょう。
セルA1の数値ごとに3つのSEQUENCE関数に振り分けるので、CHOOSE関数を使います。

```
=CHOOSE(SEQUENCE(1,3),パターン1,パターン2,パターン3)
```
となります。
この各パターンにE、F、G列の計算式を入れるので、

```
=CHOOSE(SEQUENCE(1,3),SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/d51519ec-6333-b289-6727-962caa54dd91.png)
それぞれの列ごとにそれぞれの連番が入ります。
はじめのSEQUENCE関数が１行しかありませんが、その下に５行がそれぞれ構成されます。
これ以降は数式バーは長くなるので表示しません。数式はすべてセルA1に入力します。
それぞれの列の行数を変えてみます。

```
=CHOOSE(SEQUENCE(1,3),SEQUENCE(3,1),SEQUENCE(4,1,10,10),SEQUENCE(5,1,100,100))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/bcc87ff5-e814-b002-21dc-c775aa9e62c4.png)

列ごとに行数を変えることもできました。
データのない部分は#N/Aエラーです。
もしエラー値を空白にしたい場合は

```
=IFERROR(CHOOSE(SEQUENCE(1,3),SEQUENCE(3,1),SEQUENCE(4,1,10,10),SEQUENCE(5,1,100,100)),"")
```
です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/125d050a-2e58-4bf4-5aa3-79d8b6670974.png)

１行目をタイトル行にしたいので、

```
=CHOOSE(SEQUENCE(2,3),"A","B","C",SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/2e63d300-dee1-0e93-27a8-b49cb4798543.png)

３行目以降が#N/Aエラーとなりました。
値がないということで解釈しています。
１行だけでそれぞれの列にSEQUENCE関数を入れるのは問題ないようなのですが、複数行だと問題があるようです。
はじめのSEQUENCE関数を５行にしてみると

```
=CHOOSE(SEQUENCE(5,3),"A","B","C",SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/9fa4514d-0585-1b5f-981d-5c884da70ea7.png)

３行目が\#VALUEエラーになります。エラーの種類が変わりました。
\#VALUEエラーは、数値データではないものを四則計算したりなどの文字を算術計算してしまった時に出るエラーですが、配列の個数が違う時にも出るので、そのケースかと思われます。
これを実現するには、１列５行を作り、その中で１行目ならば横にA、B、Cの項目名、そうではなければ各列ごとのSEQUENCE関数とします。

```
=IF(SEQUENCE(5,1)=1,CHOOSE(SEQUENCE(1,3),"A","B","C"),CHOOSE(SEQUENCE(1,3),SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100)))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/0d29af71-a20b-fc21-d3f3-7821862a7deb.png)

なんだか日本語が合っていないような、スピル範囲にも計算式が入ってしまいエラーになるのではないかと疑問になるような数式ですがこれで表示されます。
もっと日本語にマッチするような組み合わせもあると思うので、もしお気づきの方はコメントを頂戴したいと思います。
# SORT関数との組み合わせ
同じく追加されたSORT関数と組み合わせることもできます。
上記の式にSORT関数でA列の降順に並べ替えます。

```
=SORT(IF(SEQUENCE(5,1)=1,CHOOSE(SEQUENCE(1,3),"A","B","C"),CHOOSE(SEQUENCE(1,3),SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))),1,-1)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/c4b2b9ba-c036-b3d8-807d-6d7650e746fe.png)

並べ替えもできています。
IF関数でも並べ替えができるのですね。
昇順にすると項目名が下にきます。
# INDEX関数
中の値を１つだけ取り出すのはINDEX関数です。
左上の値を取り出してみましょう。

```
=INDEX(SORT(IF(SEQUENCE(5,1)=1,CHOOSE(SEQUENCE(1,3),"A","B","C"),CHOOSE(SEQUENCE(1,3),SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))),1,-1),1,1)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/2a33e936-969c-0d33-c6ba-964fbaf49fd9.png)

右下の値を取り出してみましょう。

```
=INDEX(SORT(IF(SEQUENCE(5,1)=1,CHOOSE(SEQUENCE(1,3),"A","B","C"),CHOOSE(SEQUENCE(1,3),SEQUENCE(5,1),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))),1,-1),5,3)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/d080275c-7002-41f0-cd0a-62e7ca26d991.png)

# VLOOKUP関数と組み合わせる
２列目の値を使って、VLOOKUP関数と組み合わせます。VLOOKUP関数の一覧表範囲は、せっかくなので配列で指定します。

```
=SORT(IF(SEQUENCE(5,1)=1,CHOOSE(SEQUENCE(1,3),"A","B","C"),CHOOSE(SEQUENCE(1,3),VLOOKUP(SEQUENCE(5,1),{1,1000;2,2000;3,3500;4,4200;5,4900},2,FALSE),SEQUENCE(5,1,10,10),SEQUENCE(5,1,100,100))),1,-1)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/25f93cb6-68dc-a688-6237-c11d650cfc0a.png)

１なら１０００、２なら２０００、３なら３５００、４なら４２００、５なら４９００という一覧表の値に変換されています。
# MID関数との組み合わせ
ここからは文字列関数との組み合わせです。
MID関数で文字列をバラバラにすることができます。
元の文字列をセルA1に入力しておきます。
LEN関数でセルA1の文字数を調べ、その分を分割します。

```
=MID(A1,SEQUENCE(LEN(A1)),1)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/592c75a9-b3dd-ca4f-61cf-5e9a13c44c65.png)

バラバラになりました。
ではこのままUNICODEの番号を一つ進めた文字に変換してみます。

```
=UNICHAR(UNICODE(MID(A1,SEQUENCE(LEN(A1)),1))+1)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/18734d24-02e5-3ca0-8516-97911c7e46b8.png)

そしてこの文字をCONCAT関数でひとまとめにします。

```
=CONCAT(UNICHAR(UNICODE(MID(A1,SEQUENCE(LEN(A1)),1))+1))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/301166fc-97c3-8953-268d-079862549d9f.png)

ちょっとしたお遊びですが、このようなこともできます。
# まとめ
SEQUENCE関数について面白い使いかたを紹介してみました。
もしかしたらSEQUENCE関数は、従来のExcel関数ではなかった、ループを実現する関数なのかもしれません。
私もただの連番関数だと思っていたのですが、やり込んだ結果、これだけ面白いことができるということがわかりました。
とても面白いのは動的にワンライナーで表を書けるということで、その出力した値はVLOOKUP関数やINDEX関数で処理でき、また、SUM関数、COUNT関数などでも集計ができます。
もっともっと実務で使えるような使いかたが必ずあると思っていますので、もし発見されましたらコメント欄などでお知らせいただくか、もしくはQiitaの記事としてアップしていただければと思います。
今回紹介した数式は、Microsoftで想定しているものではないと思われるため、動作しなくなるケースもあります。その場合はご了承ください。