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

البحث في الموقع

المحتوى عن 'إكسل'.

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المحتوى


التصنيفات

  • الإدارة والقيادة
  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • السلوك التنظيمي في المؤسسات
  • عالم الأعمال
  • التجارة والتجارة الإلكترونية
  • نصائح وإرشادات
  • مقالات ريادة أعمال عامة

التصنيفات

  • مقالات برمجة عامة
  • مقالات برمجة متقدمة
  • PHP
    • Laravel
    • ووردبريس
  • جافاسكربت
    • لغة TypeScript
    • Node.js
    • React
    • Vue.js
    • Angular
    • jQuery
    • Cordova
  • HTML
  • CSS
    • Sass
    • إطار عمل Bootstrap
  • SQL
  • لغة C#‎
    • ‎.NET
    • منصة Xamarin
  • لغة C++‎
  • لغة C
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • لغة Rust
  • برمجة أندرويد
  • لغة R
  • الذكاء الاصطناعي
  • صناعة الألعاب
  • سير العمل
    • Git
  • الأنظمة والأنظمة المدمجة

التصنيفات

  • تصميم تجربة المستخدم UX
  • تصميم واجهة المستخدم UI
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب GIMP
    • كريتا Krita
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • مقالات DevOps عامة
  • خوادم
    • الويب HTTP
    • البريد الإلكتروني
    • قواعد البيانات
    • DNS
    • Samba
  • الحوسبة السحابية
    • Docker
  • إدارة الإعدادات والنشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
    • ريدهات (Red Hat)
  • خواديم ويندوز
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • شبكات
    • سيسكو (Cisco)

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح
  • مبادئ علم التسويق

التصنيفات

  • مقالات عمل حر عامة
  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • العمل الحر المهني
    • العمل بالترجمة
    • العمل كمساعد افتراضي
    • العمل بكتابة المحتوى

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
    • بريستاشوب
    • أوبن كارت
    • دروبال
  • الترجمة بمساعدة الحاسوب
    • omegaT
    • memoQ
    • Trados
    • Memsource
  • برامج تخطيط موارد المؤسسات ERP
    • تطبيقات أودو odoo
  • أنظمة تشغيل الحواسيب والهواتف
    • ويندوز
    • لينكس
  • مقالات عامة

التصنيفات

  • آخر التحديثات

أسئلة وأجوبة

  • الأقسام
    • أسئلة البرمجة
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات

التصنيفات

  • كتب ريادة الأعمال
  • كتب العمل الحر
  • كتب تسويق ومبيعات
  • كتب برمجة
  • كتب تصميم
  • كتب DevOps

ابحث في

ابحث عن


تاريخ الإنشاء

  • بداية

    نهاية


آخر تحديث

  • بداية

    نهاية


رشح النتائج حسب

تاريخ الانضمام

  • بداية

    نهاية


المجموعة


النبذة الشخصية

تم العثور على 7 نتائج

  1. نقضي الكثير من الوقت في تكرار المهام البسيطة في إكسل، ;قد تكون هذه المهام، مثل: تنسيق نطاقات متعددة، وإخفاء أوراق متعددة، والنسخ واللصق في العديد من المصنفات، وتطبيق عوامل التصفية على جداول متعددة. وقد تكون هذه المهام مضيعةً للوقت ومملةً للغاية، لكن لحسن الحظ يمكننا استخدام الحلقات في وحدات ماكرو VBA، لتكرار الإجراءات بسرعة كبيرة، بحيث يمكن إكمال المهام التي قد تستغرق ساعات لإنجازها يدويًا في غضون ثوانٍ باستخدام حلقة تكرارية. الحلقة التكرارية For Next Loop تعمل على تكرار التعليمات وفقًا لشرط نُسنده لمُتغيّر اختياري وتكون قيمة الفحص مناسبةً لعدد مرات التكرار التي نريد تنفيذها. الشكل العام لصيغة الحلقة For variable = Start To End Code Next Element حيث أن: variable: تمثل المُتغيّر الذي سيُحدد عدد مرّات تكرار الحلقة عن طريق قيمة البداية والنهاية له. Start: تمثل قيمة البداية للمُتغيّر. End: تمثل قيمة النهاية للمُتغيّر. Code: التعليمات التي سنُنفذ عليها التكرار. Next Element: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على العنصر التالي بإضافة 1 للمُتغيّر. مثال لتكن لدينا مثلًا البيانات التالية، بحيث نريد تغيير التنسيق للنصوص في الخلايا إلى خط غامق باستخدام إجراء يعمل على ذلك. نكتب الإجراء بالصيغة التالية: Sub test1() Dim counter As Integer For counter = 1 To 10 ActiveCell.Font.Bold = True ActiveCell.Offset(1, 0).Select Next counter End Sub آلية عمل الحلقة بعد أن عرّفنا المُتغيّر وأُسندت له قيمة البداية والنهاية في الحلقة، فستعمل التعليمة ActiveCell.Font.Bold = true على تغيير تنسيق الخط من العادي إلى الغامق، حيث ActiveCell هو عنصر الخلية المفعّلة (مكان توضّع المؤشر)، والعنصر Font هو خط الخلية، أمّا الخاصية Bold فتأخذ قيمتين true للخط الغامق وFalse للخط العادي، وهي القيمة الافتراضية لتنسيق الخط. بعدها ننتقل إلى التعليمة التالية، بحيث تعمل التعليمة (Offset(value1,value2 بالانتقال إلى خلية نُحدّدها عبر نطاق التعليمة، إذ تُمثِّل الوسيطة value1 مقدار الانتقال على العمود بدايةً من الخلية الحالية، أما الوسيطة value2 فتمثّل مقدار الانتقال على الصف بدايةً من الخلية الحالية. نريد الانتقال في مثالنا لخلية واحدة فقط للأسفل على العمود، فيكون المجال لدينا (Offset(1,0، أما الأمر Select فيجعل الخلية مفعّلة (نشطة). بعدها ننتقل إلى التعليمة Next counter، حيث تنقل المُتغيّر إلى القيمة التالية وتكرر العملية إلى أن تصل لقيمة النهاية المُحددة للمُتغيّر. أشكال أخرى لكتابة الحلقة السابقة يمكن كتابة الحلقة بالشكل العكسي لمجال المُتغيّر. For variable = End To Start كما يمكننا التحكم بمقدار الزيادة في قيمة المُتغيّر للدورة التالية. For variable = End To Start Step value هنا لو كانت قيمة البداية 1 وقيمة النهاية 10 مثلًا وأردنا أن تكون خطوات الزيادة للمُتغيّر هي خطوتين في كل دورة، فستُنفذ الحلقة السابقة 5 عمليات تكرار فقط. الحلقة التكرارية For Each Next Loop تُعَد من أقوى تقنيّات الماكرو، وهذا النوع هو الأكثر شيوعًا من الحلقات، حيث تسمح لنا حلقة For Next Loop بالمرور عبر مجموعة من العناصر في إكسل وتكرار بعض العمليات عليها. وقد تتضمن مجموعات العناصر ما يلي: خلايا في نطاق. أوراق العمل في مصنف. المصنفات على الحاسوب. الجداول المحورية في ورقة العمل. الحقول المحورية في جدول محوري. الأشكال الموجودة في ورقة العمل، وأي كائن آخر تتفاعل معه في إكسل. تتمثل مهمة For Next Loop في تنفيذ نفس الإجراءات (سطور التعليمات البرمجية) على كل عنصر في المجموعة. الشكل العام للحلقة For Each Object In collection Code Next Object حيث أن: Object: تمثل الكائن الذي سننفذ الحلقة عليه. collection: تمثل مجموعة الكائنات التي تمثل الكائن Object. Code: مجموعة التعليمات التي سيكررها الإجراء. Next Object: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على الكائن التالي. مثال ليكن لدينا ملف العمل التالي الذي يحتوي على مجموعة من الصفحات المخفية. إظهار هذه الصفحات يدويًا سيستغرق بعض الوقت، ولكن يمكننا كتابة إجراء بسيط يحوي حلقةً تكراريةً تعمل على تغيير الخاصية visible لكل صفحة إلى القيمة xlSheetVisible والتي تجعل الصفحة ظاهرة، ويكون الإجراء بالصيغة التالية: Sub test2() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.Visible = xlSheetVisible Next ws End Sub آلية عمل الحلقة عرّفنا المُتغيّر ws على أنه عنصر صفحة، ثم وضعناه في الحلقة التكرارية على أنه عنصر المجموعة. التعليمة ActiveWorkbook.Worksheets تُحدد مجموعة عناصر صفحات الملف الحالي الذي نعمل عليه لأننا نريد تكرار العملية على جميع أوراق العمل في ActiveWorkbook. يُحدد المُتغيّر ws العنصر الأول من المجموعة، بحيث تعمل تعليمة الحلقة التكرارية بالمرور على صفحات الملف واحدة تلو الأخرى، وتُستبدَل الخاصية xlSheetHidden بالخاصية xlSheetVisible، إذ أن التعليمة Next تعمل على نقل العملية إلى العنصر الثاني بالمجموعة، ثم الثالث، وهكذا إلى الوصول لآخر عنصر(صفحة) في المجموعة، وعندها يتوقف التكرار الحلقي ويستمر الماكرو إلى السطر التالي من التعليمات البرمجية وهو إنهاء الإجراء End sub. الترتيب الذي تعمل به كل حلقة تبدأ الحلقة For each دائمًا عند العنصر الأول في المجموعة ويتكرر حتى العنصر الأخير بالترتيب الذي يظهر به في إكسل، حيث يعتمد هذا على رقم فهرس العناصر في المجموعة، وفيما يلي بعض الأمثلة على الترتيب الذي تعمل به الحلقة للعناصر الشائعة: المصنفات: يبدأ في المصنف الذي فُتح أولًا، وتعمل الحلقات على المصنفات بالترتيب الذي فُتحت فيه، بحيث يتعيّن رقم فهرس للمصنفات عند فتحها. أوراق العمل: تبدأ من علامة تبويب الورقة الأولى في المصنف، وتتكرر إلى الأخيرة بالترتيب الذي تظهر به علامات التبويب في المصنف. الخلايا: تبدأ الحلقات من اليمين إلى اليسار (وبالعكس في النسخ الإنكليزية) ثم إلى الأسفل، أي يبدأ في الخلية الأولى في النطاق ويتكرر إلى العمود التالي في نفس الصف، ثم ينتقل إلى الصف التالي. الجداول والجداول المحورية: تبدأ بالعنصر الذي أُنشئ أولًا وتعمل الحلقات على عناصر الورقة بترتيب إنشاءها. ينطبق هذا المبدأ نفسه على العناصر الأُخرى التي نُنشئها في أوراق العمل، مثل: الأشكال، والمخططات، وما إلى ذلك. الحلقة التكرارية Do Loop تعمل هذه الحلقة على تكرار العمليات في الشيفرة اعتمادًا على شرط نضعه في صيغة الحلقة. الصيغة العامة للحلقة Do until Condition Code Loop حيث أن: +Condition: تمثِّل شرط تكرار التعليمات في الحلقة. Code: مجموعة التعليمات التي سيكررها الإجراء. Loop: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على العنصر التالي. مثال لتكن لدينا البيانات السابقة ونريد إعطاء خلفية بلون أحمر للخلايا غير الفارغة، ولإنجاز ذلك نكتب الحلقة التكرارية التالية: Sub test3() Do Until ActiveCell.Value = "" ActiveCell.Interior.Color = vbRed ActiveCell.Offset(0,1).Select Loop End Sub آلية عمل الحلقة تفحص الحلقة الشرط أولًا، وفي حال تحقُّقه تُنفّذ التعليمة على الخلية المُفعّلة عن طريق العنصر Interior للتحكم بخلفية الخلية عن طريق الخاصية color، وإعطاءه القيمة vbRed التي تُمثِّل اللون الأحمر، ثم التعليمة ActiveCell.Offset(0,1) Select التي تعمل على الانتقال إلى الخلية التالية وتنشيطها، بعدها التعليمة Loop التي تُعيد الحلقة للبداية لتكرار العمليات على الخلية التي أصبحت نشطةً، وهكذا إلى أن يصل الشرط إلى خلية فارغة، عندها تتوقف الحلقة. أشكال أخرى لكتابة الحلقة السابقة يمكن كتابة الحلقة بالصيغة التالية: Do while Condition Code Loop تعمل هذه الصيغة بنفس آلية الصيغة السابقة، ولكن في السابقة كان الأمر هو تنفيذ التكرار حتى يتحقّق الشرط، بينما هنا تعمل على تنفيذ التكرار طالما الشرط محقّق. ولدينا صيغة أُخرى تعمل بنفس الآلية وهي: Do Code Loop while Condition تختلف هذه الصيغة عن سابقاتها بأنها ستُنفّذ العمليات داخل الحلقة ثم تتحقّق من الشرط، أي أنّ العمليات هنا ستُنفذ لمرّة واحدة على الأقل، بينما في السابقات يمكن ألّا تُنفّذ العمليات ضمن الحلقة ولا مرّة. خاتمة نلاحظ أن العمليات الروتينية التي نُجريها على إكسل لا تُعَد ولا تُحصى، وأنّه بالتطبيق السليم لأفكار الحلقات التكرارية سنتخلص من الروتين الممل، ونوفر الوقت، ونضبط عملياتنا أكثر من الطريقة اليدوية، وكل ما علينا هو دراسة المهمة التي نكرّرها دائمًا ومعرفة عناصرها وخصائصها، وتصميم إجراء يحتوي على إحدى صيغ الحلقات التكرارية بما يتناسب مع تلك العملية، ووضع التعليمات المناسبة لتنفيذ تلك العملية داخل الحلقة التكرارية لِتُنفذها عوضًا عنّا وذلك خلال وقت قياسي. اقرأ أيضًا التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل التفاعل مع المستخدم في مايكروسوفت إكسل باستخدام VBA العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA
  2. تتفاعل إجراءات الفيجوال بيسك مع المستخدم عن طريق نوعين من النوافذ، وهما: الرسائل الصندوقية MsgBox، وصناديق الإدخال InputBox. التعامل مع الرسائل النصية MsgBox تُستخدَم للتواصل والتفاعل مع المستخدِم، ومن خلالها يمكننا عرض المعلومات وطرح الأسئلة وحفظ الإجابات، كما يمكننا توجيهه لإجراء عمل ما في بعض الأحيان مثل (التأكد من الإغلاق، حفظ الملف قبل الإغلاق). الشكل العام للصيغة MsgBox(prompt,[buttons],[title],[help,context]) حيث أن: prompt: هو نص الرسالة التي ستظهر للمستخدِم، وهو مُعطى مطلوب. buttons: هي الأزرار التي سنضيفها للرسالة، وهو مُعطى اختياري، حيث أن القيمة الافتراضيّة له هي زر موافق. title: هو النص الذي سيظهر في شريط العنوان للرسالة، وهو مُعطى اختياري، حيث أن القيمة الافتراضيّة له هي Microsoft Excel. help,context: إرفاق ملف مساعد بمثابة دليل للمستخدم، وهو مُعطى اختياري ولا يُستخدم مع إكسل غالبًا. أشكال الرسائل المستخدمة في MsgBox يوجد خمس أجزاء تعمل على تشكيل الرسائل، أربعة منها أساسية وواحدة نادرة الاستخدام، بحيث نُدخلها كاملةً ضمن المُعطى button وهي: نوع الأزرار الظاهرة. نوع الأيقونات ضمن الرسالة. تعيين الزر الافتراضي. تعيين نوع الاستجابة. إضافة بعض الخصائص للرسالة. تحديد نوع الأزرار الظاهرة لدينا الأنواع التالية التي تُحدد عمل الرسائل عن طريق الأزرار المستخدَمة وهي: vbOKOnly: تعمل على إظهار الزر OK فقط، رقم التعريف الخاص به 0، وهو الإفتراضي عند عدم تحديد نوع الزر المستخدَم. +vbOKCancel: تعمل على إظهار الزر OK مع زر Cancel، ورقم التعريف الخاص به 1. vbAbortRetryIgnore: تعمل على إظهار الأزرار Abort بمعنى فشل العملية، وRetry لإعادة المحاولة، وIgnore بعنى تجاهل الخطأ؛ أما رقم التعريف الخاص به 2. vbYesNoCancel: تعمل على إظهار الأزرار Yes، وNo، وCancel التي تفيد هنا إلغاء العملية؛ أما رقم التعريف الخاص به فهو 3. vbYesNo: تعمل على إظهار الأزرار Yes، وNo ، ورقم التعريف الخاص به هو 4. vbRetryCancel: تعمل على إظهار الأزرار Cancel، وRetry، رقم التعريف الخاص به هو 5. نستطيع استخدام أحد هذه الأزرار ببساطة، ولكن نحتاج إلى تعريف متغيّر نوعه MsgBoxResult لتخزين نتيجة اختيار المستخدِم فيه لاستعمالها لاحقًا في تنفيذ الأوامر. ولا نُعرّف هذا المتغيّر في حال استخدامنا للزرvbOKOnly فقط. آلية حفظ نتيجة اختيار المستخدم على فرض أننا نستعمل الزر من النوع vbYesNoCancel، فسيكون له ثلاثة احتمالات لاختيار المستخدم، ولتكن لدينا الصيغة التالية: Sub test1() Dim result As VbMsgBoxResult result = MsgBox("هل أنت متأكد من الإغلاق", vbYesNoCancel) End Sub هنا تكون النتيجة إحدى الاحتمالات التالية vbYes، وvbNo، وvbCancel. وعند الضغط على أحد هذه الأزرار، فستُحفظ قيمته في المتغيّر بحيث يمكننا الاستفادة منها لاحقًا في تنفيذ بعض التعليمات اعتمادًا عليها، وبنفس الطريقة تعمل باقي الأزرار. كما يمكننا استخدام رقم التعريف عوضًا عن الاسم، أي لاستعمال الزر vbYesNoCancel نضع في المُعطى الخاص به الرقم المُعرِّف له بدل اسم الزر وهو 3، والذي يعطي نفس النتيجة. Sub test1() Dim result As VbMsgBoxResult result = MsgBox("هل أنت متأكد من الإغلاق", 3) End Sub تحديد نوع الأيقونات الظاهرة vbCritical: إظهار علامة X، ورقم التعريف الخاص به 16. vbQuestion: إظهار علامة الاستفهام، ورقم التعريف الخاص به 32. vbExclamation: إظهار علامة التعجب الصفراء المثلثة، ورقم التعريف الخاص به 48. vbInformation: إظهار علامة التعجب الزرقاء الدائرية، ورقم التعريف الخاص به 64. يمكننا إضافة الأيقونة للرسالة عن طريق الوسيطة buttons، وذلك بإضافة اسم الأيقونة إلى اسم الزر، لنفصل بينهما بإشارة +، وبالعودة للمثال السابق وإضافة الأيقونة سنحصل على الصيغة التالية: Sub test1() Dim result As VbMsgBoxResult result = MsgBox("هل أنت متأكد من الإغلاق", vbYesNoCancel+ vbInformation) End Sub أو بالصيغة المرجعية لرقم الخاصية: Sub test1() Dim result As VbMsgBoxResult result = MsgBox("هل أنت متأكد من الإغلاق", 3 + 64) End Sub تحديد الزر الافتراضي يمكننا تحديد أي الأزرار يكون هو الافتراضي عند الضغط على زر Enter من لوحة المفاتيح. vbDefaultButton1: الزر الأول هو الافتراضي، ورقم التعريف الخاص به 0. vbDefaultButton2: الزر الثاني هو الافتراضي، ورقم التعريف الخاص به 256. vbDefaultButton3: الزر الثالث هو الافتراضي، ورقم التعريف الخاص به 512. vbDefaultButton4: الزر الرابع هو الافتراضي، ورقم التعريف الخاص به 768. تحديد نوع الاستجابة vbApplicationModal: عند استخدامها تُجبر المستخدِم على الاستجابة للرسالة قبل المتابعة، ورقم التعريف الخاص به 0. vbSystemModal: عند استخدامها فإن جميع برامج النظام تتوقف حتى يستجيب المستخدم للرسالة، ورقم التعريف الخاص به 4096. إضافة بعض الخصائص للرسالة vbMsgBoxHelpButton: إظهار زرّ Help على الرسالة، ورقم التعريف الخاص به 16384. vbMsgBoxSetForeground: جعل نافذة الرسالة في مقدمة النوافذ المفتوحة، ورقم التعريف الخاص به 65536. vbMsgBoxRight: محاذاة نص الرسالة للجهة اليُمنى، ورقم التعريف الخاص به 524288. vbMsgBoxRtlReading: اتجاه الكتابة من اليمين لليسار للغة العربية، ورقم التعريف الخاص به 1048576. مثال تطبيقي ليكن لدينا جدول البيانات التالية ونريد كتابة إجراء يحذف البيانات ضمن الجدول، ولكن قبل الحذف نريد من المستخدم تأكيد العملية عن طريق MsgBox وفي حال لم يوافق على الحذف تظهر له رسالة أخرى تُعلمه أن البيانات لم تُحذف: لكتابة الإجراء الخاص بالعمليات السابقة، نُعرّف الإجراء ونضع له الاسم "clear"، ثم نُعرّف متغيّر من النوع VbMsgBoxREsult ونُسند إليه الرسالة التي ستظهر للمستخدِم، والتي تحتوي على رسالة تأكيد عملية الحذف. بحيث يكون الزر فيها من النوع vbYesNo، والأيقونة من النوع vbQuestion، بالإضافة لعنوان الرسالة الذي يُعبّر عن تحذير تصبح الصيغة كالتالي: result = MsgBox("هل أنت واثق من حذف البيانات", vbYesNo + vbQuestion, "تحذير") لاستخدام نتيجة اختيار المستخدم نضع شرطًا، بحيث إذا ضغط المستخدِم على الزر yes، فسيُنفِّذ عملية حذف البيانات؛ أما إذا ضغط على الزر No، فينتقل للشق الثاني من الشرط وهو إظهار رسالة بأن البيانات لم تُحذف، نكتب الشرط بالصيغة التالية: If result = vbYes Then ActiveSheet.Range("D12:H29").ClearContents Else MsgBox ("البيانات لم تُحذف") End If هكذا نكون قد حصلنا على الإجراء المطلوب ويصبح الإجراء كاملًا كالتالي: Sub Clear() Dim result As VbMsgBoxResult result = MsgBox("هل أنت واثق من حذف البيانات", vbYesNo + vbQuestion, "تحذير") If result = vbYes Then ActiveSheet.Range("A2:H12").ClearContents Else MsgBox ("البيانات لم تُحذف") End If End Sub التفاعل مع المستخدم عبر صندوق الإدخال عن طريق InputBox مثل سابقتها، تعمل على إظهار رسالة للمستخدِم، ولكن عن طريقها يستطيع المستخدِم إدخال قيمة ما عبر صندوق إدخال القيم، ولدينا نوعان منها. الشكل العام للصيغة InputBox(prompt, [ title ], [ default ], [ xpos ], [ ypos ], [ helpfile, context ]) هذه التعليمة خاصّة بلغة فيجوال بيسك عمومًا، حيث أن: prompt: هو نص الرسالة التي ستظهر للمستخدِم، وهو مُعطى مطلوب. title: هو النص الذي سيظهر في شريط العنوان للرسالة، وهو مُعطى اختياري، حيث أن القيمة الافتراضيّة له هي *Microsoft Excel*. default: هي القيمة الافتراضيّة في صندوق الإدخال، وهو مُعطى اختياري. xpos: هي الموقع الأفقي لظهور الرسالة في الصندوق، وهو مُعطى اختياري، تكون القيمة الافتراضيّة له Left. ypos: هي الموقع الشاقولي لظهور الرسالة في الصندوق وهو مُعطى اختياري، وتكون القيمة الافتراضيّة له Top. help,context: إرفاق ملف مساعد بمثابة دليل للمستخدم، وهو مُعطى اختياري ولا يُستخدم مع إكسل غالبًا. expression.InputBox (Prompt, [ title ], [ default ], [ xpos ], [ ypos ], [ helpfile, context ], [Type]) هذه التعليمة خاصة بتطبيقات أوفيس مع الفيجوال بيسك، حيث أن المعطيات هي نفسها ولكن مع بعض الزيادات: expression: عن طريقها نُحدد كائن من كائنات الإكسل الذي سنطبق التعليمات عليه مثل الكائن Application. type: تحدد نوع البيانات التي سيُدخلها المستخدِم، ولدينا عدة أنواع كما هو موضح في الصورة. آلية العمل والفرق بين الصيغتين نُعرِّف متغيّرات تعمل على حفظ القيمة التي سيُدخلها المستخدِم، ثم نُسند التعليمة إلى هذا المتغيّر، ولكن يوجد فرق جوهري وهو في الصيغة الأولى، فعند وجود خطأ في إدخال قيمة بغير الصيغة التي عرّفنا فيها المتغيّر، فسيوقف المحرّر الإجراء بدون معرفة ما هو نوع الخطأ، حيث سيُحدد السطر الذي يحتوي على هذا الخطأ باللون الأصفر فقط؛ أما في الصيغة الثانية، فسيُحدد المحرّر نوع الخطأ ويُظهر رسالة تُعلِم المستخدم أنه أدخل صيغة خاطئة. مثال لدينا الملف التالي الذي يحتوي على صفحتين، الأولى تسمح لنا بتسجيل الدخول عن طريق صندوقي إدخال الأول لاسم المستخدم، والثاني لكلمة المرور، وإظهار الصفحة الثانية التي تحتوي على بيانات الشركة. حيث أنّ الصفحة الثانية مخفية عن طريق تغيير قيمة الخاصية visible لها إلى القيمة xlSheetVeryHidden، وهي خاصية لا تسمح لنا بإظهار الصفحة من ملف الإكسل بالطريقة التقليدية، إنما فقط عن طريق الإجراءات أو عن طريق القائمة Property التي تحدثنا عنها في درس التعريف عن الواجهة الرئيسية للمحرّر: نبدأ الإجراء بتعريف المتغيّرات التي سنُخزن فيها القيم التي سيُدخلها المستخدِم لموازنتها فيما بعد مع القيم الصحيحة لتسجيل الدخول، وتكون لدينا الصيغة التالية: Dim UserName As String Dim Password As Double UserName = InputBox("Enter your user name", "Username", "Your Name") Password = Application.InputBox("Enter your password", "Password", Type:=1) كتبنا المُعطى Type:=1 بهذا الشكل وهو طريقة ثانية لكتابة قيم المُعطيات عندما نريد تجاوز المُعطيات التي تسبق المُعطى الذي نريده، ولو أردنا كتابتها بالصيغة الأساسية فستكون كالتالي: Application.InputBox("Enter your password", "Password", , , , ,1) بعد تعريف المتغيّرات إسناد القيم من صناديق الإدخال لها بقي لنا أن نضع شرطًا يتحقّق من أن ما أدخله المستخدِم يطابق شروط الدخول إلى صفحة البيانات أم لا ويكون الشرط بالصيغة التالية: If UserName = "Maher" And Password = 123 Then Sheets("data").Visible = xlSheetVisible Else MsgBox "Incorrect Username or Password" End If يُصبح الإجراء بالكامل كالتالي: Sub check_user() Dim UserName As String Dim Password As Double UserName = InputBox("Enter your user name", "Username", "Your Name") Password = Application.InputBox("Enter your password", "Password", Type:=1) If UserName = "Maher" And Password = 123 Then Sheets("data").Visible = xlSheetVisible Else MsgBox "Incorrect Username or Password" End If End Sub عند إدخال اسم مستخدم أو كلمة مرور غير صحيحة، سيُنفِّذ الإجراء الشق الثاني من الشرط، وهي رسالة تفيد بأن اسم المستخدِم أو كلمة المرور خاطئة؛ أما عند إدخال بيانات صحيحة، فسيُنفِّذ الشق الأول من الشرط عندها تظهر الصفحة Data. خاتمة نلاحظ أن صندوق الرسائل وصندوق الإدخال يسمح لنا بزيادة ضبط التحكم بالعمليات وتوجيه المستخدم بطريقة منظمة ودقيقة، وكلما كانت العمليات دقيقةً ومنظمةً أكثر، حصلنا على بيانات صحيحة ومنظمة ومحميّة أكثر. وبدمج صناديق الإدخال وصناديق الرسائل مع الشروط، فسنحصل على إجراءات تُنجز الكثير من الأعمال بتنظيم وسرعة في آن واحد، وبنتائج تُحقّق لنا الكثير من الفائدة. اقرأ أيضًا الحلقات التكرارية في مايكروسوفت إكسل باستخدام VBA مدخل إلى البرمجة باستخدام VBA في مايكروسوفت إكسل العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA
  3. تحدثنا سابقًا عن منهجية كتابة الشيفرات وتعلمنا أن كل شيء في إكسل هو كائن Object، فالملف كائن والصفحة كائن والخلية كائن، قد يكون الكائن مفردًا أو مجموعةً من الكائنات، بحيث يُحدَّد الكائن فيها بذكر اسمه بين إشارتي تنصيص داخل أقواس كائن المجموعة. نستدعي الكائنات من أجل الحصول على خصائصها، إما للإرجاع معلومة أو لتغيير قيمتها، كما لدينا الأمر المباشر Method الذي يعمل على تنفيذ أمر على هذا الكائن بدون إرجاع قيمة. أسماء أهم الكائنات في إكسل لدينا العديد من الكائنات الأساسية التي سنتعامل معها دومًا في إكسل، وهذه الأسماء معرّفة في فيجوال بيسك Visual Basic، لذا يجب كتابتها بدون أخطاء حتى يتعرّف محرّر اللغة على الكائن بطريقة صحيحة. وتُعَد الكائنات التالية من أهم هذه الكائنات: Application: هو كائن البرنامج ويعمل مع كل تطبيقات مايكروسوفت أوفيس. ("workbooks("name: هو كائن ملف الإكسل وهو مجموعة نحدد فيها الملف الذي سنتعامل معه عن طريق الاسم. ("worksheets("name: هو كائن مجموعة يضم كل الصفحات الموجودة في ملف الإكسل نفسه، وسنتعامل معه عن طريق الاسم. ("Range("name: هو كائن مجموعة يضم كل الخلايا الموجودة في صفحة الإكسل، وسنتعامل معه عن طريق موقع الخلية. ThiseWorkbook: هو كائن الملف الحالي الذي نعمل عليه. Activesheet: هو كائن الصفحة الحالية ضمن الملف المفتوح. Activecell: هو كائن الخلية الحالية ضمن الصفحة المفتوحة. Selection: هو كائن الخلايا المحددة. مثال تطبيقي لدينا البيانات التالية ونريد ترجمة النصوص في عناوين الأعمدة من اللغة العربية إلى اللغة الإنكليزية وبالعكس: نفتح برنامج محرّر الشيفرات 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 ونُغيّر قيمتها إلى القيمة الجديدة. نكتب كل استعلام بسطرٍ منفصلٍ عن الآخر، وعند تشغيل الشيفرة من شريط الأدوات نلاحظ تغيير قيم الخلايا التي تحوي البيانات إلى القيم التي وضعناها في استعلامات الإجراء السابق. وعند تطبيق العكس، أي تحويل النصوص السابقة إلى اللغة العربية نكتب الصيغة السابقة ولكن مع تغيير القيم التي ستُعدل في الخلايا بالصيغة التالية: Sub translate_AR() Range("A1").Value = "القسم" Range("B1").Value = "كود المشروع" Range("C1").Value = "عدد المناطق" End Sub عند تشغيل الإجراء السابق من الممكن أن تواجهنا مشكلة عدم فهم المحرّر للغة العربية ويظهرها بشكل رموز غير مفهومة. وأسباب هذه المشكلة هي إمّا من نظام التشغيل ويندوز لدينا أو من محرّر الشيفرات نفسه ولحل هذه المشكلة من محرّر الشيفرات، نذهب للقائمة Tools ثم نختار الأمر Options، فتظهر لنا نافذة جديدة. نختار التبويب Editor Format ونتأكد أن نوع الخط المحدد هو أحد الخطوط العربية، مثلًا (Courier New (Arabic ثم نضغط موافق. إذا لم تُحل المشكلة سننتقل إلى لوحة التحكم من قائمة ابدأ، ونختار من القائمة اللغة والوقت، ثم نختار تبويب اللغة، بعدها إعدادات اللغة الإدارية، تظهر لنا نافذة جديدة نختار منها تبويب التنسيقات ونتأكد أن تنسيق اللغة من ضمن خيارات اللغة العربية. ثم من نفس النافذة ننتقل إلى التبويب إداري، نضغط على زر تغيير الإعدادات المحلية للنظام ونتأكد من أن اللغة المخصصة للإعدادات المحلية للنظام هي العربية أيضًا. سيطلب النظام إعادة التشغيل بعد هذا التغيير. بعد أن حللنا مشكلة اللغة نُعيد تشغيل الإجراء السابق لنجد أنه يعمل بطريقة صحيحة. لإضافة أزرار تُنفِّذ عملية الترجمة بدون تشغيل المحرّر نتبع الخطوات التالية: من قائمة المطور في برنامج إكسل، نضغط على الأداة إدراج ونختار منها إدراج زر فتظهر لنا نافذة جديدة نختار منها اسم الإجراء الذي نريد من الزر أن يعمل على تنفيذه، ثم نضغط موافق، بعدها ننقر نقرةً مزدوجةً على اسم الزر لنكتب له اسمًا مناسبًا يعبِّر عنه. نكرر العملية السابقة لإضافة زر خاص بالإجراء الثاني. الآن لنُجرب تطبيق استعلامًا يعمل على إخفاء الزر غير المُفعّل، أي عند الضغط على الزر عربي يختفي الزر الآخر وبالعكس. هنا يمكننا كتابة الاستدعاء أو الاستعلام بإحدى الصيغتين التاليتين ولنا حرية الاختيار: ActiveSheet.Buttons("Button1").Visible = False أو الصيغة التالية: Worksheets("VBA").Buttons("Button1").Visible = False وبتطبيق الصيغة السابقة على الإجراءين السابقين نحصل على الصيغ التالية: 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 الآن عند الضغط على أي زر ستُنفّذ عملية الترجمة ويختفي الزر الآخر تلقائيًا. المتغيرات يُعرِّف مفهوم الخوارزميات المتغيّر على أنه مخزن للبيانات تكون قيمته ثابتة أو متغيّرة، وذلك حسب الغرض من استعماله في الشيفرة. لدينا مثال من الحياة لتوضيح الفكرة أكثر: لدينا موظف توصيل طلبات طعام في أحد المطاعم، وإجمالي الدخل اليومي لهذا الموظف يعتمد على قيمتين، إحداهما ثابتة وهي الراتب، والثانية متغيّرة وهي الإكراميّة (البقشيش) التي يتقاضاها من الزبائن ولكن هذه القيمة غير محددة فمثلًا أحد الزبائن يدفع 20 وآخر يدفع 50 وآخر لا يدفع أبدًا لذا أصبح إجمالي الراتب اليومي هنا يعادل مرتبه اليومي مضافًا إليه مجموع الإكراميّات خلال اليوم، وهنا الإكراميّة تمثل المتغيّر أي أن المتغيّر قيمته ليست مشروطة برقم ثابت. استخدام المتغيرات تُستخدَم المتغيّرات في لغات البرمجة للأسباب التالية: سهولة كتابة الشيفرات وتعديلها: وفي مثال على ذلك عندما يكون لدينا شيفرة كبيرة ونريد الاستعلام عن قيمةٍ ما ضمنها في أكثر من موضع وليكن 50 موضعًا، وبعد عدة تطويرات للشيفرة أردنا تعديل هذا الاستعلام فيجب علينا أن نعدّله في جميع المواضع، أي لدينا 50 عملية تعديل؛ أمّا إذا كنّا قد عرّفنا متغيّرًا وأسندنا له قيمة تساوي هذا الاستعلام، فسنحتاج إلى تعديل الشيفرة في موضع واحد فقط وهو مكان إسناد القيمة للمتغيّر. تسريع عمل الشيفرة: إن استخدام المتغيّرات يخفف من حجم العمليات ضمن الشيفرة البرمجية وبالتالي تصبح الشيفرة أسرع في عملها. الاستخدام المتعدد للمتغيّر: حيث يمكننا استخدامه في أكثر من مكان ضمن الشيفرة. تعريف المتغيرات في VBA تُعّرف المتغيّرات بالصيغة التالية: Dim name As type Dim هي اختصار لكلمة Dimension والتي تعني حجز جزء من الذاكرة، ويقصد بها هنا أن الاسم التالي يُعبّر عن متغيّر. name: هو اسم اختياري ولكن له عدة شروط: يبدأ بحرف ولا يبدأ برقم أو رمز. لا يحتوي على الرموز التالية (#,$;%;&;!). لا يُسمى بأسماء معرفة في اللغة مثل (IF;SUM). لا يحتوي على فراغات أو نقط. type: يُعبر عن نوع البيانات التي سيكون عليها المتغيّر الذي نعرّفه، مثل: نصي، ورقمي، ومنطقي. فيما يلي جدول يضم جميع أنواع البيانات لدينا والقيم التي يمكن أن تأخذها: حالات تعريف المتغيّرات واستدعائها يُستدعى المتغيّر في الشيفرة عن طريق كتابة اسمه فقط ولكن هنا لدينا حالتان: تعريف متغيّر ضمن الإجراء: يمكننا هنا استدعاء المتغيّر داخل الإجراء فقط ولا يمكن التعرّف عليه ضمن إجراء آخر. 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 خاتمة إن إتقاننا للتعليمات في لغات البرمجة يجعل منّا مبرمجين، ولكن إتقان التعامل مع المتغيّرات يجعلنا مبرمجين محترفين لما للمتغيّرات من أهمية كبيرة في صناعة الشيفرات البرمجية، ولأثرها الكبير على تحسين عمل الشيفرة وتسريعها وسهولة تعديلها، إضافةً إلى تخفيف كمية الاستعلامات في الشيفرة. اقرأ أيضًا مدخل إلى البرمجة باستخدام VBA في مايكروسوفت إكسل. العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA. الحلقات التكرارية في مايكروسوفت إكسل باستخدام VBA. التفاعل مع المستخدم في مايكروسوفت إكسل باستخدام VBA.
  4. تستخدِم برامج مايكروسوفت أوفيس لغة البرمجة فيجوال بيسك Visual Basic لإجراء عمليات البرمجة وكتابة الشيفرات، حيث دمجت شركة مايكروسوفت هذه اللغة مع تطبيقات مايكروسوفت أوفيس عام 1994، وكان برنامج مايكروسوفت إكسل أول برنامج تُدمج اللغة معه، حيث دُمج إصدار اللغة الموجهة للتطبيقات فقط Visual Basic for Application ليلائم بيئة عمل تطبيقات الأوفيس ومن هنا جاءت التسمية VBA. يمكننا التعامل مع هذه اللغة والشيفرات البرمجية باستخدام المحرر Visual Basic Editor، وهو برنامج صغير مدمج مع مايكروسوفت أوفيس. حيث نستطيع من خلاله كتابة الشيفرات وتحريرها وتعديلها وتشغيلها، ونستطيع الدخول إليه من خلال قائمة المطوّر Developer إذ يوجد زر محرر الشيفرات، أو من خلال الضغط على الاختصار Ctrl+F11. عند فتح محرر الشيفرات VBE سنجد أنه يعمل من خلال نافذة مستقلة تمامًا عن صفحة الإكسل التي نعمل عليها، أي أننا نستطيع العمل على النافذتين وإجراء التعديلات عليهما في آنٍ واحد. التعرف على الواجهة الرئيسية لمحرر VBE يحتوي المحرر مثل أي تطبيق آخر على العديد من القوائم وأشرطة الأدوات: شريط القوائم الاعتيادي. شريط الأدوات الأساسي، الذي يحتوي على العديد من الأدوات، مثل: أوامر تشغيل وإيقاف الشيفرة، والحفظ، والانتقال إلى إكسل. القائمة project التي يٌعرض من خلالها جميع ملفات الإكسل قيد العمل (المفتوحة) وضمن كل ملف تُعرَض جميع الصفحات التي يحتويها الملف. كما يمكن أن يحتوي على ملف اسمه PERSONAL.XLSB وهو ملف يحتوي على تسجيلات الماكرو التي أضفناها إلى برنامج الإكسل، فإذا أردنا إضافة شيفرات قابلة للتطبيق على كافة ملفات الإكسل على حاسوبنا، فعلينا أن إضافتها على المحرر مباشرةً. القائمة 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 ضمن مايكروسوفت إكسل. اقرأ أيضًا المتغيرات وأهم العناصر في برمجة VBA في مايكروسوفت إكسل. العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA. التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل.
  5. عند كتابة الشيفرات البرمجية، تُصادِفنا العديد من التعليمات التي نحتاج تنفيذها فقط عند تحقّق أمر ما، مثل: تنفيذ شيفرة عند إدخال المستخدم قيمة معينة لإحدى الخلايا، أو عند إجراء تغييرٍ ما عليها، أو عند إدخال قيمة لا توافق الشروط التي وضعناها. بحيث تُنفَّذ الشيفرة بإظهار رسالة معّينة أو بتنفيذ أمر معين في حال تحقّق الشرط، وتنفيذ أوامر أخرى في حال عدم تحقّقه، وتُسمى هذه العملية بالعملية الشرطيّة. تعليمة IF الشرطية هي أشهر التعليمات الشرطيّة وتكتب بالصيغة التالية: IF condition Then code (if the condition is true) وهي الصيغة الأساسية لكتابة هذه التعليمة، ولكن يمكن كتابتها بشكل أوسع على الصيغة التالية: IF condition Then codes (if the condition is true) End If حيث أن: condition: الشرط الذي نريد تنفيذ التعليمات عند تحقّقه. codes: مجموعة التعليمات التي ستُنفذ عند تحقّق الشرط السابق. End IF: علامة نهاية العملية الشرطيّة. مثال لتكن لدينا البيانات التالية، حيث نريد فحص الخلايا وإعطائها رموز ترتيب في العمود D حسب نوع القسم. نطبق الشرط على الخلية A2 لفهم عمل الشرط، بحيث تعمل الشيفرة على إدخال القيمة A في الخلية D2 عند تحقّقه، ونكتب الشرط بالصيغة التالية: Sub test_if() IF Range("A2").Value = "الصحي" Then Range("D2").Value = "A" End IF End Sub الشرط هنا هو أن تكون قيمة الخلية A2 تساوي القيمة "الصحي"، وبتنفيذ الإجراء من المحرّر نجد أنّ الشيفرة تعمل بطريقة صحيحة، وتُمثّل هذه الصيغة الشروط البسيطة. تعليمة IF/Else الشرطية تعمل بنفس مبدأ التعليمة السابقة ولكن في حال لم يتحقّق الشرط نضيف للشيفرة عمليات أُخرى ليُنفّذها، وتكون التعليمة بالصيغة التالية: IF Condition Then codes (if the condition is true) Else codes (if the condition is false) End If حيث أن Else هنا تُنفّذ الأوامر التابعة لها في حال لم يتحقّق الشرط. مثال لنطبّق التعليمة الجديدة على الخلية A3 ونضع القيمة السابقة في حال تحقّق الشرط، والقيمة B في حال عدم تحقّقه، ونكتب الشرط بالصيغة التالية: Sub test_if() IF Range("A3").Value = "الصحي" Then Range("D3").Value = "A" Else Range("D3").Value = "B" End IF End Sub تعليمة الشروط المتداخلة IF/Elseif/Else تعمل هذه التعلمية على تطبيق شروط متعددة على الخلية، بحيث إذا لم يتحقّق الشرط الأول، ننتقل للشرط الثاني، ثم للثالث وهكذا. وتكون التعليمة بالصيغة التالية: IF condition Then codes (if the first condition is true) Else IF condition Then codes (if the second condition is true) Else codes (if all conditions are false) End If مثال لنطبق التعليمة الجديدة على الخلية A4 ونضع القيمة السابقة في حال تحقّق الشرط الأول، والقيمة C في حال كانت قيمتها هي "الزراعي"؛ أو القيمة D عند عدم تحقّق أي شرط سابق. ونكتب الشرط بالصيغة التالية: Sub test_if() IF Range("A4").Value = "الصحي" Then Range("D4").Value = "A" ElseIF Range("A4").Value = "الزراعي" Then Range("D4").Value = "C" Else Range("D4").Value = "D" End IF End Sub تعليمة IF الشرطية مع التعليمات AND/OR إذا أردنا أن ننفذ عمليات على الخلايا في حال تحقّق عدة شروط مع بعضها، نستخدم التعليمة AND مع تعليمة IF الشرطيّة؛ أما في حال أردنا أن ننفذ عمليات على الخلايا في حال تحقّق أحد الشروط، فسنستخدم التعليمة OR معها، لتصبح الصيغة: IF condition1 AND/OR condition2 AND/OR condition3 Then codes (if all conditions are true with AND) codes (if one of conditions are true with OR) Else codes (if all conditions are false) End If مثال لنطبّق أكثر من شرط على الخلية A5، ونضع القيمة E في حال تحقّق الشروط، أو القيمة F في حال عدم تحقّقها، ونكتب الشرط بالصيغة التالية: Sub test_if() IF Range("A5").Value = "الصحي" And Range("C5").Value=11 Then Range("D5").Value = "E" Else Range("D5").Value = "F" End IF End Sub التعليمة الشرطية Select Case تُستعمل هذه التعليمة إذا أردنا فحص عدة شروط على خلية واحدة، وتنفيذ التعليمة المقابلة للشرط في حال تحقّقه. حيث نلاحظ أنّه يمكن تنفيذ هذه العملية عن طريق التعليمة IF/Elseif/Else، ولكن التكرار الكثير للتعليمة IF في الشيفرة البرمجية سيزيد من حجم العمليات في الإجراء، كما سيؤدي إلى بطء تنفيذه، لكن باستخدام التعليمة Select Case، فسنقلل من حجم الشيفرة البرمجية وبالتالي تصبح عمليةً أكثر من التعليمة السابقة. الصيغة العامة للتعليمة Select case Element(object) Case The first case codes (if the case is true) Case The second case codes (if the case is true) Case Else codes (If all cases are false) End Select Element: العنصر الذي نُطبّق الاستعلام عليه للتحقّق. The first case: تمثل شرط التحقّق من القيمة الأولى أو قيمة الفحص الأولى. The second case: تمثل شرط التحقّق من القيمة الثانية أو قيمة الفحص الثانية. Code: التعليمات التي ستُنفَّذ عند تحقّق الحالة السابقة له. مثال لدينا الجدول التالي الذي يحتوي على الترتيب التالي، والذي يمثّل أيام الأسبوع. على فرض أنّ السبت هو اليوم الأول، نريد فحص القيمة في الخلية وإعادة ما يقابلها من أيام الأسبوع، ونطبق الصيغة التالية على الخلية A8: Sub day_name() Select Case Range("A8").value Case 1 Range("B8").value="السبت" Case 2 Range("B8").value="الأحد" Case 3 Range("B8").value="الإثنين" Case 4 Range("B8").value="الثلاثاء" Case 5 Range("B8").value="الأربعاء" Case 6 Range("B8").value="الخميس" Case 7 Range("B8").value="الجمعة" End Select End Sub عندما تكون الأوامر التي ستُنفّذها الحالة Case متشابهةً في أكثر من حالة، فسيمكننا اختصار الإجراء وتجميع الحالات ذات الأوامر المتشابهة في حالة واحدة، وذلك أيضًا يقلل من حجم الشيفرة، بحيث يصبح شكل العملية بالصيغة التالية: Select case Element(object) Case The first case, The second case, The third case Code Case The fourth case, The fifth case Code Case Else Code End Select بالعودة إلى مثالنا السابق وبفرض أن يومي الجمعة والسبت هما أيام عطلة وباقي الأيام أيام عمل، وأردنا تطبيق العملية السابقة على البيانات لمعرفة إذا كان ترتيب اليوم يقابل يوم عمل أو يوم عطلة نُطبّق التعليمة السابقة على الخلايا C2 وC5، لتصبح لدينا التعليمة كالتالي: Select Case Range("A8").Value Case 1, 2 Range("C5").Value = "يوم عطلة" Case 3, 4, 5, 6, 7 Range("C5").Value = "يوم عمل" End Select بتكرار العمليات السابقة في الخلية C2، نجد أن الشيفرة تعمل بطريقة صحيحة، ولكن بما أن شرط تحقُّق الحالة هو عبارة عن أرقام تراتبية، يمكننا الاختصار أكثر وكتابة التعليمات بالشكل التالي: Case 3 To 7 Range("C5").Value = "يوم عمل" كما يمكن كتابتها بالشكل التالي في حال كانت قيم المطابقة عددية، أي قابلة للقياس: Case IS<2 Range("C5").Value = "يوم عمل" كل الصيغ السابقة تؤدي نفس العمل ولكن تختلف السرعة في التنفيذ. مثال تطبيقي لكل ما سبق لدينا الملف التالي ونريد كتابة إجراء يعمل على فحص البيانات المُدخلة في الخلايا وإعطاء رسالة في حال كانت إحدى البيانات فارغة أو ترحيل البيانات إلى صفحة ثانية في حال كانت البيانات كاملةً عن طريق زر إدخال. في البداية نضع اسمًا للإجراء الذي سنعمل عليه وليكن DataEntry، ثم نُعرّف المتغيرات التي ستحفظ نتيجة الاستعلامات عن قيم إدخال الخلايا التي نعمل عليها. حيث لدينا ثلاثة أنواع من المتغيرات، وهي: رقمي طويلLong، ونصّي String، وتاريخ Date. بحيث ستتكون لدينا الصيغ التالية: Sub DataEntry() Dim name As String Dim nationalID As Long Dim bearthday As Date Dim place_of_birth As String name = Worksheets("صفحة الإدخال").Range("A1").Value nationalID = Worksheets("صفحة الإدخال").Range("A2").Value bearthday = Worksheets("صفحة الإدخال").Range("A3").Value place_of_birth = Worksheets("صفحة الإدخال").Range("A4").Value End Sub نضيف الآن عمليات ترحيل البيانات إلى صفحة البيانات عند الضغط على الزر إدخال، ونضيف إلى الشيفرة التعليمات التالية: Worksheets("البيانات").Range("A2").Value = name Worksheets("البيانات ").Range("B2").Value = nationalID Worksheets("البيانات ").Range("C2").Value = bearthday Worksheets("البيانات ").Range("D2").Value = place_of_birth إلى هنا نكون قد أنجزنا الجزء الأول من المطلوب ولكن ينقصه أمر أساسي، وهو أنه عند إضافة بيانات جديدة يجب أن تعمل الشيفرة أولًا على إضافة صف جديد، ثم تُرحّل البيانات إلى صفحة البيانات كي لا تُستبدل البيانات القديمة بالبيانات الجديدة، ولهذا سنحتاج إلى التعليمة التالية: Worksheets("البيانات").Range("2:2").Insert يعمل الأمر insert على إضافة خلايا ضمن النطاق المحدد في العنصر Range، وقد وضعنا المجال 2:2 لأننا نريد إضافة صف كامل. بعد إضافة الصف وترحيل البيانات إليه، فلابد من تفريغ خلايا الإدخال عن طريق الإجراء وذلك عن طريق التعليمات التالية: Worksheets("صفحة الإدخال ").Range("A1").ClearContents Worksheets("صفحة الإدخال ").Range("A2").ClearContents Worksheets("صفحة الإدخال ").Range("A3").ClearContents Worksheets("صفحة الإدخال ").Range("A4").ClearContents حيث يعمل الأمر ClearContents على تفريغ محتوى الخلية. بقي لدينا إضافة شرط فحص قيم الخلايا قبل ترحيل البيانات، ويجب ألّا تكون أي خلية من خلايا الإدخال فارغة، لذا نستعمل التعليمة OR مع التعليمة IF لفحص جميع الخلايا بشرط واحد، إذ يجب الانتباه إلى أن الخلايا النصية تُوازَن بالفراغ، أما الخلايا الرقمية فنوازنها بالقيمة 0 للتأكد أنها ليست فارغة، بحيث تكون الصيغة كالتالي: If name = "" Or nationalID = 0 Or bearthday = 0 Or place_of_birth = "" Then MsgBox "البيانات غير كاملة" بهذا تكون الشيفرة قد أصبحت جاهزةً لإجراء عملية الإدخال كما هو مطلوب والإجراء كاملًا هو التالي: Sub DataEntry() Dim name As String Dim nationalID As Long Dim bearthday As Date Dim place_of_birth As String name = Worksheets("صفحة الإدخال").Range("B1").Value nationalID = Worksheets("صفحة الإدخال").Range("B2").Value bearthday = Worksheets("صفحة الإدخال").Range("B3").Value place_of_birth = Worksheets("صفحة الإدخال").Range("B4").Value If name = "" Or nationalID = 0 Or bearthday = 0 Or place_of_birth = "" Then MsgBox "البيانات غير كاملة" Else Worksheets("البيانات").Range("2:2").Insert Worksheets("البيانات").Range("A2").Value = name Worksheets("البيانات").Range("B2").Value = nationalID Worksheets("البيانات").Range("C2").Value = bearthday Worksheets("البيانات").Range("D2").Value = place_of_birth Worksheets("صفحة الإدخال").Range("B1").ClearContents Worksheets("صفحة الإدخال").Range("B2").ClearContents Worksheets("صفحة الإدخال").Range("B3").ClearContents Worksheets("صفحة الإدخال").Range("B4").ClearContents End If End Sub خاتمة توفر لنا الشروط ضبطًا كبيرًا للعمليات بجميع أنواعها فهي تُجبر الشيفرة على تنفيذ العمليات وفق مسار معين كما أنها توفر الوقت اللازم لمعالجة العمليات التي لا تحقّق الشرط ضمن الشيفرة، لذلك يصبح تنفيذ الشيفرة أسرع، وتصبح العمليات أكثر دقة، مما يضمن لنا الحصول على بيانات تخدم هدفنا والتخلّص من أخطاء الإدخال. اقرأ أيضًا مدخل إلى البرمجة باستخدام VBA في مايكروسوفت إكسل. المتغيرات وأهم العناصر في برمجة VBA في مايكروسوفت إكسل. التفاعل مع المستخدم في مايكروسوفت إكسل باستخدام VBA الحلقات التكرارية في مايكروسوفت إكسل باستخدام VBA.
  6. عند كتابة الإجراءات نُجهّز كل شيء للتعامل مع أوامر المستخدم النهائي للتطبيق، ولكن بغض النظر عن مدى خبرتك في كتابة الشيفرات في VBA، فإنّ الأخطاء دائمًا ستكون جزءًا من الشيفرة سواءً كنت مبتدئًا أو خبيرًا، ولكن الفرق هنا بين المبتدئ والخبير هو معرفة كيفية التعامل مع الأخطاء واستخدامها فعّالية. أنواع الأخطاء في البداية لابد لنا من معرفة الأنواع المختلفة للأخطاء التي من المحتمل أن تواجهنا في عملية البرمجة، فهناك أربعة أنواع من الأخطاء في VBA وهي: أخطاء في بنية التركيب البرمجي (الشيفرة البرمجية) Syntax errors. أخطاء التجميع Compilation errors. أخطاء التشغيل Runtime errors. أخطاء منطقية Logical Errors. أخطاء في بنية التركيب البرمجي Syntax errors هي أخطاء تحدث في بناء الشيفرة، مثل: نسيان قوس مفتوح، أو نسيان كتابة جزء من تعليمة. نجد في الإجراء الموضَّح بالصورة أن التركيب خاطئ، حيث أنّ الشرط يفتقد لكلمة Then، وعند كتابة التعليمات في VBA، فسيتحقق المحرّر من كل الجملة بمجرد الضغط على الزر Enter، فإذا وجد شيئًا مفقودًا في بناء التركيب، فسيعرض رسالةً على الفور تحتوي بعض النص الذي يمكن أن يساعدك في فهم الجزء المفقود. للتأكد من رؤية المحرّر لأخطاء التركيب البرمجي كلما كان هناك شيء مفقود، فنحتاج إلى التأكد من تمكين التحقّق من بناء الجملة Auto syntax check، وذلك من قائمة Tools في واجهة المحرّر، حيث نضغط على الخيار options لتظهر لنا النافذة التالية: نتأكد من تبويب Editor بأن الخيارAuto syntax check مُفعّل، فإذا كان غير مُفعّل فإن المحرّر سيُحدد لك السطر الذي يحوي الخطأ ويُلّونَه بلون أحمر ولكن بدون إعلامنا ما هو نوع الخطأ. أخطاء التجميع Compilation errors تحدث عندما يكون هناك جزء مفقود من النص ومطلوب في نفس الوقت، تتشابه هذه الأخطاء قليلًا مع المجموعة السابقة لكن الفرق بينهما بينهما يكمن في كون الأخطاء في بنية التركيب تُظهر الخطأ في حال كان السطر البرمجي فيه جزء مفقود، أمّا أخطاء التجميع فتظهر عند تشغيل الشيفرة ويكون سطر بالكامل مفقود، أي أن صيغة الشيفرة صحيحة في سطر ما ولكنها غير صحيحة عند معالجة جميع شيفرة الإجراء أو المشروع ككتلة واحدة، ومن الأمثلة على ذلك: تعليمة IF الشرطيّة بدون عبارة End IF المقابلة لها. حلقة For التكرارية بدون عبارة Next المقابلة لها. استدعاء إجراء غير موجود، أو موجود ولكن فيه معلومات خاطئة. عدم تعريف أحد المتغيّر ات. أخطاء التشغيل Runtime errors هي الأخطاء التي تحدث أثناء تشغيل الشيفرة، وذلك عندما نكون قد تجاوزنا النوعين السابقين من الأخطاء، أي في حال وجود خطأ من أحدهما فله أولوية الظهور بين الأخطاء ولا يظهر خطأ التشغيل قبل معالجته، ومن الأمثلة على الأخطاء وقت التشغيل: إدخال بعض البيانات في صفحة ما ضمن الملف الذي نعمل عليه ولكن هذه الصفحة غير موجودة (سواءً حُذفت أو تغيّر اسمها). تصميم إجراء يحتوي عمليات على ملف ما وعند التشغيل لم يَجِد المحرّر هذا الملف، عندها نحصل على خطأ التشغيل. في هذا النوع من الأخطاء نجد أن المحرّر سيُظهر لنا نافذةً تحتوي على خطأ من النوع أخطاء التشغيل Runtime errors، ولكنها مفيدة أكثر من النوعين السابقين، حيث نجد أن محتوى الرسالة هو تفصيل شبه كامل عن الخطأ وسببه، وعند الضغط على الزر Debug، فسيعمل المحرّر على تمييز جزء الشيفرة الذي يؤدي إلى الخطأ. أخطاء منطقية Logical Errors لا تؤدي هذه الأخطاء إلى إيقاف تنفيذ الشيفرة ولكنها قد تؤدي إلى نتائج خاطئة يمكن أن تكون أصعب أنواع الأخطاء اكتشافًا، وبالتالي فإن إصلاحها يكون أصعب، حيث أن المحرّر لا يستطيع تمييزها وتحتاج إلى الإصلاح اليدوي، أمثلة على ذلك: تعريف متغيّرين تجري عليهما عملية جمع ضمن إجراء ما وعند كتابة العملية وضع إشارة الضرب بدل إشارة الجمع بين المتغيّرين. كتابة حلقة غير منتهية مثل فحص الخلايا الفارغة في عمود، ولم نضع له شرط يحدد قيمة النهاية للفحص. معالجة الأخطاء هنالك ثلاث طرق للمعالجة يمكننا استخدامها وهي: عرض الخطأ وإيقاف الشيفرة. تجاهل الخطأ وإكمال الشيفرة. تجاهل الخطأ والذهاب لموقع معين في الشيفرة. وجميعها تأخذ الصيغة العامة التالية: On Error statement حيث أن On Error تفيد توجيه المحرّر إلى ما نريد تنفيذه لمعالجة الخطأ عند وجوده، وstatement ما نريد من المحرّر فعله لمعالجته، ولدينا 4 حالات للمعالجة: on Error Go To 0 on Error Resume Next on Error Go To [Label] on Error Go To -1 المعالجة باستخدام on Error Go To 0 هو السلوك الافتراضي في VBA، بمعنى آخر إذا كنّا لا نستعمل أيًا من أساليب معالجة الأخطاء، فسينفّذ هذا النوع تلقائيًا عند وجود خطأ ما، حيث أن مُعالج الشيفرة يتوقف ويعرض رسالة الخطأ، وهنا يتطلب التطبيق تدخل المستخدم مع الشيفرة لمعالجة الخطأ حتى يتمكّن من متابعة تنفيذ الشيفرة. مثال ليكن لدينا الإجراء التالي الذي يعمل على حساب بعض المعادلات Sub UsingDefault() Dim x As Long, y As Long x = 6 y = 6 / 0 End Sub عند تشغيل الشيفرة التالية، فستظهر رسالة الخطأ من النوع on Error Go To 0. يفيدنا هذا النوع من المعالجات في تحديد موقع الخطأ ولكن له عدة مساوئ، حيث لا يمكن للمستخدِم الاستمرار بالعمل على التطبيق دون إصلاح هذا الخطأ، ويُعَد التطبيق غير مناسب للمستخدِم النهائي، وهو يُعَد من الأخطاء غير المهنية وتجعل التطبيق غير مستقر. المعالجة باستخدام on Error Resume Next يؤدي استخدام هذا النوع إلى تجاهل السطر الذي يحتوي على الخطأ والمتابعة بدون تنفيذه. هناك مواضع محددة قد يكون هذا النوع من الحلول مفيدًا، ولكن في الغالب يُفضّل عدم استخدامه إلا للضرورة، لأنه من الممكن أن يؤثِّر الخطأ على كتلة التطبيق وينتهي بنا المطاف بالحصول على بيانات خاطئة أو غير صالحة، حيث أن المستخدِم لن يعلم بحدوث الخطأ أثناء التشغيل. مثال لنأخذ نفس المثال السابق، حيث عند استعمال هذه الصيغة يصبح شكل الإجراء كالتالي: Sub UsingDefault() On Error Resume Next Dim x As Long, y As Long x = 6 y = 6 / 0 End Sub نلاحظ أنه عند تشغيل الشيفرة بدون التعليمة، فسيُظهر لنا المحرّر رسالة الخطأ، أي أنه يعمل على النوع on Error Go To 0؛ أما عند وضع التعليمة on Error Resume Next فقد تجاهلَ المحرّر سطر الخطأ وأكمل قراءة الشيفرة. عند استخدامنا للتعليمة On Error Resume Next فإن الشيفرة تتجاهل الخطأ الذي نتوقع حدوثه، ولكن ماذا لو كان في الشيفرة أخطاء أخرى لم نتوقعها، هنا ستتجاهلها الشيفرة أيضًا. لذلك يجب أن نُعيد سياق فحص الأخطاء إلى الوضع الافتراضي لذا نستخدم هنا on Error Go To 0 بعد التعليمة التي نريد تجاهل خطأها. مثال آخر ليكن لدينا الإجراء التالي الذي يحدد الخلايا الفارغة ضمن عدة خلايا مُحددة: Sub SelectFormulaCells() Dim x As Long, y As Long On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select On Error GoTo 0 X=7 Y=7/0 End Sub عندما تكون الخلايا المحددة جميعها غير فارغة، فسينتج لدينا خطأ تشغيل، وهنا سيتجاهل المحرّر الخطأ الأول ولكن لا يتجاهل الثاني ويُظهر خطأ تشغيل عند السطر Y=7/0. المعالجة باستخدام ‪on Error Go To [Label] هي طريقة يمكنك من خلالها تحديد ما تريد فعله في حال وجود خطأ في الشيفرة البرمجية والصيغة العامة لها: Sub Test() On Error GoTo Label: this line causes an error (سطر يحتوي على خطأ) Exit Sub Label: code to handle the error End Sub حيث أن: Exit sub: تفيد هنا عدم انتقال الشيفرة للجزء التالي إذا كانت التعليمات سليمةً ولا تحوي أخطاء. label: العنوان الذي ستنتقل إليه الشيفرة عند وجود خطأ في القسم الأول، ويمكن أن يحتوي رسالةً أو تعليمات جديدة. مثال Sub Errorhandler() Dim x As Long, y As Long On Error GoTo ErrMsg X = 12 Y = 20 / 0 Exit Sub ErrMsg: MsgBox "There seems to be an error" End Sub عند حدوث خطأ ما هنا فستُنفذ الأسطر قبل سطر الخطأ، حيث أنه يُسند القيمة 12 إلى المتغيّر x ولكن عند حدوث الخطأ لا تُسند القيمة للمتغيّر y، وبالتالي لا يُنفذ باقي الشيفرة أي أنه أيضًا لا تُسند القيمة إلى z، عندها ينتقل تنفيذ الشيفرة إلى الجزء ErrMsg المعالجة باستخدام on Error Go To -1 يُستخدZم هذا النوع لمسح الخطأ الحالي من ذاكرة VBA بدلًا من تحديد سلوك معيّن، حيث أن ذاكرة VBA تسمح لنا بالتعامل مع خطأ واحد وتحفظه بالذاكرة، إذ لديها مكان واحد لحفظ الأخطاء، وتعمل هذه التعليمة على تفريغ هذا المكان للخطأ التالي إن وُجِد، ومن غير المحتمل أن نستخدِم هذه التعليمة في عملنا. مثال ليكن لدينا جزء من إجراء كالتالي: Sub Errorhandler() Dim x As Long, y As Long, Z As Long, A As Long, B As Long On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "There seems to be an error again" End Sub عند معالجة الخطأ الأول تستمر الشيفرة بتنفيذ ما تحتوي الأسطر التي بعد قسم معالجة الخطأ، ولكن عند الوصول لخطأ ثانٍ فسنحصل على خطأ من أخطاء التشغيل Runtime errors، بحيث لا ينقلنا المحرّر إلى جزء المعالجة الثاني ولهذا يجب علينا تفريغ الذاكرة أولًا وذلك عن طريق التعليمة On Error GoTo -1، عندها ينتقل الإجراء في الخطأ الثاني إلى قسم معالجة الخطأ الثاني ولا يظهر خطأ التشغيل Runtime error، وتصبح الشيفرة كالتالي: Sub Errorhandler() Dim x As Long, y As Long, Z As Long, A As Long, B As Long On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "There seems to be an error again" End Sub خاتمة إن للأخطاء أهمية كبيرة في عمليات البرمجة فهي تعمل على تصحيح عمل الشيفرة ولكن بطريقة غير مباشرة، حيث تكمن أهميتها في اكتشاف المشاكل والأجزاء المفقودة من التعليمات، كما أن التطبيقات موجّهة لمستخدمين ربّما لا يكون لديهم معرفة بتعديل الأخطاء، أو حتى فهمها لذا يجب علينا أن نُعالج كافة الأخطاء وتقدير احتمالات حدوثها، ووضع حلول مسبقة لها ولهذا تُعَد معالجة الأخطاء من المهام الأساسيّة في عمليّة صناعة البرمجيات، ويجب إتقانها جيدًا لصناعة تطبيقات خالية من العيوب. اقرأ أيضًا الحلقات التكرارية في مايكروسوفت إكسل باستخدام VBA التفاعل مع المستخدم في مايكروسوفت إكسل باستخدام VBA العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA
  7. في الكثير من الأحيان نحتاج إلى إدراج جداول ومخططات من برنامج إكسل إلى برنامج بوربوينت بهدف عرض إحصائيات معينة وإنشاء المخططات داخل العروض التقديمية. وعند وجود عمليات تحرير متكررة على هذه الجداول والمخططات، سيضطر المستخدم إلى تحريرها أولاً على برنامج إكسل ومن ثم على برنامج بوربوينت، الأمر الذي يستغرق الكثير من الوقت. لكن يُمكن للمستخدم الاستفادة من التكامل الذي توفره أوفيس بين برامجها، وذلك من خلال ربط الجداول والمخططات بين البرنامجين بكل سهولة، بحيث يُصبح بالإمكان تحرير جدول الإكسل فقط بواسطة المستخدم، بينما سيتم تحرير نفس الجدول على بوربوينت بصورة تلقائية من قبل البرنامج، وكذلك الحال بالنسبة للمخططات. دعونا نبدأ بشرح كيفية ربط جدول الإكسل ببرنامج بوربوينت: نفترض أن لدينا ملف إكسل يتضمن بعض البيانات ومخزن على سطح المكتب باسم A، ونريد إدراج هذا الملف إلى بوربوينت، بحيث عند التعديل عليه في أي مرة يتم تعديله على برنامج بوربوينت تلقائياً. الصورة التالية توضح البيانات المدرجة داخل ملف الإكسل: في البداية افتح برنامج بوربوينت وتوجه إلى شريط القوائم، ومن قائمة Insert اختر Object: ستلاحظ ظهور مربع حوار باسم Insert Object. اضغط Create from file، ثم حدد ملف الإكسل الذي ترغب بربطه من خلال زر Browse. سأقوم بتحديد ملف الإكسل المخزن على سطح المكتب باسم A والذي أرغب بإدراجه: بعد تحديد الملف، نأتي إلى ربط الملف من خلال وضع علامة صح على مربع Link الظاهر أسفل كلمة Browse كما هو موضح في الصور ثم اضغط موافق. بعد ذلك سيتم إدراج ملف الإكسل كما هو داخل الشريحة الحالية في برنامج بوربوينت. والآن نفترض أنك بعدة فترة زمنية معينة أجريت بعض التعديلات على ملف الإكسل المسمى A وقمت بحفظ البيانات، ستلاحظ عند فتح عرض بوربوينت الذي قمت بربط الجدول به ظهور رسالة تفيد بحصول تغييرات على الملف وفي حال رغبتك بتحديث القيم فينبغي عليك الضغط على Update، بعدها سيظهر لك الجدول داخل بوربوينت مع التعديلات الأخيرة التي تمت عليه في الإكسل. فمثلاً نفترض أننا قمنا بتعديل كل القيم الخاصة بعمود PHYSICS داخل الإكسل إلى 50، سنلاحظ أن القيم تم تعديلها تلقائيا في ملف البوربوينت. كما يُمكنك القيام ببعض التعديلات على الجدول من خلال الإعدادات العامة للملف والتي يُمكن الوصول لها من خلال الضغط على File من شريط القوائم، ثم اضغط Edit link to file بالأسفل. ستلاحظ وجود عدة خيارات وهي: للإغلاق: closeلتحديث الجدول: update nowلفتح ملف الإكسل الأصلي: Open sourceلتغيير ملف الأكسل المرتبط: Change sourceلإزالة الارتباط: Break linkكما يوجد بالأسفل مربع صغير لعملية التحديث التلقائي للجدول Automatic update، ويُمكنك تغييره بحسب ما يتناسب معك، عن طريق إزالة علامة "صح" وذلك في حال رغبتك بإجراء التعديل بطريقة يدوية فقط. ملاحظة: يُمكنك تنفيذ العملية السابقة بطريقة أخرى عند رغبتك بنسخ جزء معين من الجدول كالتالي: بعد فتح ملف الإكسل، حدد الجزء المطلوب من الجدول والذي ترغب بإدراجه في بوربوينت، وبزر الفأرة الأيمن اضغط نسخ أو CTRL+C من لوحة المفاتيح. اذهب إلى برنامج بوربوينت ومن شريط الأدوات في HOME نضغط Paste ثم Paste special بعدها نؤشر على خيار Paste link ثم Microsoft excel worksheet object ثم اضغط OK. سنلاحظ انتقال الجزء المحدد من جدول الإكسل إلى بوربوينت مع وجود خاصية الربط التي تسمح بالتعديل التلقائي. والآن دعونا ننتقل لطريقة ربط مخطط إكسل ببرنامج بوربوينت: نفترض أن لدينا مخطط جاهز ببرنامج إكسل ونرغب بإدراجه في بوربوينت، مع السماح بتعديل المخطط تلقائياً في بوربوينت عند إجراء أي تعديلات على مخطط الإكسل. كل ما عليك فعله هو نسخ المخطط في برنامج إكسل، ثم انتقل إلى برنامج بوربوينت، ومن شريط الأدوات في قائمة HOME اختر Paste ثم ستلاحظ ظهور 5 أيقونات لنسخ المخطط وهي موضحة كالتالي: الأيقونة الأولى: سيتم فيها لصق المخطط دون ربط البيانات بين البرنامجين، ومظهر المخطط سيكون بحسب تنسيق بوربوينت.الأيقونة الثانية: سيتم فيها لصق المخطط دون ربط البيانات بين البرنامجين، ومظهر المخطط سيكون بحسب تنسيق إكسل.الأيقونة الثالثة: سيتم فيها لصق المخطط مع ربط البيانات بين البرنامجين، ومظهر المخطط سيكون بحسب تنسيق بوربوينت.الأيقونة الرابعة: سيتم فيها لصق المخطط مع ربط البيانات بين البرنامجين، ومظهر المخطط سيكون بحسب تنسيق إكسل.الأيقونة الخامسة: سيتم فيها لصق المخطط كصورة فقط، وبالتالي لن يكون بإمكانك التعديل على البيانات أو المظهر.ما يهمنا في هذا الدرس هو الأيقونة الثالثة والرابعة، وهما تُقدمان نفس الوظيفة لكن مع فرق الألوان وذلك في حال اختيارك لمظهر مخصص في بوربوينت، وبأي حال ستلاحظ انتقال المخطط إلى بوربوينت كما في الصورة عند اختيارك لأي منهما. وبهذا نكون انتهينا من الدرس ومعرفة كيفية ربط الجداول والمخططات بين برنامجي إكسل وبوربوينت.
×
×
  • أضف...