2011-08-12 6 views
16

COMオブジェクトを保持するためのグローバル変数を宣言するブックがあります。Excel vbaのグローバル変数の有効期間はどのくらいですか?

Global obj As Object 

は、私はそうのようなのWorkbook_Openイベントでそれをinitalize:

Set obj = CreateObject("ComObject.ComObject"); 

は、私はそれが作成されています見ることができますし、その時に私はそれにいくつかのCOM呼び出しを行うことができます。私のシートで

私は次のようになり、細胞の束持っている:私は少しのためにこれらの作品を見ることができます

Function CallToComObject(...) 
    If obj Is Nothing Then 
     CallToComObject= 0 
    Else 
     Dim result As Double 
     result = obj.GetCalculatedValue(...) 
     CallToComObject= result 
    End If 
End Function 

機能を持っているモジュール内

=Module.CallToComObject(....) 

を、しかし後にいくつかのシートがリフレッシュされると、objオブジェクトはもはや初期化されません。つまり、Nothingに設定されます。

これを引き起こす可能性のあるものを誰かが説明してもらえますか?

+1

COMオブジェクトを呼び出す関数が複数あるのですか?関数内でスタティック変数にすることを1つだけ考えれば、関数は初期化されているかどうかをチェックし、そうでなければ初期化します。 –

+1

グローバル変数は悪いですか?また、適切なキーワードが「グローバル」ではなく「パブリック」であると私は信じている。 –

答えて

19

これらはいずれも、グローバル変数がリセットされます: "終了" を使用

  1. 未処理のランタイムエラー
  2. 編集コード
  3. VBプロジェクト

を含むワークブックを閉じますしかし、それは必ずしも完全なリストではありません...

+0

ここでは網羅的なリストを見つけることができます。私はいつもグローバル変数が何の働きをしていないのか疑問に思ってきました。特に、アプリイベントをキャッチする変数。 – Jon49

+0

@Tim、私はそれが原因で起こっている実行されていないランタイムエラーだと思っています。 – chollida

+0

@Jon:それらはすべて私が考えることができるものでした。 –

6

上記のTimの4に加えて、5番目のポイントを示唆します。コードをステップ実行し(デバッグ)、最後まで停止します。おそらくこれはポイント番号3を置き換える可能性があります。編集コードはグローバル変数の値を失わないようです。

+0

+1 - 私はまさに同じことを書こうとしていました! :-) –