dポイントプレゼントキャンペーン実施中!

こんにちは
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

な感じなのですが、これだと一度起動すると二日目以降は動作しなくなります。
毎日起動するにはどうしたら良いものでしょうか

A 回答 (8件)

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


もう、あきらめてしまったのでしょうか?
もし、そうなら、とても残念です。
    • good
    • 0
この回答へのお礼

ありがとうございます。

今日まで、回答に気づきませんでした。

とりあえず、エクセルが起動したときに、"timer()"を起動する、
"sub"(名前は変えました)の最後に、エクセルを閉じるようにして、
タスクスケジュールにてエクセルを起動するように設定しました。

WSHについても、初めて聞きました。
今回いただいた、コードも参考にして、
今後取り入れて行きたいと思います。

お礼日時:2008/01/16 10:26

#6 の回答者です。



何も知らないで開けたら、ブックがしまってしまうので、修正したほうがよいようです。

Private Sub Workbook_Open()


 Beep
  'ThisWorkbook.Close True  '←これは、WSH に移したほうがよいですね。
  
--------------------------
''MyExcel.VBS

Wscript.Sleep 2000 '2秒
.ThisWorkbook.Colse True '←これを入れる
.Quit
    • good
    • 0

こんにちは。


#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 を押しながら開くと、ブックは閉じません。
    • good
    • 1

一度こういう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
なんてすると、毎日実行してると思います(テストしてませんが)
まずは、短い間隔でテストしてみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます

スケジュールオンをして、
もう一度読み込みなおせば良いのか・・・・・

実行回数・次回実行時間・前回実行時間等、
今後取り入れて行けば、より便利なシステムなりそうです。

お礼日時:2008/01/16 10:56

毎日同じ時間にエクセルのマクロを実行させるには#1の後半の手順を踏めば可能です。



実際にやった人が言うんだから間違いないです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

別日に立ち上げると言う部分の方法が思いつかなかったために、
すぐにあきらめると言ってしまった事を反省しています。

お礼日時:2008/01/16 10:35

こんばんは。



>これだと一度起動すると二日目以降は動作しなくなります。
最初に、そのご質問のマクロでは、次の日というよりも、一回きりの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
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/10 19:32

日付をまたぐことは出来ません。



出来たとしても、パソコンは電源入れっぱなし、エクセル立ち上げっぱなし出ないと"SUB"は動きません。

ご希望の動きは、
実行前にパソコンを自動で起動して、ご使用のエクセルを自動で立ち上げて、時間指定のモジュールを自動で動かして、実行後パソコンをシャットダウンする。
と言う流れになると思います。

この回答への補足

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

補足日時:2008/01/10 17:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています