- 締切済み
エラー Loop
時計カウントのプログラムを以下のようにつくったのですが、 Sub/ユーザーフォームの実行をクリックしたら、セルに時刻 が表示されうごいたものの、中断やリセットをクリックしても 停止せず、マウス操作が無効になりました。参考本でみつけた Ctrl+Pauseで、コードの実行が中断できました。デバッグを クリックしたら、 Loop の部分が黄色くなりました。 Sub 時計() Do Until Time = "17:00:00" Cells(1,1).Value = Time Application.Wait Now + TimeValue("00:00:01") Loop End Sub 不具合を解決したいのですが、どなたか どうぞ 教えてくださいませんでしょうか。おねがいします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- DreamyCat
- ベストアンサー率56% (295/524)
繰り返しタイマーにWaitを使うのは感心しません。 なぜかというとほとんどの間、処理が停止しているからです。 PCはその間VBAプログラムを実行してくれません。 Application.Ontimeでしたら指定した時刻に任意の処理を 実行させることが可能です。 とりあえずこれで実行できますので Application.Ontimeに取り組む前に時刻について少し 理解を深めてみてください。 また、APIのsettimerを使うなどの方法もあります。 Sub 時計() Cells(1, 1).Value = Time + TimeValue("00:00:05") MsgBox Cells(1, 1).Value Do Until Time >= Cells(1, 1).Value DoEvents Application.Wait Now + TimeValue("00:00:01") Loop End Sub
- j-kachimi
- ベストアンサー率35% (48/136)
タイマーイベントの使い方 1.ツールボックスからタイマーを貼り付ける(時計のアイコン) 2.上記のプロパティーの enabel = ture intaval = 500 3.そのタイマーをダブルクリックすると、指定した時間に発生するイベントの処理ルーチンが作成される。 4.その処理ルーチンに Cells(1,1).Value = Time などをいれる。 17:00:00を超えたら処理をやめたいなら if Time >= "17:00:00" then timer1.enable = False end if 5.実行中はコントロールにフォーカスを移しておく 例えば command1 setfocus こんなところです。 スペールや文法はうる覚えなので間違っているかもしれません。 VBの勉強がんばってくださいね。 「VB中学校」や「VB花ちゃん」など役に立ちますよ。
- j-kachimi
- ベストアンサー率35% (48/136)
コンピュータの割り込み処理は一般にi/o待ちにならないと発生しません。またI/o待ちが早すぎると割り込みを処理できません。 このプログラムだと恐らくCPUは全てこのループで使われてしまいます。 とりあえずループ内に DOEVENT を入れてみてください。 また、こういったプログラムを作るときは、タイマーイベントを使い例えば500msに一回セルを書き換えるようにするといいかと思います。
お礼
J-kachimiさん 回答ありがとうございます。DoEventsを 挿入したら、他の操作も割り込み処理できることが確認できました。 ただ タイマーイベントはどのように使うのか。1秒間のうち、 500msだけ Do Loop 処理に当てられることができるのでしょうか。 それには どのように 挿入すればいいのでしょうか。初心者で すみませんが できればおしえていただけないでしょうか。
お礼
DreamyCatさん、ご回答ありがとうございます。 OnTimeをもちいたプログラムをつくっていました。 Sub 時計() Do Until Time = "17:00:00" Application.OnTime EarliestTime:=Now + TimeValue("00:00:01") _ , Rrocedure:="OnTimeInput" DoEvents Loop End Sub Sub OnTimeInput() Cells(1,1).Value = Time End Sub どうもありがとうございました。