-PR-
締切済み

マクロで真っ暗     (エラートラップについてです見捨てないで~)

  • 暇なときにでも
  • 質問No.39797
  • 閲覧数92
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 94% (54/57)

<エラーが発生したマクロ文を特定したいのですが>

 作成したマクロ(Excel2kです)実行中に、
思わぬ不運にみまわれて、やむなくエラー発生となり
お先真っ暗・・・となったばあい、
On Error文を使って対応指針を表示させたいと思うのは,
変な病気なのでしょうか。

Err.Descriptionプロパテ-の内容は(確かに正しいあんたはえらいと思うのでありますが)
素人目には(不親切だな~)と感じることがあります。
ex.)
開いたbookで指定のsheetを探したけど無かった場合・・・
 (期待値):"お探しのシートはこのbookにはありませんよお客さん他をあたってね"
(実際 ):"インデックスは有効範囲にゃ~ありませんぜ他をあたりな"

 エラーが発生する可能性のある文すべてを対象にエラー内容を全予測して、
前後の文脈やエラーに至ったオペレーション記録などから
操作の当事者レベルに応じて妥当な解決方法を導き出すメッセージを3秒以内で・・・
一生かかってもムリっぽいのでこれはあきらめました。
(労苦の上に努力を重ねるパイロットさんが職失ってしまいますよね)


<<-- 質問です -->>
 ほのかわり、初動調査のあしがかりとして、マクロ記述内でエラーの発生した<文&場所>を
明確に表示する方法なんかありませんでしょうか?(msgboxでだしたい)

Resumeって書くとエラー発生文に戻るみたいなので内部的に情報保持してる
とおもうのですが開示のしかたがわかりません・・・
デバグ途上でOn Error記述なしだとvb editerが該当文を指摘してくれるんですが
作成ツールとしてはOnErrいれちゃいたいのです。

長々すいません、このコーナーには何度か投稿してるのですが、
いつも多数の親切な回答でソッコー解決してしまうので、また書いてしまいました。

よろしくおねがいします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 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
お礼コメント
nao_2

お礼率 94% (54/57)

いつもながらの親切回答ありがとうございます。

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文字くらいでうまくまとめたいもんです)

いろいろありがとうございました。またアドバイスくださいな ^^)/
(顔文字はこれしか描けません…練習してみます)
投稿日時 - 2001-02-19 01:32:04
  • 回答No.2
レベル13

ベストアンサー率 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の次の次のバージョンあたりで、「例外処理」という考え方が取り入れられると思います。
これを使えば、今よりは若干エラー処理がやりやすくなるものと思います。
(といっても、コードが見やすくなるだけで、エラー処理の手間自体は大して変わらないんですが。)
お礼コメント
nao_2

お礼率 94% (54/57)

貴重な時間をありがとうございます。
 (質問側がレスポンス遅いのは恥ずかしいかぎりです…)

ご提示いただいた参考文は、
--同類対象への似たような行動については、ひとまとめにパックしといて、
必要の都度カンタンな呪文で呼びだせば・・・。-- 
ということですよね(きっと)。

 いずれにしても、現時点では、自分でいろいろ
考えたり(=ハマッたり)しながらゴリゴリ作りこむしかないようで…。^^);

大変参考になりました。

 またなんか気づくことがあるかもしれないので、
この質問は、締めずにおいときます。
(気分は”良々回答200pt贈”です)

ありがとうございました。
投稿日時 - 2001-02-22 22:47:23
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ