ভিবিএ - লুপ পুনরাবৃত্তির জন্য কীভাবে শর্তসাপেক্ষে একটি এড়ানো যায়


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কোনও ভিবিএ কীওয়ার্ড নয়।
mwolfe02

@ এমওয়লফি02 - নিশ্চিত নয়, তবে কোথাও উদাহরণে দেখেছেন (সিপিয়ারসন?)
রিচার্ড এইচ

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

কেবল অসংখ্য নেস্টেড আইএফ-এর সাথে কিছুটা অগোছালো হয়ে উঠতে পারে ... উদাহরণস্বরূপ যদি আপনাকে বেশ কয়েকটি অ্যাপ্লিকেশন চেক করতে হয় তবে ফলাফলগুলি ব্যবহারের আগে কোনও মিল খুঁজে না পাওয়ার জন্য প্রতিটি পুনরাবৃত্তির মধ্যে ফলাফল মিলান। তবে তাই হোক, জীবনে আরও খারাপ জিনিস রয়েছে!
জিওপার্দিপেম্পেস্ট

182

ভিবিএর 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

এটি যদি আপনার কোডগুলির সত্যই হয় তবে @ ব্রায়ান একেবারে সঠিক। Elseআপনার Ifবিবৃতিতে কেবল একটি ধারা স্থাপন করুন এবং এটি দিয়ে সম্পন্ন করুন।


18
ধন্যবাদ, এটি গো টো (ভিবিএ - 1964-এ আপনাকে ফেরত দিচ্ছে) এর একটি ভাল টিপস
রিচার্ড এইচ

3
@George: এতে যান নির্যাতিত যাবে (যা আমি কেন আমার বক্তব্যের যোগ্যতা কিন্তু দেখ সুবিচারপূর্ণ ), কিন্তু এটা মজ্জাগতভাবে মন্দ নয়। গুরুতরভাবে যদিও, গোটো বিবৃতি ব্যতীত শক্ত ভিবিএ লেখা অসম্ভব কারণ কেবল ত্রুটি পরিচালনার জন্য আপনার প্রয়োজন (যেমন, On Error Goto)।
mwolfe02

3
@ জর্জি: আমি এখানে যা প্রস্তাব দিচ্ছি তা ভাষার অন্য সীমাবদ্ধতার জন্য কার্যকর (কোনও Continueবিবৃতি নেই)। যে কেউ তর্ক করতে পারে যে Continueঅন্যান্য ভাষাগুলির ব্যবহার এড়ানো উচিত এবং তাই এখানেও এড়ানো উচিত। কিছু উপায়ে, আপনার পোস্ট করা লিঙ্কটি আমার বক্তব্য তৈরি করে। লিঙ্কটি GoToভিবি.নেটে বিবৃতিটির। ভিবি.নেটের কাঠামোগত ত্রুটি পরিচালনা ও Continue For/ Continue Doবিবৃতি উভয়ই রয়েছে । GoToভিবি.নেটে সত্যই দরকার নেই ; আমার সন্দেহ হয় বিদ্যমান ভিবিএ / ভিবি 6 কোডের সহজ রূপান্তরকে সমর্থন করার জন্য এটি বেশিরভাগ জায়গায় রেখে দেওয়া হয়েছিল।
mwolfe02

4
@ জর্জে GoToবাসা বাঁধার হ্রাস করার সুবিধা রয়েছে। ইনডেন্টেশনের স্তরটি যুক্ত না করে একটি লুপ পুনরাবৃত্তি বাদ দেওয়া, আইএমও, GoToভিবিএ / ভিবি 6 এর কয়েকটি বৈধ ব্যবহারগুলির মধ্যে একটি। বিশেষত যদি আপনি লুপের শরীরটি নিজস্ব পদ্ধতিতে বের করেন
ম্যাথিউ গাইন্ডন

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
আকর্ষণীয় .. গোটো ব্যবহারের চেয়ে ভাল!
ওজমিকে

এটি দুর্দান্ত
কুবি

1
এটির উত্তরটি হওয়া উচিত
স্টিয়ান উলরিকসেন

খুব মার্জিত এবং সুন্দর
অ্যালেক্সিস সানচেজ টেলো

5
চতুর! আমি কোনও মন্তব্য না করেই যে লোকটি জুড়ে আসে তাকে আমি ঘৃণা করব। lol
কলটার

14

Continue For ভিবিএ বা ভিবি 6-তে বৈধ নয়।

থেকে এই দুটিই 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 টিরও বেশি ভোট রয়েছে এবং তারা একই উত্তর!
rryanp

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.