خطأ عدم تطابق نوع وسيطة ByRef لـ VBA | أهم 3 أسباب وإصلاحات للأخطاء

عدم تطابق نوع وسيطة ByRef في Excel VBA

في هذه المقالة ، نشرح الخطأ الذي تمت مواجهته أثناء استخدام Excel VBA ByRef على أنه "خطأ عدم تطابق نوع الوسيطة". قبل ذلك اسمحوا لي أن أقدم لكم "By Ref" أولاً. المتغيرات هي مفتاح أي لغة برمجة ولا يختلف VBA أيضًا. لقد رأينا العديد من الطرق للإعلان عن المتغيرات ، ومن بين هذه الطرق للإعلان عن المتغيرات استخدام الكلمات "ByRef" و "ByVal".

ماذا يعني ByRef؟

"ByRef" تعني "بالمرجع" ، وباستخدام هذه الكلمة يمكننا في الواقع تمرير الوسيطات إلى الإجراءات (لكل من sub & function) عن طريق المرجع. هذا على عكس أخيه "باي فال" الذي ليس مرنًا ولكنه ثابت في طبيعته.

لفهم هذا ، دعنا نلقي نظرة على وحدتي الماكرو أدناه.

رمز:

 الماكرو الفرعي 1 () خافت A بطول A = 50 ماكرو 2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

لدينا إجراءان فرعيان هنا يدعى Macro1 و Macro2 على التوالي. لفهم هذا بشكل أفضل ، قم بتشغيل الماكرو سطراً بسطر بالضغط على المفتاح F8.

اضغط على مفتاح F8 لالتقاط قيمة المتغير "A" على أنها 50.

السطر التالي من التعليمات البرمجية يقول "ماكرو 2 أ" أي اسم الماكرو الثاني و "أ" هو المتغير المحدد من خلال كلمة "حسب المرجع".

كما ترون أعلاه في اللحظة التي ننفذ فيها سطر الكود "Macro2 A" ، فقد انتقل إلى إجراء VBA الفرعي التالي من الإجراء أعلاه.

الآن يمكننا أن نرى قيمة المتغير "A" هي 50 وذلك لأننا استخدمنا كلمة "ByRef" للإعلان عن المتغير "A" وهو نفس المتغير في Macro1 ، فقد حصل على القيمة التي قمنا بتعيينها لهذا المتغير " A "من Macro1 .

الآن في هذا الماكرو ( Macro2 المعادلة) يقول A = A * 10 أي A = 50 * 100. اضغط F8 مفتاح 3 مرات للعودة إلى الماكرو أعلاه ( Macro1 ).

الآن اضغط مرة أخرى على المفتاح F8 لرؤية قيمة المتغير "A" في مربع الرسالة في VBA.

تقول القيمة 500.

على الرغم من أن القيمة التي قمنا بتعيينها في هذا الماكرو (Macro1) هي 50 ، باستخدام كلمة ByRef ، قمنا بالفعل بتشغيل الإجراء الفرعي Macro2 عن طريق الاحتفاظ بقيمة المتغير "A" من Macro1 ثم تنفيذ قيمة A بضرب 10.

أهم 3 أسباب لعدم تطابق نوع وسيطة VBA Byref

أعلاه رأينا كيف يعمل "ByRef" ولكننا ملزمون بارتكاب بعض الأخطاء التي أدت دائمًا إلى إلقاء رسالة خطأ VBA باسم "عدم تطابق نوع وسيطة ByRef".

هذا بسبب العديد من الأسباب وفي هذا القسم سوف نوضح لك كيفية تصحيح هذا الخطأ وتصحيح الكود.

يمكنك تنزيل قالب Excel غير المتطابق لنوع وسيطة VBA ByRef من هنا - قالب Excel لـ VBA ByRef

سبب الخطأ # 1 - أسماء المتغيرات المختلفة

أحد الأسباب الرئيسية وراء الحصول على هذا الخطأ في Excel VBA يرجع إلى المتغيرات المختلفة التي تم تمريرها في إجراءين. للحصول على مثال ، انظر إلى الرموز أدناه.

رمز:

 الماكرو الفرعي 1 () خافت A بطول A = 50 ماكرو 2 B MsgBox A End Sub Sub Macro2 (ByRef A As Long) B = B * 10 End Sub 

في Macro1 ، استخدمنا المتغير "A" وفي Macro2 استخدمنا المتغير "B". الآن إذا حاولت تشغيل الكود ، فسنحصل على خطأ VBA باسم "عدم تطابق نوع وسيطة ByRef".

كما ترى أعلاه ، تم تمييز المتغير "B" لأن نوع اسم المتغير غير متطابق.

الحل: للتغلب على هذه المشكلة ، نحتاج إلى التأكد من أن أسماء المتغيرات في كلا الإجراءين دقيقة.

سبب الخطأ 2: أنواع بيانات متغيرة مختلفة

على الرغم من أن أسماء المتغيرات لا تزال متشابهة ، إلا أنها تسبب خطأ هذا بسبب نوع البيانات الذي نخصصه لها. انظر إلى الكود أدناه.

رمز:

 الماكرو الفرعي 1 () خافت A كعدد صحيح A = 50 ماكرو 2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

في الرموز أعلاه ، لقد أعلنت أن المتغير "A" كنوع بيانات صحيح في Macro1 وفي Macro2 تم تعيين نوع البيانات نفسه على أنه "طويل".

عندما نقوم بتشغيل هذا الكود ، فإنه سيتسبب في خطأ vba "عدم تطابق نوع وسيطة ByRef".

هذا لأننا قمنا بتعيين نوعين مختلفين من البيانات لنفس اسم المتغير.

الحل: يجب أن يكون نوع البيانات هو نفسه في كلا الإجراءين.

سبب الخطأ 3: أنواع البيانات المتغيرة مفقودة في ماكرو واحد

قد يحدث خطأ Excel VBA "عدم تطابق نوع وسيطة ByRef" بسبب نوع البيانات المعين في ماكرو واحد ولم يتم تعيينه في ماكرو آخر.

رمز:

 الماكرو الفرعي 1 () A = 50 ماكرو 2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

في الكود أعلاه لـ Macro1 ، لم أصرح عن أي متغير ، بل قمت ببساطة بتعيين القيمة للمتغير.

من ناحية أخرى ، بالنسبة لـ Macro2 ، فقد أعلنت أن المتغير "A" طويل. إذا حاولت تشغيل هذا الرمز ، فسوف يتسبب ذلك في خطأ VBA "عدم تطابق نوع وسيطة ByRef".

الحل 1: لتجنب هذه الأنواع من المواقف ، يكون الحل الأول هو التصريح عن المتغير في كلا الإجراءين وتعيين نفس نوع البيانات.

الحل 2: الحل البديل هو جعل إعلان المتغير إلزاميًا عن طريق إضافة كلمة "Option Explicit" في الجزء العلوي من الوحدة النمطية.

ما سيفعله هذا هو أنه قبل أن يظهر خطأ "عدم تطابق نوع وسيطة ByRef" لـ VBA ، فإنه يطلب منا بالفعل إعلان المتغير أولاً.

لذا ، فإن Option Explicit دائمًا ما يكون مفيدًا في VBA.

أشياء للذكرى

  • ByRef هو عكس By Val.
  • يحمل ByRef المرجع من إجراء إلى آخر.
  • يجب أن يكون اسم المتغير ونوع البيانات هو نفسه في كلا الإجراءين.
  • يجب التصريح عن كل متغير بشكل منفصل في حالة وجود متغيرات متعددة.