EXCEL、VBAプログラミング入門 6 ~デバッグ (イミディエイトとウォッチ) ~

●目次
はじめに
デバッグ作業のツール
イミディエイトウィンドウ
ウォッチウィンドウ
デバッグ作業
変数の宣言
プログラムのリセット
変数の定義と宣言
変数の宣言を強制
コンパイルエラー
変数の強制的宣言のメリット
まとめ

●はじめに
それでは、Excel VBA プログラミングについて、ご説明をさせていただきたいと思います。前回の入門5講座では、「ワーク」という変数について解説をさせていただきました。そのプログラムは、次の図に示すような形なのですが、その中で「ワーク」という変数があって、セルから値を取ってきて変数に入れて、更に、セルに値を返すというプログラムです。このプログラムは3行しかないのですが、次の図に示すように一つのプログラムです。このプログラムについて一通り解説をさせていただきました。

前回までは、プログラムで記述されている変数や配列などのオブジェクトの値を確認するために、次の図のように、プログラムの「ステップ実行」により、プログラムを一時停止して、「ブレークポイント」を設定し、変数やオブジェクトにカーソルを当てて、その値を表示させて確認してきました。これはプログラムのデバッグに役立つ一つのやり方です。

今回は、デバッグ作業に役立つ別のツールとして「イミディエイト」と「ウォッチ」について、以下に解説をしたいと思います。また、前回解説しました変数の宣言についても、デバッグの観点から、補足の説明をしたいと思います。

デバッグ作業のツール
デバッグとはプログラムを作ったときのミスやプログラムの正常な動作を確認する作業のことですが、そのデバッグ作業の時によく使うツールとして、「イミディエイトウィンドウ」や「ウォッチウィンドウ」があります。これらの項目について、以下にご説明させていただきます。

イミディエイトウィンドウ
次の図のように、プログラムのコードウィンドウで、「表示」タブの中の「イミディエイトウィンドウ」を開けてみると、「イミディエイト」というウィンドウがプログラムコードの下に表示されます。

「イミディエイト」という言葉は「即時の」という意味を持っています。「イミディエイトウィンドウ」は、知りたいことや確認したいことを即時に知ることができるウィンドウです。
「イミディエイト」というのは何かというと、「イミディエイトウィンドウ」の中で、例えば、次の右図のように、”?Rage(“b3”).Value”と入れて ”Enter キー” キーを押しますと、”1” が表示され、”Rage(“b3”).Value” の値が出てきます。
変数「ワーク」については、プログラムコードを1行進めて、変数「ワーク」に ”Rage(“b3”).Value” の値 ”1” を入れた後に、イミディエイトウィンドウで、” ? ワーク” と入れて ”Enter キー” を押しますと、”1” が表示され、現時点での変数「ワーク」の値が出てきます。

変数やオブジェクトの名前が非常に長い時には、プログラムコード画面で、変数やオブジェクトにカーソルを当てただけでは、その名前を表示できないので、このように、「イミディエイトウィンドウ」で表示しますと、変数やオブジェクトの名前が正しく表示され、プログラムのデバッグ作業に役に立つので結構使われます。

ウォッチウィンドウ
デバッグ作業のツールには、他にも「ウォッチウィンドウ」があります。
次の図で、「表示」タブ → 「ウォッチウィンドウ」タブを押すと、プログラムコードの下に、「イミディエイトウィンドウ」とともに「ウォッチウィンドウ」が表示されます。

次の左図のプログラムコードの画面で、例えば、Range(“b3”)を選択し、反転表示させて、右クリックして、「ウォッチ式の追加」タブを押すと、右図の「ウォッチ式の追加」画面が現れます。この画面で、「OK」ボタンを押すと、下図の「ウォッチウィンドウ」に、式Range(“b3”) の値が ”1” と出てきます。

このRange(“b3”)というのは一つの「オブジェクト」になっていまして、「ウォッチウィンドウ」で、Range(“b3”)の (”+”) ボタンを押すと、次の図のようにいろいろな値を持っていることがわかります。

例えば、今回の場合は、Range(“b3”).Valueというオブジェクトを見ているので、次の図の「ウォッチウィンドウ」で、Valueはありませんが、式Value2を見ると、”1”という値になっています。

Range(“b3”)はオブジェクトであり、いろいろな内容を持っていますので、その時には「ウォッチ式」で見た方がわかりやすいのです。ここで、Range(“b3”).Value2の内容を1回確認してみます。例えば、Range(“b3”) まで打って、ポチ (.) と押すと、次の左図のように、Range(“b3”) はオブジェクトなので、いろいろな内容のを持っているのです。その中に、次の右図のように、値を取得するバリューとしてValueやValue2が見られます。

ここで、オブジェクトRange(“b3”).Value2の値を確認してみます。次の図のように、カーソルを当ててみますと、確かに ”1” が入っています。このように、Value2でも問題ないようです。通常はValue2ではなく、Valueを使います。

以上のように、「ウォッチ式」の場合にはオブジェクトの中身を見られるという形になっています。

デバッグ作業
以上のように、プログラムのデバッグでは、「イミディエイトウィンドウ」や「ウォッチ式」を使って、変数やオブジェクトの式や値などの中身を見ていくというやり方を使っています。

変数の宣言
「変数」は一時的にデータを保存する領域であり、数値や文字などのデータを入れる入れ物のようなものです。Excel VBA プログラミングでは、「変数」は特に宣言をしなくとも使用することができますが、変数を宣言せずに使用するとプログラムのミスに気づきにくくなります。プログラムの先頭で、”Option Explicit” を記述して、各変数を使用する前にその変数の明示的な宣言を強制することにより、変数名に関連するエラーを防ぐことができます。この点に関して、以下に事例を紹介してご説明いたします。

プログラムのリセット
次の図で、「リセット」ボタンを押すと、プロシージャの実行が強制終了されて、プログラムがリセットされます。

変数の定義と宣言
次の図のプログラムコードを見ますと、「ワーク」という変数を「文字列型(String)」として、データ型を定義して宣言しています。

変数の宣言を強制
ここで、「ツール」タブの中の「オプション」ボタンを押すと、「オプション」画面が表示されて、「変数の宣言を矯正する」にチェック マーク(✓) が入っています。

通常の場合は、「オプション」画面では、このチェックマーク(✓) は抜けている場合が多いと思うのですが、このチェックマーク(✓)が抜けていると、プログラムはその変数の宣言を確認しないのです。これはどういうことかと言いますと、変数の宣言をしなくてもよいということです。

「オプション」画面で、”☑ 変数の宣言を強制する” として、チェックマーク(✓)が付いていると、プログラムのコード画面の「宣言セクション」に、”Option Explicit”という宣言が表示されます。この場合は変数の宣言をしなければなりません。

コンパイルエラー
「オプション」画面で、”☑ 変数の宣言を強制する”として、チェックマーク(✓)が付いていると、プログラムのコードで、変数の宣言をしないでコンパイルすると、次の図のように、「コンパイルエラー」となります。

変数の強制的宣言のメリット
コンパイルとは何かというと、プログラムが正しく書かれているかをチェックすることです。多くの場合、初めは変数を強制的に定義し、宣言しないことになっているのではないかと思います。その理由として、次の図のように、変数の型にはInteger, Longなどいろいろあり、何を定義するのかがよく分からないので、変数を宣言するのは面倒くさいのではないかと思われます。

以上のように、変数を強制的に宣言するのは面倒くさいのですが、プログラムのミスを防止するためにも、変数は強制的に定義し、宣言をしておいた方がよいと思います。
その理由は、例えば、よくあるケースとして、「ワーク」という変数を間違って、例えば、「ワーク1」とした場合です。「ワーク」だと思って「ワーク1」と書いてしまったとします。そうすると、この時、” ☑ 変数の宣言を強制している” としていると、「ワーク1」は定義されてないので、デバッグでコンパイルすると、”変数が定義されていません。” のエラーメッセージ゛が出て、コンパイルエラーになります。
変数の定義をしなくてよい場合は、「ワーク1」という新しい変数が定義されたと、プログラムはみなすのです。
プログラムの作成者自身は、「ワーク」と「ワーク1」は同じ変数だと思っているのですが、プログラムでは、「ワーク」と「ワーク1」は違う変数なのです。

次の右図のプログラムを実行した結果としては、この変数「ワーク1」は常にスペース(” ”) になりますから、Range(“b3”) の値としては、「ワーク1」の値 (” ”) に ”1” を結合して、常に ”1” がセットされることになります。
次の左図の本来のプログラムは、Range(“b3”) の値を変数「ワーク」に代入して、この 変数「ワーク」の値に ”1” を結合し、その結果をRange(“b3”)に代入するというプログラムになるのです。この場合は、Range(“b3”)の値は、プログラムを動かす毎に、”1”ずつ、文字が増えていくことになります。

Range(“B3”)の値 プログラムを動かす毎に、
”1”ずつ、文字が増えていく
常に ”1” がセットされる

このように、変数の記入ミスというプログラムの書き間違いはよくあるエラーになりますので、そのようなことがないように、プログラムの作成の基本としては、きちんと変数の型を定義し宣言して、プログラムを書くことをお勧めしたいと思います。●まとめ
プログラムを作成して、その動作を確認するデバッグ作業では、「ステップ実行」により、「ブレークポイント」を設定して、変数の中身を確認することが大切であります。
その時に役立つツールが今まで説明してきました「イミディエイト」や「ウォッチ式」であり、プログラムの作成者が意図していた値がきちんと取得できているのかを一行ずつ見ていく「ステップ実行」により、プログラムを一行ずつ確認していくというやり方でプログラムを書くのです。
これは、実は Excel VBA に限ったことではなくて、すべてのプログラム言語で、いわゆる「デバッグ」する共通のやり方になりますので、身につけていただきたい内容であると思います。


弊社は、主に中小企業様向けの業務システム開発ホームページ制作パソコンサポートコンサルティングなど、ITに関する様々なサービスを格安で提供しております。
特に小規模な業務システム開発の分野では、主にAccess(アクセス)を利用した柔軟で効率的な開発を得意としており、関西でダントツの実績があります。

業務システム開発に関しては、以下のような内容で対応しております。
・顧客管理などの単機能なシステムは20万円~50万円が多い。
・受注から入金まで業務全体システムで100万円~350万円ぐらいが多い。
・Access(アクセス)-SQLserverで大規模システム開発は350万円~1500万円が多い。

詳細は、Access(アクセス)、Excel(エクセル)、WEBサイト製作による小規模システム開発のページをご参考ください。

大阪商工会議所からの推薦を受けて、中小企業庁運営の中小企業支援事業に専門家として登録されました。
通称ミラサポ。3回まで無料でのコンサルティングが可能です。ご興味がある方はご連絡ください。
https://www.mirasapo.jp/


(近畿大学にて非常勤講師も務めたバリバリの技術屋が経営する会社)

Access(アクセス)Excel(エクセル)SQL server バーコード Webシステムを使った業務システムのシステム開発の無料相談を受付中

株式会社 アイライト 担当:内藤 響(Naito Ko)
〒550-0005 大阪市西区西本町1丁目5番9号 日清ビル 5F
(四つ橋線 本町駅 24番出口すぐ)
まずは、メール・電話でご相談ください。
TEL : (06) 6599-8890 E-mail : info@ai-light.com
お電話が混んでいる場合が多いので、つながりにくい場合は
TEL : (06) 6535-5117までお願いします。


株式会社アイライト公式HP
https://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)

無料から学べる講座
https://www.ai-light.com/itkeiei/

ITでお困りのことがございましたら、まずはご相談(コンサルティング)
https://www.ai-light.com/itconsulting.html

格安ホームページ制作所
https://www.ai-light.com/hp2

YouTubeチャンネル(無料動画配信中)
https://www.youtube.com/user/ailightcom

ニコニコチャンネル(月額固定で見放題)
http://ch.nicovideo.jp/ai-light