Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Microsoft 365)
母体からグループ毎に数を決めて抽出したい
投稿日時: 22/11/19 04:30:29
投稿者: oga21

例えば、1000人の名簿から、Aグループ20人、Bグループ15人、・・・というように、数を決めてランダムに抽出する方法は、Excelで可能でしょうか?ちなみに抽出数の合計は100人で、グループ数は15です。
名簿は、
1 ○○さん A
2 ××さん A
3 □□さん B
4 △△さん B
5 ●●さん C
・ ・・・・ ・
・ ・・・・ ・
というような一覧表です。よろしくお願いします。

回答
投稿日時: 22/11/19 07:37:43
投稿者: WinArrow
投稿者のウェブサイトに移動

>ランダム
という表現は、難しい。
 
一定の法則を与える必要があるからね・・・

回答
投稿日時: 22/11/19 10:14:33
投稿者: 半平太

一般機能でも、下の手順で出来そうですけどね。。
 
1.グループ別の当選者数を下図(G1:I2)の様に埋める(サンプルでは、3グループ、計10人)
2.C2セルに=RAND() と入力して、フィルダウン
3.C列全体をコピーして、値の貼付け
 
4.乱数にダブりがないか、D2に数式を入れて、念のため確認する。
  D2セル =IF(OR(COUNTIF(C2:C1200,C2:C1200)>1),"有","無")
 
5.G3セル =XLOOKUP(TAKE(SORT(FILTER($C$2:$C$1200,$B$2:$B$1200=G1)),G2),$C$2:$C$1200,$A$2:$A$1200,"")
  と入力して、右へコピー
 

<結果図>
行 ___A___ ____B____ _______C_______ __D__ _E_ ____F____ ___G___ ___H___ ___I___
 1 氏名    グループ  乱数生成後値化  重複      グループ    A      B      C     
 2 Name01  A          0.594714537   無        当選者数     5       2       3
 3 Name02  A          0.554952974                       Name07  Name12  Name14 
 4 Name03  A          0.323293225                       Name03  Name09  Name16 
 5 Name04  A          0.723990988                       Name02          Name13 
 6 Name05  A          0.974484221                       Name01                 
 7 Name06  A          0.939029356                       Name04                 
 8 Name07  A          0.085922578                                              
 9 Name08  B           0.94932929                                              
10 Name09  B          0.264407234                                              
11 Name10  B          0.564305458                                              
12 Name11  B          0.554734358                                              
13 Name12  B          0.030535968                                              
14 Name13  C          0.478480494                                              
15 Name14  C          0.058312015                                              
16 Name15  C           0.82291206                                              
17 Name16  C          0.153581672                                               

回答
投稿日時: 22/11/19 11:26:37
投稿者: simple

こんな風にしてもよいかも。半平太さんの例を拝借します。
 

(1) B列に各グループ別の必要数分だけグループ名を記入しておく。
    上から10セル(実例なら100セル)に記入し、残りはブランクのままで可。
(2) C列に = RAND()をセットする
(3) B:C列を C列でソート(昇順、降順どちらでも可)
そうすれば、各人の当確、決まったブループ名が得られます。

(4)もう必要ないので、C列を消去します。

(5)グループ別の構成員一覧は、B列でソートすればいいでしょう。
  (B列がブランクのデータは、後ろに並びますから)

(6)元の名前順に戻す必要があるなら、(5)の処理の前にC列に1から1000までの連番を振っておいて、
   ・(5)' A:C列をB列でソートしてグループ別名簿を作ったあとに、
   ・再度、C列でソートすれば元に戻ります。

行 ___A___ ____B____ _______C_______   
 1 氏名    グループ  乱数生成後値化  
 2 Name01  A          0.594714537   
 3 Name02  A          0.554952974   
 4 Name03  A          0.323293225   
 5 Name04  A          0.723990988   
 6 Name05  A          0.974484221   
 7 Name06  B          0.939029356   
 8 Name07  B          0.085922578   
 9 Name08  C          0.94932929   
10 Name09  C          0.264407234   
11 Name10  C          0.564305458   
12 Name11             0.554734358   
13 Name12             0.030535968   
14 Name13             0.478480494   
15 Name14             0.058312015   
16 Name15             0.82291206   
17 Name16             0.153581672   

(1)は一回限りの処理なのでマクロでなくてもいいでしょうし、他も、マクロでなくても十分では?

投稿日時: 22/11/19 21:47:00
投稿者: oga21

わ〜皆さん、解決しました。
実は町内会の祭りで、最後のお楽しみ抽選会を公開ですることになっており、コロナ禍のために短時間で機械的に行う必要がありました。
さらに、班の世帯数に応じて当選者数を班ごとに決める必要があり、頭を抱えておりました。
ありがとうございました。

回答
投稿日時: 22/11/19 23:44:56
投稿者: simple

題意を誤解していたようです。
1000人の中から100人を選んで15グループを作るのかと解釈していました。
すでに解決済みなので、影響ないですが。
解決済みなので閉じてもらえますか?

投稿日時: 22/11/20 04:22:43
投稿者: oga21

ありがとうございました。