- ベストアンサー
Excel2007で乱数を利用して
乱数を利用して抜き出したいです 0~9の数字記号がありまして、その内のいずれかがセルA~AJの各セルに入ってます。 セルA~AJは1~36番目と言うことなんで数字1~36を乱数で被ることなく6個をとり その6個を利用してセルA~AJの数字記号を抜き出してセルQ6~V6に表したいです。 マクロボタンを押す度に別の乱数でまた抜き出しては次のQ7~V7へと、違う乱数を使っては下へ下へと表示したいです。 よろしくお願いいたします。
- みんなの回答 (18)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず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
その他の回答 (17)
- kkkkkm
- ベストアンサー率66% (1725/2595)
一度テスト用のブックを作成して 2行目に A2からAJ2までを 11から46までの連番(数値)にして試してみてください。 乱数が表示されたセルの値に10を足したものが表示されたら正解です。
お礼
こんにちはkkkkkmさん。 試したんですが昨日と変わりがありませんでした。 乱数でV6に9が表示されてまして、R7に19が表示されてます。 今はQ6~V6に乱数で31,5,33,13,1,9と表示されてます。前の様子と変わらず、V6が"9"なんで、R6"5"の下にR7に"19"と表示されてます。う~ん、難しい域なんですかねやっぱり。
補足
kkkkkmさん!!!!!すみません!!! 私の大失敗です。Σ(T▽T;) ソースの最後辺りのoffset(0,i)のところを(0,1)にしてしまってました。 本当にすみません。 そして治して試したところ滅茶苦茶希望通りにスッキリ作動してくれました。 ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1725/2595)
>> 抜き出されている数値は確かに0から9の一桁なのでしょうか。 > はい、0~9の数字だけです。 桁についても確認していますよ。7桁でセル幅広げたら表示されたということでいいですね。 > 2回目を試したのですが、下に下にコピペされることもなかったです。 Q列にデータがなければ7行目に記載し続けます。A2~AJ2に必ずデータが入っていればそのような事にはならないと思いますが。
お礼
>>桁についても確認していますよ。7桁でセル幅広げたら表示されたということでいいですね。 7桁入るセルに一桁の数字が入ってる状態なんでセル幅に問題はなさそうなんですが。
- kkkkkm
- ベストアンサー率66% (1725/2595)
ここって回答したら削除も訂正もできないから不便で…。 追加です。 とりあえずQからVのセル幅を広げてみてください。
お礼
しっかり7桁入ります。(^_^)
補足
もうkkkkkmさんのソースが完成しそうなんでドキドキしてます。待ち遠しいです。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> マクロが作動中に、R7に抜き出してる数値が5回表示されては消えて最後の6回目の数値が表示される 面白い動作ですね。 R7からU7まで何か表示されてV7に数値が表示された途端にR7からU7までが消えるということだと思いますが。 抜き出されている数値は確かに0から9の一桁なのでしょうか。 セル幅を超えるデータが入っているという事はないですか。 " 9" みたいな感じで。 一度テスト用のブックを作成して 2行目に A2からAJ2までを 11から16までの連番(数値)にして試してみてください。 乱数が表示されたセルの値に10を足したものが表示されたら正解です。
お礼
いつもご返答ありがとうございます。 >抜き出されている数値は確かに0から9の一桁なのでしょうか。 はい、0~9の数字だけです。 2回目を試したのですが、下に下にコピペされることもなかったです。
- kkkkkm
- ベストアンサー率66% (1725/2595)
なお、以前から言っていますが 設問の状態だと たとえば 36個のうち6個の当たりがあるくじを、なるべく公平になるように10人に配って乱数であたりを決めたとしても不公平(4枚もらえるのが6人で3枚もらえるのが4人なので)な状態だと思います。そういうのが関係ないデータでしたらいいのですが。
お礼
助かりました。本当にありがとうございました。
- bunjii
- ベストアンサー率43% (3589/8249)
>("6"、"2"、"2"、"0"、"3"、"7") >("1"、"1"、"8"、"2"、"2"、"5") >見たいに表示する形になると思われます。 それで良いのでしたらRANDBETWEEN関数で直接配置可能です。 D6セルへ次の数式を設定してI6までオートフィルコピーします。 =TEXT(RANDBETWEEN(0,9),"0") 文字列の場合 =RANDBETWEEN(0,9) 数値で良い場合 D6:I6を選択してコピーでクリップボードへ記憶させてD7を選択し値の貼り付けます。(D6:I6の値は再計算されます) 次にD8を選択して値の貼り付けをします。 以下、D9、D10、D11、・・・・・と順次貼り付ければ良いでしょう。
お礼
何処かに水平型で6個のセル範囲にrandbetweenで1~36の内の6個を並べて重複すればやり直して、重複しなければそれらを利用して(AA2:AJ2)から値を取り出すことは出来ないのでしょうか? (AA2:AJ2)から絶対に抜き出して、どうなって行くのかが見たいです。 Excel2007で出来ないもんなんでしょうか?Excelの限度なんか全く知らずに質問してばかりですみません。
- kkkkkm
- ベストアンサー率66% (1725/2595)
No10の訂正 Q5からV5までとりあえず乱数で出たものとして手入力します 以下に訂正 Q9からV9までとりあえず乱数で出たものとして手入力します
お礼
ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> ランダムに選択する以上運任せみたいな感じです。 そうですね。皆さんが回答しても、あなたがその内容を理解しない限り、その結果が正しいのかどうか判断しようがないということですね。 乱数を可視化するとどうでしょう。 あまり飛ぶと確認するのが面倒なので結果がでるQ6~V6の近くにデータを仮に入れてみます。 Q5からV5までとりあえず乱数で出たものとして手入力します。(実際に乱数で入れるとやたら飛んで確認しにくくなるので) Q9に22 R9に15 S9に21 T9に17 U9に24 V9に12 上記で乱数で得たとして仮に入力した数値はそれぞれ上から V列 O列 U列 Q列 X列 L列 を指します。(A列から数えた場合) Q6に =INDEX($A$2:$AJ$2,1,Q9) としてV6までコピーします。 Q6にV2 R6にO2 S6にU2 T6にQ2 U6にX2 V6にL2 の値が表示されます。 で、実際に上記を実行した結果があなたの考えている結果と一致するかどうかですね。
お礼
おはようございます。今読みました。この形であってるんですが、手入力した乱数のところはrand関数を使えば重複しそうなんですが、しないようにするにはどの様な方法がとられる必要がらありますか?
- bunjii
- ベストアンサー率43% (3589/8249)
>ご理解されにくい内容なため再度説明させてください。 何回説明されてもあなたが求める結果がどのようになることを望んでいるか読み取れませんのでA2~AJ2のサンプルデータとD6~I6の抽出データのサンプルを提示してください。 >(A2:AJ2)に0~9の数字が入ってます(もちろん数字は重複してます。) >(A2:AJ2)から被ることなくランダムに選択して6個だけ取り出したいです。 0~9の数字をランダムに36個並べ、そこから6個の数字をランダムに取り出しても重複する数字になる可能性があります。 >(1回のマクロ作業でA2を2回、M2を3回とかは無しでお願いします。) 回答No.4はマクロ(VBA等)ではなくExcelの組み込み関数で処理するものですから値のコピーを実行する毎に自動再計算でコピー元の値が変化します。 考え方としては0~9までの10個の数字から6個をランダムに取り出す方法に比べて0~9までの36個の数字から6個をランダムに取り出す方が同じ数字の再現率が高くなります。 一般的には抽出結果が重複しない方法を採用するのではないでしょうか?
お礼
おはようございます。ご返答ありがとうございます。 Excelでは可能ではなさそうなんでしょうか?乱って重複しますもんね。 (A2:AJ2)から取り出すときに重複することがなく(一回のマクロ作業でD2を3回、P2を2回と選択することなく)取り出し、 (D6:I6)以降に取り出した数字を表示していくことが希望の形です。 ("6"、"2"、"2"、"0"、"3"、"7") ("1"、"1"、"8"、"2"、"2"、"5") 見たいに表示する形になると思われます。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> (A2:AJ2)に0~9の数字が入ってます(もちろん数字は重複してます。) > (A2:AJ2)から被ることなくランダムに選択して6個だけ取り出したいです 0~9の36個のランダムな数値の並びから6個無作為に取り出すとした場合は、4種類の数値は他の6種類の数値より1個少なく配置されていると思いますので、その分偏りますよね。 という結果になるんじゃないですかという事です。(実行するまでもなくわかることとして) で、思考がどう働くのかを確認してみてください。
お礼
うーん(^-^; おそらく推察されてることとは違うことを私はしてます。が、違うとまでは言いきれません。ランダムに選択する以上運任せみたいな感じです。 あのときのご協力ありがとうございます。 あなたもですし、皆さん本当に凄い。何かを作りたいと思わない以上パソコンに触れる機会さえなかったし未だにパソコンにインターネットも 繋げてなくて本当に初心者で助けて頂いて 有り難く思います。いつも気をかけて頂いてありがとうございます。
- 1
- 2
お礼
いつもご返答ありがとうございます。(Q6:V6)に重複することなく1~36の乱数を表示することに成功しましたが、 それらを利用しての(Q7:V7)への抜き出しコピペは失敗してまして、マクロが作動中に、R7に抜き出してる数値が5回表示されては消えて最後の6回目の数値が表示されるという結果になりました。何処を治せばよろしいでしょうか?