• ベストアンサー

Excel2007で乱数を利用して

乱数を利用して抜き出したいです 0~9の数字記号がありまして、その内のいずれかがセルA~AJの各セルに入ってます。 セルA~AJは1~36番目と言うことなんで数字1~36を乱数で被ることなく6個をとり その6個を利用してセルA~AJの数字記号を抜き出してセルQ6~V6に表したいです。 マクロボタンを押す度に別の乱数でまた抜き出しては次のQ7~V7へと、違う乱数を使っては下へ下へと表示したいです。 よろしくお願いいたします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1607/2444)
回答No.13

とりあえずQ6~V6に乱数の結果を視覚化するために表示して Q7~V7に2行目のデータから該当するものを取得記載するようにしています。 Sub ボタン1_Click() Dim MyDic As Object, MyKey As Variant Dim i As Long Dim MyRand As Long, LastRow As Long '6個の重複しない乱数1~36の取得 Set MyDic = CreateObject("Scripting.Dictionary") For i = 1 To 6 MyRand = WorksheetFunction.RandBetween(1, 36) If MyDic.Exists(MyRand) = False Then MyDic.Add MyRand, "Dummy" Else i = i - 1 End If Next i MyKey = MyDic.keys Set MyDic = Nothing 'Q6からV6に取得した6個の乱数を記載 Cells(6, "Q").Resize(1, UBound(MyKey) + 1).Value = MyKey 'Q6からV6の数値を列データとして2行目のデータを取得して 'Q7からV7を先頭にして下方向に追加記載 LastRow = Cells(Rows.Count, "Q").End(xlUp).Row + 1 ' If LastRow < 6 Then ' LastRow = 6 ' End If For i = 0 To 5 Cells(LastRow, "Q").Offset(0, i).Value = Cells(2, MyKey(i)).Value Next End Sub

961awaawa
質問者

お礼

いつもご返答ありがとうございます。(Q6:V6)に重複することなく1~36の乱数を表示することに成功しましたが、 それらを利用しての(Q7:V7)への抜き出しコピペは失敗してまして、マクロが作動中に、R7に抜き出してる数値が5回表示されては消えて最後の6回目の数値が表示されるという結果になりました。何処を治せばよろしいでしょうか?

その他の回答 (17)

  • kkkkkm
  • ベストアンサー率65% (1607/2444)
回答No.7

> あなたの仰る通り私もそうなんだと思います。が、どうなんでしょうw もちろん単に0~9までの数値をランダムに6個表示したいのであればという話です。 設問のように 0~9の36個のランダムな数値の並びから6個無作為に取り出すとした場合は、4種類の数値は他の6種類の数値より1個少なく配置されていると思いますので、その分偏りますよね。

961awaawa
質問者

お礼

ご返答ありがとうございます。ご理解されにくい内容なため再度説明させてください。(私の説明下手がいけないのですが) (A2:AJ2)に0~9の数字が入ってます(もちろん数字は重複してます。) (A2:AJ2)から被ることなくランダムに選択して6個だけ取り出したいです。(1回のマクロ作業でA2を2回、M2を3回とかは無しでお願いします。) 取り出した6個の値は(D6:I6)にコピペします(その時の値は重複してたりしてます)。 そして次のマクロ作業の時にはまたランダムに選択をし、(D6:I6)の次の(D7:I7)にコピペして行きたいです。 と、この様な質問内容でした。いつも質問し始めは頭の中が混乱してる最中で上手く伝えれてなかったりしてすみません。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.6

>(A2:AJ2)から被ることなく >ランダムに選択して6個だけ取り出したいです。 例えば、 A2=3 J2=3 L2=3 Q2=3 U2=3 X2=3 と埋まっており これらのセル6個がヒットしたときに 拾い出す値は 3,3,3,3,3,3 となるわけですが、 この動作が正しいということであれば 以下のコードになると思います。 Option Explicit Dim xNum(6) As Long  '重複しない6個の列番号 Sub Sample3()    Const sCol = 17   '出力セル開始列番号  Const RowAdd = 5     '6行目から出力  Dim wkCounter As Long  Static RowCounter As Long    Get6Num    RowCounter = RowCounter + 1 '出力行をカウントアップ    With ThisWorkbook.Sheets(1)   For wkCounter = 1 To 6    .Cells(RowCounter + RowAdd, wkCounter + sCol - 1).Value = _     .Cells(2, xNum(wkCounter)).Value   Next wkCounter  End With End Sub Sub Get6Num()  xNum(1) = GetRandomiz  Do   xNum(2) = GetRandomiz   If xNum(2) <> xNum(1) Then Exit Do  Loop  Do   xNum(3) = GetRandomiz   If ((xNum(3) <> xNum(1)) And _     (xNum(3) <> xNum(2))) Then Exit Do  Loop  Do   xNum(4) = GetRandomiz   If ((xNum(4) <> xNum(1)) And _     (xNum(4) <> xNum(2)) And _     (xNum(4) <> xNum(3))) Then Exit Do  Loop  Do   xNum(5) = GetRandomiz   If ((xNum(5) <> xNum(1)) And _     (xNum(5) <> xNum(2)) And _     (xNum(5) <> xNum(3)) And _     (xNum(5) <> xNum(4))) Then Exit Do  Loop  Do   xNum(6) = GetRandomiz   If ((xNum(6) <> xNum(1)) And _     (xNum(6) <> xNum(2)) And _     (xNum(6) <> xNum(3)) And _     (xNum(6) <> xNum(4)) And _     (xNum(6) <> xNum(5))) Then Exit Do  Loop End Sub '整数な乱数発生関数 Function GetRandomiz()  Const iMin = 1  '開始範囲From  Const iMax = 36  '開始範囲To  Call Randomize  GetRandomiz = Int((iMax - iMin + 1) * Rnd + iMin) End Function

961awaawa
質問者

お礼

ありがとうございました。ご協力頂いて気持ちが良かったです。

961awaawa
質問者

補足

これらのソースが希望の形になるんでしょうか? 凄いですね。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.5

・A2:AJ2の36個のセルに0~9の任意の整数がランダムに埋まっている ・ここから乱数を使って、重複しない任意な6個の値を拾い出す。 と理解しました。 A2:AJ2の35個のセルを使うことで、 拾う値(0から9)に重みづけが可能かもしれませんが それを除けば 既に他の方から指摘がありますように 単に、 0~9の任意の整数から重複しない6個を拾い出すのと同等に思えます。 ともあれ、期待のことを素直に受け取れば つぎのようなコードになると思います。 Option Explicit Sub Sample2()    Const RowAdd = 5     '6行目から出力  Dim wkCounter As Long  Dim ColData(6) As Long  '出力個数    Static RowCounter As Long  RowCounter = RowCounter + 1 '出力行をカウントアップ  Const sCol = 17   '出力セル開始列番号    With ThisWorkbook.Sheets(1)      Do    For wkCounter = 1 To 6     ColData(wkCounter) = .Cells(2, GetRandomiz).Value    Next wkCounter        If ( _     (ColData(1) <> ColData(2)) And _     (ColData(1) <> ColData(3)) And _     (ColData(1) <> ColData(4)) And _     (ColData(1) <> ColData(5)) And _     (ColData(1) <> ColData(6)) And _     (ColData(2) <> ColData(3)) And _     (ColData(2) <> ColData(4)) And _     (ColData(2) <> ColData(5)) And _     (ColData(2) <> ColData(6)) And _     (ColData(3) <> ColData(4)) And _     (ColData(3) <> ColData(5)) And _     (ColData(3) <> ColData(6)) And _     (ColData(4) <> ColData(5)) And _     (ColData(4) <> ColData(6)) And _     (ColData(5) <> ColData(6)) _       ) Then     Exit Do    End If   Loop     For wkCounter = 1 To 6    .Cells(RowCounter + RowAdd, wkCounter + sCol - 1).Value = _     ColData(wkCounter)   Next wkCounter    End With End Sub '整数な乱数発生関数 Function GetRandomiz()  Const iMin = 1  '開始範囲From  Const iMax = 36  '開始範囲To  Call Randomize  GetRandomiz = Int((iMax - iMin + 1) * Rnd + iMin) End Function

961awaawa
質問者

お礼

ご返答ありがとうございます。ご理解されにくい内容なため再度説明させてください。(私の説明下手がいけないのですが) (A2:AJ2)に0~9の数字が入ってます(もちろん数字は重複してます。) (A2:AJ2)から被ることなくランダムに選択して6個だけ取り出したいです。(1回のマクロ作業でA2を2回、M2を3回とかは無しでお願いします。) 取り出した6個の値は(D6:I6)にコピペします(その時の値は重複してたりしてます)。 そして次のマクロ作業の時にはまたランダムに選択をし、(D6:I6)の次の(D7:I7)にコピペして行きたいです。 この様に質問を訂正させて頂きました。この内容とホホパパさんに作って頂いたソースは整合してますでしょうか? 質問で返す様な形で申し訳ありません。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.4

回答No.1への補足より >A2:AJ2の各セルに数字記号である0~9のいずれかがランダムに入ってます。 A2:AJ2の各セルには文字列として"0"~"9"の1文字の数字が入力されているのですか? セルの数が36ですから重複することになりますよね? >A2~AJ2の数字記号を6個だけ抜き出してD6~I6に表したいです。 >なのでD6~I6は0~9の数字記号になります。 D6~I6へ"0"~"9"の文字列としての1文字をランダムに配置できれば良いのでしたら質問の中で述べている「セルA~AJは1~36番目と言うことなんで数字1~36を乱数で被ることなく6個をとり」は無意味かと思います。 A2~J2へ重複のない乱数を発生させて小さい順(大きい順でも可)に列番号を6個取り出せば良いことになります。但し、取り出した列番号から1を減じないと0~9になりません。 A2:J2=RAND() D6=TEXT(MATCH(SMALL($A$2:$J$2,COLUMN(A6)),$A$2:$J$2,0)-1,"0") D6セルを右へI6までコピーします。 この回答はExcelの組み込み関数による処理なので「マクロボタンを押す度に別の乱数でまた抜き出して」という操作はできませんがD6:I6をコピーしてD7以降へ順次「値の貼り付け」を実行すれば目的通りになるでしょう。

961awaawa
質問者

お礼

ご返答ありがとうございます。ご理解されにくい内容なため再度説明させてください。(私の説明下手がいけないのですが) (A2:AJ2)に0~9の数字が入ってます(もちろん数字は重複してます。) (A2:AJ2)から被ることなくランダムに選択して6個だけ取り出したいです。(1回のマクロ作業でA2を2回、M2を3回とかは無しでお願いします。) 取り出した6個の値は(D6:I6)にコピペします(その時の値は重複してたりしてます)。 そして次のマクロ作業の時にはまたランダムに選択をし、(D6:I6)の次の(D7:I7)にコピペして行きたいです。 よろしくお願いいたします。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

ANo.1です。 > >セルA2:AJ2に=RAND()と入れて、を > A3:AJ3に=RAND()に変えまして、シート関数でよろしいですか? その場合、マクロ側も変更が必要です   .Formula = "=OFFSET($A$1,0,MATCH(LARGE(2:2,COLUMN(A1)),2:2,0)-1)"     ↓   .Formula = "=OFFSET($A$1,1,MATCH(LARGE(3:3,COLUMN(A1)),3:3,0)-1)" お試しください。

961awaawa
質問者

お礼

ありがとうございました。ご協力感謝します。

  • kkkkkm
  • ベストアンサー率65% (1607/2444)
回答No.2

結果として0~9までの数値をランダムに表示したいという動作でしょうか 関数で =RANDBETWEEN(0,9) でいいと思いますが。

961awaawa
質問者

お礼

凄いところを突いてきてらっしゃるんですが、あなたの仰る通り私もそうなんだと思います。が、どうなんでしょうw 自己満足の世界にひたりたいのか、結果をみて次に思考がどう働くのかを経験したいのです。 なんか滅茶苦茶楽しいんですw 次に自分の頭がどう働くのかがw

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.1

「A~AJの各セル」ってのはA1:AJ1の各セルと言う認識で良いですよね? 以下の様にします。 セルA2:AJ2に=RAND() と入れて、フォント色を白にでもしてください。 マクロはこんな感じ。 Sub Sample()   nRow = WorksheetFunction.Max(6, Cells(Rows.Count, 17).End(xlUp).Row + 1)   With Range("Q" & nRow & ":V" & nRow)     .Formula = "=OFFSET($A$1,0,MATCH(LARGE(2:2,COLUMN(A1)),2:2,0)-1)"     .Value = .Value   End With End Sub 添付の図は、解りやすくするため、A1:AJ1に「1~36」までの数値を入れていますし、A2:AJ2のフォント色を黒にしています。

961awaawa
質問者

お礼

上手くいきませんでした。 ごめんなさい!書き損じてました。A2:AJ2の各セルに数字記号である0~9のいずれか がランダムに入ってます。1~36の乱数を使って A2~AJ2の数字記号を6個だけ抜き出してD6~I6に表したいです。 なのでD6~I6は0~9の数字記号になります。 >セルA2:AJ2に=RAND()と入れて、を A3:AJ3に=RAND()に変えまして、シート関数でよろしいですか?

関連するQ&A

  • Excel2007で整数の乱数

    皆さまいつも解答していただいて誠にありがとうございます。今回は二回目の乱数の使用なんですが質問させて下さい。 (1)マクロボタンを押します。 (2) U6:U15000の各セルに1~10の乱数をいれます。そうすることによってAA6:AA15000に何らかの記号が各セルに一つずつ入ります。 (3)そのAA6:AA15000に記号が入ってますがAA1:AA15000をコピーしてsheet3のA1:A15000にコピーします。 (4)、(1)に戻って(3)まで行きましてAA1の隣のBB1:BB15000にコピーします。 右隣にコピーしていきます。 よろしくお願いいたします。

  • Excel2007で乱数をつくりコピペしたいのです

    Excel2007で乱数をつくりコピペしたいです (1)、マクロボタンを押します。 (2)、1~10の数字を乱数で(U6:U15000)に表示(同じ数字が連なっても大丈夫)したらAA3に数値ができあがります。 (3)、(U6:U15000)に出来た乱数をsheet5のC6から下にコピペして、 (4)、(2)でAA3に数値ができあがるのでそれをsheet5のC4にコピペします。 (5)、(1)に戻ってマクロボタンを押すと(2)(3)(4)と行くのですがコピペする場所はCから一つ右隣のDと、マクロボタンを押す度に右隣にコピペしたいです。 ご協力お願いいたします。

  • Excel2016でリボルビングコピペ

    sheet8のセル範囲C3:C10000までの各セルに記号値A~Jのいずれかがランダムに入ってます。 マクロボタンを押します。 C3:C10000の範囲の内から 何個か行番数を選びます。 選ばれた行番数から50行戻った所までの範囲の記号値を横化して、 O4:BL4の範囲から下に向かって6000行程繰り返してコピペしたいです。 繰り返しコピペの際に選んだ行番数に+1 をして同じ形の行には成らないようにしたいです。 (抜き出して、リボルバーみたいに回転してコピペするけど、コピペされる度に行番数に+1 されてるので同じではない、みたいな感じです。) 教えて頂けたら幸いです。

  • Excel2007でセル範囲の数字記号を利用して

    (1)、(E6:M6)の各セルに0~9のいずれかがランダムにはいります(同じ数字が2個、3個と重複したりもします)。 (2)、(1)と同様に(N6:V6)にもランダムに数字がはいります。 (3)、(1)の(E6:M6)の数字を利用して(2)の(N6:V6)の中の同じ数字を消し、 消えずに残った数字をG19から右に表したいです。 ※例 (E6:M6)に5が何個入ってても(N6:V6)に入ってる5が全部消える。 (E6:M6)に4が1個入ってても(N6:V6)に何個も入ってる4が全部消える。 と、マクロボタンで処理する形にしたいです。 よろしくお願いいたします。

  • Excel 乱数 1から10まで

    こんにちは、 A1~A10の10個のセルに0,1,2,3,4,5,6,7,8,9の10個の数字をそれぞれ一回ずつ出したいと考えています。 乱数の関数を当てはめた場合、同じ数字が出でしまい目的通りには行きませんでした。 上記のことを行うためには、いろいろと組み合わせるのかも知れませんが、もっと簡単にできないものかと思っています。 何かお分かりのかたがいましたら教えてください。よろしくお願いします。

  • Excel2007で行指定して数字を記号に変換

    いつもお世話になり感謝します。 X列の1マス1マスに0~9の数字のいずれかが入ると、X列に入った0~9の値に反応して、そのX列の1マスを水平上にかつ、中心として、V列W列とY列Z列のセルに0~9の数字のいずれかが入ります。 更に、V列W列とY列Z列に入った数値を記号に変換して、その変換内容は 0が●で 1~9は× になります。 マクロボタンを押すと 行指定ができるダイアログボックスが出て来て 行指定されたセルXに0~9の数字を0から1つずつ入れて 別sheetの、0の場合はB20にV列の値を、W列はC20、Y列はD20、Z列はE20にと変換内容に沿ってコピペしたいです。 Xに3が入るということは、別sheetの(B23:E23)に変換された記号が入ってる形であることが正解の形になります。 私の下手な質問がおおまかにご理解して頂けたと思いますので、ここから質問を綺麗にまとめます。 Asheet上にあるマクロボタンからBsheetのX列の行番号指定に始まり、その行番号指定したXセルに0~9が1つずつ入りますと、セルA20~A29に0~9と数字を付ってますので V列はAsheetのB20から下に、W列はAsheetのC20から下に、Y列はAsheetのD20から下に、Z列はAsheetのE20から下に マクロボタンで行指定する度に変換内容に沿って変換された記号が(B20:E20)~(B29:E29)にと一気にずらーっと入ってるのが希望なんです。 再度ご協力頂けたら嬉しいです。

  • Excel2007で行指定して数字を記号に変換

    いつもお世話になってます。 X列の1マス1マスに0~9の数字のいずれかが入ると、X列に入った0~9の値に反応して、そのX列の1マスを水平上にかつ、中心として、V列W列とY列Z列のセルに0~9の数字のいずれかが入ります。 更に、V列W列とY列Z列に入った数値を記号に変換して、その変換内容は 0が●で 1~9は× になります。 マクロボタンを押すと 行指定ができるダイアログボックスが出て来て 行指定されたセルXに0~9の数字を0から1つずつ入れて 別sheetの、0の場合はB20にV列の値を、W列はC20、Y列はD20、Z列はE20にと変換内容に沿ってコピペしたいです。 Xに3が入るということは、別sheetの(B23:E23)に変換された記号が入ってる形であることが正解の形になります。 私の下手な質問がおおまかにご理解して頂けたと思いますので、ここから質問を綺麗にまとめます。 Asheet上にあるマクロボタンからBsheetのX列の行番号指定に始まり、その行番号指定したXセルに0~9が1つずつ入りますと、セルA20~A29に0~9と数字を付ってますので V列はAsheetのB20から下に、W列はAsheetのC20から下に、Y列はAsheetのD20から下に、Z列はAsheetのE20から下に マクロボタンで行指定する度に変換内容に沿って変換された記号が(B20:E20)~(B29:E29)にと一気にずらーっと入ってるのが希望なんです。 ご協力頂けたら嬉しい。

  • Excel2007でヘルプをお願いします

    Excel2007でヘルプをお願いします。 (1)、(U2:U11)に上から順にアイウエオカキクケコと入ってます。 (2)、(V2:V11)に、[(1)を参照記号してどこからかで集められた]個数データが入ってます (3)、(W2:W11)にも(2)と同じような流れで入ってます。 図 | U | V | W | | ア | 16| 24| | イ | 23| 18| | ウ | ・| ・| | ・ | ・| ・| …とこんな感じです。 このデータは今回とは関係のないマクロボタン(1)が押される度に変わります。 (4)、マクロボタン(1)が押されデータが変わる度に(V2:V11)の数字データを参照にしてU列(ア~コ)を数字データが多い順に並べ変えsheet3の(C6:L6)へ[左が一番多い数字データの記号となるように]横倒しにコピペし、 (W2:W11)の場合もsheet4に(C6:L6)に(4)と同じようにコピペしたいです。 マクロボタンを作り、それを押す度にsheet3とsheet4にある(C6:L6)の下に向かって次々と入れていきたいです。(C7:L7)→(C8:L8)と 格子も付けて文字もセンターに揃えたいです。 よろしくお願いいたします。

  • Excel2007で必要でないデータ

    必要でないデータを可視化したいとおもいまして質問させて頂き御協力お願いします。 (1)、まずU3~AF3のセルを空にします。U3~AF3のセルの1つずつに記号として扱われるア、イ、ウ、エ、オ、カ、キ、ク、ケ、コ、と空白のいずれかが入ります。 (2)、(1)でU3~AF3に入ったそれらの記号を利用して記号のアイウエオカキクケコの中から消します。 (3)、(2)で消されずに余った記号をセルAH3から右に向かって各セルに1つずつ入れます。 (4)、(1)に戻り違う記号が入ります。(2)にいき(3)についたらセルAH3の下のセルAH4から右に向かって…をマクロボタンを押す度に繰り返したいです。

  • 乱数の利用

    よろしくお願いします。 エクセル、あるいは同様の表計算ソフトには乱数の関数がありますが、 実際に利用された経験がある方がいらっしゃいましたら、 何にどのように利用されたかを教えてください。 ちなみに、私の場合は、大学時代に物理のシミュレーションをやった以外ですと、 あらかじめ、RAND関数とRANK関数を使った表を作っておき、 このQ&Aサイトでアンケートの質問を投稿して、ベストアンサーを決定する際、 その日の日付の数だけ再計算ボタンを押して(6月17日なら17回)、 順位がいちばん上になった番号の回答をベストアンサーにする、といった用途ぐらいです。 ですので、もっと実用的で有効な応用があれば、知りたいです。 生活に密着したことから、趣味、お仕事あるいは高度な応用まで、様々なご回答を歓迎いたします。

専門家に質問してみよう