- 締切済み
マクロで真っ暗 (エラートラップについてです見捨てないで~)
<エラーが発生したマクロ文を特定したいのですが> 作成したマクロ(Excel2kです)実行中に、 思わぬ不運にみまわれて、やむなくエラー発生となり お先真っ暗・・・となったばあい、 On Error文を使って対応指針を表示させたいと思うのは, 変な病気なのでしょうか。 Err.Descriptionプロパテ-の内容は(確かに正しいあんたはえらいと思うのでありますが) 素人目には(不親切だな~)と感じることがあります。 ex.) 開いたbookで指定のsheetを探したけど無かった場合・・・ (期待値):"お探しのシートはこのbookにはありませんよお客さん他をあたってね" (実際 ):"インデックスは有効範囲にゃ~ありませんぜ他をあたりな" エラーが発生する可能性のある文すべてを対象にエラー内容を全予測して、 前後の文脈やエラーに至ったオペレーション記録などから 操作の当事者レベルに応じて妥当な解決方法を導き出すメッセージを3秒以内で・・・ 一生かかってもムリっぽいのでこれはあきらめました。 (労苦の上に努力を重ねるパイロットさんが職失ってしまいますよね) <<-- 質問です -->> ほのかわり、初動調査のあしがかりとして、マクロ記述内でエラーの発生した<文&場所>を 明確に表示する方法なんかありませんでしょうか?(msgboxでだしたい) Resumeって書くとエラー発生文に戻るみたいなので内部的に情報保持してる とおもうのですが開示のしかたがわかりません・・・ デバグ途上でOn Error記述なしだとvb editerが該当文を指摘してくれるんですが 作成ツールとしてはOnErrいれちゃいたいのです。 長々すいません、このコーナーには何度か投稿してるのですが、 いつも多数の親切な回答でソッコー解決してしまうので、また書いてしまいました。 よろしくおねがいします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ARC
- ベストアンサー率46% (643/1383)
> システムがエラーとして検知した<まくろ本文>を取得する”公式” (それ一文のみの記述で全ステートメントに有効な) のようなものがあればなあ~とおもい当質問にいたったのでした。 うーん、これは現時点ではどうしようもないですねぇ。 仰るように、エラー処理は昔っからどうしようもなく手間がかかるものでして、私もプログラムしながら何度「もっと楽になったらなぁ。」と思ったか分かりません。 仮に、エラーの起こった行を取得したとしても、その行の構文を解析して、 Set mySheet = Workbooks(0).Worksheets("ほげほげ") から「ほげほげ」を取得するのは想像以上に厄介です。 SheetNo = 1 Set mySheet = Workbooks(0).Worksheets("Sheet" _ & SheetNo + 1) なんて書き方をされた日にゃ、これを解析するプログラムを作るだけでソフト1本分以上の手間がかかってしまうかも(^^; もっと簡単そうなのは、自作関数を使う手でしょうか。 Public Function CheckSheet(SheetName As String, Optional TargetBook As Workbook) As Worksheet On Error Resume Next If TargetBook Is Nothing Then Set TargetBook = Workbooks(0) If Err <> 0 Then MsgBox "ワークブックが開いていない。" Err.Clear Exit Function End If End If Set CheckSheet = TargetBook.Worksheets(SheetName) If Err <> 0 Then MsgBox "指定したワークシートは存在しません。" & vbNewLine _ & SheetName Set CheckSheet = Nothing Err.Clear End If End Function ってなコードを書いておいて、ワークブックを開くときに、 Set mySheet = CheckSheet("Sheet1") みたいな感じで呼び出すと、比較的簡単にエラーチェック出来ます。 あと、エラー処理に関しては、多分Officeの次の次のバージョンあたりで、「例外処理」という考え方が取り入れられると思います。 これを使えば、今よりは若干エラー処理がやりやすくなるものと思います。 (といっても、コードが見やすくなるだけで、エラー処理の手間自体は大して変わらないんですが。)
- ARC
- ベストアンサー率46% (643/1383)
ありゃりゃ。2、3日前に回答したつもりで、きちんと登録できてませんでした。 下記のようにコーディングすれば、可能かと思います。 でも、ProcessNameに関する処理は、手間だけかかって、得るものはそんなに多くありませんヨ。(経験済) 私の記憶が確かなら、昔は、ERLなんて関数があって、エラーの発生した行が取得できたように思います。今は、消えてなくなりましたけどね。 あと、Office2000 Developer EditionってパッケージのOffice(結構高価い)には、「VBAエラー処理ルーチン」っていうアドインプログラムが含まれていまして、これを使用すると、一般的なエラー処理がマウスクリックのみで作成できる上、モジュール名、関数名まで自動で挿入してくれます。 Public Sub ErrorTest() Const FunctionName = "ErrorTest" Dim ProcessName As String Dim dummy As Long '一般的なエラーはHandleErrで処理する。 On Error GoTo HandleErr ProcessName = "割り算" dummy = 1 / 0 '一時的に別のエラーを表示する ProcessName = "シート取得" On Error Resume Next Set mySheet = Workbooks(0).Worksheets("ほげほげ") If Err <> 0 Then MsgBox "「ほげほげ」なんてシートはどこにも無いよぉ。(T0T)" Err.Clear End If On Error GoTo HandleErr ExitHere: Exit Sub HandleErr: Dim ErrMsg As String Select Case Err Case 11 ErrMsg = "あ、ボク、一瞬『無限』体験しちゃった☆ (0で割り算)" Case Else ErrMsg = Err.Description End Select ErrMsg = FunctionName & ProcessName & vbNewLine _ & ErrMsg & vbNewLine & "どうする?" Select Case MsgBox(ErrMsg, vbAbortRetryIgnore) Case vbAbort Resume ExitHere Case vbRetry Resume Case vbIgnore Resume Next End Select End Sub
お礼
いつもながらの親切回答ありがとうございます。 On Errorをつかった処理の基本的な流れは十分理解できました。 親切感あふれるメッセージを表示することもできました。 ( これだけでも、とても十分な収穫です ) ただ、欲を申し上げますと・・・ "--- Set mySheet = Workbooks(0).Worksheets("ほげほげ") ---" という文そのものをOn Error処理にて表示したいのですが、 その方法として、 If Err <> 0 Then MsgBox "Set mySheet = Workbooks(0).Worksheets("ほげほげ") " 'MsgBox "「ほげほげ」なんてシートはどこにも無いよぉ。(T0T)" Err.Clear End If で、もちろん機能的に必要十分なのではありますが、 質問途上で書いた ”・・・・はあきらめました”の 真意 は、 エラー発生の可能性のある文すべてに対し、上記のような コーディングしちゃうと、<<本文>> よりもエラー記述のほうに 数倍(上記例で1:4行ですね)の労力が必要とされてしまうのを 忌避(≒手抜き?)したかった…ということなのです。 命令が百,千,万となったり後々の維持管理など考えると・・・ あ~おそろしか~~~ 質問のニュアンスがうまくつたわらなかったのであれば、 それは私の文章力が未熟なせいです。 (モノ書き屋ではありませんのでかんべんしてください) システムがエラーとして検知した<まくろ本文>を取得する”公式” (それ一文のみの記述で全ステートメントに有効な) のようなものがあればなあ~とおもい当質問にいたったのでした。 やっぱり欲張らずに、地道に歩くしかないのかなあ (Office2000 Developer Edition…これだと解決しますか?) だれかくれないかな~ ERL関数はなぜなくなったのでしょう? (構造化や目的指向のはやりのなかでその価値を失ってしまったのでしょうか) あ、ちなみに本件の暫定措置についてですが、 On Error処理ルーチンにおいては、msgbox(”xxに連絡して聞いてちょ”) のみとし、手元にオリジナルと、(On Error記述なしの)複製を置いて 問いあわせ聞き取り後、複製版にて再現試行vb editer該当文表示―調査開始 という方法にすることにしようかとおもってます。 (オリジナルと複製の本文同期の保ち方と私の健康が心配です・・・) どうも単純明快に表現する術にうとくてまたまた長くなってしまいました。 (5・7・5…17文字くらいでうまくまとめたいもんです) いろいろありがとうございました。またアドバイスくださいな ^^)/ (顔文字はこれしか描けません…練習してみます)
お礼
貴重な時間をありがとうございます。 (質問側がレスポンス遅いのは恥ずかしいかぎりです…) ご提示いただいた参考文は、 --同類対象への似たような行動については、ひとまとめにパックしといて、 必要の都度カンタンな呪文で呼びだせば・・・。-- ということですよね(きっと)。 いずれにしても、現時点では、自分でいろいろ 考えたり(=ハマッたり)しながらゴリゴリ作りこむしかないようで…。^^); 大変参考になりました。 またなんか気づくことがあるかもしれないので、 この質問は、締めずにおいときます。 (気分は”良々回答200pt贈”です) ありがとうございました。