こんにちは、ツクダンです。
今回は「化学系のVBA入門講義」シリーズの第三講をお届けします。
第一講と第二講をまだ終えてない人は、まずはそちらからご覧ください。
さて前回までの講義で、「全くの初心者」から「VBAでプログラムを作成・実行できるレベル」までレベルアップしてきましたね。
今回の第三講は、
第三講:データ型と変数の宣言を学ぶ
というタイトル。
簡潔で分かりやすいプログラムを書くためには欠かせない「変数」というものについて、詳しく学んでいきます。
この講義を終えれば、前回「Option Explicit」自動記述をなぜ設定したのか理解できると思います。
「数学っぽいワードが出てきて蕁麻疹が出そう。」
そう思った数学嫌いのあなた。
大丈夫。化学系の僕が解説するんですから。
では行きましょう。
変数をつかう

ここではまず、変数について学んでいきましょう。
トピックは以下の3つです。
- プログラムにおける変数とは
- 変数を宣言する方法
- なぜ変数が必要なのか
プログラムにおける変数とは
初心者向けの説明で「変数」はしばしば「データを格納する 箱」に例えられています。
個人的にはこの「格納する箱」という例えがウマすぎると思っていて、初めて聞いた時には頭の中で変な汁が噴き出しました。
なぜ「格納する箱」に例えられるのか?
次の二つのコードの違いを考えてもらえば理解できると思います。
実行すると「変数に値を格納」というメッセージが二回表示されると思います。
Sub 変数に値を代入()
'① そのまま値を実行した場合
MsgBox "変数に値を格納"
'② 変数に格納してから実行した場合
Dim a As String
a = "変数に値を格納"
MsgBox a
End Sub
①はMsgBox関数で文字列をそのまま出力しています。
その一方②では変数に代入してから、その変数をMsgBox関数で出力しています。
この流れが「いったん変数という箱に入れてから、その箱(の中身)を出力している」と見えるため、「格納する箱」という表現が使われるのでしょう。

変数は単なる箱ですので、中身を変更することもできます。
これを「変数の上書き」と言います。
次のコードを実行してください。後から代入した「二回目の格納です」という文字列が、メッセージとして出力されると思います。
Sub 変数の上書き()
Dim a As String
a = "一回目の格納です"
a = "二回目の格納です"
MsgBox a
End Sub
変数を宣言する方法
では実際に変数を宣言する方法を説明していきます。
ちなみに変数の「宣言」は「ステートメント」とも言います。
「宣言」という言い方がしっくりこないかもしれませんが、そういうものですので慣れましょう。
「変数の宣言」をおこなう方法は
Dim 変数名 As データ型名
[~という名前の変数を、・・・という型のデータとして宣言する]
と記述することです。英語の書き方と同じですね。
「データ型」については後から詳しく説明するので、ここでは「変数の宣言」の感覚だけ理解してください。
ちなみに「Dim」は「Dimention」の略です。
なぜ変数が必要なのか
ここまでの説明だけだと、「わざわざ変数を使う必要がないのでは?」と感じる人もいるかもしれません。
しかし変数を使用することは、「コードの読みやすさ」の観点から、次の二つの点で非常に意味があるのです。
ちなみに「コードの読みやすさ」のことを「可読性」と呼びます。
- 値が何を表しているか明確にできる
- 繰り返しの記述を減らし、コードを短くできる
値の意味を明確に
変数を使用することの一つ目の利点。
それは適切な変数名つけることで「その値が表すもの」を明確にできることです。
あまり上手な例ではありませんが、以下の二つのプロシージャを比べてみてください。
一つ目のプロシージャでは、totalという変数の中身が何を表しているのかハッキリしません。
「何かしらの商品を二種類買ったのかな」くらいの認識になってしまいます。
一方で二つ目のプロシージャはtotalが「食べ物・飲み物の金額の合計」であることが見て分かります。
Sub 変数の利点1()
Dim total As Long
total = 800 * 1.1 + 750 * 1.1
MsgBox "合計は" & total & "円です"
End Sub
Sub 変数の利点2()
Dim total As Long
Dim food_price As Long
Dim drink_price As Long
food_price = 800 * 1.1
drink_price = 750 * 1.1
total = food_price + drink_price
MsgBox "合計は" & total & "円です"
End Sub
コードを短くできる
変数を使用する二つ目の利点は、記述するコードを短くできることです。
例えば「ピカソのフルネームをメッセージで三回出力する」というプロシージャを以下に記述します。
変数がなかったらと思うとゾッとしますね。
Sub 変数の利用4()
Dim picasso_full_name As String
picasso_full_name = "パブロ・ディエゴ・ホセ・フランシスコ・デ・パウラ・ホアン・ネポムセーノ・マリーア・デ・ロス・レメディオス・クリスピン・クリスピアーノ・デ・ラ・サンディシマ・トリニダード・ルイス・イ・ピカソ"
MsgBox picasso_full_name
MsgBox picasso_full_name
MsgBox picasso_full_name
End Sub
データ型とは

さてここでは、「データ型」について学んでいきます。
トピックは次の二つ。
- データ型が決めるもの
- VBAの主なデータ型
データ型は「分類」と「サイズ」をセットにしたもの
「データ型」とは、「どの種類のデータなのか(分類)」と「どのくらいの大きさのデータなのか(サイズ)」をひと括りにしたものです。
「分類」というのは例えば「数値」や「文字列」といった、データの種類。
記述方法をはじめとして、それぞれのデータで異なるルールを持っています。
データの「サイズ」はシンプルに「メモリ(容量)」のことです。
ご存じだと思いますが、メモリの大きなデータほど処理が重くなってしまいます。
変数の目線で箱に例えるなら、データ型を決めるというのは「どのようなモノを入れ、どのくらい大きさの箱にするかを決める」ということになります。

VBAの主なデータ型
それでは続いて、VBAに存在するデータ型について紹介していきます。
まずは一覧をまとめます。理解できなくていいので、ざっと目を通してみてください。

この中で最低限おぼえて欲しいのは、次の4つです。
それ以外は必要になってから、また確認すればOK。
- 長整数型 Long
- 倍精度浮動小数点型 Double
- 文字列型 String
- バリアント型 Variant
長整数型 Long
整数型の数値をあつかうものの中で、Long型はもっともサイズ(容量)の大きいデータ型です。
数値データを格納する変数のデータ型において、「サイズの大小」は格納できる「数値範囲の大小」を表しています。

気づいたかもしれませんが、Longの数値範囲のなかにIntegerやByteの範囲が含まれています。
つまり変数のデータ型としてLongを指定しておけば、VBAであつかうすべての整数値を格納できるのです。(メモリを無駄に多く使う可能性はありますが)
整数型の中でLongだけは覚えて欲しい理由はこのためです。
倍精度浮動小数点型 Double
小数型の数値をあつかうものの中で、Double型はもっともサイズ(容量)の大きいデータ型です。

Doubleの範囲はSingleの範囲を含んでいるので、Doubleを覚えておけばOKなわけですね。
文字列型 String
Stringは文字列をあつかうデータ型です。
次に説明するVariant型を除いて基本的には、文字列をあつかえるデータ型はStringだけなので必ず覚えてしまいましょう。
バリアント型 Variant
Variantはどんなデータでも格納することができる万能データ型です。
変数に格納されるデータ型を特定できないときに、柔軟に受け取ることが可能です。
具体的にどのような場面で使用するか、現段階では深く考えなくていいです。
どうしても知りたいなら以下のサイトを参考にしてみてください。
ただ便利である一方、必要以上にVariant型を多用すべきではないことも覚えておいてください。
その理由はVariant型の変数ばかり使うと、コードが訳分からなくなるから。
「この変数には文字列が、こっちには数値が」というのを、一目で理解できるようにしているほうがコードの可読性が上がります。
変数の宣言をおこなう意味

最期に「そもそもなぜ変数の宣言が必要なのか?」というお話をしていきます。
実はただ変数を利用するだけなら、わざわざ「変数の宣言」をする必要ありません。
試しに「Option Explicit」を記述せず次のコードを実行してみてください。
問題なく実行され、メッセージが表示されるとおもいます。
Sub 変数を未定義で使用()
total = 800 * 1.1 + 750 * 1.1
MsgBox "合計は" & total & "円です"
End Sub
ではなぜOption Explicitステートメントで強制してまで、「変数の宣言」をおこなう必要があるのでしょうか?
大きな理由は次の二つです。
- エラーの発生を防止する
- コードの可読性をあげる
エラーを防止する
一つ目の理由は、変数を宣言を強制することで様々なエラーを未然に防ぐことができるからです。
例えば分かりやすいところだと「スペルミス」によるエラーですね。
「Option Explicit」を記述せず、次のコードを実行してみてください。
Sub 変数のスペルミス()
total_price = 800 * 1.1 + 750 * 1.1
MsgBox "合計は" & total_prace & "円です"
End Sub
これくらい簡単で短いコードなら大きなバグにはなりませんし、ミスを見つけるのもそれほど難しくありません。
ただこれが膨大なコード中の一部分だったなら、もう見つけるのは困難です。
ほかにもデータ型を固定していないことで予期せぬバグが起こったりもします。
変数はかならず宣言するようにしましょう。
コードの可読性の向上
二つ目に、コードの可読性を上げることができるという理由もあります。
「変数の宣言」をきちんと行うということは、
- 変数名
- データ型
の二点によって、その変数にどのようなデータが入っているか理解しやすくなっているということです。
これがある無しでは、コードの読みやすさに雲泥の差がでる。
これから自分でマクロ開発をしていくことを目指すのであれば、可読性の高いコードを書けるスキルは必須です。
「変数の宣言」は必ずおこない、変数名も誰が見ても分かりやすいものにするように心がけましょう。
おわりに
おつかれさまでした。
今回の講義では、変数の宣言について詳しく学んできました。
やや専門的な内容だったので、少し難しかったですね。
まぁ新しいことを学ぶときはそんなもの。
僕もそうでしたから。心配しないでください。
触れる時間を増やせば慣れます。
自分でコードを書いてみるなどして、しっかり復習してください。
それでは、また次の講義でお会いしましょう。
おつかれさまです。