VBA-for 루프 반복을 조건부로 건너 뛰는 방법


101

배열에 대한 for 루프가 있습니다. 내가 원하는 것은 루프의 특정 조건을 테스트하고 true 인 경우 다음 반복으로 건너 뛰는 것입니다.

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
    If (Schedule(i, 1) < ReferenceDate) Then
        PrevCouponIndex = i
        Continue   '*** THIS LINE DOESN'T COMPILE, nor does "Next"
    End If
    DF = Application.Run("SomeFunction"....)
    PV = PV + (DF * Coupon / CouponFrequency)
Next

나는 내가 할 수 있다는 것을 안다.

 If (Schedule(i, 1) < ReferenceDate) Then Continue For

하지만 PrevCouponIndex 변수에 i의 마지막 값을 기록하고 싶습니다.

어떤 아이디어?

감사


3
당신은 말했다 : "나는 내가 할 수있는 알고 : If (Schedule(i, 1) < ReferenceDate) Then Continue For"당신은 그것에 대해 확실 해요? ContinueVBA 키워드가 아닙니다.
mwolfe02 2011

@ mwolfe02-확실하지 않지만 어딘가에서 예를 보았습니다 (cpearson?)
Richard H

VB.NET 예제 일 수 있습니다
익명 유형

답변:


31

이렇게 간단한 걸하면 안 돼요?

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
  If (Schedule(i, 1) < ReferenceDate) Then
     PrevCouponIndex = i
  Else
     DF = Application.Run("SomeFunction"....)
     PV = PV + (DF * Coupon / CouponFrequency)
  End If
Next

4
사실, 정확히 내가 한 일입니다. :) 그러나 여전히 나는 Else 조각에 물건을 포장해야합니다. 감사합니다
Richard H

4
+1 @RichardH IF는 테스트를 위해 를 사용해야 하므로 코드가 그렇게 비싸지 않습니다. 하지만 가장 일반적인 결과는 필요한 것보다 더 자주 실행하는 것을 피하는 Schedule(i, 1)것보다 적다 는 것을 확인해야 합니다. 그렇지 않으면 . (테스트가 50/50이면 최적화가 필요하지 않음)ReferenceDateElse(ReferenceDate>=Schedule(i, 1))
brettdj

예를 들어 결과를 사용하기 전에 일치하는 항목을 찾지 못하기 위해 각 반복 내에서 꽤 많은 Application.Match 결과를 확인해야하는 경우 여러 중첩 된 if로 약간 지저분해질 수 있습니다. 하지만 인생에는 더 나쁜 것이 있습니다!
JeopardyTempest

183

VBA에는 Continue다음 루프 반복으로 즉시 점프 할 수있는 다른 키워드 가 없습니다 . Goto특히 이것이 단지 인위적인 예제이고 실제 코드가 더 복잡한 경우 해결 방법으로 의 현명한 사용을 제안합니다 .

For i = LBound(Schedule, 1) To UBound(Schedule, 1)
    If (Schedule(i, 1) < ReferenceDate) Then
        PrevCouponIndex = i
        Goto NextIteration
    End If
    DF = Application.Run("SomeFunction"....)
    PV = PV + (DF * Coupon / CouponFrequency)
    '....'
    'a whole bunch of other code you are not showing us'
    '....'
    NextIteration:
Next

이것이 실제로 모든 코드라면 @Brian이 절대적으로 정확합니다. Else당신의 If진술에 절을 넣고 그것을 끝내십시오.


18
감사합니다. GoTo에 대한 좋은 정보입니다 (VBA-1964 년으로 다시 전송)
Richard H

3
@George는 (내 문을 자격을 갖춘 이유입니다; 참조 고토 악용 될 수있는 현명한 ), 그러나 그것은 본질적으로 악하지 않다. 진지하게도 Goto 문없이 강력한 VBA를 작성하는 것은 단순히 오류 처리 (예 :)에 필요하기 때문에 불가능 합니다 On Error Goto.
mwolfe02 2015

3
@George : 여기서 제가 권장하는 것은 언어의 또 다른 제한에 대한 해결 방법입니다 ( Continue문장 없음 ). Continue다른 언어로 의 사용을 피해야하므로 여기서도 피해야 한다고 주장 할 수 있습니다. 어떤면에서 당신이 게시 한 링크가 내 의미를 만든다. 링크는 GoToVB.Net 의 명령문입니다. VB.Net에는 구조화 된 오류 처리 및 Continue For/ Continue Do문 이 모두 있습니다. GoToVB.Net 에는 정말 필요가 없습니다 . 기존 VBA / VB6 코드의 더 쉬운 변환을 지원하기 위해 대체로 남겨진 것 같습니다.
mwolfe02

4
@George GoTo는 중첩을 줄이는 이점이 있습니다. 들여 쓰기 수준을 추가하지 않고 루프 반복을 건너 뛰는 것은 GoToVBA / VB6에서 몇 안되는 합법적 인 사용 중 하나 인 IMO 입니다. 특히 루프의 몸체를 자체 절차로 추출하는 경우 .
마티유 Guindon

4
내가 아프게하지 않는 중첩 본 적이 @George 코드를 하지만, 하나의 난파선 )
마티유 Guindon

35

continue중첩을 사용하여 일종의 사용할 수 있습니다 Do ... Loop While False.

'This sample will output 1 and 3 only

Dim i As Integer

For i = 1 To 3: Do

    If i = 2 Then Exit Do 'Exit Do is the Continue

    Debug.Print i

Loop While False: Next i

1
goto를 사용하는 것보다 더 흥미 롭습니다.
ozmike apr

이것은 굉장합니다
Kubie

1
이 대답해야한다
스티 Ulriksen

아주 우아하고 멋진
알렉시스 산체스 테요

5
영리한! 나는 코멘트없이 그것을 접하는 사람이되고 싶지 않다. lol
Caltor

14

Continue For VBA 또는 VB6에서는 유효하지 않습니다.

에서 이 MSDN 페이지 는 VS 2005./Net 2 VB.Net에 도입 된 것으로 보인다.

다른 사람이 사용하는 이외의 옵션 정말이 아니다 말했듯이 Goto나이 Else.


2

안녕하세요 저는 또한이 문제에 직면하고 있으며 아래 예제 코드를 사용하여 이것을 해결합니다.

For j = 1 To MyTemplte.Sheets.Count

       If MyTemplte.Sheets(j).Visible = 0 Then
           GoTo DoNothing        
       End If 


'process for this for loop
DoNothing:

Next j 

왜 이것이 반대표를 받았는지 그리고 다음 답변이 100 개 이상의 찬성표를 가지고 있는지 확실하지 않습니다.
rryanp

4
아마도이 답변은 그 답변 이후 5 년 후에 작성되었으며 똑같은 개념이기 때문일 것입니다. 왜 이것이 업 보트를 받아야합니까?
Tyler StandishMan

-2

코드를 건너 뛰기 위해 else를 사용하면 결국 모든 것을 끝낼 수 있습니다. 그러면 GoTo를 사용할 수 없게됩니다.

                        If 6 - ((Int_height(Int_Column - 1) - 1) + Int_direction(e, 1)) = 7 Or (Int_Column - 1) + Int_direction(e, 0) = -1 Or (Int_Column - 1) + Int_direction(e, 0) = 7 Then
                Else
                    If Grid((Int_Column - 1) + Int_direction(e, 0), 6 - ((Int_height(Int_Column - 1) - 1) + Int_direction(e, 1))) = "_" Then
                        Console.ReadLine()
                    End If
                End If
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.