条件を付けてランダム~エクセルVBA

以前に、参加者の俳句一覧表にし、ランダムに並べるVBAを作成した。ところが15人ほどのメンバーで一人が2句ずつ投句し、それを一覧にする。一覧にするときには一人が投句した2句を続けてエクセルに書いていく。そうやってできた一覧表をVBAをつかってランダムに並び替えてみると、何か所かで同一の人の句が並んでしまう。5回くらいマクロを実行して誰も並ばない状態にすることもしばしばであった。

そういう状況を解決しようといろいろ考えてみて、次のように考えてみた。

1.2句ずつだからAグループとBグループのように分ける。

2.AグループとBグループに分けると、これだけで同一人物の句が並ぶことは亡くなる。でも人が同じ順に出てくるというのも面白みがない。

3.そこで、グループごとにランダムに並び替える。もちろんこの場合はAとBとの分かれ目のところで同一人物が並ぶ可能性もないことはない。その時は2回目のマクロを実行することにする。

4.AとBのグループ分けは、エクセルの関数を利用して、同一人物の何番目かをカウントする。(これも句を入力するときに1,2・・・と入力しておいてもいいのだが、手間は少しでも省きたい)そこで空いている欄を利用して、エクセル関数 ‘=IF(A15=””,””,COUNTIF($A15:A15,A15)) ‘
を必要以上にコピーする。
・・・’ =IF(O15=””,””,COUNTIF($A15:O15,O15)) ・・・’。
O15に入力がなかったら空白、そうでなかったら、A15からO15までの間にO15(人物名)の数を数える、という関数である。こうしておけば1人が何句投句しても自在となる。 他の使用法もありそうだ。こうして、1,2・・というグループ分けが可能になる。

マクロについては

エクセルVBA8「並び替える」の「

6 表の列を昇順とランダムの2条件で並び替える

グループ分けとランダム

こちらの方が、確実にバラツキができていい。