• ベストアンサー

Application.OnTime の使い方

エクセルのマクロで、過ぎた時間の背景を グレーにする予定表を作ろうとしてます。 試しに一秒ごとにグレーにしようと以下のものを書いてみたのですが 1セルしかグレーになりません。 理想としては1秒、2秒、3秒ごとに一つずつセルを変えたいです。 range * i で型の問題がある気がするのですが、 なにかアドバイスあればよろしくお願いします。 以下は関数のページです。 TimeValue http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfcttimevalue.asp OnTime http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbawd10/html/womthOnTime.asp ---------------------------------------------------- Sub timer() Dim range As Integer For i = 1 To 100 range = TimeValue("0:00:01") my_time = Now + (range * i) Application.OnTime my_time, "setBg" Next End Sub Sub setBg() Cells(Second(Now), 1).Interior.ColorIndex = 16 End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

1分ごとに処理したいのであれば Sub Timerの中のループは mのみで良いように思います 余分な hやsでループしてタイマーをセットするのは資源の無駄遣いです 1分ごとにプロシージャを呼び出せれば良いのですから dim mySpan(59) as Date Sub Timer()   dim span as date, n as integer   span = Now   for n = 0 to 59     mySpan(n) = span     Application.onTime span, "setBg"     span = DateAdd( "n", 1, sapn )   next End Sub Sub setBg()   dim m as integer, h as inetegr, span as range   m = Minute( Now )   h = hour( Now )   If m >= 3 Then     Cells( m - 1, h + 1).Interior.ColorIndex = 16   Else     Cells( m + 59, h + 1 ).Interior.ColorIndex = 16   End If   ' タイマーの更新   Application.onTime mySapn( m ), "setBg",,False   mySpan( m ) = DateAdd( "h", 1, mySpan(m) )   Application.onTime mySapn( m ), "setBg" End Sub ブックを読み込んだ時点で自動実行させたいなら 標準モジュールに Sub Auto_Open() ThisWorkbookの Sub Workbook_Open() のどちらかに 開始時に行う処理を呼び出すようにすれば良いですよ

yasu182
質問者

お礼

何度も教えていただき とても勉強になりました。 また一つプログラミングの面白さを体験できました。 たぶんこんなスケジュール帳を使いたい人はいないと思いますが、 興味あれば使ってみてください(笑)  回答ありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

私には、わからないとことだらけですが 私がやって見ると 下記は1秒ごとにA1セルから下方向に黄色をつける(20秒)内容です。 Public n Sub Timer() n = 0 range("A:A").Clear For i = 1 To 20 my_time = Now + TimeValue("0:0:01") * i Application.OnTime my_time, "setBg" Next i End Sub Sub SetBg() n = n + 1 Cells(n, 1).Interior.ColorIndex = 6 End Sub でうまくいくようです。 その For Nextループの実行は、実時刻の経過と関係なく実行されるようです。その仕組み理解不足。 VBAは自分の世界で早々と実行。システムに時間が来たら実行してよね、と言いぱっなしのようなイメージかな。 ですからFor i = 1 To 100だとSub SetBg()の実行では、iは101で100回繰り返されるようです。 というのも、私は初めはiがSub SetBg()でも使えないか、とやってみたが、私の理解不足した。質問者もそれはわかっていたのかもしれないが。 それで上記のようにしてみました。 ーー ただ、ループの各回ごとの実行を実時間の経過に強制的にあわせて、Sub SetBg()に飛ばせる方法は無いのかと思うが、そういう仕組みはForNextや普通のVBAでは無理のようだ。 ーー #1のご回答ではその点Cells( Second(Now)+1,1).で(Nowを使って)解決しておられる。(質問者の質問文でもその路線ですが)。 ただしSub Timer()では名前がTimerだからか、エラーになりませんか。Sub TimerA()にしたらOKですが。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

rangeをDate型にして forループは1と60で良いように思います Sub Timer()   dim range as Date, my_time as Date, i as Integer   range = timevalue("0:0:1")   for i = 1 to 60     my_time = Now + range * i     Application.OnTime my_time, "setBg"   next End Sub Sub SetBg()   ' Secondの戻り値が0から59なので +1をして補正する   Cells( Second(Now)+1,1).Interior.ColorIndex = 16 End Sub

yasu182
質問者

補足

回答ありがとうございます。 出来ました^^ もしよろしければ重ねてお伺いしてもよろしいでしょうか。 1.以下のコードで一分ごとに背景が変わるようになったのですが、 もっと効率の良い方法はありますか?? マクロを始める時に 60 x 60 x 24 の演算をしてしまうので。 JavaScript の setInterval のようなものがあったら良いなと思いました。 以下のは、セル A1 から X1 に0時から23時と入れて 縦の番号がそのまま minutes になるものです。 0分は行60、1分は行61になるんですけども。 時間が過ぎる速さを実感したいと思いまして。 2.また、このエクセルファイルを開くと同時に マクロを実行することは可能でしょうか?? 解る範囲で教えて頂けると助かります。 ------------------------------------------------------ Sub timer() Call initialize For h = 0 To 23 For m = 0 To 59 For S = 0 To 59 Application.OnTime Now + TimeValue(h & ":" & m & ":" & S), "setBg" Next Next Next End Sub Sub setBg() If Second(Now) = 0 Then If Minute(Now) >= 3 Then Cells(Minute(Now) - 1, Hour(Now) + 1).Interior.ColorIndex = 16 Else Cells(Minute(Now) + 59, Hour(Now)).Interior.ColorIndex = 16 End If End If End Sub Sub initialize() ' set previous hour If Hour(Now) <> 0 Then For h = 0 To Hour(Now) - 1 For m = 2 To 61 Cells(m, h + 1).Interior.ColorIndex = 16 Next Next End If ' set this hour If Minute(Now) >= 3 Then For m = 2 To Minute(Now) - 1 Cells(m, Hour(Now) + 1).Interior.ColorIndex = 16 Next End If End Sub

関連するQ&A

  • Application.OnTime Nowの変数

    他のプロシージャに1秒後に変数を渡すテストをしました。 Sub test01() Dim ws As Worksheet Set ws = ActiveSheet Application.Wait Now + TimeValue("0:00:01") Call AAA(ws) 'ただしく渡される End Sub Sub test02() Dim ws As Worksheet Set ws = ActiveSheet Application.OnTime Now + TimeValue("00:00:01"), "AAA(" & ws & ")" 'エラー End Sub Sub AAA(ByVal ws As Worksheet) MsgBox ws.Name End Sub Application.OnTime を使ったほうがエラーになるのはなぜでしょうか? どうやれば正しく渡せるうのでしょうか?

  • ontimeのリセット方法

    簡単な問題を出すexcelを作っています。 問題を出した時点でタイマー(ontime)を出し、 1分間だけ猶予を持たせ、 回答が出ればリセットをする。 間に合わなければ「残念でした」を出そうとしています。 Sub start8() Application.OnTime Now + TimeValue("00:01:00"), "timeout8" End Sub Sub reset8() Application.OnTime Now + TimeValue("00:01:00"), "timeout8", , False End Sub Sub timeout8() "残念でした。" End Sub 見よう見まねで上記の通り書きましたが、 分からないのは、これだとresr8の引き金を引いてから、1分後のように思います。 ここはどのように書けばいいのでしょうか。 Application.OnTime Now + TimeValue("00:00:00"), "timeout8", , Falseのように書いてみましたが、 エラーになります。 制限時間内にリセットボタンを押せば何事もなかった、という風にやりたいのです。 宜しくお願いします。

  • Application.OnTime が動作するタイミング(vba)

    まず10秒たってからtest2222と表示させて、次にtestと表示させるプログラムを以下のように作成したのですが、なぜか先にtestが表示されて、次にtest2222が表示されます。 なぜなのでしょうか? 分かる方がいれば教えてください。 よろしくお願いします。 Sub aa() Application.OnTime Now + TimeValue("00:00:10"), "kara" MsgBox "test" End Sub Sub kara() MsgBox "test22222" End Sub

  • EXCELのApplication.OnTimeは予約のことですか?

    こんにちは、VBAの初心者です。 Application.OnTimeとは目覚し時計をセットするみたいに 時間になったら実行させたいタスクの「予約をする」ことですか。 ---------------- 例えばThisWorkbookに Sub ThisWorkbook_Open()  Application.OnTime TimeValue("09:00:00"), "A"  Application.OnTime TimeValue("10:00:00"), "B"  Application.OnTime TimeValue("11:00:00"), "C" End Sub 標準モジュールに Sub A()  Beep End Sub Sub B()  Beep End Sub Sub C()  Beep End Sub --------------- と書けば、Workbookを開いた時に「3つのタスクが予約された」と考えて良いのでしょうか。 その場合、11時前にEXCELを終了させたら 最後のタスクは自然消滅するのでしょうか、それともエラー扱いになるのでしょうか。

  • EXSEL OnTime

    OnTimeを使ったタイマーですが、サンプルを利用して実行させると次のようなエラーになってしまいます。 「マクロ’I:¥一定時間後にxls'実行マクロ'が見つかりません。」 なにか設定する事項でもあるのでしょうか? Option Explicit Dim 待ち時間 Dim 指定時刻 Sub 一定の時間間隔でマクロを実行する() 指定時刻 = Now + TimeValue("0時00分05秒") '5秒後 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "実行マクロ名", TimeValue(待ち時間) End Sub Sub 実行マクロ名() Dim wavfile As String wavfile = "C:\Windows\Media\ringin.wav " 'wavファイルのパス Shell "mplay32.exe /play /close " & wavfile End Sub

  • OnTimeを使ったのですが「エラー」になってしまいます

    VBA でOnTimeの「サンプル」を使ってのタイマーですが、実行すると次のようなエラーが出て、実行マクロへ行けません。 「マクロ"I:\一定時間後に.xls'!実行マクロ名'が見つかりません。」 どうしてなのか教えてください。 Option Explicit Dim 待ち時間 Dim 指定時刻 Sub 一定の時間間隔でマクロを実行する() 指定時刻 = Now + TimeValue("0時00分05秒") '5秒後 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "実行マクロ名", TimeValue(待ち時間) End Sub Sub 実行マクロ名() Dim wavfile As String wavfile = "C:\Windows\Media\ringin.wav " 'wavファイルのパス Shell "mplay32.exe /play /close " & wavfile End Sub

  • OnTimeの取り消しについて

    ヘルプには次のように記述がありますが、指定時刻に 実行させるプロシージャーの取り消しはサンプルの手順 で動作しますが、何秒後・・・を指定した場合のサンプル はうまく取り消せません。"実行時エラー '1004'"と なります。 この場合、どのように記述すればいいのでしょうか? 使用例 次の使用例は、現在から 15 秒後に my_Procedure を実行します。 Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure" 次の使用例は、午後 5 時に my_Procedure を実行します。 Application.OnTime TimeValue("17:00:00"), "my_Procedure" 次の使用例は、前の使用例で設定した OnTime メソッドの設定を取り消します。 Application.OnTime EarliestTime:=TimeValue("17:00:00"), _ Procedure:="my_Procedure", Schedule:=False

  • Excelのontimeについて

    a1に数式が入っています。 c3からd3,e3,f3…に一定時間ごとにa1の値を入力するマクロがあります。 Sub 入力() Sheets("Sheet1").Select Range("a3").End(xlToRight).Offset(0, 1).Select ActiveCell.Value = Cells(1, 1).Value End Sub Sub スタート() Dim MyTime As Date Dim Jikan As Date Dim i As Integer Jikan = TimeValue("13:59:00") For i = 0 To 5 MyTime = Jikan + TimeSerial(0, 0, 5) * i Application.OnTime MyTime, "入力" Next End Sub で、教えていただきたいのですが、"入力"を動かしている途中で 上記のマクロをとめるにはどうしたらよいのでしょう? ご教授ください。

  • エクセルシートの順繰り表示マクロについて

    エクセルにて随時更新されるデータを全画面表示し、3枚のシートを5秒置きに順繰り表示させるようマクロを組みました。始めは順調なのですが、数時間たつとフリーズしてしまいます。そもそもエンドレスのマクロプログラム実行に無理があるのでしょうか。 または下記のプログラムに問題があるのでしょうか。ご教授お願いします。 Sub Macro1() Sheets("Sheet2").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro2" End Sub Sub Macro2() Sheets("Sheet3").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro3" End Sub Sub Macro3() Sheets("Sheet1").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro1" End Sub

  • On Timeメソッド?で更新されません。

    On Timeメソッド?で更新されません。 現在Web上にあった例を参考に 下記の様にホワイトボード解析シートのA1セルに 20秒ごとに現在時刻を表示させています。 これを応用して、違うシートに 17:00に天気というマクロを実行するよう 作成したのですが上手くいきませんでした。 Sub Auto_Open()とSub auto_close()のtargetTimeを targetTime = TimeValue("17:00") Macro7を天気 としたのですが、なぜ更新されなかったか分かる方がいらっしゃいましたら ご教授下さい。 Sub Auto_Open() Dim TargetTime, WaitTime TargetTime = Now + TimeValue("00:00:01") WaitTime = TimeValue("00:00:10") Application.OnTime TargetTime, "Macro7", WaitTime End Sub Sub Macro7() On Error Resume Next Worksheets("ホワイトボード解析").Range("A1").Calculate Application.OnTime Now + TimeValue("00:00:20"), "Macro7", TimeValue("00:00:10") '↑TimeValueの最初の方をへんこうする事で時間が変わる End Sub Sub auto_close() Dim i As Integer, TargetTime On Error Resume Next For i = 1 To 10 TargetTime = Now + TimeValue("00:00:" & Application.Text(i, "00")) Application.OnTime TargetTime, "Macro7", , False Next i End Sub

専門家に質問してみよう