2013-09-26 6 views
20

私は過去2年間にExcel VBAを教えてきましたが、コードセグメントの最後に変数を配置するのが適切な場合があるという考えがあります。例えば、私はそれがRon de Bruin's code for transferring Excel to HTMLから適応このビットで行わ見てきました:以来、私はこの上でいくつかの検索を行って、それを行う方法を越えて非常に少ないことがわかりましたいつExcel VBA変数を強制終了するか、Nothingに設定する必要がありますか?

Function SaveContentToHTML (Rng as Range) 

     Dim FileForHTMLStorage As Object 
     Dim TextStreamOfHTML As Object 
     Dim TemporaryFileLocation As String 
     Dim TemporaryWorkbook As Workbook 

... 

     TemporaryWorkbook.Close savechanges:=False 
     Kill TemporaryFileLocation 
     Set TextStreamOfHTML = Nothing 
     Set FileForHTMLStorage = Nothing 
     Set TemporaryWorkbook = Nothing 

End Function 

、および1回のフォーラムの投稿a statement that no local variables need to be clearedに彼ら存在を中止するEnd Sub。私は上記のコードに基づいて、End Function、または私が遭遇していない他の状況では当てはまらないかもしれないと推測しています。

だから私の質問はこれに沸く:

  • は、いつ、なぜ、変数のクリーンアップのために説明してウェブ上のどこかにあり、私はそれを見つけることができますか?

そして、誰かがここで説明してくださいすることができない場合 ...

  • ときエクセルVBAのための変数のクリーンアップが必要であり、それがないときは?
  • さらに具体的には...特定の変数の使用(公共の変数? 関数定義の変数?)は、サブタイトルよりも長く のメモリにロードされたままであるため、クリーニングしなければ問題を引き起こす可能性があります。 up私の後に?

答えて

31

VB6/VBAの使い方に問題がありましたdestoyingオブジェクトへの決定論的アプローチ各オブジェクトは、自身への参照の数を格納します。数字がゼロになると、オブジェクトは破棄されます。

オブジェクト変数が範囲外になったときにオブジェクト変数がクリーンアップされることが保証されています(Nothingに設定されています)。これにより、それぞれのオブジェクトの参照カウンタが減少します。手動の操作は必要ありません。

  1. あなたはその変数がスコープの外に出る前に、オブジェクトが破壊されたい

    が(例えば、あなたの手順はするのに長い時間がかかるとしている:あなたは、明示的なクリーンアップをしたいとき

    は2例があります。オブジェクトがリソースを保持しているため、リソースを解放するためにできるだけ早くオブジェクトを破棄したい)。

  2. 2つ以上のオブジェクトの間に循環参照がある場合。

    objectAからobjectAobjectBへの参照を、そしてobjectB店舗参照した場合、2つのオブジェクトが明示的にobjectA.ReferenceToB = NothingまたはobjectB.ReferenceToA = Nothingを設定することで、あなたブレーキ連鎖しない限り、破壊されることはありません飽きないだろう。

表示されるコードスニペットが間違っています。手動によるクリーンアップは不要です。それはあなたにfalse sense of more correct codeを与えるので、手動クリーンアップを行うことは有害です。

変数がクラスレベルにある場合、クラスインスタンスが破棄されると、変数は消去/破棄されます。あなたは望むなら早く破壊することができます(1.参照)。

モジュールレベルで変数を使用している場合、プログラムが終了すると(またはVBAの場合は、VBAプロジェクトがリセットされたとき)、モジュールはクリーニング/破棄されます。あなたは望むなら早く破壊することができます(1.参照)。

変数のアクセスレベル(公開と非公開)は、その有効期間に影響しません。

+1

ありがとうございますGSerg、この説明は明確かつ簡潔であり、私に変数管理の方がはるかに優れています。もう1つの質問:あなたは、 "変数のアクセスレベルはその寿命に影響しない"と言う。その有効期間がアクティブなコード(開始)によって値が最初に設定され、そのコードが 'End'タグ(終了)に達すると境界があるかどうか知っていますか?それとも、プロジェクトがリセットされたら終了するのですか?私は別のモジュールで淡色表示された公開変数の値を設定することでこの理論をテストしようとしましたが、変数はローカルウィンドウには一度も現れませんでした。 –

+0

@KarlRookeyパブリックとプライベートは、クラスレベルとプロシージャレベルとで異なります。パブリックとプライベートは生涯に影響しません。クラスレベルとは、クラスが存続する限り、変数の存続期間を意味します。モジュールレベルとは、プロジェクトがリセットされない限り、変数の存続期間を意味します。 「生命」と「何かを含む」はsynonimsではないことに注意してください。変数は 'Nothing'を含み生きることができます。 – GSerg

3

VBAは、reference countingによって実装されたガベージコレクタを使用します。

特定のオブジェクトへの複数の参照がある場合があります(たとえば、Dim aw = ActiveWorkbookはアクティブブックへの新しい参照を作成します)。ガベージコレクタは、他の参照がないことが明らかな場合にのみオブジェクトをクリーンアップします。 Nothingに設定すると、参照カウントを減らす明示的な方法です。スコープを終了すると、カウントは暗黙的に減少します。

厳密Nothingに設定する近代的なExcelのバージョン(2010+)で、話すことは必要ではないが、エクセルの古いバージョン(そのための回避策が明示的に設定した)

関連する問題