- ベストアンサー
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 な感じなのですが、これだと一度起動すると二日目以降は動作しなくなります。 毎日起動するにはどうしたら良いものでしょうか
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#6-7に書いた回答者ですが、その内容で、パソコンで違う作業をしているときに、Excelが立ち上がり作業をすることは確認しています。 もう、あきらめてしまったのでしょうか? もし、そうなら、とても残念です。
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
#6 の回答者です。 何も知らないで開けたら、ブックがしまってしまうので、修正したほうがよいようです。 Private Sub Workbook_Open() ・ ・ Beep 'ThisWorkbook.Close True '←これは、WSH に移したほうがよいですね。 -------------------------- ''MyExcel.VBS Wscript.Sleep 2000 '2秒 .ThisWorkbook.Colse True '←これを入れる .Quit
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #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)
一度こういう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 なんてすると、毎日実行してると思います(テストしてませんが) まずは、短い間隔でテストしてみてください。
お礼
ありがとうございます スケジュールオンをして、 もう一度読み込みなおせば良いのか・・・・・ 実行回数・次回実行時間・前回実行時間等、 今後取り入れて行けば、より便利なシステムなりそうです。
- pbforce
- ベストアンサー率22% (379/1719)
毎日同じ時間にエクセルのマクロを実行させるには#1の後半の手順を踏めば可能です。 実際にやった人が言うんだから間違いないです。
お礼
ありがとうございます。 実際にいろいろやってみた結果、 ようやく、おっしゃられている意味が理解できました。 日付をまたぐことができないので、 別日に立ち上げる・実行する・終了する を繰り返せば良かったんですね。 別日に立ち上げると言う部分の方法が思いつかなかったために、 すぐにあきらめると言ってしまった事を反省しています。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >これだと一度起動すると二日目以降は動作しなくなります。 最初に、そのご質問のマクロでは、次の日というよりも、一回きりの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)
日付けをまたぐことはできません。
お礼
そうですか・・・・・ じゃぁあきらめます。
- pbforce
- ベストアンサー率22% (379/1719)
日付をまたぐことは出来ません。 出来たとしても、パソコンは電源入れっぱなし、エクセル立ち上げっぱなし出ないと"SUB"は動きません。 ご希望の動きは、 実行前にパソコンを自動で起動して、ご使用のエクセルを自動で立ち上げて、時間指定のモジュールを自動で動かして、実行後パソコンをシャットダウンする。 と言う流れになると思います。
補足
いや基本的に、立ち上げっぱなしにしようかと思っています。 立ち上げっぱなしにしても、どうもうまく行かないんです。いま、PCの時刻をぐりぐりしてるんですが・・・・・
お礼
ありがとうございます。 今日まで、回答に気づきませんでした。 とりあえず、エクセルが起動したときに、"timer()"を起動する、 "sub"(名前は変えました)の最後に、エクセルを閉じるようにして、 タスクスケジュールにてエクセルを起動するように設定しました。 WSHについても、初めて聞きました。 今回いただいた、コードも参考にして、 今後取り入れて行きたいと思います。