【変数とは?】プログラミングの基礎をVBAを例にわかりやすく解説!

【変数とは?】プログラミングの基礎をVBAを例にわかりやすく解説!

最終更新日:

プログラミングでよく出てくる「変数」って結局何?

数学でもやった気がするけど、プログラミングの場合は何か違うの?

変数とは、値を入れるための箱です。
VBAに限らず、プログラミングでは変数を使います。

なぜなら…

変数を使う理由
  • メンテナンスをしやすくする
  • パッと見で分かりやすくする
この記事のポイント
  • 変数とは何か
  • なぜ変数を使うのか
  • 変数と関わりが深い用語や要素

変数とは

変数とは、値を入れるための箱のことです。
数学でも「X」や「Y」などで扱ったことがあると思いますが、プログラミングでも同じように、値を代入するための箱を変数と言います。

変数は基本的に宣言しないと使えません。

宣言

この単語は「変数」です!と設定すること。

VBAでは以下のように宣言します。

Dim aisatu As String

変数には関わりのある用語や要素があります。

変数に入れられる値の種類を限定させるものです。
すべてを入れられる変数ではなく、用途別に分けることで見やすい美しいコードを組むことが出来ます。

スコープ

影響範囲のことです。
変数は使うときにその名前を呼び出してあげますが、呼び出せる範囲を限定することが可能です。

変数名

変数の名前のことです。
言語によって様々ですが、VBAでは日本語もOKです。
ですが、名付けルールに従って命名するのが一般的です。このルールを命名規則と言います。

これらについては、以下の見出しでそれぞれ解説しています。

また、類義語として定数があります。
これは、変数と異なり、一度設定すると値を変更できない箱になります。

詳しくは以下の記事で解説しています。

なぜ変数を使うのか?

なぜ、わざわざ変数を使うのでしょうか?

大きな理由は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では、以下のように設定することが出来ます。

宣言用ステートメント 変数名 As 型の名前

例えば、

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種類あります。

DimPrivatePublic
影響範囲プロシージャ内で宣言し、そのプロシージャ内モジュール内で宣言し、そのモジュール内ファイル内であればどこからでも使用可能
備考つまり、一番範囲が狭い宣言方法です。
※正確には、プロシージャ内で宣言するから狭くなります。
これを、ローカル変数という言い方をします。
プロシージャの外で宣言します。
モジュール内のプロシージャであればどこからでも使用可能です。
宣言場所は一番上(Option Explicitの下)あたりが一般的です。
こちらも、プロシージャの外で宣言します。
基本的には、標準モジュールに記載します。
※構造体や列挙体、配列などのPublic型は標準モジュールでないと使用できないため。
Public変数はグローバル変数という言い方もします。
Dim 変数 As LongPrivate errMsg As StringPublic dog As Object

このように、スコープを分けるには理由があります。
それは、システムの規模なるべくスコープは小さくという原則が関係しているからです。

らるじゅ らるじゅ

プログラミングではスコープはなるべく小さくする必要があります。

なぜなら、どこで宣言したか分からなくなったり、変数名が重複したり使いまわされたりするからです。

これでは、可読性は落ちてしまいます。
しかし、システムの規模が大きくなるとすべての処理で共通する変数なども出てくるため、スコープを分ける必要があります。

変数名について

変数名は意外と重要で、可読性に直結する要素です。
また、コードを組む人の癖が出る要素でもあります。
テキトーに決めてしまうと後々後悔するので、きちんとした軸を持つことが重要です。

変数名はある程度自由

変数名はある程度自由です。

予約語を除けば日本語でもつけることが出来ます。

予約語

システムであらかじめ設定されている言葉。(IF・True・String など)

とはいっても、むやみやたらにつけていいわけではありません。

命名規則とは

変数名や定数名・関数名などの名前を決めるときのルールです。

プログラミングの世界では、世界の共通認識として「命名規則」 というものが設定されています。
そして、これは言語によって異なります。

しかし、守らなければシステムが動かないというわけではありません。
ただし、これを利用することで可読性は一気に上がります。

気になる方は「言語名 命名規則」などで調べてみてください。
※例:「VBA 命名規則」

まとめ|変数はプログラミングにおいて基礎の「き」

今回は、プログラミングの基礎である「変数」について、VBAを例にしながら解説しました。

どんな言語でも変数は使うことになります。

変数の概念を覚えておけば、大抵の言語に応用できるので、ぜひ身に付けてくださいね!