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

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

数式/関数:組み合わせを全て表示する

「何かの組み合せの全パターンが欲しい」といわれたら、どんな関数を使うだろうか。もしピンポイントな関数が思い浮かばなくても、パターンをよくイメージすれば何とかなるかもしれない。今回は配列を使った計算の流れを説明したい。

例えば候補が3つのパターンで考えてみよう。

よく見ると、C列は「A」「B」「C」が連続して9行ずつ、D列「A」「B」「C」が3行ずつ並んで、それが続いている。E列は「A」「B」「C」が繰り返しで並んでいる。ぼんやりイメージできたら、これを INDEX関数のインデックス番号に置き換えてみる。

この配列を作ればいいことが分かる。ではどうやって作ればいいかを考えてみよう。

まず縦方向の連番を3列並べた配列①と、「9」「3」「1」の横方向の配列②を作る。その配列①を配列②で割ると③が出来上がる。

①B2:=INT(SEQUENCE(3^3,3,0,1/3))
②F2:=3^SEQUENCE(,3,3-1,-1)
③J2:=B2#/F2#

その配列③から④で整数部を計算して、⑤で候補数の剰余を求める。

④N2:=INT(J2#)
⑤R2:=MOD(N2#,3)

これで欲しかった配列ができた。後は INDEX関数で参照するだけ。

=INDEX(テーブル1[値],R2#)

これで完成。古いバージョンでも SEQUENCE関数を ROW関数で代用すれば配列は作れる。全部をまとめてしまえば下記の通り。

=LET(
    x,テーブル1[値],
    n,ROWS(x),
    INDEX(x,MOD((SEQUENCE(n^n,n,0,1/n)+9^-5)/n^SEQUENCE(,n,n-1,-1),n)+1)
)

INDEX関数の第二引数(インデックス番号)は整数部を勝手に切り捨てしてくれるので、INT関数はなくてもいい(だたし演算誤差対策はいる。「9^-5」は対策用の微小値)。

ただ振り返ってよく見て欲しい。⑤が BASE関数の結果を分割したものだと気付く人もいるんじゃないだろうか。そこに気付いたらしめたものである。というわけで一連の流れは下のようにしてもいい。

=LET(
    x,テーブル1[値],
    n,ROWS(x),
    y,BASE(SEQUENCE(n^n,,0),n),
    INDEX(x,MOD(INT(y/10^SEQUENCE(,n,n-1,-1)),10)+1)
)

長なっとるやないかい、という突っ込みはなしで。MID関数でやってもいいけど、やり方として気に食わないので避けた。

尚、いずれの方法を使ったとしても、Excel(2007以上)の行数は 105万行足らずなので、8つ以上の組み合せは表示しきれずエラーになる。