Excelで数の決まっていないリストからランダムに項目を選択する方法

 例によって、検索結果をちょっと漁っただけでは、そのものズバリの情報に素早く辿り着けなかった Excel 案件がありましたので、適当にまとめて放流しておきます。

 今回の内容は、予め用意したリスト(セル範囲)から、値をひとつランダムに選ぶ方法です。

 割りと重要な点として、マクロではなく関数を使用していますので、Excel で開いた時にセキュリティの警告に悩まされることもありません。

 それでは、具体例を挙げながら見ていきましょう。

 どなたかのお役に立ちましたら。

 ちなみに、そんな大したことはしていないので、Excel 2003 とか、さらに古いバージョンでも使える内容だと思います。

スポンサーリンク

読み込み中です。少々お待ち下さい

お前はいったい何を言ってるんだ

 さて、先ずはワタクシメが何をほざいておるのかということを、画像を交えて説明します。

 例えば、以下のように、A 列に姓、B 列に名前が列挙されているシートを用意したとします。

  • A 列に姓、B 列に名前が列挙されているシート

 この中から、姓と名をそれぞれランダムに抜き出して組み合わせれば、例えばサンプルデータのようなものが、お手軽にそれっぽく作れる気がしませんか。

 例えば、以下のような感じで。

  • 各行の姓と名はランダム選択です
    組み合わせは無限大(有限です)

 ということで、実際に関数を使って書いてみましょう。

元データを用意しよう

 まずは、ランダムに選択する元となるデータを用意しましょう。

 ここではサンプルとして姓と名を使っていますが、実際は何でも構いません(パッと思いつくところでは、住所とか)。

  • まずは「元データ」という名前のシートを作り
    A 列と B 列に姓と名を適当に入力します
  • 先頭にヘッダー行を置かないように注意してください

 姓は Wikipedia の「」より、「2010年現在日本国内に多い名字(上位30)」を引用しました。名前は、「明治安田生命 | 名前ランキング」の「生まれ年別ベスト10」から適当に抜粋。

 同じデータを使う必要は特にありませんが、記事の末尾にサンプルファイルへのリンクを貼っておきますので、元データをコピペしたい場合は、そちらからどうぞ。

 ここで重要なのは、A 列の名字も、B 列の名前も、どちらもいくつ入力しても構わないという点です。

 サンプルにはそれぞれ 30 個入力してありますが、50 個でも 100 個でも、思い付いたら後からどんどん追加して構いません。

 他よりも多く登場して欲しい値を複数入力することによって、簡単な重み付けも可能でしょう(要するに、姓に「田中」を 10 個、「御厨」を 1 個入力したとすると、「田中」がランダム選択される確率が高くなるという単純な話です)。

 また、両者が同数である必要もありません(姓が 100 個で、名前が 200 個でも、全く問題ありません)

 ただし、A 列も B 列も、間に空白の行を挟まずに、必ず詰めて入力してください。

ランダムに値を選択

 さて、それでは、今回の主題である、数が決まっていないリスト(セル範囲)からランダムに値を選択する数式を書いてみましょう。

 まずは、名字の方から。

  • 新しいシートを用意して、例えば A2 に以下のような数式を入力します。
    • =INDEX(元データ!A:A,TRUNC(RAND()*COUNTA(元データ!A:A))+1)

    (新しいシートは画面下部のシートタブの横にある+ボタンで追加できます)

 はてさて、この数式は、一体なにをやっているのでしょうか。

 ざっと見ただけでは内容が把握できない場合は、組み合わせている関数をいったんバラバラにして、個別に Excel に入力してみると、理解しやすいと思います。

(すぐに理解できる方は、読み飛ばして構いません)

  A B C D
1 =INDEX(元データ!A:A,TRUNC(RAND()*COUNTA(元データ!A:A))+1)
2 ↑ この数式は以下のように分解できます
3 =RAND() 0.21739647 (0 以上で 1 より小さい実数の乱数を発生)
4 =COUNTA(元データ!A:A) 30 (範囲に含まれる空白ではないセルの個数)
5 =TRUNC(C3*C4)+1 7 (小数部を切り捨て)
6 =INDEX(元データ!A:A,C5) 山本 (行番号と列番号で指定される要素の値)

※A 列の内容は、C 列に入力された数式そのものです。つまり、Excel で確認する場合は、実際は C 列に A 列の数式を入力します

 ざっくり説明すると、RAND 関数で求めた 0 以上 1 未満の乱数に「元データ」シート A 列に入力されている「姓」の個数を掛けて、小数部を切り捨てて整数に変換した数値を行番号として INDEX 関数で要素を指定しています。

 最近のバージョンであれば、RAND を RANDBETWEEN に変えた方が簡単ですが、まぁ、バージョンやアドインを選ばない書き方ということで。

 実際に Excel(デスクトップ版)に入力して確認する場合は、SHIFT+F9 キーを押下する度にアクティブシートが再計算されて、C 列の各項目がランダムに切り替わりますので、試してみてください。

リスト(ここでいう「姓」や「名」)の上限が決まっている場合は「元データ!A$1:A$100」のように指定しても構いませんが、コピペしたり後から数が増えた場合も何も考えずに済むので、「元データ!A:A」みたいに列を丸ごと指定するのが楽だと思います。

元データと列の位置を一致させておくと、なお楽ちんです。

 そして、「名」は A2 を B2 にコピペするだけでもイケてしまいますが、いちおう同じように数式を書き出してみましょう。

  • 例えば、B2 に以下のような数式を入力します。
    • =INDEX(元データ!B:B,TRUNC(RAND()*COUNTA(元データ!B:B))+1)

    (A:A が B:B になっただけです)

 さらに、この書き方の都合の良いところは、コピペするだけで必要な数のサンプルデータを、いくらでも生成できることです。

  1. A2:B2 を選択して、Ctrl+C などでコピーします
  2. 必要な数だけ選択して貼り付けます
  3. 選択範囲に貼り付けると、姓と名がランダムに列挙されます
  4. 加えて、例えば C 列に年齢等を追加したりすると、よりそれっぽくなるでしょう(年齢は数値なので、元データが無くても生成できます)
  5. ※SHIFT+F9 でアクティブシートを再計算して、値をランダムに切り替えられます

    ※但し、調子に乗って限界(最近の EXCEL では 1,048,576 行)までコピペすると、さすがに動作がかなり重くなりますので(バージョンによっては固まるかも)、なるべく必要な分だけにしておきましょう。

 ここで紹介した方法は、元データさえ変えればなんにでも適用できると思います。

 ちなみに、数値の場合は上で例として挙げている年齢のように RAND だけで生成できますので、計算による重み付け等を考慮しなければ、元データは特に必要ありません。

 また、日付も「=TEXT(NOW()+TRUNC(RAND()*60)-30,"yyyy/mm/dd")」のような感じで、ある程度ランダムに生成できるでしょう(サンプルは、本日の前後 30 日くらいを適当に生成します)。

 計算結果をテキストエディタにコピペしてタブをカンマに置換したり、Excel から直接 CSV で保存することで、CSV データとしても利用できます。

サンプルはこちら

 オンライン版なので見た目が多少異なりますが、今回の内容を Excel Online で実際にご確認いただけます。

 こちらから、どうぞ。

 記事に直接貼り付けてもよかったのですが、ちょっと重くなってしまうので止めておきました。

おわりに

 こんなに長々と説明するような内容でもないのですが。

 また、実際にサンプルデータのようなものを作る場合は、もうちょっと色々と工夫が必要になると思いますが、なにかのお役に立ちましたら。

この記事をシェア
  • このエントリーをはてなブックマークに追加
  • Share on Google+
  • この記事についてツイート
  • この記事を Facebook でシェア