2011-12-30 19 views
72

मेरे पास एक सरणी पर लूप है। मुझे क्या करना चाहते हैं पाश में एक निश्चित हालत के लिए परीक्षण है और अगले चरण अगर सच तक छोड़ें:वीबीए - लूप पुनरावृत्ति के लिए सशर्त रूप से कैसे छोड़ें

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 का अंतिम मान रिकॉर्ड करें।

कोई विचार?

धन्यवाद

+1

आप कहा: "मैं पता मैं कर सकते हैं:' अगर (अनुसूची (i, 1) mwolfe02

+0

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

+0

एक वीबी.NET उदाहरण हो सकता है –

उत्तर

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

वास्तव में, मैंने जो किया है ठीक है :) लेकिन फिर भी यह मुझे खराब करता है मुझे अन्य में सामान लपेटना है टुकड़ा। धन्यवाद –

+3

+1 @ रिचर्ड एच आपको परीक्षण के लिए 'आईएफ' का उपयोग करना होगा, इसलिए यह महंगा नहीं है। हालांकि आपको यह सुनिश्चित करना चाहिए कि सबसे आम परिणाम यह है कि 'अनुसूची (i, 1) 'अनिवार्य रूप से' अन्यथा 'निष्पादित करने से बचने के लिए' संदर्भ दिनांक 'से कम है। अन्यथा '(संदर्भ दिनांक> = अनुसूची (i, 1)) का उपयोग करें। (यदि परीक्षण 50/50 है तो ऑप्टिमाइज़ेशन की कोई आवश्यकता नहीं है) – brettdj

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 

, हालांकि, @Brian बिल्कुल है सही बात। बस अपने If कथन में Else खंड डालें और इसके साथ किया जाए।

+15

धन्यवाद, यह गोटो (वीबीए - आपको 1 9 64 तक वापस ला रहा है) –

+1

गोटीओ EVIL है! GoTo का उपयोग न करें या आपका कोड नरक में जाता है! गंभीरता से हालांकि, कृपया अपने कोड में GoTo का उपयोग न करें। – George

+1

@ जॉर्ज: गोटो का दुरुपयोग किया जा सकता है (यही कारण है कि मैंने अपना बयान अर्हता प्राप्त की; देखें [न्यायसंगत] (http://dictionary.reference.com/browse/judicious)), लेकिन यह स्वाभाविक रूप से बुरा नहीं है। गंभीरता से हालांकि, यह ** असंभव ** गोटो स्टेटमेंट के बिना मजबूत वीबीए लिखना है क्योंकि आपको इसे त्रुटि प्रबंधन (यानी, 'त्रुटि गोटो' पर) की आवश्यकता है। – mwolfe02

11

Continue For वीबीए या वीबी 6 में मान्य नहीं है।

this MSDN page से यह लग रहा है वी.एस. 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 
+0

यह सुनिश्चित नहीं है कि यह क्यों कम किया गया था और अगले जवाब में 100 से अधिक वोट हैं, और वे एक ही जवाब हैं! – rryanp

+0

शायद क्योंकि यह उत्तर उस उत्तर के 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 
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 
संबंधित मुद्दे