こんにちは。カイリーーです。
今回はVBA初心者の方に向けた、VBE(プログラムコードを書くエディター)の効率的な使い方についてお伝えします。
VBAを学び始めたあなた、がむしゃらにコードを書いては実行して、想定した結果が出るかどうか、こんなことを繰り返してないですか?
そんな方に朗報な情報を今回はお届けしたいと思います。
この記事の対象者
- VBAを学び始めてデバッグ操作などが分からない人
- ウォッチウィンドウを使ったことがない人
Table of Contents
デバッグとは
デバッグとは、書いたプログラムコードが想定した結果が得られなかった場合や、プログラムがうまく動かない、そういった場合に原因はどこにあるかな?というのを突き止めるために行う作業のことです。
デバッグ = debug
de = 取り除く
bug = バグ
デバッグの名前の意味はこういう意味です。
デバッグをするときはどんな時?
デバッグをするときは以下の二つが考えられます。
- プログラムを実行したらエラーが出てしまった
- プログラムを実行したらエラーは出なかったけど、想定している結果と異なっている
- 変数の中身を確認したい場合
1,2はどちらも原因となっているところを突き止めて、その原因となっているものを正しく直してやる必要があります。
3は変数にどんな値が入っているのか、というのをプログラムの実行中に確認したい場合に有効です。
では実際にデバッグ操作をしてみましょう。
ブレークポイント
例えば次のような表の、セルC2に対して、姓と名を連結して表示させたい、といったことをする場合の例で見てみましょう。

実行するコードは以下のように準備しましょう。
Option Explicit
'名前の連結
Sub test()
Dim sei As String
sei = Cells(2, 1)
Dim mei As String
mei = Cells(3, 2)
Cells(2, 3) = sei + mei
End Sub
では実際にこちらのコードを実行するとどうなるか?
結果は以下のようになります。

セルC2に想定している結果は「山田太郎」と出てほしいはずですが、「山田」しか表示されませんでした。
では、実際にどこに原因があるのか探ってみましょう。
今回、変数に「sei」と「mei」というものを使いました。
この「sei」にはセルA2の「山田」が代入され、「mei」にはセルB2の「太郎」が代入され、連結された結果、C2に「山田太郎」と出てほしいのですが、変数の中身が想定したものが入っているかどうかを確認していくことをしていきます。
まずはブレークポイントというものを使用していきます
コードウィンドウの左にある以下の図のところ当たりをクリックします。
そうすると、背景が茶色っぽい色に変わったと思います。

ブレークポイントの設定はこれでOKです。
デバッグ操作
ではこれで、コードの実行をしてみましょう。

ブレークポイントを設定して、コードの実行を行うと、ブレークポイントを設定した場所でコードの実行を止めることが出来ます。
実行を行った後、ブレークポイントを設定した背景が黄色に変わっているところで、プログラムの実行が止まっています。
これが、ブレークポイント最大の強みです。
そこから、コードを一行一行実行していくステップ実行というものを行っていき、変数の中身が想定した値が入っているか?などを確認してく作業を行っていきます。
変数にカーソルを合わせると、変数の中身を確認することが出来ます。
この状態からF8を押してステップ実行を行います。
この時点ではCells(2, 1)の値はseiに代入されてない状態です。

ステップ実行で一行進むと変数にセル2行目,1列目の値「山田」が代入され、変数の中身を確認することが可能です。

では問題となっていた、meiの方も見ていきましょう。

変数の中身は空になっていますね。
ではなぜか?というとCells(3, 2)は3行目、2列目の値を代入しています。
3行目2列目の値がなにか?というと、何もありませんね。

要するに、指定している行数が違っていた、ということに気付けます。
今回例だと、コードが短いのと単純なコードであったため、デバッグしなくても見つかられたかもしれませんが、これがもっと複雑になっていくと、デバッグなしで原因と特定するのは容易ではありません。
ステップ実行については細かく説明すると、F8のステップインとShft+F8でステップオーバーという操作方法がありますが、今回は超初心者向けということでステップインを中心に説明しました。
気になる方は「VBA ステップオーバー」などで検索してみてください。
ウォッチウィンドウ
変数の中身を確認する方法にはもう一つ、ウォッチウィンドウを活用するという方法もあります。
変数名にカーソルを合わせて、右クリック→ウォッチ式の追加をします。

そうするとウォッチウィンドウが画面下に現れて、変数の値を確認することができます。

今このウォッチウィンドウで表示されている「sei」という変数は、値が何も入っていない状態を表しています。
コードを実行すると、seiに対して値が代入される前の状態が以下

代入された後の状態が以下となります。

こんな形でウォッチウィンドウを活用する方法もありますし、ウォッチウィンドウにはもう一つ、変数の値を意図的に変えることも出来ます。
例えば、今回変数meiは指定しているセルが誤っていた為、正しい値をセルに表示することができませんでした。

このmeiに「太郎」が入っていれば、セルC2に「山田太郎」が正しく入力されるはずだ、とちょっとコードを変更する前に結果を確認したい場合などに、このウォッチウィンドウのmeiの値の””(ダブルクォーテーション)の中に”太郎”という形で入れてEnterしてみましょう。

そうすると、meiに”太郎”が代入され、「山田太郎」という結果を得ることが出来ます。
これはあくまで、その時点でこの変数に、この値を入れれば想定した結果になるはずだ、というのを確認する為に用いるようにしてください。
今回デバッグに関することをさせていただいたのは、僕がプログラム書き始めのころ、このブレークポイントやデバッグ、変数の中身の確認の仕方が分からず、いつまでも想定した結果を得られず何時間も無駄な時間を使ってしまった経験があります。
これを知っておくだけで、目的のものを完成させるまでに大幅に短縮できるはずですので、ぜひ活用ください。
VBAを効率的に学習するためにおすすめ書籍についてまとめた記事もぜひごらんください
ここまで読んでいただきありがとうございます。
このブログの内容が良かったとか、ご意見、ご質問などありましたらTwitterのDMまでお問い合わせください。