処理中の不具合で「実行時エラー」が発生すると、その瞬間にプログラムは落ちてしまいます。
みなさん、こんにちは。セルネッツ竹本です。
今回は、「原因究明のために行うデバッグ作業」をテーマに、解説をしたいと思います。
◆デバッグ(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実務の効率化において、ご参考お役立てになれば幸いです。