- ベストアンサー
VBAマクロタイマーカウントダウンの自動停止
- VBAマクロを使用してタイマーカウントダウンを実装する方法について教えてください。
- タイマーが0:00:00で自動停止し、カウンターがタイマー終了時に1カウントアップする方法について教えてください。
- タイマー作動中に画面を自由にスクロールする方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
カウントがアップしてしまう件ですが、今ひとつよくわかりません。 こちらで再現できたところでは、Private によるモジュール変数の宣言(4つ)がない場合に問題文中のコードでタイマーがすぐに0:0:-1になってそのあとフラグカウンターが1秒ごとにに1ずつカウントアップしてしまうという現象がありました。 しかし、No.1の補足のコードにPrivateによるモジュール変数の宣言がないのは、質問者様が補足を書かれた際に単に省略されただけなのではないでしょうか。 Privateによる変数宣言がある場合は、No.1の補足のコードではフラグカウンターがタイマー停止後に予想外にカウントアップしてしまう現象は見られませんでした。(質問文中のコードではセルK16のカウントアップをする部分の記述が不適切でカウントアップしてしまうことがありましたが、補足のコードではその点が改善していました) ワークシートのスクロールも問題ありませんでした。 それ以外で期待通りの動作をしなかった点としては、タイマーのカウントダウン中に誤って「指定時刻にマクロを実行する」を実行してしまうと、実行した回数分だけタイマーのカウントダウンが速くなるという現象がありました。何もしなければ通常通りのカウントダウンなのですが、1回の実行で2倍、2回の実行で3倍になってしまうのです。 今のところわかったのはこのくらいです。あまり力になれないようでやや残念です。 なお、検証はWindows XP SP3上のExcel 2003で、下記のコードを標準モジュールにて実行しました。 Private TB As Integer Private MacroStop As Boolean Private ZAN As Integer Private C As Integer Sub タイマー起動() TB = 8 ZAN = TB C = 0 MacroStop = False Call 指定時刻にマクロを実行する End Sub Sub 指定時刻にマクロを実行する() mywait = 1 '1秒 指定時刻 = Now + TimeSerial(0, 0, mywait) If ZAN >= 0 Then If MacroStop = False Then Application.OnTime 指定時刻, "指定時刻にマクロを実行する" Call やりたいこと Else End If MacroStop = False End If If ZAN = 0 Then Range("K16") = Range("K16") + 1 End If End Sub Sub やりたいこと() C = C + 1 ZAN = TB - C '・・・・ HH = ZAN \ 3600 MM = (ZAN - HH * 3600) \ 60 SS = ZAN - HH * 3600 - MM * 60 Total = HH & ":" & MM & ":" & SS Range("E8") = TB Range("D12") = Total End Sub Sub タイマー停止() MacroStop = True Range("E8").ClearContents Range("D12").ClearContents End Sub
その他の回答 (2)
- queuerev2
- ベストアンサー率78% (96/122)
とりあえずわかるところだけ回答いたします。 まずTotalが"0:0:-1"で終わる件です ZANが0の状態で「やりたいこと」に制御が移ると、Cがカウントアップされ、ZANの値が-1に更新されると考えられます。 質問者様が実際に動かされているコードでは、おそらくこのあとにZANの値(秒を表す数値)からTotalの値("時:分:秒"形式の文字列)を作っているのではないでしょうか。 そうであればTotalが"0:0:-1"になるのも合点がいきます。 対策としては、ZANが0になったら「やりたいこと」を実行しないようにするか、あるいはTotalの値を作った後にZANの値を更新するなどが考えられます。 それと、最初の質問文のスクロールできない件ですが、こちらで試した限りでは問題なくスクロールできました。 (Windows XP上のExcel2003にて、質問者様が最初の質問文に提示されたコードを修正して動かしてみました) なお、カウントがアップしてしまう件ですが、これはちょっとややこしそうなのでもう少し検討してから回答したいと思います。
- queuerev2
- ベストアンサー率78% (96/122)
この質問ですが、まだ回答をご希望でしょうか?
補足
Sub 指定時刻にマクロを実行する() mywait = 1 ’1秒 指定時刻 = Now + TimeSerial(0,0,mywait) If ZAN >= 0 Then If MacroStop = False Then Application.OnTime 指定時刻,"指定時刻にマクロを実行する Call やりたいこと Else End If MacroStop = False End If If ZAN = 0 Then Range("K16" ) = Range("K16") + 1 End IF End Sub Sub やりたこと() C = C +1 ZAN = TB - C ・・・・ Total= HH&”:”&MM&”:”SS Range("E8") = TB Range(”D12”)=Total End Sub Sub タイマー停止() MacroStop = True Range(”E8”).ClearContents Range(”D12”).ClearContents End Sub とマクロを変更し実行すると Total = 0:0:-1 となり、プログラムは自動停止し、カウントアップもします。 ただし、リセットボタンを押すとさらに カウントがアップしてしまう状態です。 何か用方法があれば、教えていただけないでしょうか?
お礼
ご返事遅くなりまして誠に申し訳ありませんでした。 まずqueuerev2様のご質問の件ですが、No.1の補足のコードにPrivateによるモジュール変数の宣言がないのは、補足を書いた際に単に省略しただけです。 教えていただきまして通りコードを記述しましたところ、正常に自動停止し、カウントアップ(1回の作動で1カウントアップ)することができました。本当にありがとうございました。納期が迫っていて不安になっていました。結果が出て大変満足しています。今後もよろしくお願いしまう。