« OnTimeでの設定を解除する | トップページ | メソッド、プロシージャ、関数の呼び出しと引数指定 »

2011年5月22日 (日)

静的変数/Staticステートメントについて

保持したい値はシートに入れちゃうので
今まで静的変数を使わなかったのですが、
ここいらで使えるところは使えるようになりたいですね。

まずは、静的変数とは?
というところからです。

静的変数とは、
プロシージャレベルで使用し
プログラムが実行されている間だけ値が保持される変数。
モジュールがリセットされるか再実行されるまで、保持される。

と、このようにVBAヘルプの説明にあります。

静的変数を宣言するにはStaticステートメントを使います。
例えば次のようにする。

Static a As Integer
Static str As String
Static a(10) As Integer

最後の例のように配列も使えます。
文字だけでは実感として理解できないので試行します。

静的変数使用例のコード:

Sub macro110522a()
'静的変数使用例

    Static a As Integer
   
    a = a + 1
    Debug.Print a
   
End Sub

上のコードを一回実行すると a = 1
2回目を実行すると a = 2
3回目を実行すると a = 3

のように、
プロシージャが終了しても静的変数 a の値は保持されます。

ウォッチウィンドウに静的変数aをいれて見ていたのですが
プロシージャが実行されている間だけ値が表示されていました。

プロシージャレベルというところがミソですね。
静的変数を宣言したプロシージャ以外では使えないということです。

昨日の今日ですが、
静的変数を使用して
解除可能なOnTimeメソッドの使用方法を作ってみます。

前回は実行と解除を別の関数とプロシージャでしましたが、
今回はこれらを1つの関数でできるようにします。

解除可能なOnTimeメソッドの使用方法のコード:

Sub OnTimeFunc2(d As Date, Optional mName As String)
'キャンセル可能なOnTime使い方
'd = 実行したい日時
'mName = マクロ名
'直前1つを解除する場合、d = 0

    Static d2 As Date
    Static mName2 As String
   
    If d = 0 Then
        '解 除
        On Error Resume Next
            Application.OnTime d2, mName2, , False
        On Error GoTo 0
    Else
        'OnTime実行
         Application.OnTime d, mName
    End If
   
    d2 = d
    mName2 = mName
   
End Sub

Sub macro110522b()
'OnTimeFunc2使用例
'実行
    Debug.Print Now() & " macro110522b実行"
   
    '繰り返し実行 したい処理
    '…
   
    '次回実行を設定
    Call OnTimeFunc2(Now() + TimeValue("00:00:10"), "macro110522b")
   
End Sub

Sub macro110522c()
'OnTimeFunc2使用例
'解除
   
    Call OnTimeFunc2(0)
   
End Sub

静的変数は値が保持される代わりに、
最初に割り当てられたメモリが
プロシージャの終了後も開放されないので
必要以外は使わないほうがよいようです。

|

« OnTimeでの設定を解除する | トップページ | メソッド、プロシージャ、関数の呼び出しと引数指定 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 静的変数/Staticステートメントについて:

« OnTimeでの設定を解除する | トップページ | メソッド、プロシージャ、関数の呼び出しと引数指定 »