- ベストアンサー
エクセルでランダムに選択する方法
- エクセルを利用して従業員の役割分担表を作成する際、ランダムに選択する方法について試行錯誤しています。
- 現在は、従業員の識別番号を使用してランダムに選択する方法を模索しています。
- これにより、作業効率を上げることができると考えています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
K1:K9にデータがあり、M~U列に3人づつ取り出すとします。 A1:J9に =RAND() と入れます。 L1:U3に =VLOOKUP(SMALL(A:A,ROW()),A:$K,COLUMN($K1)-COLUMN(A1)+1,FALSE) これで重複の無い3個が横に10組取り出せます。L1:U3の縦横を逆にすればご希望の表示になります。 ちなみに、ランダムに選択では不公平だと思いますので、できれば輪番制をお勧めします。
その他の回答 (3)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
>……乱数の関数では、従業員の識別No.が出る保証が無いので、他の方法が無いものか…… RAND 関数(乱数の関数)でいきなりコードを算出するのはなく、行番号を算出します。つまり RAND を使います。 TRUE 型の VLOOKUP 関数などを用いれば、いきなりコードを抽出することはできるのですが、一定の確率で、抽出したデータ同士に重複が発生してしまいます。そのため、いったん重複のない行番号を作業列に求めます。 C1 =1+int(rand()*(rows(シート1!$A$1:$A$9)-2)) D1 =c1+1+int(rand()*(rows(シート1!$A$1:$A$9)-c1-1)) F1 =index(シート1!$A$1:$A$9,c1) これを入力したら、D1 セルを E1 に、F1 を G1:H1 にそれぞれコピペ。後は C1:H1 を下方向に好きな行数だけオートフィルしてください。 なおランダムでは、等確率でコードを抽出しますが、抽出結果には偏り(個数の不揃い)が発生します。ですから No.1 さんのおっしゃるように、輪番などにしないなら、公平でないとも考えることができるシステムをわざわざ採用する理由の説明を求められる可能性がありますね。 まあ「公平、平等」という概念自体が、物の見方ひとつで結果が大きく変わってしまう、哲学にも深く関るような、非常に判断の難しい問題でもありますが。輪番なら平等(である気がする)と受け止められやすいというのは、人間という生き物の性質のようです。人間には機械と違って、感情がありますからね。 また、RAND は再計算するたびに異なる値を算出するので、どの瞬間値を確定値にするのかについて、何らかの基準をあらかじめ用意する必要があります。なお、ある瞬間値を固定して保存するには、瞬間値の表示されているセルを他のセルなどに値複写します。
- KURUMITO
- ベストアンサー率42% (1835/4283)
シート1のA2セルから下方に識別Noが入力されているとします。 その識別Noをランダムに並び替えるために例えばC2セルには次の式を入力して下方にドラッグコピーします。 =IF(A2="","",RAND()) 並び替えた識別番号をD列に表示させるためにD2セルには次の式を入力して下方にドラッグコピーします。 =IF(A2="","",INDEX(A:A,RANK(C2,C:C)+1)) その後にお望みのデータをシート2に表示させるとしてA2セルには次の式を入力してC2セルまで横方向にドラッグコピーしたのちに必要な日数分だけ下方にドラッグコピーします。 =INDEX(Sheet1!$D:$D,MOD((ROW(A1)-1)*3+COLUMN(A1)-1,COUNT(Sheet1!$C:$C))+2) 1日を5人とする場合には上の式で*3を*5にすればよいですね。
お礼
無事解決出来ました。 人数対応も数式で変更して確認しましたが、表示出来ました。 ありがとうございます。
- keithin
- ベストアンサー率66% (5278/7941)
シート1のA2以下に社員番号があります シート2の Z2に =IF(Sheet1!A2="","",RAND()) と記入、社員の人数をカバーできるだけ沢山、下向けにコピーして埋めておきます シート2の A2に =INDEX(Sheet1!$A:$A,MATCH(SMALL($Z:$Z,ROW(A1)*3+COLUMN(A1)-3),$Z:$Z,0)) と記入、右にあと2つと下向けにコピーします。
お礼
無事解決出来ました。 有難う御座います。
お礼
無事解決出来ました。 縦横を逆にしたら、希望通りの配列になりました。