カテゴリ: Excel VBA 更新日: 2026/02/11

VBAの変数のスコープを完全解説!プロシージャレベルとモジュールレベルの違い

変数のスコープを理解しよう!プロシージャレベル・モジュールレベルの使い分け
変数のスコープを理解しよう!プロシージャレベル・モジュールレベルの使い分け

先生と生徒の会話形式で理解しよう

生徒

「先生、さっきのプログラムで使った『変数』を、別のマクロでも使おうとしたらエラーが出てしまいました。一度作った箱はどこでも使えるんじゃないんですか?」

先生

「それは『スコープ』というルールが関係しています。変数には、それぞれ『使える有効範囲』が決まっているんですよ。」

生徒

「有効範囲……?箱を置く場所によって、中身が見えたり見えなかったりするってことですか?」

先生

「その通りです!どこで宣言するかによって、そのマクロの中だけで消えてしまうか、他のマクロからも使えるかが変わります。詳しく解説しますね。」

1. 変数の「スコープ」とは?

1. 変数の「スコープ」とは?
1. 変数の「スコープ」とは?

Excel VBA(エクセル・ブイビーエー)におけるスコープ(Scope)とは、宣言した変数が「プログラムのどこから参照できるか」という有効範囲のことです。プログラミングの世界では、すべての変数をどこからでも使えるようにしてしまうと、思わぬところで値が書き換わってしまうトラブルが起きやすくなります。

そのため、VBAでは「この箱はこの部屋の中だけで使う」「この箱はこの建物全体で使う」といったように、利用できる範囲を制限する仕組みが備わっています。これを正しく理解することが、エラーの少ない綺麗なコードを書くための第一歩です。

2. プロシージャレベル変数(ローカル変数)

2. プロシージャレベル変数(ローカル変数)
2. プロシージャレベル変数(ローカル変数)

もっとも一般的なのが、プロシージャレベル変数です。これは Sub から End Sub の中で宣言する変数のことで、そのマクロ(プロシージャ)の中だけで有効です。プログラミング用語では「ローカル変数」とも呼ばれます。

例えるなら、自分の「カバンの中」のようなものです。自分のカバンの中身は自分しか触れませんし、家に帰ってカバンを片付ければ(マクロが終われば)、中身の存在は忘れてしまいます。


Sub MyMacro1()
    ' この中で宣言した変数はMyMacro1専用です
    Dim myName As String
    myName = "田中"
    MsgBox myName & "さんの処理を開始します。"
End Sub

Sub MyMacro2()
    ' ここでMyMacro1のmyNameを使おうとするとエラーになります
    ' MsgBox myName ' ←これは動かない!
End Sub

このように、他のマクロに影響を与えたくない一時的な計算や名前の保存には、必ずプロシージャレベル変数を使います。

3. モジュールレベル変数(Private変数)

3. モジュールレベル変数(Private変数)
3. モジュールレベル変数(Private変数)

同じモジュール(プログラムを書くシートのようなもの)の中にある複数のマクロで共通して使いたい箱が必要なときは、モジュールレベル変数を使います。

宣言する場所がポイントで、Sub の中ではなく、コードの一番上の部分(宣言セクション)に書きます。キーワードは Dim または Private を使います。

これは「家の中の共有棚」のようなイメージです。家族(同じモジュール内のマクロ)なら誰でもその棚にある箱を出し入れできますが、外の人(別のモジュール)からは見えません。


' モジュールの最上部に書きます
Dim sharedUser As String

Sub SetUserName()
    sharedUser = "佐藤"
    MsgBox "ユーザーを" & sharedUser & "に設定しました。"
End Sub

Sub ShowUserName()
    ' SetUserNameで入れた値をそのまま使えます
    MsgBox "現在のユーザーは" & sharedUser & "です。"
End Sub

4. パブリックレベル変数(プロジェクトレベル)

4. パブリックレベル変数(プロジェクトレベル)
4. パブリックレベル変数(プロジェクトレベル)

もっとも広い範囲で使えるのが、パブリックレベル変数です。これは、異なるモジュール間でも共有できる変数です。宣言するときに Public というキーワードを使います。

これは「公園のベンチ」や「公共の施設」のようなものです。そのエクセルファイル(プロジェクト)に含まれるすべてのプログラムから、いつでも読み書きが可能です。非常に便利ですが、どこで中身が変わったか分かりにくくなるため、初心者のうちは使いすぎに注意しましょう。


' 標準モジュールの最上部にPublicと書きます
Public TotalCount As Long

Sub CountUp()
    TotalCount = TotalCount + 1
End Sub

5. なぜスコープを意識する必要があるの?

5. なぜスコープを意識する必要があるの?
5. なぜスコープを意識する必要があるの?

パソコンを触ったことがない方にとって、「全部Publicにすれば楽じゃない?」と思うかもしれません。しかし、スコープを意識しないと以下のような問題が発生します。

  • 名前の衝突: いろいろな場所で同じ「i」という変数を使っていると、Publicにしているせいで他のマクロの数字まで書き換わってしまう。
  • メモリの無駄: 広いスコープの変数は、エクセルを閉じたりプログラムをリセットしたりするまでメモリ(作業領域)を占領し続けます。
  • バグの発見が遅れる: 「どこかで数字が勝手に変わっているけど、どのマクロが犯人かわからない!」という状態になりやすい。

基本は「できるだけ狭い範囲(プロシージャレベル)」で使い、どうしても必要なときだけ広げるのが、プログラミングの鉄則です。

6. 変数の寿命(ライフタイム)についても知ろう

6. 変数の寿命(ライフタイム)についても知ろう
6. 変数の寿命(ライフタイム)についても知ろう

スコープとセットで覚えておきたいのが寿命(ライフタイム)です。変数がいつ作られて、いつ消えるかという時間の流れのことです。

変数の種類 いつ生まれるか いつ消えるか
プロシージャレベル マクロが動いた時 End Subに到達した時
モジュールレベル ブックを開いた時など ブックを閉じた時など

プロシージャレベル変数は、マクロが終わるたびに中身が空っぽになります。次に動かしたときは、また「新しい箱」としてスタートするのです。逆に、値をずっと保持しておきたい場合は、上のレベルで宣言する必要があります。

7. スコープを間違えたときのエラーと対処法

7. スコープを間違えたときのエラーと対処法
7. スコープを間違えたときのエラーと対処法

もし、有効範囲の外で変数を使おうとすると、VBAは「変数が定義されていません」というエラーを出します。パソコン初心者の方はこのメッセージを見ると驚いてしまいますが、「箱が見つからないよ!」と教えてくれているだけです。

対処法は2つです。一つは、そのマクロの中でも Dim を使って新しく宣言すること。もう一つは、宣言する場所をモジュールの最上部に移動させて、スコープを広げることです。どちらが適切か、その変数の役割を考えて判断しましょう。

8. 良いプログラムを書くためのスコープ活用術

8. 良いプログラムを書くためのスコープ活用術
8. 良いプログラムを書くためのスコープ活用術

変数のスコープを使い分けられるようになると、あなたのVBAスキルは格段にアップします。最後に、初心者が心がけるべきポイントをまとめます。

  • マクロの中で完結する計算は、必ず Sub の中で Dim する。
  • 複数の Sub で「同じ設定値」を使いたいときだけ、モジュールの上の方で宣言する。
  • 変数名は、スコープが広いものほど丁寧な名前(例:UserSettingName など)にする。

最初は難しく感じるかもしれませんが、「箱の見える範囲」を意識して書くだけで、複雑な自動化ツールもスムーズに作れるようになります。まずは小さなマクロで、変数の有効範囲を実験しながら試してみてくださいね!

カテゴリの一覧へ
新着記事
New1
Office Scripts
Office Scriptsで日付判定!Excel条件付き書式を自動化して期限管理をラクにする方法
New2
Office Scripts
Office Scripts普及の歴史とMicrosoftの方向性!Excel自動化が進化してきた流れをやさしく解説
New3
Excel VBA
Excel VBA関数を用途別に作成!計算・文字列処理の基本を初心者向けに解説
New4
Office Scripts
Office Scriptsで条件付き書式を自動化!数値変化に応じてExcelの書式を自動更新する方法
人気記事
No.1
Java&Spring記事人気No1
Excel VBA
Excelマクロのセキュリティ設定の基本!安全に実行するための信頼センター設定まとめ
No.2
Java&Spring記事人気No2
Office Scripts
Office Scriptsでできること・できないことを完全整理!Excel自動化の基本と限界をやさしく解説
No.3
Java&Spring記事人気No3
Excel VBA
Excel VBAとOffice Scriptsの違いを比較!初心者でもわかる学ぶべきスキル
No.4
Java&Spring記事人気No4
Excel VBA
目的別にモジュールを分割する方法!処理単位で整理して見やすくするテクニック
No.5
Java&Spring記事人気No5
Excel VBA
Excel VBA基本文法の総まとめ!初心者が必ず押さえるべき20の基礎ポイント完全ガイド
No.6
Java&Spring記事人気No6
Office Scripts
Office Scriptsで条件付き書式を自動化!Excel自動化初心者向けスクリプト操作の基本
No.7
Java&Spring記事人気No7
Excel VBA
Excel VBAの開発環境を最速で整える!VBEの開き方から基本操作まで完全ガイド
No.8
Java&Spring記事人気No8
Office Scripts
Office Scriptsで日付判定!Excel条件付き書式を自動化して期限管理をラクにする方法