忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】値が生き続ける「モジュールレベル変数」を攻略!

プロシージャ(Sub)の中で宣言した変数は、End Sub に到達すると消滅してしまいます。しかし、プロシージャの外で宣言する「モジュールレベル変数」は、マクロが動いている間、その値を保持し続けるという特別な構造を持っています。

1. 問題:変数のスコープと実行結果

【 問題 】 同一の標準モジュールに記述された以下のコードを、Main → Main の順で2回連続して実行した際、2回目の実行時に表示される数値はいくつでしょうか?

Dim count As Integer ' --- (A) プロシージャの外で宣言 ---

Sub Main()
    count = count + 1
    ShowCount
End Sub

Sub ShowCount()
    MsgBox count
End Sub

① 0   ② 1   ③ 2   ④ エラーになる

2. 正解:変数の生存期間(寿命)に関する正解

正解: ③ 2

3. 解説:なぜ「End Sub」を越えて値が残るのか?

プロシージャの外(宣言セクション)で Dim を使って宣言された変数は、そのモジュール内のすべてのプロシージャで共有され、各プロシージャが終了しても値がリセットされません。

[ 変数の生存構造図 ]

標準モジュール
+------------------------------------------+
| Dim count (←ここで値が保持され続ける)   |
|                                         |
| Sub Main()                               |
|   count = count + 1  ←前回値を継承     |
| End Sub (←ここでは消えない!)           |
+------------------------------------------+

[ スコープによる構造の違い ]
ローカル変数:Subの中で宣言。End Sub でメモリから破棄される。
モジュールレベル変数:Subの外で宣言。ブックを閉じたり End ステートメントが実行されるまで値が残る。

1. ここが試験に出る!: 試験では「この変数はどこまで有効か?」という有効範囲(スコープ)と寿命の問題が頻出します。特に、今回の問題のように「2回実行した時の挙動」を問うことで、ローカル変数とモジュールレベル変数の構造的違いを区別できるかが試されます。
2. エンジニアの視点: Java 17などのクラス変数(静的フィールド)に近い挙動ですね。便利ですが、どこからでも書き換えられてしまうため、不必要な多用は避け、カプセル化(Private宣言)を意識した構造設計が、プロレベルの「いけいけ」なコードには求められます。


4. まとめ

「Subの外に書けば、End Subを越えて生き残る」。この生存戦略を理解することで、複数の処理をまたいだデータの集計や状態管理が可能になります。減数分裂において遺伝情報が次世代へ受け継がれるように、VBAも適切なスコープを選択することで、必要な情報を正しく未来へ繋いでいくのです。

PR