• 締切済み

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

<エラーが発生したマクロ文を特定したいのですが>  作成したマクロ(Excel2kです)実行中に、 思わぬ不運にみまわれて、やむなくエラー発生となり お先真っ暗・・・となったばあい、 On Error文を使って対応指針を表示させたいと思うのは, 変な病気なのでしょうか。 Err.Descriptionプロパテ-の内容は(確かに正しいあんたはえらいと思うのでありますが) 素人目には(不親切だな~)と感じることがあります。 ex.) 開いたbookで指定のsheetを探したけど無かった場合・・・  (期待値):"お探しのシートはこのbookにはありませんよお客さん他をあたってね" (実際 ):"インデックスは有効範囲にゃ~ありませんぜ他をあたりな"  エラーが発生する可能性のある文すべてを対象にエラー内容を全予測して、 前後の文脈やエラーに至ったオペレーション記録などから 操作の当事者レベルに応じて妥当な解決方法を導き出すメッセージを3秒以内で・・・ 一生かかってもムリっぽいのでこれはあきらめました。 (労苦の上に努力を重ねるパイロットさんが職失ってしまいますよね) <<-- 質問です -->>  ほのかわり、初動調査のあしがかりとして、マクロ記述内でエラーの発生した<文&場所>を 明確に表示する方法なんかありませんでしょうか?(msgboxでだしたい) Resumeって書くとエラー発生文に戻るみたいなので内部的に情報保持してる とおもうのですが開示のしかたがわかりません・・・ デバグ途上でOn Error記述なしだとvb editerが該当文を指摘してくれるんですが 作成ツールとしてはOnErrいれちゃいたいのです。 長々すいません、このコーナーには何度か投稿してるのですが、 いつも多数の親切な回答でソッコー解決してしまうので、また書いてしまいました。 よろしくおねがいします。

  • nao_2
  • お礼率94% (54/57)

みんなの回答

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

> システムがエラーとして検知した<まくろ本文>を取得する”公式” (それ一文のみの記述で全ステートメントに有効な) のようなものがあればなあ~とおもい当質問にいたったのでした。 うーん、これは現時点ではどうしようもないですねぇ。 仰るように、エラー処理は昔っからどうしようもなく手間がかかるものでして、私もプログラムしながら何度「もっと楽になったらなぁ。」と思ったか分かりません。 仮に、エラーの起こった行を取得したとしても、その行の構文を解析して、 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
質問者

お礼

貴重な時間をありがとうございます。  (質問側がレスポンス遅いのは恥ずかしいかぎりです…) ご提示いただいた参考文は、 --同類対象への似たような行動については、ひとまとめにパックしといて、 必要の都度カンタンな呪文で呼びだせば・・・。--  ということですよね(きっと)。  いずれにしても、現時点では、自分でいろいろ 考えたり(=ハマッたり)しながらゴリゴリ作りこむしかないようで…。^^); 大変参考になりました。  またなんか気づくことがあるかもしれないので、 この質問は、締めずにおいときます。 (気分は”良々回答200pt贈”です) ありがとうございました。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

ありゃりゃ。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
質問者

お礼

いつもながらの親切回答ありがとうございます。 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文字くらいでうまくまとめたいもんです) いろいろありがとうございました。またアドバイスくださいな ^^)/ (顔文字はこれしか描けません…練習してみます)

関連するQ&A

  • マクロ シートの選択

    いつも回答して頂き、とても感謝しています。 マクロを実行したブックを指定する時はTHISWORKBOOKですよね。マクロを実行したシートを指定する時にもTHISWORKBOOKみたいな記述方法があるのでしょうか? あるのであれば教えて下さい。 今、作成中のマクロで解決出来ない問題が発生しています。FINDを使う記述の箇所で一回目はすんなり最後までいくのですが、続けて同じマクロを実行すると、エラーが発生してしまいます。 たぶん、2回目の時違うシートを見てるからだと思います。どのシートを見てるか分かりませんが。 で、FINDで検索するシート名を変数をとって指定しています。 Dim ws1 as WorkSheet Set ws1 = ThisWorkBook.ActiveSheet これが悪いのかな?と思い質問しました。よろしくお願いします。

  • マクロ実行時のエラー処理について

    VBAのエラー処理の方法について教えて下さい。 エクセル2007を使用しています。 VBAでシートの名前を以下のように変更しようとしています。 シート名1 ← "1" シート名2 ← "2" シート名3 ← "3" 記述内容は以下の通りです。 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 On Error GoTo Err1  For i = 1 to 3   Sheet(i).Name = i  'Sheet(i)の名前を変数"i"に変更する。 Err1:   Sheet(i).Delete   '上記処理でエラーが発生した場合はそのシートを削除する。  Next i '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓  以上の処理を実行しようとした場合、同じ名前の既存シートが存在していたり、シート名に含まれてはいけない文字列が含まれていたりした場合、エラーが発生しますが、On Errorステートメントを使用してエラーが発生した場合の処理を実行したいのですが、1回目のエラーについてはOn Errorが働くのですが、2回目になるとOn Errorが働きません。  2回目以降のエラーも1回目と同様に処理したいのですが、コードの記述の変更方法や又は他の処理方法を教えて下さい。 エラーの種類は以下の通りです。 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 実行時エラー'1004': シートの名前をほかのシート、Visual Basicで参照されるオブジェクト ライブラリまたは ワークシートを同じ名前に変更することはできません。 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 以上。 尚、On Error Resume Nextは処理を無視するだけなので使用したくありません。 以上、宜しくお願い致します。

  • 【VBA】マクロのルールについての文章 解説

    マクロのルールについて記載された一文について、次の内容を噛み砕いて教えていただけますか。 さっぱりわかりません。。。 「イベントを利用するマクロはオブジェクトのモジュールに記述する」 ワークシートをアクティブにすると、アクティブになったワークシートでActivateイベントが発生します。このイベントを利用して、ワークシートが切り替わった時自動的に起動するようなマクロは、Worksheetオブジェクトのモジュールに記述しなければなりません。

  • EXEL2000のマクロが2010でエラーになる

    当方、VBA初心者です、よろしくお願いいたします。 EXEL2000で動作していたVBAマクロが2003では動作、2007、2010では 以下のエラーが発生して動作しません。 「実行時エラー1004、アプリケーション定義またはオブジェクト定義のエラーです」 マクロ自体はワークシートにグラフを書くものです。 Dim cho As ChartObject, rng As Range エラー箇所の記述は以下の部分です。 Set cho = ws.ChartObjects.Add( _ ws.Range("B4").Left, _ ws.Range("B4").Top, _ ws.Range("B4:AB4").Width, _ ws.Range("B4:B13").Height) バージョンアップの仕様変更で記述が変わったと言うことでしょうか? そうだとしたらあわせて何がどう変わったのか、解説されてるサイトとか ご存じでしたらお知らせください。 以上よろしくご教授のほどお願いいたします。

  • マクロを組むとこんなエラーが出るようになりました

    捺印君:Vel 1.25→(エクセルのフリーソフトです) PicturesクラスのPasteプロパティを取得出来ません。 予期せぬエラーが発生しました。 とエラーが出ます。 ちなみに組んでいるマクロは下記です Sub 全シートの保護() Dim Sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each Sh In Worksheets Sh.Protect Password:=myPassword Next End Sub Sub 全シートの解除() Dim Sh As Worksheet Dim myPassword As String myPassword = InputBox("パスワードを入力してください", "パスワード") For Each Sh In Worksheets Sh.Unprotect Password:=myPassword Next End Sub このマクロがおかしいからエラーが出るんですよね? 違うマクロにすれば問題ないでしょうか? ちなみにマクロは「全シートの保護一括解除」と「一括保護」で パスワード付きの物をとなっております。

  • マクロ フォームのオブジェクト名

    マクロのフォームを利用して、入力シートを作成しています。 セルに入力したフォームのオブジェクト名を利用して、繰り返し記述を作ったのですが、エラーが発生してしまいます。 Form名.List = ary_d → 「オブジェクトが必要です」のエラー セルに入力したフォームのオブジェクト名では無理なんでしょうか? 解決方法があれば、参考にしたいので宜しくお願いします。

  • excelのマクロで質問です

    皆様、いつも親切に教えて頂いて、感謝しております。 初心者です。 excelのマクロなんですが、 Private Sub Worksheet_Calculate() で、あるシートにコードの記述があります。 そのワークブックを開いて、同時に他のワークブックで作業すると このコードが実行されて、エラーが出てしまいます。 コードの記載されてるワークブックだけで、このコードを有効にしたいのですがどうすれば良いでしょうか? 文章が拙くすみません。 宜しくお願いします。

  • エクセル マクロ が他のPCでコンパイル エラー

    作成してもらったマクロです、作成者多忙で修正は即不可ですので、何とか解決したいのですが自分はマクロを理解できないので、どなたか教えてください。 症状は現在(仮りにAとします)WinXPで正常に動いております(エクセル2000)このソフトをLAN(仮称B エクセル2003)でも使用しておりましたが、LANでエラー発生。ほか(仮称 C、D)などにAからデータとソフトをコピーしてもエラー発生、現状はAではつかえてますがLANで使いたいので、、 全部のソースは文字数の関係で貼り付け不可ですので エラーらしきところを張りつけます「エラーは非表示モジュラー1でコンパイルエラー」です 1行目で黄色反転して11行目でとまってます。 Private Sub WorkSheet_Delete(Target_Sheet0 As String) 'シート削除 'ActiveBookのシート「Target_Sheet0」があれば「削除」、 '無ければそのまま '無い物を削除実行はアラーム表示となるので On Error GoTo ErrSheetDelete Application.DisplayAlerts = False Worksheets(Target_Sheet0).Delete Application.DisplayAlerts = True GoTo ExitSheetDelete ErrSheetDelete: Error_Number = Err.Number ' その後、オートメーション エラーの発生を調べます。 Msg = "仮台帳がアクティブにできませんSub WorkSheet_Delete。Error_Number=" & Error_Number Err.Clear ' Err オブジェクトのプロパティをクリアします。 ExitSheetDelete: ' 'Stop End Sub

  • Excel2007のマクロ(excel4.0)のSELECT関数でマクロエラーが発生する

    Excel VBAで開発されたソフトの改造を行ってますが、Excel2007で動作しないマクロがあり困ってます。 <開発環境> ・WindowsXP Pro SP3 ・Celeron 540(1.8GHz) ・メモリ1GB ・Excel2007 SP1 (Microsoft Office2007) 改造元ソフトはOffice2000で開発されており、Excel2007で動作するとマクロエラーが発生する処理があります。 因みにまだソフト改造はしてなく、そのままExcel2007で動作させるだけでマクロエラーが発生します。 発生する箇所はマクロ(excel4.0)で定義されており、下記のコマンドです。 =SELECT(!選択エリア) マクロエラーの内容は下記になります。 ------------------------------- マクロエラー [dbg.xls]マクロ(excel4.0)BV28 ------------------------------- やりたい事はシートの特定の範囲を選択することです。 "選択エリア"は正しく定義されていることは確認してます。 (=シート名!$D$4:$CY$103 と定義してます) Excel2000やExcel2003ではマクロエラーが発生せずに正常に選択されます。 Excel2007のマクロセキュリティ設定を「すべてのマクロを有効にする」にしてます。 開発者向けのマクロ設定を「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックしても改善しません。 ネットで調べましたが判らず、ここで質問させて頂きました。 判りにくい説明で申し訳ありませんが、よろしくお願いします。

  • エクセルのマクロでエラー

    いつもお世話になっています、マクロ初心者です、Vlookupを使うとエラーになってしまいます。  Sheets("401回~").Select Application.Goto Reference:="回" AA = VLookup(I1, 回, 3) を実行すると コンパイルエラー Sub又はFunctionが定義されていません と表示され、Vlookupの部分が青くなります。 Windows Xp、Office2000です、sheet内で、同じ文を使っているのですが、マクロ用に何か定義が必要なのでしょうか? 初心者で、手元には図書館で借りた入門書しかありません。 アドバイスお願いします。

専門家に質問してみよう