この記事は自分用の覚書です。
■MacBook Pro macOS Big Sur
バージョン 11.5.2
■Microsoft 365 Apps for businessサブスクリプション
(旧称 Office 365 Business)
Excel for Mac バージョン 16.52 (21080801)
H.K さん。
エクセルでランダムにグループ分けする仕組みです。
共有したテンプレートは以下のように作っています。
こちらにもまとめておきます。
特別に難しいことはしていません。誰でもあとからメンテナンスができると思います。
当たり前ですが、これが唯一の正解ではないです。
「こうしたら、もっと誰でもメンテナンスがしやすくなる」というアイデアがあれば私にも教えてくださいね。
■課題
課題は次の2つ。
- 社内研修参加者をランダムにグループ分けする作業を簡素化したい。
- その際に、同じ部署の人は違うグループにしたい。
■使用する関数
使用する関数は次の5つです。
- RAND関数
- RAN.EQ関数
- IFS関数
- SORT関数
- COUNTIF関数
IFS関数とSORT関数は、Microsoft 365 サブスクライバーが使える関数です。
RANK.EQ関数は、数値の一覧内における各数値の順位を返します。
従来からあるRANK関数と同じですが、マイクロソフトはRANK.EQ関数の利用を推奨していているのでそちらを使いました。
エクセルのヘルプでRANK関数を見ると、「Excel の将来のバージョンでは利用できなくなる可能性があるため、今後は新しい関数を使用することを検討してください。」と書かれています。
仕事で使う仕組みづくりですから、将来的に使えなくなる可能性が少しでもあるならその使用は避けたほうがよいと、私は考えます。
■ランダムにグループ分け
例として、20名の参加者を等分してグループ分けすることを考えてみました。
20名を等分する場合は、次の二通りの分け方になりますね。
ここでは、「4名ずつ5グループ」を取り上げます。
「4名ずつ5グループ」がわかれば、「5名ずつ4グループ」に分ける仕組みも簡単につくれます。
数式を書き換えるだけですから。
どんな人数で何グループに分ける場合でも、考え方は同じです。
次の3つのシートを作りました。
ファイルを使う人がわかりやすければ、シート名はなんでもよいです。
各シートの列名もわかりやすければなんでもよいです。
■シート「設定」
シート「設定」では次の2つを指定します。
- いちグループ何名にするか(ここでは 4 名ずつ。)
- グループ名(今回は最大で 5 つのグループ名が必要。)
C列「区分け」の値は、このあとで使います。
どのシートも基本的にさわるのは1行目に色を付けてある列です。
人数や名前、グループ名を入れたり、部署名を入れたり。
色を付けていない列のセルには数式を入れています。
必要によって数式を書き換えます。

■シート「グループ分け」
シート「グループ分け」で各人がどのグループになるか決めています。
こんな感じです。
(使用している氏名は、ネット上の無料サービスで作りました。)

A列のセルに入っているのは =RAND() という式です。
RAND関数で乱数を発生させています。
発生させた乱数を昇順に順位付けしているのが、B列です。
セル B2 には =RANK.EQ(A2,$A$2:$A$21,1) の数式を入力して、一番下までコピーします。
乱数の順位が、各人に対する固有の番号になります。
その番号をもとにすれば、無作為なグループ分けができます。
E列で、IFS関数を使ってグループを決めています。
セル E2 の数式は以下のようです。

こうやって数式の途中でセル内改行しておくことで、IFS関数を使ってどんな条件で何をしているのかを把握しやすくなると思います。数式の頭の位置はスペースで合わせています。
IFS関数の一行目の数式の意味は以下のようです。
- セル B2 の値( 18 )が、シート「設定」のセル C2 ( 4 ) 以下の場合、シート「設定」のセル B2 の値 ( G01 ) を返す。
シート「設定」のC列が、冒頭で「あとで使う」といった「区分け」です。
いちグループ 4 名ずつにするので、RANK.EQ関数の結果を使って「4以下ならG01」、「5以上8以下ならG02」というように4名ずつグループ分けするために使っています。

シート「設定」の C2 の値は 4 なので、一行目は成り立ちません。
なので、二行目の判定が行われますが、二行目も成り立ちません。
(そうやって、四行目までが成り立ちません。)
成り立つのは五行目の数式なので、シート「設定」のセル B6 の値が返ります。
- セル B2 の値( 18 )は、シート「設定」のセル C6 ( 20 ) 以下なので、シート「設定」のセル B6 の値( G05 )を返す。
そのようにして、各人がどのグループになるかが決まります。
シート「グループ分け」のセル E2 に入れたIFS関数の数式を一番下までコピーします。
セル B3 の値( 6 )の場合は、シート「設定」の C3 ( 8 ) 以下なので、シート「設定」の B3 の値(グループ名 G02)が返っています。
RAND関数で発生させた乱数を元にしているので、ここまでで各人を無作為にグループ分けできました。
次は、「同じ部署の人は同じグループにならないように」検討できる仕組みづくりです。
■同じ部署の人は同じグループにならないように検討する
一覧を見やすくする。
まず、各人が何グループなのをわかりやすくしておきます。
そのために、シート「並べ替え」のセル A2 にSORT関数の数式を入力しています。

セル A2 に入れた数式は以下のようです。
C列(「グループ」)を基準にして昇順に並べ替えています。
=SORT(グループ分け!C2:E21,3,1,FALSE)
Microsoft 365 サブスクライバーの場合は、このようにあるセルに数式を入れると他のセルに数式をコピーしないで結果を表示してくれる機能があります。
(Spill(スピル)という機能です。マイクロソフトのヘルプのページでは「こぼれた配列動作」と訳されてますが。「スピル」のほうが定着してほしいです。)
SORT関数の構文は次のようです。
=SORT(配列,[並べ替えインデックス],[並べ替え順序],[並べ替え基準])
第一引数の「配列」以外は省略が可能ですが、SORT関数の各引数の役割をわかりやすくするために、ここではあえてすべてを指定してみました。
シート「グループ分け」の C2 から E21 を並べ替えたいので、第一引数「配列」にはその範囲を指定しています。
第二引数 [並べ替えインデックス] は 3 になります。
第一引数で指定した範囲は C列からE列です。
E列のグループ名を基準にするので、指定した範囲の左端から C,D,E と数えて、 [並べ替えインデックス] は 3 になります。
第3引数 [並べ替え順序] は 1 にしました。G01 から順に並べたいですから。
1 は「昇順」を意味します。

第四引数 [並べ替え基準] は、FALSE です。
行を並べ替えるので。
(見た通り、SORT関数は列の並べ替えもできます。我々の仕事ではあまり使うことはないと思いますが。)

こうやって、指定範囲がグループ名を基準にして昇順で並べ替えされます。
これで誰が何グループなのかがわかりやすくなります。
さらに区別しやすくしてみます。
いちグループ 4 名なので、グループ名の固まりごと(4行ごと)にセルの下側に罫線をひいて区切ってみます。
この罫線をひく作業は無くてもよいです。必要なければ省いてください。
※4行ごとにセルの下側に罫線をひくための設定は、このページの下部にある「追記」を参照してください。
せっかく書いたので残しておきますが、「追記」でふれているやり方の方が手順を省けます。
セル A5 から C5 を選んで =設定!$A$2=4 の数式を条件に、セル範囲の下側に罫線をひく条件付き書式を設定します。

シート「設定」のセル A2 (「人数」)が 4 なら、こうなります。

この設定をセル A9 から C9、A13 から C13、A17 から C17 に対して行います。
そうすると、こうなります。
誰が何グループなのかがずいぶんと見やすくできたと思います。

同じ部署の人は同じグループにならないように検討できる仕組み作り
お待たせしました。ようやく、「同じ部署の人は同じグループにならないように」検討できる仕組み作りです。
やはり条件付き書式を使います。
グループ G01 のなかで部署が重複していないかを確認する設定です。
セル範囲 B2 から B5 を選択しておいて、条件付き書式では次のように入力します。

=COUNTIF($B$2:$B$5,B2)>=2 の数式で、セル B2 の値が、セル範囲 B2 から B5 のなかで2個以上あると TRUE が返り、設定した書式が実行されます。
COUNTIF関数の構文は次のようです。
COUTNIF(範囲,条件)
第一引数の「範囲」( $B$2:$B$5 )が絶対参照で、第二引数の「条件」( B2 )が相対参照になっているので、セル範囲 B2 から B5 のなかで B3、B4、B5 の値が 2 個以上あるかが判定されます。
そうすることで、グループ G01 のなかで部署が重複しているか、いないかがわかります。
(セルが色付けされなければ、同じ部署はない。)

なお、重複を見つけるような、どこかのセルを強調したい条件付き書式では、「セルの塗りつぶし」を活用するのがコツです。
白黒で印刷しても判別しやすいですから。
同様の設定をセル範囲 B6 から B9、B10 から B13、 B14 から B17、B18 から B21 にも行います。
(いちグループ 4 名なので 4 行分ずつ設定している)
=COUNTIF($B$6:$B$9,B6)>=2
=COUNTIF($B$10:$B$13,B10)>=2
=COUNTIF($B$14:$B$17,B14)>=2
=COUNTIF($B$18:$B$21,B118)>=2
オートフィルタでグループ名を絞り込むと、セル範囲が選択しやすいです。
これで、「4名ずつ5グループにランダムに分けて、同じ部署の人はいっしょにしない」ように検討できる仕組みの完成です。
ファイルができあがったら、何度でも使えるようにテンプレート形式で保存しておくことをお勧めします。
■結果の試行
F9 キーを押すたびにRAND関数が実行されて、グループ分けの結果が変わります。
F9 を何度か押して、B列で部署名が重複しない組み合わせを探せます。
■結果の確定
各グループのなかで部署名が重複しない結果が得られたら、表全体をコピーしてどこかに「値貼り付け」してください。
そうすることで、その結果を確定できます。
値貼り付けで結果を確定しないと、ファイルを開くたびにRAND関数が実行されるので結果が変わってしまいます。
■「5名ずつ4グループ」への対応
シート「設定」のセル A2 (人数)を 5 にします。
これでグループ分け自体はすぐにできます。
20名の参加者を4名ずつに分ける際にグループを5つ作っているので、5名ずつにすると4グループとなってグループが1つ多いですが、グループ数が余っているのは問題になりません。
シート「グループ分け」で使っているIFS関数の数式もそのままでエラーは起きないです。
シート「並べ替え」では次の2つの作業をします。
(先にもいったように、罫線で区切る作業は不要なら無視してください。)
・4名ずつのときのように、罫線でグループごとに区切る場合
※5行ごとにセルの下側に罫線をひくための設定は、このページの下部にある「追記」を参照してください。
せっかく書いたので残しておきますが、「追記」でふれているやり方の方が手順を省けます。
セル A6 から C6 を選んで =設定!$A$2=5 の数式を条件に、セル範囲の下側に罫線をひく条件付き書式を設定。
同様の設定をセル A11 から C11、A16 から C16 に対して行います。(5行ごとにセル範囲の下側に罫線をひく。)
・「部署」の列で重複を見つける。
セル範囲 B2 から B6 を選択しておいて、条件付き書式の数式は次のように入力します。
=COUNTIF($B$2:$B$6,B2)>=2
同様の設定をセル範囲 B7 から B11、B12 から B16、B17 から B21 (各5行分)にも行います。
=COUNTIF($B$7:$B$11,B7)>=2
=COUNTIF($B$12:$B$16,B11)>=2
=COUNTIF($B$17:$B$21,B17)>=2
F9 を何度か押して、B列で部署名が重複しない組み合わせを探します。
値貼り付けで結果を確定することも同じです。
共有したテンプレートは、「4名ずつ5グループ」と「5名ずつ4グループ」の両方の設定をしています。
■総人数が変わったとき
今回の例では 20 名でしたが、もっと多くの人数が参加するときもありますよね。
次の7つの作業をします。
1.総人数を何名ずつ何グループに分けるかを決める。
例:30名
・3名ずつ10グループ
・5名ずつ6グループ
・6名ずつ5グループ
2.シート「設定」の「グループ名」と「区分け」をグループ数に合わせる。
想定される最大のグループ数分を作っておくのも "あり" 。
上の例なら、3名ずつで最大10グループになる。
3.シート「グループ分け」のRAND関数とRANK.EQ関数の列を、総人数に合わせる。
4.シート「グループ分け」の「グループ」の列のIFS関数の引数をグループ数に合わせる。
シート「設定」の「グループ名」と「区分け」の列の値を使うので、10グループに分けていたら10行分書く。
5.シート「並べ替え」で、SORT関数の引数を修正する。
第一引数の「配列」を、シート「グループ分け」のC列からE列のセル範囲に合わせる。
6.シート「並べ替え」で、グループごとに罫線で区切る条件付き書式を設定する。
(これは省いてよい)
・グループごとに罫線で区切る条件付き書式
いちグループが何名ずつかによって、書式を設定する行が変わってくる。
=設定!$A$2=3 (3名ずつ10グループの場合。3行ごとに設定)
=設定!$A$2=5 (5名ずつ6グループの場合。5行ごとに設定)
=設定!$A$2=6 (6名ずつ5グループ。6行ごとに設定)
7.シート「並べ替え」で、部署名の重複を見つける条件付き書式を設定する。
・部署名の重複を見つける条件付き書式
いちグループが何名ずつかによって、引数「範囲」の指定が変わってくる。
=COUNTIF($B$2:$B$4,B2)>=2
(3名ずつ10グループの場合。B2 から B4 の3行分に設定)
=COUNTIF($B$2:$B$6,B2)>=2
(5名ずつ6グループ。B2 から B6 の5行分に設定)
=COUNTIF($B$2:$B$7,B2)>=2
(6名ずつ5グループ。B2 から B7 の6行分に設定)
■人数が余る場合
総人数と何名ずつを一つのグループにするかで、人数に余りがでることもありますね。
たとえば、総人数が 30 名で 4 名ずつグループを分けたら、グループ数が 7 つで、2 名余ります。
そういうときは、もう仕方がないです。
グループ分けの結果を確定させたら、部署が重複してもその 2 名をどこかのグループに手作業で割り振るしかないです。
※22/4/20 追記
罫線で人数ずつ区切るために「条件付き書式」を使うと、上記のような設定の手間を減らせます。
ROW関数とMOD関数を組み合わせます。
MOD関数なんて滅多に使わないので、最初にこの記事を書いたときには失念していました。
以下の例では、シート「設定」のセル A2 に「人数」という名前を付けています。
条件付き書式で数式を入力する際に、セルの絶対参照や相対参照を気にしなくてよくなるからです。

シート「並び替え」の2行目から下を全部選択して、条件付き書式では、
=MOD(ROW(),人数)=1
という数式を使います。

これで、シート「設定」のセル A2 の値を変えると、罫線がひかれるセルも変わります
たとえば、 4 を 5 に変えたら、5行ごとに罫線がひかれます。
最近のコメント