2011-12-30 196 views
72

我有一個數組循環。我想要做的就是測試在循環一定條件並跳到下一個迭代,如果真:我知道我可以做VBA - 如何有條件地跳過for循環迭代

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變量中記錄我的最後一個值。

任何想法?

謝謝

+1

你說:「我知道我可以做的:'如果(附表(I,1) mwolfe02 2011-12-30 14:59:32

+0

@ mwolfe02 - 不知道,但在例子的地方看到了(cpearson?) – 2011-12-30 16:21:11

+0

可能是一個VB.NET的例子 – 2014-08-08 03:49:05

回答

26

難道你不能只是做一些簡單的事情嗎?

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 
+2

確實,正是我所做的:)但仍然錯誤我,我必須在東西包裝的東西片。謝謝 – 2011-12-30 16:22:12

+3

+1 @RichardH好吧,你必須使用一個'IF'來進行測試,所以這個代碼並不昂貴。您應該確保最常見的結果是'Schedule(i,1)'小於'ReferenceDate',以避免經常執行Else。否則使用'(ReferenceDate> = Schedule(i,1))'。 (如果測試是50/50,那麼不需要優化) – brettdj 2011-12-31 01:17:17

140

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 

如果這真的是所有的代碼,但是,@布賴恩是絕對正確。只需在您的If聲明中添加Else條款並完成它。

+15

謝謝,這是一個很好的提示轉到GoTo(VBA - 回到1964年) – 2011-12-30 16:23:21

+1

GoTo是EVIL!不要使用GoTo,否則你的代碼會變得很糟糕!儘管如此,請不要在代碼中使用GoTo。 – George 2015-02-24 18:08:41

+1

@George:GoTo可能會被濫用(這就是爲什麼我限定了我的陳述;請參閱[謹慎](http://dictionary.reference.com/browse/judicious)),但它本質上並非邪惡。但是,嚴重的是,僅僅因爲你需要它進行錯誤處理(即On Error Goto'),沒有Goto語句編寫健壯的VBA是不可能的。 – mwolfe02 2015-02-25 00:55:13

11

Continue For在VBA或VB6中無效。

this MSDN page它看起來像別人說有沒有真的比使用GotoElse以外的選項已被引入到VB.Net在VS 2005./Net 2

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 
+0

不知道爲什麼這是倒票,下一個答案有100多票,他們是相同的答案! – rryanp 2016-10-12 14:02:09

+0

可能因爲這個答案是在答案後5年寫的,而且是完全相同的概念。爲什麼要收到upvotes? – 2017-04-13 19:25:31

-2

也許嘗試把它所有的如果最終並使用其他跳過代碼解決,這將讓這個你不能使用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 
0

您可以通過使用嵌套Do ... Loop While False使用一種continue

'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