MOS VBAエキスパート対策 | デバッグデの基礎 | MOS Excel VBAエキスパート対策です



最終更新日:2018-03-01

デバッグデの基礎


・デバッグとは
・論理エラーと文法エラー
・イミディエイトウィンドウ
・ブレークポイント
・ステップ実行

【ここでのポイント】

あまりにも範囲が広いため、どこまでが出題範囲なのか悩ましいてころです。
デバッグそのものを問う問題だとしても、例文にVBAコードが存在する場合は、そもそもVBAの基礎そのものが問われることになります。


デバッグで使う各機能自体は、そんなに難しいものではありません。
それらを実際のVBAにどのように当てはめて、どのようにデバッグするかを習得することが難しいものとなります。
デバッグ技術の習得は、経験を積む事でしか得ることが出来ないものです。

このように、デバッグは非常に奥深く習得に時間のかかるものです。
従って、少なくともベーシックでは難しいデバッグ技術については出題されないと思われます。
デバッグで使う各機能についての習得を問う問題くらいではないかと推測しています。
つまり、練習問題にあるような、単純な説明文での正否を問うくらいではないかと思っています。

とはいえ、実務ではデバッグは最重要であり、この力量差こそが、VBAスキルの差だと言えるものです。
実際にやりながら一つずつ確実に習得していってください。


デバッグとは

デバッグとは、プログラム中のバグを発見および修正し、動作が仕様通りになるようにするための作業です。

そもそもバグとは何かの定義が必要です。

バグとは
コンピュータプログラムの誤り、欠陥、不具合の事を表します。

この誤り、欠陥、不具合とは、
エラーでプログラムが停止してしまう場合もあれば、
プログラムは正常実行されたが、結果が仕様と食い違っている場合もあります。

エラー停止の場合は、バグの存在は直ぐに認識されますが、
結果の仕様との相違は、そもそも仕様がどうなっているかの精査が必要になります。

VBAコードを書いて、一発で思い通りの結果になることは稀な事です。
費やす時間で言えば、デバッグの方が多大な時間がかかることはむしろ普通の事です。

VBA開発の基本的な流れ
・仕様を決定する
・VBAコードを書く
・テスト実行する
・仕様通りの結果が得られるまでデバッグを行う

デバッグの基本的なステップ
・バグの存在を認識する
・バグの原因を特定する
・バグの修正方法を考える
・コードの修正をする
・実行テストする
これらの各ステップで必要となるVBEの機能が、以下で説明している各機能になります。
VBEには、「バグの原因を特定する」ために必要な機能が豊富に用意されています。


論理エラーと文法エラー

VBAのエラーには、文法エラーと論理エラーがあります。

文法エラー
文法エラーが表示されるタイミングは、
オプションの「自動構文チェック」のチェック状態により変わってきます。

「ツール」メニュー → 「オプション」



「自動構文チェック」にチェックがついている場合
VBEで、1行の入力が完了(Enterまたは入力行が移動)した時点で、
エラーメッセージが表示され、当該行が赤字になります。
さらに、行内の特定単語がハイライト表示される場合もあります。
(ハイライト表示されるのは、その単語位置に間違いがあることが明白な場合のみです)



「自動構文チェック」にチェックがついていない場合
VBEで、1行の入力が完了(Enterまたは入力行が移動)した時点では、
当該行が赤字になるだけです。



「バッグ」メニュー → 「VBAProjectのコンパイル」



コンパイルすることで、初めてエラーメッセージが表示されます。
メッセージは、チェックがついていると時と同じものです。

論理エラー
VBAの文法的には正しい、つまり記述自体は正しいと判断されるものの、実行する上で、論理的な間違いがある場合です。



「test」という名前のシートが無い場合にはエラーとなります。
もちろん、「test」シートがあれば正しく動作します。

「デバッグ」をクリックすると、



当該行が黄色でハイライト表示されます。(色はオプション内の設定で変更可能)
この状態をデバッグモードと言います。

この黄色の行の直前までが実行された状態で停止しています。
つまり、この黄色の行はまだ実行されていない、これから実行する行という事になります。

「終了」をクリックすると、ハイライト表示されずに単に終了してしまいます。
したがって、通常は必ず「デバッグ」をクリックして、エラー箇所を確認します。

エラーメッセージは、エラー内容ごとに違ったメッセージになります。



上記は、指定のオブジェクトに存在しないメソッドやプロパティをしていした場合です。
ワークシートにValueはありませんよね。

エラーの種類は多数あります。
実行時にトラップ可能なエラー番号一覧

上記の全てを覚える必要は全くありません。
以下が、どんな時に出るかを理解していれば十分です。

メッセージ 対策
オーバーフローしました。 データ型変換の結果が、その変数の許容範囲か確認
Integerに32768以上を入れている等
インデックスが有効範囲にありません。 存在しない配列要素を参照していないか確認
存在しないシートを指定している等
0 で除算しました。 0で割り算しています
型が一致しません。 互換性のないデータ型の間で代入を行っています。
数値変数に文字列を入れている等
オブジェクトは、このプロパティまたはメソッドをサポートしていません。 プロパティ名またはメソッド名が正しいかどうかを確認

以下も参考に見ておいてください。

よくあるVBA実行時エラーの解説と対応


イミディエイトウィンドウ

イミディエイトウィンドウは、式の評価、変数値の表示、一部の命令の実行が出来ます。
大きく分けると、以下の機能があります。
・プロパティや変数の中身を確認
・命令の実行
・Debug.Printの出力先

VBAのイミディエイトウィンドウは、マクロ実行していない状態でも使えますが、
通常は、マクロ実行途中にデバッグ目的でプロパティや変数の中身を確認するために使用します。

イミディエイトウィンドウの表示方法
「表示」メニュー → 「イミディエイト ウィンドウ」

初期設定では、VBEの右下に表示されます。



公式テキストでは、フローティングについて説明していますが、これは参考画像の都合だと思われます。
以下の機能があることだけ知っておいてください。
・オプションで、ドッキングするかを指定できる。
・ドッキングする場合は、マウスでドッキングしたりフローティングしたりできます

ただしこれは、イミディエイト ウィンドウだけではなく、他の全てのウィンドウで共通の機能になります。

イミディエイトウィンドウの使い方
プロパティや変数の中身を確認
先頭に?を付けると、その後に書かれている式(オブジェクト式、計算式、変数)を評価し、
その結果がウィンドウに表示されます。

?range("A1")

と入力してEnterすると、A1セルの値がすぐ下に表示されます。

?instr("abcde","c")

と入力してEnterすると、3と表示されます。
命令の実行
ここでの命令とは、

・プロパティの値の設定
・変数への代入
・関数
・ステートメント
※関数とステートメントは、使えるものとつかえない物があります。

プロパティの値の設定
range("A1")=123

と入力してEnterすると、A1セルに123が入ります。

変数への代入
イミィディエイト ウィンドウでは、Dimステートメントは使えません。
そもそも、変数宣言は不必要となっています。

i=10 Enter
?i Enter
10と表示されます。
i=11 Enter
?i Enter
11と表示されます。

関数
i=123
msgbox i



何らかの動作を伴う関数以外は実行できません。
単に文字列だけを戻す関数は実行してもエラーとなります。
例えば、left、right等々

ステートメント
For〜Nextなども、1行で書けば実行可能です。

for i=1 to 5:next
?i
6と表示されます。
上記の:は、複数ステートメントを1行に書くときの書き方になります。

mkdir thisworkbook.path & "\test"

実行しているブックの保存されているフォルダの中に"test"フォルダが作成されます。

Debug.Printの出力先
DebugオブジェクトのPrintメソッドを使用して、イミィディエイトウィンドウに値を出力できます。

Debug.Print Range("A1")

A1セルの値が、イミィディエイトウィンドウに出力されます。


ブレークポイント

マクロの実行を、任意の場所で一時的に停止させることが出来ます。

・ブレークポイント
・Stopステートメント

マクロを一時停止させる方法として、上記の2通りの方法があります。

ブレークポイント

VBAコードにブレークポイントを設定すると、
マクロはその直前まで実行され、プレークポイントの行の実行待ち状態で停止します。

ブレークポイントの設定方法


ブレークポイントを設定する行の左側、
上図のの位置をクリックすることで設定できます。
既にブレークポイントが設定されている場合は解除されます。

または、
ブレークポイントを設定する行に入力カーソルを置いて、
デバッグ → ブレークポイントの設定/解除またはF9
マクロを実行すると、ブレークポイントで一時停止します。



この状態から、F5実行することでマクロ実行は継続されます。



変数・定数の宣言ステートメントにはブレークポイントは設定できません。
例えば、
Dimステートメントには、ブレークポイントは設定できません。



Stopステートメント

マクロを一時停止させたい場所に、Stopステートメントを記述します。



F5実行でマクロ実行は継続されます。


ステップ実行

マクロの実行は、普通のF5実行等では一気に全てが実行されます。
VBAコードを1行ずつ確認しながら実行させることが出来ます。
これをステップ実行と言います。

ステップ実行するには、
「デバッグ」メニュー → 「ステップ イン」
ショートカットはF8



F8でステップイン実行すると、
最初に、Subステートメントが黄色で停止します。



さらにF8を押すと、次の命令で停止します。
Dimステートメントは飛ばされます。



さらにF8を押すと、また次の命令で停止します。



黄色で停止している行は、まだ実行されていません。
その直前までが実行され、これから黄色の行を実行するところで停止しているという事です。
なお、マウスカーソルを変数の上に合わせると、変数の値がヒント表示されます。


ステップオーバー、ステップアウト
試験にどこまで出題されるのか不明ですが、一応機能は知っておくべきでしょう。

F8ステップインでは、全ての行が1行ずつ実行されます。
SubプロシージャーをCallしている場合は、
Call先のSubプロシージャーの中も1行ずつ実行されます。

しかし、Subプロシージャーの中はステップイン実行しなくても良い場合があります。

ステップオーバーは、
Call先のプロシージャーの中は一気に実行して、元のプロシージャーの次の行で停止します。

ステップアウトは、
今停止しているプロシージャー内だけは一気に実行されます。

Sub test()
  Call test1
  Call test2
End Sub
Sub test2()
  Dim i As Long
  i = 1
  i = 2
End Sub
Sub test2()
  Dim i As Long
  i = 11
  i = 12
End Sub

このようなプロシージャーを用意して、
実際に、ステップイン、ステップオーバー、ステップアウトの動作を確認してください。

実務では使いますので覚えておいてください。
ただし、VBA試験に出題される可能性は低いのではないかと思われます。


その他のデバッグ用のウィンドウ

デバッグ用のウィンドとしては、
・ローカルウィンドウ
・ウォッチウィンドウ
これらもあります。

公式テキストでは、ウォッチウィンドウが説明されていますが、試験範囲の項目としては書かれていません。
従って、試験には出題されないと考えていますが、VBAを習得する過程として一通りは覚えておいた方が良いでしょう。

ローカルウィンドウ
現在のプロシージャ内で宣言されているすべての変数およびその値が自動的に表示されます。

ローカル ウィンドウが表示されている場合、
実行から中断モードに遷移したときには自動的に表示が更新されます。



使い方の詳細は、以下を参考にしてください。

ローカルウィンドウの使い方

ウォッチウィンドウ
マクロ実行中に、変数やプロパティの内容を監視できます。

監視したい変数やプロパティを式として、ウォッチ式に追加します。





式には、以下のようなものが指定できます。
・変数
・プロパティ
・変数およびプロパティを使った式

万一の試験対策としては、このダイアログの項目を見ておくくらいで十分でしょう。

何より、実務ではあまり使っている人はいないと思います。
理由としては、
監視する変数やプロパティを事前に追加しておくという事が面倒であり、
ピンポイントで監視したい変数がある時以外は使わないという事です。
ただし、とても強力な機能なので、デバッグで困った時には使えるようにはしておきましょう。


【業務改善の実務】

VBA試験としては、あまり重きを置くところではないと思われますが、
実務では非常に重要であり、デバッグ技術こそが、その人のVBAスキルと言っても良いものです。

ブレークポイント、イミディエイトウィンドウとローカルウィンドウ、そしてステップ実行
これらを使いこなすことで、デバッグを進めます。
(ウォッチウィンドウよりローカルウィンドウの方が使いやすく汎用性があります。)

実際のVBA開発では、初期のコーディングより、デバッグ時間の方が長くなるの事は普通の事です。
つまり、デバッグ技術の差が、VBA開発の時間の差になるとも言えます。
もちろん、最初に書いたVBAコードの質によって、デバッグ量(必要な時間)も変わってきます。
逆に言えば、
デバッグしやすいVBAコードこそが良いVBAコードと言っても良いでしょう。


【本サイト内の関連ページ】





同じテーマ「MOS VBAエキスパート対策」の記事

マクロの実行
VBAベーシック試験対策まとめ
プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作

新着記事 ・・・新着記事一覧を見る

For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)
Colorプロパティの設定値一覧|VBA技術解説(3月12日)
APIとOLEオートメーション|MOS VBAエキスパート対策(3月11日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.変数とデータ型(Dim)|ExcelマクロVBA入門
3.マクロって何?VBAって何?|ExcelマクロVBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.RangeとCellsの使い方|ExcelマクロVBA入門
7.とにかく書いて見よう(Sub,End Sub)|VBA入門
8.まずはマクロVBAを使う準備|ExcelマクロVBA入門
9.繰り返し処理(For Next)|ExcelマクロVBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。





このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

本文下部へ

↑ PAGE TOP