- ベストアンサー
エクセルVBAの実行時エラー1004の解決方法
- エクセルVBAの実行時エラー1004が表示される場合、'実行時エラー’1004’:’OnTimeメソッドは失敗しました;’_Application’オブジェクト'というエラーメッセージが表示されます。
- 'Sub 更新やめ()'のVBAを何度も実行すると、エラーメッセージが表示される問題が発生します。
- この問題を解決するためには、'Sub 更新やめ()'の実行前に、'Application.OnTime'メソッドの呼び出しを中断するコードを追加する必要があります。具体的には、'Application.OnTime tm, "更新", , False'というコードを追加します。これにより、'OnTime'メソッドが正常に中断されるため、エラーメッセージが表示されなくなります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ここで「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
その他の回答 (2)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
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
お礼
この度は回答して頂きありがとうございました。 参考になりました。
- fmxBeem
- ベストアンサー率54% (325/599)
単純にエラーを非表示にするなら「On Error Resume Next」を追記です。エラーによって処理を条件分岐したいなら「On Error Goto (エラー処理)」にして、コードの最後にSelect Caseか何かでエラー処理させたほうがいいですね。
お礼
この度は回答して頂きありがとうございました。 参考になりました。
お礼
この度は回答して頂き誠にありがとうございます。 無事に解決する事が出来ました。 ありがとうございました。