dポイントプレゼントキャンペーン実施中!

 VBAでゲームを作ろうとしています。まず、手始めに簡単なスロットを作っています。スロットを回転させて止めるまではできたのですがメッセージを出す段階でメッセージが2回、0とiの値が出ます。次のコードなのですが、なぜできないのか、どうすればできるようになるのか教えてください。よろしくお願いします。

Sub SlotLoop_1()
Dim i As Long
Static Flg As Boolean

Flg = Not Flg 'ボタンを使えるようにする

With [a1] 'A1を選ぶ
Do
If Flg = False Then Exit Do
i = (i + 1) Mod 10 '(i+1)を10で割った余り。
.Value = i
DoEvents
Loop
End With

MsgBox i 'ここが問題

End Sub

A 回答 (1件)

 これって、あるボタンを押したらFlgがTrueになって、スロットがぐるぐる回る。

もう一度同じボタンを押したらFlgがFalseになって、スロットが止まってメッセージを出す、という事でしょう?

 これではちょっと無理やね。フラグの状態によって分岐させんと。

> なぜできないのか
 まず、1個目のButton_Click()がFlgをTrueに変えてループし、ループの途中で他のメッセージを処理します。
 ここで同じボタンを押すと、1個目のButton_Click()がまだ実行途中のまま2個目のButton_Click()が動き始め、FlgをFalseに変えます。そして2個目はFlgがFalseなのでそのまま(=iが0のまま)ループを1回も実行せずに抜けてMsgBoxで「0」を表示して終了します。
 その後、DoEventsで2個目のButton_Click()が実行され終了されるのを待っていた1個目のButton_Click()に制御が戻り、ループしていた回数だけ変化したiの値がMsgBoxによって出てきた訳だ。

 修正方法としては・・・・一番簡単なのは、
----オリジナルソーススタート
Flg = Not Flg 'ボタンを使えるようにする
----オリジナルソースエンド
これを次のように変えましょう。
----修正ソーススタート
Flg = Not Flg 'ボタンを使えるようにする
If Not Flg Then Exit Sub ' ここに来た時にFlgがFalseなら、2個目という事なのでそのまま終了
----修正ソースエンド

今回はDoEventsの気をつけなければいけない使い方の例でした。
    • good
    • 0
この回答へのお礼

 お答えいただきありがとうございました。早速やってみたところ上手くいきました。まさか2つ目のボタンが働いたと思いませんでした。

お礼日時:2005/10/01 15:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!