エクセルVBAの実行時エラー1004の解決方法

このQ&Aのポイント
  • エクセルVBAの実行時エラー1004が表示される場合、'実行時エラー’1004’:’OnTimeメソッドは失敗しました;’_Application’オブジェクト'というエラーメッセージが表示されます。
  • 'Sub 更新やめ()'のVBAを何度も実行すると、エラーメッセージが表示される問題が発生します。
  • この問題を解決するためには、'Sub 更新やめ()'の実行前に、'Application.OnTime'メソッドの呼び出しを中断するコードを追加する必要があります。具体的には、'Application.OnTime tm, "更新", , False'というコードを追加します。これにより、'OnTime'メソッドが正常に中断されるため、エラーメッセージが表示されなくなります。
回答を見る
  • ベストアンサー

エクセルVBAの実行時エラー1004の解決方法

Private tm As Double Sub Auto_Open() Call 更新 End Sub Sub 更新() Application.Calculate tm = [now()+timevalue("00:00:10")] Application.OnTime tm, "更新" End Sub '===================================================== Sub 更新やめ() Application.OnTime tm, "更新", , False End Sub この様なVBAがあります。 ここで「Sub 更新やめ()」のVBAを何度も実行すると「実行時エラー’1004’:’OnTimeメソッドは失敗しました;’_Application’オブジェクト」と表記されます。 何度も実行しても上記の表示が出ない様にする為のVBAはどの様に改造すれば良いでしょうか?

noname#247334
noname#247334

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8516/19359)
回答No.2

>ここで「Sub 更新やめ()」のVBAを何度も実行すると 一旦、 Application.OnTime tm, "更新", , False で解除したタイマースケジュールを、もう一度 Application.OnTime tm, "更新", , False で解除しようとすると、実行時エラー1004になります。 なので「一度解除したら、二度は解除しない」という処理にしないといけません。 例えば「解除したら、tmの値を、過去の時刻に書き換え、tmが過去の時刻を示していたら解除済みとして二度以上は解除しない」などの工夫をしましょう。 もちろん「On Error Resume Next」で誤魔化すって手もありますが「別のエラーが出た時に、エラーで止まらず、意図しない動作をしてしまう可能性がある」ので、On Error Resume Nextの使用はお勧め出来ません。 以下のように改造しましょう。 Sub 更新やめ() If tm >= now() Then Application.OnTime tm, "更新", , False tm = DateValue("1900/01/01") End If End Sub あと、tm変数はDouble型ではなく、Date型で宣言しましょう。 Private tm As Double を Private tm As Date に直しましょう。 また、変数をPrivateで持つなら、以下のようにするのも手です。 Private tm As Date Private AbortFlag As Boolean Sub Auto_Open() AbortFlag = False Call 更新 End Sub Sub 更新() If AbortFlag = True Then Exit Sub Application.Calculate tm = [now()+timevalue("00:00:10")] Application.OnTime tm, "更新" End Sub Sub 更新やめ() AbortFlag = True End Sub Sub 更新再開() AbortFlag = False Call 更新 End Sub

noname#247334
質問者

お礼

この度は回答して頂き誠にありがとうございます。 無事に解決する事が出来ました。 ありがとうございました。

その他の回答 (2)

回答No.3

Excel は一度も扱ったことがない門外漢ですが・・・。私なら、エラーの発生そのものを回避します。しかし、エラートラップは{それはそれと}して書きます。 Option Explicit Private tm As Double Private isSchedule As Boolean Sub Auto_Open()   Call 更新 End Sub Sub 更新()   isSchedule = True   Application.Calculate   tm = [now()+timevalue("00:00:10")]   Application.OnTime tm, "更新" End Sub Sub 更新やめ() On Error GoTo Err_更新やめ   If isSchedule Then     Application.OnTime tm, "更新", , False     isSchedule = False   End If Exit_更新やめ:   Exit Sub Err_更新やめ:   MsgBox "実行時にエラーが発生しました。(更新やめ)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description, vbExclamation, " 関数エラーメッセージ"   Resume Exit_更新やめ End Sub

noname#247334
質問者

お礼

この度は回答して頂きありがとうございました。 参考になりました。

  • fmxBeem
  • ベストアンサー率54% (325/599)
回答No.1

単純にエラーを非表示にするなら「On Error Resume Next」を追記です。エラーによって処理を条件分岐したいなら「On Error Goto (エラー処理)」にして、コードの最後にSelect Caseか何かでエラー処理させたほうがいいですね。

noname#247334
質問者

お礼

この度は回答して頂きありがとうございました。 参考になりました。

関連するQ&A

  • エクセルVBA

    VBAの素人です。 以下のようなVBAを実行しようと、何とか形にしました。 単独のBOOKではうまくいくのですが、同時に他のBOOKを開くと 「インデックスが有効範囲にありません」とエラーになります。 エラー箇所は、With Sheets("Sheet1").Range("B1")部分です。 修正をご教示頂ける方、何卒よろしくお願い致します。 全くVBA無知なのにすみません。 Private Sub Workbook_Open() test01 test02 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub Sub 終了() Application.OnTime Now + TimeValue("0:00:02"), "test01", , False ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("Sheet1").Range("B1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:02"), "test01" End Sub Sub test02() With Sheets("Sheet1").Range("B2") .Value = Time .NumberFormatLocal = "mm:ss" End With End Sub

  • エクセルVBA 10分後にエクセル自動終了&カウン

    どなたかご教授お願い致します。 ・エクセルの当該ブックを、起動10分後に自動終了(保存しない)させる ・開いている間は、10分のカウントダウンを「分:秒」でA1セルに表示する 以上を実行したいのですが、VBAは全く素人ですので、うまくいきません。 見よう見まねで、以下のようなことをしましたが、結局ダメでした。 何卒、よろしくお願い致します。 ThisWorkbook Workbook Open Private Sub Workbook_Open() test01 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub 標準モジュール Module1 Sub 終了() ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("バックアップ").Range("A1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:01"), "test01" End Sub

  • Excelの三つのVBAを一つにまとめる。

     初めまして、よろしくお願いします。当方全くの素人でVBAの基礎もよくわからず、ネットから拾ってきていじった三つのVBAがあります。この三つ、一つ一つは個別に機能するのですが、VBAとして正しいのかさえよく解っていません。この三つを一つにまとめて、同時に機能するようにしたいと頭を抱えています。 Sub TEST() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Range("b10:b20").Insert shift:=xlShiftToRight Range("b10:b20").Value = Range("a10:a20").Value Application.OnTime TimeValue("09:00:00"), "TEST" Application.ScreenUpdating = True Application.EnableEvents = True ActiveWorkbook.Save End Sub ________________________________________________________________ Sub TEST1() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Dim myCnt As Long Range("c30:c40").Copy Range("d30:d40").PasteSpecial Paste:=xlPasteValues Range("b30:b40").Copy Range("c30:c40").PasteSpecial Paste:=xlPasteValues Range("a30:a40").Copy Range("b30:b40").PasteSpecial Paste:=xlPasteValues nextTime = Now() + TimeValue("01:00:00") Application.OnTime nextTime, "TEST1" Application.ScreenUpdating = True Application.EnableEvents = True ActiveSheet.Calculate ActiveWorkbook.Save End Sub ________________________________________________________________ Sub TEST2() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Dim myCnt As Long Range("c50:c60").Copy Range("d50:d60").PasteSpecial Paste:=xlPasteValues Range("b50:b60").Copy Range("c50:c60").PasteSpecial Paste:=xlPasteValues Range("a50:a60").Copy Range("b50:b60").PasteSpecial Paste:=xlPasteValues nextTime = Now() + TimeValue("00:10:00") Application.OnTime nextTime, "TEST2" Application.ScreenUpdating = True Application.EnableEvents = True ActiveSheet.Calculate ActiveWorkbook.Save End Sub ________________________________________________________________  解る方、よろしくお願いします。

  • エクセル2007です。VBA不具合について教えてください。

    不具合ついてですが、任意のセルに何か入力中の時にA1の表示が停止してしまうことです。 入力中でもこれを回避する方法がありましたら是非お知恵を拝借したいと思います。よろしくお願いします。 現在の環境は以下のとおりです。 セルA1は=now()で秒まで表示。 横軸に日付(B2=2010/1/18~I2=2010/1/25)の8日、縦軸に時間(A3=0~A27=24)の24時間割があるシートです。 日付と時間(HOUR)がマッチしたリアルタイムセルのみを緑色(条件付き書式にて)に塗りつぶすスケジュール表を作成中です。 標準モジュールは次のとおりです。 Sub Auto_Open() Application.OnTime Now + TimeValue("00:00:01"), "timer" End Sub Sub timer() With Worksheets("Sheet1") If .Cells(1, 2) <> "" Then Exit Sub .Cells(1, 1).Calculate End With Application.OnTime Now + TimeValue("00:00:01"), "timer" End Sub

  • エクセルシートの順繰り表示マクロについて

    エクセルにて随時更新されるデータを全画面表示し、3枚のシートを5秒置きに順繰り表示させるようマクロを組みました。始めは順調なのですが、数時間たつとフリーズしてしまいます。そもそもエンドレスのマクロプログラム実行に無理があるのでしょうか。 または下記のプログラムに問題があるのでしょうか。ご教授お願いします。 Sub Macro1() Sheets("Sheet2").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro2" End Sub Sub Macro2() Sheets("Sheet3").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro3" End Sub Sub Macro3() Sheets("Sheet1").Select Application.OnTime Now + TimeValue("00:00:05"), "Macro1" End Sub

  • On Timeメソッド?で更新されません。

    On Timeメソッド?で更新されません。 現在Web上にあった例を参考に 下記の様にホワイトボード解析シートのA1セルに 20秒ごとに現在時刻を表示させています。 これを応用して、違うシートに 17:00に天気というマクロを実行するよう 作成したのですが上手くいきませんでした。 Sub Auto_Open()とSub auto_close()のtargetTimeを targetTime = TimeValue("17:00") Macro7を天気 としたのですが、なぜ更新されなかったか分かる方がいらっしゃいましたら ご教授下さい。 Sub Auto_Open() Dim TargetTime, WaitTime TargetTime = Now + TimeValue("00:00:01") WaitTime = TimeValue("00:00:10") Application.OnTime TargetTime, "Macro7", WaitTime End Sub Sub Macro7() On Error Resume Next Worksheets("ホワイトボード解析").Range("A1").Calculate Application.OnTime Now + TimeValue("00:00:20"), "Macro7", TimeValue("00:00:10") '↑TimeValueの最初の方をへんこうする事で時間が変わる End Sub Sub auto_close() Dim i As Integer, TargetTime On Error Resume Next For i = 1 To 10 TargetTime = Now + TimeValue("00:00:" & Application.Text(i, "00")) Application.OnTime TargetTime, "Macro7", , False Next i End Sub

  • セルの現在時刻表示の更新間隔をセルから入力したい

    セルの現在時刻表示の更新間隔をセルから入力したい マクロは以下を使用してますが更新間隔変更のtimevalue(c3)とするとエラー13が出ます。 どなたかお教え下さい。 ******************************************** Sub Auto_Open() Dim TargetTime, WaitTime TargetTime = Now + TimeValue("00:00:01") WaitTime = TimeValue("00:00:10") Application.OnTime TargetTime, "Macro1", WaitTime End Sub Sub Macro1() Dim TargetTime, WaitTime Calculate TargetTime = Now + TimeValue("00:00:01") 'ココをセルにするとエラー13がでる WaitTime = TimeValue("00:00:10") Application.OnTime TargetTime, "Macro1", WaitTime End Sub Sub auto_close() Dim i As Integer, TargetTime On Error Resume Next For i = 1 To 10 TargetTime = Now + TimeValue("00:00:" & Application.Text(i, "00")) Application.OnTime TargetTime, "Macro1", , False Next i End Sub **********************************************

  • 割り込み処理

    Application.OnTimeで一定時間後に処理をさせたいのですが For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。 ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか? Option Explicit Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Call M1 End Sub Private Sub M1() Dim i As Integer Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2" For i = 0 To 30 Range("A1") = i Sleep 1000 Next i End Sub Sub M2() MsgBox ("123") End Sub

  • ontimeのリセット方法

    簡単な問題を出すexcelを作っています。 問題を出した時点でタイマー(ontime)を出し、 1分間だけ猶予を持たせ、 回答が出ればリセットをする。 間に合わなければ「残念でした」を出そうとしています。 Sub start8() Application.OnTime Now + TimeValue("00:01:00"), "timeout8" End Sub Sub reset8() Application.OnTime Now + TimeValue("00:01:00"), "timeout8", , False End Sub Sub timeout8() "残念でした。" End Sub 見よう見まねで上記の通り書きましたが、 分からないのは、これだとresr8の引き金を引いてから、1分後のように思います。 ここはどのように書けばいいのでしょうか。 Application.OnTime Now + TimeValue("00:00:00"), "timeout8", , Falseのように書いてみましたが、 エラーになります。 制限時間内にリセットボタンを押せば何事もなかった、という風にやりたいのです。 宜しくお願いします。

  • エクセル時間毎ごとにマクロを実行するやり方。

     初めまして、よろしくお願いします。より正確な指定時間毎にマクロを実行させるやり方を考えています。  1分毎ごとにマクロを実行する nextTime = Now() + TimeValue("00:01:00") Application.OnTime nextTime, "時間毎ごとに実行" というやり方は解るのですが、 Application.OnTime TimeValue("09:00:00"), "時間毎ごとに実行"  この指定時間("09:00:00")に実行するマクロを利用し ("09:01:00")、("09:02:00")、("09:03:00")、("09:04:00")、("09:05:00"),・・・・・の時間、秒が00になると("hh:ss:00")マクロを実行されるやり方は有るのでしょうか。  もし有るのでしたら、よろしくお願いします。

専門家に質問してみよう