なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた、ようこそ

数式/関数:A~Zをスピルで表示させる

時々、アルファベットを連番(「A」~「Z」)で欲しい時がないでしょうか。なんなら「Z」の後に「AA」~「ZZ」と続いて欲しい場合もあるかもしれません。

今回は色んなアプローチの方法で「A」~「Z」を作ってみます。

「A」~「Z」をスピルで表現する

まずはここから。作り方は色々あるのですが、「Z」までなら 36進数を使うのが簡単です。「1(1番目)」~「Z(36番目)」までの連番を「A(10番目)」から始めればいいので、数式は下記のようになります。

=BASE(SEQUENCE(26,,10),36)

ここまでは簡単ですね。

「A」~「ZZ」をスピルで表現する

続いて「A」~「ZZ」までをスピルで表示させます。先程の「A」~「Z」の配列を縦横に結合して縦1列に変換し直してもいいんですが、

=LET(x,BASE(SEQUENCE(26,,10),36),VSTACK(x,TOCOL(x&TOROW(x))))

「A1」~「ZZ1」までのセル参照から作ってもいいです。

=TOCOL(REGEXEXTRACT(ADDRESS(1,SEQUENCE(,COLUMN(ZZ1)),4),"\D+",1))

Excel2021の場合は

=TRANSPOSE(SUBSTITUTE(ADDRESS(1,COLUMN(A:ZZ),4),1,""))

とする手もあります。とはいえセルの参照を使うと、列を削除したときに範囲がズレてしまうので、あまりお勧めはしません。

「A」~「ZZZ」をスピルで表現する

お勧めしない理由はもう一つあります。最大列数の問題です。エクセルの列は「XFD(16,384列目)」までしかありませんので、セル参照を使う方法では「ZZZ」までは作れません。「ZZZ」までスピルで表現したいなら、下記のような別のアプローチが必要になります。

=LET(x,BASE(SEQUENCE(36^3),36),FILTER(x,REGEXTEST(x,"^\D+$")))

36進数の値を「36の 3乗(「1」から「ZZZ」)」まで用意してから、数字を含む値を除外しました。除外の方法はなんでもいいのですが、ここでは REGEXTEST関数を使っています。

「A」~「ZZZZ」をスピルで表現する

「ZZZ」までなら上記の方法でよかったのですが、「36の 4乗(1,679,616) 」まで計算しようとすると、表現するための行数が足りません(エクセルの最大行は 1,048,576行)。つまり「一旦、連番を作ってからいらないものを除外する」方法では「ZZZZ」までは計算できません。こうなると更に違う方法を考える必要が出てきます。

今度は SCAN関数を使って、値を調整しながら連番を作っていきましょう。

=SCAN(9,SEQUENCE(SUM(26^SEQUENCE(4))),LAMBDA(
    x,y,REGEXREPLACE(BASE(DECIMAL(x,36)+1,36),"\d","A")
))

「SUM(26^SEQUENCE(4))」は「475254」としても問題ないです。この方法なら、行数の限界(「BGQCV」 )まで表示できます。

もちろん「ZZ」の時にやった方法を、「ZZZZ]まで繰り返す形でもできます。

=LET(
    z,BASE(SEQUENCE(26,,10),36),
    fx,LAMBDA(x,TOCOL(x&TOROW(z))),
    zz,fx(z),
    zzz,fx(zz),
    zzzz,fx(zzz),
    VSTACK(z,zz,zzz,zzzz)
)
=LET(
    z,BASE(SEQUENCE(26,,10),36),
    REDUCE(z,{1,2,3},LAMBDA(x,y,UNIQUE(VSTACK(x,TOCOL(x&TOROW(z))))))
)

下のほうがすっきりはしますが、無駄が多いです。

LAMBDA関数にヘルパー関数が追加された今となっては必要ないと思いますが、上の式を再帰計算でやる場合は下記の通りです。

=LAMBDA(n,LET(
    z,BASE(SEQUENCE(26,,10),36),
    fx,LAMBDA(r,x,IF(26^n<ROWS(x),x,
    r(r,VSTACK(x,TOCOL(x&TOROW(z)))))),
    IF(n=1,z,fx(fx,z))
))(4)