• ベストアンサー

VBAのタイマー

こんにちは VBAで、一日に一回起動するマクロを作ろうと思っています。 Sub timer() Dim settime As Variant Dim waittime As Variant settime = TimeValue("00:35:00") '指定時刻 waittime = TimeValue("00:01:00") settime = settime + waittime '指定時刻待ち時間 Application.OnTime TimeValue(settime), "sub" End Sub な感じなのですが、これだと一度起動すると二日目以降は動作しなくなります。 毎日起動するにはどうしたら良いものでしょうか

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

#6-7に書いた回答者ですが、その内容で、パソコンで違う作業をしているときに、Excelが立ち上がり作業をすることは確認しています。 もう、あきらめてしまったのでしょうか? もし、そうなら、とても残念です。

BARUSANN
質問者

お礼

ありがとうございます。 今日まで、回答に気づきませんでした。 とりあえず、エクセルが起動したときに、"timer()"を起動する、 "sub"(名前は変えました)の最後に、エクセルを閉じるようにして、 タスクスケジュールにてエクセルを起動するように設定しました。 WSHについても、初めて聞きました。 今回いただいた、コードも参考にして、 今後取り入れて行きたいと思います。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

#6 の回答者です。 何も知らないで開けたら、ブックがしまってしまうので、修正したほうがよいようです。 Private Sub Workbook_Open() ・ ・  Beep   'ThisWorkbook.Close True  '←これは、WSH に移したほうがよいですね。    -------------------------- ''MyExcel.VBS Wscript.Sleep 2000 '2秒 .ThisWorkbook.Colse True '←これを入れる .Quit

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 #3の回答者です。 ものすごく、初歩的なのですが、改めて、実際に毎日動かすものに作り変えてみました。 コンパネのタスクで登録してください。Win の開いた状態で使うなら、  ログオンしている場合のみ実行する にチェックしてください。 本来は、Win XP ですと、そのまま、Excelファイルを指定してもよいはずですが、二重起動とか、画面の問題とか設定できるように、WSH プログラムにしました。以下のコード、画面がうっとうしいようでしたら、.Visible =FALSE にしてしまってください。 以下のメモ帳などで、拡張子を、.VBS として、 Excelのブック名は、以下は、TimerSetBook.xls なっている部分を変えてください。 ファイルのフォルダは、デフォルトフォルダ(DefaultFilePath)になっています。 なお、マクロの猶予時間を、以下では、Wscript.Sleep 2000 は、2000/1000ms 秒という計算になっています。開けている時間を設定してください。そのままにするなら、xlApp.Quit は必要ありませんが、不在の時などを考えると、終えたほうがよいと思います。 WSH (全角スペースは入れないでください、エラーになります) このファイル名を、タスクに入れてください。 --------------------------------------------------------- ''MyExcel.VBS ,WSH で動かす Dim xlApp Dim myPath Dim DefPath On Error Resume Next Set xlApp = Wscript.CreateObject("Excel.Application") If xlApp Is Nothing Then Set xlApp =Wscript.Getobject(, "Excel.Application") End If If Not xlApp Is Nothing Then myPath = xlApp.StartupPath DefPath = xlApp.DefaultFilePath With xlApp .Visible =TRUE 'アドインやPersonal.xls が必要なときは、ここに書き加える '.Workbooks.Open(myPath & \Personal.xls") .Workbooks.Open(DefPath & "\TimerSetBook.xls") Wscript.Sleep 2000 '2秒 .Quit End With End If Set xlApp = Nothing ----------------------------------------------- 実際のブック側のマクロは、 'ThisWorkbook モジュールに書き込みます。 Private Sub Workbook_Open() Dim i As Long   i = Sheet1.Range("A65536").End(xlUp).Offset(1).Row   Sheet1.Cells(i, 1).Value = Format$(Date + Time, "mm/dd hh:MM")   Beep   ThisWorkbook.Close True End Sub このコードを登録した後に、ブックを開くときには、Shift を押しながら開くと、ブックは閉じません。

  • lark_0925
  • ベストアンサー率63% (37/58)
回答No.5

一度こういうOntimeメソッドを使った繰り返し処理を使ったなら、次回に 同じ処理をしたいと思った時には、簡単なインタフェースで 実現できるようにマクロ化しておきます。 新規ブックの標準モジュール(module1)に '========================================================= Sub main()  '設定  Call mc_schedule(True, 5, TimeValue("00:00:05"), "TEST")   End Sub '=============================================================== Sub test()  '実際に実行するプロシジャー  [a1].Value = [a1].Value + 1 End Sub 別の標準モジュール(module2)に 繰り返し処理ルーチン '============================================= Private exetm As Variant '次の実行時刻 Private lmcnt As Long '繰り返し回数 Private ccnt As Long '現在の実行回数 Private reptm As Variant '実行間隔時間 Private prcnm As String '実行プロシジャー名 Sub mc_schedule(ByVal on_off As Boolean, _         Optional ByVal limit_cnt As Long = 0, _         Optional ByVal rep_time As Variant, _         Optional ByVal proc_name As String, _         Optional ByVal F_Exetm As Variant) 'マクロ実行のスケジュールの設定を行う 'input : on_off --- true スケジュール設定 false---スケジュール解除 ' limit_cnt 実行を繰り返す回数 0の場合は、制限なく繰り返す ' rep_time 実行間隔時間 ' proc_name 実行するプロシジャー名 ' F_Exetm 初回実行時間 省略すると、現在の時刻+実行間隔時間   On Error Resume Next   If on_off = True Then    reptm = rep_time    If limit_cnt <> -1 Then      lmcnt = limit_cnt      ccnt = 0      End If    If IsMissing(F_Exetm) Then      exetm = Now() + reptm    Else      exetm = F_Exetm      End If    prcnm = proc_name        End If   Application.OnTime EarliestTime:=exetm, Procedure:="mc_exec", Schedule:=on_off   On Error GoTo 0 End Sub '============================================================= Sub mc_exec() 'スケジュール設定されたプロシジャーを実行する   Dim wk As Variant   wk = Application.Run(prcnm)   ccnt = ccnt + 1   If lmcnt = 0 Or ccnt < lmcnt Then    Call mc_schedule(True, -1, reptm, prcnm)    End If End Sub これでmainを実行してみてください。 セルA1に1を足すというtestというプロシジャーを 5秒間隔で5回実行します。 Sub main()  dim 初回実行時刻 as date 初回実行時刻=timevalue("xx:xx:xx") ' ↑これは、例です  Call mc_schedule(True, 0, TimeValue("24:00:00"), "TEST",初回実行時刻)   End Sub なんてすると、毎日実行してると思います(テストしてませんが) まずは、短い間隔でテストしてみてください。

BARUSANN
質問者

お礼

ありがとうございます スケジュールオンをして、 もう一度読み込みなおせば良いのか・・・・・ 実行回数・次回実行時間・前回実行時間等、 今後取り入れて行けば、より便利なシステムなりそうです。

  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.4

毎日同じ時間にエクセルのマクロを実行させるには#1の後半の手順を踏めば可能です。 実際にやった人が言うんだから間違いないです。

BARUSANN
質問者

お礼

ありがとうございます。 実際にいろいろやってみた結果、 ようやく、おっしゃられている意味が理解できました。 日付をまたぐことができないので、 別日に立ち上げる・実行する・終了する を繰り返せば良かったんですね。 別日に立ち上げると言う部分の方法が思いつかなかったために、 すぐにあきらめると言ってしまった事を反省しています。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >これだと一度起動すると二日目以降は動作しなくなります。 最初に、そのご質問のマクロでは、次の日というよりも、一回きりのOnTime のマクロですよね。(^^; 当たり前ですよね。 それと、ヘルプには、 「指定された時刻 (特定の日時、または特定の期間の経過後) にプロシージャを実行します。」 と書いてありますね。 そのままのマクロなら、マクロが終了した後に、もう一度、OnTime を呼び出せばよいだけのはずですが。(ただし、開きっぱなしの場合です) >settime = settime + waittime '指定時刻待ち時間 OnTime で、待ちを入れるなら、 Application.OnTime TimeValue settime, "Test", wiattime というところでしょうか? "sub" という名称は一般的にはまずいかな? 最初に話は戻りますが、少し、ややこしい使い方を考えると、どのみち、Excelのソフトは閉じてしまうわけですから、Excelファイルの Workbook_Open イベントなどに、マクロ自体を登録しておいて、それを、コマンドラインのATコマンドに登録しておくとか、タスクに入れ、数分前にExcelを起動させ(Excelが安定するまで、少し時間を置かせる方がよい)、毎日で登録させておくとか、その時間、Excelを開いているとぶつかるので、WSHで、オートメーション・オブジェクトにするとか、方法はいくつかあると思いますね。 今は、試していないから、細かい部分で違う(Excel起動時とそうでないときの違いなどの)部分があると思いますが、もともと、「明示的に(意図してマクロを使う)」使う分には、別に、そんなに難しい話ではないと思います。 以下は、端に実験的なマクロで、本来は、TimerTest を呼び出す、Sub Auto_Open か、WorkBook_Open に登録します。以下は、上記で述べたように、Excel の外に設定したほうがよいので、現実的なマクロではありません。必ず、マクロが起動されたら、翌日に設定し、実行するだけのものです。 例: '標準モジュールがベター '----------------------------- Private myTime As Date Private WaitTime As Date Sub TimerTest() '設定用   WaitTime = TimeValue("00:01:00")   myTime = Date + 1 + TimeValue("0:35")   On Error Resume Next   Application.OnTime myTime, "my_Procedure", WaitTime   If Err.Number > 0 Then     MsgBox "設定は実行されませんでした。"   End If   On Error GoTo 0 End Sub Sub my_Procedure() '実行マクロ Dim i As Long   i = Sheet1.Range("A65536").End(xlUp).Offset(1).Row   Sheet1.Cells(i, 1).Value = Time   Call TimerTest '呼び出し End Sub Sub TimerCancel() '解除用   On Error Resume Next   Application.OnTime myTime, "my_Procedure", WaitTime, Schedule:=False   If Err.Number > 0 Then    MsgBox "設定していないか、解除されませんでした。", 48   Else    MsgBox Format$(myTime, "yy/mm/dd hh:MM") & "解除されました。", 64   End If   On Error GoTo 0 End Sub

  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.2

日付けをまたぐことはできません。

BARUSANN
質問者

お礼

そうですか・・・・・ じゃぁあきらめます。

  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.1

日付をまたぐことは出来ません。 出来たとしても、パソコンは電源入れっぱなし、エクセル立ち上げっぱなし出ないと"SUB"は動きません。 ご希望の動きは、 実行前にパソコンを自動で起動して、ご使用のエクセルを自動で立ち上げて、時間指定のモジュールを自動で動かして、実行後パソコンをシャットダウンする。 と言う流れになると思います。

BARUSANN
質問者

補足

いや基本的に、立ち上げっぱなしにしようかと思っています。 立ち上げっぱなしにしても、どうもうまく行かないんです。いま、PCの時刻をぐりぐりしてるんですが・・・・・

関連するQ&A