VBAテクニック集 VBA一覧 変数・知識 文法・構文

【VBA】Dim・Private・Publicの使用方法|変数・プロシージャのスコープを理解

Excel VBAを書いていると、「この変数はどこから使えるのか」「なぜ別のモジュールでは参照できないのか」といった疑問に必ず直面します。その原因の多くは、Dim・Private・Publicの使い分けを曖昧にしたままコーディングしていることにあります。

最初は動いていたマクロでも、処理が増えるにつれて「修正したら別の処理が壊れる」「同じ名前の変数が競合する」といったトラブルが起きがちです。
こうした問題を防ぐために欠かせないのが、スコープ(有効範囲)を意識した宣言です。

この記事では、Dim・Private・Publicそれぞれの役割と違いを、コード例と実務視点で丁寧に解説します。
「なんとなく使っている」状態から一歩進み、壊れにくいVBA設計を身につけましょう。

✅ VBAにおけるスコープとは何か

ここを理解しないまま読み進めると、後半で必ず混乱します。
まずはスコープという考え方を押さえましょう。

・スコープの基本概念

スコープとは、変数やプロシージャが有効になる範囲のことです。

  • どこで使えるのか
  • どこから参照できるのか
  • いつまで値が保持されるのか

これらはすべて、宣言方法によって決まります。

VBAでは、主に次の3段階があります。

  • プロシージャレベル
  • モジュールレベル
  • プロジェクトレベル

Dim・Private・Publicは、この範囲を制御するためのキーワードです。


✅ Dimの使用方法と役割

Dimは、VBAで最も頻繁に使われる宣言方法です。
しかし、「Dim=変数宣言」とだけ覚えていると、設計でつまずきます。

・Dimの基本構文

Dim i As Long
Dim userName As String

Dimは Dimension(次元) の略で、変数を定義するために使われます。


・プロシージャ内で使うDim(ローカル変数)

Sub SampleProcess()

    Dim total As Long
    total = 10

    MsgBox total

End Sub

この場合、totalこのSubの中でのみ有効 です。

特徴

  • Sub / Functionの中でのみ使用可能
  • 処理が終わると値は破棄される
  • 他の処理に影響しない

一時的な計算や判定用には、この使い方が最も安全です。


・Dimを使うメリット

  • 影響範囲が限定される
  • 変数競合が起きにくい
  • デバッグが容易

基本的に、迷ったらDim が原則です。


✅ Privateの使用方法|隠す設計を作る

Privateは、「外部から見せない」ためのキーワードです。
実務では、Dim以上に重要と言っても過言ではありません。

・Private Subの基本構文

Private Sub InternalProcess()
    MsgBox "内部処理です"
End Sub

このSubは、同じモジュール内からのみ呼び出せます


・Privateを使う理由

「なぜわざわざ呼び出せなくするのか?」と疑問に思うかもしれません。
しかし、これが保守性の要です。

Privateにするメリット

  • 誤って呼ばれるのを防ぐ
  • 変更の影響範囲を限定できる
  • コードの意図が明確になる

・標準モジュールでの典型例

Public Sub MainProcess()
    Call ValidateData
    Call OutputResult
End Sub

Private Sub ValidateData()
    ' 入力チェック
End Sub

Private Sub OutputResult()
    ' 結果出力
End Sub

この構成にすると、

  • 外部から呼ぶのはMainProcessだけ
  • 内部処理は勝手に使われない

という安全な設計になります。

参考:【VBA】標準モジュールの呼び出し方法とは|Sub・Functionの使い分けと実務設計




✅ Publicの使用方法|共有する設計を作る

Publicは、プロジェクト全体で使えるようにするための宣言です。
便利な反面、使いすぎると危険です。

・Public Subの基本構文

Public Sub ShowMessage()
    MsgBox "どこからでも呼び出せます"
End Sub

このSubは、

  • 標準モジュール
  • シートモジュール
  • ユーザーフォーム

など、どこからでも呼び出せます。


・Public変数の宣言

Public gUserName As String

この変数は、プロジェクト全体で共有されます。

注意点

  • 値がどこで変更されたか追いにくい
  • バグの原因になりやすい

✅ Dim / Private / Public の違いを整理する

ここで一度、違いを整理します。

宣言有効範囲主な用途
Dim(プロシージャ内)Sub / Function内一時変数
Private Sub / Function同一モジュール内補助処理
Public Sub / Functionプロジェクト全体外部呼び出し
Public変数プロジェクト全体共有状態(慎重)

✅ よくある誤解と失敗パターン

ここを理解していないと、実務で必ずハマります。

・すべてPublicにしてしまう

Public Sub A()
End Sub

Public Sub B()
End Sub

→ どこからでも呼べてしまい、処理の流れが不明確になります。


・変数をPublicで使い回す

Public total As Long

→ 別の処理で上書きされ、原因不明のバグが発生。

参考:【VBA】ExcelVBAのPublic変数が参照できない|書く場所|スコープと配置の完全理解


・Privateを付け忘れる

Sub HelperProcess()
End Sub

→ 意図せず他の処理から呼ばれる可能性あり。


✅ 実務でおすすめの宣言ルール

迷ったときの実務ルールを紹介します。

・変数の基本ルール

  • 原則:Dim(ローカル)
  • 状態保持が必要:Moduleレベル + Private
  • Public変数は極力使わない

・プロシージャの基本ルール

  • 外部から使う入口:Public
  • 内部処理:Private
  • Main処理は1つ作る

✅ Moduleレベル変数とPrivate

Moduleレベルで変数を持たせる場合は、必ずPrivateを付けます。

Private currentRow As Long

この変数は、

  • 同じ標準モジュール内で共有
  • 他モジュールからは不可視

という安全な状態になります。


✅ RPA・UiPath連携を意識した宣言設計

RPAとVBAを併用する場合、
Publicは「入口」だけに限定するのが理想です。

Public Sub RunFromRPA()
    Call MainProcess
End Sub

内部処理はすべてPrivateにしておけば、
RPA側への影響を最小限に抑えられます。




✅ まとめ:Dim・Private・Publicを正しく使い分けよう

  • Dimは一時的な処理用変数に使う
  • Privateは内部処理を守るために使う
  • Publicは最小限に抑える
  • スコープを意識するとバグが激減する
  • Main処理+Private補助処理が基本形
  • RPA連携を見据えると設計力が上がる

Dim・Private・Publicを正しく使い分けることで、
VBAは「動けばOK」から「保守できるプログラム」へ進化します。

今使っているマクロを見直すだけでも、
コードの読みやすさと安全性が大きく変わるはずです。

参考:【VBA】変数をまとめて宣言する方法

    -VBAテクニック集, VBA一覧, 変数・知識, 文法・構文