التقدم إلى العنصر التالي من داخل حلقة For-Next

StackOverflow https://stackoverflow.com//questions/23063002

  •  26-12-2019
  •  | 
  •  

سؤال

لدي حلقة For-Next.أقوم باختبار عدة معايير مختلفة داخل الحلقة، وإذا فشل أي اختبار، فأنا مستعد عند هذه النقطة لتخطي بقية الكود في الحلقة والتقدم إلى العنصر "التالي".الطريقة التي أتعامل بها حاليًا مع هذا الأمر هي عبارة GoTo التي تنقلني إلى السطر الموجود قبل "التالي" مباشرة.أفضّل عدم استخدام عبارة GoTo، هل هناك طريقة أخرى للتقدم إلى العنصر "التالي" من داخل حلقة For-Next؟تيا!

For x = 1 to 10
    Test 1
    If Test 1 fails then
        GoTo Line1
    End if

    Test 2
    If Test 2 fails then
        GoTo Line1
    End if
    .
    .
    .
    If all tests pass then
        add item to array
    End if
Line1:    
Next
هل كانت مفيدة؟

المحلول

إليك هناك حلة لعدم وجود كلمة رئيسية:

giveacodicetagpre.

نصائح أخرى

للأسف لا يوجد continue-مثل البيان في أ for حلقة في vba.(هيكل الرقابة ذات الصلة Exit For موجود ولكن هذا لا يساعد هنا).

ومن الجيد أن يكون لديك تحفظات على استخدام ملف GoTo:إنهم يجعلون من الصعب متابعة التعليمات البرمجية.

أفضل رهان لك هو وضع الكود في الحلقة في وظيفة منفصلة واستخدامه Exit Function ضمن تلك الوظيفة في النقاط المناسبة.يمكنك حتى بعد ذلك إرسال رموز الخطأ مرة أخرى إلى المتصل، مما يساعد على توسيع نطاق الرمز.

يمكنك استخدامها إذا سلم آخر:

giveacodicetagpre.

إلى جانب goto لا توجد طريقة مباشرة للقفز بين التعليمات البرمجية الخاصة بك، آمل أن يساعد هذا.

إذا لم يكن لديك الكثير من الاختبارات، هل يمكنك استخدام Not حالة وبناء متداخلة If إفادة.من المفترض أن يكون لهذا نفس تأثير ما تطلبه تقريبًا، نظرًا لأن أي اختبار فاشل سينهي ذلك If العبارة وانقل الكود إلى علامة X التالية في حلقتك دون تنفيذ الاختبارات التالية.

فيما يلي مثال لما أعنيه - حلقة اختبار ثنائية تقوم ببناء مصفوفة تحتوي على الأرقام من 5 إلى 10:

Sub TestConditionalPass()

    Dim intX As Integer
    Dim intArray() As Integer
        ReDim intArray(1)

    For intX = 1 To 10
        If Not intX -2 < 1 Then
            If Not intX * 2 < 10 Then
                ReDim Preserve intArray(UBound(intArray) + 1)
                    intArray(UBound(intArray)) = intX
            End If
        End If
    Next intX

End Sub

نظرا لأنك تقوم بتشكيل الإجراء فقط إذا نجحت جميع الاختبارات، فقم ببيان IF إذا. VBA لاماس كهربائى الاختبارات، (أي أنها ستقيم كل حالة اختبار، حتى لو عودة أول واحدة خاطئة.) أود أن أقترح لتغليف كل اختبار في وظيفة إرجاع منطقي منطقية للحفاظ على التعليمات البرمجية الخاصة بك.

giveacodicetagpre.

طريقة أخرى هي الاستفادة من متغير منطقي في التعليمات البرمجية الخاصة بك، مثل هذا

giveacodicetagpre.

إذا كانت الاختبارات باهظة الثمن، فيمكنك إضافة فحص Inner إذا تحقق بيان لمعرفة ما إذا كنا نحتاج إلى تقييم الاختبار التالي مثل هذا

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top