t-hom’s diary

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

VBA 変数で躓いた方に贈る、くどいくらい丁寧な変数の説明

さて、今回は初心者向けの記事なので、本文を「ですます調」で書くことにする。
途中でこのように緑文字でコメントを入れる。コメントはいつもどおり「だ・である調」で書く。本文は黒文字とする。

プログラミングでは「変数(へんすう)」という道具を利用して一時的にデータを保存することができます。

数学でも変数という用語が出てきますが、いったんそれは忘れてください。数学では不定値を仮に「x」とするなどの使われ方をしますが、プログラミングで変数はデータの保存に使う道具なので、別物だと割り切って考えましょう。

プログラミングで変数に保存するのは「数」に限らず、「人の名前、物の名前、セリフ、日付、正しいか間違いかの判定結果」など様々です。

データを保存するには、「変数名 = データ」の形で記述します。ここでも、数学の「イコール」は一旦忘れてください。このイコールは「この変数にこのデータを保存してください」というコンピューターへの指示に使う記号です。

ではやってみましょう。
「こんにちは」という文字を「あいさつ」という変数に入れるには、このように書きます。

Sub サンプルマクロ()
     あいさつ  = "こんにちは"
End Sub

「え?」と思われた方もいるでしょう。変数って「x」とか「y」のことじゃないの?と。いえ、数学の変数とはもはや別物で、好きな名前をつけることができます。英数字しか使えないプログラミング言語が多いので一般的には「greeting」といった英語で命名することが多いですが、VBAでは漢字仮名も使えるので別に日本語の名前をつけても構いません。

変数は人が読んで意味の分かる名前を付けることが推奨されています。

さて、保存した値を利用するには、単に値の代わりに変数を書くだけです。保存と合わせてやってみましょう。

Sub サンプルマクロ()
    あいさつ = "こんにちは"
    MsgBox あいさつ
End Sub

これで「こんにちは」というメッセージを表示させることができました。でもこれだと何が嬉しいのかわかりませんよね。だって最初からこう書けばいいじゃないですか。

Sub サンプルマクロ()
    MsgBox "こんにちは"
End Sub

では次の例をみてみましょう。

Sub サンプルマクロ()
    yourName = InputBox("あなたの名前を入力してください。")
    MsgBox "こんにちは" & yourName  & "さん"
End Sub

このマクロは、ユーザーに名前を入力させてその結果を表示します。

以下のように変数を使わずに書くこともできますが、なんだか長ったらしくなって読みにくいですよね。

Sub サンプルマクロ()
    MsgBox "こんにちは" & InputBox("あなたの名前を入力してください。")  & "さん"
End Sub

それに、以下のように名前を2回表示させようと思ったら、やっぱり変数を使うしかありません。

Sub サンプルマクロ()
    yourName = InputBox("あなたの名前を入力してください。")
    MsgBox "こんにちは" & yourName  & "さん。"
    MsgBox yourName  & "さんはお元気ですか?"
End Sub

もし変数がなければ、名前を表示させるたびに尋ねないといけませんから。

このように変数は、「データを保存する道具」であると理解してください。そしてデータを保存することを、専門的には「代入」といいます。これも数学から用語だけ持ってきたような代物ですので、「代入」と聞いたら、「ああ、保存することだな」と思っていただければ結構です。

また、これからはデータのことを「値」と呼びます。数学用語ですが、プログラミングでは数値だけではなく、先ほどのように"こんにちは"という言葉も値です。

ですから、「変数にデータを保存する」ことを、一般的には「変数に値を代入する」といいます。数学チックな言い方なので嫌な思い出のある方もいるでしょうけど、書籍などではこの言い回しが一般的なので、慣れてください。所詮、数学とは別物です。

コメント
ここまで変数の本質的な説明を行ってきたので、いまさら箱だのメモだのといった説明は蛇足かもしれない。というか変数には形も色もないのだけれど、「具体的に変数とは何なんだろう」という余計な疑問を呼び起こし、混乱を増長させるような気がする。
ただ前回書いた「概念形成」の話を加味すると、実験的に一旦ここでは箱とかメモとかタグとか、色々な説明を混ぜておきたい。
ここまでの説明で十分納得された方は、「混乱を避けるために続きを読まない」という選択肢もあることにご留意いただければと思う。

変数はよく、箱のようだとか、メモのようだと説明されます。

たとえば「あいさつ」と書かれた箱に「こんにちは」という言葉が入っているところをイメージしてください。一度箱に保存すれば、いつでも中身を確かめることができます。また、中身を入れ替えることもできます。

こんな風に書くと、最初は「こんにちは」、つぎに「こんばんは」が表示されます。

Sub サンプルマクロ()
    あいさつ = "こんにちは"
    MsgBox あいさつ
    あいさつ = "こんばんは"
    MsgBox あいさつ
End Sub

最初に保存した「こんにちは」は上書きされて無くなってしまいます。この点、サイズの許すかぎり何個でも入る「箱」とは違いますね。

次に、「あいさつ」とタイトルが書かれたメモ用紙に「こんにちは」と書き込むところをイメージしてみましょう。実際のメモは余白が許す限り何個でも書けてしまいますが、実際の変数は上書きされますから、たとえ話はあくまでたとえ話だということを理解しておいてください。

ネームタグに例える説明もあります。たとえば、「あいさつ」と書かれたタグが、「こんにちは」という文に括り付けてあるイメージです。紐をほどいて、「こんばんは」に括りなおすこともできますね。このたとえはなかなか秀逸で、オブジェクト変数にもそのまま使えます。

しかし、いずれにしても所詮たとえ話なのでそこは割り切っておいてください。変数の本質は「データを保存する」という機能であり、何か具体的な色や形があるわけではないのです。

さて、変数のことがなんとなく理解できましたか?
正直いまひとつピンとこないという方も多いと思います。

ではもう少し具体的な話をしましょう。
具体的に、変数に保存したデータはどこにあるのでしょうか。
それは、コンピューターのメモリです。


コメント
またここで、実装に踏み込んだ説明をするべきかどうか悩むが、とりあえず書く。上記の説明でスッキリ理解できている人は読まなくても良いけど、逆にたとえ話で混乱が深まったという方には良い処方箋になるのではないかと思う。

メモリにはアドレス(番地)がついていて、たとえば4GBなら、0番地~21億4748万3647番地まであります。
このどこかに保存されているのです。10桁の数値で表すことができますね。

たとえばこんなプログラムがあったとします。

Sub サンプルマクロ()
    数値1 = 20
    数値2 = 10= 数値1 + 数値2= 数値1 - 数値2= 数値1 * 数値2= 数値1 / 数値2
    MsgBox 数値1 & " + " & 数値2 & " = " &MsgBox 数値1 & " - " & 数値2 & " = " &MsgBox 数値1 & " * " & 数値2 & " = " &MsgBox 数値1 & " / " & 数値2 & " = " &End Sub

するとコンピューターは変数名とその保存場所を示した表をメモリに作り出し、実際の値はメモリ上に保存されています。
メモリのどこに保存されるかはコンピューターが管理しているので、こちらでは指定できません。

たとえばこのあたりだとしましょう。

変数名 アドレス
数値1 2486820
数値2 2486788
2486756
2486740
2486724
2486708

VBAでは直接メモリのアドレスに値を入れたり取り出したりすることはできず、変数を介して間接的にアクセスするしかありませんが、仮に変数が存在せずアドレスを指定できるとしたら、以下のようなプログラムになるでしょう。

Sub サンプルマクロ()
    a2486820 = 20
    a2486788 = 10
    a2486756 = a2486820 + a2486788
    a2486740 = a2486820 - a2486788
    a2486724 = a2486820 * a2486788
    a2486708 = a2486820 / a2486788
    MsgBox a2486820 & " + " & a2486788 & " = " & a2486756
    MsgBox a2486820 & " - " & a2486788 & " = " & a2486740
    MsgBox a2486820 & " * " & a2486788 & " = " & a2486724
    MsgBox a2486820 & " / " & a2486788 & " = " & a2486708
End Sub

すごく分かりにくいですよね。
我々プログラマーは、データを保存して、再利用したいだけなのに、いちいちどこに保存するか番号で指定しないといけないなんてうんざりしますよね。ですから、保存場所の管理はコンピューターに任せて、我々はデータを名前で呼びましょう。

これが変数です。

さて、ここから先にまたオブジェクト変数という手ごわい奴がいますが、これは別の記事で触れているので割愛します。

さらに詳しいメモリの働きについては、こちらをご参照ください。
thom.hateblo.jp

上記を理解したうえで、オブジェクト変数について以下の記事を読んでいただけるとよく理解できるのではないかと思います。
thom.hateblo.jp

以上。

あとがきコメント
今回の記事は前回書いた以下の考察を実際の説明に生かしてみようと思って書いた。

thom.hateblo.jp


しかし、たとえ話を切り出すタイミングが難しく、それほどうまくいったとは思っていない。
むしろ本質的な変数の機能の説明の後にあえてたとえ話を持ち出す必要もなかったかなという思いが強いのだけれど、何かしらイメージとして形と結びついていたほうが記憶にとどまりやすいかもしれないという考えもあり、結局、形をもつ箱やメモ、タグなどのたとえを紹介することにした。
もう少し表現や説明順序を洗練させていきたいと思う。

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