コピペで作れるExcelVBAのビンゴゲーム

年末に必要になったので作りました。せっかくなのでシェアします。システムだけです。ビンゴカードは別途ご用意ください(100均などで購入できます)。
こんなかんじ
「抽選」ボタンを押すと1~75までの番号をランダムに取得し、左上の大きなセルに表示します。そのとき、お好きなmp3ファイルを再生できます。「ジャン!」みたいな音を出すとそれっぽいです。「抽選」ボタンを押すごとに右側に格納されていきます。
75個の数字が出揃うと以下のような形で、「リセット」ボタンを押すと表示が消え、初期状態に戻ります。
シートの準備
「メイン」「設定」の2つのシートが必要です。「設定」シートは、挿入して名前だけ変えればOKです。(「設定」シートは、A列に1~75までの番号がセットされて、番号を抽選する用に使います。)
「メイン」シートには、以下のものを作ります。セルの位置は好きなように変えていただけますが、変えた場合はコードのほうも一緒に変えてください。色や罫線、文字の大きさはマクロで変更しませんので、手動でお好みの形へ設定してください。
- 表示セル … A2:A6 の結合セル
- 格納セル … C2セルを起点(左上)にした 9×9セル の範囲
コード
標準モジュールを作って、以下をコピペしてください。「抽選」ボタンへ「start」プロシージャを、「リセット」ボタンへ「reset」プロシージャを割り当てます。ボタンの作成とプロシージャ割り当てはこちらの記事もご覧ください。
上部のハイライト部分で、シート名やセルの範囲を作成したものへ合わせてください。mp3ファイルは、フルパス内に空白が含まれないように注意してください。
'==========================================
'メインシート
Const MAIN_NAME As String = "メイン" 'メインシート名
Const SHOW_CELL As String = "A2:A6" '表示セル
Const STOCK_CELL As String = "C2" '格納セルの起点(左上セル)
'設定シート
Const SETTING_NAME As String = "設定" '設定シート名
'効果音
Const MP3_PATH As String = "C:\bingoSE.mp3" 'MP3ファイルのフルパス
'==========================================
Option Explicit
Option Base 1
'音を再生するための設定
#If Win64 Then
Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) _
As Long
#Else
Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) _
As Long
#End If
Sub start() '抽選ボタンへ割付
Dim st_main As Worksheet: Set st_main = Sheets(MAIN_NAME) 'メインシート
Dim showCell As Range: Set showCell = st_main.Range(SHOW_CELL) '表示セル
Dim stockCell As Range: Set stockCell = st_main.Range(STOCK_CELL) '格納セル
Dim st_setting As Worksheet: Set st_setting = Sheets(SETTING_NAME) '設定シート
'番号確認
If st_setting.Range("A1").Value = "" Then
If MsgBox("抽選番号がありません。リセットしますか?", vbOKCancel, "確認") = vbOK Then
Call reset 'リセット
End If
Exit Sub
End If
'表示セルから格納セルへ転記
Dim row As Long, col As Long
If showCell.Cells(1, 1).Value <> "" Then '表示セルが空じゃなかったら
'最終行を取得
For row = 8 To 0 Step -1
If stockCell.Offset(row, 8).Value <> "" Then Exit For
Next row
row = row + 1
'最終列を取得
For col = 8 To 0 Step -1
If stockCell.Offset(row, col).Value <> "" Then Exit For
Next col
col = col + 1
stockCell.Offset(row, col).Value = showCell.Cells(1, 1).Value '表示セルから格納セルへ転記
showCell.ClearContents '表示セルクリア
End If
'抽選
Dim lastRow As Long: lastRow = st_setting.Cells(Rows.Count, 1).End(xlUp).row '設定シートでデータが存在する行番号の最後を取得
Randomize '乱数取得
Dim i As Long: i = Int(lastRow * Rnd) + 1 '行番号をランダムに取得
Call mciSendString("play " & MP3_PATH, "", 0, 0) '音を再生
showCell.Cells(1, 1).Value = st_setting.Cells(i, 1).Value '表示セルへ抽選番号を転記
st_setting.Cells(i, 1).Delete Shift:=xlUp '抽選番号を削除
End Sub
Sub reset() 'リセットボタンへ割付
Dim st_main As Worksheet: Set st_main = Sheets(MAIN_NAME) 'メインシート
Dim showCell As Range: Set showCell = st_main.Range(SHOW_CELL) '表示セル
Dim stockCell As Range: Set stockCell = st_main.Range(STOCK_CELL) '格納セル
Dim st_setting As Worksheet: Set st_setting = Sheets(SETTING_NAME) '設定シート
st_setting.Columns("A").ClearContents '抽選番号クリア
'1~75まで入力
Dim i As Long
For i = 1 To 75
st_setting.Cells(i, 1) = i
Next i
showCell.ClearContents '表示セルクリア
Range(stockCell, stockCell.Offset(8, 8)).ClearContents '格納セルクリア
End Sub
ひとこと
忘年会の幹事になって、理想のものを探すより作ったほうが早いなと思ってやった次第です。Office入りWinノートPCを会場に持って行ってプロジェクタに映すのが前提だったのでExcelでよくないかな~と思って。
1~75の番号自体をランダムに取得すると、既出の数字と突き合わせるのが面倒だったので、「設定」シートの「行数」として存在する数字内をランダム取得して、その1列目に入っている数字を持ってくる、という方法をとっています。
短いコードですので、ご入用の方はお好きに読み解いてカスタマイズしてみてください!
ExcelVBAに興味をお持ちの方は、こちらの記事もどうぞ!
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。






コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。