2016-06-27 1 views
0

나는 약간의 레거시 코드를 연구 중이었고 새로운 것이고 재미있는 것을 보게되었습니다.VBA의 가변 동작입니다. 동일한 변수가 이중 값을 유지합니다. 방법?

VBA proc에는 변수가 선언되고 할당되어 있습니다. 같은 변수가 For 루프의 반복 변수로 사용됩니다. 루프가 잘 작동하고 올바른 결과를 생성합니다. 어떻게 변수는 동시에 두 값을 유지합니다.) 코드에 의해 지정된 값, b.) For 루프에 할당 된 값 내가 이해하려고하는 것은 방법은 무엇입니까? VBA의 덜 알려진/숨겨진 기능 중 하나입니까? 아니면 매우 기본적인 개념을 과소 평가하고 놓치고 있습니까? 샘플 코드 및 주석을 참조하십시오.

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

@ Parfait, good one :). 나는 이것이 최선의 방법이 아니라는 것을 알고있다. 그리고 당신의 제안이 있습니다. 나는이 문제에 대한 논리적 인 설명이 있는지 또는 그 결함이 있는지 알아보기 위해이 질문을했다. 감사합니다. – cyboashu

답변

2

변수에 한 번에 2 개의 값이 저장되지 않습니다.

루프가 입력되면 종료 조건이 설정됩니다. 당신이 루프를 입력 할 때

그래서, lTestlTest 다음, lTest가 루프를 시작하는 0으로 설정 9. 동일 할 때까지 루프가 계속 의미 (10)과 같다.

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은 Long의 기본값입니다. 따라서 처음으로 루프를 입력 할 때 lTest는 0으로 루프되기 때문에 최종 값은 -1로 설정됩니다. 루프를 0으로 시작하기 때문에가 아니라 루프를 시작하십시오. -3 대신 0이되고 -1의 끝 값까지 실행됩니다.

+0

. 내가 for 루프에 대해 많이 알지 못했다. :) – cyboashu

2

For 문에서는 두 가지 일이 발생합니다. 종료 조건이 설정되고 (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