タイマーイベントとRnd関数を使ってAccessでスロットを作って遊んでみる

今回はちょっと趣向を変えてAccessでスロットを作ってみようと思います。
仕事では全く使えない、こんなの作ってどうするの?といったプログラムですが・・・、たまにはこんなものも良いかな?と言う事で笑ってお許しくださいね!
Accessでスロット画面を作ってみましょう!
仕様的には以下の動作で作成したいと思います。
- スタートボタンをクリックするとスロットが回る
- スタートボタンからストップボタンに表示が変わる
- ストップボタンをクリックするまでスロットは回ったまま
- ストップボタンをクリックすると1マス毎に数字が表示される
本来はドラムがクルクル回るように作りたいのですが、今回は手を抜いてデジタル的にカタカタ動いて数字が表示されるようにしたいと思います。
あ、ちなみに上の画像は実際777が揃うまで頑張ってみました・・・。
まずはフォームを作成しましょう。
フォーム上にテキストボックスで数字を表示する枠[txbNo1],[txbNo2],[txbNo3]を作成します。また、スタート[cmdStart]、ストップ[cmdStop]用のコマンドボタンを配置します。
ちなみにスタート・ストップボタンはクリックする毎に切り替わるようにする為、同じ位置に配置しましたので以下のサンプル画像では見えませんのでご了承ください。
尚、イベントのタイマー間隔は0のままにしておきましょう。
VBAコードを作成する
■フォームを[開くとき]のイベントを作成
まずはフォームを[開く時]のイベントに以下のコードを作成し、あわせてPublic Sub Clear()も作成します。
Option Compare Database
Dim cnt As Integer
Dim Start_Boton
Private Sub Form_Open(Cancel As Integer)
'タイマーを無効にする
    Me.TimerInterval = 0
'スタートボタンを表示する
    Me!cmdStart.Visible = True
'スタートボタンにフォーカスをセットする
    Me!cmdStart.SetFocus
'ストップボタンを非表示にする
    Me!cmdStop.Visible = False
'スロットの数字をクリア
    Call Clear
End Sub
'********* クリア ***********
Public Sub Clear()
    Me!txbNo1 = Null
    Me!txbNo2 = Null
    Me!txbNo3 = Null
End Sub
■スタートボタンのイベントを作成
次にスタート用のコマンドボタン[cmdStart]の[クリック時]のイベントに以下のコードを作成します。
'******スロットを回転******
Private Sub cmdStart_Click()
'一旦スロットをクリアする
    Call Clear
'カウンターをリセット
    cnt = 0
    Beep
'タイマー間隔をセット
    Me.TimerInterval = 10
'ボタンを非表示にした場合にエラーになるのを防ぐため
'一旦ダミーテキストボックスにフォーカスを移動
    Me.txbフォーカス退避.SetFocus
'ストップボタンを表示
    Me.cmdStop.Visible = True
'ストップボタンを利用可にする
    Me.cmdStop.Enabled = True
'スタートボタンを非表示
    Me.cmdStart.Visible = False
'スタート処理フラグをセット
    Start_Boton = 1
'スロット処理呼び出し
    Call Form_Timer
End Sub
■ストップボタンのイベントを作成
ストップ用のコマンドボタン[cmdStart]の[クリック時]のイベントには以下のコードを作成します。
'******スロットを停止******
Private Sub cmdStop_Click()
'カウンターをリセット
    cnt = 0
    Beep
'タイマー間隔をセット
    Me.TimerInterval = 10
'ストップボタンを利用不可にする
    Me.cmdStop.Enabled = False
'ストップ処理フラグをセット
    Start_Boton = 0
'スロット処理呼び出し
    Call Form_Timer
End Sub
■スロットの処理をタイマー時のイベントで作成
尚、スロット処理で呼び出すコードは[タイマー時]のイベント プロシージャで以下の通りです。
Private Sub Form_Timer()
'********* タイマーモジュール ***********
'スロット回転スタートした処理 ⇒ ランダム数値を0.01秒毎に表示
    If Start_Boton = 1 Then
        Me!txbNo1 = Int((9 - 0 + 1) * Rnd() + 0)
        Me!txbNo2 = Int((9 - 0 + 1) * Rnd() + 0)
        Me!txbNo3 = Int((9 - 0 + 1) * Rnd() + 0)
    End If
'以下はスロットストップ処理 ⇒ 1桁づつランダム数値をストップする
    If Start_Boton = 0 Then
        cnt = cnt + 1
        Select Case cnt
        Case 0 To 49        '←全てのマスが回転する
            Me.TimerInterval = 10 + cnt
            Me!txbNo1 = Int((9 - 0 + 1) * Rnd() + 0)
            Me!txbNo2 = Int((9 - 0 + 1) * Rnd() + 0)
            Me!txbNo3 = Int((9 - 0 + 1) * Rnd() + 0)
        Case 50 To 99       '←0.5秒後に1マス決定する
            Me.TimerInterval = cnt - 40
            Me!txbNo2 = Int((9 - 0 + 1) * Rnd() + 0)
            Me!txbNo3 = Int((9 - 0 + 1) * Rnd() + 0)
        Case 100 To 149     '←0.5秒後に2マス目を決定する
            Me.TimerInterval = cnt - 90
            Me!txbNo3 = Int((9 - 0 + 1) * Rnd() + 0)
        Case 150            '←0.5秒後に全てのマスを決定する
            'スタートボタンを表示する
            Me.cmdStart.Visible = True
            'スタートボタンにフォーカスをセット
            Me.cmdStart.SetFocus
            'ストップボタンを非表示にする
            Me.cmdStop.Visible = False
            'タイマーイベントを無効にする
            Me.TimerInterval = 0
        End Select
    End If
End Sub
スロット処理VBAコードのポイントを解説
スロット処理のVBAコードを簡単に解説いたします。
まず、スタートボタンから呼びたしたのかどうかで処理を分岐させます。スロット処理用のコード4行目と11行目でStart_Botonの値を確認しています。
スタートボタンからForm_Timer()を呼び出した場合はテキストボックスの値を0.01秒毎ランダムに変えています。
ちなみにランダムに数字を表示する為には以下の用法で対応します。
Int((範囲の最大値 – 範囲の最小値 + 1) * Rnd() + 範囲の最小値)
※以下は0から9までの数字をランダムに表示する場合
Me!txbNo1 = Int((9 – 0 + 1) * Rnd() + 0)
無論、この状態ではタイマー処理が動いているので、ずっとそのまま数字がカタカタ動いています。
そしてストップボタンがクリックされるとスロット処理用のコード11行目移行が実行されます。
ここでは0.5秒ごとに1マスずつランダムに表示するのをやめています。
そして最後の3つ目のマスが表示されたところでタイマー間隔を0にしてタイマーイベントを無効[Me.TimerInterval = 0]にしています。
処理の途中でもタイマー間隔を徐々に増やしていますが、あまり意味はありませんが徐々にランダム表示の間隔を長くしてスローに動かしているだけです。
と言ったところで簡単ながらスロット処理の解説は以上とさせて頂きます。
詳しくは以下のサンプルをダウンロードして動作とソースをご確認ください。
以上、今回はAccessでスロットプログラムを作ってみるVBAでした。
今回のサンプルファイルは以下のリンクからダウンロード可能です。




