
これまで使ってきた変数は、実は「ローカル変数」と「グローバル変数」という大きく分けて2種類の変数があります。
今回はこの2つの変数について紹介していきます。
グローバル変数とローカル変数の違い
2つの変数の意味
結論から言うと、この2つの変数は「呼べる範囲」が違います。
「グローバル」は隔てがなく広い範囲というイメージですよね?
それに対し「ローカル」は狭い空間で閉じこもっているようなイメージだと思います。
このように、変数にも国際的(笑)な変数と地方のご当地オンリーな変数が存在します。
具体的にどのように違うのか見ていきましょう。
ローカル変数を知ろう
唐突ですが、下のコードを見てみましょう↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Kansu1() Dim Hensu As String Hensu = "Hello!" Call Kansu2 End Sub Sub Kansu2() MsgBox Hensu End Sub |
関数「Kansu1」で変数「Hensu」を宣言し、「Hensu」に「Hello!」という文字を代入しています。
そして、関数「Kansu2」を呼び出して、「Kansu2」の中で「Hensu」の値をメッセージで表示させようとしているかんたんな処理文です。
この処理を実際に動かしてみます。
するとこのような結果になりました↓
メッセージボックスの中に何も表示されていません。
本当なら、「Hensu」の中にある値「Hello!」が取れていてもいいはずなのに。
これは、関数「Kansu1」の中で宣言した変数「Hensu」が関数「Kansu2」では読み取れていないため、「Hello!」の値が取れていなかったのです。
もっと厳密にいえば、関数「Kansu2」で呼んでいる「Hensu」と関数「Kansu1」で宣言した「Hensu」は全くの別物です。
関数「Kansu2」の「Hensu」は、「Kansu2」で作られた別物の変数だったのです。
(実は、変数は宣言せずに使用することが出来るのですが、おすすめ出来ません。)
分かりづらかったと思うので、別の例も見てみましょう↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub Kansu1() Dim Hensu As Integer Hensu = 10 Call Kansu2 End Sub Sub Kansu2() Dim Hensu As Integer Hensu = Hensu + 1 MsgBox Hensu End Sub |
今度は関数「Kansu1」「Kansu2」のそれぞれで同じ名前の変数「Hensu」を宣言しています。
「Kansu1」では「Hensu」に10という値を入れています。
「Kansu2」では「Hensu」にプラス1した値を入れています。
さあ、今度はどうなるでしょうか?
実行するとこのような結果になりました↓
「Kansu1」の「Hensu」のやり取りはガッツリ無視して、「Kansu2」の「Hensu」の状態しか見ていません。
「Kansu2」の「Hensu」は宣言されただけで値は入っていなく、プラス1した値を「Hensu」に代入しているため、1と表示されています。
このように、宣言された関数の中でのみ読まれる変数の事を「ローカル変数」と呼びます。
これまでの学習で出てきた変数たちは全てこの「ローカル変数」です。
グローバル変数を知ろう
ローカル変数と対をなす存在が「グローバル変数」です。
グローバル変数は、これまでのローカル変数と逆で、モジュール内に書かれた関数のどこからでも呼ぶことが出来る変数です。
変数をどの関数にも属さない、関数の外に宣言することでグローバル変数を作る事が出来ます。
下の画像の一番上の行がグローバル変数の宣言です。
グローバル変数は、一連の処理の中で関数をまたいで呼び出して、値を変更したい場合に便利な変数です。
実際にグローバル変数を使ってみます。
例として、下のコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'↓グローバル変数 Dim Hensu_G As Integer Sub Kansu1() Hensu_G = 10 Call Kansu2 End Sub Sub Kansu2() Hensu_G = Hensu_G + 1 MsgBox Hensu_G End Sub |
グローバル変数の「Hensu_G」を関数「Kansu1」で呼び出して「10」を代入しています。
その後、関数「Kansu2」を呼び出し、「Kansu2」で「Hensu_G」にプラス1しています。
上で紹介した「ローカル変数」の場合は、関数「Kansu2」で新しい変数として作成され、「Kansu1」で処理した部分を全部無視して計算していました。
今度はどうなるでしょう?
実行した結果はこちらです↓
今度は「Kansu1」で「Hensu_G」に「10」を代入したことも「Kansu2」に引き継がれていますね。
このように、関数間の隔てなく共通的に呼び出すことが出来る変数を「グローバル変数」と言います。
グローバル変数とローカル変数の使い分け
基本的に、関数ごとにグローバル変数を宣言して使うのが無難です。
グローバル変数は、共通的に読み込みたい&編集したい値がある場合のみ宣言して使用します。
なので、グローバル変数はあまり乱用せず、出来る限りローカル変数を使うようにするといいと思います。
その方が、わけわからなくならなくて済み、コードの可読性が高くなります。
ちなみに、こんな場合はグローバル変数よりもローカル変数の呼び出しが優先されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'↓グローバル変数 Dim Hensu_G As Integer Sub Kansu1() Hensu_G = 10 Call Kansu2 End Sub Sub Kansu2() Dim Hensu_G As Integer Hensu_G = Hensu_G + 1 MsgBox Hensu_G End Sub |
関数「Knasu2」で、グローバル変数と同じ名前の変数「Hensau_G」を宣言しています。
この場合、出力される結果は下のようになりました↓
ローカル変数でも同じ変数名が宣言されている場合、ローカル変数の方を優先して呼び出しているので、思わぬ不具合を作らないようグローバル変数を宣言する時は名前の付け方に十分注意しましょう。