VBAエキスパート対策
デバッグデの基礎

Excel VBAエキスパート対策です
公開日:2018-03-01 最終更新日:2019-08-26

デバッグデの基礎


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


【ここでのポイント】

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

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

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

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

デバッグとは

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

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

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

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

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

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

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

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

論理エラーと文法エラー

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

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

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

MOS VBA 画像

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

MOS VBA 画像

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

MOS VBA 画像

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

MOS VBA 画像

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

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

MOS VBA 画像

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

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

MOS VBA 画像

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

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

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

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

MOS VBA 画像

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

エラーの種類は多数あります。
実行時にトラップ可能なエラー番号一覧
・マクロVBAでのエラーとは ・VBA実行時のエラー番号一覧 ・実行時にトラップ可能なエラー番号一覧の最後に

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

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

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

よくあるVBA実行時エラーの解説と対応
・データ型のエラー ・計算時のエラー ・インデックスのエラー ・オブジェクトの設定エラー ・メソッド・プロパティのエラー ・引数のエラー ・実行時エラー関連記事

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

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

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

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

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

MOS VBA 画像

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

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

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

?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

MOS VBA 画像

何らかの動作を伴う関数以外は実行できません。
単に文字列だけを戻す関数は実行してもエラーとなります。
例えば、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コードにブレークポイントを設定すると、
マクロはその直前まで実行され、プレークポイントの行の実行待ち状態で停止します。

ブレークポイントの設定方法
MOS VBA 画像

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

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

MOS VBA 画像

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

MOS VBA 画像

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

MOS VBA 画像


Stopステートメント

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

MOS VBA 画像

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

ステップ実行

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

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

MOS VBA 画像

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

MOS VBA 画像

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

MOS VBA 画像

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

MOS VBA 画像

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


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

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を習得する過程として一通りは覚えておいた方が良いでしょう。

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

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

MOS VBA 画像

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

ローカルウィンドウの使い方
VBAのエディター、VBEにはいくつかのウィンドウがあります、その中で、ローカルウィンドウの使い方の説明です、これが使えないと、配列やオブジェクトを扱ったVBAのデバッグに困ることになります。サンプルコードは、以下の表を使っています。まずは、配列でのローカルウィンドウの使い方について。

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

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

MOS VBA 画像

MOS VBA 画像

ウォッチ式への追加方法としては、
VBEで、変数やプロパティ(オブジェクトも含んだ完全なオブジェクト式)を選択し、
ドラッグして、ウォッチウィンドウにドロッブすることでもウォッチ式に追加できます。

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

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

何より実務としては、まずはローカルウィンドウを使えば済んでしまう事が多いはずです。
ただし、
ローカルウィンドウではモジュールレベル変数が表示されていないので、
モジュールレベル変数を見たい場合には必要になってきます。

ウォッチウィンドウを使う必要性が出てくるのは、
数個の変数や特定のプロパティを、プログラムの進行とともに監視するような場合になるでしょう。
使いこなせばとても強力な機能なので、デバッグで困った時には使えるようにはしておきましょう。

【業務改善の実務】

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

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

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

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

第11回.イミディエイトで値の確認
前回、FormulaR1C1とValueの違いを説明しましたが、それを確認するための方法を紹介します。これはデバックで使用するツールになります。デバッグとは、プログラムの誤り(バグと呼ばれる)を探し、取り除くこと。

コーディングとデバッグ
・効率的なコーディング ・デバッグ ・イミディエイト ウインドウ(Ctrl+G) ・ローカル ウインドウ ・「ツール」→「オプション」 ・陥りやすい間違い、よくやってしまう間違い ・サイト内の関連ページ

ローカルウィンドウの使い方
VBAのエディター、VBEにはいくつかのウィンドウがあります、その中で、ローカルウィンドウの使い方の説明です、これが使えないと、配列やオブジェクトを扱ったVBAのデバッグに困ることになります。サンプルコードは、以下の表を使っています。まずは、配列でのローカルウィンドウの使い方について。

実行時にトラップ可能なエラー番号一覧
・マクロVBAでのエラーとは ・VBA実行時のエラー番号一覧 ・実行時にトラップ可能なエラー番号一覧の最後に

よくあるVBA実行時エラーの解説と対応
・データ型のエラー ・計算時のエラー ・インデックスのエラー ・オブジェクトの設定エラー ・メソッド・プロパティのエラー ・引数のエラー ・実行時エラー関連記事

VBAエキスパート公式テキスト

2019/5/30発売リニューアル版


2019/7/26発売リニューアル版

こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。



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

ステートメント
ブックの操作
シートの操作
デバッグデの基礎
マクロの実行
VBAベーシック試験対策まとめ
プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処


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

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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