2011-12-30 86 views
72

Tôi có vòng lặp for trên một mảng. kiểm tra những gì tôi muốn làm là cho một điều kiện nhất định trong vòng lặp và bỏ qua đến phiên bản kế tiếp nếu đúng:VBA - cách bỏ qua vòng lặp for có điều kiện

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 

Tôi biết tôi có thể làm:

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

nhưng tôi muốn để có thể ghi lại giá trị cuối cùng của i trong biến PrevCouponIndex.

Bất kỳ ý tưởng nào?

Cảm ơn

+1

Bạn nói: "Tôi biết tôi có thể làm:' Nếu (Schedule (i, 1) mwolfe02

+0

@ mwolfe02 - không chắc chắn, nhưng thấy trong ví dụ ở đâu đó (cpearson?) –

+0

có thể là một ví dụ VB.NET –

Trả lời

26

Bạn không thể làm điều gì đó đơn giản như thế này?

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

Thật vậy, là chính xác những gì tôi đã làm :) Nhưng nó vẫn lỗi tôi tôi phải quấn công cụ trong Khác cái. Cảm ơn –

+3

+1 @RichardH, bạn phải sử dụng một 'IF' cho bài kiểm tra vì vậy đây không phải là viết mã đắt tiền. Tuy nhiên, bạn nên đảm bảo rằng kết quả phổ biến nhất là 'Schedule (i, 1)' nhỏ hơn 'ReferenceDate' để tránh thực hiện' Else'more thường xuyên hơn mức cần thiết. Nếu không thì dùng '(ReferenceDate> = Schedule (i, 1))'. (Nếu bài kiểm tra là 50/50 thì không cần tối ưu hóa) – brettdj

140

VBA không có Continue hoặc bất kỳ từ khóa tương đương nào khác để chuyển ngay đến vòng lặp tiếp theo. Tôi sẽ đề nghị việc sử dụng đúng đắn của Goto như một cách giải quyết, đặc biệt nếu đây chỉ là một ví dụ contrived và mã thực sự của bạn là phức tạp hơn:

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 

Nếu đó thực sự là tất cả các mã của bạn, tuy nhiên, @ Brian là hoàn toàn chính xác. Chỉ cần đặt một mệnh đề Else trong tuyên bố If của bạn và được thực hiện với nó.

+15

Cảm ơn, đó là một mẹo tốt để trở lại GoTo (VBA - chiếu bạn trở lại năm 1964) –

+1

GoTo là EVIL! Không sử dụng GoTo hoặc mã của bạn đi vào địa ngục! Nghiêm túc, xin vui lòng không sử dụng GoTo trong mã của bạn. – George

+1

@George: GoTo có thể bị lạm dụng (đó là lý do tại sao tôi đủ điều kiện tuyên bố của tôi; xem [judicious] (http://dictionary.reference.com/browse/judicious)), nhưng nó không phải là ác. Nghiêm túc, mặc dù, không thể ** viết VBA mạnh mẽ mà không có câu lệnh Goto đơn giản chỉ vì bạn cần nó để xử lý lỗi (tức là, 'Trên Lỗi Goto'). – mwolfe02

11

Continue For không hợp lệ trong VBA hoặc VB6.

Từ this MSDN page có vẻ như đã được đưa vào VB.Net trong VS 2005./Net 2.

Như những người khác đã nói ở đó không thực sự là một lựa chọn nào khác ngoài việc sử dụng Goto hoặc một Else.

2

Hi Tôi cũng phải đối mặt với vấn đề này và tôi giải quyết việc này sử dụng dưới mã ví dụ

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

Không chắc tại sao điều này lại bị bỏ phiếu và câu trả lời tiếp theo có hơn 100 phiếu bầu, và họ cũng là câu trả lời tương tự! – rryanp

+0

Có lẽ vì câu trả lời này được viết 5 năm sau câu trả lời đó, và là khái niệm chính xác. Tại sao điều này nên nhận được upvotes? –

-2

Có thể thử đặt nó tất cả vào cuối nếu và sử dụng một khác để bỏ qua đoạn mã này sẽ làm cho nó để bạn không thể sử dụng 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

Bạn có thể sử dụng một loại continue bằng cách sử dụng một lồng nhau 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 
Các vấn đề liên quan