初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel エクセルマクロVBA入門-変数が使える範囲って?

f:id:drumer2sh:20131119110340p:plain

グローバル変数とローカル変数


さて、変数が使える範囲のお話です。VBAっぽくいうと、グローバル変数とモジュールレベル変数なんて呼んだりしますが、ぶっちゃけ呼び名なんてどうでもいいです。グローバルとローカルで十分。なぜならその方がイメージしやすいからです。大事なのは・・・

状況に応じて適切な変数を使う。

ということです。

ローカル変数はプロシージャの中でだけで生きている。


ローカル変数はプロシージャの中で生きている変数です。

Sub test1()

    Dim i As Long
    Dim str As String

End Sub


Sub test2()

    Dim i As Long
    Dim str As String

End Sub

プロシージャのtes1とtest2でまったく同じ変数が作成されていますが、この2つは名前は同じでも別の物です。同じ名前の箱が複数存在していることになりますが、ちゃんと使い分けされています。それはそれぞれプロシージャの中で作成されているからです。当然ですがプロシージャが終わればこの箱は消滅します。
ですので、同じ名前でも構わないわけです。人が読んでそれでわかれば。
またプロシージャが動くときには最初からまた変数が作成され、実行され、消滅します。

つまり、プロシージャの中でだけで使うのなら、迷わずローカル変数として作成しましょう。

グローバル変数は世界を股にかける変数


グローバル変数はその名の通り、世界を股にかける変数です。要するに、このエクセルマクロのファイルの中で自由に共有できる変数ということになります。書き方はDimではくPublicステートメントを使います。

先ほどのソースに加えると

Public hoge As String

Sub test1()

    Dim i As Long
    Dim str As String

End Sub


Sub test2()

    Dim i As Long
    Dim str As String

End Sub

このようにプロシージャとは別に記述します。こうすることで、どのモジュールでもhoge変数は利用できるようになります。成績表のマクロで私がmdlDefineとして作成していたところに書いていたものです。こうすれば、別のモジュールで利用できるようになるので、色々なモジュールで使う変数を利用する場合にはとても便利です。
一番よくわかる例は、エクセルのシートにパラメータを用意しておいてそれを随所で利用するケースです。こういうパラメータなどは一度変数に取り込んで後はそれを全部利用したりするのでグローバル変数が便利ですね。つまり、

いろんな処理で共有の必要がある場合はグローバル変数

と覚えましょう。

とはいえ・・・乱用はしてはいけない。


ここからはちょっと難しいお話なので読み飛ばしてもらってもいいです。前回の成績表マクロではmdlDefineというモジュールを作成し、その中にグローバル変数を全部記述しておきました。これはこれで管理も楽ですし、有用な方法ですが、実はあながち乱用はできない方法です。これは「設計思想」にかかわってくるので、一概に何がベストなのか?という論議になるのですが、プログラムとして人も見やすい、管理もしやすいを優先することもあれば、言語としてはこうなのだからこう書くべき。という思想もあります。

・変数は管理しやすいようにグローバル変数は許容するよ

と考える人もいれば、

・変数はきちんと使うべきところで宣言し、それ以外はパフォーマンスを
 悪化させるので、きちんと扱うべし!

とする人もいます。
これは、どちらも正しいと私は思います。何が大事なのかは、

「きちんと実現したいことができて効率化ができ、生産性が向上すること」

なのです。大きな目的はここであり、中身の作りの話なんて実はどうでもいいと思っています。したがって、

中身がきちんと管理ができて、他の人も読みやすく理解できるように書ければ、
前提の設計思想は共有できればそれでいいのです。

ただし、思想から逸脱しないことは大切です。方針がグニャグニャでは結果的にわかりにくいものになってしまいます。

大切なのは使いどころをちゃんと理解すること。


実はグローバルとローカル以外にも、その間の変数もあります。モジュールの上にDimステートメントを使えば、そのモジュール全体のみで使える変数になります。

Dim hoge As String

Sub test1()

    Dim i As Long
    Dim str As String

End Sub

・・・
・・・

こうですね。ですが、実はあんまりこれは使わない気がします。もちろんきちんと使いどころを理解して適切に使うことが大切ですが、あまりいろんな変数が出現するマクロは読みにくくなってしまいます。
共有した方がよい!またしないと実現できない時に利用するのが良いでしょう。

大切なのは、グローバルもローカルもその使いどころをきちんと見極めて適切に使うことです。そうであれば、変に間違って使ってしまうことはないと思います。とりあえず、グローバルで!なんて使い方が一番ダメなので、それだけは守りましょう。
自分で説明できない変数は絶対に作ってはいけないのです。


今日はここまで。

かしこ