2025/5/5

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

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

はじめに

エクセル関数のみで、記入した数字や文字列をランダムに並び替え、振り分けする方法を紹介します。 重複なく、均等に振り分けられ、抽選や席替えにも使えます。 バージョン2021、365より前のバージョンでも動作します。

下にテンプレート(セルデータサンプル)があるので、 コピペですぐに使用できます。

できること

データ(文字列や数字の配列)から、ランダムに選ばれたものが出力セルに表示されます。

出力セル数を変えることで、以下に応用できます。

  • 出力セル数が 少ない 場合: 抽出(抽選)
  • 出力セル数が データ数と同じ 場合: 並び替え・振り分け(席替えなど)

エクセルでの算出方法

以下の 全セルをコピー ボタンをクリックし、エクセルの A1 セルに貼り付けると、 ランダムに並び替えられたデータが G ~ I列に出力されます。

使用する元データを変更したい場合は、 A列のデータを書き換え、 B ~ C列の行数をコピー(オートフィル)で増やすか、 削除してデータ数に合わせてください。

出力セルの変更は以下の通りにしてください。

  • セル数の変更: G3セル(またはそれより右下の関数の入ったセル)をコピー(オートフィル)で増やす / 削除で減らす
    • ※ データ数を超える場合は、エラー値(#N/A)が入るようになる。
  • セル配置の変更: G3セルより右下(G列目以降かつ 3行目以降)に配置する。行数や列数、配置形状は自由。

振り分け欄のラベル(グループ1 ~ グループ3)は、 自由に書き換えられます。

乱数の再生成

一定の操作を行う(ファイルを開き直すなど)と、乱数が再生成されます。
(乱数の強制再生成:F9キー)

生成された乱数を固定する場合は、以下のいずれかを行ってください。

  • コピー & "値のみ"の貼り付け (Ctrl + Shift + v)
  • 上部メニューの 数式 > 計算方法の設定 > 手動 を選択
    (ただし、すべての関数の自動計算が無効になる)
ABCDEFGHI
1データ乱数乱数(整数)振り分け
2A=RAND()=RANK.EQ(B2,B:B)-1グループ1グループ2グループ3
3B=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))
4C=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))
5D=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))
6E=RAND()=RANK.EQ(B6,B:B)-1
7F=RAND()=RANK.EQ(B7,B:B)-1
8G=RAND()=RANK.EQ(B8,B:B)-1
9
10

算出手順

大まかな処理の工程は、以下の通りです

  1. 0 ~ 1 の(小数を 含む)乱数を生成
  2. 0 ~ 行数 の(小数を 含まない(整数))乱数に変換
  3. 2の値の順に、データを表示

1. 0~1の乱数を生成

RAND()関数を使い、0 ~ 1の乱数を生成します。

  • 最小値 : 0.0
  • 最大値 : 1.0(厳密には1.0より小さい)
  • 出力場所:B

RAND関数

0以上1未満の重複しない乱数(小数を含む)を返す。

例:=RAND()

2. 0~行数の整数に変換

=RANK.EQ()関数を使い、 手順1の乱数(小数を 含む )を整数(小数を 含まない )に変換します。

  • 最小値 : 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引数 : 範囲から抽出する列番号(オプション)