エクセルで指定した値のランダム並び替え/振り分け(抽選や席替えにも使える)【コピペ用テンプレートあり】

はじめに
エクセル関数のみで、記入した数字や文字列をランダムに並び替え、振り分けする方法を紹介します。
下にテンプレート(セルデータサンプル)があるので、
できること
データ(文字列や数字の配列)から、ランダムに選ばれたものが出力セルに表示されます。
出力セル数を変えることで、以下に応用できます。
- 出力セル数が 少ない 場合: 抽出(抽選)
- 出力セル数が データ数と同じ 場合: 並び替え・振り分け(席替えなど)
エクセルでの算出方法
以下の 全セルをコピー
ボタンをクリックし、エクセルの A1
セルに貼り付けると、 G
~ I
列に出力されます。
使用する元データを変更したい場合は、 A
列のデータを書き換え、 B
~ C
列の行数をコピー(オートフィル)で増やすか、
出力セルの変更は以下の通りにしてください。
- セル数の変更:
G3
セル(またはそれより右下の関数の入ったセル)をコピー(オートフィル)で増やす / 削除で減らす- ※ データ数を超える場合は、エラー値(
#N/A
)が入るようになる。
- ※ データ数を超える場合は、エラー値(
- セル配置の変更:
G3
セルより右下(G
列目以降かつ3
行目以降)に配置する。行数や列数、配置形状は自由。
振り分け
欄のラベル(グループ1
~ グループ3
)は、
乱数の再生成
一定の操作を行う(ファイルを開き直すなど)と、乱数が再生成されます。
(乱数の強制再生成:F9
キー)生成された乱数を固定する場合は、以下のいずれかを行ってください。
- コピー & "値のみ"の貼り付け (Ctrl + Shift + v)
- 上部メニューの
数式
>計算方法の設定
>手動
を選択
(ただし、すべての関数の自動計算が無効になる)
A | B | C | D | E | F | G | H | I | |
1 | データ | 乱数 | 乱数(整数) | 振り分け | |||||
2 | A | =RAND() | =RANK.EQ(B2,B:B)-1 | グループ1 | グループ2 | グループ3 | |||
3 | B | =RAND() | =RANK.EQ(B3,B:B)-1 | =INDEX($A:$A,MATCH(COUNTA($F:F,G$1:G2)-COUNTA($F:$F,$G$1:G$2),$C:$C,0)) | =INDEX($A:$A,MATCH(COUNTA($F:G,H$1:H2)-COUNTA($F:$F,$G$1:H$2),$C:$C,0)) | =INDEX($A:$A,MATCH(COUNTA($F:H,I$1:I2)-COUNTA($F:$F,$G$1:I$2),$C:$C,0)) | |||
4 | C | =RAND() | =RANK.EQ(B4,B:B)-1 | =INDEX($A:$A,MATCH(COUNTA($F:F,G$1:G3)-COUNTA($F:$F,$G$1:G$2),$C:$C,0)) | =INDEX($A:$A,MATCH(COUNTA($F:G,H$1:H3)-COUNTA($F:$F,$G$1:H$2),$C:$C,0)) | =INDEX($A:$A,MATCH(COUNTA($F:H,I$1:I3)-COUNTA($F:$F,$G$1:I$2),$C:$C,0)) | |||
5 | D | =RAND() | =RANK.EQ(B5,B:B)-1 | =INDEX($A:$A,MATCH(COUNTA($F:F,G$1:G4)-COUNTA($F:$F,$G$1:G$2),$C:$C,0)) | |||||
6 | E | =RAND() | =RANK.EQ(B6,B:B)-1 | ||||||
7 | F | =RAND() | =RANK.EQ(B7,B:B)-1 | ||||||
8 | G | =RAND() | =RANK.EQ(B8,B:B)-1 | ||||||
9 | |||||||||
10 |
算出手順
大まかな処理の工程は、以下の通りです
0
~1
の(小数を 含む)乱数を生成0
~行数
の(小数を 含まない(整数))乱数に変換- 2の値の順に、データを表示
1. 0~1の乱数を生成
RAND()
関数を使い、0 ~ 1の乱数を生成します。
- 最小値 : 0.0
- 最大値 : 1.0(厳密には1.0より小さい)
- 出力場所:
B
列
RAND関数
0以上1未満の重複しない乱数(小数を含む)を返す。
例:
=RAND()
2. 0~行数の整数に変換
=RANK.EQ()
関数を使い、
- 最小値 : 0
- 最大値 :
B
列の行数 - 2 - 出力場所:
C
列
RANK.EQ関数
第2引数の範囲のデータ列中で、第1引数のデータが何番目に位置するかを算出。
同順位の場合は、同順位内の最上位の値が返される。
第3引数は0または1で、降順または昇順のどちらで順位付けするかを設定
(今回はどちらでも可)。例:
=RANK.EQ(B2,B:B)
- 第1引数 (
B2
): 順位付けするデータ- 第2引数 (
B:B
): 順位付けするデータ列の全体範囲- 第3引数 : 降順(
0
) or 昇順(1
) を設定(省略時は降順)
3. 2の値の順に、データを表示
手順2のランダムな整数の順に従って、データを表示します。
少し複雑な式となっていますが、以下の流れで計算しています。
- i .
COUNTA
関数で、G3
~ セル自身の 直前までに表示されているデータの個数 を取得- ※
G
列より前と1
,2
行目の個数は差っ引いて、G3
セルより右下のデータ数を算出
- ※
- ii .
MATCH
関数で、ランダムな整数(C
列)と 各セルの 直前までに表示されているデータの個数 を紐づけ - iii.
INDEX
関数で、紐づいたデータを表示
COUNTA関数
引数の範囲のすべてのデータの数(サンプル数)を算出する。
空白以外(文字列含む)はすべてデータとしてカウントする。
第2引数, 第3引数, ... を追加することで、算出に用いるデータを増やすことができる(省略可、最大引数255)。例:
COUNTA($F:F,G$1:G2)
- 第1引数 (
$F:F
): 評価するデータの範囲(必須)- 第2,3,...引数 (
G$1:G2
): 評価に追加するデータの範囲(オプション)
MATCH関数
指定した範囲の中で検索し、最初にヒットした相対位置を返す。
例:
=MATCH(3,$C:$C,0)
- 第1引数 (
3
): 検索値(必須)- 第2引数 (
$C:$C
): 検索範囲(必須)- 第3引数 (
0
): 照合の型を0
,-1
,1
で指定(オプション)
0
: 完全一致したセルを返す1
: 検索値以下の最大値のセルを返す-1
: 検索値以上の最小値のセルを返す
INDEX関数
指定した範囲の中で、m番目(m行n列目)の値を返す
(m, nはそれぞれ第1引数、第2引数で指定)。例:
=INDEX($A:$A,2))
A
列の2行目の値を返す
- 第1引数 (
$A:$A
): 抽出する範囲(必須)- 第2引数 (
2
): 範囲から抽出する要素番号・行番号(必須)- 第3引数 : 範囲から抽出する列番号(オプション)