- プログラミングでよく出てくる「変数」って結局何?
- 「変数」ってそんなに使うの?
- 数学でもやった気がするけど、プログラミングの場合は何か違うの?
変数とは、値を入れるための箱です。
VBAに限らず、プログラミングでは変数を使います。
なぜなら…
- メンテナンスをしやすくする
- パッと見で分かりやすくする
この記事では、以下について解説しています。
- 変数とは何か
- なぜ変数を使うのか
- 変数と関わりが深い用語や要素
変数とは
変数とは、値を入れるための箱のことです。
数学でも「X」や「Y」などで扱ったことがあると思いますが、プログラミングでも同じように、値を代入するための箱を変数と言います。
変数は基本的に宣言しないと使えません。
VBAでは以下のように宣言します。
Dim aisatu As String
変数には関わりのある用語や要素があります。
これらについては、以下の見出しでそれぞれ解説しています。
また、類義語として定数があります。
これは、変数と異なり、一度設定すると値を変更できない箱になります。
詳しくは以下の記事で解説しています。
なぜ変数を使うのか?
なぜ、わざわざ変数を使うのでしょうか?
大きな理由は2つあります。
- メンテナンスしやすい
- パッと見で分かりやすくなる
順番に解説していきます。
メンテナンスしやすい
正直、これに尽きます。
メンテナンスのしやすさ・コードの読みやすさはプログラミングにおいて最優先レベルで大事なポイントです。
例えば、変数の有無を分けた出力が同じコードがあったとします。
Sub 変数あり() '//変数を宣言 Dim X As Long Dim Y As Long '//変数に値を格納 X = 15 Y = 3 '//四則演算 Debug.Print X & "+" & Y & "=" & X + Y Debug.Print X & "-" & Y & "=" & X - Y Debug.Print X & "×" & Y & "=" & X * Y Debug.Print X & "÷" & Y & "=" & X / Y End Sub
Sub 変数なし() '//四則演算 Debug.Print "15+3=" & 15 + 3 Debug.Print "15-3=" & 15 - 3 Debug.Print "15×3=" & 15 * 3 Debug.Print "15÷3=" & 15 / 3 End Sub
どちらも出力の内容は同じですが、中身(コード)が異なります。
ここで、「15→297」「3→27」に変えてほしいと言われたとします。
変数が無い場合だとすべての行(計4行)の変更が必要で、1行あたり4か所の修正が必要です。
しかし、変数がある場合は2行・1か所ずつの修正で済みます。
このように、変数を使うことで後からメンテナンスする量を減らすことが出来ます。
パッと見で分かりやすくなる
上記の変数を以下のように変えてみました。
Sub 変数あり改() '//変数を宣言 Dim 計算される数 As Long Dim 計算する数 As Long '//変数に値を格納 計算される数 = 15 計算する数 = 3 '//四則演算 Debug.Print 計算される数 & "+" & 計算する数 & "=" & 計算される数 + 計算する数 Debug.Print 計算される数 & "-" & 計算する数 & "=" & 計算される数 - 計算する数 Debug.Print 計算される数 & "×" & 計算する数 & "=" & 計算される数 * 計算する数 Debug.Print 計算される数 & "÷" & 計算する数 & "=" & 計算される数 / 計算する数 End Sub
どうでしょうか?変数名だけでもその役割が何となく理解できそうじゃありませんか?
このように、変数名を意味ある単語(または、複数の単語や熟語)にすることで、コードをパッと見ただけでもわかりやすくすることが可能です。
また、1行にすると長い・複雑になる処理を分割させることで見やすくすることも可能で、その時にも変数を活用します。
例えばこのコードの出力は何を表しているか分かりますか?
Sub test() Dim A As Long Dim B As Long Dim C As Long Dim Temporary1 As Long Dim Temporary2 As Long Dim Anser As Long A = 2 B = 3 C = 4 Temporary1 = A * B Temporary2 = A * C Anser = Temporary1 + Temporary2 Debug.Print Anser End Sub
これは、分配法則「A(B+C)」の計算です。
処理を分割することで、カッコを使わなくても分配法則を実現することも可能になります。
「型」って何?
変数には「型」という特性があります。
これは、変数に入れられる値を限定することが出来ます。
VBAでは、以下のように設定することが出来ます。
例えば、
Dim hello As String
これは、hello
を「文字列型」の変数として使う。という意味になります。
限定するとはどういうことか・なぜそんなことをするのかについて深掘りしていきます。
入れられる値の種類を限定する
変数の「型」を宣言時に設定すると、入れられる値の種類を制限することが出来ます。
言語によって型の種類・型の名称は異なりますが、VBAでよく使うのが以下の通りです。
型の名前 | 型の種類 | 入る値 | 備考 |
---|---|---|---|
String | 文字列型 | 文字 | |
Long | 長整数型 | 整数 | 整数型(Integer)よりも多くの桁数を扱えます。 |
Double | 倍制度浮動点小数型 | 小数 | 単精度浮動小数点型(Single)よりも多くの桁を入れられます。 また、小数点を扱えます。(LongやIntegerは整数のみです) |
Boolean | ブール型 | TrueまたはFalse | いわゆる、フラグというやつです。 ちなみに、「ブーリアン」と発音します。 |
Date | 日付型 | 日付・時刻 | 「日付型」という名前ですが、時刻も入ります。 逆に言うと「時刻型」は存在しません。 つまり、日付(年月日)・時刻(時分秒)・日時(年月日 時分秒)のどれかということになります。 |
Object | オブジェクト型 | オブジェクト | 「オブジェクト」が初心者の方にとっては難しい存在なので、今は深く覚えなくてもいいです。 ※簡単に言うと、単一的な値(「10」「こんにちは」「2022/1/1」など)ではなく、物体そのもの(「セル」「シート」「ファイル」など)を表す値です。 実用的なシステムを作るうえでは切っても切り離せないくらい重要な型です。 |
Variant | バリアント型 | なんでも入る | VBAでは、型を宣言しないとこの型になります。 汎用的な一時退避用や「配列」用として使ったりします。 |
何でも入るなら、全部Variant使えば?
と思いますが、それは良くありません。
なぜなら、予期せぬ値も受け入れてしまう&スピードが遅いという、理由が関係してくるからです。 これについては次の見出しで解説しています。
なぜそんなことするの?
では、なぜわざわざ「型」を設定するのでしょうか?
それには以下の理由があります。
予期せぬ値を入れられないようにする。
これが一番大きな理由です。
例えば、「HP(ヒットポイント、体力)」という変数に格納する値は「100」などの数値でなくてはいけません。
それなのに、「百」や「残り1」などの数値以外の値が入ってしまうとどこかの処理でエラーになってしまいます。
こういったことを防ぐためにも型を設定し、値の種類を限定するのが重要になってきます。
分かりやすい
変数名に型を紐づけるので分かりやすくなります。
- age(年齢)なら
└「Long」などの数字のみが入る型 - myName(自分の名前)なら
└「String」で文字のみ入る型
など、その変数にあった型を宣言することで、直感的にわかりやすくコードを組むことが出来るようになります。
読み手に分かりやすくするというのがプログラミングでは重要です。これを可読性と言い、プログラミングの上で重要な指標の一つです。
速度
実は速度にも影響が出ます。
と言っても、現代のPCでは数億回の処理で数秒レベルだったりするので、あまり気にしなくてもいいレベルではありますが。。。
ただ、「型を設定したほうがメリットがある」ということは頭の片隅に入れておいた方が良いでしょう。
スコープについて
変数を宣言する際にスコープという要素が重要になってきます。
システム規模が大きくなればなるほど、より重要になってくるので覚えておきましょう。
スコープとは
スコープとは、変数を呼び出せる範囲のことです。
もう少しかみ砕くと、どこまでの範囲ならその変数を呼び出すことが出来るかということになります。
例えるならリモコンの電波と考えたほうが良いです。
- 小さく設定すると自分の手の届く範囲くらいでしかリモコンは反応しません。
- 少し大きく設定すると、家の中であれば届くようになります。
- もっと大きくすると外からでも届くようになります。
このような影響範囲のことをスコープと言います。
各宣言方法とスコープ
VBAでは、変数の宣言方法は3種類あります。
Dim | Private | Public | |
---|---|---|---|
影響範囲 | プロシージャ内で宣言し、そのプロシージャ内 | モジュール内で宣言し、そのモジュール内 | ファイル内であればどこからでも使用可能 |
備考 | つまり、一番範囲が狭い宣言方法です。 ※正確には、プロシージャ内で宣言するから狭くなります。 これを、ローカル変数という言い方をします。 | プロシージャの外で宣言します。 モジュール内のプロシージャであればどこからでも使用可能です。 宣言場所は一番上( Option Explicit の下)あたりが一般的です。 | こちらも、プロシージャの外で宣言します。 基本的には、標準モジュールに記載します。 ※構造体や列挙体、配列などのPublic型は標準モジュールでないと使用できないため。 Public変数はグローバル変数という言い方もします。 |
例 | Dim 変数 As Long | Private errMsg As String | Public dog As Object |
このように、スコープを分けるには理由があります。
それは、システムの規模となるべくスコープは小さくという原則が関係しているからです。
プログラミングではスコープはなるべく小さくする必要があります。
これでは、可読性は落ちてしまいます。
しかし、システムの規模が大きくなるとすべての処理で共通する変数なども出てくるため、スコープを分ける必要があります。
変数名について
変数名は意外と重要で、可読性に直結する要素です。
また、コードを組む人の癖が出る要素でもあります。
テキトーに決めてしまうと後々後悔するので、きちんとした軸を持つことが重要です。
変数名はある程度自由
変数名はある程度自由です。
予約語を除けば日本語でもつけることが出来ます。
とはいっても、むやみやたらにつけていいわけではありません。
命名規則とは
変数名や定数名・関数名などの名前を決めるときのルールです。
プログラミングの世界では、世界の共通認識として「命名規則」というものが設定されています。
そして、これは言語によって異なります。
しかし、守らなければシステムが動かないというわけではありません。
ただし、これを利用することで可読性は一気に上がります。
気になる方は「言語名 命名規則」などで調べてみてください。
※例:「VBA 命名規則」
まとめ|変数はプログラミングにおいて基礎の「き」
今回は、プログラミングの基礎である「変数」について、VBAを例にしながら解説しました。
どんな言語でも変数は使うことになります。
変数の概念を覚えておけば、大抵の言語に応用できるので、ぜひ身に付けてくださいね!