![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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
No.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の気をつけなければいけない使い方の例でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
UWSCの終了の仕方
-
範囲指定したセルを1つずつ飛...
-
プログラミングについて。 1つ...
-
VBA Dir関数でファイルをループ...
-
VBA Boxが空白の場合のメッセー...
-
vb.netからエクセル関数書き込み
-
For文を使った九九表の作成
-
素数の個数を求めるプログラミング
-
アクティブセルから、A列最終行...
-
EXCEL VBA ユーザーフォームの...
-
テキストボックスの名前に変数...
-
フラグについて
-
ExcelVBA FindNextを使用して条...
-
エディットボックスのテキスト...
-
pythonでリストの要素を小さい...
-
COBOLプログラム
-
アップルループについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
どなたかこのプログラミングを...
-
VBAでの一時停止と再開の方法
-
VBA for i=1 to lastrow
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
-
GIFアニメをループさせたくない
-
Escキーを押すと、中断する時と...
-
DOSコマンドのループ内のTIMEコ...
-
CSVファイルの特定の行だけを読...
-
アクティブセルから、A列最終行...
-
vb.netからエクセル関数書き込み
-
範囲指定したセルを1つずつ飛...
-
テキストボックスの名前に変数...
-
乱数の桁数指定、または範囲指定。
-
「偶数・奇数の和」のフローチ...
-
vbscriptでIE自動入力(途中で...
おすすめ情報