روتين فرعي لـ Excel VBA: كيفية استدعاء Sub في VBA مع مثال

⚡ ملخص ذكي

تُجمّع الإجراءات الفرعية في Excel VBA مجموعة من التعليمات البرمجية التي تُنفّذ مهمةً دون إرجاع قيمة. تتناول هذه الصفحة قواعد التسمية، وبنية الإجراءات الفرعية، واستدعاء إجراء فرعي من زر أمر، وكيف يختلف الإجراء الفرعي عن الدالة.

  • 📦 فريف: يقوم البرنامج الفرعي بتنفيذ مهمة محددة ولا يعيد أي قيمة إلى الكود الذي استدعاه.
  • ♻️ إعادة الاستخدام: يمكن استدعاء روتين فرعي واحد عدة مرات من أي مكان في المشروع.
  • 🔤 قواعد التسمية: الاسم لا يحتوي على مسافات، ويبدأ بحرف أو شرطة سفلية، ولا يكون كلمة مفتاحية في لغة VBA.
  • 🧾 بناء الجملة: Private Sub name(ByVal arg As String) يفتح الكتلة و End Sub يغلقها.
  • 🖱️ الدعوة: يستدعي حدث النقر على زر الأمر الروتين الفرعي ويمرر وسائطه.
  • ▶ ️ التشغيل المباشر: F5، أو مربع حوار وحدات الماكرو، أو الكلمة المفتاحية Call، كلها تقوم بتشغيل روتين فرعي بدون زر.
  • 🔁 الوظيفة الفرعية أو الوظيفة: اختر دالة عندما يجب إرجاع قيمة، وإلا فاختر إجراءً فرعيًا.

روتين فرعي لـ Excel VBA

ما هو الروتين الفرعي في VBA؟

A روتين فرعي في VBA عبارة عن جزء من التعليمات البرمجية ينفذ مهمة محددة موصوفة في التعليمات البرمجية ولكنه لا يُرجع نتيجة أو قيمة. تُستخدم الإجراءات الفرعية لتقسيم أجزاء كبيرة من التعليمات البرمجية إلى أجزاء صغيرة يمكن التحكم فيها. يمكن استدعاء الإجراءات الفرعية عدة مرات من أي مكان في البرنامج.

لنفترض أنك قمت بإنشاء واجهة مستخدم تحتوي على مربعات نصية لقبول بيانات إدخال المستخدم. يمكنك إنشاء برنامج فرعي يقوم بمسح محتويات مربعات النص. يعد البرنامج الفرعي لاستدعاء VBA مناسبًا في مثل هذا السيناريو لأنك لا تريد إرجاع أي نتائج.

لماذا استخدام الروتينات الفرعية

  • قم بتقسيم الكود إلى كود صغير يمكن التحكم فيه:يحتوي برنامج الكمبيوتر العادي على آلاف وآلاف من أسطر التعليمات البرمجية المصدرية. وهذا يزيد من التعقيد. وتساعد البرامج الفرعية في حل هذه المشكلة من خلال تقسيم البرنامج إلى أجزاء صغيرة قابلة للإدارة من التعليمات البرمجية.
  • Code إعادة الاستخداملنفترض أن لديك برنامجًا يحتاج إلى الوصول إلى قاعدة البيانات، فستحتاج جميع النوافذ تقريبًا في البرنامج إلى التفاعل مع قاعدة البيانات. وبدلاً من كتابة كود منفصل لهذه النوافذ، يمكنك إنشاء دالة تتعامل مع جميع تفاعلات قاعدة البيانات. ويمكنك بعد ذلك استدعاؤها من أي نافذة تريدها.
  • يتم توثيق الإجراءات الفرعية والوظائف ذاتيًا. لنفترض أن لديك دالة accountLoanInterest وأخرى تقول ConnectToDatabase. بمجرد النظر إلى اسم الروتين الفرعي/الوظيفة، سيكون المبرمج قادرًا على معرفة ما يفعله البرنامج.

قبل كتابة الاسم، يتوقع المترجم أن يتبع الاسم مجموعة قصيرة من القواعد.

قواعد تسمية الإجراءات الفرعية والوظائف

لاستخدام الإجراءات الفرعية والوظائف، هناك مجموعة من القواعد التي يجب على المرء اتباعها.

  • لا يمكن أن يحتوي اسم وظيفة استدعاء روتين فرعي أو VBA على مسافة
  • يجب أن يبدأ اسم Excel VBA Call Sub أو اسم الوظيفة بحرف أو شرطة سفلية. ولا يمكن أن يبدأ برقم أو حرف خاص
  • لا يمكن أن يكون اسم الروتين الفرعي أو الوظيفة كلمة أساسية. الكلمة الرئيسية هي كلمة لها معنى خاص في VBA. كلمات مثل Private وSub وFunction وEnd وما إلى ذلك كلها أمثلة على الكلمات الرئيسية. يستخدمها المترجم لمهام محددة.

بعد اختيار اسم صالح، يتبع الإعلان نفسه نمطًا ثابتًا.

بناء جملة الروتين الفرعي لـ VBA

سوف تحتاج إلى تمكين علامة التبويب "المطور" في Excel لمتابعة هذا المثال. إذا كنت لا تعرف كيفية تمكين علامة تبويب المطور، فاقرأ البرنامج التعليمي عناصر تحكم VBA في Excel

هنا في بناء الجملة،

Private Sub mySubRoutine(ByVal arg1 As String, ByVal arg2 As String)
    'do something
End Sub

شرح النحو

Code اكشن
  • ""mySubRoutine"" فرعي خاص (...)"
  • هنا يتم استخدام الكلمة الأساسية "Sub" للإعلان عن روتين فرعي يسمى "mySubRoutine" وبدء نص الروتين الفرعي.
  • يتم استخدام الكلمة الأساسية خاص لتحديد نطاق الروتين الفرعي
  • "ByVal arg1 كسلسلة، ByVal arg2 كسلسلة" :
  • يعلن عن معاملين لنوع بيانات السلسلة اسم arg1 و arg2
  • "النهاية الفرعية"
  • يتم استخدام "End Sub" لإنهاء نص الروتين الفرعي

يقبل البرنامج الفرعي التالي الاسم الأول والأخير ويعرضهما في مربع رسالة.

الآن سنقوم ببرمجة وتنفيذ هذا الإجراء الفرعي. دعونا نرى هذا.

كيفية استدعاء Sub في VBA

فيما يلي عملية خطوة بخطوة حول كيفية استدعاء Sub في VBA:

  1. تصميم واجهة المستخدم وتعيين خصائص عناصر تحكم المستخدم.
  2. إضافة الروتين الفرعي
  3. اكتب رمز حدث النقر لزر الأمر الذي يستدعي الروتين الفرعي
  4. اختبر التطبيق

الخطوة 1) واجهة المستخدم

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

كيفية استدعاء Sub في VBA

قم بتعيين الخصائص التالية. الخصائص التي نقوم بتعيينها:

S / N السيطرة الممتلكات بعد التخفيض
1 زر الأوامر1 الاسم btnDisplayFullName
2 شرح روتين فرعي الاسم الكامل

يجب أن تبدو واجهتك الآن كما يلي.

كيفية استدعاء Sub في VBA

الخطوة 2) إضافة روتين فرعي

  1. اضغط على Alt + F11 لفتح نافذة التعليمات البرمجية
  2. أضف البرنامج الفرعي التالي
Private Sub displayFullName(ByVal firstName As String, ByVal lastName As String)
    MsgBox firstName & " " & lastName
End Sub

هنا في الكود،

Code الإجراءات
  • "عرض فرعي خاصالاسم الكامل (...)"
  • يعلن عن برنامج فرعي خاص displayFullName يقبل معلمتين للسلسلة.
  • "الاسم الأول لـ ByVal كسلسلة، والاسم الأخير لـ ByVal كسلسلة"
  • يعلن عن متغيرين للمعلمات firstName وlastName
  • جي اسBox الاسم الاول الاسم الاخير"
  • فإنه يدعو الرسالةBox وظيفة مدمجة لعرض مربع رسالة. ثم تقوم بتمرير متغيري "firstName" و"lastName" كمعلمات.
  • يتم استخدام علامة العطف "&" لربط المتغيرين وإضافة مسافة فارغة بينهما.

الخطوة 3) استدعاء الروتين الفرعي

استدعاء الروتين الفرعي من زر الأمر انقر فوق الحدث.

  • انقر بزر الماوس الأيمن على زر الأمر كما هو موضح في الصورة أدناه. ثم حدد "عرض". Code.
  • سيتم فتح محرر التعليمات البرمجية

كيفية استدعاء Sub في VBA

أضف الكود التالي في محرر الكود لحدث النقر على زر الأمر btnDisplayFullName.

Private Sub btnDisplayFullName_Click()
    displayFullName "John", "Doe"
End Sub

يجب أن تبدو نافذة التعليمات البرمجية الخاصة بك الآن كما يلي

كيفية استدعاء Sub في VBA

احفظ التغييرات وأغلق نافذة التعليمات البرمجية.

الخطوة 4) اختبار الكود

على شريط أدوات المطور، قم بإيقاف وضع التصميم. كما هو مبين أدناه.

كيفية استدعاء Sub في VBA

الخطوة 5) انقر فوق زر الأمر "FullName Subroutine".

سوف تحصل على النتائج التالية

كيفية استدعاء Sub في VBA

قم بتنزيل ملف Excel أعلاه Code

يُعد الزر مريحًا، ولكنه ليس الطريقة الوحيدة لبدء روتين فرعي، ونادرًا ما يكون الأسرع أثناء التطوير.

كيفية تشغيل روتين فرعي بدون زر

أثناء كتابة التعليمات البرمجية، يُعدّ إضافة عنصر تحكم إلى ورقة العمل لمجرد اختبار إجراء فرعي مضيعة للوقت. يوفر VBA أربع طرق أخرى لتشغيل إجراء فرعي، وكل منها يناسب مرحلة مختلفة من دورة التطوير.

  • اضغط على F5 في المحرر: ضع المؤشر في أي مكان داخل الإجراء الفرعي واضغط على F5. سيتم تشغيله فورًا. يعمل هذا فقط عندما لا يأخذ الإجراء الفرعي أي وسائط، لأن VBA لا يحتوي على قيم لتزويدها.
  • اتبع الخطوات باستخدام F8: قم بتشغيل نفس الأمر، سطرًا سطرًا، لتتمكن من مراقبة تغير كل متغير في نافذة المتغيرات المحلية. استخدم هذه الطريقة عندما تكون النتيجة خاطئة وتحتاج إلى معرفة موضع الخطأ.
  • استخدم مربع حوار وحدات الماكرو: في علامة تبويب المطور، انقر فوق وحدات الماكرو، واختر الاسم، ثم انقر فوق تشغيل. تظهر في هذه القائمة فقط الإجراءات الفرعية العامة بدون وسائط، ولهذا السبب عادةً ما يتم تعريف الإجراء الفرعي المساعد على أنه خاص.
  • اتصل به من فرع آخر: هذه هي الطريقة المستخدمة لأي إجراء فرعي يأخذ وسائط، وهي الطريقة التي يعتمد عليها زر الأمر أعلاه.

للخيار الأخير شكلان مقبولان. كتابة الاسم متبوعًا بالوسائط المجردة تعمل، وكذلك استخدام الكلمة المفتاحية Call صراحةً، لكن قاعدة الأقواس تختلف بينهما.

Sub RunTheGreeting()
    ' Form 1: no Call keyword, no brackets
    displayFullName "John", "Doe"

    ' Form 2: Call keyword, brackets required
    Call displayFullName("Jane", "Roe")
End Sub

يؤدي كلا السطرين نفس الوظيفة تمامًا. ويُعدّ خلط الشكلين، بكتابة الأقواس بدون الكلمة المفتاحية Call، السبب الأكثر شيوعًا لخطأ الترجمة "المتوقع: =" عندما تأخذ دالة فرعية أكثر من وسيط واحد.

الفرق بين الإجراء الفرعي والدالة في VBA

الإجراءان الفرعي والدالة هما نوعا الإجراءات في لغة VBA، وكثيراً ما يختار المبتدئون النوع الخاطئ. والسؤال الحاسم بسيط: هل يحتاج الكود المُستدعي إلى قيمة مُعادة؟

الميزات فرعية الوظيفة
إرجاع قيمة لا نعم، تم تعيينها لاسم الدالة
أُعلن مع فرعي … نهاية فرعي الدالة … نهاية الدالة
كما دعا بيان مستقل جزء من تعبير، على سبيل المثال x = myFunc(2)
قابل للاستخدام في خلية ورقة العمل لا نعم، كدالة معرفة من قبل المستخدم
الاستخدام النموذجي قم بتنسيق ورقة، وامسح المدخلات، واعرض رسالة. احسب المجموع، وحوّل القيمة، وابحث عن البيانات

استخدم إجراءً فرعيًا عندما يعمل الكود على المصنف، و دالة VBA عندما ينتج الكود إجابة يستهلكها شيء آخر.

الأسئلة الشائعة

لا يمكن استدعاء الإجراء الفرعي الخاص إلا من داخل الوحدة التي تُعرّفه. أما الإجراء الفرعي العام فهو مرئي لجميع الوحدات في المشروع، وهو النوع الوحيد الذي يظهر في مربع حوار وحدات الماكرو.

تُمرر ByVal نسخةً من المتغير، لذا لا يمكن للروتين الفرعي تعديل متغير المُستدعي. أما ByRef فتُمرر المتغير نفسه، لذا يكون أي تغيير مرئيًا للمُستدعي. وتُعتبر ByRef هي الخيار الافتراضي عند عدم استخدام أي من الكلمتين المفتاحيتين.

استخدم عبارة Exit Sub. فهي توقف الإجراء عند تلك النقطة وتعيد التحكم إلى ما استدعاها، وهو أمر مفيد للخروج مبكراً عند فشل اختبار التحقق.

نعم. الصق الماكرو، وسيقوم مساعد الذكاء الاصطناعي بتجميع الأسطر ذات الصلة، واقتراح اسم وصفي لكل إجراء فرعي جديد، وإعادة كتابة الإجراء الأصلي كسلسلة قصيرة من الاستدعاءات. اختبر النتيجة على نسخة من المصنف.

نعم. أعطه نص الخطأ وسطر الاستدعاء، وسيقوم مساعد الذكاء الاصطناعي بتحديد الأسباب مثل استخدام الأقواس بدون الكلمة المفتاحية Call، أو عدد الوسائط الخاطئ، أو نوع البيانات غير المتطابق، ثم يقدم السطر المصحح.

تلخيص هذه التدوينة بـ: