VBA - लूप पुनरावृत्ति के लिए सशर्त रूप से कैसे छोड़ें


101

मेरे पास एक सरणी पर लूप के लिए है। मैं जो करना चाहता हूं वह लूप में एक निश्चित स्थिति के लिए परीक्षण करना है और यदि सही है तो अगले पुनरावृत्ति पर जाएं:

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" क्या आप इसके बारे में निश्चित हैं? Continueएक VBA कीवर्ड नहीं है।
mwolfe02

@ mwolfe02 - निश्चित नहीं है, लेकिन उदाहरणों में कहीं देखा गया है (cpearson?)
रिचर्ड एच।

एक 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
वास्तव में, वास्तव में मैंने क्या किया है :) लेकिन फिर भी यह मुझे परेशान करता है कि मुझे एल्स पीस में सामान लपेटना है। धन्यवाद
रिचर्ड एच

4
+1 @ रीचर्ड अच्छी तरह से आपको IFपरीक्षण के लिए उपयोग करना होगा ताकि यह महंगा कोड न हो। यद्यपि आपको यह सुनिश्चित करना चाहिए कि सबसे आम परिणाम यह है कि आवश्यकता से अधिक बार निष्पादित करने से बचने के लिए Schedule(i, 1)कम है। अन्यथा उपयोग करें । (यदि परीक्षण 50/50 है तो अनुकूलन की आवश्यकता नहीं है)ReferenceDateElse(ReferenceDate>=Schedule(i, 1))
brettdj

बस कई नेस्टेड ifs के साथ थोड़ा गड़बड़ हो सकता है ... उदाहरण के लिए यदि आपको परिणामों का उपयोग करने से पहले एक मिलान नहीं ढूंढने के लिए प्रत्येक पुनरावृत्ति के भीतर काफी कुछ Application.Match परिणाम की जांच करने की आवश्यकता है। लेकिन ऐसा हो, जीवन में बदतर चीजें हैं!
जेटपाइटेम्पेस्ट

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 में वापस लाते हुए)
रिचर्ड एच

3
@ जॉर्ज: गोटो को गाली दी जा सकती है (यही वजह है कि मैंने अपने बयान को योग्य बनाया; विवेकपूर्ण देखें ), लेकिन यह बुराई नहीं है। गंभीरता से, हालांकि, गोटो बयान के बिना मजबूत VBA लिखना असंभव है, क्योंकि आपको त्रुटि से निपटने के लिए इसकी आवश्यकता है (यानी, On Error Goto)।
mwolfe02

3
@ जॉर्ज: मैं यहाँ जो सिफारिश कर रहा हूँ वह भाषा की एक और सीमा (कोई Continueकथन नहीं ) के लिए एक समाधान है । कोई यह तर्क दे सकता है कि Continueअन्य भाषाओं के उपयोग से बचा जाना चाहिए और इसलिए यहाँ से भी बचना चाहिए। कुछ मायनों में, आपके द्वारा पोस्ट किया गया लिंक मेरी बात बनाता है। लिंक GoToVB.Net में कथन के लिए है। VB.Net में संरचित त्रुटि हैंडलिंग और Continue For/ Continue Doकथन दोनों हैं । GoToVB.Net में वास्तव में कोई ज़रूरत नहीं है ; मुझे संदेह है कि यह मौजूदा VBA / VB6 कोड के आसान रूपांतरण का समर्थन करने के लिए बड़े पैमाने पर छोड़ा गया था।
mwolfe02

4
@George GoToमें नेस्टिंग को कम करने का लाभ है। इंडेंटेशन के स्तर को जोड़े बिना लूप पुनरावृत्ति को छोड़ना, IMO, GoToVBA / B6 के कुछ कानूनी उपयोगों में से एक है। खासकर यदि आप लूप के शरीर को अपनी प्रक्रिया में निकालते हैं
मैथ्यू गुइंडन

4
@ जॉर्ज मैंने ऐसा घोंसला देखा है जो कोड नहीं तोड़ता है , लेकिन किसी के मस्तिष्क को बर्बाद कर देता है ;)
मैथ्यू गुइंडन

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
गोटो का उपयोग करने से दिलचस्प ..
ओजमीक

यह बहुत बढ़िया है
Kubie

1
इसका उत्तर होना चाहिए
स्टियान उलरिक्सन

बहुत सुंदर और अच्छा
एलेक्सिस सैन्चेज़ टेल्लो

5
चतुर! मैं उस आदमी से नफरत करता हूं जो उस पर आता है, हालांकि कोई टिप्पणी नहीं है। lol
कैलटोर

14

Continue For VBA या VB6 में मान्य नहीं है।

से इस MSDN पेज यह वी.एस. 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 से अधिक वोट हैं, और वे एक ही जवाब हैं!
रतनप

4
शायद इसलिए कि यह उत्तर उस उत्तर के 5 साल बाद लिखा गया था, और ठीक यही अवधारणा है। इसे क्यों प्राप्त करना चाहिए?
टायलर स्टैंडिशमैन

-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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.