- ベストアンサー
VBAで,ビンゴゲームの数字の生成方法
初心者です。 ビンゴゲームをつくりたいと思っています。 EXCELのVBAでつくりたいと思っていますが,最初の取りかかりで早くも困っています。 ボタンをクリックするごとに,数字が出てくるようにしたいのですが,その良い方法が思い当たりません。 「1~100までの数字をランダムに出したい。但し,一度出た数字は二度と出ないようにしたい。」 私の知恵では,EXCELのVBAだから,EXCELのシートで乱数を入れて,ソートをするか,又は大量のIF文を使うくらいしか思いつかないのいです。 良い方法があればどなたか教えてください。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
作業用のワークシートを用いない方法の一例です。xl2000用のコードですが、ご参考まで。 なお、実用上は問題ないと思いますが、試験の際に、ボタンのクリック間隔が短いと追従できない事がある様です。 ユーザーフォームにラベル1個と、コマンドボタン1個を置きます。 ☆標準モジュール Sub test() 'Application.Visible = False 'Excelを隠す UserForm1.Show 'Application.Visible = True End Sub ☆Userform1モジュール Dim numCollection As Collection Const maxNum As Long = 75 Private Sub CommandButton1_Click() Dim num As Long If numCollection.Count = 0 Then Me.Label1.Caption = "終了" Exit Sub End If num = Int(Rnd() * numCollection.Count) + 1 Me.Label1.Caption = numCollection.Item(num) numCollection.Remove (num) End Sub Private Sub UserForm_Initialize() Dim i As Long Me.Label1.Caption = "BINGO" Set numCollection = New Collection Randomize Time For i = 1 To maxNum numCollection.Add Item:=CStr(i) Next i End Sub collectionオブジェクトについては、Web検索しても上位に詳しい記事がヒットしないので、VBAのヘルプをご覧下さい。
その他の回答 (4)
- tom04
- ベストアンサー率49% (2537/5117)
No.2です! >できることならVBAコードではいい方法ないでしょうか? 「読みあげる方の数字」を。 とありましたので・・・ 一例です。 ↓の画像のように別Sheetに表を作成し、コントロールツールボックスからコマンドボタンを一つ挿入し、 コマンドボタンをクリックするとA1セルにランダムに数字を表示するようにしてみました。 (とりあえず1~60までの数値としています) C1セルに =RAND() D1セルに =RANK(C1,$C$1:$C$60) としてC1・D1セルを範囲指定し、D1セルのフィルハンドルで60行目までオートフィルでコピー! 挿入したコマンドボタンをダブルクリック → VBE画面が出ますので、↓のコードをコピー&ペーストして コマンドボタンをクリックしてみてください。 (クリックする直前のD1セルの値が表示されます。) Private Sub CommandButton1_Click() Range("A1") = Range("D1") 'コマンドボタンをダブルクリック後、この行のみ入力! End Sub 上記の3行だけでOKなのですが、ダブルクリックすると1・3行目が表示されると思いますので、 実質2行目だけのコピー&ペーストでOKのはずです。 尚、余計なお世話かもしれませんが前回の方法でビンゴカードを作成した場合、当たりが出る回数が極端に少ないと思います。 実際のビンゴはもっと確立を上げているみたいです。 そこで、↓のURLを参考にしてみてはどうでしょうか? http://vba.hmpage.jp/bingo.htm 参考になれば良いのですが。m(__)m
お礼
何度もありがとうございます。 大変参考になります。 いろいろと勉強になり, 大変ありがたく思っています。
- keithin
- ベストアンサー率66% (5278/7941)
ん~? 誰かが書いたマクロを読む方が簡単なのですか? #できるだけ簡単に: Sub macro1() Dim i Worksheets("Sheet1").Select Application.ScreenUpdating = False With Range("A11:E25") .Formula = "=ROW(A1)+(COLUMN(A1)-1)*15" .Value = .Value End With Range("F11:F25").Formula = "=RAND()" For i = 1 To 5 Range(Cells(11, i), Range("F25")).Sort key1:=Range("F11"), header:=xlNo Next i Range("A1:E5").Value = Range("A11:E15").Value Range("C3").Value = "FREE" Range("A11:F25").ClearContents Range("A1:E5").HorizontalAlignment = xlCenter Application.ScreenUpdating = True End Sub Sub macro2() Worksheets("Sheet2").Select Range("A1:A15") = "B" Range("A16:A30") = "I" Range("A31:A45") = "N" Range("A46:A60") = "G" Range("A61:A75") = "O" Range("B1") = 1 Range("B2") = 2 Range("B1:B2").AutoFill Range("B1:B75") Range("C1:C75").Formula = "=RAND()" Range("A1:C75").Sort key1:=Range("C1"), header:=xlNo Range("C1:C75").ClearContents Range("A:B").HorizontalAlignment = xlCenter End Sub
お礼
ありがとうございます。 大変参考になります。 私にとっては,EXCELの関数も初心者なので,これから貴殿から教授いただいた数式を書籍といろいろなWEbページをたよりにして理解のための努力をします。 だいぶ分かってきました。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 一例です。 とりあえず1~60までの数値を5マス×5マスに表示するとしています。 ↓の画像でG1セルに =RAND() H1セルに =RANK(G1,$G$1:$G$60) I1セルに =ROW() として、G1~I1セルを範囲指定し、I1セルのフィルハンドルで60行目までオートフィルでコピー! (表示させたい最大数値行までコピー) そして、A1セルに =INDEX($I$1:$I$60,MATCH(SMALL($H$1:$H$60,ROW(A1)+(COLUMN(A1)-1)*5),$H$1:$H$60,0)) という数式を入れ、列方向と行方向にオートフィルでコピーすると 画像のような感じになります。 F9キーを押すたびに数値配列が変わってくると思います。 他に良い方法があればごめんなさいね。m(__)m
お礼
ありがとうございます。 大変参考になります。 十分に良い方法だと思います。 私にとっては,EXCELの関数も初心者なので,これから貴殿から教授いただいた数式を書籍といろいろなWEbページをたよりにして理解のための努力をします。 できることならVBAコードではいい方法ないでしょうか? 「読みあげる方の数字」を。 カードをVBAで記述することは,あきらめます。 貴殿や#1の方からのアドバイスを参考にして シートで作成します。あまりにも難しそうなので。
- keithin
- ベストアンサー率66% (5278/7941)
ちょこっと探してみると,既に親切な人が作ってくれたのをゲットできます。 http://pc.nikkeibp.co.jp/article/NPC/20070118/259055/ #余談ですがご参考まで >1~100までの数字をランダムに出したい 実際のビンゴカードは,そういう風にはなっていません。 各列にだいたい幾つから幾つまでと範囲が決まっていて,出た目を探しやすく作ってあります。
お礼
ありがとうございます。 初心者にとっては,このEXCEL自体を理解するのに 少々手こずっています。 カードを作る作業も大変なんですね。 安易に取りかかると,苦しいです。 でも,いい機会だと思って頑張ります。
お礼
ありがとうございます。 大変参考になります。 やっぱり,OKwebは,いいですね。 どの方の解答も勉強になります。 1つの質問に,いくつもの方法をいろいろな方から 教えていただき,大変嬉しいです。 でも,ベストアンサーは,1つなんですね。 ありがとうございました。