2011-07-17 28 views
4

私はサブで定義された静的変数を持っている:Excel VBAで静的変数をクリアするにはどうすればよいですか?

Private Sub assignVars() 
' Use this function to assign default values 

    Static isSet As Integer 

    If isSet <> 1 Then 
     ' do something 

     isSet = 1 
    End If 

End Sub 

私は自分のコードにいくつかの変更を行い、静的変数「ISSET」をリセットしたいしています。 Excelを終了してもう一度開く必要はありませんか?

答えて

3

最も簡単な方法は、Endステートメントをイミディエイトウィンドウで実行することです。

しかし、これは格納されているすべての状態、つまりすべてのモジュールレベル変数、すべてのプロシージャ内のすべての静的変数などを破棄します。 UnloadTerminateイベント発生しません、等:

http://msdn.microsoft.com/en-us/library/gg251671.aspx

だけで状態の損失を引き起こすことが

を(私は...私はあなたの質問を再読み込みした後、以下のものを編集しました) 1つのルーチンでは、isSetという宣言を手動でコメントアウトしてから復元することができます。 VBEの[ツール]メニューの[オプション]メニューの[一般]タブには、このような状態が発生したときに通知を受ける設定があります。 (Endの呼び出しについては警告しませんが、その場合は警告は必要ないはずだからです)。

あなたはこれを求めませんでしたが、あなたはこのような場しのぎ何かをする必要があります任意のコードを編集せずに1つの手順内の1つの静的変数、:私はあなたがすぐにからそれを呼び出すことができるようにPublicあなたのルーチンしなければならなかった

お知らせリセットする場合は、パラメータをTrueに設定してください。

それはあなたの手順の外部からアクセス可能であるあなたには、いくつかの状態が必要な場合なら、それを手動でリセットすることができるという目的のために、この場合には、あなたはモジュールレベル変数ではなくStaticを検討するかもしれませんプロシージャレベルのもの。その後、あなたのルーチンはPrivateのままでいます。リセットのためにインターフェイスの汚れはなく、手作業で必要なモジュールレベルの変数を混乱させることができます。

1

ええと....あなたが望むように変数をクリアするのはどうですか?デフォルト値はゼロです:

isSet = 0 

VBAエディタはまた、あなたが(「終了」)、マクロの実行を停止し、(「ファイル名を指定して実行」)、それを再起動することができます。

+0

問題は、既にルーチンを1回実行したためです。それから、私は変更を加えてルーチンを再度実行したいと思っていましたが、0にしたいときはisSet = 1で止まっていました。つまり、スプレッドシートを起動するたびにisSetを0にし、一度だけしかし、スプレッドシートをテストしているので、isSetをリセットする方法が必要でした。それは理にかなっていますか? – kmccoy

1

こんにちは誰も自分自身の "検索機能"を書いてみたいと思うかもしれませんが、カンマ区切りで1つのセルからいくつかの単語を集めて検索したいと思っていました組み込みの "InStr"関数を使用して文字列を返します。とにかく、私はこれをすべての言葉でやりたいと思っていたので、InStrを使うたびに集まった言葉を取り除かなければなりませんでした。これを行うために、文字列をEmptyに設定しました。

0

ここでは、ブレークポイントとイミディエイトウィンドウを使用するアプローチがあります。

  1. 次のルーチンを記述し、数回実行して静的変数Nをロードします。

    サブsub_with_static_var()

    Static N As Long:  N = N + 1 
    
    Debug.Print N 
    

    End Subの

  2. はサブでブレークポイントを設定し、それを再度実行し、ブレークポイントで停止。

  3. イミディエイトウィンドウにN = 0と入力し、「次の行を実行する」矢印をEnd Sub行にドラッグして実行して、完了します。

このサブを実行すると、1が出力されます(つまり、Nは0で、通常どおり増分されます)。

これは要件を満たし、コードの記述方法には影響しません。 (サブメソッドに引数がある場合は、このメソッドを適用するために、仮引数を使ってイミディエイトウィンドウから呼び出さなければならないかもしれません)。

関連する問題