Excel VBAスタンダード 公式テキスト 8章 エラー処理
第三者が使用するようなマクロでは、どんなエラーが発生しても対応できるようにしておかなければなりません。エラーへの対応に必要な事は技術やテクニックではなく、優しさと思いやりです
- むせる
8-1 エラー処理
- 文法エラー
- よくある括弧の付け忘れとか
- VBEが自動的にチェックして検出してくれる
- 論理エラー
8-2 エラーへの対応
エラーが発生したら別な処理にジャンプする
On Error GoTo ジャンプ先のラベル名
- ラベルとはマクロコード上に記述するしおりのような機能
ラベル名:
On Error GoTo myError Workbooks.Open "XXXX.xlsx" MsgBox "ブックを開きました" myError: MsgBox "エラーが発生しました"
On Error GoTo
でジャンプさせるときは「エラーが発生しなかった」ときを想定しなくてはならない- 上のスクリプトのままでは、正常に終わった後にエラー表示部のスクリプトが実行されてしまう
- 対策として、
Exil Sub
をmyErrorの手前におく
- 対策として、
On Error GoTo myError Workbooks.Open "XXXX.xlsx" MsgBox "ブックを開きました" Exit Sub myError: MsgBox "エラーが発生しました"
どんなエラーが発生したか調べる
- 発生したエラーに関する情報はErrオブジェクトに格納される
- Numberプロパティ
- エラーごとに決まっている「エラー番号」を返す
- Descriptionプロパティ
- エラーの意味を表すメッセージ(文字列)を返す
- Clearメソッド
- エラー情報をクリアする
- Numberプロパティ
Dim buf As String On Error GoTo myError buf = InputBox("新しいシート名は?") Sheets("Sheet1").Name = buf Exit Sub myError: Select Case Err.Number Case 9 MsgBox "Sheet1が存在しません" Case 1004 If InStr(Err.Description, "次の点を確認して") > 0 Then MsgBox "不正な文字が含まれています" Else MsgBox "同じシートが既に存在します" End If Case Else MsgBox "想定しないエラーです" End Select
- この中ででてくる
InStr(A,B)
ってのは、Aの中からBに記された文字列を検索する、というもの
発生したエラーを無視する
On Error Resume Next
- 以下のマクロはセーブに失敗した場合にメッセージを出す
ActiveWorkbook.Saved
にtrue(セーブ成功)とFalse(セーブ失敗)が格納される
On Error Resume Next ActiveWorkbook.SaveAs "Book1.xlsm" If ActiveWorkbook.Saved = True Then MsgBox "保存されました" Else MsgBox "保存されませんでした" End If
8-3 エラー対策のポイント
- エラー発生後の修正は当然として、エラー発生前の対処も重要
- シート名の設定に失敗する原因としていかが考えられるが、事前の対処が可能
- ブック内にワークシートが存在しない
- 新しいシート名が既に存在する
- 新しいシート名に不正な文字が含まれている
- これらのエラーに対して、エラーの発生の会費や、適切なエラーメッセージの表示をする事が大事