• 締切済み

リスト内の名前をランダムに抽出する。

シート1に下記のように14種類の名前リストがあります     A 1  Aさん 2  Bさん 3  Cさん 4  Dさん 5  Eさん 6  Fさん 7  Gさん 8  Hさん 9  Iさん 10 Jさん  11 Kさん 12 Lさん 13 Mさん 14 Nさん それを下記のように別ブックのシートの14ブロックにランダムに重複しないように抽出したいのですが。     ブロック1       ブロック2       ・・・・      ブロック14     A     B      C     D              AA  AB 1 11月1日  Cさん  11月1日  Mさん  ・・・・    11月1日  Aさん さらに2行目に同じ日付がきた場合には(ブロック1)上の行と同じ名前にする 他のブロックは重複なしでランダムに抽出。     ブロック1       ブロック2       ・・・・      ブロック14     A     B      C     D               AA   AB 1 11月1日  Cさん  11月1日  Mさん    ・・・・     11月1日  Aさん 2 11月1日  Cさん  11月2日  Eさん    ・・・・     11月2日  Hさん ちょっとややこしいので、毎回ランダムに重複しないように抽出できればいいのですが。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3の回答者です。この質問の後のご質問者さんの質疑応答を読みました。 私は、VBAマクロ中心ですから、#3のような回答になりますが、数式のランダム出力とはまったく質的に異なるものです。バグがあれば別ですが、上の日付と同じ以外のものは、人名も上と同じものは出てこないようにできています。そういうことが重要でないなら、その後に出た関数方式でもよいのではないかと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

イメージは掴めました。試してみてください。1列目に日付がないとマクロは進みません。人名データはシート2、 日付表は、シート1になっています。現在はブロック14以下の場合でも、人名は空欄セルに吐き出します。14以上の場合、足らない場合は空欄になります。検査等のユーティリティも作っていますが、これが完成したら出します。 '// Sub Test1()  Dim colData As Collection  Dim sh1 As Worksheet, sh2 As Worksheet  Dim c As Variant  Dim i As Long, j As Long, k As Long, m As Long, n As Long  Dim mem As Long, iCnt As Long  Dim rng As Range  Set sh1 = Worksheets("Sheet1") '作成データ  Set sh2 = Worksheets("Sheet2") '人名の入っているシート  ''人名シートは、A1から縦に入れること。  Set colData = New Collection  With sh2   Set rng = .Range("A1", .Cells(Rows.Count, 1).End(xlUp))   If rng.Rows.Count > 1 Then   For Each c In .Range("A1", .Cells(Rows.Count, 1).End(xlUp))    colData.Add c.Value   Next   Else    MsgBox "人名データがないか、少なすぎます。", vbExclamation    GoTo EndLine   End If  End With  iCnt = colData.Count  mem = iCnt  With sh1   m = .Cells(Rows.Count, 1).End(xlUp).Row   If VarType(.Cells(m, 1).Value) <> vbDate Then MsgBox "シートのデータがふさわしくありません。", 48: GoTo EndLine   If m > 1 Then    For i = 1 To mem  If .Cells(m - 1, i * 2 - 1).Value = .Cells(m, i * 2 - 1).Value Then   .Cells(m, i * 2).Value = .Cells(m - 1, i * 2).Value   n = 1   Do    If colData.Item(n) = .Cells(m - 1, i * 2).Value Then     colData.Remove (n)    End If    n = n + 1   Loop Until n > colData.Count  End If    Next   End If  End With  iCnt = colData.Count  mem = iCnt  Randomize  With sh1   k = 1 '列の初期値   Do    j = Int(Rnd() * iCnt + 1)    If m = 1 Then     .Cells(m, k * 2).Value = colData(j)     colData.Remove (j)     k = k + 1    Else     If .Cells(m, k * 2).Value = "" Then   If (.Cells(m - 1, k * 2).Value <> colData(j)) Or colData.Count = 1 Then    .Cells(m, k * 2).Value = colData(j)    colData.Remove (j)    k = k + 1   Else    j = Int(Rnd() * iCnt + 1)   End If  Else   k = k + 1     End If    End If    iCnt = colData.Count   Loop Until iCnt = 0  End With EndLine:  Set sh1 = Nothing: Set sh2 = Nothing End Sub

kamar3
質問者

お礼

何度もありがとうございます。 参考にしてみます。 ただ、VBAはまだ使った事がないので勉強してみます。 回答内容はコピーしたので覚えていきたいと思います。 (エクセル2010の「マクロの記録」は使った事はあります) お世話になりました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

補足質問です。 質問として、考え方のプロセスや仕組みが良く見えてこないのです。私が、最初に分からない部分は、「日付」の問題です。一体、どうやって日付が入れられるかということです。 そのプロセスを一気に飛び越えて、こうしてほしいと言われても、掲示板ではプロセスが分からないので、すぐには難しいのです。まず、日付が先にいれてあるということでしょうか? #1さんの考え方は、正直、びっくりするような名アイデアだと思います。このまま捨ててしまうのはもったいないほどのアルゴリズムです。それを応用できるか出来ないか、それは運用する側にあると思います。 >2行目に同じ日付がきた場合には(ブロック1)上の行と同じ名前にする >他のブロックは重複なしでランダムに抽出。 2番目の問題点は、その逆です。2行目というか、上の行のセルと違う日付の場合にも、ランダムですから、当然、上のセルと同じものが現れる可能性があるということになります。それを避けなくてはいけない、ということになりませんか? そもそも、なぜ、同じ日付のセルが現れる意味が良く分からないです。同じ日付が14ブロック全部でしたら、全部、同じということになりますね。その上のセルと同じ日付は、一体、いくつ現れるかということです。 こちらで、1度作ってみましたが、かなりの確率で、違う日付で、上のセルと同じ名前が現れます。これを不可とする場合は、ランダムをやり直すシステムを途中で設けなくてはならないと思います。出来ないとは思えませんが、人間の頭でしてきたことを、マクロに移し替えるということは、考えているよりも難しいです。

kamar3
質問者

補足

説明不足で本当に申し訳ありません。 本来のやりたい事の例えが難しく、日付抽出と名前抽出の二つに分けて、今回は名前の方の質問したのですが。 最終的にやりたいことは 例えば社用車が1号車から14号車まで14台あったとします。 使用者は一日に同じ車両しか使えません。 しかし基本的には翌日は違う車両を使わなくてはなりません。ただし、たまたま同じ車両を使っても良い事になっています。 でも、実際には使用者は毎日同じ車両を使っています。 また、それぞれに一日何か所も得意先に行く人もいれば行かない人もいます。 それを元に日報を書いているので同じ日付は14以上であったり以下であったりします。 14台の運行履歴を残すのに、行先や燃料代は実際のデータを使用し翌日は違う使用者になるように ランダムに使用者を抽出(でっち上げ)したかったのです。 以上、説明不足かもしれませんが、不明な点は再度質問していただけましたらありがたいです。

noname#192382
noname#192382
回答No.1

下のプログラムはシート2の1列目に14こはいっている文字データをシート3の1列目にランダムに取り出すVBAです。 これを使ってみていただけませんか Sub Macro2() ' ' Macro2 Macro ' マクロ記録日 : 2010/11/25 ユーザー名 : ' Dim myno, kazu, mys3no As Integer Dim myvalue As Variant mys3no = 1 For kazu = 14 To 1 Step -1 myno = Int(kazu * Rnd() + 1) myvalue = Cells(myno, 1) Selection.Cut Sheets("Sheet3").Select Cells(mys3no, 1) = myvalue Sheets("Sheet2").Select Rows(myno).Select Selection.Delete Shift:=xlUp mys3no = mys3no + 1 Next ' End Sub

kamar3
質問者

お礼

説明不足で申し訳ありませんでしたが 抽出するセルは隣同士ではない任意のセルなので ちょっと違うようです。 ありがとうございました。

関連するQ&A

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。 という質問をさせていただき、mike gさんに下記のような回答をいただきました 1.Sheet1 の例えばセル C1 に式 =RAND() を入力して、此れを右に2列(注1参照)ドラッグ&ペースト 2.範囲 C1:E1 を下方にズズーッと(14行目まで)ドラッグ&ペースト 以下は別シート(Sheet2)における操作です。 3.セル A1 に次式を入力して、此れを右方にズズーッと(セル AA1 まで)ドラッグ&ペースト(注2参照)   =IF(MOD(COLUMN(),2)=1,INDEX(Sheet1!$A$1:$A$14,MATCH(SMALL(OFFSET(Sheet1!$C$1,,ROW()-1,14,),CEILING(COLUMN()/2,1)),OFFSET(Sheet1!$C$1,,ROW()-1,14,),0)),"") 4.1行目全体を下方にズズーッと(3行目まで)ドラッグ&ペースト 注1:「右に2列」は別シートの行数が3行の場合で、4行(5行)の場合は「右に3列(4列)」に読み替える。 注2:式中の 2 は「一列おき」の場合で、二列(三列)おきの場合は 2 を 3(4) に書き替える。 これで完璧に出来たのですが 実際にはSheet2のセルH6から15列おきに抽出したいのです。 15列おきは出来たのですが、セルH6から抽出を始めるにはどの部分を変更すれば良いのでしょうか? どなたか教えて頂ける方がおりましたらよろしくお願いします。

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。

  • エクセルで、規則性はあるのですが、数字と文字が混在しているものを重複しないように抽出したいのですが。

    エクセルで、シート1に列A(数値)と列B(文字列)を結合したものが、 列C(列A&列B)であります。 これをシート2で列Cの文字列が重複しないように抽出したいのです が、どうしたらよいのでしょうか? シート1     列A  列B  列C 行1  項目A 項目B 項目C 行2  2   CC  2CC 行3  3   AA  3AA 行4  5   BB  5BB 行5  7   PP  7PP 行6  2   CC  2CC 行7  5   AA  5AA これをシート2で、     列C 行1  項目A 行2  2CC 行3  3AA 行4  5BB 行5  5AA 行6  7PP このように重複するものを統合した形でまとめたいのですが、 わかるかたがいれば教えてもらえないでしょうか?

  • ランダムに出てくるデータの抽出

    こんにちは。 マクロ初心者です。     A  B  C  D  E  F  G 1  あ  あ  う  う  う  え  お   2  あ  あ  い  い     い  お 3  い   4      5  う        お 6  う        お 7      8  あ  お  え  え  え  お 9  あ     い     う  え  お 10   お  い  い  い  え 上記のような表があるとき。 1の行には「あ・う・え・お」 2の行には「あ・い・お」 3の行には「い」 4の行には「データなし」 5の行には「う・お」 6の行には「う・お」 7の行には「データなし」 8の行には「あ・え・お」 9の行には「あ・い・う・え・お」 10の行には「い・え・お」 このように、『行ごとに何のDataが存在しているかを取り出す』ようなマクロを組みたいのです。 関数でも可能だと思うのですが、出来るだけエクセルシートの容量を減らしたいのでマクロで組みたいと考えています。 このデータは、上記の例では5個ですが、1000個ぐらいあり全てランダムに出てきます。 何か条件が付いているデータの抽出という質問は、よく見かけるのですが、 このように何を条件とすれば良いのかわからない場合は、どのようにすれば良いのでしょうか。 どのようにマクロを組んだら良いかわからず困っています。 何卒アドバイスをお願いします。  

  • エクセルでランダムに抽出後、一つのセルにまとめる方法

    エクセル初心者です。 エクセルのシート1に A列の1行目~10行目にA~Jまでの文字が入力されています。 これをシート2の B列の1~100行目に シート1からランダムで抽出した3つ又は4つの文字を ACE DFG ・・・・ のように埋めるには、どのような式を入れればできるのでしょうか? 文字はだぶらないように抽出したいと思います。 文字はCAEのように、順番が逆になっても構いません。 むしろ時々逆になったりするほうが都合がよいです。 抽出される文字数も、3つだけでなく、ランダムで4つ抽出するときも あるようにしたいです。 オフィス2003を使用しています。 ご回答よろしくお願いします。

  • エクセル関数 データの抽出について

    エクセル2010 重複データの抽出。 重複データの抽出方法をご教示ください。 抽出先はシート1のA列A3~抽出データの分だけ リストはシート2のB2:AB32まで フィルターオプションなども使ってみたのですが どうも上手くいきません。 どなたか知恵をお貸しください。 方法はできれば関数だといいのですが(データが増えてもいいように) できなければ他の方法でもいいです。 VBAなどは全くの初心者なので出来れば避けたいのですが… シート2     A    B   C    D~AB32 1  "" 2 いちご ばなな いちご りんご 3 みかん いちご ばなな いちご 4 りんご ばなな いちご みかん 5 みかん いちご ばなな りんご 6 ばなな ばなな りんご いちご : : 32 シート1(重複データなし)  A 1  "" 2  "" 3 いちご 4 みかん 5 りんご 6 ばなな 7 : : 抽出リストのデータはシート2のB2:AB32にぎっしり入っています。 宜しくお願い致します。

  • excelの複数シートを検索対象にして重複行を抽出する方法

    ある値が重複する行を抽出したいのですが 抽出元データが600,000行近くあり、1sheetに入らず9シート程に分けました。 countifを使おうとしたのですが検索範囲に複数シート指定が出来ず(3D-参照の対象関数ではないようです)、 =COUNTIF('sheet1:sheet9'!$C:$C,C1)としてみたのですが、重複行があっても全て#VALUE!となってしまうので機能できていないようです。 具体的には sheet1~8に下記のようなデータがあり、C列が重複する行を抽出したい。 A列:id、B列:名前、C列:メアド、D列:xx 宜しくお願い致します。

  • エクセルで重複しないものだけを抽出したい

    下記のようなデータがあります。 A B C D 1 20 30 40 1 20 32 41 1 20 30 49 1 20 81 39 2 20 76 40 2 20 32 41 2 20 30 49 3 20 81 39 3 20 39 40 3 20 32 41 4 20 30 49 4 20 81 98 このうち、列Aの他と重複しない部分であり、かつ先頭行を抽出するにはどのようにしたらよいでしょうか? 上記の例で言うと、列Aの1から4までのそれぞれ1行目を選ぶという作業です。 抽出後 A B C D 1 20 30 40 2 20 76 40 3 20 81 39 4 20 30 49 vlookupなどの関数でできるのでしょうか?教えてもらえたらうれしいです。お願いします。

  • エクセル、任意の「行」だけを抽出したい。

    こんなことできますか? A1:F100のセル内にランダムに数字が入っています。 質問1) この中から 1行目→3行目→5行目と一つ飛ばしで入っているデータを抽出してH1:M100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 A1-B1-C1-D1-E1-F1 A2-B2-C2-D2-E2-F2 A3-B3-C3-D3-E3-F3 A4-B4-C4-D4-E4-F4 A5-B5-C5-D5-E5-F5 A6-B6-C6-D6-E6-F6 A7-B7-C7-D7-E7-F7 ・・・ A100-B100-C100-D100-E100-F100 の中から A1-B1-C1-D1-E1-F1 A3-B3-C3-D3-E3-F3 A5-B5-C5-D5-E5-F5 ・・・ を抽出して H1-I1-J1-K1-L1-M1 ・・・ H100-I100-J100-K100-L100-M100 の範囲内に表示させたいです。 質問2) 同様に、 1行目→4行目→7行目と二つ飛ばしで入っているデータを抽出してO1:T100の範囲内に表示させるにはどのような操作をすればいいのでしょうか?関数とかで簡単に抽出表示させる技とかあればいいのですが・・・。 ※ 説明がわかりにくいかもしれませんが、よろしくお願いします。

  • 必要なデータを抽出したい

    必要なデータを抽出したい    A   B    C   D ・・・ 1 7/1   101   102  103 2 7/2   101   103 3 7/3   105   203 4 7/4   103   205 5 7/5   101   202 ・ ・    ・ ・ ・    ・ ・ ・    ・ Excelで上の様にA列に日付、B行列以降に数字が書かれているシートから、抽出したい数字が含まれている行を別シートに抽出するマクロはどのように書けばよろしいのでしょうか。 技術者の方、よろしくお願いします。 例えば、101が含まれているデータを抽出したら、sheet2に    A   B    C   D 1 7/1   101   102  103 2 7/2   101   103 3 7/5   101   202 となるようにしたいのです。

専門家に質問してみよう