أنواع أخطاء vba: التصحيح والحل
مثل أي لغة برمجة أخرى، VBA غير محظوظة عندما يتعلق الأمر بالأخطاء ويجب عليك التعامل معها مهما حدث. يمكن أن تأتي من مصادر مختلفة، مثل الترميز السيئ، أو العمليات المستحيلة (مثل القسمة على صفر)، أو الأخطاء غير المتوقعة.
أفضل طريقة للتعامل مع هذا الأمر هي أن يكون لديك فهم جيد لجميع النتائج المحتملة التي يمكنك تحقيقها باستخدام الكود. انظر إلى المثال أدناه حيث لدينا رمز VBA الذي يحسب الجذر التربيعي للرقم باستخدام القيمة الموجودة في الخلية المحددة.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
ولكن إذا كانت الخلية النشطة تحتوي على قيمة غير الرقم، فسوف تحصل على خطأ وقت التشغيل، كما هو موضح أدناه.
معلمات الخطأ في VBA (اصطياد الأخطاء)
في خيار VBA، يمكنك تكوين الإعداد للتعامل مع الأخطاء قبل البدء في كتابة الرموز. لفتح إعدادات VBA، انتقل إلى أدوات ← خيارات ← عام ← اكتشاف الأخطاء. هنا لديك ثلاثة خيارات يمكنك استخدامها.
- الإيقاف عند كافة الأخطاء : إذا قمت بتمكين هذا الخيار، فسيقوم VBA بإيقاف التعليمات البرمجية لجميع أنواع الأخطاء حتى إذا كنت قد استخدمت جميع أنواع تقنيات معالجة الأخطاء.
- وحدة العبث بالفئة : مع هذا الخيار، سيوقف VBA جميع الرموز الخاصة بك التي لا يمكن معالجتها بواسطة أي تقنية. وإذا كنت تستخدم كائنات مثل Userforms، فسيتم أيضًا اقتحام تلك الكائنات وتمييز السطر الدقيق الذي يوجد فيه الخطأ.
- فصل الأخطاء غير المعالجة : هذا هو الإعداد الافتراضي الذي يساعدك على معرفة كافة الأخطاء التي لا تستخدم لها أي تقنيات لمعالجة الأخطاء ويوقف التعليمات البرمجية لجميع الأخطاء التي لم تتم معالجتها. (ولكن، إذا كنت تستخدم كائنات مثل Userforms، فلن يؤدي ذلك إلى تمييز السطر الذي يسبب الخطأ في الكائن، ولكنه سيؤدي فقط إلى تمييز السطر الذي يشير إلى هذا الكائن).
أنواع أخطاء VBA
لفهم أخطاء VBA، يمكنك تقسيمها إلى أربع فئات، وفيما يلي شرح هذه الأنواع من الأخطاء.
1. أخطاء في بناء الجملة
أثناء كتابة كود VBA، عليك اتباع بناء جملة معين وعندما تتجاهله أو لا تكتبه كما ينبغي، قد تواجه خطأً في SYNTAX (المعروف أيضًا باسم خطأ اللغة). إنها مثل الأخطاء المطبعية التي تقوم بها أثناء كتابة الرموز الخاصة بك.
حسنًا، يساعدك VBA في الإبلاغ عن هذه الأخطاء عن طريق عرض رسالة خطأ. تحتاج فقط إلى التأكد من تمكين “Auto Syntax Check” في محرر VB الخاص بك.
انتقل إلى خيارات الأداة ➤ وتأكد من تحديد مربع “التحقق التلقائي من بناء الجملة”. وبهذا، كلما قمت بإجراء خطأ في SYNTAX، يعرض VBA رسالة خطأ.
ولكن إذا تم تعطيل “التحقق التلقائي من بناء الجملة”، فسيظل VBA يسلط الضوء على سطر التعليمات البرمجية الذي يحتوي على الخطأ ولكنه لا يعرض رسالة الخطأ.
2. أخطاء التجميع
يحدث هذا عندما تكتب تعليمات برمجية لتنفيذ نشاط ما، ولكن هذا النشاط غير صالح أو لا يمكن تنفيذه بواسطة VBA. أفضل مثال هو عندما يكون لديك بعض التعليمات البرمجية باستخدام عبارة IF لكنك فاتتك إضافة END IF في نهاية العبارة والآن عند تشغيل VBA هذا تظهر لك رسالة خطأ في الترجمة.
وبصرف النظر عن هذا، هناك أمثلة أخرى على أخطاء الترجمة:
- استخدام For بدون Next ( للتالي ).
- حدد بدون تحديد النهاية ( تحديد الحالة ).
- لا تعلن عن متغير عندما تقوم بتمكين ” الخيار الصريح “.
- استدعاء وظيفة فرعية/غير موجودة.
3. أخطاء وقت التشغيل
يحدث خطأ في وقت التشغيل عند تنفيذ التعليمات البرمجية. تذكر المثال الذي شاركته معك أعلاه عندما قام الكود بحساب الجذر التربيعي لرقم ما.
عند حدوث خطأ في وقت التشغيل أثناء تنفيذ التعليمات البرمجية، فإنه يوقف التعليمات البرمجية ويظهر لك مربع حوار الخطأ ويتحدث مربع الخطأ هذا عن طبيعة الخطأ الذي لديك. لنفترض أنك كتبت تعليمة برمجية تفتح مصنفًا من الموقع الذي حددته، ولكن تم الآن نقل هذا المصنف أو حذفه بواسطة شخص ما.
لذا، عند تشغيل التعليمات البرمجية، سيظهر لك VBA خطأ وقت التشغيل لأنه لا يمكنه العثور على هذا الملف في هذا الموقع. توضح الرسالة التي تتلقاها في خطأ وقت التشغيل السبب مما يساعدك على فهم سبب الخطأ.
وعندما يحدث خطأ في وقت التشغيل، فإنه يتوقف عن تنفيذ التعليمات البرمجية. إذا قمت بالنقر فوق الزر “تصحيح”، فسيظهر لك سطر التعليمات البرمجية الذي يحتوي على هذا الخطأ من خلال تمييزه باللون الأصفر. أو يمكنك النقر فوق الزر “إنهاء” لإيقاف تنفيذ التعليمات البرمجية وإغلاق رسالة الخطأ.
4. خطأ منطقي
هذا ليس خطأ ولكنه خطأ أثناء كتابة الكود. يمكن أن تسبب لك هذه الأنواع من الأخطاء أحيانًا مشكلة أثناء العثور عليها وإصلاحها.
لنفترض أنك تكتب بعض التعليمات البرمجية، وعند الإعلان عن متغير، فإنك تستخدم نوع بيانات خاطئًا أو أنك استخدمت خطوات حسابية خاطئة. في هذه الحالة سيعمل الكود الخاص بك بشكل جيد ولن تجد هذا الخطأ بسهولة. أفضل طريقة للتعامل مع هذا النوع من المشكلات هي تشغيل كل سطر من التعليمات البرمجية واحدًا تلو الآخر.
استخدام أدوات التصحيح في VBA
يوفر لك VBA مجموعة من الأدوات لتصحيح أخطاء التعليمات البرمجية الخاصة بك وإزالة الأخطاء من التعليمات البرمجية الخاصة بك.
1. ترجمة مشروع VBA
في محرر Visual Basic، هناك خيار يمكنك استخدامه على الفور بعد الانتهاء من التعليمات البرمجية الخاصة بك. تقوم خيارات التجميع هذه بتحليل كل سطر من التعليمات البرمجية الخاصة بك وتعرض مربع رسالة إذا كان هناك خطأ في التعليمات البرمجية الخاصة بك.
ملاحظة: يقوم خيار Compile VBA بتتبع أخطاء بناء الجملة والترجمة فقط، وليس أخطاء وقت التشغيل، لأن هذه الأخطاء تحدث فقط عند تشغيل التعليمات البرمجية. لاستخدام ترجمة مشروع VBA، انتقل إلى ➤ تصحيح ➤ ترجمة مشروع VBA.
بمجرد تشغيل “Compile VBA Project” وعدم وجود أي أخطاء في التعليمات البرمجية الخاصة بك، ستصبح الخيارات باللون الرمادي.
2. قم بتشغيل كل سطر من التعليمات البرمجية واحدًا تلو الآخر
هذه هي الطريقة التي أفعل ذلك. عندما أكمل رمزًا ما، أقوم ببساطة بتشغيله سطرًا تلو الآخر للتحقق مما إذا كان هناك خطأ. قد يستغرق هذا بعض الوقت، لكنه يساعدك على حل جميع الأخطاء (بناء الجملة والترجمة والتنفيذ).
يوجد على “شريط أدوات التصحيح” زر “الدخول” الذي يمكنك استخدامه لتشغيل التعليمات البرمجية سطرًا تلو الآخر أو يمكنك ببساطة الضغط على F8 لتشغيل سطر واحد ثم الضغط عليه مرة أخرى لتشغيل السطر التالي في التعليمات البرمجية.
استخدام عبارة “On ERROR” لمعالجة أخطاء VBA
من المهم التحقق من الرموز الخاصة بك والعثور على الأخطاء المحتملة في جميع طرق تصحيح الأخطاء المتوفرة لديك. لكن الطريقة الأفضل والأكثر فعالية هي إنشاء تعليمات لمعالجة الأخطاء يمكنها التعامل مع الخطأ وجعل التعليمات البرمجية الخاصة بك خالية من العيوب عند تنفيذها. دعونا نستكشف هذه التصريحات. عند حدوث خطأ في تعليمات VBA البرمجية، فإن أفضل الطرق لمعالجة هذا الخطأ هي:
- اسمح لـ VBA بتجاهل الخطأ وتشغيل التعليمات البرمجية
- السماح بتنفيذ مجموعة خاصة من التعليمات عند حدوث خطأ.
في كلا الحلين، يمكنك استخدام عبارات “On Error”. فيما يلي أربع عبارات “عند الخطأ” يمكنك استخدامها. والآن دعونا نلقي نظرة على كل عبارة واحدة تلو الأخرى.
1. إذا قمت بخطأ ما، ابدأ من جديد
يسمح هذا السطر البسيط من التعليمات البرمجية لـ VBA بمواصلة تنفيذ التعليمات البرمجية على الرغم من حدوث خطأ. الفكرة بسيطة: انتقل إلى السطر التالي من التعليمات البرمجية إذا تم اكتشاف خطأ في أي مكان أثناء التنفيذ.
في الكود أدناه، لديك سطرين من الكود:
- يشير السطر الأول إلى أن القيمة الموجودة في الخلية A1 هي 25 مقسومة على 0
- والسطر الثاني يقول أن قيمة الخلية A2 هي 10 مقسومة على 5
الآن هناك مشكلة في الكود الموجود لديك على الإنترنت. كما تعلم، إذا قسمت أي شيء على 0، فستكون النتيجة خطأ. لذا، عند تشغيل هذا الرمز، يعرض VBA رسالة خطأ “خطأ وقت التشغيل ’11’ القسمة على صفر” ويوقف التنفيذ.
ولكن عند إضافة “On Error Resume Next” في بداية التعليمات البرمجية وتشغيل التعليمات البرمجية، يتجاهل VBA ببساطة سطر التعليمات البرمجية الذي يحدث فيه الخطأ ويستمر مع السطر الثاني ويضيف تلك القيمة في الخلية A2.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
لذلك، عندما تريد تشغيل التعليمات البرمجية الخاصة بك على الرغم من حدوث خطأ في أي مكان، ما عليك سوى استخدام عبارة “On Error Resume Next” في التعليمات البرمجية الخاصة بك.
ولكن هناك شيء آخر يجب عليك ملاحظته: فهو سيتجاهل فقط الأخطاء التي تحدث بعد ذلك.
لنفترض أنه حدث خطأ في السطر 5 وقمت بإضافة “On Error Resume Next” في السطر 8، فلن يتم تخطي هذا الخطأ. لذا، فإن أفضل طريقة هي إضافته كسطر أول من التعليمات البرمجية في الإجراء.
2. في حالة وجود خطأ GoTo 0
هذا هو السلوك الافتراضي لـ VBA والذي عند حدوث خطأ، فإنه يتوقف عن تنفيذ التعليمات البرمجية.
حسنًا، استخدام “On Error GoTo 0″ لا يحدث فرقًا في الكود الخاص بك. سيقوم VBA ببساطة بإيقاف التعليمات البرمجية وعرض رسالة تحتوي على وصف للخطأ. فلماذا يجب أن أزعج استخدامه؟ سؤال ذكي. دعنا نستخدم المثال الذي استخدمته أعلاه في ” عند خطأ السيرة الذاتية التالي “.
في هذا الرمز، كلما حدث خطأ، يأخذ VBA السطر التالي من التعليمات البرمجية وينفذه ولن ترى أي رسالة خطأ. ولكن لنفترض أن لديك المزيد من الأسطر في الكود الخاص بك ولا تريد تجاوز هذه الأسطر إذا كان هناك خطأ في الكود.
لذا، إذا قمت بإدخال “On Error GoTo 0” بعد السطر الثاني من التعليمات البرمجية، فسوف يستعيد معالج الأخطاء الافتراضي لـ VBA والذي يعرض رسائل الخطأ كلما حدث خطأ.
3. في حالة حدوث خطأ في GoTo [التسمية]
فكر في مكان في مبنى يمكنك الذهاب إليه في حالات الطوارئ. وبالمثل، باستخدام “On Error GoTo [Label]”، يمكنك ببساطة إنشاء كتلة منفصلة من التعليمات البرمجية في التعليمات البرمجية الرئيسية الخاصة بك للتعامل مع الخطأ.
في الواقع، يعد “On Error GoTo [Label]” طريقة أفضل وأكثر ملاءمة للتعامل مع الأخطاء. في الكود أدناه لديك “On Error GoTo Oh!” خطأ” الآن في هذا السطر الإعلان، كلمة “أوه!” “خطأ” هو التسمية.
إذا نظرت إلى نهاية الكود حيث لديك بداية محددة باسم التصنيف ثم رمز لمربع رسالة به رسالة على الكود.
الآن ماذا يحدث إذا حدث خطأ، سينتقل VBA إلى التسمية “أوه! خطأ” وسيتم تنفيذ مجموعة التعليمات البرمجية التي لديك بعد هذا التصنيف.
ولكن هناك شيء واحد عليك الاهتمام به: إذا لم يحدث خطأ، فسيتم تنفيذ التسمية الموجودة في التعليمات البرمجية الخاصة بك. هناك شيئان عليك القيام بهما:
- أولاً، تأكد من إضافة علامة الخطأ في نهاية الرمز.
- ثانيًا، قم بإضافة “Exit Sub” قبل تسمية الخطأ.
وبهذا ستستفيد في كلتا الحالتين. لنفترض أنه في حالة حدوث خطأ وتبديل VBA إلى التسمية التي حددتها، فلن يكون هناك سوى تعليمات برمجية من التسمية نفسها إلى تعليمات برمجية. وإذا لم يحدث خطأ، فإن عبارة “Exit Sub” الموجودة لديك قبل التسمية ستخرج من الإجراء دون تنفيذ تسمية الخطأ.
4. في حالة حدوث خطأ GoTo -1
قبل أن ندخل في هذا، اسمحوا لي أن أشارككم شيئا. عند حدوث خطأ في التعليمات البرمجية، يقوم VBA بتخزين سجل الأخطاء هذا في ذاكرته ولا يقوم بمسحه إلا عند اكتمال الروتين.
يا فبا! العيش في الحاضر
لمعالجة الخطأ الثاني في تعليمات VBA البرمجية، يجب عليك مسح الخطأ الأول من ذاكرة VBA. في التعليمات البرمجية أدناه، لديك عبارات “On Error GoTo [Label]” التي تعالج الأخطاء من كتلتين مختلفتين من التعليمات البرمجية.
ولكن إذا قمت بتشغيل هذا الرمز، عندما يحدث الخطأ الثاني، لن ينتقل VBA إلى التسمية التي قمت بتعيينها وسيظهر بدلاً من ذلك رسالة الخطأ “عدم تطابق النوع”.
Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
لحل هذه المشكلة، يمكنك استخدام “On Error GoTo -1” الذي يسمح لـ VBA بإزالة الخطأ الحالي من وحدة التخزين الخاصة به.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
الآن عند تشغيل هذا الرمز، يقوم “On Error GoTo -1” بإزالة الخطأ من الذاكرة ويعالج VBA الخطأ في العبارة الثانية حسب الرغبة.
ما الذي أحتاج إلى معرفته أيضًا للتعامل مع الأخطاء في VBA؟
إلى جانب استخدام تقنيات معالجة الأخطاء، هناك بعض الأشياء الأخرى التي يمكنك استخدامها للتعامل بشكل أفضل مع الأخطاء.
خطأ في الكائن
عند حدوث خطأ أثناء تنفيذ التعليمات البرمجية، يمكنك استخدام كائن Err للحصول على تفاصيل حول الخطأ. هناك بعض الخصائص والأساليب التي يمكنك استخدامها مع كائن Err. دعونا نتعلمهم واحدا تلو الآخر.
ملكيات
فيما يلي الخصائص التي يمكنك استخدامها مع كائن Err:
- Err.Number : عند حدوث خطأ، يتم تخزين رقم في كائن Err. في التعليمات البرمجية أدناه، عند حدوث ذلك، يعرض مربع الرسالة رقم الخطأ.
- Err.Description : تعرض هذه الخاصية وصف الخطأ الذي يمكن أن يساعدك في فهم سبب الخطأ.
- Err.Source: تخبرك هذه الخاصية بالمشروع الذي حدث فيه الخطأ.
- Err.HelpContext: تقوم هذه الخاصية بإرجاع معرف سياق التعليمات للخطأ الموجود في ملف التعليمات.
- Err.HelpContext: هذه قيمة سلسلة لموقع ملف التعليمات.
عادةً، عند التعامل مع الأخطاء باستخدام تقنيات معالجة الأخطاء، فإنك لا تستخدم كائن Err كثيرًا في أكوادك البرمجية. ولكن أدناه مثال بسيط لاستخدامه.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1: MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description End Sub
عند تشغيل الكود أعلاه، وفي حالة حدوث خطأ، سيعرض مربع رسالة يحتوي على رقم الخطأ ووصف الخطأ.
طُرق
باستخدام Err Object، يمكنك أيضًا استخدام طريقتين.
- Err.Clear: تقوم هذه الطريقة بمسح رقم الخطأ ووصف الخطأ من ذاكرة VBA (وهذا يختلف عن “On Error GoTo -1” لأنه لا يعيد تعيين الخطأ بالكامل).
- Err.Raise: باستخدام هذه الطريقة، يمكنك إنشاء خطأ وقت التشغيل عمدًا في التعليمات البرمجية الخاصة بك، وإليك الصيغة التي يجب اتباعها:
خطأ.ارفع [الرقم]، [المصدر]، [الوصف]، [ملف المساعدة]، [سياق المساعدة]
نصائح سريعة حول معالجة الأخطاء
فيما يلي بعض النصائح السريعة التي يمكنك استخدامها للتعامل بشكل أفضل مع أخطاء VBA.
- استخدم “On Error Resume Next” فقط عندما تكون متأكدًا من حدوث خطأ ومن المقبول تخطي سطر التعليمات البرمجية الذي يحتوي على خطأ ومن الآمن الانتقال إلى السطر التالي.
- أفضل طريقة للتعامل مع أخطاء وقت التشغيل هي استخدام “Error Handler” مع “On Error GoTo [Label]”. وهذا يضمن أنه كلما حدث خطأ، سيتم إعلامك، لكنه لن يعرض رسالة الخطأ السيئة هذه.
- في كل مرة تستخدم فيها معالج الأخطاء، تأكد من استخدام “Exit Sub” أولاً.
الدروس ذات الصلة
- خطأ تجاوز سعة VBA (الخطأ 6)
- خطأ وقت تشغيل VBA (الخطأ 1004)
- خطأ في تنفيذ فهرس VBA خارج النطاق (الخطأ 9)
- خطأ في عدم توافق نوع VBA (الخطأ 13)
- خطأ نفاد الذاكرة في VBA (الخطأ 7)