• ベストアンサー

300人の登録者から無作為に人数を抽出したい。

500名が記載された名簿から、男25人、女25人を無作為に抽出したいんですが、なにせエクセルやマクロが初心者でして…。 どのような方法で処理させたらいいのか、詳しく教えていただきたいのですが。。。 シート1に元データがあります。 A列に個人コード、B列に氏名、C列に性別、D列に年齢の表です。 似たような質問が見つけることができなくて、質問を投稿させていただきました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

シート1のA1セルからD1セルには個人コード、氏名、性別、年齢のそれぞれ項目名が有り各データは2行から下方に入力されているとします。 E列は作業列としてE2セルには次の式を入力して下方にドラッグコピーします。 =IF(ROW(A1)<=COUNTA(B$2:B$1000),IF(A2="","",IF(C2="男",1+RAND(),2+RAND())),IF(ROW(A1)<=COUNTA(B$2:B$1000)+2,ROW(A1)-COUNTA(B$2:B$1000),"")) 男には1の付いた女には2の付いた数値が表示されます。さらに最後の行には1と2が表示されるようになっています。 お求めの表はシート2に作るとしてA1セルからD1セルにはシート1と同じ項目名を入力します。 A2セルには次の式を入力してD2セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)<=25,INDEX(Sheet1!$A:$D,MATCH(SMALL(Sheet1!$E:$E,RANK(1,Sheet1!$E:$E,1)+ROW(A1)),Sheet1!$E:$E,0),COLUMN(A1)),IF(ROW(A1)<=50,INDEX(Sheet1!$A:$D,MATCH(SMALL(Sheet1!$E:$E,RANK(2,Sheet1!$E:$E,1)+(ROW(A1)-COUNTIF($C$1:$C1,"男"))),Sheet1!$E:$E,0),COLUMN(A1)),"")) これでランダムに抽出された男女の表が完成します。 式は25行までは男の表で、その後の50行までが女の表になります。 計算はシート1のE列で1の数値が小さい数値から数えてランクが幾つになるかを求め、それよりも順に数が大きくなり25番目までの数値までの男が選ばれるようになっています。女についてもシート1のE列で2の数値がランクでは幾つになるかを求め、それよりも順に数が大きく25番目までの女が選ばれるようになっています。 セルに新たなデータなどが入力されるたびに表が自動的に変わってしまいますので、シート2の表を選択してコピーし、別の場所に「形式をを選択して貼り付け」で「値」にチェックをして貼り付けることが必要です。

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 今仮に、Sheet2のA列とB列を作業列として使用し、Sheet1のF3~I27抽出した男のデータを表示し、Sheet1のF32~I56抽出した女のデータを表示するものとします。  まず、Sheet2のA1セルに次の関数を入力して下さい。 =IF(AND(INDEX(Sheet97!$A:$A,ROW())<>"",ISNUMBER(MATCH(INDEX(Sheet97!$C:$C,ROW()),{"女","男"},0))),RAND()+MATCH(INDEX(Sheet97!$C:$C,ROW()),{"女","男"},0),"")  次に、Sheet2のA1セルをコピーして、Sheet2のA2以下に(名簿の行数を上回るのに十分な行数となるまで)貼り付けて下さい。  次に、Sheet1のF1セルに「性別」と入力して下さい。  次に、Sheet1のF3~F27に1~25の数字を入力して下さい。  次に、Sheet1のG2セルに次の関数を入力して下さい。 =$A$1&""  次に、Sheet1のH2セルに次の関数を入力して下さい。 =$B$1&""  次に、Sheet1のI2セルに次の関数を入力して下さい。 =$D$1&""  次に、Sheet1のG3セルに次の関数を入力して下さい。 =IF(AND($F3<>"",ISNUMBER(MATCH($G$1,{"女","男"},0))),IF(ROW()-MATCH("*?",INDEX($I:$I,1):$I2,-1)>COUNTIF(Sheet2!$B:$B,">"&MATCH($G$1,{"女","男"},0))-COUNTIF(Sheet2!$B:$B,">"&MATCH($G$1,{"女","男"},0)+1),"",INDEX($A:$A,MATCH(LARGE(Sheet2!$B:$B,ROW()-MATCH("*?",INDEX($I:$I,1):$I2,-1)+COUNTIF(Sheet2!$B:$B,">"&MATCH($G$1,{"女","男"},0)+1)),Sheet2!$B:$B,0))),"")  次に、Sheet1のH3セルに次の関数を入力して下さい。 =IF($G3="","",VLOOKUP($G3,$A:$D,MATCH(H$2,$A$1:$D$1,0),FALSE))  次に、Sheet1のH3セルをコピーして、Sheet1のI3セルに貼り付けて下さい。  次に、Sheet1のG3~I3の範囲をコピーして、Sheet1のG4~I27の範囲に貼り付けて下さい。  次に、Sheet1のF1~I27の範囲をコピーして、Sheet1のF30セルに貼り付けて下さい。  次に、Sheet1のG32セルに入力されている関数の中で、$G$1となっている全ての箇所(全4箇所)を、$G$30に置き換える事で、次の様な関数にして下さい。 =IF(AND($F32<>"",ISNUMBER(MATCH($G$30,{"女","男"},0))),IF(ROW()-MATCH("*?",INDEX($I:$I,1):$I31,-1)>COUNTIF(Sheet2!$B:$B,">"&MATCH($G$30,{"女","男"},0))-COUNTIF(Sheet2!$B:$B,">"&MATCH($G$30,{"女","男"},0)+1),"",INDEX($A:$A,MATCH(LARGE(Sheet2!$B:$B,ROW()-MATCH("*?",INDEX($I:$I,1):$I31,-1)+COUNTIF(Sheet2!$B:$B,">"&MATCH($G$30,{"女","男"},0)+1)),Sheet2!$B:$B,0))),"")  次に、Sheet1のG32セルをコピーして、Sheet1のG33~G56の範囲に貼り付けて下さい。  次に、Sheet1のG1セルに「男」(鉤括弧は無用)と入力して下さい。  次に、Sheet1のG30セルに「女」(鉤括弧は無用)と入力して下さい。  これで、準備の第一段階は終了で、次はSheet1のA列~D列に元データを入力して下さい。  するとSheet2のA列に乱数が表示されますから、今度はSheet2のA列全体をコピーして、Sheet2のB列に貼り付けて下さい。  そうしますと、Sheet1のG3~I27に男の抽出結果が表示され、同じくSheet1のG32~I56には女の抽出結果が表示されます。

jou0930
質問者

お礼

非常に細かく説明いただきましてありがとうございました。 大変勉強になり、ありがたかったです。

  • yosifuji20
  • ベストアンサー率43% (2675/6115)
回答No.1

適当なセル(たとえばA1)2柿の式を入れて、下方向に25個コピーします。 =RAND()*500 以上で500未満の乱数が表示されます。下記のように 327.5457214 110.5968859 277.680366 204.5380754 374.1022613 163.9721088 その乱数に該当する順番(小数点以下は切り捨てる)のデータを男女別にべば良いのです。 もう少し工夫すればデータの該当行に当たり外れを表示することもできると思いますが、一回限りならばこれで手作業で選んだほうが早いでしょう。

jou0930
質問者

お礼

回答どうもありがとうございました。 大変勉強になりました。

関連するQ&A