GASがなかなか 言うことを聞いてくれない 身に付いてないので、
最近はこちらの記事でVBAの勉強を挟んでみています。
「コレは上書き出来て、アレはダメで…」
頭で考えてたら何だかこんがらがってきたので、変数のスコープについて図で整理してみました。
※便宜上、型宣言の部分は省略しています。適宜補完して下さい。
変数のスコープ図。
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 追記>
クラスでもパブリック変数はあまり使わないようですね…逆に何処で必要なんだろう…?
まとめ。
ここまでをまとめると、VBAの変数は以下のように扱います。
- 可能な限り、スコープは小さく、小さく。コーディング的にも、物理(人間の視野)的にも。
- 外からのアクセスが必要になったら引数で渡す。
- オブジェクト変数の場合は、不要になったら
set 変数 = Nothnig
で参照を切っておく。(今回は言及していませんが。)
クラスが使えるようになったら、ここに項目が増えていくのかもしれませんね。
GASと同様、身に付くにはまだまだ時間がかかりそうですが、使いこなす日が楽しみです。わくわく。
以上、お勉強メモでした。