سؤال

لدي اثنين من الزملاء الذين ينظرون إلى بعض الكود السيئ في Excel VBA، أتساءل هل هناك حد لعدد المستويات في مكدس المكالمات

هل كانت مفيدة؟

المحلول

ما لم تتمكن الوظيفة من الذيل العريض ويمكن أن تتعامل VBA التعامل مع ذلك (الذي لا يستطيع)، فسوف تعمل في تجاوز سعة مكدس.

كاختبار بسيط اخترقتهما معا المقتطف التالي:

Dim count As Integer

Sub Rec()
    count = count + 1
    Cells(1, 1) = count
    Call Rec
End Sub

الذي يخبرنا أن الحد من هذا هو 4007 تكرار، على الأقل في الإصدار الخاص بي من Excel 2007 هنا.

نصائح أخرى

الجواب القصير هو نعم، في النهاية ستحصل على استثناء تجاوز سعة مكدس.

لست متأكدا ما هو الحد على الرغم من.

أنا فقط ركضت هذه الماكرو في Excel 2003، وحصلت على 4775 مكالمات عميقة قبل أن أحصل على خطأ 28، "خارج مساحة المكدس":

Sub Macro1()
    recurse (0)
End Sub

Sub recurse(level As Long)
   ActiveCell.FormulaR1C1 = Str$(level)
   Call recurse(level + 1)
End Sub

سؤال قديم أعرفه، لكنني اعتقدت أنه قد يكون من المفيد أن يكون هناك معلومات محدثة حول هذا السؤال كما كنت أبحث عنه اليوم.

يبدو أن الحد الأقصى الصعب هو 6801 مكالمات عميقة لإجراء أقل معلمة في Excel 2016. كما يقول VBA_INTRATETER، يقلل هذا الرقم مع عدد المعلمات إلى الإجراء التكريبي.

ركضت الاختبارات التالية في Excel 2016:

Sub Recuresestatic (بدون معلمات) تفيض بعد 6801 إلغاء.
Sub Recurse1 (مع 1 معلمة) تفيض بعد 6442 إلغاء القيادة.
Sub Recurse2 (مع 2 معلمات) تفيض بعد 6120.

Option Explicit

Sub RecurseStatic()
    Static i As Long
    Debug.Print i
    i = i + 1
    RecurseStatic
End Sub

Sub RunRecurse1()
    Recurse1 0
End Sub

Sub Recurse1(i As Long)
    Debug.Print i
    Recurse1 i + 1
End Sub

Sub RunRecurse2()
    Recurse2 0, 0
End Sub

Sub Recurse2(i As Long, j As Long)
    Debug.Print i, j
    Recurse2 i + 1, j + 1
End Sub

ركضت رمز أندرز في Excel 2013 وكانت النتيجة فقط 1180. لست متأكدا مما إذا كان قد قلل من الحد الأقصى العريض في الإصدارات الأحدث من Excel أو إذا كانت المشكلة تعتمد على الجهاز أو Whatnot.

تحرير: أيضا، تغيرت: activecell.formular1c1c1 = str $ (المستوى) إلى النطاق ("A1"). Formular1c1 = Str $ (المستوى)

وانخفض عدد المكالمات إلى 807. كما أنني قد أضافت صريح الخيار.

مكدس استهلاك الذاكرة.

كما أفهم المكدس إذا استخدمت لتخزين المعلمات للإجراءات، والمتغيرات المحلية في الإجراءات.

لذلك سوف يكون استهلاك مساحة المكدس، يتناسب مع عدد المكالمات العودية.

لذلك الحجم اللازم للمكدسة هو شيء مثل: عدد المكالمات العودية * (حجم معلمات الاتصال + مساحة للمتغيرات المحلية)

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