ゆるおたノート

Tomorrow is another day.

【VBA】変数のスコープを整理してみる。

GASがなかなか 言うことを聞いてくれない 身に付いてないので、
最近はこちらの記事でVBAの勉強を挟んでみています。

tonari-it.com

「コレは上書き出来て、アレはダメで…」
頭で考えてたら何だかこんがらがってきたので、変数のスコープについて図で整理してみました。
※便宜上、型宣言の部分は省略しています。適宜補完して下さい。

変数のスコープ図。

Spreadsheetで貼ってみますが、見辛かったらご指摘ください。

<2019/02/02 追記>
※画像に差し替えました。


クリックで拡大します。

内側に行くほど、壁が厚くなります。

なお、プライベート・モジュール・レベル変数は、「宣言セクション」で宣言する必要があります。

変数の使い分け。

問題のスコープですが。

前提として、外から中の変数へアクセス(呼び出し、操作)することは可能です。
中から外へは、アクセスできません。

他のモジュールからアクセス

プライベート・モジュール・レベル変数であれば、下記のようにモジュール間で呼び出して使うことは出来ます。

上記の図を例にすると、Module1からModule2の変数b2を呼び出す場合、Module1では以下のように記載します。

'[Module1]
Module2.b2

ただし、定義や現在の値が把握しづらくなるなど、事故の原因になるため実際の使用は控えます。

よって、他のモジュール(やプロシージャ)の変数が必要になったら、原則、引数で受け渡します。

'[Module1]
Public Sub exampleProcedure1()

    Dim tmp1 As String
    tmp1 = "TEST"
    Call exampleProcedure2()

End Sub

'[Module2]
Private Sub exampleProcedure2(byVal tmp2 As String)

    MsgBox "これは" & tmp2 & "です。"

End Sub

どうしてもパブリックにするなら

引数を使わずに他のモジュールからアクセスする場合は、Publicステートメントを使ってパブリック変数とします。

Public a As

ただ、これも定義や現在の状態が把握しづらくなるため、必要に迫られない限りは使用を控えます。

初心者の私が知っている範囲では、必要になるのはクラスくらいでしょうか。

<2019/10/28 追記>
クラスでもパブリック変数はあまり使わないようですね…逆に何処で必要なんだろう…?

www.yuru-wota.com

www.yuru-wota.com

まとめ。

ここまでをまとめると、VBAの変数は以下のように扱います。

  • 可能な限り、スコープは小さく、小さく。コーディング的にも、物理(人間の視野)的にも。
  • 外からのアクセスが必要になったら引数で渡す。
  • オブジェクト変数の場合は、不要になったらset 変数 = Nothnigで参照を切っておく。(今回は言及していませんが。)

クラスが使えるようになったら、ここに項目が増えていくのかもしれませんね。
GASと同様、身に付くにはまだまだ時間がかかりそうですが、使いこなす日が楽しみです。わくわく。

以上、お勉強メモでした。