
こんにちは
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
な感じなのですが、これだと一度起動すると二日目以降は動作しなくなります。
毎日起動するにはどうしたら良いものでしょうか
No.8ベストアンサー
- 回答日時:
#6-7に書いた回答者ですが、その内容で、パソコンで違う作業をしているときに、Excelが立ち上がり作業をすることは確認しています。
もう、あきらめてしまったのでしょうか?
もし、そうなら、とても残念です。
ありがとうございます。
今日まで、回答に気づきませんでした。
とりあえず、エクセルが起動したときに、"timer()"を起動する、
"sub"(名前は変えました)の最後に、エクセルを閉じるようにして、
タスクスケジュールにてエクセルを起動するように設定しました。
WSHについても、初めて聞きました。
今回いただいた、コードも参考にして、
今後取り入れて行きたいと思います。
No.7
- 回答日時:
#6 の回答者です。
何も知らないで開けたら、ブックがしまってしまうので、修正したほうがよいようです。
Private Sub Workbook_Open()
・
・
Beep
'ThisWorkbook.Close True '←これは、WSH に移したほうがよいですね。
--------------------------
''MyExcel.VBS
Wscript.Sleep 2000 '2秒
.ThisWorkbook.Colse True '←これを入れる
.Quit
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 を押しながら開くと、ブックは閉じません。
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
なんてすると、毎日実行してると思います(テストしてませんが)
まずは、短い間隔でテストしてみてください。
ありがとうございます
スケジュールオンをして、
もう一度読み込みなおせば良いのか・・・・・
実行回数・次回実行時間・前回実行時間等、
今後取り入れて行けば、より便利なシステムなりそうです。
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
No.1
- 回答日時:
日付をまたぐことは出来ません。
出来たとしても、パソコンは電源入れっぱなし、エクセル立ち上げっぱなし出ないと"SUB"は動きません。
ご希望の動きは、
実行前にパソコンを自動で起動して、ご使用のエクセルを自動で立ち上げて、時間指定のモジュールを自動で動かして、実行後パソコンをシャットダウンする。
と言う流れになると思います。
この回答への補足
いや基本的に、立ち上げっぱなしにしようかと思っています。
立ち上げっぱなしにしても、どうもうまく行かないんです。いま、PCの時刻をぐりぐりしてるんですが・・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) 【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法 4 2022/12/08 20:53
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
activ x について
-
Javaのダウンロード→インストー...
-
突然、関数が正常に表示しなく...
-
フラッシュメモリの不具合
-
Thunderbird 振り分けされなく...
-
SSDのTrimって毎日実行していい...
-
タスクスケジュールからのpsshu...
-
アカウント数調査
-
windowsサーバのデフラグをどの...
-
Google Analyticsの携帯向け解...
-
Excel VBA のマルチページ
-
至急教えてください
-
サーバのログ取集についての自動化
-
WSUSのインストールについて
-
2008Serverでタスクが実行されない
-
期限がきたらメールを送る仕組...
-
MODE関数を文字でできる関数は...
-
CHKDSKの実行を解除したい
-
マイクロソフトアクセスを開く...
-
PDFの件で教えてください。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Thunderbird 振り分けされなく...
-
xcopyバッチを管理者として実行...
-
JP1で月末以外で毎週月曜日のジ...
-
エクセルで定期的(30分おき)...
-
VBAのタイマー
-
MODE関数を文字でできる関数は...
-
2010でShiftキーを使っても自動...
-
ADのDC移行の手順を教えてください
-
batファイルの実行が1行目のみ...
-
bat 処理の中止
-
vbsファイルによるネットワーク...
-
x64とIA64の違い
-
WindowsServer2003の、SMB1.0を...
-
Teratermで、条件分岐させたい
-
SSDのTrimって毎日実行していい...
-
Excel VBA のマルチページ
-
タスクススケジューラを停止さ...
-
CHKDSKの実行を解除したい
-
ログオン・ログオフスクリプト...
-
ログオンユーザーがいない場合...
おすすめ情報