初心者です。
ビンゴゲームをつくりたいと思っています。
EXCELのVBAでつくりたいと思っていますが,最初の取りかかりで早くも困っています。
ボタンをクリックするごとに,数字が出てくるようにしたいのですが,その良い方法が思い当たりません。
「1~100までの数字をランダムに出したい。但し,一度出た数字は二度と出ないようにしたい。」
私の知恵では,EXCELのVBAだから,EXCELのシートで乱数を入れて,ソートをするか,又は大量のIF文を使うくらいしか思いつかないのいです。
良い方法があればどなたか教えてください。
よろしくお願いいたします。
No.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のヘルプをご覧下さい。
ありがとうございます。
大変参考になります。
やっぱり,OKwebは,いいですね。
どの方の解答も勉強になります。
1つの質問に,いくつもの方法をいろいろな方から
教えていただき,大変嬉しいです。
でも,ベストアンサーは,1つなんですね。
ありがとうございました。
No.4
- 回答日時:
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
No.3
- 回答日時:
ん~? 誰かが書いたマクロを読む方が簡単なのですか?
#できるだけ簡単に:
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ページをたよりにして理解のための努力をします。
だいぶ分かってきました。
No.2
- 回答日時:
こんばんは!
一例です。
とりあえず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の方からのアドバイスを参考にして
シートで作成します。あまりにも難しそうなので。
No.1
- 回答日時:
ちょこっと探してみると,既に親切な人が作ってくれたのをゲットできます。
http://pc.nikkeibp.co.jp/article/NPC/20070118/25 …
#余談ですがご参考まで
>1~100までの数字をランダムに出したい
実際のビンゴカードは,そういう風にはなっていません。
各列にだいたい幾つから幾つまでと範囲が決まっていて,出た目を探しやすく作ってあります。
ありがとうございます。
初心者にとっては,このEXCEL自体を理解するのに
少々手こずっています。
カードを作る作業も大変なんですね。
安易に取りかかると,苦しいです。
でも,いい機会だと思って頑張ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Excel(エクセル) ExcelのFSO(ファイルシステムオブジェクト)について学びたいのですが。。。 5 2022/12/15 18:06
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Excel(エクセル) Excelシートのある番地の文字が一致したすべての行を別シートに転記する方法 11 2022/10/25 08:43
- Excel(エクセル) AVERAGE関数とINDIRECT関数を使ってのオートフィル 3 2023/01/12 12:00
- Excel(エクセル) ランダムで四択の問題を作る場合にvbaで何を学べばいいでしょうか。 1 2022/04/14 16:45
- Excel(エクセル) 重複したデータ(空白は除く)のVBA表記について 4 2022/08/15 07:28
- Excel(エクセル) エクセルの数式で教えてください。 1 2022/07/08 13:46
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Excel(エクセル) Excelの関数についておしえてください。 3 2023/04/20 18:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【スプレドシート】IMPORTRANGE...
-
MicrosoftOfficeの1ユーザー2...
-
MicrosoftOffice2019なんですが、
-
Excel 日付を比較したら、同じ...
-
Microsoft365の「お支払いを更...
-
ウィンドウィズ メモ帳で日付だ...
-
Excelで空白以外の値がある列の...
-
エクセルのシフト表を簡単にGoo...
-
理由を教えてください。
-
VBA
-
web上にあるエクセルをショート...
-
バソコンが二台とも壊れ後換装...
-
【マクロ】文字を1文字づつ、...
-
Excelのセルの重複チェックが出...
-
マイクロソフト 一時使用コード...
-
office365って抵抗感ないですか?
-
Outlook 電源OFFの受診の仕方
-
エクセルで例えば、A1に㈱ベ...
-
自分の専門分野の仕事。初見で...
-
excelの画面のグリッド線の消滅。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【スプレドシート】IMPORTRANGE...
-
【スプレッドシート】指定の日...
-
英数字のみ全角から半角に変換
-
会社PCのメールが更新されない
-
マイクロソフト 一時使用コード...
-
Office 2021 Professional Plus...
-
エクセルで例えば、関数を使っ...
-
Microsoft Formsの「個人情報や...
-
1つのPCに「Excel 2010」「Exc...
-
エクセルで例えば、A1に㈱ベ...
-
理由を教えてください。
-
エクセルでXLOOKUP関数...
-
マイクロソフト オフィスについて
-
VLOOKUP関数について
-
teams設定教えて下さい。 ①ビデ...
-
Googleのスプレッドシートでシ...
-
【Excel VBA】PDFを作成して,...
-
Microsoft365で写真をアルバム...
-
Outlook で宛先が複数の場合の人数
-
Excel テーブル内の空白行の削除
おすすめ情報