ゆるおたノート

Tomorrow is another day.

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

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

tonari-it.com

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

変数のスコープ図。

Spreadsheetで貼ってみますが、見辛かったらご指摘ください。
<2019/02/02 追記>
画像に差し替えました。

変数のスコープ図

変数の使い分け。

問題のスコープですが。

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

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

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

上記の図を例にすると、[Module1]から[Module2]の変数を呼び出す場合、[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

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

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

まとめ。

ここまでを踏まえて、VBAの変数は以下のように扱います。

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

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

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