2017-09-26 3 views
1

私はあなたのアドバイスに感謝したいので、私は最も精通したVBAコーダーではありません!私は、これらの各モジュールが1つのワークブック(Master.xlsm)にアクセスする必要がある複数のモジュールを持っています。 1)他のモジュールでこのワークブックにアクセスするために公開変数を使用するか、2)それを使用する各サブで開くことがより速いのですか?MS Excel VBA:パブリック変数またはサブ変数間で変数を使用する方が速いのですか?

オプション#1

私は、パブリック変数にワークブックを設定すると、ブックがのAuto_Openを使用して開かれるたびに、それが割り当てられなければならないと思います。

Public wbk_MASTER As Workbook 

Sub Auto_Open() 

    Set wbk_MASTER = Workbooks.Open("C:\Master.xlsm") 

End Sub 

オプション#2

また、Master.xlsmを使用する各サブで、私はちょうどそれが好き渡したい:

Sub DoSomething(wbk_master as Workbook) 

    ' do something 

End Sub 

どんなサブはこのサブを呼び出すことを前提としてい次のようになります:

Sub CallDoSomething() 

    Dim wbk_master as Workbook 
    Set wbk_master = Workbooks.Open("C:\Master.xlsm") 

    Call DoSomething(wbk_master) 

End Sub 

DoSomethingのようなサブ。違いがある場合は、Master.xlsmの重要なシートの変数と、特定の範囲の値も含めたいと思います。

は個人的に、私はオプション#1がきれいですが、より高速であると思いますか?あなたが見ているのは何

が実際のオブジェクトへの単なるポインタです:直接答え与えること

+0

これは、オプション2がそれを行うための良い方法で、できるだけ小さな範囲を維持するためのベストプラクティスです。スピードが目立つ違いはありません – SWa

+0

複数のサブシステムでマスターを使用する必要がある場合は、1回開いて設定し、開いたままにして、必要なときにデータにアクセスする方がよいと思います。私は#1に投票する。 publicスコープを使用すると、後でオブジェクトにアクセスできるようになります。私もSWaに同意しますが、ベストプラクティスは推奨事項であり、「すべてに合った」ソリューションではありません。おそらく#1はあなたのxlsmにもっと多くのメモリを割り当てるでしょうが、このような観点からは、開いたり閉じたりする時間が少なくなるので、プロセッサ時間も短縮されます。 –

+0

オプション1でVBAキャリアを開始しましたが、クラスが発展するにつれてコードページが小説になり、プロジェクトが巨大になり、オプション2のように変数をルーチンに渡す方がはるかに優れていました。主に私はどのようなワークブックをルーチンに渡すことができ、オープン時に多数のワークブックを開いて定義する必要がないからです。ちょうど追跡しやすいと感じる。 – jamheadart

答えて

1

ディルクは、しかし、どのように、より弾力性の第三のオプションについては、直接あなたの質問に答えましたか?標準モジュールで

Public Property Get SourceWorkbook() as Workbook 

    Static wkb_Master As Workbook 

    If wkb_Master is Nothing Then Set wkb_Master = Workbooks.Open("C:\Master.xlsm") 

    Set SourceWorkbook = wkb_Master 

End Property 

その後、使用することができます:

Sub test() 

    SourceWorkbook.Sheets(1).Name 

End Sub 

それは小さな範囲を保持し、読み取り専用、さらにプロジェクトをリセットする必要があり、ソースドキュメントを再開しますあなたのアプローチのどちらもこれをしません。

+0

私はこれをテストしなければならないでしょうが、私は本当にこの答えが好きです!私はグローバル変数の使用を避け、まだ物事をきれいに保つのが好きです。 – Carbo

+0

まだ1つの欠点が残っています:すべての相互作用がそれが「目立たない」遅延を引き起こす「何もない」ことをチェックするので、「公的変数」の速度優位性を失います。そのことを覚えておいて、ポインタを格納するためのメモリを(覚えていれば)認識できないプロパティにサブ/関数内のローカル変数を設定する方が速くなります。P –

+1

@DirkReichelオブジェクトへのポインタのオーバーヘッドを懸念して、私は最初にExcel VBAを使うべきではありません;) – SWa

1

:ので、グローバル変数を使用して

は特別目立たない方法で、「速い」です。
この方法globalVariable.Sheets(1).NameまたはsubOrFunctionVariable.Sheets(1).Nameを使用するための速度の差は、デフォルトではありません。
しかし:サブ/関数に渡すと、時間がかかり、メモリを使用して、それへの新しいポインタを作成します。
まだ:家を爆破して落とすとどんな針が騒音が増すかを聞くようなものです。人間にとって顕著な違いはありません。 ;)

数字/文字列/配列/非ポインタオブジェクトを使用してポインタを使用するだけでは、影響がある可能性のあるデータ(の代わりにByValが使用されている)が完全に作成されることがあります。

関連する問題