Wordマクロ その3.1 変数の話(続き)


関数の話をすると言いながら、もう少しだけ変数について話しておくことにしました。
この辺りは大変重要ですので、もう一度確認しておきたいのと、実際に自分自身で確認する方法について述べておきたかったためです。

変数も定数もプログラムの実行中に「値を保持する入れ物」です。基本的に、この入れ物には値が1つしか入りません(後述するデータ型の中には複数の値を扱えるものもあります)。
違いは、変数はプログラムの実行中に何度でも値を変更でき、定数は一度定義した値が変更されないという点でした。

変数にも定数にもデータ型があります(定数も同じです)。
データ型とは、変数が保持する値の「種類」のことです。VBAには幾つものデータ型が存在しますが、翻訳者がマクロを作成する場合、String型(文字列)とInteger型(整数)が主に使われることになると思います。Object型などの特殊な変数については後日説明するとして、ここでは一般的な変数について話します。

変数についてあれこれ説明するよりも、実際にどのように値が入れられ処理されるのかを見る方が良いと思いますので、今回はVisualBasic Editorのデバッグツールを使って、値の変化を確認します。 VisualBasic Editorはマクロを作成する上で、非常に強力なツールです。特にデバッグツールの基本機能は覚えて損はありません。強力な開発ツールですが、初心者でも十分使いやすいツールですので、マクロを作成する方はぜひ活用してください。

では、実際にプログラムを書いて、変数とデータ型を確認してみましょう。

VisualBasic Editorを開いて、次のようにテスト用のマクロを作成します。

VBED0012

このマクロは処理がプログラム内だけで完結するので、ワードの文書には影響しません。
見てわかると思いますが、異なる型を持った4つの変数を使用しています。

最初に4つの変数を定義しています。
次に、その変数に値を代入しています。
その後、次の2つの式でテストします。

1つ目は、strTxtの値を足して、strTxtに戻します(演算子などについては後日説明)。
2つ目はintNumの値を足して、intNumに戻します(intNum x 2と同じ)。

この式で変数がどう変わるかを確認します。

確認するために、画面下部にあるウォッチウィンドウを使用します。
表示されていない場合は、[表示] > [ウォッチウィンドウ] で表示してください。

VBED0008VBED0009

ウォッチウィンドウ上で右クリックして [ウォッチ式の追加] を選択します。
表示されたダイアログの [式] に変数名を入力します。

4つの変数をすべて入力し終えると、下図のようになります(順不同)。

VBED0015

カーソルをマクロの直前に置きます。

では、マクロを1行ずつ実行していきます。
F8 を押します。実行される行は「⇒」で示されます。
下図の赤枠の中がどう変化するのか、確認しながら F8 を押していきます。
「varTst = ""」の所で F8 を押すと下図のようになります。

VBED0001

宣言された変数に値が設定されました。
では、2つの式をデバッグします(1つずつ)。

VBED0014

赤枠の中を注目してください。
intNumが「1」から「2」に、strTxtが「テスト」から「テストテスト」に変化しました。
おそらく、想像通りだったと思います。

では、式を変えてみましょう。

前の2つの式を消して、次の式を記入します。

strTxt = intNum
dblNum = dblNum + intNum

strTxtにintNumを代入してみます。
文字列型に整数型を代入したらどうなるでしょうか?
さらに、Double型の値(小数)と整数型の値を足して、Double型の値に代入したらどうなるかを確認してみましょう。

VBED0010

strTxtに整数を代入しましたが、「”1”」となっていますので文字列の「1」が代入されています。整数が文字列に変換されたようです。

VBED0002

Double型の値(3.14)とInteger型の値(1)を足し、結果はDouble型の値(4.14)になりました。異なる型でも上手く変換処理される場合があるようです。

そこで、String型の値とInteger型の値を足して、文字列に代入してみます。
式を次のように書き換えて、最初からデバッグします。
strTxt = strTxt + intNum

VBED0004

エラーになってしまいました。[終了] をクリックしてマクロを終了します。

では、同じような式でInteger型の値に代入したらどうなるでしょうか。次の式に変更してデバッグします。
intNum = strTxt + intNum

VBED0005

やはり、型が一致しないためエラーになってしまいました。
終了をクリックして、デバッグを終わります。

なんとなくで構いませんが、変数が代入される様子や、データ型が異なる値を使うとエラーになることがおわかりいただけたかと思います。何故エラーになるかは説明が難しくなりますので、とりあえず「保持できるサイズが異なるから」とでもしておいてください(大雑把で十分)。大事なことは、適切に変数を宣言し使用することです。

では、最後に万能のVariant型を見てみましょう。次の2つの式に変更します。
varTst = dblNum + intNum
varTst = strTxt

最初に、Double型の値とInteger型の値を足して、varTstに代入します。
前に見たように加算の結果はDouble型の値になるはずです。

次に結果を代入したvarTstにString型の値を代入します。

これまでと同じように式を書き換え、デバッグを開始します。

値と型を確認しながら、F8を押してください。

VBED0006

varTstの値が「Variant/Double」と表示されています。現在、Double型の値が保持されていることが分かります。

F8を押して次の行を実行します。

VBED0007

文字列「テスト」が代入されて、型がString型に変わったことがわかります。

このようにVariant型は万能な変数ですが、多用すると処理速度や可読性が低下するため、なるべく使用しないことをお勧めします。
正しく変数を定義することを心懸けてください。

ウォッチウィンドウを使って値を監視する方法をおわかりいただけたでしょうか。これを使って、自分で変数や式を試してみてください。より理解が深まることと思います。

蛇足:
変数はプログラムにより異なり、その宣言方法もさまざまです。
例えば、秀丸マクロの場合、データ型は数値と文字列のみで、
$a = “テスト”;
#a = 1234;
のように使います。

C/C++/C#では
int a = 3;
など、定義と同時に初期化することもあります。

これで、変数を終わります。
次回はちょっと間を置いてから、変数について話します。

では、また。

コメントしてみる