- ベストアンサー
ExcelVBA マクロエラー値の取り出し方
- Excel2002VBAを利用してcsvファイルを読込み、任意のシートへ貼り付ける処理を作成しています。
- フォームのボタン押下により、マクロ記録で作成したシートへの貼りつけ処理を行う際、csvファイルが存在していないと、Err.Number=1004が発生してしまいます。
- これをOnErrorでキャッチしてマクロの中でWk_ErrCode(フォームモジュールでPublicで定義)へセットし、フォームモジュールへ戻る処理を組んだのですが、戻り値が0になってしまい、後続処理を迂回出来ない様です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
たびたび済みません。#2のコードは誤りでした。 エラー処理内で On Error Resume Next を 実行しいるので、エラー処理部分の意味が消失しています。 流れ的に正しいのは以下になります。 Public Wk_ErrCode As long Sub main() On Error Resume Next 'エラーは流す Workbooks.Open _ Filename:="C:\..\Book.csv" 'エラー発生行 Wk_ErrCode = Err.Number 'パブリック変数に格納 If Wk_ErrCode <> 0 Then 分岐作業1 Else 分岐作業2 End If End Sub すっきりしましたね。エラーを流して、予期されるエラーコードに対応した処理を用意しています。 なんか混乱させてしまいました。申しわけ有りません。
その他の回答 (2)
- komet163
- ベストアンサー率51% (22/43)
ご質問の内容の処理はこんな感じですか? Public Wk_ErrCode As long Sub main() On Error GoTo ERRCODE Wk_ErrCode = 0 '初期化 Workbooks.Open _ Filename:="C:\..\Book.csv" 'エラー発生行 If Wk_ErrCode <> 0 Then 分岐作業1 Else 分岐作業2 End If Exit Sub '以下エラー処理 ERRCODE: Wk_ErrCode = Err.Number 'パブリック変数に格納 On Error Resume Next 'この処理内でエラーを解決してないので必要 Resume 'エラー発生行に戻る End Sub 上記の流れだと動く事は確認しました。 また、ファイルの有無で分岐するには、 If Dir("C:\..\Book.csv") = "" Then CSVファイルが存在しない処理 Else CSVファイルが存在する処理 End If が簡単だと思います。
補足
何度もご迷惑掛けます。 概ね記入して頂いた流れの処理で私の方の処理と有っております。OnErrの処理へ飛ばした後、selectで Err.Numberが1004のケースは、MsgBoxで”ファイル無し”の旨を表示し、Wk_ErrCodeにErr.Numberをセットしてメイン処理に戻してます。メインの次行でWk_ErrCodeを判断、後続処理の迂回判定としております。 後ろに書いて頂いた判定処理を該当処理の前へ付けておくのが無難な気がして来ました…。 質問をUPしているPCとVBA作っているPCが異なり、環境を接続できない為、ソースを貼り付け出来ず御面倒をお掛けしました。
- komet163
- ベストアンサー率51% (22/43)
Err の内部情報は、明示的に Clear したり、 エラー処理先で、再度 On Error 構文を使用 しない限り保持すると考えています。 対処としては、コードをチェックされてみては? しかし、エラー発生のプロセスが判っているときは、 発生を未然に防ぐ方がスマートですよ。
補足
回答有難うございます。 マクロ内部でOn Error処理を行い、その値をPublic定義したWk_ErrCodeにセット、戻り行(マクロ呼出し行の次行)で判定(Wk_ErrCode<>0)しているので、問題ないと思ったのですが、0で通過してしまいました。Wk_ErrCodeをErr.Numberに変更し、試しても状況に変更は有りませんでした。尚、Err.Numberのリセットは実施していないのですが・・・
お礼
こちらこそ何度も有難うございました。 勉強させて頂きました。 また宜しく御願いします。