
No.8ベストアンサー
- 回答日時:
えーー。
。実際に使うなら、zap35 さんのように、OnTime で実行したマクロの中で再度 OnTime を登録する方が良いと思います。
この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。
今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。
コードのままだと、午前10時~午後6時まで30分間隔で Macro1 を実行します。
変更点は、
・ブッククローズをトラップした
・進捗状況をステータスバーに表示するようにした
・その他しょうもないこと
です。
このままコピペで使えると思いますが、試される場合は、MACRO1 はご自分の
用途に合わせて適切に修正して下さい。
Option Explicit
Dim mcolTask As Collection
Sub 実行予約()
Dim i As Date
Dim strProcName As String
Dim datBigin As Date
Dim datEnd As Date
Dim datInterval As Date
Dim datTimeout As Date
Dim blnJustTime As Boolean
' Setting-------------------------------------------------------
datBigin = TimeValue("10:00:00") ' 開始時刻
datEnd = TimeValue("18:00:00") ' 終了時刻
datInterval = TimeValue("00:30:00") ' 実行間隔(少なくとも数秒以上で)
datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
blnJustTime = True ' datInterval で丸めるか
strProcName = "MACRO1" ' 実行するマクロ名
'---------------------------------------------------------------
' 既に実行予約されているか確認
If mcolTask Is Nothing Then
' 日付シリアル値を加算
datBigin = datBigin + Date
datEnd = datEnd + Date
' 終了時刻が開始時刻より小さければ日をまたぐので補正
If datEnd < datBigin Then datEnd = datEnd + 1
' 現在時刻が既に終了時刻を過ぎている場合
If datEnd < Now() Then
MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
Exit Sub
End If
' 現在時刻が開始時刻を過ぎていれば補正
If datBigin < Now() Then
' 開始時刻を datInterval で指定された値で丸めるか
If blnJustTime Then
datBigin = Application.Floor(Now() + datInterval, datInterval)
Else
datBigin = Now() + datInterval
End If
End If
' 初期化
Set mcolTask = New Collection
' メイン部分
For i = datBigin To datEnd Step datInterval
' 後から取り消せるようにコレクションに退避
mcolTask.Add CStr(i) & "," & strProcName
' Application.Ontime で実行予約を行う
Application.OnTime EarliestTime:=i, _
Procedure:=strProcName, _
LatestTime:=i + datTimeout, _
Schedule:=True
Next i
Else
MsgBox "既に実行中です", vbInformation
End If
End Sub
Sub 未実行予約強制解除()
Dim i As Long
Dim vntS As Variant
On Error Resume Next
Application.StatusBar = "タスク破棄中... "
For i = 1 To mcolTask.Count
vntS = Split(mcolTask.Item(i), ",")
Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
Next i
Application.StatusBar = ""
Set mcolTask = Nothing
End Sub
' タスク管理用
Private Sub RemoveTask()
On Error Resume Next
mcolTask.Remove (1)
Application.StatusBar = "待機中のタスク... " & mcolTask.Count
DoEvents
Beep
If mcolTask.Count = 0 Then
Application.StatusBar = ""
Set mcolTask = Nothing
End If
End Sub
Sub Auto_Close()
Dim intRes As Integer
If Not mcolTask Is Nothing Then
intRes = MsgBox( _
Prompt:="待機中のタスクが " & mcolTask.Count & " 件あります。" & vbLf _
& "破棄して終了しますか?", _
Buttons:=vbOKCancel + vbDefaultButton2 + vbExclamation, _
Title:="問い合わせ")
If intRes = vbOK Then
Call 未実行予約強制解除
Else
' ブッククローズをキャンセル
Application.ExecuteExcel4Macro ("Halt(True)")
End If
End If
End Sub
' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()
Dim lngRow As Long
With ThisWorkbook.Sheets("Sheet1")
lngRow = .Range("V65536").End(xlUp).Offset(1).Row
.Cells(lngRow, "V").Resize(1, 3).Value = .Range("Q12:S12").Value
.Cells(lngRow, "Y").Value = Now()
End With
' ご自分のマクロの最後に次の一行を追加しておいて下さい
Call RemoveTask
End Sub
ありがとうございました。
頂いた記述を少々加工して月曜の値動きに使ってみましたら、ばっちり動いて非常に満足な結果です。
これとっても良さそうです。
本当にありがとうございました。
No.7
- 回答日時:
あ、、、すみません。
Setting 欄、コメントと全然違いますね。
30秒間を10秒間隔でテストしたときのものです。
直すの忘れました。
適切に書き直して下さい。
No.6
- 回答日時:
Application.OnTime は手軽な反面、結構扱いが難しいかもしれません。
実行予約のキャンセルとか、2重予約のトラップとか。
その辺も含めてコーディングしてありますが、ザッと作ったので穴があるかも
しれません。
実行予約の Setting という場所を変更してみて下さい。
あとは、OnTime だと待機中は普通に Excel が使えてしまうので、不意にブック
が閉じられてしまうのをトラップする必要があるかもしれません。
ご参考までに。では。
Option Explicit
Dim mcolTask As Collection
Sub 実行予約()
Dim i As Date
Dim strProcName As String
Dim datBigin As Date
Dim datEnd As Date
Dim datInterval As Date
' Setting-------------------------------------------------------
' 開始時刻: 例えばマクロが実行された時刻
datBigin = Now()
' 終了時刻: 例えば当日午後6時まで
datEnd = Now() + TimeValue("00:00:30")
' 実行間隔: 例えば5秒間隔
datInterval = TimeValue("00:00:10")
' 実行するマクロ名
strProcName = "MACRO1"
'---------------------------------------------------------------
' 既に実行予約されているか確認
If mcolTask Is Nothing Then
' 初期化
Set mcolTask = New Collection
' 開始時刻が現在時刻より早い場合は補正
If datBigin < Now() Then datBigin = datBigin + datInterval
' 実行予約メイン部分
For i = datBigin To datEnd Step datInterval
' 後から取り消せるように退避しておきます
mcolTask.Add CStr(i) & "," & strProcName
' Application.Ontime で実行予約します
Application.OnTime i, strProcName, Schedule:=True
Next i
Else
MsgBox "既に実行予約されています", vbInformation
End If
End Sub
Sub 未実行予約強制解除()
Dim i As Long
Dim vntS As Variant
On Error Resume Next
For i = 1 To mcolTask.Count
vntS = Split(mcolTask.Item(i), ",")
Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
Next i
Set mcolTask = Nothing
End Sub
' タスク管理用
Private Sub RemoveTask()
mcolTask.Remove (1)
If mcolTask.Count = 0 Then
Set mcolTask = Nothing
End If
End Sub
' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()
'シート名は明示的に指定した方が良いですよ
With ThisWorkbook.Sheets("Sheet1")
.Activate
.Range("Q12:S12").Copy
.Range("V65536").End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues
End With
' ご自分のマクロの最後に次の一行を追加しておいて下さい
Call RemoveTask
End Sub
ありがとうございます。
これはそのまま貼り付けて使えるものなのでしょうか? これが理解できたら本当に面白そうです。
自宅に戻って試してみます
ありがとうございました。
No.5
- 回答日時:
#04です。
#04ではループしちゃいますね。再掲します。Bookを開いた時から一定間隔でマクロを実行します。Sub Auto_Open()
TargetTime = Now + TimeValue("00:10:00") '現在時刻より10分後
WaitTime = TimeValue("00:02:00") 'TargetTimeに他処理実行中の時のWaitTime
Application.OnTime TimeValue(TargetTime), "Macro1", TimeValue(WaitTime)
End Sub
Sub Macro1()
Range("Q12:S12").Select
Selection.Copy
Range("V65536").End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
TargetTime = Now + TimeValue("00:10:00") WaitTime = TimeValue("00:02:00") Application.OnTime TimeValue(TargetTime), "Macro1", TimeValue(WaitTime)
End Sub
ただし質問者さまのマクロは別のシートを開いているときなどにエラーになる可能性があります。
Worksheets("シート名").Range("Q12:S12").Copy
のようにワークシートを明示した方がよいです
ばっちり上手く行きそうです。
現在仕事中なので終わってからみっちりと検証しようと思いますが、今の所想像通りの動きをしています。
本当にありがとうございました。
No.4
- 回答日時:
指定時刻に指定するマクロを実行させる命令はあります。
詳しくは下記URLを参照して下さい。(著作権があるので引用はしません)質問者さまが作成したマクロを Macro1 として
Auto_Open()
DO
指定時刻 = 現在時刻 + n分
指定時刻に Macro1を実行
LOOP
End sub
とすれば良いと思います
参考URL:http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv214.html
No.3
- 回答日時:
Application.OnTime じゃダメ?
OnTime メソッド
指定された時刻 (特定の日時、または特定の期間の経過後) にプロシージャを実行します。
この回答への補足
早速ありがとうございます。
ON TIME メソッドと云う言葉は 他の質問者様への回答で目にした事はありますが、それが私のパターンで有効なのか、又どのように活用していいのかもまったく分かりません。
しかし「特定の期間の経過後にプロシージャを実行する」と云うのは凄く良さそうに思えます。
ON TIME メソッド のやり方はどのようにするのでしょうか? 現在のマクロの書き込み
Range("Q12:S12").Select
Selection.Copy
Range("V65536").End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
こんな感じですが、これに on time メソッドをどう加えたら宜しいのでしょうか?
No.1
- 回答日時:
たぶんエクセルVBAにはタイマーコントロールが無かったと思います。
がんばれば作れそうな気もしますが・・
下記のフリーソフトを使うほうが早いです。
参考URL:http://www.vector.co.jp/soft/win95/prog/se286953 …
ありがとうございました。
僕の質問の件は#4 #5サンの回答で解決いたしました。 しかし フリーソフトを使ってどんどん進化させそうなきもいたします。 ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) エクセルでキーリストからデータを取り出して1枚1枚印刷するには? 11 2022/06/27 09:52
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
- Visual Basic(VBA) エクセル マクロ 指定日の指定時刻にプロシージャを実行 4 2022/04/17 16:44
- Excel(エクセル) 記録マクロのみでできますか? 7 2022/08/07 20:38
- その他(Microsoft Office) エクセルのマクロについて教えてください。 5 2023/01/21 09:39
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルでVBAを使用して1分毎にファイルを保存するプログラムを書きた
Excel(エクセル)
-
エクセル時間毎ごとにマクロを実行するやり方。
Excel(エクセル)
-
Excel(エクセル) VBA プロシージャーをミリ秒で繰り返し実行する方法
Excel(エクセル)
-
-
4
「一定の時間間隔で5秒毎にMacro1を実行する」
Excel(エクセル)
-
5
VBA=一定時間エクセルの入力操作がない場合、自動的にそのブックを閉じたい
Windows Vista・XP
-
6
エクセルVBAにおけるON TIMEメソッドの解除方法について
Visual Basic(VBA)
-
7
エクセルのマクロを一定時間ごとに実行
Excel(エクセル)
-
8
Excelマクロにて、タイマーで自動更新は出来るのでしょうか?
Visual Basic(VBA)
-
9
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
10
vba セルに入力した時間をマクロで受け取るには?
Excel(エクセル)
-
11
毎日指定時刻に自動でエクセルを開き、マクロを起動する方法
Visual Basic(VBA)
-
12
マクロ 実行ボタンを押さずに常に実行
Excel(エクセル)
-
13
エクセル マクロ 一定時間おきにセルをクリック
Excel(エクセル)
-
14
時間のマクロで最初はその時間、2回目以降は15分ごとに自動で実行させたい。
Excel(エクセル)
-
15
エクセル マクロ 指定日の指定時刻にプロシージャを実行
Visual Basic(VBA)
-
16
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
17
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
18
Excelのセルにユーザー名を表示する方法
Excel(エクセル)
-
19
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
20
EXCELVBAを使ってシートを一定時間ごとに連続で切り替えるマクロを
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Thunderbird 振り分けされなく...
-
vbsファイルによるネットワーク...
-
xcopyバッチを管理者として実行...
-
エクセルで定期的(30分おき)...
-
システムの復元後のエラー
-
SSDのTrimって毎日実行していい...
-
管理と起動
-
Xpマシンですが、時々動作が...
-
httpポートでlinuxサーバ管理
-
x64とIA64の違い
-
様々な環境におけるソフトの動...
-
VBAのタイマー
-
システム開発の種類
-
汎用機(vos3)の使用方法を教...
-
Tera Termでのコマンド流し込み...
-
NetBTエラーとbrowserエラーが多発
-
ブックマークしたことは、サイ...
-
フォルダのサムネイル画像
-
撮影後、SDカードに作成される...
-
【Ciscoコマンド】interface As...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Thunderbird 振り分けされなく...
-
xcopyバッチを管理者として実行...
-
JP1で月末以外で毎週月曜日のジ...
-
エクセルで定期的(30分おき)...
-
SSDのTrimって毎日実行していい...
-
ADのDC移行の手順を教えてください
-
WindowsServer2003の、SMB1.0を...
-
2010でShiftキーを使っても自動...
-
Teratermで、条件分岐させたい
-
CHKDSKの実行を解除したい
-
ポリシーによる自動ログオフ
-
bat 処理の中止
-
VBAのタイマー
-
bashで15分前と現在のエポック...
-
スクリプトエラー表示
-
Teratermマクロ動作について
-
MODE関数を文字でできる関数は...
-
タスクがSYSTEMアカウントで実...
-
ログオフ状態でパソコンをシャ...
-
batファイルの実行が1行目のみ...
おすすめ情報