例によって、検索結果をちょっと漁っただけでは、そのものズバリの情報に素早く辿り着けなかった Excel 案件がありましたので、適当にまとめて放流しておきます。
今回の内容は、予め用意したリスト(セル範囲)から、値をひとつランダムに選ぶ方法です。
割りと重要な点として、マクロではなく関数を使用していますので、Excel で開いた時にセキュリティの警告に悩まされることもありません。
それでは、具体例を挙げながら見ていきましょう。
どなたかのお役に立ちましたら。
ちなみに、そんな大したことはしていないので、Excel 2003 とか、さらに古いバージョンでも使える内容だと思います。
読み込み中です。少々お待ち下さい
お前はいったい何を言ってるんだ
さて、先ずはワタクシメが何をほざいておるのかということを、画像を交えて説明します。
例えば、以下のように、A 列に姓、B 列に名前が列挙されているシートを用意したとします。
この中から、姓と名をそれぞれランダムに抜き出して組み合わせれば、例えばサンプルデータのようなものが、お手軽にそれっぽく作れる気がしませんか。
例えば、以下のような感じで。
ということで、実際に関数を使って書いてみましょう。
元データを用意しよう
まずは、ランダムに選択する元となるデータを用意しましょう。
ここではサンプルとして姓と名を使っていますが、実際は何でも構いません(パッと思いつくところでは、住所とか)。
姓は Wikipedia の「姓」より、「2010年現在日本国内に多い名字(上位30)」を引用しました。名前は、「明治安田生命 | 名前ランキング」の「生まれ年別ベスト10」から適当に抜粋。
同じデータを使う必要は特にありませんが、記事の末尾にサンプルファイルへのリンクを貼っておきますので、元データをコピペしたい場合は、そちらからどうぞ。
ここで重要なのは、A 列の名字も、B 列の名前も、どちらもいくつ入力しても構わないという点です。
サンプルにはそれぞれ 30 個入力してありますが、50 個でも 100 個でも、思い付いたら後からどんどん追加して構いません。
他よりも多く登場して欲しい値を複数入力することによって、簡単な重み付けも可能でしょう(要するに、姓に「田中」を 10 個、「御厨」を 1 個入力したとすると、「田中」がランダム選択される確率が高くなるという単純な話です)。
また、両者が同数である必要もありません(姓が 100 個で、名前が 200 個でも、全く問題ありません)
ただし、A 列も B 列も、間に空白の行を挟まずに、必ず詰めて入力してください。
ランダムに値を選択
さて、それでは、今回の主題である、数が決まっていないリスト(セル範囲)からランダムに値を選択する数式を書いてみましょう。
まずは、名字の方から。
はてさて、この数式は、一体なにをやっているのでしょうか。
ざっと見ただけでは内容が把握できない場合は、組み合わせている関数をいったんバラバラにして、個別に Excel に入力してみると、理解しやすいと思います。
(すぐに理解できる方は、読み飛ばして構いません)
※A 列の内容は、C 列に入力された数式そのものです。つまり、Excel で確認する場合は、実際は C 列に A 列の数式を入力します
ざっくり説明すると、RAND 関数で求めた 0 以上 1 未満の乱数に「元データ」シート A 列に入力されている「姓」の個数を掛けて、小数部を切り捨てて整数に変換した数値を行番号として INDEX 関数で要素を指定しています。
最近のバージョンであれば、RAND を RANDBETWEEN に変えた方が簡単ですが、まぁ、バージョンやアドインを選ばない書き方ということで。
実際に Excel(デスクトップ版)に入力して確認する場合は、SHIFT+F9 キーを押下する度にアクティブシートが再計算されて、C 列の各項目がランダムに切り替わりますので、試してみてください。
リスト(ここでいう「姓」や「名」)の上限が決まっている場合は「元データ!A$1:A$100」のように指定しても構いませんが、コピペしたり後から数が増えた場合も何も考えずに済むので、「元データ!A:A」みたいに列を丸ごと指定するのが楽だと思います。
元データと列の位置を一致させておくと、なお楽ちんです。
そして、「名」は A2 を B2 にコピペするだけでもイケてしまいますが、いちおう同じように数式を書き出してみましょう。
さらに、この書き方の都合の良いところは、コピペするだけで必要な数のサンプルデータを、いくらでも生成できることです。
ここで紹介した方法は、元データさえ変えればなんにでも適用できると思います。
ちなみに、数値の場合は上で例として挙げている年齢のように RAND だけで生成できますので、計算による重み付け等を考慮しなければ、元データは特に必要ありません。
また、日付も「=TEXT(NOW()+TRUNC(RAND()*60)-30,"yyyy/mm/dd")」のような感じで、ある程度ランダムに生成できるでしょう(サンプルは、本日の前後 30 日くらいを適当に生成します)。
計算結果をテキストエディタにコピペしてタブをカンマに置換したり、Excel から直接 CSV で保存することで、CSV データとしても利用できます。
サンプルはこちら
オンライン版なので見た目が多少異なりますが、今回の内容を Excel Online で実際にご確認いただけます。
こちらから、どうぞ。
記事に直接貼り付けてもよかったのですが、ちょっと重くなってしまうので止めておきました。
おわりに
こんなに長々と説明するような内容でもないのですが。
また、実際にサンプルデータのようなものを作る場合は、もうちょっと色々と工夫が必要になると思いますが、なにかのお役に立ちましたら。