
処理中の不具合で「実行時エラー」が発生すると、その瞬間にプログラムは落ちてしまいます。
みなさん、こんにちは。セルネッツ竹本です。
今回は、「原因究明のために行うデバッグ作業」をテーマに、解説をしたいと思います。
結論から言うと、実行時エラーが出たら[デバッグ]ボタンで止まった行を確認し、その行で使っている変数やセルの値を調べるのが基本です。
値はマウスを重ねるだけで見られます。流れを追うならF8のステップ実行、途中で止めるならF9のブレークポイントを使います。
Debug.Printで値をイミディエイトウィンドウに書き出しておくと、どこで値がおかしくなったかを追えます。
この記事では、次のことがわかります。
- 実例で見る、実行時エラーの発生から原因の特定までの流れ
- ステップ実行・ブレークポイント・イミディエイトウィンドウなど、VBEのデバッグ機能の使い方
- よく出る実行時エラーの番号と主な原因、原因究明を早くするコツ
実行時エラーでお困りなら
マクロのエラーで業務が止まっていませんか
- 実行時エラーで処理が途中で落ちてしまう
- デバッグしても原因の箇所が分からない
- 作った人が退職してマクロを直せない
そのお悩み、エラーの原因調査と改修で解決できます。Excel専門のシステム開発会社『セルネッツ』なら、エラー箇所の特定と不正な入力値のチェック処理の追加に対応します。再発しにくい構成への見直しもご提案します。前任者が作ったマクロでもご相談ください。
\Excel専門特化 × 低価格 × スピード対応/
全国対応・お見積もり無料
デバッグ(Debug)とは?
むずかしい表現を使わずに、わかりやすく簡単にいうと、「ソフトウェアのエラー原因を調べて修正すること」です。
これを「デバッグ(する)」と呼び、バグ(BUG)には「虫」という意味もあり、デバッグ作業のことを「バグ潰し」や「バグ取り」という表現をすることもあります。
実際のサンプルで見る、実行時エラー発生から原因特定までの流れ
(仕様)2行目〜5行目までの金額を求めてください。(単価×数量)
(結果)3行目が終わったが、4行目ができなかった。

(実行時エラーの画面)
![実行時エラー13「型が一致しません。」のダイアログと[デバッグ]ボタン](https://www.cellnets.co.jp/column/wp-content/uploads/debug3.png)
[デバッグ(D)]を押下すると、発生した箇所が黄色くマーキングされますので、場所はすぐに特定できます。
(注意)但し、2つの条件があります。
【その1】プログラムソース(VBAProject)にPassWordロックをかけず開示すること
※ExcelVBAで実行時エラー原因の早期究明に、[Lock]するメリットは無し
【その2】UserForm内のソース記述では、当該箇所が黄色くならないケースあり
※Formモジュール内はフォーム要素の収集のみ。処理は標準Moduleが鉄則
【その2】は、VBEの既定の設定では、フォームの中でエラーが起きても、フォームを呼び出した行(UserForm1.Showなど)で止まるためです。
[ツール]>[オプション]>[全般]タブの「エラー トラップ」を「クラス モジュールで中断」にすると、フォームの中の該当行で止まるようになります。
以下が、プログラム記述になります。

発生箇所をよく見てください。マウスカーソルを変数の上に置くと、中身が表示されます。
4行目の数量(D4セル)の値がSpace(空白文字)であることが分かります。原因はこのセルの値が演算不可能な値だったため、と判断できます。つまり、[数量]が不正だったことが原因となったことが分かりました。
ここが見落としやすいポイントです。本当に空のセルなら0として計算されるので、エラーにはなりません。
見た目は空欄でも空白文字が入っていると、数値として計算できず「型が一致しません(13)」になります。
プログラムソースとDebug.Printの解説
不正値ということは分かりました。Spaceということも分かりました。
これが原因究明のための「デバッグ作業」の基本となります。
'※※※※※※※※※※※※※※※※※※※※
Sub M_金額を算出()
'※※※※※※※※※※※※※※※※※※※※
Dim S_読行 As Long
For S_読行 = 2 To 5
Debug.Print "" & vbCrLf & _
"S_読行: " & S_読行 & vbCrLf & _
"単価:[" & Cells(S_読行, 3) & "]" & vbCrLf & _
"数量:[" & Cells(S_読行, 4) & "]" & vbCrLf & _
"金額:[" & Cells(S_読行, 5) & "]"
'[金額]=[単価]*[数量]
Cells(S_読行, 5) = Cells(S_読行, 3) * Cells(S_読行, 4)
Next S_読行
MsgBox "終わりました!"
End Sub
Debug.Print とは、プログラムの流れを1行ずつ追跡する際に、要所にいれることで、
処理は止めずに、変数の中身をイミディエイトウィンドウ(Ctrl+Gで表示)に書き出すことができます。
この例では、4つの要素をチェックしています。
vbCrLf は、改行コードのことで、見やすく折り返し表示したいときに使います。
値を[ ]で囲んでいるのがポイントです。数量が「[ ]」のように表示されれば、空白文字が入っているとひと目でわかります。
処理を止めて調べたいときは、後で紹介するブレークポイントやStopステートメントを使います。
今回のサンプルでは、分かりやすいエラーだったため、原因究明が容易でした。
エラーの種類に実は文法エラーや論理エラーなどがあり、「実行時エラー」は落ちてしまうかわりに、場所が特定できるため、一番解決しやすいエラーのひとつです。
VBEのデバッグ機能一覧
VBE(Visual Basic Editor)には、デバッグ用の機能がそろっています。まずは次の表の機能を覚えておけば十分です。
| 機能 | 操作 | できること |
| ステップイン | F8 | 1行ずつ実行する。呼び出した先のプロシージャの中にも入る |
| ステップオーバー | Shift+F8 | 1行ずつ実行する。呼び出した先は中に入らず、まとめて実行する |
| カーソル行の前まで実行 | Ctrl+F8 | カーソルを置いた行の手前まで一気に進める |
| ブレークポイント | F9(行の左端をクリックでも可) | その行に来たら、処理を一時停止する |
| データヒント | 停止中に変数へマウスを重ねる | 変数の値をその場で表示する |
| イミディエイトウィンドウ | Ctrl+G | Debug.Printの結果を見る。「?変数名」で値を調べる |
| ローカルウィンドウ | [表示]>[ローカル ウィンドウ] | そのプロシージャの変数を一覧で見る |
| ウォッチ式 | [デバッグ]>[ウォッチ式の追加] | 指定した変数や式を見張る。値が変わったら止めることもできる |
| Stopステートメント | コードに「Stop」と書く | その行で一時停止する(消し忘れに注意) |
Debugオブジェクトの仕様は、Microsoft Learn「Debug オブジェクト」で確認できます。
ステップ実行とブレークポイントの使い方
怪しい行の手前で止めて、1行ずつ進めながら値を確かめるのが、デバッグの基本の流れです。
- 怪しい処理の手前の行にカーソルを置き、F9キーを押す(行が茶色になり、左端に丸印が付く)
- マクロを実行すると、その行で止まり、黄色く表示される
- F8キーを押すたびに1行ずつ進む。変数にマウスを重ねて値を確かめる
- 原因がわかったら、F5キーで最後まで実行するか、[リセット](■ボタン)で止める
- 調べ終わったら、もう一度F9キーを押してブレークポイントを外す
今回のサンプルなら、「Cells(S_読行, 5) = …」の行にブレークポイントを置きます。F5キーを押すたびに次の行の処理で止まるので、S_読行が4になったところで数量の値を確かめられます。
よく出る実行時エラーと主な原因
エラー番号がわかれば、原因の見当をかなり絞り込めます。
| 番号 | メッセージ | 主な原因 |
| 6 | オーバーフローしました。 | Integer型など、型の範囲を超える値を入れた |
| 9 | インデックスが有効範囲にありません。 | シート名・ブック名の書き間違い、配列の範囲外を指定した |
| 11 | 0 で除算しました。 | 割る数が0や空のセルだった |
| 13 | 型が一致しません。 | 数値のはずのセルに文字や空白が入っていた(今回の例) |
| 91 | オブジェクト変数または With ブロック変数が設定されていません。 | Setを忘れた、Findで見つからずNothingのまま使った |
| 424 | オブジェクトが必要です。 | オブジェクトでないものに、プロパティやメソッドを使った |
| 438 | オブジェクトは、このプロパティまたはメソッドをサポートしていません。 | そのオブジェクトに無いプロパティやメソッドを書いた |
| 1004 | アプリケーション定義またはオブジェクト定義のエラーです。など | シートの指定漏れ、保護されたシートへの書き込み、存在しない範囲の指定など、Excel側の操作の失敗 |
番号の付かないエラーや、実行前に出るエラーもあります。「オートメーションエラー」の原因と対処法や、64ビット版で出るコンパイルエラーの直し方もあわせてご覧ください。
原因究明を早くするコツ
原因究明でいちばん大切なのは、「同じエラーをもう一度起こせる状態」を作ることです。
- 再現させる: エラーが出たときのファイル・データ・操作手順を控え、同じ条件で起きるか確かめる
- まず入力値を疑う: 今回のように、コードは正しくても、データ(空白・全角数字・想定外の行)が原因のことが多い
- 範囲を半分ずつ絞る: 長い処理は、真ん中にブレークポイントを置いて、前半と後半のどちらで値がおかしくなるかを調べる
- エラーを隠さない: On Error Resume Nextがあると、エラーが起きても止まらず、原因の場所がわからなくなる
利用者の手元で起きるエラーは、その場でデバッグできないこともあります。
次のようにエラー処理を入れておくと、エラー番号と内容に加えて、何行目のどんな値で止まったかを画面に出せます。
Sub M_金額を算出_エラー処理付き()
Dim S_読行 As Long
On Error GoTo ErrHandler
For S_読行 = 2 To 5
Cells(S_読行, 5) = Cells(S_読行, 3) * Cells(S_読行, 4)
Next S_読行
MsgBox "終わりました!"
Exit Sub
ErrHandler:
MsgBox "エラー番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description & vbCrLf & _
"行: " & S_読行 & " 行目" & vbCrLf & _
"数量: [" & Cells(S_読行, 4).Value & "]"
End Sub
エラー処理の書き方と、On Error Resume Nextを使うときの注意点は、On Error Resume Nextの使い方と注意点で解説しています。
原因がわかった後の対応の進め方や、報告書のまとめ方は、ExcelVBAシステムの不具合対応の流れと障害報告書の書き方をご覧ください。
よくある質問
Q. Debug.Printの結果が表示されません。
A. Debug.Printの結果は、シートではなくVBEのイミディエイトウィンドウに出ます。VBEでCtrl+Gを押して、ウィンドウを表示してください。
Q. ブレークポイントを置いたのに止まりません。
A. その行まで処理が来ていない可能性があります。If文の条件で飛ばされていないか、別のプロシージャが動いていないかを確かめてください。なお、ブレークポイントはファイルに保存されないため、ブックを開き直すと消えます。
Q. [デバッグ]ボタンが押せない、またはコードが見られません。
A. VBAプロジェクトにパスワードがかかっていると、コードを開けず、止まった行も確認できません。作成者にパスワードを確認してください。作成者が不在で直せない場合は、Excelエラー解決サービスのような外部の窓口に相談する方法もあります。
まとめ
- 実行時エラーが出たら[デバッグ]で止まった行を確認し、変数にマウスを重ねて値を調べる
- 流れを追うならF8のステップ実行、途中で止めるならF9のブレークポイントを使う
- Debug.Printは処理を止めずに、値をイミディエイトウィンドウ(Ctrl+G)へ書き出す
- 見た目が空欄でも空白文字が入っていることがある。まず入力値を疑う
今回のテーマは、「原因究明のために行うデバッグ作業」について、解説を行いました。
本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。
Excel業務改善事例ショート動画
文章だけでは伝わりにくい改善事例を、ショート動画でご覧いただけます。
◆よくある質問 ◆Excel業務改善の実例 ◆VBA・マクロ活用事例
Excelエラー解決サービス
1件30,000円、解決しなければ料金不要
- 1件あたり3時間以内で原因を調べて対応
- リモート接続での対応も可能
- 根本的な作り直しは見積もりでご提案
目の前のエラーだけを早く直したい場合は、Excelエラー解決サービス(1件30,000円・税別)をご利用ください。対応時間は1件3時間以内で、解決できなかった場合は料金不要です。改修や作り直しが必要な場合は、相見積もりも歓迎です。
\Excel専門特化 × 低価格 × スピード対応/
全国対応・お見積もり無料
