Excel VBAでマクロを開発していると、
「エラーが出たのは分かるが、原因の特定に時間がかかる」
「On Error で止めているのに、ログに残らず再現できない」
といった悩みに必ず直面します。
こうした問題の多くは、
エラーを“数値”だけで扱い、“内容”を活かしていない
ことが原因です。
そこで重要になるのが、
Descriptionプロパティです。
この記事では、VBAの Description プロパティについて、
- 基本的な役割
- Err.Number との違い
- 実務でのコード設計例
- RPA(UiPath)連携を意識した使い方
まで、実コード付きで深掘りして解説します。
目次
- ✅ Descriptionプロパティとは何か
- ・Descriptionプロパティの役割を正しく理解する
- ・Err.Numberとの決定的な違い
- ✅ Descriptionがセットされるタイミング
- ・エラー発生時のみ自動セットされる
- ・Err.Clear によるリセットに注意
- ✅ Descriptionを取得する基本的なエラー処理構造
- ・On Error GoTo を使った基本パターン
- ✅ ユーザー向け・開発者向けで使い分ける
- ・ユーザー向けに整形する例
- ・開発者向けログに使う例
- ✅ Err.RaiseとDescriptionの関係
- ・独自エラーを作るコード例
- ✅ Descriptionをログ出力に活用する実務例
- ・ログ用シートに記録する例
- ✅ RPA(UiPath)連携を意識したDescription設計
- ✅ よくある勘違いと失敗例
- ・Descriptionの文言で条件分岐してしまう
- ✅ まとめ:VBAのDescriptionプロパティを実務で活かす考え方
✅ Descriptionプロパティとは何か
※ここを曖昧に理解したまま進むと、「エラー処理が形だけのVBA」になります。
・Descriptionプロパティの役割を正しく理解する
Description プロパティは、
発生したエラーの内容を文章として保持するプロパティです。
VBAでエラーが発生すると、
Err オブジェクトに以下のような情報が自動で格納されます。
- Err.Number:エラー番号(数値)
- Err.Description:エラー内容(文章)
- Err.Source:発生元(場合による)
この中で、
人が見て原因を判断できる情報が Description です。
・Err.Numberとの決定的な違い
Err.Number は「判定用」、
Description は「説明用」と考えると分かりやすいです。
On Error GoTo ErrHandler
Dim x As Integer
x = 10 / 0
Exit Sub
ErrHandler:
Debug.Print Err.Number
Debug.Print Err.Description
この場合、
- Err.Number:11
- Err.Description:0 で除算しました
というように、
数値と文章で役割が分かれて取得されます。
実務では
- 分岐・制御 → Err.Number
- ログ・通知 → Err.Description
という使い分けが基本です。
✅ Descriptionがセットされるタイミング
※「なぜ空白になるのか分からない」人は、ここが原因です。
・エラー発生時のみ自動セットされる
Description は、
エラーが実際に発生した瞬間にのみセットされます。
Debug.Print Err.Description ' ← エラーがなければ空文字
これは正常な挙動であり、
「取得できない」のではなく
エラーが起きていないだけです。
・Err.Clear によるリセットに注意
Err.Clear を実行すると、
Err オブジェクトの情報はすべて消去されます。
On Error GoTo ErrHandler
Dim x As Integer
x = 10 / 0
Exit Sub
ErrHandler:
Err.Clear
MsgBox Err.Description ' ← ここでは空になる
Descriptionを使う前に Clear してしまう
これは実務で非常に多いミスです。
✅ Descriptionを取得する基本的なエラー処理構造
※この形を覚えておくと、ほぼすべてのVBAで応用できます。
・On Error GoTo を使った基本パターン
Sub Sample()
On Error GoTo ErrHandler
' 通常処理
Dim x As Integer
x = 10 / 0
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description
End Sub
この構造では、
- エラー発生
- Err.Description を即取得
- ユーザーに通知
という流れが明確になります。
✅ ユーザー向け・開発者向けで使い分ける
※Descriptionをそのまま表示すると、逆に混乱を招くことがあります。
・ユーザー向けに整形する例
MsgBox "処理中に問題が発生しました。" & vbCrLf & _
"管理者に連絡してください。"
・開発者向けログに使う例
Debug.Print "Error:" & Err.Number & " / " & Err.Description
表示と記録を分ける設計が、
実務では非常に重要です。
✅ Err.RaiseとDescriptionの関係
※業務ルールエラーを表現したい場合は必須知識です。
・独自エラーを作るコード例
If Cells(1, 1).Value = "" Then
Err.Raise 1001, , "必須項目が入力されていません。"
End If
このようにすると、
Description に 自分で定義したエラーメッセージが入ります。
これにより、
- 入力不備
- 業務条件違反
といった「VBA独自の意味」を
エラーとして扱えるようになります。
参考:【VBA】Boolean型とは?True/Falseの使い方と実務での注意点を徹底解説
✅ Descriptionをログ出力に活用する実務例
※保守・問い合わせ対応で圧倒的に差が出ます。
・ログ用シートに記録する例
With Worksheets("Log")
.Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Now
.Cells(.Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Err.Number
.Cells(.Rows.Count, 3).End(xlUp).Offset(1, 0).Value = Err.Description
End With
これだけで、
「いつ・どんなエラーが起きたか」
を後から正確に追えるようになります。
✅ RPA(UiPath)連携を意識したDescription設計
※VBA単体で完結しない現場では特に重要です。
UiPathなどのRPAからExcelマクロを呼び出す場合、
- VBA側:Descriptionに原因を残す
- RPA側:ログ・通知に反映
という構成がよく使われます。
Descriptionが適切であれば、
RPA側で「原因不明エラー」になりません。
✅ よくある勘違いと失敗例
※中級者でも意外とやりがちです。
・Descriptionの文言で条件分岐してしまう
Descriptionは
- OS
- Excelの言語設定
に依存します。
If Err.Description = "Object variable not set" Then
このようなコードは、
環境が変わると即壊れます。
分岐は必ず Err.Number を使いましょう。
✅ まとめ:VBAのDescriptionプロパティを実務で活かす考え方
- Descriptionはエラー内容を文章で保持するプロパティ
- 判定は Err.Number、説明は Description
- Err.Clear の位置に注意する
- 独自エラーでは Err.Raise と組み合わせる
- ログ・RPA連携で真価を発揮する
Descriptionプロパティを正しく使えるようになると、
VBAは
「動けばOKのマクロ」から「保守できる業務ツール」
へ一段階レベルアップします。
エラーを隠すのではなく、
エラーを“情報として設計する”
この視点を、ぜひ実務に取り入れてみてください。