t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA ウォッチウインドウでツルカメ算を解く ~ ウォッチウィンドウの使い方・式とは何か

ウォッチウインドウの基本

VBエディタの表示メニューからウォッチウインドウを選択すると、以下のようなウインドウが開く。

f:id:t-hom:20160113225109p:plain

ウォッチウインドウとは、あらかじめ登録した変数やオブジェクトのプロパティの中身を、プログラムの実行中に確認できるウインドウである。
プログラムのデバッグ作業などに大変便利なのだが、使いこなせているだろうか。

今回は、簡単なプログラムでウオッチウインドウの使い方を説明する。

とりあえず、簡単なプログラムを用意した。

Sub KuKu()
    For i = 1 To 9
        For j = 1 To 9
            Sheets(1).Cells(i, j).Value = i * j
        Next
    Next
End Sub

このプログラムは実行するとセルに九九の計算結果を表示させる。
f:id:t-hom:20160113231017p:plain


さて、実行の前にウォッチウインドウ内の任意の空白で右クリックし、メニューからウォッチ式の追加を選択する。
f:id:t-hom:20160113225537p:plain

式にjと入力し、OKをクリックする。
f:id:t-hom:20160113231159p:plain

すると、ウォッチ式が追加される。
f:id:t-hom:20160113231400p:plain

今はまだマクロが実行されていない為、値は<対象範囲外>と表示されている。

ただ、この状態でF5でマクロを実行しても、表示は変わらない。
マクロは一瞬で終わってしまうので、表示される間もなく対象範囲外のままである。

ウォッチウインドウは、マクロの中断モードで威力を発揮するので、F8でステップ実行してみよう。
このマクロでは、3回F8キーを押すと次の状態になる。
f:id:t-hom:20160113232216p:plain

このとき注意したいのは、「For j = 1 To 9」はまだ実行されていないということだ。
黄色くハイライトされた行は、次に実行される行を示す。

さて、ここでもう一度F8キーを押すとFor j = 1 To 9が実行され、jに1が代入される。
ここでようやくウォッチウインドウでjの値を確認できる。
f:id:t-hom:20160113232435p:plain

何度かF8でステップを進めると、jの値が変化していくのが分かるかと思う。

変数をひとつずつ見たいだけなら、中断モードで変数にマウスカーソルを重ねるとクイックヒントで確認することもできる。
f:id:t-hom:20160113233334p:plain

しかしオブジェクトのプロパティはカーソルを重ねても表示されない。

ウオッチウインドウなら、式として登録しておくことで、オブジェクトのプロパティの中身も表示することができる。
f:id:t-hom:20160113233623p:plain

式とは何か

先ほどから「式」という単語を使用しているが、皆さんが普段思い浮かべるのはまず計算式だろう。
1 + 1 = 2というやつだ。

あるいは化学式などを思い浮かべる方もいるかもしれない。

プログラムにおける「式」をひと言でいうと、「評価され、値を持つもの」である。

そもそも「評価する」という言い回しがよくわからないかもしれない。「評価」という言葉は一般的に「高く評価する」「評価が低い」など、ものごとの良し悪しを判断するときに使われる。

しかしプログラミングにおいて「評価」とは、式を値に変換することを示す。

例えば1+1を評価すると、2となる。これはわかりやすい。

次に、変数aに10が格納されているとき、aを評価すると10になる。
このときaは、それ自体が式なのである。
ちゃんと、「評価され、値を持つもの」の定義に合致している。

次に、数字の「1」はどうだろうか。
これはただの値でしょ?と思うかもしれないが、「1」も実は式である。
「1」は評価されると「1」になる。

「変わってへんやんけ!」と突っ込まれそうだが、「値を評価すると値。ゆえに値も式と言える」という理屈なので、慣れるしかない。

たとえば手持ちの書籍を売るとき、評価額が1,000円でした。これは簡単。
じゃあ手持ちの現金1,000円を評価したら?評価額は1,000円。当たり前すぎて評価する意味がわからないと思われるかもしれないが、まあ、それと同じ理屈で、「1を評価すると1」「10を評価すると10」ということだ。

ということで、変数も、値も、式である。
もちろん、等式「a = b」、不等式「a > b」などの比較演算も式であるし、計算式も式である。

ただし、VBAにおいて、代入は式ではない。
たとえば、「a = 1 + 2」という代入文は、右辺は「1+2」という式であるが、代入文全体は値を返すわけではないから式とは言えない。

対して、C言語の代入文は式である。
Cで「a = 1 + 2」と書くと、まず右辺が評価され3になり、aに3が代入され、最後に文全体が評価されて3になる。

その証拠に、「b = (a = 1 + 2)」と書くと、aに3が代入された後、bにも3が入る。

ウォッチ式とは

式の定義が分かればウオッチ式も簡単。
ウォッチしたい式がウォッチ式である。そのまんまだ。

プログラム中に登場しないプロパティをウォッチすることもできる。
f:id:t-hom:20160114002734p:plain

また、特定セルを監視した状態でマクロをF5で実行し、監視したセルが変化したときにマクロを中断させることもできる。
f:id:t-hom:20160114003210p:plain
f:id:t-hom:20160114003407p:plain

ウォッチウィンドウでツルカメ算を解く

まあ、普通はVBA上の条件式で解けば良いのだけれど、今回はウォッチウインドウの使い方の練習なので、あえてウォッチ式を使ってツルカメ算を解いてみよう。

まず用意するコードはこちら。

'ツルとカメが合わせて8匹、足の数が合わせて26本であるとき、
'ツルとカメは何匹(何羽)いるか。
'ただしツルの足は2本、カメの足は4本である。
Sub 鶴亀算()
    For= 0 To 8= 8 -Next
End Sub

単純に、鶴と亀を一匹ずつ入れ替えている。

次に、鶴と亀をそれぞれウォッチウィンドウに追加する。

f:id:t-hom:20160114005446p:plain
式の左にあるメガネのアイコンが、単純にウォッチしているという意味である。

そして以下のように等式を入力し、True時に中断されるようにセットする。
f:id:t-hom:20160114005645p:plain

f:id:t-hom:20160114005751p:plain
式の左にある手に水色の紙を乗せたようなアイコンは、True時に中断するという意味である。

そしてF5でマクロを実行すると!


このとおり。

f:id:t-hom:20160114005930p:plain

足が26本になった時点でマクロが中断モードに入り、その時に鶴は3匹、亀は5匹であることが分かる。

これでウォッチウインドウもバッチリマスターできたと思う。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。