Professional Documents
Culture Documents
0
نضال الشامي
أساسيات البرمجة باستخدام
Excel VBA
المؤلف
نضال الشامي
اإلصدار األول
2020
الغالف
نضال الشامي
صورة الغالف
من االنترنت
م ف ظة لصا بها
جد ل الم ت يات
جدول المحتويات
1 مقدمة
مدخل إلى 7 ......................................................................................... Excel VBA 1.
إذن ،ما هي VBA؟ 7 ................. ................................ ................................ ................................
أهم العناصر المفاهيم في لغة VBAفي إكسيل 8 ................... ................................ ................................
ال دات البرمجية 8 ................................ ................................ ................................ VBA Module
اإلجرائيات 8 .......................................... ................................ ................................ Procedures
اإلجرائية الفرعية 8 .............................. ................................ ................................ Sub Procedure
الدالة 9 .................... ................................ ................................ ................................ Function
البرمجة كائنية الت جه 10.................................. ................................ Object oriented Programming
نم ذج الكائنات 11................................. ................................ ................................ Object Model
التجميعات/المجم عات 12............................ ................................ ................................ Collections
خصائص الكائنات 13...................... ................................ ................................ Objects Properties
المتغيرات 13............. ................................ ................................ ................................ Variables
االستخدامات/الد ال 13.................................. ................................ ................................ Methods
محرر األوامر )15 ......................................................................................... (VBE 2.
ما ه م رر أ امر فيج ال بيسيك إلكسيل ) Visual Basic Editor (VBE؟ 15.................. ................................
كيفية إظهار م رر األك اد 15.................................. ................................ ................................ VBE
عناصر ن افذ م رر األك اد 17............................... ................................ ................................ VBE
نافذة الك د 19..................................... ................................ ................................ Code Window
نافذة الخصائص 19........................ ................................ ................................ Properties Window
نافذة األ امر الف رية 19.................. ................................ ................................ Immediate Window
كتابة برنامجك األ ل بالـ 21.................................... ................................ ................................ VBA
vii
جد ل الم ت يات
viii
جد ل الم ت يات
ix
جد ل الم ت يات
x
جد ل الم ت يات
xi
جد ل الم ت يات
xii
جد ل الم ت يات
xiii
جد ل الم ت يات
xiv
المقدمة
مقدمة
تُعد لغة البرمجة؛ فيج ال بيسيك للتطبيقات ) Visual Basic for Applications (VBAمن األد ات
الق ية جدا ً التي يمكن استخدامها مع مجم عة برامج أ فيس ألتمتة المهام المتكررة اضافة ميزات
جديدة مثل انشاء د ال جديدة يمكن استخدامها ضمن أ راق العمل في اكسيل أ انشاء برامج خاصة
تعمل ضمن البرنامج المضيف (مثل االكسيل) فمثالً يمكنك انشاء برنامج إلدارة العمالء أ اصدار
الف اتير أ ادخال البيانات غيرها .قد أعلنت شركة مايكر س فت في أكثر من مناسبة بأنها س ف
تستمر بدعم لغة VBAأنها ال تن ي التخلي عنها ال ص ة لإلشاعات التي انتشرت ذات مرة بأنها
تن ي التخلي عن لغة .VBA
على الرغم من الق ة المر نة التي ت فرها لغة VBAإال أنك س ف تتفاجأ من مدى سه لتها .يث
أنها تقدم لك العديد من األد ات التي تسهل عليك كتابة برامجك يعتبر م رر األك اد الخاص بـ VBA
أ د أفضل البيئات البرمجية أكثرها سه لة مر نة يث يتمتع بنظام مساعدة Helpفعال يساعدك في
أثناء كتابة أك ادك من خالل ميزات مثل االكمال التلقائي اكتشاف األخطاء الف ري غيرها من
الميزات.
بل إنك تستطيع انشاء بعض برامج الـ VBAبد ن كتابة سطر برمجي ا د ذلك عن طريق استخدام
مسجل الماكر ! يث أنك في هذه ال الة تق م بتشغيل مسجل الماكر ثم تق م بأداء المهام التي تريد أن
يق م الماكر بتكرارها عند االنتهاء ت قف التسجيل تق م ب فظ الماكر الستدعائه عند ال اجة .هذه
ال سيلة فعالة ليس فقط إلنجاز أعمالك بسرعة دقة ،بل أيضا ً للتعلم يث أنك إذا أردت أن تعرف كيفية
القيام بعملية معينة من خالل الـ VBAفإنه بإمكانك أن تُشغل مسجل الماكر ثم تق م بأداء تلك العملية
ثم ت قف المسجل تعرض الك د الم افق للماكر الذي تم تسجيله.
1
المقدمة
من الميزات العظيمة للغة VBAأن الك د الخاص بها يستخدم كلمات جمل اض ة قريبة من
استخدامنا الي مي مما يسهل كتابة قراءة الك د .خذ عندك الك د التالي كمثال:
Worksheets("sheet1").Activate
"!!Range("A1").Value = "Hello World
Range("A1").Interior.Color = vbGreen
يكفي أن يك ن لديك معرفة بأساسيات االكسيل لتدرك أن هذا الك د يق م بتنشيط رقة العمل Sheet1
ثم يكتب جملة "!! "Hello Worldبداخل الخلية A1يق م بتل ين تلك الخلية بالل ن األخضر ،تى
ل لم يكن لك خبرة مسبقة بأي من لغات البرمجة.
يغطي هذا الكتاب أساسيات برمجة االكسيل بلغة VBAمن الصفر ،انطالقا ً من فرضية أن القارئ ليس
له سابق خبرة بالبرمجة س ا ًء بلغة VBAأ غيرها .إذا لم يكن لك سابق خبرة بتسجيل استخدام دات
الماكر أ كتابة أك اد VBAفإن هذا الكتاب سيأخذ بيدك خط ة خط ة على طريق اجادة التعامل مع
هذه اللغة.
لقد اعتمدنا ف ي كتابة هذا الكتاب على تقديم المعل مة بأبسط شكل على تقديم أمثلة راعينا فيها قدر
المستطاع أن تك ن ذات فائدة عملية في نفس ال قت ت ضح المبدأ التي ُ ضعت ألجله .بالنسبة لألمثلة
فقد رأينا أن عدم تعقيدها يساهم في ص ل الفكرة بشكل أفضل للقارئ بد ن تشتيت ،لذلك فقد بسطنا
األمثلة قدر المستطاع بد ن اخالل بفكرة المثال أ بالمبدأ الذي ي ض ه المثال .من المفترض أنك إذا
فهمت المثال ال ُمعطى بشكل جيد فإنه س ف يك ن من السهل عليك تط ير المثال ليصبح أكثر تعقيداً.
على الرغم من أن هذا الكتاب مكت ب خصيصا ً لبرمجة االكسيل بلغة VBAإال أن إلمامك باألساسيات
المذك رة في الكتاب س ف يسهل عليك من تعلم برمجة برامج أخرى من طقم برامج أ فيس (مثل رد
أكسس) بلغة .VBAبل إن األساسيات المذك رة هنا س ف تساعدك في تعلم أي لغة برمجة أخرى مثل
بايث ن أ جافا سكربت.
تم تقسيم الكتاب إلى اثني عشر فصالً هي كالتالي:
-الفصل األول ،مدخل إلى : VBAفيه تم التطرق إلى أساسيات لغة VBAأهم العناصر المك نة
لها مثل ال دات النمطية الد ال االجرائيات كما تم شرح مفه م البرمجة كائنية الت جه
2
المقدمة
3
المقدمة
الفصل التاسع ،التعامل مع األخطاء :األخطاء من األم ر الشائعة جدا ً عند التعامل مع VBA -
مع أي لغة برمجة أخرى .في هذا الفصل تم التطرق ألن اع األخطاء التي يمكن أن تظهر
أثناء تشغيل برامج VBAكيفية ت ديد مكان الخطأ ثم التعامل معه بأكثر من طريقة .كما تم
التطرق في هذا الفصل لمفه م "إزالة الش ائب" Debuggingتم شرح العديد من التقنيات
التي يمكن استخدامها إلزالة ش ائب البرامج.
الفصل العاشر ،األحداث :ا دى طرق تنفيذ اجرائيات VBAهي تنفيذها تلقائيا ً عند د ث دث -
معين .ال دث ،Eventه ببساطة عبارة عن شيء دث لالكسيل .في هذا الفصل س ف
نتعرف على األ داث األكثر شي عا ً في االكسيل كيفية االستفادة منها في تنفيذ االجرائيات
بشكل تلقائي.
الفصل الحادي عشر ،التفاعل مع المستخدم من خالل دالتي MsgBoxو :InputBoxفيه -
تم عرض االت مختلفة لكل من دالة MsgBoxالتي تق م بعرض البيانات ضمن مربع ار
مع إمكانية أخذ تغذية راجعة من المستخدم ،دالة InputBoxالتي تستخدم إلدخال البيانات من
خالل مربع ار .إضافة إلى ذلك فقد تم التطرق لدالة Application.InputBoxالتي
تُستخدم الدخال أشياء مثل المعادالت أ مراجع النطاقات.
الفصل الثاني عشر ،النماذج :تعد النماذج User Formsمن ال سائل الجيدة إلدخال البيانات -
عرضها .يث أنك من خاللها تستطيع الت كم بكيفية ادخال البيانات من يث ترتيب ادخال
البيانات أ اختيار ال سيلة المناسبة لكل ن ع من البيانات المطل بة أ اجراء عملية الت قق من
االدخال للبيانات المدخلة غيرها من األشياء .يمكنك أيضا ً الت كم بكيفية عرض البيانات
بالشكل الذي يالئم طبيعة البيانات المعر ضة مما يعطيك مر نة عالية جدا ً في التعامل مع
البيانات .في هذا الفصل تم شرح كيفية انشاء النماذج كيفية إضافة عناصر الت كم عليها مثل
أزرار االختيار الق ائم المنسدلة غيرها ،كيفية برمجة عناصر النم ذج لالستجابة لأل داث
المختلفة مثل االستجابة للضغط على األزرار أ االختيار من القائمة المنسدلة.
4
المقدمة
المخططات ،اجادة التعامل مع المعادالت الد ال .يمكن لمن أ ب الرج ع لكتابنا " اكسيل 2019
– الدليل السهل" الكتساب مثل هذه المعرفة أ إلى أي كتاب آخر يشرح مبادئ إكسيل .كما يمكنك
متابعة د رتنا على الي تي ب " مهارات اكسيل من الصفر لال تراف" من خالل الرابط باألسفل.
في النهاية أتمنى أن يضيف هذا الكتاب جديدا ً للمكتبة العربية أن يك ن ذا ع ن بالنسبة للقراء
المهتمين.
نضال الشامي
غزة ،ن فمبر 2019
5
المقدمة
6
مدخل إلى VBA
الفصل األول
في هذا الفصل س ف نتعرف إلى أساسيات لغة البرمجة VBAلالكسيل س ف نتطرق إلى العناصر
األساسية المك نة لها مما يمهد الطريق للفص ل الال قة .المعل مات ال اردة في هذا الفصل مهمة جدا ً
تعتمد عليها بشكل كلي الفص ل القادمة لذا ننصح بقراءته بعناية قبل االنتقال لباقي الفص ل.
إذن ،ما هي VBA؟
لغة VBAهي اختصار لـ Visual Basic for Applicationهي لغة برمجة مقدمة من مايكر س فت
تستطيع من خاللها برمجة تطبيقات األ فيس مثل ال رد االكسيل باإلضافة لبعض البرامج األخرى
مثل أ ت كاد للقيام بمهام غير م ج دة في تلك البرامج .بالنسبة لالكسيل ،هناك العديد من المهام التي
تستطيع أن تق م بها VBAمثل:
أتمتة العمليات المتكررة الختصار ال قت الجهد. -
تط ير د ال جديدة غير م ج دة باالكسيل. -
انشاء نماذج لتسهيل ادخال عرض البيانات. -
انشاء ظائف إضافية Add-insلالكسيل. -
إضافة النص ص المتكررة مثل اسم الشركة أ عن ان االيميل غيرها من البيانات يث يمكنك -
برمجة ذلك تعيين زر إلدراج تلك النص ص بسه لة سرعة.
....غيرها الكثير -
7
الفصل األ ل
اإلجرائية الفرعية : Sub Procedureهي عبارة عن مجم عة من األ امر البرمجية التي تهدف إلى
ال ص ل إلى نتيجة م ددة .يجب أن تبدأ اإلجرائية بالكلمة المفتا ية Subثم اسم اإلجرائية متب عا ً
بق سين فارغين ) ( يلي ذلك الك د البرمجي تنتهي بجملة .End Subفيما يلي مثال على إجرائية تق م
بعرض رسالة التر يب ":"Hello VBA
)(Sub Hello_VBA
)"MsgBox ("Hello VBA
End Sub
كما تم ذكره سابقا ً ال ظ أن اإلجرائية بدأت بـ Subانتهت بـ End Subما بينهما الك د البرمجي
الخاص باإلجرائية ،في التنا الك د يق م بعرض مربع ار يعرض الجملة "."Hello VBA
اإلجرائية التي ال تظهر النتائج بالشكل المت قع يطلق عليها ( Substandardإجرائية د ن المست ى)
8
مدخل إلى VBA
الدالة :Functionهي أيضا ً عبارة عن إجرائية لكنها بخالف اإلجرائية الفرعية تق م بإرجاع قيمة
م ددة .بإمكانك استدعاء الدالة من داخل إجرائية أخرى أ استخدامها من داخل رقة العمل بنفس
طريقة استخدام د ال االكسيل المدمجة .Built-in functionsتبدأ الدالة بالكلمة المفتا ية Function
متب عا ً باسم الدالة ثم الك د لبرمجي للدالة تنتهي بالجملة .End Functionمن الممكن أن تأخذ الدالة
مدخالت (تسمى معامالت الدالة )Function parameters/argumentsلكنها في جميع األ ال
يجب أن ترجع قيمة م ددة .الدالة التالية هي مثال على دالة تق م بأخذ رقمين من المستخدم من ثم
ترجع اصل جمعهما:
)Function Add2Numbers(num1, num2
Add2Numbers = num1 + num2
End Function
ال ظ هنا أن الدالة قد تم تصميمها كي تأخذ معاملين هما num2 num1من ثم ترجع نتيجة جمعهما
من خالل المتغير Add2Numbersهنا مال ظة مهمة جدا ً هي أن القيمة التي ترجعها الدالة يجب
أن ي ملها متغير له نفس اسم الدالة.
مالحظة/////
بالمتغيات يف هذا الفصل ،أو انظر الفصل الرابع
ر المتغيات ،انظر الفقرة الخاصة
ر للمزيد حول
بعد ادخال الدالة ضمن إ دى ال دات البرمجية يصبح باإلمكان استخدامها من داخل أ راق العمل كما
يظهر لنا في الشكل .1-1كما أنه باإلمكان استدعاء الدالة من داخل اإلجرائيات الفرعية أ د ال أخرى.
Figure1-1
9
الفصل األ ل
في الك د التالي تم استدعاء الدالة Add2Numbersمن داخل اإلجرائية الفرعية TestAdd
)(Sub TestAdd
arg1 = 10
arg2 = 20
)result = Add2Numbers(arg1, arg2
MsgBox result
End Sub
فيج ال بيسيك للتطبيقات هي عبارة عن لغة برمجة كائنية الت جه Object Oriented
.Programming languageالمبدأ األساسي للغات البرمجة كائنية الت جه هي أن
التطبيقات/البرمجيات (في التنا اإلكسيل) تتك ن من العديد من الكائنات ،Objectsكل كائن له
مجم عة من الصفات/الخصائص Propertiesمجم عة من االستخدامات تسمى الد ال .Methods
االكسيل ي ت ي على العديد من الكائنات مثل الخاليا ،Cellsأ راق العمل ،Worksheetsالمخططات
،Chartsاألشكال ،Shapesغيرها الكثير.
بإمكانك أن تتعامل مع هذا المبدأ كما تتعامل مع أي كائن في ال ياة ال اقعية ،لنأخذ السيارة كمثال؛
السيارة ككائن لها مجم عة من الخصائص Propertiesالتي تصفها مثل الل ن ،الط ل ،العرض،
االرتفاع .لها مجم عة من االستخدامات/الطرق Methodمثل الت رك لألمام للخلف كما أن لها
مجم عة من األ داث Eventsالتي ت دد الة السيارة ال الية مثل أن السيارة مت قفة أ مت ركة هذه
األ داث يمكن استغاللها كقادح Triggerلتطبيق أ امر معينة عن بدء ال دث .الك د الذي يتم تطبيقه
عند ت قق دث معين يسمى .Event Handler
10
مدخل إلى VBA
االكسيل بالمثل ي ت ي على العديد من الكائنات التي لها خصائص د ال/طرق أ داث تطبق عليها؛
فمثالً المصنف Workbookه عبارة عن كائن له مجم عة من الخصائص Features/Properties
مثل اسم المصنف Nameجمه Sizeمجم عة من الد ال Methodsمثل فتح المصنف Open
فظ المصنف .Saveله مجم عة من األ داث التي يمكن أن تُطبق عليه ،مثل دث فتح أ اغالق
المصنف.
11
الفصل األ ل
التجميعات/المجموعات Collections
الكائنات من نفس الن ع يطلق عليها "مجم عة "Collectionفعلى سبيل المثال "مجم عة أ راق العمل
"Worksheets collectionت ت ي على جميع أ راق العمل بداخل المصنف مجم عة الجدا ل
الم رية PivotTables collectionت ت ي على جميع الجدا ل الم رية بداخل المصنف .جدير
بالمال ظة أن المجم عات Collectionsهي ب د ذاتها عبارة عن كائنات .Objects
تتم اإلشارة إلى كائن ما عن طريق ت ديد م قعه في التسلسل الهرمي للكائنات باستخدام النقطة كفاصلة.
فمثالً يمكن اإلشارة إلى المصنف Workbook.xlsxمن خالل:
)"Application.Workbooks (ً"Workbook1.xlsx
هنا تمت اإلشارة إلى المصنف Workbook1.xlsxضمن مجم عة المصنفات Workbook
،collectionيث تقع مجم عة المصنفات ضمن "كائن البرنامج ."Application objectلت سعة
ى آخر يمكن اإلشارة ل رقة العمل Sheet1ال اقعة ضمن المصنف هذا ال صف ليشمل مست ً
Workbook1.xlsxمن خالل:
)"Application.Workbooks("Workbook1.xlsx").Worksheets("Sheet1
للذهاب لمست ى آخر يمكن اإلشارة إلى خلية م ددة بداخل المصنف من خالل:
)"Application.Workbooks("Workbook1.xlsx").Worksheets("Sheet1").Range("A1
عند ذف مرجع م دد يستخدم االكسيل الكائنات النشطة .Active objectsفمثالً إذا كان المصنف
Workbook1.xlsxه المصنف النشط أردنا أن نشير للخلية A1الم ج دة في رقة العمل Sheet1
يمكن استخدام:
)"Worksheets("Sheet1").Range("A1
إذا كانت رقة العمل Sheet1هي رقة العمل النشطة فيمكن اإلشارة إلى الخلية A1من خالل:
)"Range("A1
12
مدخل إلى VBA
13
الفصل األ ل
ما تم ذكره في الفقرات السابقة يمثل المك نات األساسية للغة ،VBAتأكد من فهمك الجيد لتلك المفاهيم
قبل االنتقال للفص ل الال قة.
14
م رر األ امر VBE
الفصل الثاني
في هذا الفصل س ف نتعرف على م رر األك اد ،VBEالذي من خالله يتم ادخال أ تعديل الك د
البرمجي ل دات الماكر .كما سنق م بكتابة أ ل برنامج VBAسنتعرف على الطرق المختلفة
الستدعاء تشغيل الماكر .
ما هو محرر أوامر فيجوال بيسيك إلكسيل ) Visual Basic Editor (VBE؟
قد ال يعرف معظم مستخدمي االكسيل أن هناك جانبا ً خفيا لإلكسيل بخالف أ راق العمل المخططات
الجدا ل الم رية غيرها من األد ات .هذا الجانب ه م رر أ امر فيج ال بيسيك VBEيث أنه
يك ن مت اجدا ً د ما في الخلفية يتم تنفيذ أية أ امر م ج دة بداخله إذا استدعت ال اجة.
هاتان البيئتان تعمالن بشكل متزامن تتبادالن البيانات مع بعضهما البعض قتما استدعت ال اجة.
م رر VBEه عبارة عن بيئة تط ير برمجية Integrated Development Environment IDE
يث بإمكانك ادخال ،ت رير ،تنفيذ األك اد البرمجية الخاصة بلغة VBAمن خاللها.
كيفية إظهار محرر األكواد VBE
أسرع طريقة لل ص ل لم رر األك اد هي من خالل الضغط على زري .Alt+F11كما أنه باإلمكان
ال ص ل للم رر من خالل تب يب المط ر .Developerال يظهر تب يب المط ر بال ضع االفتراضي
انما يمكن اظهاره من خالل تخصيص شريط األد ات Ribbonمن خالل التالي:
15
الفصل الثاني
-1انقر بزر الما س األيمن ف ق أي مكان على شريط األد ات Ribbonثم اختر تخصيص
الشريط Customize the Ribbon
-2س ف يظهر لك مربع ال ار "خيارات اكسيل ،"Excel Optionsفي الجانب األيمن من مربع
ال ار صع عالمة الت ديد على المط ر Developerكما في الشكل 2-1
Figure2-1
16
م رر األ امر VBE
لتشغيل م رر األك اد من خالل شريط المط ر ،اذهب إلى تب يب Developerثم اختر األمر Visual
.Basic
Figure2-2
17
الفصل الثاني
Figure2-3
18
م رر األ امر VBE
عند النقر بالما س نقرا ً مزد جا ً على أ د العناصر أسفل Microsoft Excel Objectsأ Modules
يظهر لنا ك د الـ VBAالخاص بهذا العنصر في نافذة الك د .Code Window
إذا لم يكن مستكشف المشاريع ظاهرا ً فيمكن اظهاره من خالل الضغط على Ctrl + Rأ من خالل
الذهاب إلى .View ➔ Project Explorer
19
الفصل الثاني
عمليات تتبع األخطاء التص يح .Debuggingإذا لم تكن هذه النافذة ظاهرة فيمكن اظهارها من خالل
الضغط على .Ctrl + G
Figure2-4
20
م رر األ امر VBE
Figure2-5
21
الفصل الثاني
Figure2-6
-3من خالل مستكشف المشاريع اختر ال دة البرمجية Moduleالتي قمت ادراجها ثم رك
مؤشر الما س إلى جزء الك د في األيمن (إذا لم يكن جزء الك د ظاهرا ً ألي سبب انقر بزر
الما س األيمن ف ق ال دة البرمجية ثم اختر .View Code
-4أدخل الك د التالي في جزء الك د
)(Sub HelloVBA
)"!!MsgBox ("Hello VBA
End Sub
بهذا تك ن قد أدخلت برنامجك األ ل لتشغيله اتبع إ دى الخط ات التالية:
-1من خالل م رر األك اد ،اضغط على زر Runأ اذهب إلى قائمة Runثم اضغط Run
Sub/UserForm
-2من رقة العمل اذهب إلى تب يب Developerثم اضغط على زر Macrosمن مربع ال ار
الذي س ف يظهر اختر اسم الماكر من مربع Macro nameثم اضغط على زر .Run
شكل .2-7
-3من الممكن إعطاء الماكر اختصار على ل ة المفاتيح .لعمل ذلك اختر اسم الماكر كما في
الخط ة رقم ،2ثم اضغط على زر Optionsثم من نافذة Macro optionsدد االختصار
22
م رر األ امر VBE
الذي تريده من خالل ادخال األزرار المطل بة في Shortcut keyأدخل صف للماكر في
الخانة المخصصة لل صف Descriptionكما في الشكل 2-7
-4من الممكن ربط الماكر مع شكل عن طريق ادراج الشكل المطل ب ثم النقر بالزر األيمن عليه
اختيار Assign macroكما في الشكل 2-8
-5من الممكن ربط الماكر مع زر Buttonمن خالل الذهاب إلى تب يب Developerثم إلى
Insertثم اختيار Buttonمن ثم ضع الزر في المكان المطل ب على رقة العمل ،بمجرد
ضع الزر على رقة العمل يظهر لنا مربع ار يطلب من ت ديد الماكر المرتبط مع هذا
الزر؛ ن دد الماكر ثم نضغط على .OKانظر شكل 2-9
Figure2-7
23
الفصل الثاني
Figure2-8
Figure2-9
24
م رر األ امر VBE
Figure2-10
25
الفصل الثاني
Figure2-11
26
VBE م رر األ امر
Figure2-12
27
الفصل الثاني
28
مسجل الماكر
الفصل الثالث
في هذا الفصل س ف نتعرف على أسهل الطرق للبدء في استخدام VBAهي تسجيل دات الماكر
باستخدام مسجل الماكر Macro Recorderهي ميزة مدمجة في االكسيل .Built-Inباستخدام
الماكر س ف يك ن بإمكانك أتمتة العمليات المتكررة المضجرة مما سيسرع من انجاز أعمالك يقلل
من نسبة د ث األخطاء .كما أن بإمكانك أن تق م بال ص ل للك د البرمجي الناتج عن تسجيل الماكر
التعديل فيه مما يعطيه ق ة مر نة قص ى.
باإلضافة إلى ذلك ،يعد مسجل الماكر من ال سائل الممتازة لتعلم ،VBAيث أنك إذا اردت أن تعرف
كيفية اتمام تنفيذ عملية معينة باستخدام برمجة ،VBAفبإمكانك تسجيل ماكر يق م بأداء تلك العملية
من ثم تق م بعرض ك د الـ VBAالخاص بذلك الماكر .
لبدء التعامل مع الماكر يجب أن يتم اظهار شريط المط ر Developerعن طريق الضغط بزر
الما س األيمن ف ق شريط األد ات Ribbonثم ( Customize the ribbonتخصيص الشريط) ثم
نختار Developer
29
الفصل الثالث
Figure3-1
خطوات انشاء ماكرو بسيط يقوم بتلوين الصف األول باللون األصفر
.1نذهب الى شريط المط ر ثم نضغط على ( Record Macroتسجيل ماكر )
.2يظهر لنا مربع ال ار .Record Macroنعطي الماكر اسما اختصارا ل أردنا من خالل
البند Shortcut keyن دد أين سيتم تخزين الماكر من خالل القائمة المنسدلة Store
.Macro in
ت ت ي القائمة المنسدلة Store Macro inعلى ثالث خيارات هي كالتالي:
• ( This workbookهذا المصنف) يث يتم تخزين هذا الماكر في هذا المصنف
فقط يجب في هذه ال الة تخزين المصنف بامتداد xlsm
30
مسجل الماكر
Figure3-2
( Personal Workbook .3مصنف الماكر الشخصي) .هذا المصنف م ج د بال ضع
االفتراضي لكنه غير مفعل ،عند تفعيله أ ل مرة (عن طرق تخزين ماكر فيه) يتم تشغيله
بعدها في كل مرة يتم فتح االكسيل بها لكنه يك ن مخفياً .اذا اردت أن يك ن الماكر متا ا ً في
كل المصنفات على نفس جهاز ال اس ب يجب أن يخزن في مجلد الماكر الشخصي
.4بمجرد أن تضغط م افق يبدأ الماكر بالتسجيل ،نبدأ بإجراء العمليات التي نريد للماكر أن
يسجلها فنذهب للصف األ ل نعطيه الل ن األصفر.
.5نضغط اآلن على زر إيقاف التسجيل Stop the Recordingالم ج د في شريط المط ر أ
الم ج د في شريط ال الة/المعل مات .status bar
31
الفصل الثالث
الستدعاء الماكر الذي تم تسجيله نستخدم اختصار الكيب رد الخاص بذلك الماكر أ نذهب الى شريط
المط ر ثم نضغط زر Macrosنختار الماكر المطل ب.
.1نضغط بالزر األيمن للما س ف ق شريط األد ات Ribbonثم نختار Customize the
( ribbonتخصيص الشريط)
.2ننشئ عالمة تب يب جديدة New Tabأ مجم عة جديدة New Group
.3نضيف الماكر المطل ب لهذا التب يب أ المجم عة.
Figure3-3
32
مسجل الماكر
Figure3-4
Figure3-5
33
الفصل الثالث
Figure3-6
34
مسجل الماكر
-5س ف يتم عرض الك د الخاص بالماكر في نافذة الك د Code Windowالم ج دة على يمين
مستكشف المشاريع.
Figure3-7
35
الفصل الثالث
-4يمكنك التعديل في الك د ب يث تتغير نتيجة تنفيذه .فمثالً خذ عندك السطر البرمجي التالي:
Rows("1:1").Select
في هذا السطر تم ت ديد الصف األ ل تمهيدا ً لتطبيق التنسيق عليه .فإذا أردت أن تغير من عمل
الماكر ب يث يق م بتل ين األسطر الثالثة األ لى بالل ن األصفر ،فتستطيع التغيير في السطر السابق
ليصبح كما يلي:
Rows("1:3").Select
تى هذه النقطة ال تركز كثيرا ً على كيفية تعديل الك د الناتج عن الماكر ال ُمسجل ،انما ركز على فهم
الفكرة العامة .بعد انتهائك من قراءة فص ل الكتاب التعرف على أجزاء مك نات لغة VBAكيفية
التعامل معها س ف يصبح من السهل لديك أن تق م بقراءة فهم الك د المسجل التعديل فيه إن لزم.
36
المتغيرات
الفصل الرابع
.4المتغيرات Variables
في هذا الفصل س ف نق م بشرح مفه م المتغيرات Variablesأن اعها كيفية اإلعالن عنها نطاقها
كيفية تعيين قيم لتلك المتغيرات .كما تم التطرق فيه للمصف فات Arraysبأن اعها المختلفة كيفية
اإلعالن عنها التعامل معها.
ما هو المتغير؟
المتغير Variableه عبارة عن اسم ُمعطى لمكان في ذاكرة ال اس ب يث يتم تخزين قيمة ذلك
المتغير في هذا المكان ،مما يسمح لك باإلشارة إلى ذلك المكان استخدام البيانات بداخله عند ال اجة.
يمكن ان ت ت ي المتغيرات على أن اع مختلفة من البيانات (سنأتي على ذكر ذلك ال قاً) .يمكن
تعيين/اعطاء قيمة للمتغير باستخدام معامل التعيين (إشارة "=").
فيما يلي بعض األمثلة على بعض العبارات التي استخدمت في إعطاء قيمة لمتغير:
X = 100
Rate = 0. 05
y = y+10
"name = "Ahmed
37
الفصل الرابع
isOK = False
StartDate = #01/18/2019#
Rate = Sheets("sheet1").Range("A1").Value
ال ظ أن أسماء المتغيرات تقع على الجانب األيسر من عالمة التعيين (=) ،بينما تقع القيمة التي تم
تعيينها على الجانب األيمن.
ت ت ي لغة VBAعلى العديد من الكلمات الم ج زة التي ال يمكن استخدامها كأسماء للمتغيرات ،مثل
Sub, Function, IF … etcاذا ا لت استخدام إ دى هاته الكلمات فس ف ت صل على رسالة خطأ.
لمعرفة الكلمات الم ج زة في VBAانظر الرابطين التاليين:
https://bettersolutions.com/vba/syntax/keywords.htm
https://docs.microsoft.com/en-us/office/vba/language/reference/keywords-
visual-basic-for-applications
38
المتغيرات
هذا األمر إال أن هناك ثمنا ً لذلك ه استخداما ً أقل كفاءة ً لم ارد الكمبي تر تنفيذا ً قد يك ن في بعض
األ يان أبطأ مما ل تم ت ديد ن ع البيانات المناسب للمتغير قبالً .بشكل عام ،يُ صى د ما ُ باستخدام ن ع
البيانات الذي يستخدم أقل عدد من البايتات.
أنواع البيانات في VBA
في الجد ل التالي قائمة بأن اع المتغيرات في لغة VBA
39
الفصل الرابع
40
المتغيرات
Figure4-1
ترك الـ VBAيق م بالتعرف التلقائي على ن ع البيانات قد تبد عملية مري ة إال أن ذلك يأتي على
ساب السرعة المسا ة ال ُمستغلة من الذاكرة يث أن الـ VBAتق م ب جز مسا ة بالذاكرة قد تك ن
أكبر بكثير من المسا ة المطل بة باإلضافة أنه في الة اجراء أي عملية على متغير من ن ع Variant
يق م الـ VBAبإجراء سلسلة من عمليات الت قق تى يختار ن ع البيانات المناسب هذا قد يسبب بطئا ً
في تنفيذ البرنامج.
هناك مشكلة أخرى قد ت اجهك إذا لم تقم باإلعالن عن المتغيرات هي أن الك د الخاص بك يصبح أكثر
معلن عنه باسم
ٍ عرضة لألخطاء ،خذ عندك المثال التالي :لنفترض أنك قمت باستخدام متغيرا ً غير
CurrentValueفأعطيته القيمة 250من خالل السطر البرمجي التالي:
CurrentValue = 250
ثم أردت أن يق م البرنامج بإضافة 100على قيمة CurrentValueفأدخل السطر البرمجي:
CurentValue = 250 + 100
هل ال ظت الخطأ؟ في السطر البرمجي الثاني هناك رف " "rناقص في كلمة CurrentValue
عليه فالنسبة للـ VBAالمتغير CurentValueه متغير جديد يختلف تماما ً عن المتغير
CurrentValueبذلك فإن النتيجة النهائية لتنفيذ البرنامج ستك ن خاطئة تماماً .إنه من الصع بة بمكان
41
الفصل الرابع
أن تكتشف هذا الن ع من األخطاء بالذات عندما يك ن البرنامج كبيرا ً ي ت ي على عدة عشرات أ
مئات من األسطر البرمجية.
بنا ًء على ما ذكر سابقا ً فإن اإلعالن عن المتغيرات هي من األم ر ال ُم صى بها بشدة.
أ د الميزات التي ت فرها لك عملية اإلعالن عن المتغيرات هي عملية االكمال التلقائي ألسماء المتغيرات
قت االدخال فإذا كنت تريد أن تدخل اسم أ د المتغيرات المعلن عنها فيكفي أن تكتب أ ل رف أ
رفين من المتغير ثم تضغط على االختصار Ctrl+Spaceليق م الـ VBAبإكمال االدخال أ عرض
مجم عة م ددة من الخيارات ليتم االختيار من بينها.
Figure4-2
42
المتغيرات
ال ظ هنا أنه في جملة اإلعالن األخيرة لم يتم إعطاء المتغير Xن ع بيانات م دد لذلك فس ف يتعامل
معه VBAكمتغير من ن ع .Variant
من الممكن اإلعالن عن أكثر من متغير في نفس السطر كما في المثال التالي:
Dim Name As String, Salary As Long, StartDate As Date
إذا كان لدينا أكثر من متغير من نفس الن ع نستخدم نفس الطريقة كما في المثال التالي:
Dim FirstName As String, LasteName As String
مع مال ظة أن الصيغة التالية ال يمكن استخدامها لت ديد ن ع البيانات ألكثر من متغير من نفس الن ع:
Dim FirstName, LastName As String
إذا استخدمت الجملة السابقة فإن المتغير األخير فقط ه الذي سيتم تعريفه كـ Stringبينما سيتم تعريف
باقي المتغيرات كـ .Variant
بجانب الكلمة المفتا ية Dimهناك ثالثة كلمات أخرى يمكن استخدامها لتعريف المتغيرات هي:
• Static
• Public
• Private
43
الفصل الرابع
إذا أعلنت عن متغير في نطاق اإلجرائية فقط فإن االجرائيات األخرى بداخل نفس ال دة البرمجية
تستطيع استخدام نفس اسم المتغير بداخلها لكن يتم التعامل مع كل متغير بشكل منفصل تماما ً ال ت جد
عالقة أبدا ً بين تلك المتغيرات .يمكن الق ل بأن المتغيرات ذات نطاق "اإلجرائية فقط" هي األكثر فعالية
في استخدام الذاكرة يث أن المتغير يُخلى مكانه في الذاكرة ف را ً بعد تنفيذ اإلجرائية.
44
المتغيرات
Figure4-3
بالنسبة للمتغيرات في نطاق ال دة النمطية ،يمكن استخدام هذه المتغيرات في أي إجرائية بداخل ال دة
النمطية تبقى قيمتها كما هي عند االنتقال من إجرائية ألخرى.
45
الفصل الرابع
Figure 4-4
46
المتغيرات
هنا تم تعريف المتغير RunCounterكمتغير ثابت من ن ع Integerفي كل مرة يتم تشغيل اإلجرائية
الفرعية )( Testيتم زيادة قيمة RunCounterبمقدار 1من خالل السطر البرمجي:
RunCounter = RunCounter + 1
ار من خالل السطر البرمجي: يتم عرض النتيجة في مربع
MsgBox RunCounter
47
الفصل الرابع
Figure4-5
الثوابت Constants
أ يانا ً ت تاج إلى اإلشارة إلى قيمة ثابتة ال تتغير أبدا ً مثل أن تشير إلى ثابت الدائرة "ط "Piالذي
يسا ي القيمة 3.14تقريباً .لهذا الغرض نستخدم الث ابت Constantsيث أن المتغيرات العادية
Variableمعرضة ألن تتغير قيمتها مع تشغيل البرنامج (لهذا تدعى متغيرات .أليس كذلك؟)
يتم اإلعالن عن الث ابت باستخدام الكلمة المفتا ية .Constت ت ي جملة اإلعالن عن المتغير على
قيمة المتغير .الجمل التالية هي أمثلة على الث ابت:
Const Pi = 3.14
48
المتغيرات
49
الفصل الرابع
عند اإلعالن عن متغير من ن ع Stringباإلمكان ت ديد عدد األ رف في المتسلسلة في نفس جملة
اإلعالن ،إذا لم يتم ت ديد عدد األ رف فس ف يتعامل الـ VBAمع المتغير كـ Variable-length
.string
المثالين التاليين ي ض ان كيفية اإلعالن عن متغير نصي مع أ بد ن ت ديد عدد األ رف:
Dim MyName As String * 40
Dim MyName As String
التعامل مع متغيرات التاريخ Date variables
التاريخ Dateمن أن اع البيانات المفيدة التي يكثر استخدامها .إذا استخدمت متغيرا ً نصيا مثالً ال ت اء
قيمة تاريخ فال يمكنك اجاء العمليات على التاريخ .بينما إذا استخدمت الن ع Dateفيمكنك أن تجري
العمليات المختلفة على التاريخ مثل أن تعرف التاريخ بعد أ قبل عدد معين من األيام أ معرفة عدد
األيام بعد تاريخين.
األمثلة التالية تعرض كيفية اإلعالن عن متغيرات ث ابت من ن ع :Date
Dim FirstDate As Date
Const StartDate As Date = #1/1/2020#
Const Noon As Date = #12:00:00 PM#
في الـ VBAيجب أن ت ضع قيم ال قت التاريخ بين عالمتي #كما في األمثلة السابقة .هنا يجب أن
تعلم شيئا ً مهماً؛ الـ VBAتق م بعرض ال قت التاريخ كما ه معرف في الخيارات اإلقليمية لجهاز
ال اس ب .لكن عند ادخال قيم ال قت التاريخ يجب أن تلتزم بالنظام األمريكي ه "الشهر/الي م/السنة
"dd/mm/yyyyفمثالً إذا أدخلت السطر البرمجي التالي:
Dim MyDate = #11/10/2020#
فهذا يعني العاشر من ن فمبر عند عرض التاريخ فسيق م االكسيل بعرضه كما ه معرف في الخيارات
اإلقليمية (في ال عرضه في مربع ار) أ كما تم تنسيق الخاليا (في ال عرض التاريخ بداخل
خلية).
50
المتغيرات
كما ال ظت من خالل األمثلة السابقة يمكن استخدام جمل التعيين لتعيين قيمة م ددة للمتغير أ تعيين
نتيجة عملية ما للمتغير كما يمكن إعطاء المتغير قيمة أ د الكائنات كأن تعطي المتغير القيمة الم ج دة
في الخلية .A1
من الجمل السابقة هناك جملة قد تبد غريبة ،إال أنها من التعابير التي يكثر استخدامها في عالم البرمجة
هي:
Z=Z+1
مفه م هذه الجملة ه أنه في كل مرة يتم تنفيذ هذه الجملة يتم زيادة قيمة المتغير بمقدار .1
المصفوفات Arrays
تدعم جميع لغات البرمجة ال ديثة المصف فات من بينها لغة VBAمنذ إصدارها األ ل .المصف فة هي
مجم عة من المتغيرات التي تتشارك في نفس االسم .تتم اإلشارة إلى عنصر م دد بداخل المصف فة
من خالل استخدام اسم المصف فة مع رقم المرجع Index numberللمتغير بداخل ق سين .على سبيل
المثال بإمكانك اإلعالن عن مصف فة من المتغيرات الرقمية من ن ع Integerت ت ي على 10
عناصر ت ت اسم MyNumbersمن ثم يمكنك اإلشارة للعنصر األ ل في المصف فة كالتالي:
) MyNumers(1العنصر الثاني MyNumers(2) :هكذا.
51
الفصل الرابع
52
المتغيرات
لإلشارة لعنصر م دد بداخل هذه المصف فة يجب أن ت دد الرقم المرجعي Index numberلكل بعد
كما في التالي:
MyArray (1, 1 ) = 100
هنا عينا القيمة 100للعنصر ال اقع في الم قع .1 1
في ال اقع يمكن تخيل المصف فة ثنائية البعد كمربع أ مستطيل ذات صف ف أعمدة أما المصف فة
الثالثية فيمكن تخيلها كمت ازي مستطيالت له ط ل عرض ارتفاع.
53
الفصل الرابع
54
التعامل مع كائنات النطاق
الفصل الخامس
كائن النطاق يمثل نطاقا ً بداخل كائن رقة العمل .Worksheet objectهذا الكائن (النطاق) له
مجم عة من الخصائص Propertiesالتي يمكن عرضها في بعض األ يان تغييرها ،مجم عة من
الد ال Methodsالتي يمكن تطبيقها عليه .كائن النطاق من الممكن أن ي ت ي على خلية ا دة من
الممكن أن ي ت ي على جميع خاليا رقة العمل.
عند اإلشارة إلى كائن نطاق يجب أن يتم إ اطة العن ان بعالمتي االقتباس Double quotesفإذا أردت
أن تشير إلى النطاق A1:B10فمن الممكن أن تستخدم الجملة التالية:
)"Range ("A1:B10
إذا كان النطاق ي ت ي على خلية ا دة فقط فيجب أيضا ً أن ت ضع بداخل عالمتي اقتباس أيضا ً
فلإلشارة للخلية A1نستخدم الجملة التالية:
)"Range ("A1
إذا كان للنطاق اسم Named rangeفيمكن استخدام اسم النطاق بين عالمتي اقتباس أيضا ً مثل:
)"Range ("MyRange
يمكن اإلشارة إلى نطاق خارج رقة العمل النشطة Active worksheetعن طريق تضمين اسم رقة
العمل في الجملة التي تصف النطاق كما في المثال التالي:
)"Worksheet ( "Sheet1") . Range ("A1:B10
55
الفصل الخامس
كما يمكنك أن تشير إلى نطاق بداخل مصنف آخر من خالل تضمين اسم المصنف كما في المثال التالي:
)"Workbook("Book1.xlsx").Worksheet("Sheet1").Range ("A1:B10
يمكن لكائن النطاق أن يتك ن من صف أ عم د كامل (أ مجم عة من الصف ف أ األعمدة) ،فمثال ً
يمكنك من خالل الجملة التالية اإلشارة إلى الصف األ ل في رقة العمل النشطة:
)"Range("1:1
كما يمكنك من خالل الجملة التالية اإلشارة إلى األعمدة الثالثة األ لى في رقة العمل النشطة:
)"Range("A:C
لإلشارة إلى نطاقات متباعدة استخدم الفاصلة بين النطاقات كما في المثال التالي:
)"Rang ("A1:B10, D1:E10
56
التعامل مع كائنات النطاق
مالحظة
إذا كنت تريد أن تق م بقراءة م ت يات مجم عة من الخاليا فيمكنك أن تعرف متغير كـ Variantمن
ثم تضع القيم بداخل هذا المتغير .ذلك ألن المتغير من ن ع Variantمن الممكن أن يعمل كمصف فة
57
الفصل الخامس
.Arrayمن ثم يمكنك كما في أي مصف فة أن تق م بعرض قيمة الخلية المطل بة من خالل ت ديد
م قعها في المصف فة .في المثال التالي قمنا بتعريف متغير كـ Variantأعطيناه قيم النطاق A1:B10
من ثم قمنا بعرض قيمة الخلية :B2
Dim x As Variant
X = Range("A1:B10") . Value
)Msgbox x(2 ,2
من الممكن أن نق م بتغيير قيمة خلية ما من خالل هذه خاصية Valueكما في المثال التالي:
Range ("A1") . Value = 150
بعكس عملية قراء القيم من مجم عة من الخاليا التي ال تج ز ،فإنه باإلمكان استخدام الخاصية Value
إلعطاء قيمة م ددة لمجم عة من الخاليا دفعة ا دة كما في المثال التالي:
خاصية Text
خاصية Textترجع القيمة التي تعرضها الخلية كنص .فمثالً إذا تم تطبيق التنسيق الرقمي عملة على
الخلية B2كما في الشكل 5-1فإن الجملة:
58
التعامل مع كائنات النطاق
MsgBox Range("B2").Value
ترجع قيمة الخلية الرقمية هي .160بينما ترجع الجملة التالية القيمة كما تظهر في الخلية:
MsgBox Range("B2").Text
Figure 5-1
Figure 5-2
59
الفصل الخامس
إذا كانت الخلية ت ت ي على معادلة فإن خاصية Textتعيد نتيجة تنفيذ المعادلة ،أما اذا كانت ت ت ي
على نص فإن خاصية Textخاصية Valueترجعان نفس النتيجة يث أن النص بخالف األرقام ال
يمكن تنسيقه ليظهر بشكل مختلف.
خاصية العد Count
الخاصية Countترجع عدد الخاليا في نطاق م دد بغض النظر عما إذا كانت الخاليا ت ت ي على
بيانات أم ال .هذه الخاصية هي للقراءة فقط Read-onlyال يمكن تعديل قيمتها.
ار: السطر البرمجي التالي يعرض عدد الخاليا في النطاق A1:B10في مربع
MsgBox Range("A1:B10").Count
خاصية HasFormula
هذه الخاصية هي للقراءة فقط هي ترجع القيمة Trueإذا كانت الخلية ت ت ي على معادلة False
بخالف ذلك .إذا كان النطاق ي ت ي على أكثر من خلية فإن هذه الخاصية ترجع Trueفي ال أن
جميع خاليا النطاق ت ت ي على معادالت Falseإذا لم يكن هناك أي خلية ت ت ي على معادلة ،أما
اذا كانت بعض خاليا النطاق ت ت ي على معادالت البعض اآلخر ال ي ت ي فإن هذه الخاصية ترجع
القيمة .Null
Falseفيما عدا السطر البرمجي التالي يعرض القيمة Trueإذا كانت الخلية A1ت ت ي على معادلة
ذلك:
MsgBox Range("A1").HasFormual
يجب أن تك ن شديد ال ذر عند التعامل مع القيمة Nullيث أن المتغير ال يد الذي يستطيع التعامل مع هذا
الن ع من القيم ه .Variant
60
التعامل مع كائنات النطاق
خاصية Font
جم الخط ،جعل من خالل هذه الخاصية يمكن الت كم بالخط بداخل نطاق من الخاليا ،مثل اختيار ن ع
الخط غامق Boldأ مائل ،Italicتغيير ل ن الخط غيرها من خصائص الخط.
المثال التالي ي ضح لنا كيفية استخدام هذه الخاصية لجعل الخط في خاليا النطاق A1:B10مائالً :Italic
Range("A1:B10").Font.Italic = True
بالمثل ،ل أردنا جعل الخط غامقا ً نستخدم السطر التالي:
Range("A1:B10").Font.Bold = True
تساعدك بيئة البرمجة VBEفي اختيار خاصية الخط المطل بة من خالل ميزة االكمال التلقائي ،ففي
المثالين السابقين بمجرد أن تكتب " " Range("A1:B10").Font.يق م VBEبعرض الخيارات المتا ة
مما يساعدك يسهل عليك كتابة الك د.
الخاصية Interior
يمكن استخدام هذه الخاصية للت كم بل ن الخلفية نمطها Color and patternلخاليا النطاق الم دد.
لتل ين الخاليا في النطاق A1:B10بالل ن األ مر نستخدم الك د التالي:
61
الفصل الخامس
Range("A1:B10").Interior.Color = vbRed
يمكن استخدام أل ان أخرى مثل vbGreen, vbBlackغيرها يمكن استخدام رقم الل ن كما في
الشكل 5-3
5-3 Figure
لل ص ل على أل ان أكثر يمكن استخدام الدالة RGBالتي يمكن ن خاللها المزج بين األل ان األساسية
(األ مر ،األخضر األزرق لل ص ل على 16ملي ن ل ن) .المثال التالي ي ضح لنا كيفية استخدام
الدالة RGBالعطاء الل ن الرمادي لنطاق من الخاليا:
)Range("A1:B10").Interior.Color = RGB(128, 128, 128
انظر الشكل 5-4لمعرفة كيفية تمثيل بعض األل ان الشائعة باستخدام الدالة .RGB
62
التعامل مع كائنات النطاق
Figure5-4
63
الفصل الخامس
قبل استخدام Selectلت ديد نطاق ما ،من الجيد أن تستخدم سطرا ً برمجيا ً آخر للتأكد أن رقة العمل المطل ب
ت ديد النطاق بها هي ال رقة النشطة .Active sheetيتم ذلك من خالل ال ظيفة .Activateمثالً إذا كان
النطاق المطل ب ت ديده ضمن رقة العمل Sheet1نستخدم الك د التالي:
Sheets( "Sheet1" ) . Activate
Range("A1:B10").Select
ال ظ أن الجملة التالية ال تعتبر ص ي ة ترجع قيمة خطأ عند تنفيذ البرنامج إذا لم تكن Sheet1هي ال رقة
النشطة.
Sheets("Sheet1").Range("a1").Select
64
التعامل مع كائنات النطاق
بإمكانك اجراء عمليات النسخ اللصق من خالل ظيفتي .Copy and Pasteمع مال ظة أن كل
ظيفة من هاتين ال ظيفتين تُطبق على كائن مختلف ،ف ظيفة Copyتطبق على كائن النطاق بينما تطبق
ظيفة اللصق على كائن رقة العمل .Worksheet
اإلجرائية الفرعية التالية تق م بنسخ م ت يات النطاق A1:B10إلى النطاق الذي يبدأ بالخلية :D1
)(Sub CopyPaste
Range("A1:B10").Select
Selection.Copy
Range("D1").Select
ActiveSheet.Paste
End Sub
ال ظ أننا في هذا المثال استخدمنا الكائن ActiveSheetه ن ع خاص من الكائنات يشير إلى رقة
العمل النشطة.
يمكن اختصار الك د السابق بالك د التالي:
)(Sub CopyPaste
)"Range("A1:B10").Copy Range("D1
End Sub
يستفيد هذا الك د من قيقة أن ال ظيفة Copyتستطيع أن تأخذ معامالً ي دد جهة النسخ Destination
في التنا ال جهة هي )".Range("D1
وظيفة المسح Clear Method
تم هذه ال ظيفة م ت يات الخاليا باإلضافة إلى أي تنسيقات مطبقة على الخاليا .الك د التالي يستخدم
هذه ال ظيفة لم م ت يات الخاليا في النطاق (:(A1:B10
Range ("A1:B10").Clear
65
الفصل الخامس
باإلضافة إلى هذه ال ظيفة هناك ال ظيفة ClearContentsالتي تم م ت يات الخاليا بد ن أن تم
التنسيق ،ال ظيفة ClearFormatsالتي تم التنسيق بد ن أن تم الم ت يات.
66
جمل الت كم
الفصل السادس
.6جمل التحكم
تعد جمل الت كم من أهم الجمل البرمجية يث أنك تستطيع من خالل جمل الت كم Control
،statementsالت كم بسير البرنامج بنا ًء على ت قق شرط أ مجم عة من الشر ط .في هذا الفصل
س ف نتعرف على العديد من جمل الت كم التي ت فرها لنا لغة VBAكيفية استخدامها.
جملة IF – Then
تعد هذه الجملة هي أشهر أهم جمل الت كم في لغات البرمجة قاطبةً .من خالل هذه الجملة يمكن تنفيذ
أ امر م ددة بنا ًء على ت قق شرط أ شر ط م ددة .إذا تم استخدام الكلمة Elseمع جملة IFفهذا يسمح
لنا بتنفيذ أمر أ مجم عة من األ امر في ال عدم ت قق الشرط .في ا دى االتها؛ تأخذ جملة IF-
Thenالشكل التالي (ال ظ هنا أنه في هذه ال الة يجب أن تك ن كلمتي Then IFعلى نفس السطر):
]األمر في حال تحقق الشرط[ ] Thenالشرط[ IF
في ال ج د كلمة Elseيصبح شكل الدالة كالتالي ( هنا ال ظ أيضا ً أن IF, Then, and Elseيجب
أن يك ن ا على نفس السطر):
]األمر في حال عدم تحقق الشرط[ ] Elseاألمر في حال تحقق الشرط[ ] Thenالشرط[ IF
مثال على IF- Then
في هذا المثال تق م جملة IFبالت قق من القيمة في الخلية ،A1إذا كانت القيمة أكبر من 60تعيّن القيمة
Passللمتغير .resultمن ثم يتم تعيين قيمة المتغير resultللخلية .B1
67
الفصل السادس
)(Sub PassFail
Dim score As Integer, result As String
score = Range("A1").Value
"If score >= 60 Then result = "Pass
Range("B1").Value = result
End Sub
جملة IF – Then – Else
في المثال السابق ،إذا كانت القيمة في الخلية A1أقل من 60فإن الخلية B1ال تظهر أي قيمة .إذا أردنا
أن تظهر القيمة Failفي ال كانت قيمة الخلية A1أقل من 60؛ فمن الممكن استخدام كلمة Elseمع
جملة ،IFكما في الك د التالي الذي تم تعديله على المثال السابق.
)(Sub PassFail
Dim score As Integer, result As String
score = Range("A1").Value
"If score >= 60 Then result = "Pass" Else result = "Fail
Range("B1").Value = result
End Sub
68
جمل الت كم
69
الفصل السادس
Range("B1").Value = result
End Sub
في هذا الشكل من أمر Ifيمكنك إضافة أي عدد من األسطر البرمجية (التي تمثل الشر ط) ت ت جزء
Ifأي عدد من األسطر البرمجية ت ت جزء .Elseهذه الطريقة في كتابة جملة IFتعد في نظر الكثيرين
أفضل من الطريقة التي تم ذكرها أ الً التي يتم فيها كتابة جملة Ifعلى سطر ا د يث أنها باإلضافة
إلى أنك تستطيع أن تضيف أي عدد من الشر ط أي عدد من الجمل البرمجية في ال ت قق الشرط/
أ الشر ط المطل بة ،أسهل في القراءة التتبع باإلضافة إلى أنك في هذه ال الة ستكتب جمل برمجة
أقصر بالتالي س ف تك ن أقل عرضة لألخطاء.
استخدام If – Then -Elseif – Endif
في ال كان لديك مجم عة من ال االت /الشر ط لالختيار فيما بينها يمكنك استخدام Elseifمع جملة
.Ifتأخذ جملة Ifمع Elseifالشكل العام التالي:
70
جمل الت كم
بف ص الشرط األ ل ،فإذا ت قق يتم تنفيذ الك د البرمجي الذي يقع ت ته مباشرة IFفي هذه ال الة تق م
بف ص الشرط الثاني ،اذا ت قق ينفذ الك د ت ته ، Ifاذا لم يت قق تق م Ifثم ثم يتم الخر ج من دالة
هكذا If .يتم الخر ج من دالة
هنا مال ظة مهمة جدا ً هي أن جملة If – ElseIfال تق م بف ص كافة الشر ط انما تت قف عند أ ل
شرط يت قق ،فتنفذ الك د البرمجي الخاص بذلك الشرط ثم يخرج البرنامج من دالة Ifيستمر في الك د
الذي يلي الدالة.
مثال
ار يظهر في هذا المثال المطل ب ف ص القيمة في الخلية ( A1عالمة الطالب) من ثم عرض مربع
التقدير الذي س ف يك ن كالتالي:
التقدير الدرجة
ممتاز Excellent أكبر من 90
جيد جدا ً Very Good من 80تى أقل من 90
جيد Good من 70تى أقل من 80
مقب ل Pass من 60تى أقل من 70
راسب Fail أقل من 60
لل ص ل لذلك الهدف نستخدم جملة If – ElseIfكما في اإلجرائية باألسفل ،كما تم ذكره سابقا ً ال تق م
جملة If – ElseIFبف ص جميع الشر ط انما تنتهي عند ت قق أي من الشر ط ففي هذا المثال اذا
كانت عالمة الطالب أكبر من ،90يتم ف ص الشرط األ ل من ثم تنفيذ األ امر البرمجية الخاصة بذلك
الشرط هي جملة " MsgBox "Excellentبعد ذلك يخرج البرنامج من دالة Ifيستمر في الك د
الذي يلي الدالة (في هذا المثال الي جد أي ك د بعد دالة Ifلذلك فبمجرد الخر ج من دالة Ifس ف تنتهي
اإلجرائية):
71
الفصل السادس
Sub StudentsGrades()
If Range("A1").Value >= 90 Then
MsgBox "Excellent"
ElseIf Range("A1").Value >= 80 Then
MsgBox "Very Good"
ElseIf Range("A1").Value >= 70 Then
MsgBox "Good"
ElseIf Range("A1").Value >= 60 Then
MsgBox "Pass"
ElseIf Range("A1").Value < 60 Then
MsgBox "Fail"
End If
End Sub
72
جمل الت كم
Sub StudentsGrades()
If Range("A1").Value >= 90 Then
MsgBox "Excellent"
ElseIf Range("A1").Value >= 80 Then
MsgBox "Very Good"
ElseIf Range("A1").Value >= 70 Then
MsgBox "Good"
ElseIf Range("A1").Value >= 60 Then
MsgBox "Pass"
Else
MsgBox "Fail"
End If
End Sub
73
الفصل السادس
العامل OR
يستخدم العامل ORللمقارنة بين نتيجتين منطقيتين ب يث أنه يرجع القيمة Trueاذا كانت ا دى
النتيجتين أ كالهما .Trueأما إذا كانت كلتا النتيجتين Falseفإن النتيجة النهائية س ف تك ن .False
فمثالً الجملة البرمجية التالية تك ن نتيجة تنفيذها Trueفي ال كانت نتيجة تنفيذ أي من الجملتين
المنطقيتين على جانبي ORهي :True
Range("A1").Value >70 AND Range("B1").Value >100
74
جمل الت كم
مالحظة مهمة
الع امل المنطقية ال تقارن بين قيم الخطأ فمثالً االجرائية التالية س ف ترجع خطأ عند تنفيذها إذا لم يتم
تعيين قيمة أكبر من صفر للمتغير ،rateيث أن القسمة على صفر هي عملية غير مسم ح بها.
بالرغم من أن الجزء ال اقع على يسار ORمن الجملة
()Range("A1").Value > 70 OR Range("B1").Value / rate > 1
قد يك ن ص ي ا ً Trueإال أن VBAس ف يظهر خطأ Overflowعند تشغيل البرنامج ألن الطرف
األيمن من جملة المقارنة ي ت ي على عملية غير مسم ح بها.
)(Sub test
Dim rate As Integer
If Range("A1").Value > 70 OR Range("B1").Value / rate > 1 Then
")!!!MsgBox "Right
End If
End Sub
العامل NOT
يستخدم العامل NOTلعكس النتيجة المنطقية .فإذا كانت نتيجة تطبيق الجملة التالية:
Range("A1").Value > 70
هي Falseفإن النتيجة تصبح Trueإذا تم تطبيق المعامل NOTعلى الجملة كالتالي:
Not Range("A1").Value > 70
75
الفصل السادس
مثال
.70 أكبر منA1 اإلجرائية التالية تظهر مربع ال ار التالي إذا لم تكن قيمة الخلية
Figure6-1
Sub Test2()
If Not Range("A1").Value > 70 Then
MsgBox "This value cannot be less than 70"
End If
End Sub
2 مثال
في رقة العملGrid lines اإلجرائية التالية تق م بالتبديل بين عرض أ عدم عرض خط ط الشبكة
:ال الية
Sub ToggleGridLines()
ActiveWindow.DisplayGridlines = Not ActiveWindow.DisplayGridlines
End Sub
76
جمل الت كم
يمكن إضافة زر ل رقة العمل ،عند الضغط عليه يق م بإخفاء خط ط الشبكة إذا كانت ظاهرة العكس.
خطوط الشبكة GridLinesهي احدى خصائص الكائن Windowوليس Worksheetكما قد يعتقد البعض.
لذلك استخدمنا ActiveWindow.DisplayGridlinesوليس .ActiveSheet. DisplayGridlines
77
الفصل السادس
.
Case Else
الك د ال عم ج د تطابق
End Select
مثال
في هذا المثال تم انشاء دالة تق م بأخذ مؤشر األداء للم ظف (قيمة من 1إلى 10يث 1ه األعلى
تقييماً) مقدار راتب الم ظف ،ترجع لنا مقدار مكافئة الم ظف .فلدينا اآلن التعبير Expressionه
عبارة عن قيمة المتغير ،performanceهذا التعبير له العديد من الخيارات (من 1تى .)10عند
تطابق نتيجة التعبير مع أي من الخيارات يتم تنفيذ الك د لذلك الخيار ثم يتم الخر ج من جملة Case
Selectاذا لم ي دث أي تطابق يتم تنفيذ الك د ال اقع ت ت .Case Else
78
جمل الت كم
Bonus = 100
Case Else
Bonus = 0
End Select
End Function
مثال 2
في هذا المثال س ف نق م بإعادة كتابة اإلجرائية الخاصة بالتقدير التي تم كتابتها سابقا ً باستخدام جملة
.If – ElseIfهنا س ف نستخدم جملة Case Selectكبديل عن جملة .If – ElseIfال ظ هنا أن الك د
أكثر سه لة ض اً.
)(Sub StudentsGrades
Select Case Range("A1").Value
Case Is >= 90
"MsgBox "Excellent
Case Is >= 80
"MsgBox "Very Good
79
الفصل السادس
مثال 3
تق م اإلجرائية باألسفل بعرض الربع السن ي للتاريخ ال الي في مربع ار .تق م جملة تعبير الف ص
هي ) Month(Dateبإرجاع رقم الشهر للتاريخ ال الي ( الذي تم ال ص ل عليه من خالل الدالة
،)Dateقد ينتج عن تعبير الف ص 12قيمة مختلفة (خيارات) ،تم تجميع كل 3خيارات مع بعضها من
خالل كلمة Toلف ص التطابق بين نتيجة تعبير الف ص إ دى القيم ضمن المجم عات األربع ،من
ثم ارجاع رقم الربع السن ي ال الي.
)(Sub ShowCurrentQuarter
)Select Case Month(Date
Case 1 To 3
"MsgBox "Quarter 1
Case 4 To 6
80
جمل الت كم
كبديلColon يث استخدمنا النقطتان الرأسيتان،من الممكن كتابة اإلجرائية السابقة كما في الك د أدناه
. ذلك قد يساهم في جعل الك د أكثر سه لة في القراءة التتبع.Case إلدراج سطر جديد بعد كل كلمة
Sub ShowCurrentQuarter()
Select Case Month(Date)
Case 1 To 3: MsgBox "Quarter 1"
Case 4 To 6: MsgBox "Quarter 2"
Case 7 To 9: MsgBox "Quarter 3"
Case 10 To 12: MsgBox "Quarter 4"
End Select
End Sub
81
الفصل السادس
82
جمل التكرار
الفصل السابع
من خالل جمل التكرار تستطيع تكرار تنفيذ أ امر م ددة تى يت قق شرط معين .من األمثلة على
استخدام جمل التكرار:
تنفيذ عمليات معينة على جميع المصنفات أ أ راق العمل المفت ة .مثل فظ اغالق جميع -1
المصنفات المفت ة.
تنفيذ عمليات معينة على جميع عناصر مصف فة م ددة. -2
تنفيذ عمليات معينة على جميع ال ر ف في جملة م ددة -3
تنفيذ عمليات معينة على جميع عناصر مجم عة معينة Collectionمثل عناصر مجم عة -4
المخططات Charts collection
هناك العديد من جمل التكرار التي ت فرها لنا لغة .VBAفي الفقرات القادمة س ف نتعرف عليها
بالتفصيل.
جملة For….Next
تعد هذه الجملة أبسط جمل التكرار .يتم الت كم بالتكرار Loopingمن خالل متغير يعمل كعداد
Counter variableيث أن هذا المتغير يبدأ بقيمة م ددة ينتهي عند قيمة أخرى .يتم تكرار الجمل
البرمجية التي تقع ما بين كلمتي Next Forتى ص ل متغير العداد إلى قيمته النهائية.
مثال 1
هذا مثال بسيط يق م بجمع األعداد من 1إلى 100بشكل تراكمي.
83
الفصل السابع
)(Sub AddFirst100
Dim Total As Integer
Dim Count As Integer
Total = 0
For Count = 1 To 100
Total = Total + Count
Next Count
MsgBox Total
End Sub
في هذا المثال تم انشاء المتغير Countمن ن ع Integerالستخدامه كعداد ،Counter variable
من خالل جملة Forتم تعيين القيمة الدنيا العليا له من خالل الجملة.For Count = 1 To 100 :
بال ضع االفتراضي يزيد العداد بمقدار 1عند كل تنفيذ لجملة Forتى يصل لقيمته النهائية.
تم انشاء المتغير Totalمن ن ع Integerليتم تخزين اصل الجمع التراكمي به .في كل مرة يتم فيها
تشغيل جملة Ifيتم زيادة قيمة هذا المتغير بمقدار المتغير .Count
استخدام Stepمع جملة for
كما تم ذكره سابقاً ،يزيد العداد بال ضع االفتراضي بمقدار 1عند كل تنفيذ لجملة .forإذا كنت تريد أن
تك ن الزيادة بمقدار قيمة أخرى من الممكن استخدام الكلمة المفتا ية Stepمع جملة .If
مثال 2
إذا أردنا أن نق م بجمع األعداد الفردية ال اقعة ضمن النطاق من 1تى 100بشكل تراكمي نستخدم
اإلجرائية التالية:
84
جمل التكرار
Sub AddFirst100_Odd()
Dim Total As Integer
Dim Count As Integer
Total = 0
For Count = 1 To 100 Step 2
Total = Total + Count
Next Count
MsgBox Total
End Sub
في كل مرة بالتالي يتم في كل مرة2 لجعل العداد يزيد بمقدارfor مع جملةStep هنا استخدمنا كلمة
.جمع األرقام الفردية فقط
: في المثال األ ل كما يليfor فمثالً نستطيع كتابة جملة، بالسالبStep من الممكن أن تك ن قيمة
Sub AddFirst100()
Dim Total As Integer
Dim Count As Integer
Total = 0
For Count = 100 To 1 Step -1
Total = Total + Count
Next Count
85
الفصل السابع
MsgBox Total
End Sub
في هذا الك د جعلنا العداد يسير بالعكس من آخر قيمة تى أ ل قيمة له في كل تنفيذ لجملة forيتم
انقاص قيمة العداد بمقدار 1من خالل استخدام .Step -1
مثال 3
في هذا المثال يق م الك د يق م بإدراج عدد م دد من أ راق العمل بشكل ا ت ماتيكي .ب يث أن عدد
أ راق العمل المطل ب اضافته يتم إدخاله من قبل المستخدم عن طريق مربع ادخال .Input boxفي
داخل جملة forتم استخدام الجملة Sheets.Addالضافة رقة عمل في كل مرة يتم فيها تنفيذ جملة
.for
)(Sub AddSheets
Dim SheetsNumber As Integer, counter As Integer
SheetsNumber = InputBox("Please add the number of sheets you would like to
)" add
For counter = 1 To SheetsNumber
Sheets.Add
Next
End Sub
مثال 4
يق م الك د التالي بتظليل سطر كل ثالثة أسطر .نتيجة تنفيذ هذه اإلجرائية هي كما في الشكل 7-1
86
جمل التكرار
Sub ShadeEveryThirdRow()
Dim i As Long
For i = 1 To 100 Step 3
Rows(i).Interior.Color = RGB(200, 200, 200)
Next i
End Sub
Figure 7-1
87
الفصل السابع
88
جمل التكرار
يسار أ ل رقم من تلك الجملة فمثالً إذا تم ادخال الجملة التالية على الدالة ABC123تق م الدالة بإرجاع
ABCأما إذا تم ادخال AB1245تق م بإرجاع ABهكذا.
تعمل هذه الدالة بالشكل التالي:
تق م الدالة بتخزين قيمة الجملة المدخلة (معامل الدالة) في متغير باسم .Str -1
تعطي المتغير TextPartقيمة فارغة مبدئياً. -2
تم استخدام الدالة المدمجة Lenإلرجاع عدد األ رف في النص المدخل .من خالل )Len(Str -3
تم استخدام جملة Forمع الد ال Mid IsNumberلف ص كل رمز Charachterمن -4
النص بدءا ً من اليسار هل الرمز عبارة عن رقم أم ال .يث أن الدالة Midتق م باستخراج
رمز ا د من النص المعطى في كل مرة يتم فيها تنفيذ جملة - Forبدءا ً من اليسار -بينما تق م
الدالة IsNumberبف ص هل الرمز رقم أم ال.
بالنسبة لجملة ،Forتم استخدام المتغير iكعداد لجملة التكرار ،تم ت ديد القيمة الدنيا للعداد -5
بـ 0العليا بعدد الرم ز في النص المعطى (الذي تم ال ص ل عليه من خالل ).Len(Str
تق م جملة Ifالم ج دة بداخل جملة التكرار كل مرة بف ص نتيجة تنفيذ الجملة -6
)) .IsNumeric(Mid(Str, i, 1في ال كانت النتيجة ( Trueأي أن الرمز عبارة عن رقم).
تق م بإنهاء جملة التكرار من خالل تطبيق جملة .Exit Forإال فإنها تق م بإضافة الرمز بجانب
الرم ز السابقة من خالل معامل الربط & ضع النتيجة في المتغير .TextPartهي القيمة
التي تق م الدالة بإرجاعها في النهاية.
)Function TextPart(Str
"" = TextPart
)For i = 1 To Len(Str
If IsNumeric(Mid(Str, i, 1)) Then
Exit For
Else
89
الفصل السابع
جملة Forالمتداخلة
من الممكن استخدام جملة Forبداخل جملة أخرى إلنشاء جمل تكرار أكثر تعقيداً .في المثال التالي
استخدمنا هذه التقنية لعمل شكل ل ة الشطرنج على رقة العمل ،كما في الشكل 7-2
Figure7-2
90
جمل التكرار
)(Sub MakeCheckerboard
Dim Row As Integer, Col As Integer
For Row = 1 To 8
If WorksheetFunction.IsOdd(Row) Then
For Col = 2 To 8 Step 2
Cells(Row, Col).Interior.Color = 0
Next Col
Else
For Col = 1 To 8 Step 2
Cells(Row, Col).Interior.Color = 0
Next Col
End If
Next Row
End Sub
الفكرة في هذا المثال هي أن ل ة الشطرنج تتك ن من ثمانية أعمدة ثمانية صف ف ،في الصف ف
الفردية تك ن الخاليا الز جية مل نة باألس د أما في الصف ف الز جية تك ن الخاليا الفردية مل نة
باألس د.
لذلك أنشأنا جملة Forالخارجية إلنشاء تكرار على مدى الثمانية صف ف .بداخل جملة Forالخارجية
هناك جملتي ، Forا دة للتكرار عبر أعمدة الصف ف الفردية األخرى للتكرار عبر أعمدة الصف ف
الز جية .هنا استخدمنا دالة رقة العمل IsOddلف ص هل الصف فردي أم ز جي.
بالنسبة للصف ف الفردية (التي تك ن نتيجة تنفيذ دالة IsOddفيها )Trueتق م جملة Forبالتكرار عبر
األعمدة الز جية من 2تى 8من خالل جملة
For Col = 2 To 8 Step 2
ال ظ هنا أننا استخدمنا Step 2للقفز بقيمة العداد بمقدار 2في كل تكرار .في كل تكرار يتم تل ين
الخلية الناتجة عن تقاطع ذلك الصف الفردي مع العم د الز جي بالل ن األس د من خالل الك د:
91
الفصل السابع
جملة For…Each…Next
تستخدم جملة For…Each…Nextلتكرار تنفيذ مجم عة من األ امر على كل عنصر من عناصر
مجم عة Collectionsأ مصف فة ،Arrayمثل أن تستخدم هذه الجملة لتنفيذ أ امر معينة على أ راق
العمل ضمن مصنف ما أ على خاليا ضمن أ د النطاقات.
في هذا الن ع من جملة Forال يتم استخدام متغيرا ً كعداد Counter variableيث أن الهدف ه
تطبيق األ امر البرمجية على جميع عناصر المجم عة .Collection
ل المصف فات للمزيد ل المجم عات Collectionsراجع الفصل الثاني (م رر األك اد)
Arraysراجع الفصل الرابع (المتغيرات)
مثال
يق م الك د باألسفل باستخدام For…Each…Nextبإغالق كل المصنفات المفت ة ما عدا المصنف
ال الي.
)(Sub CloseWorkbooks
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> ThisWorkbook.Name Then
wb.Save
wb.Close
End If
Next wb
End Sub
من هذا المثال يتضح لنا أن هناك أربع خط ات لكتابة جملة For Each Nextهي كالتالي:
-1اإلعالن عن متغير لكائن معين من نفس ن ع العناصر التي نرغب بتكرار العمليات عليها .في
هذا المثال تم اإلعالن عن متغير باسم wbمن ن ع . Workbook
92
جمل التكرار
-2كتابة جملة For Each Nextباستخدام العنصر الذي تم اإلعالن عنه في الخط ة 1التجميعة
Collectionالتي ينتمي لها العنصر .هنا استخدمنا السطر التالي للبدء بجملة For Each
:Next
For Each wb In Workbooks
تبدأ الجملة بـ For Eachثم اسم المتغير (هنا اسمه )wbثم الكلمة المفتا ية Inثم اسم التجميعة
التي ينتمي اليها المتغير ( هي هنا .)Workbooks
-3كتابة أسطر األ امر التي نريد تكرارها عبر عناصر التجميعة المطل بة .هنا استخدمنا جملة If
لف ص اسم كل عنصر من عناصر التجميعة (في هذا المثال عناصر التجميعة عبارة عن
مصنفات) من ثم فظ إغالق أي مصنف اسمه مختلف عن اسم المصنف ال الي.
مثال 2
تق م اإلجرائية التالية بإخفاء جميع أ راق العمل في المصنف ال الي ما عدا رقة العمل ال الية.
)(Sub HideSheets
Dim Sh As Worksheet
For Each Sh In ActiveWorkbook.Worksheets
If Sh.Name <> ActiveSheet.Name Then
Sh.Visible = xlSheetHidden
End If
Next Sh
End Sub
93
الفصل السابع
مثال 3
تق م اإلجرائية التالية بإظهار جميع أ راق العمل المخفية مرة ا دة ( هذا شيء ال يمكن عمله من
خالل االكسيل يث أنك من خالل االكسيل تستطيع اظهار رقة عمل ا دة فقط في كل مرة ال يمكن
اظهار جميع األ راق المخفية مرة ا دة)
)(Sub UnhideSheets
Dim ws As Worksheet
For Each ws In Worksheets
ws.Visible = xlSheetVisible
Next ws
End Sub
مثال 4
في هذا المثال تق م اإلجرائية التالية بتل ين الخاليا الفردية في النطاق A1:A20بالل ن األس د .في
البداية تم تعريف متغيرين من ن ع Rangeهما .cell Rngثم تم تعيين النطاق A1:A20للمتغير
Rngمن خالل السطر البرمجي:
)"Set Rng = Range("A1:A20
ثم تم كتابة جملة For Each Nextللتكرار عبر عناصر مجم عة النطاق Range collection
(الم ج دة داخل المتغير )Rngذلك من خالل المتغير .cellيث يتم ف ص المتغير ( cellفي هذا
المثال يمثل المتغير cellخلية ا دة أ باأل رى نطاقا ً يتك ن من خلية ا دة) في كل مرة يتم فيها
التكرار من خالل دالة رقة العمل ،IsOddإذا كانت الخلية تقع ضمن صف فردي يتم تل ين الخلية
بالل ن األس د.
Sub )(PaintOddCells
Dim Rng As Range, cell As Range
Set )"Rng = Range("A1:A20
For Each cell In Rng
94
جمل التكرار
If WorksheetFunction.IsOdd(cell.Row) Then
cell.Interior.Color = 0
End If
Next
End Sub
Figure 7-3
95
الفصل السابع
مثال 5
تق م اإلجرائية التالية ب ذف جميع أ راق العمل الفارغة من المصنف ال الي.
تعمل هذه اإلجرائية كالتالي:
تم تعريف متغير من ن ع Worksheetباسم ws -1
تم انشاء جملة For Each Nextللتكرار عبر عناصر مجم عة أ راق العمل Worksheets -2
Collectionمن خالل المتغير .ws
في كل مرة يتم فيها التكرار يتم تطبيق جملة Ifعلى المتغير wsالذي ي ت ي على إ دى -3
أ راق العمل .تق م جملة Ifباستخدام دالة رقة العمل CouontAلف ص ما إذا كانت خاليا
رقة العمل ت ت ي على أية بيانات .يث أنه كما نعلم تق م دالة CountAب ساب عدد الخاليا
التي ت ت ي على بيانات في نطاق م دد .تأخذ الدالة CountAالمعامل ws.cellsالذي ه
عبارة عن نطاق يشمل جميع خاليا رقة العمل.
في كل مرة تك ن فيها نتيجة تنفيذ الدالة CountAصفر (أي أن ال رقة فارغة) يتم ذف رقة -4
العمل من خالل السطر البرمجيWs.Delete :
إللغاء رسائل الت ذير التي قد تظهر عند ذف أ راق العمل استخدمنا الجملة في بداية اإلجرائية: -5
Application.DisplayAlerts = False
ثم أرجعنا ال ضع لما كان عليه في نهاية اإلجرائية من خالل إعادة تفعيل رسائل الت ذير عن
طريق الجملة التالية:
Application.DisplayAlerts = True
إذا لم نعطل اظهار رسائل الت ذير فس ف يق م االكسيل بإظهار رسالة ت ذير في كل مرة تق م
هذه اإلجرائية بم ا لة ذف إ دى أ راق العمل.
)(Sub DeleteEmptySheets
Dim Ws As Worksheet
Application.DisplayAlerts = False
For Each Ws In ActiveWorkbook.Worksheets
96
جمل التكرار
عند تطبيق هذه الجملة يتم ف ص شرط معين طالما أن هذا الشرط مت قق ،Trueيتم تنفيذ األ امر
بداخل جملة التكرار .تأخذ هذه الجملة الشكل العام التالي:
ار يظهر الجملة كمثال بسيط على كيفية استخدام هذه الجملة ،تق م اإلجرائية باألسفل بعرض مربع
" " Hello VBAخمس مرات.
)(Sub DoWhileDemo
Dim counter As Integer
counter = 1
Do While counter <= 5
)MsgBox ("Hello VBA, " & counter
counter = counter + 1
Loop
End Sub
تعمل هذه اإلجرائية كالتالي:
ُ
.1تم اإلعالن عن متغير ليعمل كعداد أعطي االسم counterتم تعيين قيمة مبدئية له بـ .1
97
الفصل السابع
.2في جملة Do Whileتم استخدام الشرط counter <= 5يث أنه طالما أن هذا الشرط مت قق
Trueيتم تنفيذ ما بداخل جملة التكرار.
.3بداخل جملة التكرار هناك سطران برمجيان (أمران) هما:
)MsgBox ("Hello VBA, " & counter
counter = counter + 1
في السطر األ ل يتم اظهار مربع ار بالجملة " " Hello VBAمع رقم العداد ،أما في السطر
الثاني فيتم زيادة العداد counterبمقدار 1في كل مرة يتم فيها التكرار.
.4عند ص ل العداد counterإلى الرقم 6تصبح نتيجة الجملة الشرطية Falseبالتالي يتم
الخر ج من التكرار.
مثال 2
تق م اإلجرائية التالية بالتكرار عبر مجم عة من الخاليا التي تقع في نفس العم د بدءا ً من الخلية النشطة،
شرط التكرار هنا أن ال تك ن الخلية فارغة (من خالل .) ActiveCell.Value <> Emptyفي ال
أن الخلية ت ت ي على قيمة يتم ضرب القيمة في 2من خالل األمر = ActiveCell.Value
،ActiveCell.Value * 2ثم يتم الت رك بالخلية النشطة لألسفل بمقدار صف ا د من خالل األمر
.ActiveCell.Offset(1, 0).Selectيتم تكرار العملية تى تصبح الخلية النشطة فارغة عندها يتم
الخر ج من جملة التكرار.
)(Sub DoWhileDemo
Do While ActiveCell.Value <> Empty
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop
End Sub
98
جمل التكرار
Do Until…Loop جملة
بعكسFalse إال أن التكرار يتم هنا طالما أن الشرط غير مت ققDo While تشابه هذه الجملة جملة
: تصبح اإلجرائية كالتاليDo Until فمثالً إذا أردنا كتابة المثال األ ل باستخدام.Do While جملة
Sub DoWhileDemo()
Dim counter As Integer
counter = 1
Do until counter > 5
MsgBox ("Hello VBA, " & counter)
counter = counter + 1
Loop
End Sub
Sub DoWhileDemo()
Do until IsEmpty(ActiveCell.Value )
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop
End Sub
99
الفصل السابع
100
الد ال
الفصل الثامن
في السابق ذكرنا أنه بإمكانك استخدام الد ال Functionبداخل الك د البرمجي الخاص بـ .VBAفي
هذا الفصل س ف نتعرف على أن اع الد ال الثالثة التي يمكن للغة VBAالتعامل معها؛ هي الد ال
المدمجة في VBAالد ال المدمجة في اإلكسيل (تسمى د ال رقة العمل ،)Worksheet functions
الد ال المخصصة Custom functionsهي التي تق م أنت بكتابتها.
ما هي الدالة؟
الدالة Functionهي عبارة عن مجم عة من األسطر البرمجية تم تنظيمها بشكل معين ب يث تق م
ببعض ال سابات أ اإلجراءات من ثم ترجع قيمة ا دة .فمثالً دالة SUMهي أشهر د ال رقة
العمل تأخذ مجم عة من القيم (س ا ًء أكانت في نطاقات أم ال) ثم ت سب اصل جمع المعطيات ترجع
قيمة ا دة فقط هي قيمة اصل الجمع.
101
الفصل الثامن
VBAهدف هذا الفصل ليس شرح جميع هذه الد ال انما إعطاء بعض األمثلة التي نستطيع من خاللها
أن ن ضح كيفية التعامل مع هذا الن ع من الد ال.
الدوال Date, Time, and Now
تق م دالة Dateبإرجاع تاريخ الي م أما الدالة Timeفترجع ال قت ال الي ،بينما ترجع الدالة Now
التاريخ ال قت ال اليين .المثال التالي يق م بعرض ال قت ال الي في مربع ار:
)(Sub ShowCurrentDate
MsgBox "Today is: " & Date
End Sub
ال ظ هنا أن هذه الد ال ال تأخذ معامالت ال تى أق اس فارغة بخالف دالتي رقة العمل Date
and Timeاللتان تأخذان مجم عة من المعامالت دالة رقة العمل Nowالتي تأخذ أق اس فارغة.
في ال اقع ل أنك أضفت أق اسا ً فارغة للد ال السابقة فإن م رر VBEس ف يق م بإزالتها.
دالة Len
تق م دالة Lenب ساب عدد األ رف في الجملة ،تأخذ معامالً ا دا ً ه عبارة عن الجملة المراد
معرفة عدد األ رف بها .تق م اإلجرائية التالية ب ساب عدد األ رف المك نة السم المستخدم لبرنامج
االكسيل:
)(Sub GetNameLength
Dim UserName As String
& " MsgBox "Number of characters in the username is:
)Len(Application.UserName
End Sub
ال ظ هنا أننا استخدمنا أ د خصائص تطبيق االكسيل هي خاصية UserNameلمعرفة اسم المستخدم
لبرنامج االكسيل من خالل .Application.UserNameيث استخدمناه كمعامل لدالة .Len
102
الد ال
Figure8-1
103
الفصل الثامن
ال ظ هنا اننا استخدمنا الد ال المتداخلة Nested functionsالختصار السطر البرمجية .يث أننا
استخدمنا الدالة Dateكمعامل للدالة Monthالدالة Monthكمعامل للدالة .MonthName
استخدام الدالة TypeNameلتحديد نوع الكائن المحدد
تستخدم اإلجرائية التالية الدالة TypeNameلعرض ن ع الكائن الم دد:
)(Sub ShowType
Dim ObjectType As String
)ObjectType = TypeName(Selection
MsgBox ObjectType
End Sub
إذا كان العنصر الم دد عبارة عن ص رة فإن نتيجة تنفيذ اإلجرائية السابقة هي كما في الشكل 8-2
104
الد ال
Figure8-2
105
الفصل الثامن
)(Sub Power2
Dim Number As Double
)" Number = InputBox("Enter a number:
MsgBox Number * Number
End Sub
عند تشغيل البرنامج ،س ف يظهر لنا مربع االدخال الخاص بدالة InputBoxكما في الشكل .8-3
بعد أن يتم ادخال الرقم المطل ب في مربع االدخال س ف يتم تعيين تلك القيمة للمتغير Number
من ثم ستق م الدالة MsgBoxبعرض مربع القيمة في مربع ار.
Figure8-3
-3الدالة :Shellتستطيع من خالل هذه الدالة استدعاء أ امر نظام التشغيل يند ز بالتالي تشغيل
أي تطبيق مثبت على النظام .تأخذ الدالة الشكل التالي:
)Shell (Program,WindowStyle
يث أن Programه اسم البرنامج المطل ب تشغيله WindowStyle ،ه كيفية اظهار نافذة
البرنامج الذي تم استدعاؤه (كأن تك ن مكبرة Maximizeأ مصغرة ،Minimizedتم التركيز
عليها Focusedأ لم يتم التركيز عليها .... ،Not Focusedالخ) .يظهر لنا الشكل 8-4خيارات
106
الد ال
اظهار النافذة ،ال ظ هنا أن م رر األ امر VBEيساعدك في االختيار بين الخيارات المختلفة؛
فبمجرد ضع الفاصلة التي تلي اسم البرنامج المطل ب يق م VBEبعرض قائمة بالخيارات لالختيار
منها .ال ظ أيضا ً أن اسم البرنامج يجب أن ي ضع بداخل عالمات االقتباس.
Figure8-4
من التطبيقات المفيدة لهذه الدالة استدعاء برنامج اآللة ال اسبة إلجراء ال سابات أثناء استخدام
البرنامج أ برنامج التقاط الشاشة Snipping Toolألخذ ص ر لشاشة ال اسب أثناء تشغيل
البرنامج.
عى ) Process ID (PIDيجب تعيين
تق م هذه الدالة بإرجاع رقم العملية الخاص بالبرنامج ال ُمستد َ
هذه القيمة لمتغير تى يمكن تشغيل البرنامج الذي تم استدعاؤه.
اإلجرائية التالية تق م باستدعاء برنامج اآللة ال اسبة ،هنا تم اإلعالن عن المتغير ( PIDمن األفضل
أن يك ن من ن ع Variantفي الة هذه الدالة) من ثم تم تعيين قيمة تنفيذ الدالة Shellإليه .
بالطبع يمكن ربط هذه اإلجرائية مع زر أ امر أ شكل لتشغيلها كما رأينا في الفصل الثالث.
)(Sub LaunchCalc
Dim PID As Variant
)PID = Shell("calc", vbNormalFocus
End Sub
107
الفصل الثامن
Figure8-5
108
الد ال
total = Application.WorksheetFunction.Sum(Range("A1:A10"))
total = WorksheetFunction.Sum(Range("A1:A10"))
total = Application.Sum(Range("A1:A10"))
يث أنWorksheetFunction ربما كان من األفضل استخدام الجملة البرمجية التي يظهر بها
.ًالك د في هذه ال الة يك ن أكثر ض ا
بعض األمثلة على استخدام دوال ورقة العمل
إيجاد الحد األعلى واألدنى وثاني أكبر قيمة في نطاق محدد
.من الممكن استخدام اإلجرائية التالية إليجاد المطل بات أعاله
Sub MinMax()
Dim TheMax As Double
Dim TheMin As Double
Dim Second_Large As Double
TheMax = WorksheetFunction.Max(Range("A1:A10"))
TheMin = WorksheetFunction.Min(Range("A1:A10"))
Second_Large = WorksheetFunction.Large(Range("A1:A10"), 2)
MsgBox "Maximum number in the range is " & TheMax
MsgBox "Minimum number in the range is " & TheMin
MsgBox "second large number in the range is " & Second_Large
End Sub
109
الفصل الثامن
110
الد ال
Sheets("Prices").Activate
-3تق م اإلجرائية باستخدام دالة رقة العمل VLOOKUPللب ث عن سعر الصنف بداللة رقمه
الذي تم ال ص ل عليه من الخط ة رقم 1من خالل السطر التالي:
111
الفصل الثامن
112
التعامل مع األخطاء
الفصل التاسع
األخطاء من األم ر الشائعة جدا ً عند التعامل مع ،VBAتنقسم األخطاء في VBAإلى ثالثة أقسام:
-1األخطاء التشغيلية
-2أخطاء الصياغة Syntax errors
-3األخطاء المنطقية
األخطاء التشغيلية Runtime time errors
األخطاء التشغيلية هي األخطاء التي ت دث أثناء تشغيل البرنامج هي ت دث عندما ي ا ل البرنامج
اجراء عملية غير شرعية ،اما بسبب ادخال خاطئ مثل أن يق م المستخدم بإدخال قيمة نصية في ين
يت قع البرنامج قيمة رقمية ،أ أن ي ا ل البرنامج اجراء عملية ما على عنصر غير م ج د؛ مثل أن
يك ن البرنامج مبرمجا ً إلجراء عملية ما على رقة العمل Sheet2بينما ال ي ت ي المصنف على
رقة العمل هذه ،أ أي عملية أخرى غير شرعية مثل القسمة على صفر .عند د ث هذا الن ع من
األخطاء يت قف البرنامج عن العمل يُظهر رسالة خطأ .في الشكل 9-1يظهر خطأ ً تشغيليا ً ناتج عن
م ا لة البرنامج القسمة على صفر.
113
الفصل التاسع
Figure9-1
من ال سائل التي يمكن استخدامها لتالفي األخطاء التشغيلية ،اجراء عملية ت قق للبيانات السماح
للمستخدم بإدخال الن ع المناسب .كمثال على ذلك انظر الك د التالي:
)(Sub test
Dim i As Double
)"i = InputBox("Enter a value
)x = Sqr(i
MsgBox x
End Sub
تق م هذه اإلجرائية بعرض الجذر التربيعي للرقم الذي يق م المستخدم بإدخال من خالل مربع رسائل،
ثم تق م بكتابة تلك القيمة في الخلية النشطة .يعمل البرنامج بشكل ممتاز طالما أن المستخدم يدخل قيما ً
م جبة ،أما إذا ا ل المستخدم ادخال رقم أقل من صفر فإن البرنامج سيُظهر رسالة خطأ.
114
التعامل مع األخطاء
لتالفي هذه الخطأ من الممكن استخدام اجراء عملية ت قق للبيانات التي يق م المستخدم بإدخالها كما
في الك د التالي:
)(Sub test
Dim i As Double
)"i = InputBox("Enter a value
If i < 0 Then
"MsgBox "You must enter a positive number.
Exit Sub
End If
)x = Sqr(i
MsgBox x
End Sub
هنا استخدمنا جملة Ifإلجراء عملية الت قق من ص ة البيانات من خالل ف ص قيمة الرقم المدخل فإذا
كان ذ قيمة أقل من صفر تق م جملة Ifبعرض رسالة خطأ ،من ثم يتم الخر ج من اإلجرائية من
خالل جملة .Exit Sub
هل انتهينا؟ جرب أن تدخل قيمة نصية .ماذا ل كانت رقة العمل النشطة هي عبارة عن رقة
مخطط؟ سيظهر لك خطأ ً تشغيليا ً أيضاً .من الممكن أن تكتب جمل أخرى اضافية للت قق من ص ة
البيانات المدخلة ،كما في الك د التالي ( ا دة للت قق من أن القيمة المدخلة هي قيمة رقمية أخرى
للت قق من أن الت ديد ه على نطاق Rangeليس على عنصر آخر مثل الص ر أ المخططات).
)(Sub test
Dim i As Variant
)"i = InputBox("Enter a value
115
الفصل التاسع
If i < 0 Then
MsgBox "You must enter a positive number."
Exit Sub
End If
If TypeName(Selection) <> "Range" Then
MsgBox "Select a cell for the result."
Exit Sub
End If
If Not IsNumeric(i) Then
MsgBox "You must enter a number."
Exit Sub
End If
x = Sqr(i)
MsgBox x
ActiveCell.Value = x
End Sub
للت قق من أن الت ديد على نطاقIf TypeName(Selection) <> "Range" هنا استخدمنا الجملة
.ً للت قق من أن االدخال ليس نصياIf Not IsNumeric(i) Then من الخاليا جملة
.ًهل انتهينا بعد؟ جرب أن تك ن رقة العمل النشطة م مية سيظهر لك خطأ ً تشغيليا
116
التعامل مع األخطاء
لس ء ال ظ قد ال يمكنك تخمين جميع األخطاء التشغيلية التي قد تظهر أثناء تشغيل البرنامج ،إضافة
إلى أن استخدام مجم عة كبيرة من جمل الت قق من الص ة يجعل البرنامج أكثر تعقيداً .هنا يعطيك
االكسيل خيارا ً آخر للتعامل مع األخطاء التشغيلية أال ه جملة .On Error
جملة On Error GoTo
تق م جملة On Errorباعتراض جميع أن اع األخطاء التشغيلية التي قد تظهر من ثم يمكن من
خاللها ت ديد نقطة م ددة في البرنامج يستمر البرنامج بعدها بعد أن يك ن قد تجا ز الخطأ التشغيلي.
في اإلجرائية التالية أعدنا كتابة المثال السابق الخاص بالجذر التربيعي انما باستخدام جملة On Error
ك سيلة لتالفي ظه ر األخطاء التشغيلية.
)(Sub test
Dim i As Double
On Error GoTo bad_entry
)"i = InputBox("Enter a value
)x = Sqr(i
MsgBox x
Exit Sub
bad_entry:
msg = "Bad entry. Please make sure that entry is number greater than
"zero,
"msg = msg & " you select a cell, and worksheet is not protected
MsgBox msg
End Sub
117
الفصل التاسع
ال ظ هنا أننا استخدمنا تسمية Labelمع جملة On Errorإلخبار البرنامج بأن يستمر من بعد تلك
التسمية .في هذا المثال تم استخدام التسمية ( bad_entry:ال ظ هنا أن التسمية يجب أن تك ن
متب عة بالنقطتين الرأسيتين) ،بينما تم استخدام الكلمة المفتا ية GoToمع جملة On Errorمتب عة
باسم التسمية التي س ف يستمر البرنامج من بعدها عند د ث خطأ ما.
)(Sub test
On Error Resume Next
Dim i As Integer
i=0
x = 20 / i
"MsgBox "This is a test
End Sub
118
التعامل مع األخطاء
)(Sub test
Dim i As Double
try_again:
On Error GoTo bad_entry
)"i = InputBox("Enter a value
)x = Sqr(i
MsgBox x
Exit Sub
bad_entry:
msg = "Bad entry. Please make sure that entry is number greater than
"zero,
119
الفصل التاسع
"msg = msg & " you select a cell, and worksheet is not protected
)ans = MsgBox(msg, vbYesNo + vbCritical
If ans = vbYes Then Resume try_again
End Sub
جملة Resume
تستخدم هذه الجملة فقط في ال ما إذا كان الك د الذي يعالج األخطاء Error handlingي ت ي على
آلية لمعالجة األخطاء ،فبعد أن تتم معالجة الخطأ يتم استخدام كلمة Resumeللرج ع مرة أخري
للجملة التي أنتجت الخطأ .فمثالً تق م اإلجرائية التالية بطلب أن يق م المستخدم بإدخال قيمة من ثم
اجراء عملية معينة على تلك القيمة ارجاع الناتج في الخلية A1الم ج دة ضمن رقة العمل .test
إذا لم تكن رقة العمل testم ج دة ضمن المصنف فإن خطأ ً تشغيليا ً س ف يظهر .لتالفي ظه ر
هذا الخطأ تم إضافة جزء معالجة األخطاء Error handlerإلى الك د ت ت التسمية
.error_handler
في جزء معالجة األخطاء تم إضافة ك د إلدراج رقة عمل بإسم testمن خالل السطر البرمجي:
"Worksheets.Add(after:=Worksheets(1)).Name = "test
من ثم تم إضافة الكلمة Resumeللرج ع مرة أخرى للجملة التي أنتجت الخطأ الم ا لة مرة
أخرى.
)(Sub test
Dim i As Integer
)"i = InputBox("Please enter a value
On Error GoTo error_handler
120
التعامل مع األخطاء
Sheets("test").Range("A1") = i * 150
Exit Sub
error_handler:
"Worksheets.Add(after:=Worksheets(1)).Name = "test
Resume
End Sub
121
الفصل التاسع
اآلخر بعدa األ ل قبل ادخال قيمةi ار لمتابعة قيمة هنا استخدمنا مربعي.a فيi ضرب قيمة
.If إدخالها بعد تنفيذ جملة
Sub test ()
Dim i As Double
i = InputBox("Enter a value of i")
MsgBox "Value of i in the beginning is: " & i
a = InputBox("Enter a value of a")
If a < 1 Then i = i * a
MsgBox "Value of i after If statment is: " & i
End Sub
Sub test()
Dim i As Double
i = InputBox("Enter a value of i")
msg = "Intial value of i is: " & i & vbNewLine
a = InputBox("Enter a value of a")
If a < 1 Then i = i * a
msg = msg & "Value of i after If statment is: " & i & vbNewLine
122
التعامل مع األخطاء
Figure9-2
ال ظ هنا أننا استخدمنا الكلمة المفتا ية vbNewLineمع دالة مربع ال ار MsgBoxللنز ل
بالنص سطرا ً ا داً.
مثال 2
في المثال التالي يق م الك د بالتكرار عبر أ راق العمل في المصنف إعطاء الصف األ ل في كل
رقة الل ن األ مر .من الممكن هنا استخدام مربعات ال ار لمعرفة ال رقة التي يتم العمل عليها
الياً.
123
الفصل التاسع
Sub test()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Activate
MsgBox "Current sheet is: " & ws.Name
ws.Range("1:1").Interior.Color = vbRed
Next ws
End Sub
Figure9-3
124
التعامل مع األخطاء
)(Sub test
Dim i As Double
)"i = InputBox("Enter a value of i
Debug.Print "Intial value of i is: " & i
)"a = InputBox("Enter a value of a
If a < 1 Then i = i * a
Debug.Print "Value of i after If statment is: " & i
Debug.Print "Value of a: " & a
End Sub
125
الفصل التاسع
Figure9-4
126
التعامل مع األخطاء
-معرفة قيم المتغيرات بص رة سهلة سريعة من خالل الت رك بمؤشر الما س ف ق المتغير،
فيتم عرض قيمة المتغير في نافة صغيرة.
-ت رير تعديل الك د من ثم االستمرار في التنفيذ.
-تجا ز تنفيذ بعض األسطر االنتقال مباشرة إلى السطر المطل ب (من الممكن السير في هذه
العملية لألمام للخلف)
ادراج نقاط التوقف
يمكن ادراج نقاط الت قف باستخدام أي من الطرق التالية:
-من خالل النقر بزر الما س األيمن ف ق السطر الذي نريد ادراج نقطة الت قف عنده ،ثم
اختيار Toggleثم Breakpoint
-من خالل النقر بزر الما س األيسر على المنطقة الرمادية الم ج دة على يسار السطر الذي
نريد ادراج نقطة الت قف عنده.
-من خالل ضع مؤشر الما س في السطر المطل ب ،من ثم الضغط على .F9
عند ادراج نقطة ت قف عند سطر ما ،يتم تل ين ذلك السطر بالل ن األ مر ،ت ُ ضع نقطة مراء في
الهامش الرمادي الم ج د يسار الك د ،مقابل السطر المطل ب.
Figure9-5
إلزالة نقطة ت قف ،انقر بزر الما س األيسر ف ق النقطة ال مراء الم ج دة على يسار السطر.
127
الفصل التاسع
عند تشغيل برنامج ي ت ي على نقطة ت قف ،فإن تنفيذ البرنامج يت قف قبل السطر الذي ي ت ي على
نقطة لت قف ،يتم تظليل السطر بالل ن األصفر يظهر سهم أصفر على يسار السطر ،تظهر كلمة
Breakفي أعلى النافذة.
Figure9-6
من الممكن استخدام الكلمة المفتا ية Stopإلدراج نقطة ت قف ،يث تُكتب هذه الجملة قبل
السطر الذي تريد ادراج نقطة الت قف عنده مباشرة.
128
التعامل مع األخطاء
لتنفيذ أي أمر في نافذة التنفيذ الف ري يجب كتابة كلمة Printقبل األمر (يمكن االستعاضة بـ ؟ بدالً
من .)Printعلى سبيل المثال لعرض قيمة المتغير iنستخدم( Print i :أ ببساطة .) ? iانظر
الشكل9-7
Figure9-7
129
الفصل التاسع
Next i
MsgBox x
End Sub
يظهر مربع ال ار الخاص بإضافة نافذة مراقبة كما في الشكل .9-8أدخل الشرط /التعبير المطل ب
في خانة ،Expressionثم دد اإلجرائية المطل ب مراقبتها من خالل الخانة Procedureال دة
البرمجية .Module
في الجزء الخاص بن ع المراقبة Watch Typeهناك ثالث خيارات:
:Watch Expression -1هذا الخيار يق م بعرض نتيجة التعبير (الجملة البرمجية) الذي تم
إدخاله في خانة Expressionعند ال ص ل إلى نقطة ت قف Breakpoint
:Break when value is True -2هذا الخيار يق م بإدخال البرنامج في ط ر اإليقاف
Breakpointعند ت قق الشرط المدخل في خانة Expressionمن ثم يمكنك تف ص قيم
المتغيرات من خالل نافذة Immediate Windowأ من خالل الت رك بمؤشر الما س
ف ق المتغير المطل ب.
:Break When Value Changes -3هذا الخيار يق م بإدخال البرنامج في ط ر اإليقاف
Breakpointعند تغير قيمة المتغير /نتيجة التعبير المدخل في خانة Expression
الشكل 9-8يظهر لنا كيفية ادراج شاشة مراقبة ،تق م بإيقاف البرنامج عند ص ل المتغير iللقيمة
،500بينما يق م الشكل 9-9بعرض شكل نافذة المراقبة البرنامج عند ت قق الشرط المكت ب في
خانة .Expression
130
التعامل مع األخطاء
Figure9-8
Figure9-9
131
الفصل التاسع
Figure9-10
132
التعامل مع األخطاء
Figure9-11
133
الفصل التاسع
134
األ داث
الفصل العاشر
.10األحداث Events
ا دى طرق تنفيذ االجرائيات هي تنفيذها تلقائيا ً عند د ث دث معين .ال دث ،Eventه ببساطة
عبارة عن شيء دث لالكسيل .بعض األ داث هي كما يلي:
فتح مصنف جديد -
فظ المصنف -
اغالق المصنف -
ادراج أ ذف رقة عمل -
التعديل على رقة عمل -
طباعة رقة عمل -
دخ ل قت معين -
د ث خطأ معين -
في هذا الفصل س ف نتعرف على األ داث Eventsاألكثر شي عا ً في االكسيل كيفية االستفادة منها
في تنفيذ االجرائيات .في الجد لين التاليين قائمة باأل داث األكثر شي عاً .بالطبع هناك أ داث أكثر
بكثير ،إذا كنت تريد معرفة القائمة الكاملة فيمكنك أن تب ث في نظام المساعدة الخاص بم رر األك اد
VBEأ المساعدة عبر االنترنت.
135
الفصل العاشر
136
األ داث
137
الفصل العاشر
كنت فعالً تريد استخدام هذا ال دث .أما إذا لم يكن هذا ال دث المطل ب فعليك ذف إجرائية
.Workbook_Openبالمثل اذا اخترت Worksheetمن القائمة Objectفإن إجرائية معالجة
ال دث االفتراضية س ف تك ن Worksheet_SelectionChangeفإذا لم تكن ب اجة لها فقم
ب ذفها.
Figure10-1
يجب أن ي ضع كل Event-Handlerفي مكانه الص يح ،فإذا تم مثالً كتابة معالج دث خاص
ب رقة العمل في نافذة الك د الخاصة بالمصنف فلن يعمل.
138
األ داث
139
الفصل العاشر
Figure10-2
140
األ داث
ال ظ أنك من الممكن أن تكب جملة Ifبالشكل التالي اختصارا ً يث تم استبدال ThisWorkbookبـ
:Me
If Me.Saved = False Then Me.Save
141
الفصل العاشر
142
األ داث
الحدث Deactivate
ي صل هذا ال دث عند الغاء التنشيط عن رقة العمل .كمثال يق م الك د باألسفل بف ص م ت يات
الخلية A1عند الغاء التنشيط عن رقة العمل ،Sheet1فإذا كانت فارغة يعرض رسالة خطأ تذكر
المستخدم بأن يدخل قيمة في تلك الخلية يمنع المستخدم من االنتقال ل رقة عمل أخرى قبل ادخال قيمة
في الخلية A1في ال رقة .Sheet1
143
الفصل العاشر
Sheets("sheet1").Activate
End If
End Sub
:Command Block ثم تق م بتل ين صف عم د الخلية النشطة من خالل كتلة األ امر
144
األ داث
With ActiveCell
.EntireRow.Interior.Color = RGB(248, 203, 173)
.EntireColumn.Interior.Color = RGB(180, 198, 231)
End With
Figure10-3
145
الفصل العاشر
146
األ داث
Figure10-4
147
الفص ال ادي عشر
148
التفاعل مع المستخدم
في هذا الفصل سيتم التعرض ل االت مختلفة لكل من دالة MsgBoxالتي تق م بعرض البيانات ضمن
مربع ار مع إمكانية أخذ تغذية راجعة من المستخدم ،دالة InputBoxالتي تستخدم إلدخال البيانات
من خالل مربع ار .إضافة إلى ذلك فسيتم التطرق لدالة Application.InputBoxالتي تُستخدم
إلدخال أشياء مثل المعادالت أ مراجع النطاقات.
الدالة MsgBox
تق م الدالة MsgBoxبعرض مربع ار بسيط يمكن استخدامه لعرض معل مات للمستخدم أ أخذ
تغذية راجعة منه مثل أن يضغط المستخدم على زر م افق أ الغاء األمر.
تأخذ هذه الدالة الشكل التالي:
)]MsgBox(prompt[, buttons][, title
يث أن:
:Prompt -عبارة عن نص الرسالة الذي س ف يظهر على مربع ال ار .ه معامل اجباري.
:Buttons -هذا المعامل ي ضح ن ع األزرار التي ترغب بإظهارها على مربع ال ار باإلضافة
إلى أنه يمكن استخدامه أيضا ً لعرض ا دى األيق نات التي قد تساعد في ت ضيح الهدف من
مربع ال ار (مثل أيق نة الت ذير أ اإلعالم).
149
الفص ال ادي عشر
Figure11-1
)(Sub test
"MsgBox "Press OK to print data...
Range("data").PrintOut
End Sub
150
التفاعل مع المستخدم
Figure11-2
151
الفص ال ادي عشر
ال ظ أننا في هذا المثال استخدمنا المعامل الثاني ( ه اختياري) لدالة MsgBoxالذي من خالله تم
ت ديد ن ع األزرار التي نرغب بإظهارها على مربع ال ار (في هذا لمثال زري .)No Yesثم
استخدمنا جملة Selectلتنفيذ األ امر بناء على الزر الذي س ف يتم الضغط عليه.
ال ظ هنا أننا استخدمنا متغير ( )Ansلتخزين نتيجة الضغط على أ د األزرار فيه ،قبل استخدام هذا
المتغير في جملة .Selectمن الممكن عدم استخدام المتغير Ansكما في المثال التالي:
)(Sub test_msgbox
If MsgBox("Do you want to print data", vbYesNo)= vbYes Then
...[code if Yes is clicked]...
Else
...[code if Yes is not clicked]...
End If
End Sub
Figure11-3
في الجد ل التالي القائمة الكاملة للخيارات التي يمكن استخدامها في المعامل الثاني لدالة MsgBox
( .)Buttonsيمكنك استخدام الكلمة مثل vbOKCancelأ القيمة الرقمية المكافئة كما في الجد ل.
152
التفاعل مع المستخدم
الستخدام أكثر من قيمة للمعامل مثل أن تعرض األزرار OK, Cancelمع عالمة المعل مات
Informationيمكنك استخدام إشارة :+
vbYesNO + Information
في المثال السابق إذا تم تغيير الجملة
)Ans = MsgBox("Do you want to print data", vbYesNo
إلى
)Ans = MsgBox("Do you want to print data", vbYesNo + vbInformation
فسيظهر لنا مربع ال ار كما في الشكل . 11-4ال ظ عالمة المعل مات على اليسار.
153
الفص ال ادي عشر
Figure11-4
154
التفاعل مع المستخدم
تم تعريف متغير من ن ع Stringباسم nameلتخزين قيمة االدخال فيه .عند تنفيذ اإلجرائية سيظهر
لنا مربع االدخال كما بالشكل 11-5
Figure11-5
إذا أدخلنا االسم Mohammedفإن البرنامج سيق م بعرض الرسالة التر يبية كما باألسفل
Figure11-6
155
الفص ال ادي عشر
156
التفاعل مع المستخدم
مثال
يق م البرنامج باألسفل باستخدام Application.InputBox methodبعرض مربع ار يق م
المستخدم من خالله بت ديد خلية من ثم يتم ف ص قيمة الخلية فإذا كانت أكبر من صفر يتم تل ين الخلية
بالل ن األخضر.
ال ظ هنا أننا استخدمنا الكلمة المفتا ية Setلتعيين قيمة للمتغير mycellيث أن هذا المتغير يتم
استخدامه هنا لي ت ي على عنصر نطاق ( Rangeمن المعر ف أنه لتعيين قيمة لمتغير من ن ع نطاق
يجب استخدام الكلمة المفتا ية .Setراجع الفصل الرابع )
)(Sub test_cell
Worksheets("Sheet1").Activate
)Set mycell = Application.InputBox( prompt:="Select a cell", Type:=8
If mycell.Value > 0 Then mycell.Interior.Color = vbGreen
End Sub
157
الفص ال ادي عشر
158
النماذج
.12النماذج UserForms
تعد النماذج من ال سائل الجيدة إلدخال البيانات عرضها .يث أنك من خاللها تستطيع الت كم بكيفية
ادخال البيانات من يث ترتيب ادخال البيانات أ اختيار ال سيلة المناسبة لكل ن ع من البيانات المطل بة
أ اجراء عملية الت قق من االدخال للبيانات المدخلة غيرها من األشياء .يمكنك أيضا ً الت كم بكيفية
عرض البيانات بالشكل الذي يالئم طبيعة البيانات المعر ضة مما يعطيك مر نة عالية جدا ً في التعامل
مع البيانات.
يتم ادراج النماذج مع عناصر الت كم الخاصة بها الك د المرتبط بالنم ذج العناصر عليه من خالل
م رر األك اد .VBE
159
الفصل الثاني عشر
Figure12-1
س ف يتم ادراج نم ذج Formكما في الشكل . 12-1بعد أن يتم ادراج النم ذج من الممكن أن تت كم
بخصائصه من خالل الجزء الخاص بخصائص النم ذج UserForm propertiesفمثال يمكن تغيير
ل ن الخلفية من خالل تعديل الخاصية BackColorيمكن تغيير عن ان النم ذج من خالل الخاصية
.Captionيتم تعديل الخصائص من خالل الضغط على ال قل الم ج د على يمين اسم الخاصية فيتم
فتح قائمة منسدلة (في أغلب األ يان) نختار منها االعداد المطل ب ،إذا لم تكن هناك قائمة منسدلة (كما
في خاصية اسم النم ذج) نكتب قيمة االعداد المطل ب .اذا لم تكن نافذة الخصائص ظاهر فيمكن اظهارها
من خالل الذهاب إلى قائمة Viewثم اختيار .Properties Window
160
النماذج
Figure12-3
Figure12-2
161
الفصل الثاني عشر
Figure12-4
162
النماذج
163
الفصل الثاني عشر
Figure12-5
164
النماذج
)(Sub print_from
UserForm1.Show
End Sub
Figure12-6
تى هذه الل ظة ال يق م النم ذج بإجراء أي عملية فعند الضغط على أي من األزرار عليه ال ي دث
شيء يث أنه لم يتم بعد كتابة أي ك د خاص بالنم ذج أ العناصر الم ج دة عليه .في الفقرات التالية
س ف نتعرف على كيفية إضافة األك اد الخاصة بالنماذج.
165
الفصل الثاني عشر
Figure12-7
166
النماذج
تذكر !! الفرق بين Hide Unloadه أن VBAيق م في ال الة األ لى بإغالق النم ذج م
بياناته من الذاكرة بينما في ال الة الثانية يق م بإخفاء النم ذج مع اإلبقاء على البيانات بداخله كما
هي.
167
الفصل الثاني عشر
ال ظ أننا في هذه اإلجرائية استخدمنا With…..End Withلتبسيط الك د منع التكرار .يق م الك د
أ الً بتغيير اتجاه ال رقة إلى االتجاه الط لي Portraitمن خالل الك د:
.PageSetup.Orientation = xlPortrait
ثم عرض معاينة قبل الطباعة ل رقة العمل من خالل السطر البرمجي:
.PrintPreview
ال ظ أننا في بداية اإلجرائية أدخلنا السطر البرمجي Unload Meإلغالق النم ذج بعد الضغط على
زر .Portraitبد ن هذا السطر س ف يبقى النم ذج ظاهرا ً لن يك ن بإمكانك اغالقه يث أن االكسيل
س ف يك ن ينتظر منك أن تتعامل مع نافذة المعاينة قبل الطباعة ،في نفس ال قت لن يمكنك التعامل مع
نافذة معاينة قبل الطباعة قبل اغالق النم ذج بذلك تك ن قد دخلت بداخل لقة مفرغة .لذلك يجب
ادخال Unload Meفي بداية اإلجرائية.
168
النماذج
لكتابة الك د الخاص بزر األمر Landscapeانقر عليه نقرا ً مزد جا ً ثم أدخل الك د التالي:
)(Private Sub cmd_portrait_Click
Unload Me
With ActiveSheet
.PageSetup.Orientation = xlPortrait
.PrintPreview
End With
End Sub
أصبح لدينا اآلن الك د جاهز لجميع العناصر .لتشغيل البرنامج يمكن استدعاء اإلجرائية print_form
التي تم انشائها سابقا ً هي كالتالي:
)(Sub print_from
UserForm1.Show
End Sub
من الممكن إضافة اختصار للبرنامج إلى شريط األد ات Ribbonمن خالل تخصيص الشريط كما
يلي:
-1انقر بزر الما س األيمن ف ق الشريط Ribbonثم اختر .Customize the ribbon
-2أضف مجم عة جديدة أل د ألسنة التب يب الم ج دة عن طريق اختيار لسان التب يب المطل ب
ثم الضغط على زر .New Groupمثالً إذا أردت إضافة مجم عة جديدة لتب يب "الصف ة
الرئيسية "Homeف دد Homeثم انقر على .New Groupبعد اإلضافة يمكن اعادة تسمية
المجم عة عن طريق ت ديدها ثم اختيار .Rename
169
الفصل الثاني عشر
-3أضف البرنامج المطل ب للشريط عن طريق اختيار Macrosمن القائمة المنسدلة Choose
commands fromثم ت ديد اسم اإلجرائية المطل بة اضافتها للمجم عة كما في الشكل
.12-8بالطبع يمكنك إعادة تسمية األيق نة على شريط األد ات اعطائها شكل مخصص.
ل تخصيص شريط األد ات راجع الفصل األ ل من كتاب "اكسيل 2019الدليل السهل" للمزيد
Figure12-8
170
النماذج
Figure12-9
Figure12-10
171
الفصل الثاني عشر
Figure12-11
لعمل ذلك نق م بإدراج عنصر Labelإلى النم ذج ،نعدل ن ع الخط في التسمية الت ضي ية من خالل
تعديل ن ع الخط من خصائص التسمية الت ضي ية كما في الشكل .12-12
Figure12-12
172
النماذج
لجعل التسمية الت ضي ية تظهر اسم المصنف ال الي رقة العمل النشطة عند تشغيل النم ذج ،نظهر
الك د الخاص بالنم ذج عن طريق النقر بزر الما س األيمن ف ق أي مكان على النم ذج ثم اختيار
View Codeثم من القائمة المنسدلة الخاصة باأل داث نختار ال دث initializeثم ندخل الك د التالي
في إجرائية معالج ال دث ( Event-Handler procedureانظر الشكل )12-13
)(Private Sub UserForm_Initialize
Label1.Caption = ActiveWorkbook.Name & " " & ActiveSheet.Name
End Sub
رقة العمل النشطة في التسمية اآلن بمجرد تشغيل النم ذج س ف يتم عرض اسم المصنف ال الي
الت ضي ية .Label1
Figure12-13
173
الفصل الثاني عشر
Figure12-14
لت ديد المجم عة التي ينتمي إليها أ د أزرار االختيار يمكنك استخدام ا دى الطريقتين اآلتيتين:
-أضف إطار Frameللنم ذج من ثم ضع أزرار االختيار التي تنتمي لنفس المجم عة لذلك
اإلطار .هذه الطريقة هي المستخدمة في النم ذج الظاهر في الشكل . 12-15
أعط لجميع أزرار المجم عة نفس اسم المجم عة Group Nameمن خالل الخاصية ِ -
.GroupNameمن الممكن أن ت دد جميع أزرار االختيار التي تريد ضمها لنفس المجم عة
من ثم تغير اسم المجم عة لجميع األزرار مرة ا دة من خالل تغيير GroupNameكما
في الشكل .12-15
174
النماذج
Figure12-15
175
الفصل الثاني عشر
مثال
في هذا المثال المطل ب التعديل على نم ذج الطباعة الذي تعرضنا له مسبقا ً ب يث نستخدم أزرار
االختيار لت ديد هل الطباعة ط لية أم عرضية بدالً من أزرار األ امر.
-1أ الً قم بإدراج نم ذج فارغ ثم أدرج إطار Frameثم أدرج زري اختيار OptionButtons
بداخل االطار.
-2غير خصائص الزرين ب يث يأخذ زر الطباعة الط لية االسم optPortrait :Name
العن ان Portrait :Captionزر الطباعة العرضية االسم optLandscapeالعن ان
.Landscape
-3أدرج زري أمر .Print Cancelبالنسبة لزر Cancelفأعطه نفس الك د الم ج د في
المثال السابق .بالنسبة للزر Printفأعطه الك د التالي:
)(Private Sub cmdPrint_Click
Unload Me
If optPortrait.Value = True Then
With ActiveSheet
.PageSetup.Orientation = xlPortrait
.PrintPreview
End With
ElseIf optLandscape.Value = True Then
With ActiveSheet
.PageSetup.Orientation = xlPortrait
.PrintPreview
End With
176
النماذج
Else
"MsgBox "Please choose Portrait or Landscape
frmPrint.Show
End If
End Sub
Figure12-16
يبدأ الك د بف ص قيمة زر االختيار optPortraitفإذا كانت قيمته ( Trueأي أنه تم اختيار هذا الخيار)
فسيتم تنفيذ الك د الخاص بالطباعة الط لية كما رد سابقاً .أما إذا كانت قيمة االختيار optLandscape
هي Trueفسيتم تنفيذ ك د الطباعة العرضية .أما إذا لم يتم اختيار أي من الخيارين فس ف تظهر رسالة
تنبيه للمستخدم تطلب منه اختيار أ د الخيارين ،من ثم يتم اظهار النم ذج مرة أخرى من خالل السطر
البرمجي ( frmPrint.Showيث أن النم ذج تم اخفاؤه في السطر األ ل من البرنامج للسبب الذي
تم ذكره في المثال في الصف ة .) 168
177
الفصل الثاني عشر
من الممكن أن تجعل البرنامج يق م بت ديد أ د األزرار بشكل افتراضي Default selectionمن
خالل تعديل الك د الخاص ببدء النم ذج ،سب الخط ات التالية:
-اعرض الك د الخاص بالنم ذج عن طريق النقر بزر الما س األيمن ف ق أي مكان فارغ على
النم ذج اختيار .View Code
-من القائمة المنسدلة الخاصة باأل داث
-من القائمة المنسدلة الخاصة باأل داث (أعلى يمين النافذة) اختر ال دث Initializeثم أدرج
الك د التالية في إجرائية معالجة ال دث )(:UserForm_Initializ
optPortrait.Value = True
Figure 12-17
178
النماذج
يك ن مربع االختيار مفيدا ً عندما يك ن لديك االختيار بين نعم ال أ True/Falseأ On/Offهكذا.
فيما يلي أهم الخصائص الخاصة بمربع االختيار:
:ControlSource -خلية رقة العمل المرتبطة بصند ق االختيار .عند اختيار الزر س ف
تك ن قيمة هذه الخلية Trueعند عدم االختيار س ف تك ن .False
:Value -عند اختيار الزر ستأخذ هذه الخاصية القيمة Trueعند عدم االختيار ستأخذ القيمة
.False
مثال
في النم ذج الظاهر في الشكل 12-18تم إضافة زر صند ق اختيار لنم ذج الطباعة الذي رد في
المثال السابق ،ب يث ان اختيار هذا الزر يق م بعرض خط ط الشبكة Gridlinesعند الطباعة.
Figure12-18
لعمل هذا النم ذج ،قم بإدراج صند ق اختبار للنم ذج الذي استخدمناه في المثال السابق (الخاص بأزرار
االختيار) ثم قم بتعديل خصائص صند ق االختيار كالتالي:
179
الفصل الثاني عشر
تق م هذه الجملة بف ص ما إذا كانت قيمة صند ق االختيار chkGridهي Trueفإذا كانت كذلك تنفذ
السطر التالي:
ActiveSheet.PageSetup.PrintGridlines = True
180
النماذج
Figure12-19
181
الفصل الثاني عشر
Figure12-20
182
النماذج
ضع جميع تلك القيم بداخل خلية ا دة .في هذه ال الة يجب كتابة ماكر يق م بتخزين القيم ال ُمختارة
بداخل نطاق ما.
Figure12-21
183
الفصل الثاني عشر
على الرغم من أن الطريقة السابقة قد تك ن مفيدة في بعض األ يان ،إال أنه هناك العديد من ال االت
التي قد ترغب فيها بأن يتم تعبئة القائمة برمجيا ً في هذه ال الة يمكن استخدام ال دث الخاص ببدء
النم ذج UserForm Initialize eventلتعبئة القائمة .ذلك باستخدام .AddItem method
كمثال على ذلك لنفترض أنك تريد أن تعبئ القائمة بأسماء أشهر الربع األ ل من السنة بد ن أن يتم
تخزين تلك القيم بداخل خاليا رقة العمل .لعمل ذلك من الممكن كتابة الك د التالي في إجرائية معالجة
ال دث الخاصة ببدء النم ذج :UserForm Initialize event-handler procedure
)(Private Sub UserForm_Initialize
With ListBox1
"" = .RowSource
".AddItem "January
".AddItem "Febreuary
".AddItem "March
End With
End Sub
Figure 12-22
184
النماذج
ال ظ أننا استخدمنا السطر البرمجي "" = .RowSourceفي بداية الك د تى نك ن متأكدين من ذف
أي قيم سابقة قد تك ن م ج دة في القائمة.
مثال على استخدام List Boxفي النماذج
يق م النم ذج في الشكل 12-23بعرض جميع أ راق العمل للمصنف ال الي في قائمة List Box
لطباعة م ت يات أي رقة يتم ت ديد ال رقة من القائمة ثم الضغط على زر .Print selected sheet
Figure12-23
لعمل ذلك النم ذج ندرج قائمة ListBoxمن صند ق األد ات (في هذا المثال أبقينا على اسم القائمة
االفتراضي ،)ListBox1ثم نعبئ القائمة بأسماء أ راق العمل للمصنف ال الي من خالل ادخال الك د
التالي في إجرائية معالجة ال دث الخاصة ببدء النم ذج:
)(Private Sub UserForm_Initialize
Dim oSheet As Worksheet
For Each oSheet In ActiveWorkbook.Worksheets
ListBox1.AddItem oSheet.Name
Next oSheet
ListBox1.ListIndex = 0
End Sub
185
الفصل الثاني عشر
إلدراج الك د الخاص بزر الطباعة ،انقر نقرا ً مزد جا ً ف ق الزر لفتح إجرائية معالجة ال دث الخاص
بالزر ،ثم أدرج الك د التالي:
)(Private Sub CommandButton1_Click
Selected_Sheet = ListBox1.Value
Unload Me
Worksheets(Selected_Sheet).PrintPreview
End Sub
يث يق م الك د بعمل معاينة قبل الطباعة ل رقة العمل ال ُمختارة .لطباعة رقة العمل مباشرة بد ن
عمل معاينة يمكنك استخدام الك د التالي:
)(Private Sub CommandButton1_Click
Unload Me
Worksheets(ListBox1.Value).PrintOut
End Sub
186
النماذج
Figure12-24
مالحظة
ال ظ هنا التالي :قائمة List Boxبخالف عناصر الت كم األخرى (مثل ComboBox
)CheckBoxال ت تفظ بقيمتها بعد تطبيق Unload Meلذلك خزنّا القيمة الم ددة بداخل القائمة
بداخل المتغير Selected_Sheetقبل تطبيق .Unload Me
187
الفصل الثاني عشر
Figure12-25
188
النماذج
من الممكن تعديل هذه الخاصية من خالل جزء الخصائص الخاص بالقائمة كما بالشكل أعاله .أ برمجيا ً
من خالل الـ .MultiSelect propertyفمثالً لجعل القائمة ذات اختيار متعدد من خالل البرمجة
باإلمكان ادخال الك د التالي في إجرائية ال دث الخاصة ببدء النم ذج:
ListBox1.MultiSelect = fmMultiSelectMulti
يساعدك م رر األك اد في ادخال الخيار المناسب لك من خالل ميزة االختيار التلقائي كما في الشكل
.12-26
Figure 12-26
Figure12-27
189
الفصل الثاني عشر
لعمل هذا النم ذج ،استخدم المثال السابق؛ من م رر األك اد VBEافتح النم ذج ،دد القائمة ثم عدل
اختر الخيار fmMultiSelectMultiأ خصائصها من جزء الخصائص
. fmMultiSelectExtended
أدخل الك د التالي الخاص بزر الطباعة عن طريق النقر المزد ج ف ق زر الطباعة من ثم كتابة الك د
في إجرائية معالجة ال دث التي س ف تفتح:
190
النماذج
ال ظ هنا أننا ددنا القيمة االفتراضية للقائمة المنسدلة من خالل السطر البرمجي:
ComboBox1.ListIndex = 0
191
الفصل الثاني عشر
Figure12-28
إللغاء إمكانية إدخال قيم جديدة (غير م ج دة ضمن القائمة) عدل الخاصية Styleللقيمة
.fmStyleDropDownList
192
النماذج
Figure12-29
193
الفصل الثاني عشر
Figure12-30
Figure12-31
194
النماذج
لعمل ذلك انقر ف ق الزر العل ي لفتح إجرائية معالجة ال دث الخاصة به ثم أدخل الك د التالي:
اما بالنسبة للزر السفلي فأدخل الك د التالي في إجرائية معالجة ال دث الخاصة به:
195
الفصل الثاني عشر
Figure12-32
: نقرا ً مزد جا ً لفتح إجرائية معالجة ال دث الخاصة بالنقر ف ق الزر ثم أدخل التاليOK انقر ف ق زر
196
النماذج
أ الً ددنا ال رقة التي نريد أن نر ل البيانات لها من خالل )" With Sheets("sheet1ثم من
خالل السطرين التاليين ددنا الخليتين اللتين تليان آخر صف في العم د األ ل الثاني تم تعيين
قيمة مربعي النص الخاصين باالسم ال صف إليهما.
197
الفصل الثاني عشر
Figure12-33
أدرج زر أمر جديد أعطه االسم Clr_Buttonالتسمية Clear Formثم انقر عليه نقرا ً مزد جا ً
أدخل الك د التالي في إجرائية معالجة ال دث:
)(Private Sub Clr_Button_Click
"" = Name_box.Value
"" = desc_box.Value
End Sub
إضافة حقل خاص برقم المنتج إلى نموذج الترحيل مع عدم السماح بتكرار رقم المنتج
للسماح للمستخدم بإدخال رقم المنتج باإلضافة إلى اسمه صفه ،عدل رقة العمل كما في الشكل 12-
34بإضافة عم د جديد باسم Product IDقبل عم د اسم المنتج .ثم أضف مربع نص جديد للنم ذج
السابق أعطه االسم id_boxالتسمية Product IDثم عدل الك د الخاص بزر Add Product
ليصبح كالتالي:
198
النماذج
من المنطقي أن يك ن لكل منتج رقم غير متكرر (فريد) للت قق من أن رقم المنتج غير مستخدم من
: كالتاليIF قبل استخدمنا جملة
If WorksheetFunction.CountIf(Range("A:A"), id_box.Value) > 0 Then
MsgBox ("Duplicate ID!! please use non duplicate ID ...")
Exit Sub
End If
199
الفصل الثاني عشر
يق م السطر األ ل في جملة IFباستخدام دالة رقة العمل CountIfلف ص ما إذا كانت القيمة الم ج دة
في مربع النص الخاص برقم المنتج id_boxم ج دة من قبل في العم د Aفإذا كانت م ج دة فستظهر
رسالة خطأ تفيد بأن القيمة المدخلة متكررة ثم تخرج من اإلجرائية من خالل .Exit Sub
بيانات النم ذج ليصبح كالتالي: في النهاية عدل الك د الخاص بزر م
)(Private Sub Clr_Button_Click
"" = id_box.Value
"" = Name_box.Value
"" = desc_box.Value
End Sub
Figure 12-34
200
النماذج
201
الفصل الثاني عشر
202