تستخدِم برامج مايكروسوفت أوفيس لغة البرمجة فيجوال بيسك Visual Basic لإجراء عمليات البرمجة وكتابة الشيفرات، حيث دمجت شركة مايكروسوفت هذه اللغة مع تطبيقات مايكروسوفت أوفيس عام 1994، وكان برنامج مايكروسوفت إكسل أول برنامج تُدمج اللغة معه، حيث دُمج إصدار اللغة الموجهة للتطبيقات فقط Visual Basic for Application ليلائم بيئة عمل تطبيقات الأوفيس ومن هنا جاءت التسمية VBA.
يمكننا التعامل مع هذه اللغة والشيفرات البرمجية باستخدام المحرر Visual Basic Editor، وهو برنامج صغير مدمج مع مايكروسوفت أوفيس. حيث نستطيع من خلاله كتابة الشيفرات وتحريرها وتعديلها وتشغيلها، ونستطيع الدخول إليه من خلال قائمة المطوّر Developer إذ يوجد زر محرر الشيفرات، أو من خلال الضغط على الاختصار Ctrl+F11
.
عند فتح محرر الشيفرات VBE سنجد أنه يعمل من خلال نافذة مستقلة تمامًا عن صفحة الإكسل التي نعمل عليها، أي أننا نستطيع العمل على النافذتين وإجراء التعديلات عليهما في آنٍ واحد.
التعرف على الواجهة الرئيسية لمحرر VBE
يحتوي المحرر مثل أي تطبيق آخر على العديد من القوائم وأشرطة الأدوات:
- شريط القوائم الاعتيادي.
-
شريط الأدوات الأساسي، الذي يحتوي على العديد من الأدوات، مثل: أوامر تشغيل وإيقاف الشيفرة، والحفظ، والانتقال إلى إكسل.
-
القائمة project التي يٌعرض من خلالها جميع ملفات الإكسل قيد العمل (المفتوحة) وضمن كل ملف تُعرَض جميع الصفحات التي يحتويها الملف.
كما يمكن أن يحتوي على ملف اسمه PERSONAL.XLSB وهو ملف يحتوي على تسجيلات الماكرو التي أضفناها إلى برنامج الإكسل، فإذا أردنا إضافة شيفرات قابلة للتطبيق على كافة ملفات الإكسل على حاسوبنا، فعلينا أن إضافتها على المحرر مباشرةً.
اقتباسملاحظة: إذا لم تظهر هذه القائمة في المحرر لدينا، نستطيع إظهارها من القائمة view بالضغط على الأمر Project Explorer أو من خلال الاختصار
Ctrl+R
.
-
القائمة properties: تُظهر خصائص الصفحة المحددة في القائمة project، ويمكننا من خلالها تعديل خصائص الصفحة المحددة، مثل: إخفاء أو إظهار الصفحة من الخاصية
visible
في نهاية القائمة، وتغيير اسم الصفحة من الخاصيةname
.
وتُعَد هاتان القائمتان من أهم القوائم في المحرر حيث سنتعامل معهما دائمًا.
الشيفرة البرمجية وطرق كتابتها في VBA
الشيفرة المصدرية Source Code هي قائمة من النصوص التي يمكن قراءتها من قِبل الإنسان، فهي مكتوبة بلغة معينة تُعبّر عن سلسلة من الأوامر بترتيب معين يَسهُل على الحاسوب فهمها وترجمتها، بحيث تؤدي هذه الأوامر إلى تنفيذ غرض محدد، مثل: إجراء عمليات على البيانات، أو إعادة قيم محددة. وتُكتَب الشيفرة البرمجية في إكسل بطريقتين:
- عن طريق تسجيل ماكرو وهو ما درسناه في الدرس كيفية استخدام الماكرو Macro لأتمتة المهام المتكررة في Microsoft Excel.
-
عن طريق كتابة الشيفرة في المحرر، من خلال إنشاء شيفرة جديدة عن طريق الضغط على "إنشاء نموذج insert model" من شريط الأدوات، ليُفتَح نموذج جديد في القائمة project نكتب فيه الشيفرات، ثم نضغط على زر تشغيل من شريط الأدوات ليعمل المحرر على عرض الإجراءات المسجلة ضمن الشيفرة، ثم نختار الإجراء الذي نريد تشغيله ونضغط الأمر Run الذي يعمل على تشغيل الشيفرة وتنفيذ المهام المكتوبة فيها. كما يمكن تنفيذ الشيفرة السابقة من خلال الضغط على الزر
F5
واختيار الإجراء الذي نريد تشغيله.
لدينا المثال التالي الذي يوضح تشغيل الشيفرة البرمجية التي تُظهر لنا رسالة تحتوي على نصٍ معيّن:
Sub test() Msgbox "hello world” End sub
الإجراءات Procedures
الإجراء هو مجموعة من الأوامر تهدف مجتمعةً إلى تنفيذ عملية أو مجموعة من العمليات على البيانات، ويقسم إلى نوعين:
- sub_routine: يقصد به الأعمال الاعتيادية أو الأوامر الاعتيادية، مثل: إضافة سطر، وتغيير قيمة خلية.
- Function: المعادلات التي نريد تطبيقها مثل معادلات ودوال الإكسل.
الفرق الجوهري بين Function وsub_routine
- sub_routine
- يُنفذ مجموعة من المهام ولكن لا يعرض القيمة.
- يمكن استدعاءه من أي مكان داخل البرنامج بعد إنشائه.
- الصيغة العامة لبنائه:
Sub Name() Our code End sub
- 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
لسنا بحاجة إلى تشغيل الشيفرة هنا، لأن برنامج إكسل سيتعرف عليه تلقائيًا ويضيفه إلى مجموعة الأوامر لديه على شكل دالة معرفة ضمنه أساسًا، لتوضيح الفكرة لدينا البيانات التالية:
لتنفيذ الدالة (الإجراء) السابقة في الخلية B2 نكتب الصيغة التالية:
=square(A2)
نلاحظ أننا حصلنا على دالة جديدة تعطينا مربع الرقم.
منهجية كتابة الشيفرات
تتشابه منهجية كتابة الشيفرات بشكل كبير في جميع لغات البرمجة، فالشيفرات تُكتب بنفس المبدأ وتختلف عن بعضها بالمسميات وبعض الأمور البسيطة. في البداية لدينا بعض المصطلحات التي علينا معرفتها:
- 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
تمثل أمرًا مباشرًا يعمل على إيقاف السيارة.
اقتباستختلف هرمية تنفيذ تسلسل العمليات بحسب موقعنا من الملف أي (في أي صفحة؟ ضمن أي خلية؟ وهكذا)
لتوضيح ذلك لدينا ملف الإكسل التالي:
يحتوي الملف على العديد من الصفحات، ونريد إدخال القيمة 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 ضمن مايكروسوفت إكسل.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.