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

【VBA】定数(Const)の基本と活用術!マジックナンバーを排除して読みやすいコードへ

プログラムの中で何度も出てくる数値や文字列。それらを直接書き込むのではなく、「名前」を付けて管理するのが定数(Const)の役割です。定数を適切に使うことで、コードの意図が明確になり、修正ミスを劇的に減らすことができます。

1. 基本文法:Constステートメント

定数を宣言するには Const を使用します。変数とは異なり、一度値を決めたらプログラムの実行中に書き換えることはできません。型(As type)は省略可能ですが、明示的に指定するのが「理系」スタイルの堅牢な書き方です。

[ 構文 ]
Const 定数名 [ As データ型 ] = 値

2. 実践サンプル:定数を使った計算

ポイント:意味のある名前(PIなど)を付ける

数値をそのまま書く(マジックナンバー)のを避け、定数として定義することで、後から見返したときに何を表しているのかが一目でわかります。

Sub Macro1()
  ' 定数の宣言
  Const PI As Double = 3.14

  ' 定数を使用した出力
  Debug.Print PI
End Sub

3. 実行結果

マクロを実行すると、イミディエイトウィンドウに定義した値が出力されます。

3.14

4. なぜ「変数」ではなく「定数」を使うのか?

1. ここがメリット!: 定数は誤って書き換えられる心配がないため、システムの根幹をなす値(消費税率や円周率など)の管理に最適です。また、一箇所を直せばプログラム全体に反映されるため、保守性が非常に高くなります。
2. エンジニアの視点: コンパイル時に値が確定するため、実行速度の面でも(微々たるものですが)有利に働きます。Java 17でいう final 定数と同じく、不変性(Immutability)を担保する設計は、バグの少ない「いけいけ」なコードを生む基本です。
3. スコープの活用: モジュールの先頭で Public Const と宣言すれば、プロジェクト内のどこからでも参照できる「共通定数」になります。前回の記事で紹介した MConst モジュールに集約させるのが、プロレベルの管理術です。


5. まとめ

「その値は変わる可能性があるか?」を自分に問いかけ、変わらないものは積極的に Const にしていきましょう。ハードコーディングを卒業し、定数を使いこなすことで、あなたのVBAコードは一段とプロフェッショナルな輝きを放ち始めます。


PR

【VBAスタンダード対策】状態を保持する「Static変数」の構造を攻略!

通常、Subプロシージャ内で宣言された変数は、End Sub に到達した瞬間にメモリから消滅します。しかし、Static キーワードを使って宣言された変数は、プロシージャが終了してもその値をメモリ上に維持し続けます。この「静的な保持」の仕組みを理解しましょう。

1. 問題:実行をまたぐ数値の変化

【 問題 】 以下のSubプロシージャ Accumulate を、他の場所から2回連続で呼び出したとします。2回目の実行時に、メッセージボックスに表示される数値はいくつでしょうか?

Sub Accumulate()
    Static total As Integer
    Dim subTotal As Integer

    total = total + 10
    subTotal = subTotal + 10

    MsgBox total
End Sub

① 0   ② 10   ③ 20   ④ エラーになる

2. 正解:変数の初期化と保持に関する正解

正解: ③ 20

3. 解説:なぜ「20」になるのか?

通常の Dim で宣言された subTotal は、End Sub のたびにリセットされますが、Static で宣言された total は前回の値を引き継ぎます。1回目で10になり、2回目でさらに10が加算されるため、結果は20となります。

[ Static変数の生存構造図 ]

1回目実行:
[開始] total(0) -> [加算] total(10) -> [終了] 保持

2回目実行:
[開始] total(10) -> [加算] total(20) -> [終了] 保持

[ Dimとの構造的な違い ]
Dim 変数:End Subでメモリが解放され、次回はまた0(初期値)から始まる。
Static 変数:End Subを通ってもメモリが解放されず、ブックを閉じるまで値を維持する。

1. ここが試験に出る!: 試験では「変数の有効範囲(スコープ)」と「生存期間(ライフサイクル)」が混同しやすいポイントとして狙われます。Static変数は「そのSubの中でしか使えない(ローカルスコープ)」けれど、「値は消えない(モジュールレベル並みの寿命)」という特殊な構造を持っていることを押さえましょう。
2. エンジニアの視点: 仰る通り、実務では「誰がいつこの値を書き換えたか」が不透明になりやすく、バグの温床になりがちです。Java 17のクラス変数に近いですが、より影響範囲を限定した「状態を持つメソッド」を作りたい時に使われます。ただ、可読性を優先するなら、モジュールレベル変数にするか、引数で値を回す方が「理系NEO」な綺麗な設計と言えますね。


4. まとめ

「Static = End Subを越えて記憶する」。この構造を理解すれば、実行回数のカウントや累積計算など、フラグ管理が容易になります。減数分裂が特定の情報を次へ繋ぐように、VBAも Static を使うことで、プロシージャの枠を超えて「状態」を維持することができるのです。



【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も適切なスコープを選択することで、必要な情報を正しく未来へ繋いでいくのです。