【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!
Excel (VBA) |
|
(指定なし : 指定なし)
『On Error Go To 0』がいまだに理解できない
投稿日時: 24/09/03 23:51:56
投稿者: けけちゃま
|
---|---|
いつもお世話になっております。
Private Sub メール送信画面作成() Dim objOutlook As Object Dim objMail As Object Dim isInit As Boolean Dim strSignature As String Dim strBody As String '取り敢えず取得してみる On Error Resume Next Set objOutlook = GetObject(, "Outlook.Application") On Error GoTo 0 If objOutlook Is Nothing Then 'outlookは起動していないので新しく起動 Set objOutlook = CreateObject("Outlook.Application") isInit = False Else isInit = True End If '新規メール作成 Set objMail = objOutlook.CreateItem(0) 'olMailItem=0 '件名 objMail.Subject = "件名です" '画面表示(表示しないとデフォルト署名が取れない) objMail.Display '署名取得 strSignature = objMail.Body '本文 strBody = "" strBody = strBody & "○○ 様" & vbCrLf strBody = strBody & "" & vbCrLf strBody = strBody & "いつもお世話になっております。" & vbCrLf strBody = strBody & "" & vbCrLf strBody = strBody & "あの件です" & vbCrLf objMail.Body = strBody & vbCrLf & strSignature If isInit = False Then '新規に起動した場合は開放しておく Set objOutlook = Nothing End If End Sub この11行目の「On Error GoTo 0」の存在意味がわからなくて、これを消しても通常通り起動するのです。 なぜこれが必要なのか、教えていただければ幸いです。。 私と同様の疑問をもったかたのサイトを見つけました。↓ https://terakoya.sejuku.net/question/detail/33210 が、結局下記のコードも「On Error GoTo 0」を削除しても結果は同じだったのです。 分かりやすい短いコードの例文があればいいのですが…。 Sub エラー処理の例() ' エラーハンドリングを無効にするために On Error Resume Next を使用 On Error Resume Next ' エラーハンドリングを無効化している間は、エラーが発生しても処理が中断されない Debug.Print 10 / 0 ' エラーハンドリングを再度無効化するために On Error GoTo 0 を使用 On Error GoTo 0 ' 特定の箇所のみでエラーハンドリングを行いたい場合、ここでエラーハンドリングを有効化する On Error GoTo ErrorHandler ' エラーハンドリングが有効化されているため、エラーが発生した場合に対応する処理を記述できる Debug.Print 10 / 0 Exit Sub ' エラーハンドラ ErrorHandler: MsgBox "エラーが発生しました!" ' エラーに対する具体的な処理を記述する Resume Next ' エラーハンドリングを再度無効化して次の行に処理を移行する End Sub |
投稿日時: 24/09/04 07:19:13
投稿者: simple
|
|
---|---|
Outlookが立ち上がっているかどうかを事前に簡単に調べる方法は無いので、
Sub myReset() On Error Resume Next Application.OnTime EarliestTime:=myTime, Procedure:="test", Schedule:=False On Error Goto 0 End Subと書くのが本来正しい。 ただ、直ぐにプロシージャを抜け、その場合は自動的にOn Error Resume Nextの効力はなくなるので省略したものです。 なお、ThisWorkbookモジュールで、Call Resetと書いたのは勿論ミスで、Call myResetが正しいですね。気づかれたと思いますが。 |
投稿日時: 24/09/04 09:04:45
投稿者: MMYS
|
|
---|---|
けけちゃま さんの引用: 試しで消すなら On Error Resume Next の方です。アウトルックが起動してない場合、どうな動きしますか。 詳細はsimpleさんが解説されてます。 On Error Resume Next を日本語に直訳すると「エラー時は無視して次の行から再開」です。 なんか、そのままだとヤバそうです。 例えるなら、コロナで緊急事態宣言した。でも、解除せずそのまま何年も放置。みたいな。 |
投稿日時: 24/09/04 09:58:00
投稿者: hatena
|
|
---|---|
すでに御二方から適切な回答が出ていますので、
けけちゃま さんの引用: 「分かりやすい短いコードの例文」を置いておきます。 Sub エラー処理の例() ' 以降のエラーを無視して次行から再開 On Error Resume Next ' 0除算エラーが発生するが、無視して次行からコードを実行 Debug.Print 10 / 0 ' 以前のエラー処理宣言(On Error Resume Next)を無効化 On Error GoTo 0 ' 0除算エラーが発生するのでここでエラーメッセージが出て停止 ' On Error GoTo 0がコメントアウトされている場合は、無視して次行へ Debug.Print 10 / 0 ' 以降エラーが出たら、ErrorHandlerラベルへ移動 On Error GoTo ErrorHandler ' 0除算エラーが発生したので、ErrorHandlerラベルへ移動 Debug.Print 10 / 0 Exit Sub ' エラーハンドラ ErrorHandler: MsgBox "エラーが発生しました!" ' エラーに対する具体的な処理を記述する Resume Next ' エラーが発生した次行からコードを実行 End Sub 上記のコードで、「On Error GoTo 0」をコメントアウトした場合とそうでない場合で、ステップ実行して動作を確認してみてください。 動作の違いがわかると思います。 |
投稿日時: 24/09/04 11:09:05
投稿者: Suzu
|
|
---|---|
On Error Go To 0 の必要性について
|
投稿日時: 24/09/04 22:35:53
投稿者: けけちゃま
|
|
---|---|
simple様
引用: 今、これをきいて思ったのですが、前回の質問の続きにもなってしまって大変恐縮ではございますが、簡易時計をSheet2のA1に置く目的が単に時計代わりであれば、Worksheet_Activate()ではなく、Workbook_Open() と Workbook_BeforeClose に書きコードを書けばいいかと思いつきました。 その場合なら、On Error Resume Next さえも書かなくてもよいと思い下記コードを書きました。 '【標準モジュール】 Option Explicit Dim myTime As Date Sub clock() myTime = CDate(Format(Now() + TimeValue("00:01:00"), "hh:mm:00")) Sheet2.Range("A1").Value = Now() Sheet2.Columns("A").AutoFit Application.OnTime myTime, "clock" End Sub Sub myReset() Application.OnTime EarliestTime:=myTime, Procedure:="clock", Schedule:=False End Sub myReset() '【ThisWorkbook モジュール】 Private Sub Workbook_BeforeClose(Cancel As Boolean) Call myReset End Sub Private Sub Workbook_Open() Call clock End Sub ただ、実験しているんですが、ブックを閉じようとするとなぜかエラーが生じるんです。 ブック開く→clock()起動<時刻表示とともに次回起動予約がセットされる。Worksheet_Activate()に書くとSheet2がアクティブになるたびに次回起動予約がセットされるから、いろんな起動予約がごちゃごちゃになって時計が複雑な動きになる。Workbook_Open()にかけば、開いたときの1回だけ実行されるので、データをリセットしなくても、閉じるときにリセットさえすればいい?> ブック閉じる→単に、clock()の次回起動予約を消すだけなのでエラーは想定されない。 と思うのですが…。なぜエラーが生じるんでしょうか・・・。 |
投稿日時: 24/09/04 22:40:13
投稿者: けけちゃま
|
|
---|---|
MMYS様
|
投稿日時: 24/09/04 23:12:34
投稿者: simple
|
|
---|---|
> ただ、実験しているんですが、ブックを閉じようとするとなぜかエラーが生じるんです。
|
投稿日時: 24/09/04 23:22:40
投稿者: けけちゃま
|
|
---|---|
hatena 様
|
投稿日時: 24/09/04 23:25:41
投稿者: けけちゃま
|
|
---|---|
Suzu様
|
投稿日時: 24/09/04 23:29:41
投稿者: simple
|
|
---|---|
続けての発言で恐縮。
|
投稿日時: 24/09/05 09:52:03
投稿者: 半平太
|
|
---|---|
下は、AI先生の説らしいですが、全体的に頓珍漢な話に感じますねぇ。
|
投稿日時: 24/09/05 22:03:39
投稿者: けけちゃま
|
|
---|---|
simple様
|
投稿日時: 24/09/05 22:12:12
投稿者: けけちゃま
|
|
---|---|
半平太様
|
投稿日時: 24/09/05 22:41:21
投稿者: けけちゃま
|
|
---|---|
simple様
引用: 申し訳ございません。最初に言ってくださっておりました…汗!! Outlook起動時には On Error Resume Next On Error GoTo 0 を使います!!! |
投稿日時: 24/09/05 23:09:51
投稿者: simple
|
|
---|---|
(1)
|
投稿日時: 24/09/05 23:46:43
投稿者: けけちゃま
|
|
---|---|
simple様
Sub myReset() Application.OnTime EarliestTime:=myTime, Procedure:="clock", Schedule:=False End Sub myReset() 実はわたしも投稿したあとに「あ、余計なやつ入ってしまった・・」と思ったんですが、ばれましたよね。 my Reset はただの消し忘れであって、実験中は特にこれは起動しておりませんでした。 紛らわしくて申し訳ございません…。 (2) !! そうです!!OneDriveに保存しておりました!そやつだったんですね! (OneDriveのメリットデメリットがよくわかっていないんですが、マクロとは相性悪いんですかね、明日ITの人に聞いてみます) (3) まさか答えがここまで返ってくるなんて…敬服いたします。ありがとうございます泣。 (なんか本当すみません、、すごい時間をさいてもらっている気がします) Existsメソッドですね。ちょっと頭パンクしかけておりますが、参考にいたします!! |
投稿日時: 24/09/06 21:16:52
投稿者: けけちゃま
|
|
---|---|
皆様、ありがとうございました。
|