- ベストアンサー
Excel VBA 時刻でのDo~Loopの抜け方
いつもお世話になっております。 Excel VBA 時刻でのDo~Loopの抜け方を教えてください。 下記のような記述で、時刻(時間)の条件を満たした時 ループを抜けるように設定したのですが、 時刻が「8時」とか「15時」というように 時間でしか対応しません。 「何時何分」という設定にも対応するためには どのように記述すればよいか教えてください -------の部分は何らかの記述が入っているものとしてください。 ↓このように記述しました Do Until MyHour > 15 MyHour = Hour(Now) ------------------- -------------------- -------------------- Loop どうぞ、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。Wendy02です。 >Sheets("a").select >for J=1 to 10000:next j >Sheets("b").select >for J=1 to 10000:next j >のように、シートの表示を切り替え >画面表示を変えるようにしています。 ということは、シートの全体の監視ですか? コードは、VBのスタイルですね。 画面の切り替えをずっとしていくのですか? for J=1 to 10000:next j これですと、1秒以内のような気がします。 For Each sh In Worksheets は、全部のワークシートですので、もし、そうでない場合は、For Each sh in Worksheets(Array("a","b"))として、配列にしてあげます。 今は、ちょっと、思いつく方法を書いてみただけで、もう少し、違った方法があったような気がします。一応、以下のものは試験はしてあります。 Sleep は、Wait よりも負担が少ないので使いました。 '-------------------------------------------------- Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Sub ShChange() Dim sh As Worksheet Dim SettingTime As Date Dim AtNow As Date SettingTime = TimeValue("16:15:00") AtNow = Now() - Int(Now) Do Until AtNow > SettingTime AtNow = Now() - Int(Now) For Each sh In Worksheets DoEvents sh.Select Sleep 2000 '1000 =1秒 Next sh Loop End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 まあ、それそのものは、以下のようにすればよいのですが……。 それから、"15:51" というような文字列比較は、うまくいきませんね。 文字列は、"2" > "12" が、True です。 Dim SettingTime As Double '設定時間 Dim AtNow As Double '時間 SettingTime = TimeValue("15:51") AtNow = Now() - Int(Now()) Do Until AtNow > SettingTime AtNow = Now() - Int(Now()) ------------------- -------------------- -------------------- Loop しかし、全体的には、疑問の残る余地が大きいです。 OnTime メソッドを上手に使ったほうがよいのではないかと思いますし、Loop を繰り返せば、Excelはメモリ喰いなので、PC自体の負担が大きいのではないかと思います。 Do Until ..... >------------------- >-------------------- >-------------------- >Loop 「線の中」で何をしているかが問題です。長い時間を使うというのは、全体的に、イベントの代わりじゃないかと思います。その場合は、Do ~ Loop じゃないのですね。部分的に質問を出されると、全体的には、間違った解答をしているのではないか、不安が残ります。
お礼
丁寧な回答ありがとうございました。 Do~Loop の中では、 Sheets("a").select for J=1 to 10000:next j Sheets("b").select for J=1 to 10000:next j のように、シートの表示を切り替え 画面表示を変えるようにしています。 Do~Loop このような場合の使い方は適切ではないのでしょうか? ご教授お願いします
- Ce_faci
- ベストアンサー率36% (46/127)
本題を間違えました。 Sub 時刻で処理() MyHour = "15:51" Do Until Hour(Now) & ":" & Minute(Now) > MyHour MsgBox "節分" Loop End Sub 15:51を適当に変えてください。 PC自体の時計(日付と時刻のプロパティ)を操作すると確認し易いと思います。
- Ce_faci
- ベストアンサー率36% (46/127)
こんばんわ MyHour=timevalue("15:51") のことですか。
お礼
お礼が遅れました。ありがとうございました。うまく動作させることが出来ました。