2017-06-20 11 views
1

VBAでスクリプト辞書を使用してExcel 2010で1,840,000のキーと値のペアを保持しています。これらを宣言して一度作成してから、モジュールと関数で使用します。VBAでスクリプト辞書を保持する

初心者の方は、Public dict As Scripting.Dictionaryを使用して公文書を宣言してから、worksheet_activate()に入力しました。どのように私はそれを保存し、他の改造に使用するのですか?

は、getter関数で、このような変数をラップし、良いプログラミングプラクティスとして、あなたに

+0

のいずれかのパブリックを作りますashが述べたように、Subs /関数の引数として渡します。良いものは、ブレーク/エラーの辞書を失うことはありません... –

+0

@ A.S.H私は公共のサブ "workbook_activate()"と命名し、ブックが開いたときに実行されませんでした。しかし、私が "worksheet_activate()"を使用したとき、私の改造がそのシート/ modファイルにまだ残っていれば素晴らしいものでした。いったん私が出ると、辞書内の値が消去されるように見えます。 – wizlog

+0

@PatrickLepelletierは、通常、辞書がエラーでワイプすることを意味していますか? – wizlog

答えて

3

をありがとう、そして静的その中にローカルとしてグローバル変数を非表示にします。最初の使用時にそれを設定します。 、標準モジュール内で、この関数を書くことを行うには

:このような

Public Function getMyDictionary() as Scripting.Dictionay 
    Static dict as Dictionary ' static: will keep state across different calls 

    If dict Is Nothing Then 
     Set dict = new Scripting.Dictionary 
     '''''''''''''''''''' 
     dict.Add "foo", "bar" 
     ' etc... 
     ' Code to populate dictionary 
     ' 
     '''''''''''''''''''' 
    End If 
    Set getMyDictionary = dict 
End Function 

を今、あなたは辞書を参照する必要がある時はいつでも、単に何か:

If getMyDictionary.Exists("foo") Then doStuff 

このイディオムは、多くの利点があります。

  • 辞書は最初に使用されます。 Excelセッション中に必要でない場合は、入力されません。

  • 「いつ辞書を作成するのですか」を心配する必要はありません。いつでもどこでも必要に応じて利用可能になり、入力されます

  • 実行時エラーによってプロジェクトがアンロードされると、すべてのグローバル変数がリセットされます。特に、オブジェクトはNothingにリセットされます。ラッパー関数は状況を正しく処理し、辞書を透過的に再生成します。

  • TLDR ...グローバルディクショナリは非表示で、そのアクセスは(ある程度まで)制御されます。 "ある程度まで"他のコードがまだそれを操作できるので(挿入、削除...)。 1は、例えば、それをより細かく制御する必要がある場合にのみ、それを読むために他のコードを許可し、それから...それだけ許可機能を公開し、いくつかのクラスモジュールのプライベートメンバモジュールで

+0

"foobar"はどのように評価されますか?どのような目的が追加されますか? boolean getMyDictionaryで十分ではありませんか。 – wizlog

+0

@wizlog素晴らしいですが、 'Set dict = new Scripting.Dictionary'を忘れずに、私はちょうどそれを追加しました:) –

+0

A.S.H.私が別のオブジェクト(読み込み:シート)にあるサブを実行するとすぐに、静的であるにもかかわらず、あなたが投稿した関数に作成され、読み込まれた辞書にアクセスできなくなります。 – wizlog

関連する問題