概要
MCCErrorEscapeは、Excel VBAの開発中に、エラーが起きそうな処理を囲むためのOn Error GoToテンプレートをすぐ作れるようにする汎用プロシージャです。
イミディエイトウィンドウでMCCErrorEscapeを実行すると、エラー回避用のコードを生成し、クリップボードへ格納します。その後、コードウィンドウへ戻るため、任意の位置に貼り付けて、保護したい処理をテンプレート内へ移動できます。
本格的なログ基盤を作る前の段階で、「ここはエラーが出ても処理全体を止めたくない」「エラー内容だけイミディエイトウィンドウへ出しておきたい」という場面に向いた開発補助コードです。
使う場面
- ファイル操作、外部ブック操作、図形操作など、実行環境によって失敗しやすい処理を一時的に囲みたい
- 毎回
On Error GoTo、エラーラベル、終了ラベルを手入力する手間を減らしたい - 開発中に発生したエラー内容をDebug.Printで確認したい
- VBE上で、定型的なエラー処理テンプレートをすぐ貼り付けたい
処理イメージ図

操作デモ
実際の操作では、イミディエイトウィンドウでMCCErrorEscapeを実行し、戻ってきたコードウィンドウ上で貼り付けます。
プロシージャの構成
今回のパッケージは、トップのMCCErrorEscapeから補助処理を呼び出す構成です。
MCCErrorEscape
├─ ClipText
└─ ShowCodeWindowDelay
└─ ShowCodeWindow
ClipTextは生成した文字列をクリップボードへ入れます。ShowCodeWindowDelayはApplication.OnTimeでShowCodeWindowを呼び、イミディエイトウィンドウで実行したあとにコードウィンドウへ戻しやすくします。
使用例
標準モジュールへ実装コードを入れたあと、VBEのイミディエイトウィンドウで次のように実行します。
MCCErrorEscape
生成されるテンプレートは次のような形です。
On Error GoTo ErrorEscape
GoTo ErrorEscapeEnd
ErrorEscape:
''エラーが生じたらエラーメッセージをイミディエイトウィンドウに表示
If Err.Description <> "" Then
Debug.Print Err.Description, Now()
End If
ErrorEscapeEnd:
貼り付けたあと、エラーを回避したい処理をOn Error GoTo ErrorEscapeとGoTo ErrorEscapeEndの間へ移動します。
Private Sub Sample()
On Error GoTo ErrorEscape
'何かしらエラーが起きそうな処理 開始
'ここにファイル操作、図形操作、外部ブック操作などを置く
'何かしらエラーが起きそうな処理 終了
GoTo ErrorEscapeEnd
ErrorEscape:
''エラーが生じたらエラーメッセージをイミディエイトウィンドウに表示
If Err.Description <> "" Then
Debug.Print Err.Description, Now()
End If
ErrorEscapeEnd:
End Sub
サンプルブック
動作確認用のマクロ有効ブックも用意しています。
.xlsm形式のため、Excelで開くときはマクロの有効化、保護ビュー、ダウンロードファイルのブロック解除を確認してください。
コピー可能な実装コード
下のコードは、MCCErrorEscape、ClipText、ShowCodeWindowDelay、ShowCodeWindowを1つにまとめた貼り付け用パッケージです。
コードを読み込み中...初心者向けコード解説
MCCErrorEscapeの中心は、Str = Str & ...でテンプレート文字列を1行ずつ組み立てる部分です。vbLfで改行を入れ、最終的に貼り付けやすいVBAコードのまとまりにしています。
On Error GoTo ErrorEscapeは、実行中にエラーが発生したときにErrorEscape:ラベルへ移動する指定です。一方で、通常終了時にそのままエラー処理部分へ流れ込まないように、途中にGoTo ErrorEscapeEndを入れています。
ErrorEscape:内では、Err.Descriptionが空でない場合だけDebug.Printでエラー内容と時刻を出します。メッセージボックスを出さないため、開発中に何度も試す処理でも邪魔になりにくい構成です。
ClipText(Str)は、生成したテンプレートをクリップボードへコピーします。内部ではMSFormsのForms.TextBox.1を一時的に作り、文字列を選択して.Copyしています。
ShowCodeWindowDelayは、すぐにShowCodeWindowを呼ばず、Application.OnTimeで少しタイミングをずらして実行します。イミディエイトウィンドウから起動した直後に画面フォーカスを戻す処理はタイミングの影響を受けやすいため、このように分けています。
ShowCodeWindowではVBIDEのApplication.VBE.Windowsを調べ、最大化されているコードウィンドウを見つけてSetFocusします。これにより、生成コードを貼り付ける場所へ戻りやすくなります。
注意点
- このプロシージャは開発者向けの補助マクロです。業務ロジックそのもののエラー設計を完全に代替するものではありません。
- クリップボードを使うため、実行直前にコピーしていた内容は上書きされます。
ShowCodeWindowはApplication.VBE.Windows、vbext_wt_CodeWindow、vbext_ws_Maximizeを使います。コンパイルエラーになる場合は、VBEの「ツール」→「参照設定」でMicrosoft Visual Basic for Applications Extensibility 5.3を確認してください。- 環境によっては、Excelのトラストセンターで「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」の確認が必要になることがあります。
Forms.TextBox.1を使ってクリップボードへコピーするため、環境によってはMSForms関連の利用可否も確認してください。On Error GoTo ErrorEscapeで囲む範囲は広げすぎない方が安全です。原因を追いたい処理までまとめて隠してしまうと、デバッグしづらくなります。
関連記事
- 文字列をクリップボードへ格納するClipText
- コードウィンドウへ戻すShowCodeWindowDelay
- イミディエイトウィンドウをCUIのように使ってプロシージャコードを半自動生成する
- Excel VBAの処理を汎用部品として残すための考え方
軽いまとめ
MCCErrorEscapeは、エラー回避用テンプレートを毎回手入力せず、イミディエイトウィンドウから一発で生成して貼り付けるための小さな開発補助プロシージャです。
汎用プロシージャとして残しておくと、VBA開発中に「この処理だけ一時的に逃がしたい」「エラー内容だけ確認したい」という場面で、素早く同じ形のエラー処理を挿入できます。
