皆さまこんにちは!
このサイトの管理者のHide(ヒデ)と申します。
今回は、プログラムでの基本となる変数についてお伝えしたいと思います。
Contents
1. 変数とは
通常、変数というと数学の方程式を思い浮かべる方が多いのではないでしょうか。例えば下記のような式です。
問:2x-4=0 のとき、xの解を求めなさい。
答:2x=4 → x=2
数学では、変数について上記のような使い方をしますが、プログラミングの場合は少し違っていて、計算した値を変数に「保持」したり、ある調査をした結果を変数に「保持」したりという形で利用します。また、数学の場合は変数に格納するのは数字ですが、プログラミングでの変数は数字以外に、文字や範囲なども格納することができます。
ではプログラミングで変数に値や結果を保持するとはどのようなことか(どのように記述するのか)について見ていきましょう。プログラミングでは下記のように記述します。
1. x=5
2. Result="Win"
※上記の1.や2.は説明のため、便宜上書いています。プログラム上では記述しませんのでご注意ください。
まず、上記の1.のx=5についてご説明します。数学の場合、x=5というのはxという変数と5が等しいという意味で利用しますが、Excel-VBAでのプログラミングの場合、特定の場合を除いて(後々のブログで解説します)「xという変数に5を代入しなさい」という意味(命令)になります。(もちろん、xに5を代入したのですから、結果的にはxと5は等しくなります。)Excel-VBAでは、この「=」の記号は代入するという意味があることを覚えておいてください。
補足になりますが、プログラミングで変数を扱う場合、2x-4=0 のような方程式ではなく、x=5 のように右辺の値が左辺の変数に代入するという形をとります。
次に上記の2.のResult="Win"についてご説明します。これはプログラミングの特徴ともいえるもので、「Resultという変数にWinという文字を格納しなさい」という意味(命令)になります。このようにプログラミングでは、数学と違って変数に文字を格納できるんですね。文字を変数に格納する場合、文字の前後を半角の「"(ダブルクォーテーション)」で囲むという点を覚えておいてください。
ここでxやResultという名前が出てきましたが、プログラミングではこの名前のことを変数名と言います。変数名は一般的には半角の英数文字を用います。変数名には予約語(※1)が利用できない,先頭を数字にできない等、若干制限はありますが、自由に決めることができます。もし変数名が文法的に間違っている場合はエラーとなります。
※1について:予約語とはExcel-VBAの文法で利用される「Sub」や「If」などの既に役割が決まっている用語のことです。
ここまでで、変数には数字を代入したり文字を格納できるということがご理解頂けましたでしょうか。
プログラミングでは
変数名 = 「左辺の変数に代入(格納)したい数値や文字」
のように記述することで、「右辺の内容を左辺の変数に代入(格納)する」という命令になります。この点をおさえておいてください。
補足:変数に格納された数字や文字は実際にはパソコンのメモリ上に保持されています。
2. 変数のもう1つの役割
変数のもう1つの役割として、「ある結果を変数名で簡潔に表現できる」ということがあります。例えば、「あなたの身長は172cmです。」という文字を3回表示するプログラムを考えてみましょう。通常ですと下記のような記述が考えられます。プログラムの名前はTest1にしました。
Sub Test1()
Debug.Print "あなたの身長は172cmです。"
Debug.Print "あなたの身長は172cmです。"
Debug.Print "あなたの身長は172cmです。"
End Sub
Debug.Printという命令はイミディエイトウィンドウに情報を表示する命令でしたね。
まず、プログラミングの基本のお話になりますが、上記のようにプログラムの命令を1行に1つずつ改行しながら記述していきます。まずこの点をおさえてください。
上記のプログラムを実行すると、下図のように「あなたの身長は172cmです。」という文字が改行されながら3回表示されます。補足になりますが、Debug.Printの命令でイミディエイトウィンドウに何か文字を表示した場合、その文字を表示した後に画面内で改行されます。
これでも間違いではありませんが、変数を使ってプログラムを書くとどのようになるか見てみましょう。
Sub Test2()
Result="あなたの身長は172cmです。"
Debug.Print Result
Debug.Print Result
Debug.Print Result
End Sub
変数を使うとこのような感じになります。先ほどのプログラムと結果は同じですが、ちょっとすっきりしませんか?Debug.Printの命令にResultという変数を記述すると、その変数の中身を表示して改行しなさいという意味になります。このように変数に必要な情報を1度代入してしまえば、毎回長い文字を記述しなくても済むというわけです。
3. 変数を使う際に注意しなければならないこと
変数を使う場合に注意しなければならない点があります。それは、変数名の記述ミスです。記述(スペル)ミスとはどのようなケースか見ていきましょう。プログラムは上から下に順番に実行される点にも注目してください。
Sub Test3()
test1=5
testl=10
Debug.Print test1
End Sub
上記のプログラムは下記のような意味で書きました。
1行目: 変数 test1 に5を代入します。
2行目: 変数 test1 に今度は10を代入します。
3行目: Debug.Printという命令でイミディエイトウィンドウにtest1という変数の中身を表示します。
ここまでで、みなさんはイミディエイトウィンドウに何が表示されると想像しますか。test1には一度5を代入したけれどもその後に10を代入しているので「10」という結果が画面に表示されると思われるでしょう。ところが、結果は「5」と表示されてしまいます。なぜでしょうか?
あらら、2行目でtest1と記述するところ、testlとなっています。変数名の最後が「1」ではなくアルファベットの「l(エル)」になってしまっています。
変数を利用するととても便利ですが、今回の例のように変数名の記述を間違えるとバグと言ってプログラムの不具合の原因になります。そのため、変数名の記述は間違えないようにする必要があります。ただし、Excel-VBAでは、この点について変数名の記述ミスが起きにくいような仕組みが用意されています。
4. 変数の正しい使い方
これまでのxやResultなどの変数をプログラムで利用する例を見てきましたが、実は正確な記述ではありませんでした。みなさんが理解しやすいように簡単な記述方法(つまりいきなり変数を使う方法)を採用していました。
Excel-VBAで正確に変数を利用するためには、下記の点に注意する必要があります。
1. 変数は型を決めて利用する。
2. 変数は宣言して利用する。
3. 変数のスペルミスによる不具合防止のため、VBEの各モジュールのコード画面の先頭に「Option Explicit」を記述して利用する。
まず、1.の変数の型についてご説明します。例えばxという変数にはどのようなものを代入するかということです。xには数字を代入したいのか、文字を代入したいのかという変数の利用用途ですね。下記はマイクロソフト社からの引用になりますが、変数には色々な型があって、値として保持できるものや範囲が決められています。
※代表的な型について、マイクロソフト社のページより引用(抜粋)し、簡易的にまとめました。
・Integer型: -32,768 ~ 32,767
・Long型: -2,147,483,648 ~ 2,147,483,647
・Double型: 負の値の場合は -1.79769313486231E308 ~ -4.94065645841247E-324、正の値の場合は 4.94065645841247E-324 ~ 1.79769313486232E308
・Currency型: -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
・Date型: 100 年 1 月 1 日 ~ 9999 年 12 月 31 日
・String型:文字
・Variant型:数値や文字等
上記の型を見て少し引いてしまった方もおられるかもしれませんが心配はいりません。まず、Integer型とLong型というものがありますが、この2つの型は整数を扱うことができます。それぞれ扱うことのできる(代入できる)範囲が違いますね。自分でどのような範囲の数値を使うかを意識して使い分けてもよいですが、心配であればLong型を使っておけば良いと思います。
次にDouble型は小数、Currency型は金額の計算等に利用します。
Date型は日付、String型は文字、Variant型は数字や文字の両方を扱いたい場合などに利用します。
次に、2.の「変数は宣言して利用する。」という部分についてご説明します。プログラムで変数を利用する際、例えば下記のように記述します。
Sub Test4()
Dim x As Long
Dim Result As String
x=5
Result="Win"
End Sub
上記のTest4のプログラムで「Dim x As Long」という記述があります。
変数の宣言は「Dim」+「半角スペース」+「自分で決めた変数の名前」+「半角スペース」+「As」+「半角スペース」+「型名」のように記述します。
補足:dim,as,型名の部分は半角で入力します。また小文字で入力しても問題ありません。自動的にDim,Asのように先頭が大文字に変換されます。
この例では、「xという変数をLong型で使います(xという変数に整数を代入して使います)」という宣言をしていることになります。変数を宣言する際に、先ほど出てきた型を指定するわけですね。なぜLong型にしたかというとxに整数を代入したかったためです。
その次の「Dim Result As String」という記述は、「Resultという変数をString型で使います(Resultという変数に文字を代入して使います)」と宣言していることになります。
実際のVBEの画面では下図のようなイメージになります。
上図の中にも書いてありますが、変数の宣言と利用方法について下記の注意点があります。
・ 一般的に変数の宣言はプログラムの上部にまとめて記述する。
・ 変数を宣言した行より下の行以降でその変数を利用できる。
・ xやResultという変数はこのプログラム(Test4)の中だけで利用できる。
以上の3つの点に注意してください。上記の3つ目の部分ですが、例えばTest4以外のプログラムでも同じ名前の変数と型で宣言して利用できますが、それぞれのプログラム独自のもので中身も別物と考えてください。
それでは、最後の「3. 不具合防止のための....」の部分についてご説明します。本ブログの変数を使う際の注意の部分でご説明した変数名の記述ミスを防ぐために、Excel-VBAではモジュールの先頭に「Option Explicit」という記述をすることで、変数の宣言を強制することができます。実際のVBEの画面の下図の赤枠部のことですね。
本ブログのTest2というプログラムで、変数を宣言せずにいきなりResultなどの変数を利用していますが、この「Option Explicit」の記述がある場合、実はエラーで実行できません。「Option Explicit」の記述がない場合、前述のプログラムTest3のように変数を宣言せずに「test1」と「testl」のような変数をいきなり使えてしまい、なおかつ、エラーもでませんが、「Option Explicit」の記述があって「test1」の方が変数として宣言されている場合は「testl」(末尾が小文字のエルになってしまっている)の方は変数の宣言がないということでエラーが表示されるので変数の記述ミスを発見できます。
試しに先ほどのTest3のプログラムでモジュールの先頭に「Option Explicit」の記述がある状態で、変数としてtest1を宣言して、プログラムを実行してみると下図のように「testl」は変数として宣言されていない旨のエラーが表示されます。
ということで、各モジュールの先頭には必ず「Option Explicit」を記述しましょう。また、何かの手違いで消えてしまっている場合は記述しておいてください。
ところで、「Option Explicit」の記述ですが、Excelの設定でモジュールを新規に追加する度に自動で挿入することができます。その設定方法については下記のブログをご覧ください。
補足:先ほど、プログラムの実行時に宣言されていない変数があるとエラーになるとお伝えしましたが、プログラムの実行前に、下図のように「デバッグ」メニューから「VBAProjectのコンパイル」の順にクリックすることで未宣言の変数を利用していないかチェックすることが可能です。
5. 変数名の先頭を大文字で宣言して小文字で入力するとは?
プログラムの中での変数の宣言とプログラミングの際の変数の入力方法についておすすめの方法をご紹介します。
これは実際の開発現場で行われている手法なのですが、まず、変数を宣言する際の変数名の付け方ですが、変数名の先頭を大文字にします。また、変数名に2つ以上の意味が含まれている場合は、意味の区切りとなる部分の先頭の文字も大文字にします。具体的な例をご紹介しますね。
Dim Result As String
Dim StartNum As Long
まず、上記の1つ目の結果という英語を表すresultですが、上記のように先頭の「r」を「R」のように大文字にします。また2つ目のStartNumは英語の「StartNumber」を短縮したもので開始番号などを格納するために変数名を付けてみました。
なぜ、このように変数名の先頭を大文字にするかというとまずぱっと見で意味が分かりやすいということもありますが、実は、今回の変数名もそうですし、Excel-VBAの文法で利用されるSub や End Subのような用語も先頭の文字が大文字になっていますが、これにはプログラムの入力ミス防止の役割もあるのです。
既に気づかれた方もいると思いますが、Excel-VBAでは、小文字で入力した文字について、既に文法で決められている用語や変数で宣言した文字は、スペルが正しければ自動で先頭の文字を大文字に変換してくれます。(変数の場合は先頭の文字を大文字で宣言した場合に限ります。)
そのため、変数名の先頭を大文字で宣言しておき、入力時には常に小文字で入力すれば、もし先頭が大文字に変換されなければ、スペルミスが発見できるというメリットがあるのです!
実際の画面で見てみましょう。
変数の先頭を大文字で宣言して...
プログラムの入力時は小文字で変数を入力して...
プログラムの入力を確定すると先頭が下図のように大文字に変換されます。先頭が大文字に変換されたらスペルは正しいと判断できます。先頭が大文字に変換されなかったらスペルを見直しましょう。
このように変数の宣言や入力方法も工夫することでプログラムの不具合を防ぐことができます。
6. 変数を宣言する際の注意点について
変数を宣言する際に1行に複数の変数を宣言することも可能です。例えば、1行で変数xとyをともにLong型で宣言する場合は下記のように記述します。
Dim x As Long, y As Long
上記のように宣言することも可能です。注意点としましては、それぞれの変数に変数のデータ型の記述が必要ということです。
例えば、下記のような書き方をすると意味が変わってきます。
Dim x , y As Long
上記の記述の場合、変数xについて、実はVariant型になってしまうのです。Variant型も数値を格納できてしまうため見落としやすいですが、プログラムによっては意図しない結果となる可能性がありますのでご注意ください。
7. まとめ
長くなりましたが、今回のブログではプログラムでの重要な概念である変数についてお伝えしました。
お疲れさまでした!
【電子書籍出版のご案内】
本ブログで扱っている「Excel VBA 入門」の内容が、内容を大幅に増やした形で電子書籍(Kindle)になりました。ご興味のある方は、ぜひご覧頂ければ幸いに存じます。
Excel VBA に挫折しないためのプログラミング超入門 (基礎から応用まで)