【VBA入門】「デバッグのコツ」実行時エラーの原因究明に必要なこと

処理中の不具合で「実行時エラー」が発生すると、その瞬間にプログラムは落ちてしまいます。

処理中の不具合で「実行時エラー」が発生すると、その瞬間にプログラムは落ちてしまいます。

みなさん、こんにちは。セルネッツ竹本です。

今回は、「原因究明のために行うデバッグ作業」をテーマに、解説をしたいと思います。

◆デバッグ(Debug)とは何か。

むずかしい表現を使わずに、わかりやすく簡単にいうと、「ソフトウェアのエラー原因を調べて修正すること」です。

これを「デバッグ(する)」と呼び、バグ(BUG)には「虫」という意味もあり、デバッグ作業のことを「バグ潰し」や「バグ取り」という表現をすることもあります。

◆実際のサンプルを使って、実行時エラー発生の流れを解説します。

(仕様)2行目~5行目までの金額を求めて下さい。(単価×数量)
(結果)3行目が終わったが、4行目ができなかった。

(実行時エラーの画面)

[デバッグ(D)]を押下すると、発生した箇所が黄色くマーキングされますので、場所はすぐに特定できます。


(注意)但し、2つの条件があります。

【その1】プログラムソース(VBAProject)にPassWordロックをかけず開示すること
     ※ExcelVBAで実行時エラー原因の早期究明に、[Lock]するメリットは無し

【その2】UserForm内のソース記述では、当該箇所が黄色くならないケースあり
     ※Formモジュール内はフォーム要素の収集のみ。処理は標準Moduleが鉄則


以下が、プログラム記述になります。


発生箇所をよく見てください。マウスカーソルを変数の上に置くと、中身が表示されます。

4列目の値がSpaceであることが分かります。原因はこのセルの値が演算不可能な値だったため、と判断できます。つまり、[数量]が不正だったことが原因となったことが分かりました。

◆プログラムソースを解説します。

不正値ということは分かりました。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行づつ追跡する際に、要所にいれることで、
処理を停止し、変数の中身を画面に表示することができます。
この例では、4つの要素をチェックしています。

vbCrLf は、改行コードのことで、見やすく折り返し表示したいときに使います。

今回のサンプルでは、分かりやすいエラーだったため、原因究明が容易でした。

エラーの種類に実は文法エラーや論理エラーなどがあり、「実行時エラー」は落ちてしまうかわりに、場所が特定できるため、一番解決しやすいエラーのひとつです。


今回のテーマは、「原因究明のために行うデバッグ作業」について、解説を行いました。


本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。


全国対応!お気軽にお問い合わせください