サイトについて      連絡先   検索

VBA スコープ

はじめに

Excel VBA のスコープを紹介します。

スコープとは変数や関数などを参照できる範囲のことで、Public, Private, Dim があります。

関数内だけで使用できるものから、すべてのファイルから使用できるなど、使える範囲を設定できます。

スコープとは

変数や関数を参照できる範囲を「スコープ」と呼びます。スコープには次の種類があります。

変数と関数のスコープは同じで、違いはありません。理解しやすいように分けて説明します。

変数のスコープ

次のような変数が Sheet1 に宣言されているとします。Public と Private は関数より上で宣言します。Dim は関数の中で宣言します。

Sheet1 のコード


' どこからでも参照可能
Public public変数 As String

' Sheet1 だけで参照可能
Private private変数 As String

Sub Tips
    ' Tips 関数内でのみ参照可能
    Dim dim変数 As String
End Sub

public変数は Sheet2 や標準モジュールからも参照できます。

private変数は Sheet2 や標準モジュールからは参照できません。

dim変数は Tips 関数の中だけで参照できます。

Dim 変数の使い方

Dim は関数内だけで参照されます。その関数を処理が抜けると Dim の変数は削除されます。


Sub 実行()
    Dim dim変数 As Integer

    dim変数 = dim変数 + 1
    Debug.Print (dim変数) ' 毎回 1 です
End Sub

dim変数をカウントアップする関数があります。これを何度実行しても dim変数の値は 0 + 1 で 1 になります。

関数を処理が抜けると dim変数が削除されるため、次に実行されるときは 0 に初期化されているためです。

Private 変数の使い方

Private はシートなどのファイル内で参照できます。どの関数を実行しても変数の値は残ります。


Private private変数 As Integer

Sub カウントアップ()
    private変数 = private変数 + 1
    Debug.Print (private変数)
End Sub

Sub カウントダウン()
    private変数 = private変数 - 1
    Debug.Print (private変数)
End Sub

カウントアップ関数を実行すると private変数は 1, 2, 3 ・・・と増えていきます。

その後でカウントダウン関数を実行する ・・・ 3, 2, 1 と減っていきます。

複数の関数で同じ変数を使いたいときは Privcate にします。

関数の外で Dim を使って変数を宣言できます。そのときは Private と同じ扱いになります。

Public 変数の使い方

Public はどのシートや標準モジュールからも参照できます。Private の範囲を拡大した動作になります。

Sheet1 のコード


Public public変数 As Integer

Sub カウントアップ()
    public変数 = public変数 + 1
    Debug.Print (public変数)
End Sub

Sheet2 のコード


Sub カウントアップ()
    Sheet1.public変数 = Sheet1.public変数 + 1
    Debug.Print (Sheet1.public変数)
End Sub

Sheet1 のカウントアップ関数を実行すると public変数は 1, 2, 3 ・・・と増えていきます。

その後で Sheet2 のカウントアップ関数を実行すると public変数は続きから ・・・ 4, 5, 6 ・・・ と増えていきます。

すべてのファイルから同じ変数を使用したいときは Public にします。

標準モジュールに注意

別のシートの Public 変数を参照するにはシート名.変数名のようにする必要があります。

別の標準モジュールの Public 変数を参照するにはモジュール名.変数名のようにできますが、変数名のみでも参照できます。

標準モジュール1 のコード


Public public変数 As Integer

Sheet1 のコード


Sub カウントアップ()
    Module1.public変数 = Module1.public変数 + 1
    Debug.Print (Module1.public変数)

    public変数 = public変数 + 1
    Debug.Print (public変数)
End Sub

カウントアップ関数を実行すると、どちらも標準モジュールの public変数を参照します。public変数が Sheet1 の Private や Public 変数と同じように使えるので混同してバグの原因になります。なるべく標準モジュールには Public 変数を使用しないように注意します。

関数のスコープ

関数のスコープも変数と同じです。Dim は関数には使用できません。

Sheet1 のコード


Sub 実行1()
    publicモジュール
    Module1.publicモジュール
    privateモジュール ' Private なのでエラー
End Sub

Private Sub private関数()
    
End Sub

Public Sub public関数()
    
End Sub

' Public Sub になる
Sub sub関数()
    
End Sub

標準モジュール1 のコード


Sub 実行2()
    public関数         ' シート名がないのでエラー
    Sheet1.public関数
    Sheet1.private関数 ' Private なのでエラー
End Sub

Private Sub privateモジュール()

End Sub

Public Sub publicモジュール()
    
End Sub

Private や Public を省略したときは Public 関数になります。

変数と同じように他のファイルの関数を呼び出すにはファイル名.関数名のようにします。標準モジュールの関数だけは関数名のみでも呼び出せます。

まとめ

スコープを使いこなすと不具合が発生しにくくなります。なんでもかんでも Public にしていると知らないところで値が変更されたりして、バグが発生します。

最初は Dim 次に Private、最後に Public といったように、できるだけスコープを狭くすることが大切です。

関連ページ