اذهب إلى المحتوى

مدخل إلى البرمجة باستخدام VBA في مايكروسوفت إكسل


محمد Albittar

تستخدِم برامج مايكروسوفت أوفيس لغة البرمجة فيجوال بيسك Visual Basic لإجراء عمليات البرمجة وكتابة الشيفرات، حيث دمجت شركة مايكروسوفت هذه اللغة مع تطبيقات مايكروسوفت أوفيس عام 1994، وكان برنامج مايكروسوفت إكسل أول برنامج تُدمج اللغة معه، حيث دُمج إصدار اللغة الموجهة للتطبيقات فقط Visual Basic for Application ليلائم بيئة عمل تطبيقات الأوفيس ومن هنا جاءت التسمية VBA.

يمكننا التعامل مع هذه اللغة والشيفرات البرمجية باستخدام المحرر Visual Basic Editor، وهو برنامج صغير مدمج مع مايكروسوفت أوفيس. حيث نستطيع من خلاله كتابة الشيفرات وتحريرها وتعديلها وتشغيلها، ونستطيع الدخول إليه من خلال قائمة المطوّر Developer إذ يوجد زر محرر الشيفرات، أو من خلال الضغط على الاختصار Ctrl+F11.

001VBA.PNG

عند فتح محرر الشيفرات VBE سنجد أنه يعمل من خلال نافذة مستقلة تمامًا عن صفحة الإكسل التي نعمل عليها، أي أننا نستطيع العمل على النافذتين وإجراء التعديلات عليهما في آنٍ واحد.

002VBE.PNG

التعرف على الواجهة الرئيسية لمحرر VBE

يحتوي المحرر مثل أي تطبيق آخر على العديد من القوائم وأشرطة الأدوات:

  • شريط القوائم الاعتيادي.

003VBE.PNG

  • شريط الأدوات الأساسي، الذي يحتوي على العديد من الأدوات، مثل: أوامر تشغيل وإيقاف الشيفرة، والحفظ، والانتقال إلى إكسل.

004VBE.PNG

  • القائمة project التي يٌعرض من خلالها جميع ملفات الإكسل قيد العمل (المفتوحة) وضمن كل ملف تُعرَض جميع الصفحات التي يحتويها الملف.

005VBE.PNG

كما يمكن أن يحتوي على ملف اسمه PERSONAL.XLSB وهو ملف يحتوي على تسجيلات الماكرو التي أضفناها إلى برنامج الإكسل، فإذا أردنا إضافة شيفرات قابلة للتطبيق على كافة ملفات الإكسل على حاسوبنا، فعلينا أن إضافتها على المحرر مباشرةً.

006VBE.PNG

اقتباس

ملاحظة: إذا لم تظهر هذه القائمة في المحرر لدينا، نستطيع إظهارها من القائمة view بالضغط على الأمر Project Explorer أو من خلال الاختصار Ctrl+R.

  • القائمة properties: تُظهر خصائص الصفحة المحددة في القائمة project، ويمكننا من خلالها تعديل خصائص الصفحة المحددة، مثل: إخفاء أو إظهار الصفحة من الخاصية visible في نهاية القائمة، وتغيير اسم الصفحة من الخاصية name.

007VBE.PNG

وتُعَد هاتان القائمتان من أهم القوائم في المحرر حيث سنتعامل معهما دائمًا.

الشيفرة البرمجية وطرق كتابتها في VBA

الشيفرة المصدرية Source Code هي قائمة من النصوص التي يمكن قراءتها من قِبل الإنسان، فهي مكتوبة بلغة معينة تُعبّر عن سلسلة من الأوامر بترتيب معين يَسهُل على الحاسوب فهمها وترجمتها، بحيث تؤدي هذه الأوامر إلى تنفيذ غرض محدد، مثل: إجراء عمليات على البيانات، أو إعادة قيم محددة. وتُكتَب الشيفرة البرمجية في إكسل بطريقتين:

  • عن طريق تسجيل ماكرو وهو ما درسناه في الدرس كيفية استخدام الماكرو Macro لأتمتة المهام المتكررة في Microsoft Excel.
  • عن طريق كتابة الشيفرة في المحرر، من خلال إنشاء شيفرة جديدة عن طريق الضغط على "إنشاء نموذج insert model" من شريط الأدوات، ليُفتَح نموذج جديد في القائمة project نكتب فيه الشيفرات، ثم نضغط على زر تشغيل من شريط الأدوات ليعمل المحرر على عرض الإجراءات المسجلة ضمن الشيفرة، ثم نختار الإجراء الذي نريد تشغيله ونضغط الأمر Run الذي يعمل على تشغيل الشيفرة وتنفيذ المهام المكتوبة فيها. كما يمكن تنفيذ الشيفرة السابقة من خلال الضغط على الزر F5 واختيار الإجراء الذي نريد تشغيله.

008NewModel.gif

لدينا المثال التالي الذي يوضح تشغيل الشيفرة البرمجية التي تُظهر لنا رسالة تحتوي على نصٍ معيّن:

Sub test()
 Msgbox "hello world”
End sub

009RunModel.gif

الإجراءات Procedures

الإجراء هو مجموعة من الأوامر تهدف مجتمعةً إلى تنفيذ عملية أو مجموعة من العمليات على البيانات، ويقسم إلى نوعين:

  • sub_routine: يقصد به الأعمال الاعتيادية أو الأوامر الاعتيادية، مثل: إضافة سطر، وتغيير قيمة خلية.
  • Function: المعادلات التي نريد تطبيقها مثل معادلات ودوال الإكسل.

010Procedure.PNG

الفرق الجوهري بين Function وsub_routine

  1. sub_routine
  • يُنفذ مجموعة من المهام ولكن لا يعرض القيمة.
  • يمكن استدعاءه من أي مكان داخل البرنامج بعد إنشائه.
  • الصيغة العامة لبنائه:
Sub Name()
 Our code 
End sub
  1. Function
  • تعمل على إجراء المعادلات أو العمليات وتعيد لنا قيمة ضمن أي خلية نحتاج تطبيق الإجراء عليها.
  • يمكن استخدام الشيفرة فيها مثل دالة متعارف عليها في برنامج إكسل ونستطيع تنفيذها ضمن الخلايا.
  • الصيغة العامة لبنائه:
Function Name()
 Our code 
End Function

حيث أن:

  • name: هو الاسم الذي اخترناه للإجراء ويفضل أن يكون الاسم معبرًا عن عمل الإجراء.
  • our code: هي مجموعة الأوامر والتعليمات البرمجية التي تُشكل جسم الإجراء.
  • End sub: دلالة على نهاية الإجراء.

مثال

ضمن النموذج model السابق نكتب الصيغة التالية:

Function square(A as Integer) as Double
     Square=A*A
End Function

لسنا بحاجة إلى تشغيل الشيفرة هنا، لأن برنامج إكسل سيتعرف عليه تلقائيًا ويضيفه إلى مجموعة الأوامر لديه على شكل دالة معرفة ضمنه أساسًا، لتوضيح الفكرة لدينا البيانات التالية:

011Function.PNG

لتنفيذ الدالة (الإجراء) السابقة في الخلية B2 نكتب الصيغة التالية:

=square(A2)

نلاحظ أننا حصلنا على دالة جديدة تعطينا مربع الرقم.

012Function.PNG

منهجية كتابة الشيفرات

تتشابه منهجية كتابة الشيفرات بشكل كبير في جميع لغات البرمجة، فالشيفرات تُكتب بنفس المبدأ وتختلف عن بعضها بالمسميات وبعض الأمور البسيطة. في البداية لدينا بعض المصطلحات التي علينا معرفتها:

  • Object: يعبر عن الكائنات بمفهومها العام، مثل: سيارة، حاسوب، كتاب. حيث قد يكون كائنًا رئيسيًا وتتفرع منه كائنات فرعية.
  • Property: مجموعة من الخصائص التي يملكها الكائن.
  • Collection: مجموعة من الكائنات الفرعية تتشارك بمجموعة من الخصائص الرئيسية، وتختلف بخصائص بسيطة تميزها عن بعضها مثل (اسم الكائن).
  • Method: تعبِّر عن عمل يُطبق على الكائن مباشرةً دون إرجاع القيمة.

تعتمد منهجية كتابة الشيفرات على التسلسل الهرمي، ولفهم ذلك نأخذ سيارةً لتكون مثالًا كائن Object نريد تطبيق الشيفرة عليه:

تمثل السيارة الكائن الرئيسي وله عدة خصائص Property، مثل: اللون، والوزن، والنوع، وتمثل الأبواب كائنًا فرعيًّا وتُشكِّل مع بعضها مجموعة Collection ولها عدة خصائص أيضًا. للاستعلام عن قيمة خاصية أو التعديل بأسلوب التسلسل الهرمي لدينا عدة طرق:

  • استعلام عن خاصية في الكائن مباشرةً يكون بالصيغة التالية:
Object.Property=value

بالتطبيق على مثالنا:

Car.color=red

حيث تمثِّلcar الكائن الرئيسي، في حين النقطة تُعبر عن الاستعلام، وcolor تعبر عن الخاصية، أمّا red فتُعبِّر عن القيمة الناتجة من الاستعلام.

  • استعلام عن خاصية كائن فرعي من الكائن الرئيسي يكون بالصيغة التالية:
Object.Object.Property=value

وبالتطبيق على مثالنا:

Car.engine.power=400

تُمثل الاستعلام عن قوة المحرك ضمن السيارة، حيث السيارة كائن رئيسي، والمحرك كائن فرعي، وقوة المحرك خاصية للكائن الفرعي.

  • استعلام عن خاصية كائن ضمن مجموعة ضمن الكائن الرئيسي يكون بالصيغة التالية:
Object.Collection('تحديد الكائن عن طريق اسمه ').Property=value

وبالتطبيق على مثالنا:

Car.wheel("fr").color=black

يُمثل الاستعلام عن لون العجلة الأمامية اليمنى ضمن السيارة، حيث السيارة كائن رئيسي والعجلات مجموعة تابعة للكائن الرئيسي واللون خاصية للمجموعة.

  • الأمر المباشر، حيث تُنفَذ العملية أو الدالة مباشرةً على الكائن ولا يُرجع أي قيم كما سبق في الطرق السابقة، ويكون بالصيغة التالية:
Object.Method

وبالتطبيق على مثالنا:

Car.stop

حيث أن العملية stop تمثل أمرًا مباشرًا يعمل على إيقاف السيارة.

اقتباس

تختلف هرمية تنفيذ تسلسل العمليات بحسب موقعنا من الملف أي (في أي صفحة؟ ضمن أي خلية؟ وهكذا)

لتوضيح ذلك لدينا ملف الإكسل التالي:

013Procedure.PNG

يحتوي الملف على العديد من الصفحات، ونريد إدخال القيمة 45 ضمن الخلية C2 في الصفحة CODE.

لدينا الاستعلام التالي لتنفيذ العملية وهو على الصيغة التالية:

Application.workbook("test").worksheets("CODE").Range("C2").value=45

تفسير الكائنات في الصيغة:

  • Application: تمثل الكائن الرئيسي وهو برنامج الإكسل.
  • ("workbook("test: تمثل كائنًا فرعيًّا وهو ملف الإكسل واسم الملف test.
  • ("worksheets("CODE: تمثل كائنًا فرعيًّا من الملف test وهو كائن الصفحة CODE.
  • ("Range("C2: تمثل كائنًا فرعيًّا من الصفحة CODE وهو كائن الخلية C2.
  • value: تمثل الخاصية التابعة للخلية والتي تمثل قيمة محتواها حيث سنعطيها القيمة 45.

يُعَد الاستعلام السابق هو الطريقة الأشمل، ولكنّنا نستطيع أن نختار تسلسلًا آخر وذلك حسب موقعنا من الملف، أي إذا كنا نعمل على الملف السابق وكانت الصفحة الفعّالة لدينا هي الصفحة CODE فإننا نحتاج الجزء التالي من الهرمية السابقة وهو:

Range("C2").value=45

أما إذا كانت الصفحة الفعّالة لدينا هي الصفحة CHAR ونفذّنا عليها الاستعلام السابق فإن النتيجة ستكون إسناد القيمة 45 في الخلية C2 في الصفحة CHAR، وللوصول إلى ناتج صحيح علينا العودة بالهرمية السابقة خطوةً إلى الوراء بحيث تصبح الصيغة كالآتي:

worksheets("CODE").Range("C2").value=45

خاتمة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...