2016-06-27 2 views
0

私はいくつかのレガシーコードに取り組んでいて、かなり新しくて面白い何かに出くわしました。VBAでの可変動作。二重の値を保持する同じ変数。どうやって?

VBA procには変数が宣言され、割り当てられています。同じ変数がForループ内の反復変数として使用されます。ループは正常に動作し、正しい結果が得られます。変数は同時に両方の値を保持します。)コードによって割り当てられた値。b)Forループで割り当てられた値わたしが理解しようとしていることは何ですか?それはVBAのあまり知られていない/隠された機能の1つですか、私は非常に基本的な概念を忘れすぎて欠落していますか? サンプルコードとコメントを参照してください。

Sub test() 

    Dim lTest  As Long 

    '/ Assignment here. 
    lTest = 10 

    '/ How this loop runs. When I assign lTest=0 in the `For` loop then 
    '/ shouldn't the loop exit at lTest -1 ? If I don't assign any value to lTest, then 
    '/ the loop behaves as expected and exits without any iteration. 
    For lTest = 0 To lTest - 1 
     Debug.Print lTest 
    Next 


End Sub 
+0

ループコマンドでは、指定されたものとは異なる名前のイテレータ変数を使用します。 – Parfait

+0

@パルフェット、いい方:)私はこれがベストプラクティスではないことを知っています。そしてあなたの提案はです。私は、この問題の背後に論理的な説明があるのか​​どうかを判断するためにこの質問をしました。ありがとう。 – cyboashu

答えて

2

変数には2つの値が同時に保持されていません。

ループに入ると、終了条件が設定されます。

あなたがループに入るときに、lTestlTestがTHEN 9に等しくなるまで、ループは継続する意味、10に等しく、lTestはループを開始するために0に設定されています。

これは2つの変数を使用すると分かりやすくなります。

Sub test() 

Dim testVar As Integer 
Dim loopCounter As Integer 

testVar = 10 
loopCounter = 0 

For loopCounter = 0 To testVar - 1 

testVar = 2 'or whatever you want 
Debug.Print loopCounter 
Debug.Print testVar 

Next loopCounter 

End Sub 

loopCounter 9. testVarになるまでこれは行くだろうが、あなたが好きに設定できますが、ループが入力されたらtestVarが終わるループパラメータに等しくなるまで、ループが移動します。

混乱を招くもう一つの事は、lTestを何も設定しないと、最初はループを開始するために0に設定されていると考えることです。実際に起こっているのは、lTestに値が与えられていないため、lTestが0に設定されているということです。 0がループのデフォルト値であるため、ループを最初に入力するときにlTestがデフォルトで0になるため、終了値は-1に設定されます。ループを0で開始するのではなく、 -3では0の代わりに-1の最終値まで実行されます

+0

ありがとうございます。わたしはforループについてよく知らなかった。 :) – cyboashu

2

Forステートメントでは2つのことが起こります。終了条件が設定され(lTest = 9)、カウンタ変数に初期値(lTest = 0)が割り当てられます。

lTest = 0 
Do 
    Debug.Print lTest 
Loop While lTest < 10 

ループ終了条件は一度だけに関係なく使用される変数の評価され、ループのみが入力された最初の時間に設定されている:これは、この機能的に同等です。このコードでは、次のことを示します。

Private Sub Example() 
    Dim test As Long, jumped As Boolean 

    test = 10 
    For test = 0 To test 
InLoop: 
     Debug.Print test 
     If test = 5 And Not jumped Then GoSub OutSideLoop 
    Next 

    Exit Sub 

OutSideLoop: 
    test = 0 
    jumped = True 
    GoTo InLoop 
End Sub 
+0

ありがとうございます。ニースと詳細な例。良い学習。 – cyboashu

関連する問題