• ベストアンサー

VBAマクロに詳しい方助けてください!

Excel2007で乱数を使ったマクロを組んだのですが、同じ数字が繰り返し出力されて困っています。詳しい方、どうか解明をお願いします。 やりたいこと: 100分の1の確率で抽選を繰り返し、当たり(乱数で1が発生したら当たりとする)がでたら「何回目の抽選で当選したか」をセルA1に記入し、セルA2に移行して同じ抽選をやり直す。その作業をA10000まで続ける。 作成したマクロ: Sub 百分の一抽選() Dim r, cou, ransuu As Integer For r = 1 To 10000 'A1 からA10000まで繰り返す  For cou = 1 To 10000  '↑100分の1の確率で当たり(1を当たりとする)が出るまで繰り返す  Randomize '乱数初期化  ransuu = Int(Rnd() * 100) + 1 '1から100までの乱数を作成  If ransuu = 1 Then '乱数で1が発生したら当たりとしてセルに記入  Cells(r, 1) = cou  Exit For '当たりが出たのでひとつ下のセルでの抽選に移行  End If  Next Next End Sub マクロを走らせた結果: 62,43,110,103,43,110,103,43,110,8,94,47,115・・・ 上記のように同じ数字のカタマリができてしまいます。 もちろん乱数ですので連続したり重複したりするでしょうが、 あまりに同じパターンが繰り返されるのでどこかおかしいのだと思います。 マクロを実行するたびに数字はかわるのですが、やはりカタマリになります。 作成・動作環境はWinXP,Excel2007(ファイル自体は.xlsで作成),Core2Duo2.20GHz,メモリ2GBです。 ほかのExcelのバージョンでも試してみましたが同じような結果です。 当方VBA歴3年ほどですが、わけがわからずに不思議でなりません。 詳しい方、ぜひ解明をお願いします。同じマクロ使っても現象が起きないようでしたら こちらの環境のせいだと思われるので、そういったご指摘でもかまいません。 よろしくお願いいたします。

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

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

こんにちは。 Randomize で、乱数ジェネレータで、初期化して、同じものをまた呼び出しているからです。ヘルプでは、Randomize ステートメントで、引数に同じ値を使用しても、前の乱数系列を繰り返すことはできません、と書かれていますが、実際には、コンピュータで扱うものは、「自然乱数」ではなく、区間を区切った「一様乱数」を使っているので、Randomize を頻繁に使うと同じものを呼び出す結果になってしまいます。 したがって、  Randomize '乱数初期化 '←これは、ある一定の場所では、繰り返してはならないわけです。   なお、私なら、このように書きます。 まあ、無限ループにはならないことを信じますが、1が出るまでですから、気が遠くなるような先かもしれません。(^^; Sub 百分の一抽選R()   Dim i As Long   Dim j As Long 'Integerにすれば、無限ループは回避されます   Dim Ransuu As Integer   Application.ScreenUpdating = False   Randomize   For i = 1 To 10000     Do       j = j + 1       Ransuu = Int(Rnd() * 100) + 1     Loop While Ransuu <> 1     Cells(i, 1).Value = j     j = 0   Next i   Application.ScreenUpdating = True End Sub

RB25HR34
質問者

お礼

Wendy02様、ありがとうございました。 一様乱数!!!そうだったんですねぇ。 つどつど乱数を出してるのかと思っていました。 あまりに同じ数字が出るのでムキになってRandomizeしてたりしましたが逆効果だったんですね。(^^; とても勉強になりました。ありがとうございました。

その他の回答 (2)

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.2

For r = 1 To 10000 テストのためにto 100にしてました。修正してください。 #1の補足 乱数は初期化するたびに同じ並びになります。randomizeは引数省略するとシステムタイマーになるようですが、同じ引数を与えれば同じ乱数列になるんじゃないかな?システムタイマーといえど有限ですから、同じ引数になることはよくあるでしょうね。未確認ですが。

RB25HR34
質問者

お礼

修正してコピペしました。 ありがとうございます。

  • okg00
  • ベストアンサー率39% (1322/3338)
回答No.1

Sub 百分の一抽選() Dim r, cou, ransuu As Integer Randomize '乱数初期化 For r = 1 To 100 'A1 からA10000まで繰り返す For cou = 1 To 10000 '↑100分の1の確率で当たり(1を当たりとする)が出るまで繰り返す ransuu = Int(Rnd() * 100) + 1 '1から100までの乱数を作成 If ransuu = 1 Then '乱数で1が発生したら当たりとしてセルに記入 Cells(r, 1) = cou Exit For '当たりが出たのでひとつ下のセルでの抽選に移行 End If Next Next End Sub ループのたびにrandomizeで初期化してるから、そのたびに乱数列が初期化されているようです。上記のようにしてみました。

RB25HR34
質問者

お礼

okg00様、ありがとうございます。 明日くらいに解決できればいいなーと思っていたのですが こんなすぐに教えていただけるとは思っていませんでした。 修正したいただいたコードはそのままコピペさせていただきます。 勉強になりました。 ありがとうございます。

関連するQ&A

  • エクセルのマクロについてなのですが…

    現在マクロを使用して数字の入力を行おうとしております。 セルのB2は変数iを入力(例えば5を入力) 値を入力する範囲はセルのCells(1,1)からCells(i,1)(下記あ~お)に 1~iまでの数字を重複する事無く入力します。 なお、セルのCells(1,1)からCells(i,1)に入力する数字は Rndを使用して乱数にしたいのですが 乱数の入力までは何とか辿り着いたのですが どうしても重複してしまいます。 ネットで調べたのですが、コピレば使えるのですが マクロの意味が良く分からないので 出来れば行ごとの意味も教えていただきたいのですが… ワガママばかりで申し訳ありません。 A B C D 1 あ 2 い 5 3 う 4 え 5 お 6 ・ ・ ・

  • VBAでカウンタを作るマクロを教えてください

    行いたいことを記述させていただきます。 1 A1セルにカウント数字を表示させたい。 2 フォームボタンを作成 3 フォームボタンを一回クリックでカウント数字が1上がる 4 初期値と最終値を予め、設定しておく 5 最終値を超えたとき、初期値に戻る(制限なく)  例えば1000から2000までのカウントをおこない、2000を超えないで1000に戻る。 以上のマクロを設定したいのですが、、、、

  • エクセルマクロに詳しい方

    すいません教えて下さい。  例えば、A1のセルに30、A2のセルに5 A3のセルに7 といった感じで数字があるとして どこかの列のある位置 を基準として 例えば C列の先頭から A1のセルにある 数字の分だけ色分けるマクロってどのようになるのでしょうか この場合 C1からC30までが黒 C31~35までは緑 といった具合にしたいのです。 A列に入る数字は必ずしも 一定ではありません。  できましたら、 マクロを簡単に書いて頂けると大変うれしいです。 よろしくお願いします。

  • エクセルマクロ)VBAの書き方について

    初めてのマクロ作成に挑戦しようとしたのですが、さっそく壁に当たってしまい助けていただきたいです。 ■質問 A行に下記の数字が入っているとします。 この時、一番下の1300を元に、一番上の1300のセルをSelectしたいのですが、どのようにしたらよいのでしょうか? 今、試みていたのは、一番下の1300を使って、レンジA:Aを検索してみる方法です。それもできませんでしたが。。。 ※一番下の1300は、ここまでの過程でSelect状態になっています。 ※オフセットでの移動は希望していません。 ※選択中のセル(値)をみて、同じセル(値)が入った同列一番上のセルを選択したいです。 ※選択中のセルが下記の1200であった場合、一つしかないので、それを選択して欲しいです。 1000 1000 1100 1200 1300 1300 1300 1400 すみません、同じ内容の質問を見つける事が出来なかったので質問させていただきました。 よろしくお願いいたします。

  • Excel2007で乱数を利用して

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

  • エクセルのマクロ(VBA)について質問です。

    お世話になります。 エクセルのマクロ(VBA)について質問があります。 下記、わかりにくいと存じますが、お力添え下さい。 ある表があります。 項目としてA列「名前」B列「連絡先」C列「順番」とんでE列に 「乱数」があります。 2行目にこれら項目名が並んでおり、3行目から34行目までは データ入力範囲になります(32名入力出来る。1行目は表のタイトルです) 入力したデータを順不同に並べたく、「順番」項目は乱数を用いた数字を入力させます。 ここから、マクロの登録をします。 ~↓登録中↓~ ・「乱数」項目の1番上(E3)から一番下(E34)までドラッグ  (範囲指定)し、右クリック→コピー ・「順番」項目の一番上(C3)で右クリック→”形式を選択して貼り付け” ”値”にチェックを付けて「OK」 ☆「順番」項目の一番上(C3)から「名前」項目の一番下(A34)まで ドラッグ(範囲指定)し、”昇順で並べ替え”ボタンを押す ~ここまで~ (乱数は、毎回変化してしまうのを防ぐ為、別項目から引っ張ってきて 値だけをコピーするようにしています) このようにマクロを登録しました。 しかし、毎回32名を入力するわけではなく、時には32名未満の入力をする場合があります。 別のセルF40に、COUNTA関数より取った「名前」項目に登録されている数を表示させているのですが、 ☆部分の処理にてこの数だけ範囲指定して並べ替えたいのです。 (セルC3から登録されている人数分だけ範囲指定したい、ということです。20名だけ登録されていれば、 セルC3からセルA22を範囲指定する。指定した部分だけを並べ替える) 32名未満の時、乱数に元づく順番で並べ替える際、データの入って いない行も順番に並んでしまうのですが、空白の行はそのままにし、 データの入っている行だけを上(セルA3)から詰めて並べたいのです。 VBAの編集で、COUNTA関数の結果の数字を変数に代入して使用したいのですが、 そのやり方がわかりません。 どなたかお知恵をくださいますよう、お願い致します。 (わかりにくい記述なので、必要に応じて補足させて頂きます。)

  • VBA マクロの作り方で迷ってます

    EXCEL2000でVBAマクロ作成しています。 10枚のシートを作成するについて 同じ結果がでる次の方法で迷っています。 10枚は10人の個人別データが入っています。 10枚のデータは前回入力したデータのうち 変化のないものはそのまま使用します。 1)最初の一枚目のシートのセルに公式を埋め込みます。 2枚目以降のシートにも順次公式を埋め込んで行きます。少し面倒ですが、各シートを表示したとき即座に値が表示され肩が懲りません。(手入力もしくはマクロでつくる) 2)最初の一枚のシートにマクロで部品化したサブルーチンをつくり2枚目以降はCallステートメントで呼び出すマクロを作る。 上の2つの方法は結果が同じだと思いますが、処理速度や容量の点でどちらでつくるべきか迷ってます。教えてください。 違うカテゴリで質問してしまいました。すいません。

  • VBAでマクロを走らせた日時をSheet2のAセルに入力する

    VBAでマクロを走らせた日時をSheet2のAセルに入力する はじめまして。 現在、ファイルを整理するマクロを使っています。 そのマクロを使った履歴を残す意味で、 いつマクロを走らせたかすぐにわかるように、 Sheet2のAのセル(2行目から)に走らせた日時を示したいと思っています。 マクロでの処理が終わったら、 毎回Sheet2に日時が入力されるようにするには、 どんな命令文を追記したらよいのでしょうか。 マクロに関しては知識がなく、 インターネットで調べて、 Sheets("Sheet2").Cells(R, "A").Value = Now というのを追記してみたのですが、 Sheet2に入力はされるものの、 Aセルの行がとびとびに入力されたり、 整理したファイルの数だけ(複数)入力されてしまいます。 マクロを1回走らせたら1つの日時が入力されるようにしたいです。 Sub ()とEnd Subの間にFor RとNext Rがあり、 作業が繰り返されているようです。 転記ができないため、マクロを示すことができません。 さすがに、これだけの情報では難しいでしょうか。 わかるかたがいらっしゃいましたら、 よろしくおねがいします。

  • マクロの組み方について

    エクセル97で、マクロを組みたいと思い 質問します 教えて下さい。 現在、マクロを組んでいます。 仮に「印刷A」と云うマクロがあります。 シート1の「A1」のセルに「1」であれば「印刷A」を実行し シート1の「A1」のセルに「1」以外の数字になれば、印刷しない と云うマクロは、どのようにすればいいのでしょうか?? お願いします。

  • 【エクセル】マクロ

    すみません。 エクセルのマクロのプログラム教えてください。 セルA1~A30に 「1」~「5」のいずれかの数字が 入っています。 そのA列の数字をもとにB1~B30のセルの書式を 変えたいと思っています。 例えば、「1」なら赤色、「2」なら青色、「3」なら緑色・・・ となるように考えています。 for文で1~30まで繰り返し、if文とswitch文で実行すると 思うのですが、どのようなプログラムを書けばいいですか? よろしくお願いします。 3種類なら条件式書式が使えるのですが、4種類以上だと使えないので マクロで実行しようと思っています。

専門家に質問してみよう