• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAの実行時エラー1004の解決方法)

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

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

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

  • ベストアンサー
回答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

専門家に質問してみよう