2016-05-10 1 views
1

グローバル変数がスコープから外れる問題があります。私は「はThisWorkbook」でパブリック変数を定義していますVBA - グローバル変数がスコープから外れる

Public dict As Scripting.Dictionary 

これは中initalizedます「のWorkbook_Open()」

Set dict = New Scripting.Dictionary 

を初期化した後、私はサブを実行します(コードはまだ「はThisWorkbook」にあります)ということこの辞書にIDとカスタムクラスのインスタンスを埋め込みます。

他のモジュールでもこの​​dict変数の操作に問題があります。目標は、ワークシートが呼び出すことができる多数のパブリック関数を構築することです。これらの関数は、辞書内のカスタムクラスのデータを操作/取得/ etcします。例えば

は、このテストサブ(ModuleXYZのコードは)これは、ときに私が最初にこのコーディングプロジェクトを始めたとき、私はなるだろうと同じエラーです

Private Sub TestSub() 
    Dim x As Integer 
    x = ThisWorkbook.dict.Count 
End Sub 

「変数またはWithブロック変数が設定されていないオブジェクト」スロー"ThisWorkbook"モジュールのPublic変数としてdictを設定することで、私の望みは、 "ThisWorkbook"モジュール内のPublic変数としてdictを設定することでした。このワークブックが公開されていた時間の全体にわたってスコープ内に留まることになりました。

ありがとう - KC

+0

それは限り、あなたはプロジェクトをリセットするために何かをしていないとして残るべき(同じことがすべての真実でありますパブリック変数)。 – Rory

答えて

3

パブリック変数をブックではなくモジュールで宣言してください。また、それを2回宣言していないことを確認してください。条約は、globals.basと呼ばれることが多い1つのモジュール内のすべてのグローバルを宣言することです。

1

このような場合は、Singletonのパターンを使用することがよくあります(少なくとも、これはシングルトンパターンを理解したものです)。オブジェクトが存在する場合はそのオブジェクトを返す、またはオブジェクトを作成して返す、公開されている関数を作成します。この方法では、範囲外になることについてあまり心配する必要はありません。ここで

は例です:

Public oDict As Object 

Public Function GetDictionary() As Object 
    If oDict Is Nothing Then 
     Set oDict = CreateObject("Scripting.Dictionary") 
     For Each cel In Range("A1:A10") 
      oDict.Add cel.Value, cel.Offset(, 1).Value 
     Next cel 
    End If 

    Set GetDictionary = oDict 
End Function 

それを参照するには、それは次のようだ:

Sub GetDictCount() 
    MsgBox GetDictionary().Count 
End Sub 

Sub OtherDictTest() 
    MsgBox GetDictionary()(1) 
End Sub 
関連する問題