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

المتغيرات وأهم الكائنات في برمجة VBA في مايكروسوفت إكسل


محمد Albittar

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

نستدعي الكائنات من أجل الحصول على خصائصها، إما للإرجاع معلومة أو لتغيير قيمتها، كما لدينا الأمر المباشر Method الذي يعمل على تنفيذ أمر على هذا الكائن بدون إرجاع قيمة.

أسماء أهم الكائنات في إكسل

لدينا العديد من الكائنات الأساسية التي سنتعامل معها دومًا في إكسل، وهذه الأسماء معرّفة في فيجوال بيسك Visual Basic، لذا يجب كتابتها بدون أخطاء حتى يتعرّف محرّر اللغة على الكائن بطريقة صحيحة. وتُعَد الكائنات التالية من أهم هذه الكائنات:

  • Application: هو كائن البرنامج ويعمل مع كل تطبيقات مايكروسوفت أوفيس.
  • ("workbooks("name: هو كائن ملف الإكسل وهو مجموعة نحدد فيها الملف الذي سنتعامل معه عن طريق الاسم.
  • ("worksheets("name: هو كائن مجموعة يضم كل الصفحات الموجودة في ملف الإكسل نفسه، وسنتعامل معه عن طريق الاسم.
  • ("Range("name: هو كائن مجموعة يضم كل الخلايا الموجودة في صفحة الإكسل، وسنتعامل معه عن طريق موقع الخلية.
  • ThiseWorkbook: هو كائن الملف الحالي الذي نعمل عليه.
  • Activesheet: هو كائن الصفحة الحالية ضمن الملف المفتوح.
  • Activecell: هو كائن الخلية الحالية ضمن الصفحة المفتوحة.
  • Selection: هو كائن الخلايا المحددة.

مثال تطبيقي

لدينا البيانات التالية ونريد ترجمة النصوص في عناوين الأعمدة من اللغة العربية إلى اللغة الإنكليزية وبالعكس:

001Translate.PNG

نفتح برنامج محرّر الشيفرات VBE ونُنشئ نموذج module من القائمة insert أو من شريط الأدوات، ثم نكتب الإجراء التالي لتحويل النصوص إلى اللغة الإنكليزية بالصيغة التالية:

Sub Translate_EN()
Range("A1").Value = "Section"
Range("B1").Value = "Project code"
Range("C1").Value = "Number of zones"
End Sub

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

اقتباس

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

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

002Translate.gif

وعند تطبيق العكس، أي تحويل النصوص السابقة إلى اللغة العربية نكتب الصيغة السابقة ولكن مع تغيير القيم التي ستُعدل في الخلايا بالصيغة التالية:

Sub translate_AR()
Range("A1").Value = "القسم"
Range("B1").Value = "كود المشروع"
Range("C1").Value = "عدد المناطق"
End Sub

عند تشغيل الإجراء السابق من الممكن أن تواجهنا مشكلة عدم فهم المحرّر للغة العربية ويظهرها بشكل رموز غير مفهومة.

003Translate.gif

وأسباب هذه المشكلة هي إمّا من نظام التشغيل ويندوز لدينا أو من محرّر الشيفرات نفسه ولحل هذه المشكلة من محرّر الشيفرات، نذهب للقائمة Tools ثم نختار الأمر Options، فتظهر لنا نافذة جديدة. نختار التبويب Editor Format ونتأكد أن نوع الخط المحدد هو أحد الخطوط العربية، مثلًا (Courier New (Arabic ثم نضغط موافق.

004Translate.PNG

إذا لم تُحل المشكلة سننتقل إلى لوحة التحكم من قائمة ابدأ، ونختار من القائمة اللغة والوقت، ثم نختار تبويب اللغة، بعدها إعدادات اللغة الإدارية، تظهر لنا نافذة جديدة نختار منها تبويب التنسيقات ونتأكد أن تنسيق اللغة من ضمن خيارات اللغة العربية.

005Lang.PNG

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

006Lang.PNG

بعد أن حللنا مشكلة اللغة نُعيد تشغيل الإجراء السابق لنجد أنه يعمل بطريقة صحيحة.

007Translate.gif

لإضافة أزرار تُنفِّذ عملية الترجمة بدون تشغيل المحرّر نتبع الخطوات التالية:

من قائمة المطور في برنامج إكسل، نضغط على الأداة إدراج ونختار منها إدراج زر فتظهر لنا نافذة جديدة نختار منها اسم الإجراء الذي نريد من الزر أن يعمل على تنفيذه، ثم نضغط موافق، بعدها ننقر نقرةً مزدوجةً على اسم الزر لنكتب له اسمًا مناسبًا يعبِّر عنه.

008Translate.gif

نكرر العملية السابقة لإضافة زر خاص بالإجراء الثاني.

009Translate.gif

الآن لنُجرب تطبيق استعلامًا يعمل على إخفاء الزر غير المُفعّل، أي عند الضغط على الزر عربي يختفي الزر الآخر وبالعكس.

اقتباس

إذا أردنا استدعاء كائن مضاف إلى الصفحة مثل (زر، مخطط بياني)، فيجب استدعاء الصفحة الموجود فيها ثم استدعاء الكائن؛ إلا إذا كان هذا الكائن مفعلًا.

هنا يمكننا كتابة الاستدعاء أو الاستعلام بإحدى الصيغتين التاليتين ولنا حرية الاختيار:

ActiveSheet.Buttons("Button1").Visible = False

أو الصيغة التالية:

Worksheets("VBA").Buttons("Button1").Visible = False
اقتباس

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

010Button.PNG

وبتطبيق الصيغة السابقة على الإجراءين السابقين نحصل على الصيغ التالية:

Sub Translate_EN()
Range("A1").Value = "Section"
Range("B1").Value = "Project code"
Range("C1").Value = "Number of zones"

ActiveSheet.Buttons("button1").Visible = True
ActiveSheet.Buttons("button2").Visible = False
End Sub

Sub translate_AR()
Range("A1").Value = "القسم"
Range("B1").Value = "كود المشروع"
Range("C1").Value = "عدد المناطق"

ActiveSheet.Buttons("button1").Visible = False
ActiveSheet.Buttons("button2").Visible = True
End Sub

الآن عند الضغط على أي زر ستُنفّذ عملية الترجمة ويختفي الزر الآخر تلقائيًا.

011Translate.gif

المتغيرات

يُعرِّف مفهوم الخوارزميات المتغيّر على أنه مخزن للبيانات تكون قيمته ثابتة أو متغيّرة، وذلك حسب الغرض من استعماله في الشيفرة.

لدينا مثال من الحياة لتوضيح الفكرة أكثر:

لدينا موظف توصيل طلبات طعام في أحد المطاعم، وإجمالي الدخل اليومي لهذا الموظف يعتمد على قيمتين، إحداهما ثابتة وهي الراتب، والثانية متغيّرة وهي الإكراميّة (البقشيش) التي يتقاضاها من الزبائن ولكن هذه القيمة غير محددة فمثلًا أحد الزبائن يدفع 20 وآخر يدفع 50 وآخر لا يدفع أبدًا لذا أصبح إجمالي الراتب اليومي هنا يعادل مرتبه اليومي مضافًا إليه مجموع الإكراميّات خلال اليوم، وهنا الإكراميّة تمثل المتغيّر أي أن المتغيّر قيمته ليست مشروطة برقم ثابت.

استخدام المتغيرات

تُستخدَم المتغيّرات في لغات البرمجة للأسباب التالية:

  • سهولة كتابة الشيفرات وتعديلها: وفي مثال على ذلك عندما يكون لدينا شيفرة كبيرة ونريد الاستعلام عن قيمةٍ ما ضمنها في أكثر من موضع وليكن 50 موضعًا، وبعد عدة تطويرات للشيفرة أردنا تعديل هذا الاستعلام فيجب علينا أن نعدّله في جميع المواضع، أي لدينا 50 عملية تعديل؛ أمّا إذا كنّا قد عرّفنا متغيّرًا وأسندنا له قيمة تساوي هذا الاستعلام، فسنحتاج إلى تعديل الشيفرة في موضع واحد فقط وهو مكان إسناد القيمة للمتغيّر.
  • تسريع عمل الشيفرة: إن استخدام المتغيّرات يخفف من حجم العمليات ضمن الشيفرة البرمجية وبالتالي تصبح الشيفرة أسرع في عملها.
  • الاستخدام المتعدد للمتغيّر: حيث يمكننا استخدامه في أكثر من مكان ضمن الشيفرة.

تعريف المتغيرات في VBA

تُعّرف المتغيّرات بالصيغة التالية:

Dim name  As  type
  • Dim هي اختصار لكلمة Dimension والتي تعني حجز جزء من الذاكرة، ويقصد بها هنا أن الاسم التالي يُعبّر عن متغيّر.
  • name: هو اسم اختياري ولكن له عدة شروط:
    • يبدأ بحرف ولا يبدأ برقم أو رمز.
    • لا يحتوي على الرموز التالية (#,$;%;&;!).
    • لا يُسمى بأسماء معرفة في اللغة مثل (IF;SUM).
    • لا يحتوي على فراغات أو نقط.
  • type: يُعبر عن نوع البيانات التي سيكون عليها المتغيّر الذي نعرّفه، مثل: نصي، ورقمي، ومنطقي.

فيما يلي جدول يضم جميع أنواع البيانات لدينا والقيم التي يمكن أن تأخذها:

012DataType.PNG

حالات تعريف المتغيّرات واستدعائها

يُستدعى المتغيّر في الشيفرة عن طريق كتابة اسمه فقط ولكن هنا لدينا حالتان:

  • تعريف متغيّر ضمن الإجراء: يمكننا هنا استدعاء المتغيّر داخل الإجراء فقط ولا يمكن التعرّف عليه ضمن إجراء آخر.
Sub test()
Dim x As Integer
Code 
End Sub 
  • تعريف متغيّر ضمن الإجراء وجعله عامًا: أي جعل المتغيّر قابلًا للاستخدام في أكثر من إجراء وذلك عن طريق وضع الكلمة Public قبل صيغة التعريف الخاصة بالمتغيّر.
Sub test()
Public Dim x As Integer
Code 
End Sub 
  • تعريف المتغيّر خارج الإجراءات: وذلك في بداية الشيفرات، عندها سيكون المتغيّر معرّفًا ضمن كل الإجراءات في نفس النموذج module.
Dim x As Integer

Sub test()
Code 
End Sub 

حالات تعيين قيمة متغير

  • إسناد قيمة ثابتة للمتغيّر، مثال:
Dim x As Integer
X=5
  • إسناد قيمة متغيّرة مثل خلية مرجعية، وفي مثال على ذلك ما يلي:
Dim x As Integer
X=Rang("name").value
  • إسناد معادلات للمتغيّر، مثال:
Dim x As Single
X=15*260/42

خاتمة

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

اقرأ أيضًا


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

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

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



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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...