Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7841 / 13645 ツリー ←次へ | 前へ→

【36542】処理を一定時間待つには てろてろ 06/4/3(月) 10:09 質問[未読]
【36544】Re:処理を一定時間待つには Blue 06/4/3(月) 10:15 発言[未読]
【36545】Re:処理を一定時間待つには てろてろ 06/4/3(月) 10:34 質問[未読]
【36546】Re:処理を一定時間待つには Blue 06/4/3(月) 10:40 発言[未読]
【36547】Re:処理を一定時間待つには ichinose 06/4/3(月) 10:42 発言[未読]
【36550】Re:処理を一定時間待つには てろてろ 06/4/3(月) 11:10 質問[未読]
【36551】Re:処理を一定時間待つには Blue 06/4/3(月) 11:16 回答[未読]
【36552】Re:処理を一定時間待つには ichinose 06/4/3(月) 11:42 発言[未読]
【36553】Re:処理を一定時間待つには てろてろ 06/4/3(月) 11:49 お礼[未読]

【36542】処理を一定時間待つには
質問  てろてろ  - 06/4/3(月) 10:09 -

引用なし
パスワード
   初めまして。

VBAで非常に困っていることがあります。
はじめての投稿になります。よろしくお願いいたします。

ある処理をクリックボタンに関連付けまして、
そのボタンを押すと決められた時刻まで延々とループするという処理を作ります。

ここで問題が2つありました。

1.9時から17時まで延々とループさせるには?
  
  Do
   ・
   ・
   ・
  Loop Until ???

2.この処理は30秒の一定時間をおいて周期的に回したいのですが、
  ループの終わりに以下のものをつけると、ボタンが押されっぱなし状態になり
  画面もフリーズ状態、CPUも100%近くになってしまい、
  何もできなくなってしまいます。
  周期的処理をするには、どのように作るのがベストでしょうか?

  T0 = Timer '30秒待つ
  Do
    DoEvents
  Loop Until T0 + 30 < Timer
 
以上、どちらか1つでもよいので、分かる方、アドバイスお願いします。
特に2が緊急で困っています。
よろしくお願いいたします。

【36544】Re:処理を一定時間待つには
発言  Blue  - 06/4/3(月) 10:15 -

引用なし
パスワード
   Application.OnTimeあたりを調べてみてはどうでしょうか?
# 流石に9〜17時の間、30秒周期だと(8*60*2=960回もマクロが走るわけで)重くなりそうですけど。

【36545】Re:処理を一定時間待つには
質問  てろてろ  - 06/4/3(月) 10:34 -

引用なし
パスワード
   ▼Blue さん:

早速の返信ありがとうございます!

>Application.OnTimeあたりを調べてみてはどうでしょうか?

これは9時にプロシージャを起動、17時に終了という部分に利用できそうですね。

'testプロシージャを9時に起動
Application.OnTime TimeValue("9:00:00"),"test"


># 流石に9〜17時の間、30秒周期だと(8*60*2=960回もマクロが走るわけで)重くなりそうですけど。

いえ、違うのです。周期的にループさせずに行っても、10秒間、CPU100%になるのです。

  T0 = Timer '30秒待つ
  Do
    DoEvents
  Loop Until T0 + 30 < Timer

この処理自体、そういった特性を持っているのでしょうか?
一定周期でループさせる良い方法は他にないでしょうか?

よろしくお願いします。

【36546】Re:処理を一定時間待つには
発言  Blue  - 06/4/3(月) 10:40 -

引用なし
パスワード
   なんだかよくわからないですが、
Application.Wait
というのもあります。

30秒ごと動かすという意味で OnTime というのがあるよといったわけで。

Sub test()
  ' ここで現在時間によって切り分ける(ここはたぶん終了の方、開始はBookを開いたときに起動できるようにする)
  If 〜〜〜 Then
    ' 30秒後にtestを起動
    Application.OnTime Now + TimeValue("00:00:30"), "test"
  End If
  ' やりたいこと
  〜〜〜
  〜〜〜
End Sub

【36547】Re:処理を一定時間待つには
発言  ichinose  - 06/4/3(月) 10:42 -

引用なし
パスワード
   ▼てろてろ さん:
▼Blue さん:
おはようございます。

>># 流石に9〜17時の間、30秒周期だと(8*60*2=960回もマクロが走るわけで)重くなりそうですけど。
>
>いえ、違うのです。周期的にループさせずに行っても、10秒間、CPU100%になるのです。
>
>  T0 = Timer '30秒待つ
>  Do
>    DoEvents
>  Loop Until T0 + 30 < Timer
>
>この処理自体、そういった特性を持っているのでしょうか?
>一定周期でループさせる良い方法は他にないでしょうか?
これは、APIのSleepを使ってみて下さい。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub CommandButton1_Click()
  CommandButton1.Enabled = False
  T0 = Timer '30秒待つ
  Do
    Sleep 100
    DoEvents
  Loop Until T0 + 30 < Timer
  CommandButton1.Enabled = True
End Sub

こればっかりは、Application.waitでは駄目なんですよねえ!!
試してみて下さい。

【36550】Re:処理を一定時間待つには
質問  てろてろ  - 06/4/3(月) 11:10 -

引用なし
パスワード
   ▼ichinose さん:

Sleepを使おうと思ったのですが
Sub または Function が定義されておりません
というエラーが出てしまいます。

定義は最上位に置いたのですが、ダメみたいで、どこにおけばよいのでしょうか?
ちなみに、クリックイベントから、Callによってループさせたいプログラムに
飛んでおります。どちらのモジュールの最上位段にも定義は書きました。

>▼Blue さん:

すみません。Waitより前にSleepを試します!
御回答ありがとうございます!

>おはようございます。
>
>>># 流石に9〜17時の間、30秒周期だと(8*60*2=960回もマクロが走るわけで)重くなりそうですけど。
>>
>>いえ、違うのです。周期的にループさせずに行っても、10秒間、CPU100%になるのです。
>>
>>  T0 = Timer '30秒待つ
>>  Do
>>    DoEvents
>>  Loop Until T0 + 30 < Timer
>>
>>この処理自体、そういった特性を持っているのでしょうか?
>>一定周期でループさせる良い方法は他にないでしょうか?
>これは、APIのSleepを使ってみて下さい。
>
>Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
>Private Sub CommandButton1_Click()
>  CommandButton1.Enabled = False
>  T0 = Timer '30秒待つ
>  Do
>    Sleep 100
>    DoEvents
>  Loop Until T0 + 30 < Timer
>  CommandButton1.Enabled = True
>End Sub
>
>こればっかりは、Application.waitでは駄目なんですよねえ!!
>試してみて下さい。

【36551】Re:処理を一定時間待つには
回答  Blue  - 06/4/3(月) 11:16 -

引用なし
パスワード
   Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
の一文は入れましたか?

VBAの関数ではなく、Windowsの関数(Win32 API)なので、
明示的に、○○にある□□という関数を使うという宣言をしないといけません。

> すみません。Waitより前にSleepを試します!
Waitも 100% になるので、試さなくてもいいですよ。(こんなのもある程度で)

【36552】Re:処理を一定時間待つには
発言  ichinose  - 06/4/3(月) 11:42 -

引用なし
パスワード
   >Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
>の一文は入れましたか?
Privateで引っかかってますかねえ
標準モジュールの先頭に
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

と宣言して試してみて下さい

【36553】Re:処理を一定時間待つには
お礼  てろてろ  - 06/4/3(月) 11:49 -

引用なし
パスワード
   ▼ichinose さん:▼Blue さん:

できました!
モジュールに書いていたので、Public にするのを忘れていて悪戦苦闘でした。

今から9時起動の方にとりかかります。
また何か困ったことがありましたらよろしくお願いいたします。
ありがとうございました!

>Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
>の一文は入れましたか?
>
>VBAの関数ではなく、Windowsの関数(Win32 API)なので、
>明示的に、○○にある□□という関数を使うという宣言をしないといけません。
>
>> すみません。Waitより前にSleepを試します!
>Waitも 100% になるので、試さなくてもいいですよ。(こんなのもある程度で)

7841 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free