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

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

数式/関数:正解を含めた候補をランダムに出題する

前回のランダム抽出を更に応用してみよう。漢字をランダムに抽出して、正解を含めた4候補を表示させるにはどうするか。

これが完成形。

ひとまず、例によって基になる学年別漢字配当表は用意してあるものとする(テーブル名「学年別漢字配当表」)。

ここから学年を指定してランダムに抽出するところまでは前回やったので割愛。ここから正解を含めた読み4つを抽出するにはどうするか。

=LET(
    x,FILTER(学年別漢字配当表[[漢字]:[読み]],学年別漢字配当表[学年]=B1),
    y,TAKE(SORTBY(x,RANDARRAY(ROWS(x))),B2,2),
    FLT,LAMBDA(a,UNIQUE(FILTER(INDEX(x,,2),INDEX(x,,2)<>INDEX(a,,2)))),
    HSTACK(INDEX(y,,1),TEXTSPLIT(TEXTJOIN(";",,BYROW(y,LAMBDA(a,TEXTJOIN(",",,TAKE(VSTACK(INDEX(a,,2),SORTBY(FLT(a),RANDARRAY(ROWS(FLT(a))))),B3))))),",",";"))
)

こんな感じ。ただしこの場合、正解が必ず1つ目になってしまう。

これはこれで使い道はあるんだけど、このままでは問題としては都合が悪いので、更にランダムに組み替える処理を加えたい。

=LET(
    学年,B1,
    問題数,B2,
    候補数,B3,
    テーブル,学年別漢字配当表,
    x,FILTER(CHOOSECOLS(テーブル,{3,4}),TAKE(テーブル,,1)=学年),
    y,TAKE(SORTBY(x,RANDARRAY(ROWS(x))),問題数,2),
    REF,LAMBDA(a,b,INDEX(a,,b)),
    FLT,LAMBDA(a,UNIQUE(FILTER(REF(x,2),REF(x,2)<>REF(a,2)))),
    SRT,LAMBDA(a,b,SORTBY(a,RANDARRAY(b))),
    BYR,LAMBDA(a,TEXTJOIN(",",,
        SRT(TAKE(VSTACK(REF(a,2),SRT(FLT(a),ROWS(FLT(a)))),候補数),候補数)
    )),
    見出し,HSTACK("漢字",SEQUENCE(,候補数)),
    内容,HSTACK(TAKE(y,,1),TEXTSPLIT(TEXTJOIN(";",,BYROW(y,BYR)),",",";")),
    VSTACK(見出し,内容)
)

ついでなので、見出しも付けてみた。

これで完成。今回は漢字の読みでやったけど、他にも色々応用が利くはず。試験や受験用に自分で問題を作りたい時に便利じゃないかな。

ただここまでやっておいてなんだけど、数式だと何かにつけて再計算がかかってしまうので、このままでは使いづらい。実際にテストとして使う場合にはクエリで読み込んでテーブルとして出力してやるのがいいと思う。