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