You are on page 1of 216

‫اإلصــدار ‪1.

0‬‬

‫نضال الشامي‬
‫أساسيات البرمجة باستخدام‬
‫‪Excel VBA‬‬

‫المؤلف‬
‫نضال الشامي‬

‫اإلصدار األول‬
‫‪2020‬‬

‫هذا الكتاب منشووووووو ر ت ت‬


‫رخصة المشاع اإلبداعي‬

‫نَسب ال ُمصنَّف ‪ -‬غير تجاري ‪-‬‬


‫الترخيص بالمثل‬
‫‪CC BY-NC-SA‬‬

‫هذه الرخصة تتيح لآلخرين‬


‫التعديل‪ ،‬التحسين‪ ،‬وبناء نسخ‬
‫مشتقة من ال ُمصنَّف ولكن في‬
‫غير األغراض التجارية‪ ،‬بشرط‬
‫نَسب العمل األصلي للمؤلف‬
‫وترخيص األعمال الجديدة بنفس‬
‫الرخصة ‪.‬‬

‫الغالف‬
‫نضال الشامي‬

‫صورة الغالف‬
‫من االنترنت‬
‫م ف ظة لصا بها‬
‫جد ل الم ت يات‬

‫جدول المحتويات‬

‫‪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‬‬
‫جد ل الم ت يات‬

‫فظ ملفات االكسيل التي ت ت ي على ماكر ‪26..................... ................................ ................................‬‬


‫استخدام مسجل الماكرو ‪29 .......................................................................................‬‬ ‫‪.3‬‬
‫خط ات انشاء ماكر بسيط يق م بتل ين الصف األ ل بالل ن األصفر ‪30........................... ................................‬‬
‫كيفية ضع زر للماكر في شريط المهام ‪32......................... ................................ ................................‬‬
‫كيفية ربط ماكر مع زر ‪ Button‬أ شكل ‪33...................... ................................ ................................‬‬
‫استخدام مراجع الخاليا النسبية عند تسجيل الماكر ‪34.............. ................................ ................................‬‬
‫ف ص الك د البرمجي الم افق للماكر ‪34............................ ................................ ................................‬‬
‫المتغيرات ‪37 ....................................................................................... Variables‬‬ ‫‪4.‬‬
‫ما ه المتغير؟ ‪37...................... ................................ ................................ ................................‬‬
‫أن اع المتغيرات في ‪38........................................ ................................ ................................ VBA‬‬
‫أن اع البيانات في ‪39............ ................................ ................................ ................................ VBA‬‬
‫اإلعالن عن المتغيرات ‪40................. ................................ ................................ Declaring variables‬‬
‫نطاق المتغيرات ‪43.................... ................................ ................................ ................................‬‬
‫‪ Procedure only variables‬المتغيرات في نطاق اإلجرائية فقط ‪44............................ ................................‬‬
‫‪ Module only variables‬المتغيرات في نطاق ال دة البرمجية فقط‪45....................... ................................ .‬‬
‫المتغيرات العامة ‪46............................ ................................ ................................ Public variables‬‬
‫المتغيرات الثابتة ‪46............................. ................................ ................................ Static Variables‬‬
‫متى ي دث إعادة تعيين ‪ Reset‬للمتغيرات ‪47........................ ................................ ................................‬‬
‫الث ابت ‪48............... ................................ ................................ ................................ Constants‬‬
‫نطاق الث ابت ‪49............................... ................................ ................................ Constants Scope‬‬
‫التعامل مع المتغيرات النصية ‪49....................................... ................................ Working with Strings‬‬
‫التعامل مع متغيرات التاريخ ‪50.................. ................................ ................................ Date variables‬‬
‫جمل التعيين ‪51...................... ................................ ................................ Assignment Statements‬‬
‫المصف فات ‪51............... ................................ ................................ ................................ Arrays‬‬
‫اإلعالن عن المصف فات ‪52................... ................................ ................................ Declaring Arrays‬‬
‫المصف فات متعددة األبعاد ‪52..................................... ................................ Multidimensional Arrays‬‬
‫المصف فات الديناميكية ‪53...................... ................................ ................................ Dynamic Arrays‬‬

‫‪viii‬‬
‫جد ل الم ت يات‬

‫التعامل مع كائنات النطاق ‪55 .....................................................................................‬‬ ‫‪.5‬‬


‫اإلشارة لكائنات النطاق من خالل الخاصية ‪56................ ................................ ................................ Cells‬‬
‫خاصية اإلزا ة ‪57.......................................... ................................ ................................ Offset‬‬
‫خاصية القيمة ‪57.............. ................................ ................................ ................................ Value‬‬
‫مال ظة ‪57............................. ................................ ................................ ................................‬‬
‫خاصية ‪58....................... ................................ ................................ ................................ Text‬‬
‫خاصية العد ‪60............... ................................ ................................ ................................ Count‬‬
‫خاصية ‪60............ ................................ ................................ ................................ HasFormula‬‬
‫خاصية ‪61....................... ................................ ................................ ................................ Font‬‬
‫الخاصية ‪61................. ................................ ................................ ................................ Interior‬‬
‫بعض ال ظائف ‪ Methods‬التي يمكن تطبيقها على كائنات النطاق ‪64............................. ................................‬‬
‫ظيفة الت ديد ‪64............. ................................ ................................ ................................ Select‬‬
‫ظيفة المسح ‪65................................... ................................ ................................ Clear Method‬‬
‫ظيفة ال ذف ‪66................................ ................................ ................................ Delete method‬‬
‫جمل التحكم ‪67 ....................................................................................................‬‬ ‫‪.6‬‬
‫جملة ‪67................... ................................ ................................ ................................ IF – Then‬‬
‫مثال على ‪67............... ................................ ................................ ................................ IF- Then‬‬
‫جملة‪68.......................................... ................................ ................................ IF – Then – Else‬‬
‫جملة ‪68............................... ................................ ................................ IF- Then – [Else]- Endif‬‬
‫استخدام ‪70............................ ................................ ................................ If – Then -Elseif – Endif‬‬
‫استخدام ‪72...................................... ................................ ................................ If – ElseIf – Else‬‬
‫ع امل المقارنات التي يمكن استخدامها ‪73.......................... ................................ Comparison operators‬‬
‫فهم الع امل المنطقية ‪74............... ................................ ................................ ................................‬‬
‫العامل ‪74........................ ................................ ................................ ................................ AND‬‬
‫العامل ‪74.......................... ................................ ................................ ................................ OR‬‬
‫العامل ‪75........................ ................................ ................................ ................................ NOT‬‬
‫جملة ‪77................................ ................................ ................................ Select Case statement‬‬

‫‪ix‬‬
‫جد ل الم ت يات‬

‫جمل التكرار ‪83 ..................................................................... Looping Statements‬‬ ‫‪.7‬‬


‫جملة ‪83................. ................................ ................................ ................................ For….Next‬‬
‫استخدام ‪ Step‬مع جملة ‪84....................................... ................................ ................................ for‬‬
‫الخر ج من جملة ‪ for‬من خالل جملة ‪88................. ................................ ................................ Exit For‬‬
‫جملة ‪ For‬المتداخلة ‪90................ ................................ ................................ ................................‬‬
‫جملة ‪92......................................... ................................ ................................ For…Each…Next‬‬
‫التكرار باستخدام الجملة ‪97................... ................................ ................................ Do…While…Loop‬‬
‫جملة ‪99.......................................... ................................ ................................ Do Until…Loop‬‬
‫استخدام دوال ورقة العمل ودوال ‪101.................................................................... VBA‬‬ ‫‪.8‬‬
‫ما هي الدالة؟ ‪101 ..................... ................................ ................................ ................................‬‬
‫الد ال المدمجة في ‪101 ..................................... ................................ )Built-In VBA Functions( VBA‬‬
‫الد ال ‪102 .............................. ................................ ................................ Date, Time, and Now‬‬
‫دالتي ‪103 ......................... ................................ ................................ Month and MonthName‬‬
‫استخدام الدالة ‪ TypeName‬لت ديد ن ع الكائن الم دد ‪104 ........................................ ................................‬‬
‫د ال ‪ VBA‬التي ال ترجع قيمة ‪105 ................................... ................................ ................................‬‬
‫دالة ‪105 ................................. ................................ ................................ :MsgBox‬‬ ‫‪1-‬‬
‫دالة ‪105 ............................... ................................ ................................ :InputBox‬‬ ‫‪2-‬‬
‫الدالة ‪106 .................................... ................................ ................................ :Shell‬‬ ‫‪3-‬‬
‫طلب المساعدة من م رر األك اد في كتابة الد ال ‪108 .............. ................................ ................................‬‬
‫د ال رقة العمل ‪108 .................. ................................ ................................ Worksheet Functions‬‬
‫بعض األمثلة على استخدام د ال رقة العمل ‪109 ................... ................................ ................................‬‬
‫إيجاد ال د األعلى األدنى ثاني أكبر قيمة في نطاق م دد ‪109 .................................... ................................‬‬
‫مثال على استخدام الدلة ‪110 ........................... ................................ ................................ VLOOKUP‬‬
‫التعامل مع األخطاء في ‪113............................................................................... VBA‬‬ ‫‪.9‬‬
‫األخطاء التشغيلية ‪113 ................... ................................ ................................ Runtime time errors‬‬
‫جملة ‪117 ......................................... ................................ ................................ On Error GoTo‬‬
‫جملة ‪118 .................. ................................ ................................ ................................ Exit Sub‬‬

‫‪x‬‬
‫جد ل الم ت يات‬

‫جملة ‪118 .............................. ................................ ................................ On Error Resume Next‬‬


‫جملة ‪119 .......................................... ................................ ................................ Resume Label‬‬
‫جملة ‪120 .................. ................................ ................................ ................................ Resume‬‬
‫إزالة الش ائب من البرامج ‪121 ...................................... ................................ Debugging Techniques‬‬
‫استخدام مربع ال ار ‪ Message Box‬الكتشاف األخطاء ‪121 .................................... ................................‬‬
‫استخدام جملة ‪ Debug.Print‬في تتبع األخطاء ‪125 ................ ................................ ................................‬‬
‫استخدام ‪126 ...................................... ................................ ................................ VBA Debugger‬‬
‫نقاط الت قف ‪126 ..................................... ................................ ................................ Breakpoints‬‬
‫ادراج نقاط الت قف ‪127 ............... ................................ ................................ ................................‬‬
‫نافذة التنفيذ الف ري ‪128 .................. ................................ ................................ Immediate Window‬‬
‫استخدام نافذة المراقبة ‪129 ..................... ................................ ................................ Watch Window‬‬
‫استخدام نافذة ‪132 ............................... ................................ ................................ Locals Window‬‬
‫تلمي ات لتقليل األخطاء البرمجية ‪132 ................................ ................................ ................................‬‬
‫األحداث ‪135............................................................................................. Events‬‬ ‫‪10.‬‬
‫ما ه معالج‪-‬ال دث ‪137 ......................... ................................ ................................ Event-Handler‬‬
‫أمثلة على استخدام األ داث لتنفيذ أ امر ‪139 ................. ................................ ................................ VBA‬‬
‫أمثلة على أ داث المصنف ‪139 ............ ................................ ................................ Workbook Events‬‬
‫ال دث ‪139 .................................... ................................ ................................ Open Workbook‬‬
‫ال دث ‪140 .......................................... ................................ ................................ Before Close‬‬
‫مثال على ال دث ‪141 ..................................... ................................ ................................ Activate‬‬
‫ال دث ‪141 ............. ................................ ................................ ................................ Deactivate‬‬
‫مثال على ال دث ‪142 ................................. ................................ ................................ New Sheet‬‬
‫مثال على ال دث ‪142 ............................... ................................ ................................ Before Save‬‬
‫بعض األمثلة على أ داث أ راق العمل ‪143 ............................. ................................ Worksheets Events‬‬
‫ال دث ‪143 ................ ................................ ................................ ................................ Activate‬‬
‫ال دث ‪143 ............. ................................ ................................ ................................ Deactivate‬‬
‫ال دث ‪144 ........................................ ................................ ................................ Select Change‬‬

‫‪xi‬‬
‫جد ل الم ت يات‬

‫ال دث ‪146 .............................. ................................ ................................ Worksheet Calculate‬‬


‫ال دث ‪146 ................................. ................................ ................................ Worksheet Change‬‬
‫االنتقال إلى الك د الخاص ب رقة عمل من خالل اكسيل ‪146 ........................................ ................................‬‬
‫التفاعل مع المستخدم من خالل مربعات الحوار ‪149............................................................‬‬ ‫‪.11‬‬
‫الدالة ‪149 .................. ................................ ................................ ................................ MsgBox‬‬
‫ار بسيط ‪150 ........................................ ................................ ................................‬‬ ‫عرض مربع‬
‫ار ‪151 ..................................... ................................ ................................‬‬ ‫أخذ استجابة من مربع‬
‫مربع االدخال ‪154 ...................................... ................................ ................................ InputBox‬‬
‫مثال على دالة ‪154 ....................................... ................................ ................................ InputBox‬‬
‫الدالة ‪156 ................... ................................ ................................ Application.InputBox method‬‬
‫النماذج ‪159....................................................................................... UserForms‬‬ ‫‪.12‬‬
‫انشاء نم ذج المستخدم ‪159 ........... ................................ ................................ ................................‬‬
‫إضافة عناصر ت كم للنم ذج ‪162 .................................... ................................ ................................‬‬
‫عنصر الت كم زر األ امر ‪164 ............. ................................ ................................ Command Button‬‬
‫اظهار النم ذج ‪165 ............................ ................................ ................................ Show UserForm‬‬
‫كتابة األك اد الخاصة بالنماذج ‪166 ......................................... ................................ UserForms Codes‬‬
‫اغالق النم ذج ‪166 ......................... ................................ ................................ Unloading a Form‬‬
‫إخفاء النم ذج ‪167 ................................ ................................ ................................ Hiding a form‬‬
‫كتابة األك اد الخاصة بأزرار األ امر ‪167 ........................... ................................ ................................‬‬
‫عنصر الت كم "التسمية الت ضي ية" ‪171 .................... ................................ ................................ Label‬‬
‫أزرار االختيار ‪174 ............................. ................................ ................................ Option Buttons‬‬
‫أهم الخصائص الخاصة بزر االختيار ‪175 ...................................... ................................ Option Button‬‬
‫صند ق االختيار ‪179 .................................. ................................ ................................ Check Box‬‬
‫القائمة ‪181 ................. ................................ ................................ ................................ List Box‬‬
‫أهم خصائص عنصر الت كم ‪182 ......................... ................................ ................................ List Box‬‬
‫تعبئة القائمة ‪183 ................................. ................................ ................................ Populating List‬‬
‫مثال على استخدام ‪ List Box‬في النماذج ‪185 ....................... ................................ ................................‬‬

‫‪xii‬‬
‫جد ل الم ت يات‬

‫استخدام االختيار المتعدد مع القائمة ‪188 ................................ ................................ Multi-Select ListBox‬‬


‫القائمة المنسدلة ‪191 .................................. ................................ ................................ Combo Box‬‬
‫مثال على استخدام القائمة المنسدلة ‪191 .............................. ................................ ................................‬‬
‫مربع النص ‪193 .......................................... ................................ ................................ Text Box‬‬
‫مثال على استخدام مربع النص ‪194 .................................. ................................ ................................‬‬
‫مثال‪ .‬بناء نم ذج لتر يل البيانات ‪195 ............................... ................................ ................................‬‬
‫بيانات نم ذج التر يل ‪197 ......................... ................................ ................................‬‬ ‫إضافة زر لم‬
‫إضافة قل خاص برقم المنتج إلى نم ذج التر يل مع عدم السماح بتكرار رقم المنتج ‪198 .......................................‬‬

‫‪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‬‬
‫المقدمة‬

‫‪ Object Oriented Programming‬نم ذج الكائنات ‪ Object Model‬خصائصه‪ .‬يعد‬


‫هذا الفصل أهم فص ل الكتاب ه يمهد يضع األساس للفص ل الال قة‪.‬‬
‫الفصل الثاني‪ ،‬محرر األكواد ‪ :VBE‬فيه ثم التعرض لم رر األك اد ‪Visual Basic Editor‬‬ ‫‪-‬‬
‫هي البيئة البرمجية الخاصة بلغة ‪ VBA‬التي يتم من خاللها ادخال تعديل األك اد‪ .‬تم شرح‬
‫عناصر ن افذ م رر األك اد باستفاضة كما تم في هذا الفصل شرح كيفية كتابة برنامجك األ ل‬
‫في ‪ VBA‬كيفية فظه استدعاءه عند ال اجة بأكثر من طريقة‪.‬‬
‫الفصل الثالث‪ ،‬مسجل الماكرو‪ :‬فيه تم شرح طريقة استخدام مسجل الماكر ‪Macro‬‬ ‫‪-‬‬
‫‪ Recorder‬الذي يعد أبسط أسرع الطرق إلنشاء دات الماكر (البرامج المكت بة بلغة‬
‫‪ VBA‬يطلق عليها ماكر )‪ .‬هنا تم شرح كيفية تسجيل فظ الماكر ثم كيفية ف ص الك د‬
‫الم افق للماكر ال ُمسجل التعديل عليه‪.‬‬
‫الفصل الرابع‪ ،‬المتغيرات‪ :‬فيه تم شرح مفه م المتغيرات ‪ Variables‬أن اعها كيفية‬ ‫‪-‬‬
‫اإلعالن عنها نطاقها كيفية تعيين قيم لتلك المتغيرات‪ .‬كما تم التطرق في هذا الفصل‬
‫للمصف فات ‪ Arrays‬بأن اعها المختلفة كيفية اإلعالن عنها التعامل معها‪.‬‬
‫الفصل الخامس‪ ،‬التعامل مع كائنات النطاق‪ :‬فيه تم التطرق لكائنات النطاق ‪Range Objects‬‬ ‫‪-‬‬
‫خصائصها تم شرح أشهر ال ظائف ‪ Methods‬التي يمكن تطبيقها على النطاقات‪.‬‬
‫الفصل السادس‪ ،‬جمل التحكم‪ :‬من خالل جمل الت كم ‪ ،Control statements‬تستطيع الت كم‬ ‫‪-‬‬
‫بسير البرنامج بنا ًء على ت قق شرط أ مجم عة من الشر ط‪ .‬في هذا الفصل تم التطرق لجمل‬
‫الت كم في ‪ VBA‬مثل ‪ Select ….. Case IF ….Then‬كيفية استخدامها مع العديد من‬
‫األمثلة‪ .‬كما تم شرح الع امل المنطقية ‪ Logical Operators‬كيفية استخدامها مع جمل‬
‫الت كم‪.‬‬
‫الفصل السابع‪ ،‬جمل التكرار‪ :‬من خالل جمل التكرار تستطيع تكرار تنفيذ أ امر م ددة تى‬ ‫‪-‬‬
‫يت قق شرط معين‪ .‬هنا تم شرح العديد من جمل التكرار مثل ‪Do…..While For….Next‬‬
‫غيرها بتفصيل كبير بعدة االت أمثلة‪.‬‬
‫الفصل الثامن‪ ،‬الدوال‪ :‬الدالة ‪ Function‬هي عبارة عن مجم عة من األسطر البرمجية تم‬ ‫‪-‬‬
‫تنظيمها بشكل معين ب يث تق م ببعض ال سابات أ اإلجراءات من ثم ترجع قيمة ا دة‪.‬‬
‫في هذا الفصل تم التطرق لما هي الد ال؟ أن اع الد ال في ‪ VBA‬يث أنها تنقسم لثالثة‬
‫أن اع‪ :‬الد ال المدمجة في ‪ VBA‬د ال رقة العمل الد ال المخصصة‪ .‬تم شرح األن اع‬
‫الثالثة مع إعطاء أمثلة على كل ن ع‪.‬‬

‫‪3‬‬
‫المقدمة‬

‫الفصل التاسع‪ ،‬التعامل مع األخطاء‪ :‬األخطاء من األم ر الشائعة جدا ً عند التعامل مع ‪VBA‬‬ ‫‪-‬‬
‫مع أي لغة برمجة أخرى‪ .‬في هذا الفصل تم التطرق ألن اع األخطاء التي يمكن أن تظهر‬
‫أثناء تشغيل برامج ‪ VBA‬كيفية ت ديد مكان الخطأ ثم التعامل معه بأكثر من طريقة‪ .‬كما تم‬
‫التطرق في هذا الفصل لمفه م "إزالة الش ائب" ‪ Debugging‬تم شرح العديد من التقنيات‬
‫التي يمكن استخدامها إلزالة ش ائب البرامج‪.‬‬
‫الفصل العاشر‪ ،‬األحداث‪ :‬ا دى طرق تنفيذ اجرائيات ‪ VBA‬هي تنفيذها تلقائيا ً عند د ث دث‬ ‫‪-‬‬
‫معين‪ .‬ال دث ‪ ،Event‬ه ببساطة عبارة عن شيء دث لالكسيل‪ .‬في هذا الفصل س ف‬
‫نتعرف على األ داث األكثر شي عا ً في االكسيل كيفية االستفادة منها في تنفيذ االجرائيات‬
‫بشكل تلقائي‪.‬‬
‫الفصل الحادي عشر‪ ،‬التفاعل مع المستخدم من خالل دالتي ‪ MsgBox‬و ‪ :InputBox‬فيه‬ ‫‪-‬‬
‫تم عرض االت مختلفة لكل من دالة ‪ MsgBox‬التي تق م بعرض البيانات ضمن مربع ار‬
‫مع إمكانية أخذ تغذية راجعة من المستخدم‪ ،‬دالة ‪ InputBox‬التي تستخدم إلدخال البيانات من‬
‫خالل مربع ار‪ .‬إضافة إلى ذلك فقد تم التطرق لدالة ‪ Application.InputBox‬التي‬
‫تُستخدم الدخال أشياء مثل المعادالت أ مراجع النطاقات‪.‬‬
‫الفصل الثاني عشر‪ ،‬النماذج‪ :‬تعد النماذج ‪ User Forms‬من ال سائل الجيدة إلدخال البيانات‬ ‫‪-‬‬
‫عرضها‪ .‬يث أنك من خاللها تستطيع الت كم بكيفية ادخال البيانات من يث ترتيب ادخال‬
‫البيانات أ اختيار ال سيلة المناسبة لكل ن ع من البيانات المطل بة أ اجراء عملية الت قق من‬
‫االدخال للبيانات المدخلة غيرها من األشياء‪ .‬يمكنك أيضا ً الت كم بكيفية عرض البيانات‬
‫بالشكل الذي يالئم طبيعة البيانات المعر ضة مما يعطيك مر نة عالية جدا ً في التعامل مع‬
‫البيانات‪ .‬في هذا الفصل تم شرح كيفية انشاء النماذج كيفية إضافة عناصر الت كم عليها مثل‬
‫أزرار االختيار الق ائم المنسدلة غيرها‪ ،‬كيفية برمجة عناصر النم ذج لالستجابة لأل داث‬
‫المختلفة مثل االستجابة للضغط على األزرار أ االختيار من القائمة المنسدلة‪.‬‬

‫لمن موجه هذا الكتاب‬


‫هذا الكتاب م جه لمستخدمي االكسيل الذين يرغب ن باكتساب المهارات األساسية للبرمجة بلغة ‪،VBA‬‬
‫مما سيسهم باالنتقال بمست ى مهارتهم في االكسيل لألعلى‪ .‬للمضي قدما ً في هذا الكتاب يجب أن يتمتع‬
‫القارئ بمست ى مت سط على األقل في استخدام برنامج اكسيل‪ ،‬ذلك يشمل أساسيات برنامج اكسيل‪،‬‬
‫التعامل مع الخاليا النطاقات أ راق العمل‪ ،‬استخدام أد ات االكسيل المختلفة مثل الجدا ل‬

‫‪4‬‬
‫المقدمة‬

‫المخططات‪ ،‬اجادة التعامل مع المعادالت الد ال‪ .‬يمكن لمن أ ب الرج ع لكتابنا " اكسيل ‪2019‬‬
‫– الدليل السهل" الكتساب مثل هذه المعرفة أ إلى أي كتاب آخر يشرح مبادئ إكسيل‪ .‬كما يمكنك‬
‫متابعة د رتنا على الي تي ب " مهارات اكسيل من الصفر لال تراف" من خالل الرابط باألسفل‪.‬‬

‫كيف تقرأ هذا الكتاب؟‬


‫أنص ك بقراءة فص ل هذا الكتاب بنفس الترتيب‪ ،‬مع تطبيق األمثلة أ الً بأ ل بعد االنتهاء من الفصل‬
‫فهمه تماما ً االنتقال للفصل الذي يليه يث أن الفص ل تعتمد على بعضها البعض اعتمادا ً كبيراً‪ .‬في‬
‫غير هذا الكتاب كنت أنصح القارئ بأن يقرأ جد ل الم ت يات ثم يذهب للم اضيع التي تهمه اختصارا ً‬
‫ل قته‪ ،‬إال أن الم ض ع هنا مختلف لذا فأنص ك بقراءة كامل الكتاب يث أنه في كل فصل هناك‬
‫معل مات تقنيات جديدة يمكن تطبيقها على م ض ع الفصل على م ض عات أخرى مشر ة في‬
‫فص ل أخرى‪ ،‬فالفص ل تُكمل بعضها البعض لن تصلك الص رة كاملة إال بعد قراءة جميع فص ل‬
‫الكتاب‪.‬‬
‫روابط قد تهمك‬
‫رابط دورة مهارات اكسيل على اليوتيوب‬
‫رابط دورة االكسيل المتقدم على اليوتيوب‬
‫رابط كتاب " اكسيل ‪ – 2019‬الدليل السهل"‬
‫رابط كتاب "إكسيل ‪ – 2013‬المستوى المتقدم"‬

‫في النهاية أتمنى أن يضيف هذا الكتاب جديدا ً للمكتبة العربية أن يك ن ذا ع ن بالنسبة للقراء‬
‫المهتمين‪.‬‬
‫نضال الشامي‬
‫غزة‪ ،‬ن فمبر ‪2019‬‬

‫‪5‬‬
‫المقدمة‬

‫‪6‬‬
‫مدخل إلى ‪VBA‬‬

‫الفصل األول‬

‫‪ .1‬مدخل إلى ‪Excel VBA‬‬

‫في هذا الفصل س ف نتعرف إلى أساسيات لغة البرمجة ‪ VBA‬لالكسيل س ف نتطرق إلى العناصر‬
‫األساسية المك نة لها مما يمهد الطريق للفص ل الال قة‪ .‬المعل مات ال اردة في هذا الفصل مهمة جدا ً‬
‫تعتمد عليها بشكل كلي الفص ل القادمة لذا ننصح بقراءته بعناية قبل االنتقال لباقي الفص ل‪.‬‬
‫إذن‪ ،‬ما هي ‪ VBA‬؟‬
‫لغة ‪ VBA‬هي اختصار لـ ‪ Visual Basic for Application‬هي لغة برمجة مقدمة من مايكر س فت‬
‫تستطيع من خاللها برمجة تطبيقات األ فيس مثل ال رد االكسيل باإلضافة لبعض البرامج األخرى‬
‫مثل أ ت كاد للقيام بمهام غير م ج دة في تلك البرامج‪ .‬بالنسبة لالكسيل‪ ،‬هناك العديد من المهام التي‬
‫تستطيع أن تق م بها ‪ VBA‬مثل‪:‬‬
‫أتمتة العمليات المتكررة الختصار ال قت الجهد‪.‬‬ ‫‪-‬‬
‫تط ير د ال جديدة غير م ج دة باالكسيل‪.‬‬ ‫‪-‬‬
‫انشاء نماذج لتسهيل ادخال عرض البيانات‪.‬‬ ‫‪-‬‬
‫انشاء ظائف إضافية ‪ Add-ins‬لالكسيل‪.‬‬ ‫‪-‬‬
‫إضافة النص ص المتكررة مثل اسم الشركة أ عن ان االيميل غيرها من البيانات يث يمكنك‬ ‫‪-‬‬
‫برمجة ذلك تعيين زر إلدراج تلك النص ص بسه لة سرعة‪.‬‬
‫‪ ....‬غيرها الكثير‬ ‫‪-‬‬

‫‪7‬‬
‫الفصل األ ل‬

‫أهم العناصر والمفاهيم في لغة ‪ VBA‬في إكسيل‬


‫الوحدات البرمجية ‪VBA Module‬‬
‫الك د البرمجي للـ ‪ VBA‬يتم إدخاله بداخل دة برمجية ‪ ،VBA Module‬س اء أكان الك د مدخالً يد يا ً‬
‫أ من خالل مسجل دات الماكر ‪ .Macro Recorder‬يمكن مشاهدة ت رير الك د من خالل‬
‫"م رر األك اد ‪"VB Editor‬‬
‫كبي يف الفصل القادم "استخدام محرر األكواد ‪"VBE‬‬
‫سيتم التطرق لمحرر األكواد ‪ VBE‬بتفصيل ر‬
‫ت ت ي ال دة البرمجية ‪ VBA Module‬على إجرائيات فرعية ‪/ Sub Procedures‬أ د ال‬
‫‪.Functions‬‬
‫اإلجرائيات ‪Procedures‬‬
‫تنقسم االجرائيات إلى ن عين‪:‬‬
‫‪ -1‬االجرائيات الفرعية ‪Sub-Procedures‬‬
‫‪ -2‬الد ال ‪Function‬‬

‫اإلجرائية الفرعية ‪ : 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‬‬

‫فيج ال بيسيك للتطبيقات هي عبارة عن لغة برمجة كائنية الت جه ‪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‬له مجم عة من األ داث التي يمكن أن تُطبق عليه‪ ،‬مثل دث فتح أ اغالق‬
‫المصنف‪.‬‬

‫نموذج الكائنات ‪Object Model‬‬


‫يعد نم ذج الكائنات إلكسيل ه القلب النابض لبرمجة ‪ VBA‬في برنامج االكسيل‪ ،‬كل أمر برمجي يتم‬
‫من خالل ‪ VBA‬يُرسل من خالل نم ذج الكائنات‪ .‬نم ذج الكائنات ه عبارة عن قائمة ط يلة بالكائنات‬
‫التي ي ت يها االكسيل مثل أ راق العمل‪ ،‬النطاقات الخاليا‪.‬‬
‫كل شيء في االكسيل ه عبارة عن كائن ‪ .Object‬ي فر لنا االكسيل مجم عة كبيرة من الكائنات التي‬
‫يمكن الت كم بها من خالل برمجة ‪ .VBA‬تشتمل الكائنات على المصنفات‪ ،‬أ راق العمل‪ ،‬الخاليا‪،‬‬
‫المخططات غيرها الكثير‪.‬‬
‫الكائنات تم ترتيبها بشكل هرمي ‪ Hierarchical arrangement‬ب يث أن بعض الكائنات ت ت ي‬
‫كائنات أخرى‪ .‬في أعلى الهرم يقع برنامج االكسيل نفسه‪ .‬نعم االكسيل بذات نفسه ه عبارة عن كائن‬
‫يدعى ‪ .Application‬كائن البرنامج ‪ Application‬ي ت ي على كائنات مثل المصنفات‬
‫‪ Workbooks‬ال ظائف اإلضافية ‪ .Add-Ins‬ي ت ي كائن المصنف ‪ Workbook‬على كائنات مثل‬
‫أ راق العمل ‪ Worksheets‬المخططات ‪ .Charts‬كائن رقة العمل ‪ Worksheet‬ي ت ي على‬
‫كائنات مثل النطاقات ‪ ،Ranges‬الخاليا ‪ ،Cells‬الجدا ل الم رية ‪ .PivotTables‬المصطلح "نم ذج‬
‫الكائنات ‪ "Object Model‬يطلق على كيفية ترتيب الكائنات بداخل اكسيل‪.‬‬

‫‪Application‬‬ ‫‪Workbooks‬‬ ‫‪Workshets‬‬ ‫‪Ranges‬‬ ‫‪Cells‬‬

‫‪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‬‬

‫خصائص الكائنات ‪Objects Properties‬‬


‫كل كائن له مجم عة من الخصائص التي يمكن اعتبارها كإعدادات الكائن ‪ .Object settings‬فمثال ً‬
‫كائن النطاق ‪ Range object‬له خصائص مثل العن ان ‪ Address‬القيمة ‪ Value‬بالمثل كائن رقة‬
‫العمل ‪ Worksheet object‬له خصائص مثل االسم ‪ Name‬عرض ف اصل الصف ات‬
‫‪.DisplayPageBreaks‬‬
‫من الممكن استخدام ‪ VBA‬لعرض قيمة خاصية م ددة أ تعديلها‪.‬‬
‫يمكن اإلشارة إلى خاصية كائن م دد من خالل ضم اسم الخاصية إلى اسم الكائن مفص الً بينهما بنقطة‪.‬‬
‫فيمكن اإلشارة مثالً إلى قيمة الخلية ‪ A1‬بداخل رقة العمل ‪ Sheet1‬من خالل‪:‬‬
‫‪Workbooks("Workbook1.xlsx").Worksheets("Sheet1").Range("A1").Value‬‬
‫المتغيرات ‪Variables‬‬
‫المتغير ه عبارة عن عنصر له اسم يستخدم لتخزين البيانات‪ .‬من الممكن استخدام المتغيرات في الـ‬
‫‪ VBA‬لتخزين أشياء مثل النص ص‪ ،‬القيم أ اعدادات الخصائص للعناصر ‪Object property‬‬
‫‪ .settings‬إلعطاء قيمة الخلية ‪ A1‬في رقة العمل ‪ Sheet1‬للمتغير ‪ GoodsCost‬استخدم الصيغة‬
‫التالية‪:‬‬
‫‪GoodsCost = Worksheets("Sheet1").Range("A1").Value‬‬

‫كبي يف الفصل الرابع‬


‫للمتغيات بتفصيل ر‬
‫ر‬ ‫سيتم التطرق‬
‫االستخدامات‪/‬الدوال ‪Methods‬‬
‫الدالة ‪ Method‬هي عبارة عن اجراء يق م االكسيل بتنفيذه على عنصر ما‪ .‬على سبيل المثال؛ أ د‬
‫الد ال الخاصة بالكائن ‪ Worksheet‬هي عبارة عن دالة ال ذف ‪ Delete‬هي تق م ب ذف رقة‬
‫العمل‪ .‬بإمكانك أن تطبق دالة ما على أ د الكائنات من خالل ارفاق اسم الدالة للكائن المطل ب ب يث‬
‫يفصل بينهما النقطة‪ .‬كمثال على تطبيق دالة على أ د الكائنات انظر المثال التالي يث يق م السطر‬
‫البرمجي التالي ب ذف رقة العمل المسماة ‪:Sheet1‬‬
‫‪Worksheets("Sheet1").Delete‬‬

‫‪13‬‬
‫الفصل األ ل‬

‫ما تم ذكره في الفقرات السابقة يمثل المك نات األساسية للغة ‪ ،VBA‬تأكد من فهمك الجيد لتلك المفاهيم‬
‫قبل االنتقال للفص ل الال قة‪.‬‬

‫‪14‬‬
‫م رر األ امر ‪VBE‬‬

‫الفصل الثاني‬

‫‪ .2‬محرر األوامر )‪(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‬‬

‫عناصر ونوافذ محرر األكواد ‪VBE‬‬


‫ي ت ي م رر األك اد على العديد من الن افذ التي يمكن الت كم بإظهارها إخفائها سب ال اجة‪ .‬في‬
‫غالب األ قات أنت قد ت تاج ألربعة ن افذ أساسية هي‪:‬‬
‫مستكشف المشاريع ‪Project Explorer‬‬ ‫‪-1‬‬
‫نافذة الك د البرمجي ‪Code Window‬‬ ‫‪-2‬‬
‫نافذة الخصائص ‪Properties Window‬‬ ‫‪-3‬‬
‫نافذة األ امر الف رية ‪Immediate Window‬‬ ‫‪-4‬‬

‫‪17‬‬
‫الفصل الثاني‬

‫‪Figure2-3‬‬

‫مستكشف المشاريع ‪Project Explorer‬‬


‫يظهر مستكشف المشاريع مخططا ً هيكليا ً شجريا ً ‪ Tree diagram‬تظهر من خالله المصنفات المفت ة‬
‫بما فيها من أ راق عمل (ذلك يشمل المصنفات المخفية ‪ )Hidden workbook‬كما تظهر من خالله‬
‫ال دات البرمجية ‪ Modules‬الخاصة بكل مصنف مفت ح‪ .‬من الممكن ت سعة ‪ Expand‬أ طي‬
‫العناصر القابلة للطي من خالله‪.‬‬

‫‪18‬‬
‫م رر األ امر ‪VBE‬‬

‫عند النقر بالما س نقرا ً مزد جا ً على أ د العناصر أسفل ‪ Microsoft Excel Objects‬أ ‪Modules‬‬
‫يظهر لنا ك د الـ ‪ VBA‬الخاص بهذا العنصر في نافذة الك د ‪.Code Window‬‬
‫إذا لم يكن مستكشف المشاريع ظاهرا ً فيمكن اظهاره من خالل الضغط على ‪ Ctrl + R‬أ من خالل‬
‫الذهاب إلى ‪.View ➔ Project Explorer‬‬

‫نافذة الكود ‪Code Window‬‬


‫نافذة الك د هي المكان الذي تق م بإدخال الك د فيه‪ ،‬كل عنصر يظهر في مستكشف المشاريع له نافذة‬
‫ك د مرتبطة به‪ .‬لعرض الك د الخاص بأي عنصر انقر نقرا ً مزد جا ً ف ق العنصر المطل ب فيتم اظهار‬
‫الك د الخاص به في نافذة الك د (عادة تك ن على يمين مستكشف المشاريع)‪.‬‬

‫نافذة الخصائص ‪Properties Window‬‬


‫تعرض نافذة الخصائص مجم عة الخصائص الخاصة بالعنصر الم دد‪ ،‬فمثالً إذا كان لديك رقة عمل‬
‫باسم ‪ Sheet1‬ترغب بعرض خصائصها يكفي اختيار هذه ال رقة من مستكشف المشاريع ليتم عرض‬
‫خصائصها في نافذة الخصائص‪ ،‬كذلك األمر بالنسبة ألي عنصر آخر في مستكشف المشاريع‪ .‬من‬
‫الممكن تعديل الخصائص من خالل تلك النافذة‪ .‬هذه الخصائص تُستخدم للت كم في مظهر سل ك‬
‫العنصر‪ .‬فمثالً في الشكل ‪ 2-4‬تم ت ديد رقة العمل ‪ Sheet1‬بالتالي تم اظهار خصائصها في نافذة‬
‫الخصائص‪ ،‬من هذه الخصائص؛ هناك خاصية ‪ DisplayRightToLeft‬للت كم في اتجاه رقة العمل‬
‫( هي من الخصائص المستخدمة للت كم في المظهر)‪ ،‬بينما الخاصية ‪ EnableCalculation‬تستخدم‬
‫للت كم في كيفية اجراء اال تساب بداخل رقة العمل يد ي أم تلقائي‪ ( ،‬هي من الخصائص المستخدمة‬
‫للت كم في سل ك العنصر)‪.‬‬

‫نافذة األوامر الفورية ‪Immediate Window‬‬


‫من خالل نافذة األ امر الف رية يمكن تنفيذ األ امر مباشرة‪ ،‬أي أنك غير مضطر إلدخال األمر الذي‬
‫تريد تطبيقه ضمن إجرائية‪ .‬يمكنك كتابة الجملة البرمجية ثم الضغط على مفتاح اإلدخال ليتم تنفيذ الجملة‬
‫مباشرة مما يعطيك إمكانية التقييم الف ري للجمل البرمجية‪ .‬عادة يتم اللج ء لهذه النافذة عند اجراء‬

‫‪19‬‬
‫الفصل الثاني‬

‫عمليات تتبع األخطاء التص يح ‪ .Debugging‬إذا لم تكن هذه النافذة ظاهرة فيمكن اظهارها من خالل‬
‫الضغط على ‪.Ctrl + G‬‬

‫‪Figure2-4‬‬

‫‪20‬‬
‫م رر األ امر ‪VBE‬‬

‫كتابة برنامجك األول بالـ ‪VBA‬‬


‫الهدف من هذه الفقرة ه ت ضيح كيفية ادراج الك د في ملف االكسيل من ثم كيفية تشغيله بأكثر من‬
‫طريقة‪ ،‬ال تقلق إذا بدا لك الك د غير مفه م فس ف يتم شرح ت ضيح عناصره بشكل مفصل في‬
‫الفص ل الال قة‪.‬‬
‫للبدء بكتابة برنامجك األ ل في الـ ‪ VBA‬اتبع الخط ات التالية‪:‬‬
‫‪ -1‬افتح ملف اكسيل جديد ثم اذهب إلى م رر األك اد عن طريق الضغط على زري ‪Alt+F11‬‬
‫أ من خالل الذهاب إلى تب يب المط ر ‪ Developer‬ثم الضغط على زر ‪.Visual Basic‬‬
‫‪ -2‬أدرج دة برمجية جديدة ‪ Module‬من خالل الذهاب إلى قائمة "ادراج ‪ "Insert‬ثم ‪Module‬‬
‫أ من خالل النقر بزر الما س األيمن ف ق اسم المشر ع أ المصنف في نافذة مستكشف‬
‫المشاريع ثم اختيار ‪ Insert➔Module‬أ من خالل شريط األد ات القياسي كما ه ظاهر‬
‫بالشكل ‪ 2-5‬أ الشكل ‪.2-6‬‬

‫‪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‬‬

‫أمان الماكرو ‪Macro security‬‬


‫تعد لغة ‪ VBA‬من لغات البرمجة الق ية جدا ً التي يمكن استغاللها لعمل برامج ضارة فمن الممكن مثالً‬
‫انشاء برامج باستخدامها تق م ب ذف الملفات أ ارسال الملفات ألجهزة اس ب أخرى أ تعطيل نظام‬
‫التشغيل غيرها من البرامج الخبيثة‪ .‬لذلك قامت شركة مايكر س فت – بدءا ً من إكسيل ‪– 2007‬‬
‫بإضافة هذه الخاصية لمساعدة المستخدمين على ماية أنفسهم من البرامج الضارة التي قد تك ن مكت بة‬
‫بـ ‪.VBA‬‬
‫يظهر الشكل ‪ 2-10‬إعدادات األمان الخاصة بالماكر ‪ ،‬التي يمكن ال ص ل إليها من خالل الذهاب‬
‫إلى‪:‬‬
‫‪File ➔ Options ➔ Trust Center ➔Macro Settings‬‬
‫هناك أربعة خيارات للتعامل مع الماكر ‪ ،‬بال ضع االفتراضي يتم ت ديد الخيار الثاني الذي يق م‬
‫بتعطيل كافة دات الماكر مع اعطاء اشعار للمستخدم تى يستطيع السماح بتشغيل الماكر إن‬
‫رغب‪ .‬يظهر اإلشعار عادة في أعلى المصنف كشريط أصفر الل ن مع ج د زر لتفعيل الماكر (كما‬
‫في الشكل ‪.)2-10‬‬

‫‪Figure2-10‬‬

‫‪25‬‬
‫الفصل الثاني‬

‫‪Figure2-11‬‬

‫حفظ ملفات االكسيل التي تحتوي على ماكرو‬


‫ل فظ ملف اكسيل بداخله ماكر ‪ ،‬يجب اختيار االمتداد ( ‪Excel Macro-Enabled Workbook‬‬
‫‪ )*.xlsm‬ذلك من خالل الذهاب إلى ‪ File‬ثم ‪ Save as‬ثم اختيار مكان ال فظ ت ديد ن ع الملف من‬
‫خالل القائمة المنسدلة ‪ Save as type‬كما في الشكل ‪ .2-12‬يمكنك أيضا ً الضغط على زر ‪F12‬‬
‫لعرض مربع ال ار الخاص بـ ‪ Save as‬مباشرةً‪.‬‬

‫‪26‬‬
VBE ‫م رر األ امر‬

Figure2-12

27
‫الفصل الثاني‬

‫‪28‬‬
‫مسجل الماكر‬

‫الفصل الثالث‬

‫‪ .3‬استخدام مسجل الماكرو‬

‫في هذا الفصل س ف نتعرف على أسهل الطرق للبدء في استخدام ‪ 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‬‬
‫مسجل الماكر‬

‫• ‪( New Workbook‬مصنف جديد) يث سيتم فتح مصنف جديد تسجيل‬


‫الماكر بداخله‪.‬‬

‫‪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‬‬
‫مسجل الماكر‬

‫كيفية ربط ماكرو مع زر ‪ Button‬أو شكل‬


‫‪ .1‬ندرج الزر من خالل شريط المط ر كما بالشكل ‪ 3-4‬أ ندرج الشكل المطل ب من تب يب‬
‫ادراج ‪ Insert‬كما في الشكل ‪.3-5‬‬
‫‪ .2‬نضغط بالزر األيمن على الزر أ الشكل ثم نختر ‪( Assign Macro‬تعيين ماكر ) نعيين‬
‫الماكر المطل ب‪.‬‬

‫‪Figure3-4‬‬

‫‪Figure3-5‬‬

‫‪33‬‬
‫الفصل الثالث‬

‫استخدام مراجع الخاليا النسبية عند تسجيل الماكرو‬


‫الماكر الذي أنشأناه في المثال السابق يستخدم مراجع الخاليا المطلقة ( ه ال ضع االفتراضي) هذا‬
‫يعني أنك ل كنت في أي مكان داخل رقة العمل نفذت الماكر فس ف يتم تنفيذه على نفس الخاليا‬
‫التي نُفذ عليها قت التسجيل‪ .‬باإلمكان استخدام المراجع النسبية تى يتسنى لنا تنفيذ الماكر على‬
‫الخاليا الم ددة فقط هذا األمر يتم عن طريق الضغط على ‪( Use Relative Reference‬استخدام‬
‫المراجع النسبية) قبل البدء بتسجيل الماكر ‪.‬‬

‫‪Figure3-6‬‬

‫فحص الكود البرمجي الموافق للماكرو‬


‫لرؤية الك د البرمجي الخاص بماكر ُمس َجل اتبع الخط ات التالية‪:‬‬
‫افتح م رر األك اد ‪ VBE‬عن طريق الضغط على ‪ ALT + F11‬أ من خالل الذهاب إلى تب يب‬ ‫‪-1‬‬
‫‪ Developer‬ثم ‪.Visual Basic‬‬
‫اذهب إلى مستكشف المشاريع ‪ .Project Explorer‬إذا لم يكن ظاهرا ً فأظهره من خالل الذهاب‬ ‫‪-2‬‬
‫إلى ‪ View‬ثم ‪.Project Explorer‬‬
‫من مستكشف المشاريع اختر اسم المصنف الذي ي ت ي على الماكر اضغط على رمز ‪+‬‬ ‫‪-3‬‬
‫الم ج د لعمل ت سعة ‪ Expand‬للمصنف‪.‬‬
‫اضغط على ‪ +‬بجانب بند ‪ Modules‬لعمل ت سعة لها‪ .‬ثم انقر نقرا ً مزد جا ً ف ق ‪.Module1‬‬ ‫‪-4‬‬

‫‪34‬‬
‫مسجل الماكر‬

‫‪ -5‬س ف يتم عرض الك د الخاص بالماكر في نافذة الك د ‪ Code Window‬الم ج دة على يمين‬
‫مستكشف المشاريع‪.‬‬

‫‪Figure3-7‬‬

‫من خالل عرض الك د ال ظ ما يلي‪:‬‬


‫‪ -1‬الك د تم ادراجه من خالل إجرائية فرعية ‪.Sub- procedure‬‬
‫‪ -2‬اسم اإلجرائية الفرعية ه نفس اسم الماكر الذي تم إعطاؤه له أثناء تسجيل الماكر ‪.‬‬
‫‪ -3‬هناك أسطر في الك د عبارة عن مال ظات هذه األسطر ليس لها تأثير على الك د انما يتم‬
‫ادراجها لت ضيح بعض األم ر التي يرغب المبرمج بإظهارها‪ .‬هذه المال ظات تبدأ بالرمز (')‬
‫تك ن عادة ً بالل ن األخضر‪ .‬كمثال على ذلك السطر التالي‪:‬‬
‫‪' Macro1 Macro‬‬

‫‪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‬‬

‫أنواع المتغيرات في ‪VBA‬‬


‫يدل ن ع المتغير عل كيفية تخزينه في الذاكرة‪ ،‬مثل األرقام الص ي ة العشرية‪ ،‬النص ص‪ ،‬الت اريخ‬
‫غيرها‪ .‬بال ضع االفتراضي‪ ،‬تستطيع لغة ‪ VBA‬التعامل مع األن اع المختلفة للمتغيرات بشكل تلقائي‪،‬‬
‫فليس ضر ريا أن تعلن عن المتغير (اسمه ن عه) قبل البدء باستخدامه فيمكنك مثال أن تكتب الجملة‬
‫البرمجية التالية‪:‬‬
‫‪x = 100‬‬
‫هنا يق م االكسيل بشكل تلقائي بالتعرف على المتغير ‪ x‬ت ديد ن عه كعدد ص يح ‪ integer‬ذلك طبقا ً‬
‫للقيمة التي تم تعيينها للمتغير هي ‪ 100‬ل كانت القيمة المعطاة للمتغير هي "‪ "Ahmed‬فس ف يق م‬
‫االكسيل بت ديد ن ع البيانات للمتغير ‪ x‬كـ ‪ .String‬على الرغم من المر نة التي تمن ها لنا ‪ VBA‬في‬

‫‪38‬‬
‫المتغيرات‬

‫هذا األمر إال أن هناك ثمنا ً لذلك ه استخداما ً أقل كفاءة ً لم ارد الكمبي تر تنفيذا ً قد يك ن في بعض‬
‫األ يان أبطأ مما ل تم ت ديد ن ع البيانات المناسب للمتغير قبالً‪ .‬بشكل عام‪ ،‬يُ صى د ما ُ باستخدام ن ع‬
‫البيانات الذي يستخدم أقل عدد من البايتات‪.‬‬
‫أنواع البيانات في ‪VBA‬‬
‫في الجد ل التالي قائمة بأن اع المتغيرات في لغة ‪VBA‬‬

‫نوع البيانات ‪ Data‬نطاق القيم ‪Range‬‬


‫‪Types‬‬

‫قيمة عددية ص ي ة من ‪ 0‬تى ‪255‬‬ ‫‪Byte‬‬


‫‪True or False, On or Off, 0 or 1‬‬ ‫‪Boolean‬‬
‫‪-32,768 To 32767‬‬ ‫‪Integer‬‬
‫‪–2,147,483,648 To 2,147,483,647‬‬ ‫‪Long‬‬
‫‪-3.402823E38 To 1.401298E45‬‬ ‫‪Single‬‬
‫)‪4.94065645841247E-324 To 1.79769313486232E308 Double (Positive‬‬
‫‪-1.79769313486232E308 To -4.94065645841247E-324‬‬ ‫‪Double‬‬
‫)‪(Negative‬‬
‫‪-922,337,203,685,477.5808 To 922,337,203,685,477.5807‬‬ ‫‪Currency‬‬
‫‪+/-79,228,162,514,264,337,593,543,950,335‬‬ ‫‪Decimal‬‬
‫بد ن الفاصلة العشرية‬
‫‪+/-7.9228162514264337593543950335‬‬
‫مع الفاصلة العشرية‬
‫‪1/1/100 to 12/31/9999‬‬ ‫‪Date‬‬
‫‪Object in VBA‬‬ ‫‪Object‬‬
‫تى ‪ 65400‬رف‬ ‫‪String‬‬
‫أي قيمة رقمية بنطاق الـ ‪ Double‬أ نصية بنطاق ‪String‬‬ ‫‪Variant‬‬

‫‪39‬‬
‫الفصل الرابع‬

‫اإلعالن عن المتغيرات ‪Declaring variables‬‬

‫إذا لم تقم باإلعالن عن ن ع المتغير فسيعطيه ‪ VBA‬الن ع االفتراضي للمتغيرات ه ‪.Variant‬‬


‫البيانات التي تخزن كـ ‪ Variant‬تستطيع أن تست عب أي ن ع من البيانات يث أن الن ع يتغير طبقا ً‬
‫للبيانات ال ُمعينة للمتغير ِلما تريد أن تفعله بهذا المتغير‪ .‬فمثالً إذا كان لدينا متغيرا ً من ن ع ‪Variant‬‬
‫تم تعيين قيمة نصية لذلك المتغير تشابه القيم العددية (كأن تعين قيمة المتغير بـ "‪)"100200300‬‬
‫فإمكانك أن تق م بإجراء العمليات النصية ‪( text manipulation‬مثل أن تق م بإعادة أ ل ‪ 3‬رم ز‬
‫من النص) أ العمليات ال سابية على هذا المتغير‪ .‬هنا يق م ‪ VBA‬بالت يل التلقائي لن ع البيانات سب‬
‫طبقت على المتغير‪.‬‬ ‫العملية التي ُ‬
‫انظر المثال التالي‪:‬‬
‫)(‪Sub test‬‬
‫"‪var1 = "100200300‬‬
‫))‪MsgBox (Left(var1, 3‬‬
‫)‪MsgBox (var1 + 300‬‬
‫‪End Sub‬‬
‫هنا استخدمنا متغيرا ً اسمه ‪ Var1‬أعطيناه القيمة "‪ "100200300‬اآلن عند تطبيق عملية نصية مثل‬
‫إيجاد أ ل ‪ 3‬رم ز في السلسة من خالل الدالة ‪ ، " Left(var1, 3)" Left‬يتعامل الـ ‪ VBA‬مع البيانات‬
‫كنص ‪ .String‬بينما عند تطبيق عملية سابية على القيمة "‪ " Var1+300‬يتعامل الـ ‪ VBA‬مع البيانات‬
‫كرقم‪ .‬شكل ‪ 4-1‬يظهر لنا نتيجة تنفيذ العمليتين‬

‫‪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‬‬

‫لإلعالن عن المتغيرات نستخدم (غالباً) الكلمة المفتا ية ‪ Dim‬بالشكل التالي‪:‬‬


‫>ن ع المتغير< ‪> As‬اسم المتغير< ‪Dim‬‬
‫أمثلة‪:‬‬
‫‪Dim Name As String‬‬
‫‪Dim Salary As Double‬‬
‫‪Dim StartDate As Date‬‬
‫‪Dim X‬‬

‫‪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‬‬

‫سيتم التطرق لتلك األن اع ال قا ً في الفقرات التالية‪.‬‬


‫نطاق المتغيرات‬
‫نطاق المتغير ‪ Variable's scope‬ي دد ال دات البرمجية االجرائيات التي يمكن أن تستخدم المتغير‪.‬‬
‫هناك ثالثة أن اع لنطاق المتغير‪:‬‬
‫‪ Procedure only -1‬نطاق اإلجرائية فقط (س اء أكانت اإلجرائية عبارة عن دالة ‪Function‬‬
‫أ إجرائية فرعية ‪ .)Sub Procedure‬في هذه ال الة يتم تعريف النطاق للمتغير عن طريق‬
‫استخدام جملة ‪ Dim‬أ ‪ Static‬بداخل اإلجرائية‬
‫‪ Module only -2‬نطاق ال دة البرمجية فقط‪.‬‬
‫‪ All procedures in all modules -3‬كل االجرائيات في جميع ال دات البرمجية‪.‬‬

‫‪43‬‬
‫الفصل الرابع‬

‫في الفقرات التالية سنتعرض بالتفصيل لهذه األن اع الثالثة‪.‬‬


‫‪ Procedure only variables‬المتغيرات في نطاق اإلجرائية فقط‬
‫يعد هذا النطاق ه المست ى األدنى لمتغير ما يث ان المتغير يك ن معرفا ً بداخل اإلجرائية يمكن‬
‫استخدامه بداخل تلك اإلجرائية فقط‪ .‬عندما ينتهي تنفيذ االجرائية فإن المتغير ال يع د له ج د يق م‬
‫االكسيل بإخالء مكانه في الذاكرة‪.‬‬
‫عند تنفيذ اإلجرائية مرة أخرى يع د المتغير مرة أخرى لكنه يفقد أي قيمة سابقة اكتسبها من خالل‬
‫التنفيذ السابق لإلجرائية‪.‬‬
‫أشهر طريقة لإلعالن عن المتغير في نطاق اإلجرائية فقط ه من خالل استخدام الكلمة المفتا ية ‪Dim‬‬
‫ذلك باإلعالن عنه بعد جملة ‪ Sub‬أ ‪ Function‬مباشرة قبل كتابة أسطر الك د الخاصة باإلجرائية‪.‬‬
‫انظر المثال التالي‪:‬‬
‫) (‪Sub Test‬‬
‫‪Dim FirstName As Text, LastName As Text‬‬
‫…………‬
‫]أسطر الك د البرمجي[‬
‫‪End Sub‬‬

‫إذا أعلنت عن متغير في نطاق اإلجرائية فقط فإن االجرائيات األخرى بداخل نفس ال دة البرمجية‬
‫تستطيع استخدام نفس اسم المتغير بداخلها لكن يتم التعامل مع كل متغير بشكل منفصل تماما ً ال ت جد‬
‫عالقة أبدا ً بين تلك المتغيرات‪ .‬يمكن الق ل بأن المتغيرات ذات نطاق "اإلجرائية فقط" هي األكثر فعالية‬
‫في استخدام الذاكرة يث أن المتغير يُخلى مكانه في الذاكرة ف را ً بعد تنفيذ اإلجرائية‪.‬‬

‫‪44‬‬
‫المتغيرات‬

‫‪ Module only variables‬المتغيرات في نطاق الوحدة البرمجية فقط‪.‬‬


‫إذا كنت تريد أن يك ن المتغير متا ا ً لجميع االجرائيات بداخل ال دة النمطية فبإمكانك اإلعالن عن‬
‫المتغير قبل أ ل إجرائية (س اء أكانت ‪Function‬أ ‪ .) Sub‬هذا المكان الذي يسبق أي إجرائية يطلق‬
‫عليه ‪" Declarations section‬قسم اإلعالن عن المتغيرات"‬
‫الشكل ‪ 4-3‬ي ضح لنا جزء اإلعالن عن المتغيرات ‪ .declaration‬ال ظ هنا أنك بمجرد ضع مؤشر‬
‫الما س في جزء اإلعالن تتغير القائمة المنسدلة على اليمين إلى ‪ .Declaration‬باإلمكان استخدام‬
‫القائمة المنسدلة لالنتقال إلى أي جزء من ال دة النمطية‪.‬‬

‫‪Figure4-3‬‬

‫بالنسبة للمتغيرات في نطاق ال دة النمطية‪ ،‬يمكن استخدام هذه المتغيرات في أي إجرائية بداخل ال دة‬
‫النمطية تبقى قيمتها كما هي عند االنتقال من إجرائية ألخرى‪.‬‬

‫‪45‬‬
‫الفصل الرابع‬

‫المتغيرات العامة ‪Public variables‬‬


‫إذا كنت تريد أن يك ن المتغير متا ا ً لجميع االجرائيات في جميع ال دات النمطية يمكنك أن تعرف‬
‫المتغير كمتغير عام ‪ Public variable‬باستخدام الكلمة المفتا ية ‪ Public‬ذلك في جزء االعالن عن‬
‫المتغيرات‪ .‬انظر المثال التالي‪:‬‬
‫‪Public InvestRate as Long‬‬
‫دة نمطية بداخل‬ ‫اآلن يمكنك استخدام المتغير ‪ InvestRate‬في أي دالة أ إجرائية فرعي بداخل أي‬
‫المصنف‪.‬‬

‫المتغيرات الثابتة ‪Static Variables‬‬


‫عادةً‪ ،‬يتم عمل إعادة تعيين ‪ Reset‬لجميع المتغيرات في اإلجرائية بعد االنتهاء من تنفيذها‪ .‬المتغيرات‬
‫الثابتة هي ن ع خاص من المتغيرات التي ت تفظ بقيمتها تى بعد االنتهاء من تنفيذ اإلجرائية ال يتم‬
‫عمل إعادة تعيين لها‪ .‬يتم اإلعالن عن المتغيرات الثابتة باستخدام الكلمة المفتا ية ‪ Static‬بداخل‬
‫اإلجرائية‪.‬‬
‫في المثال التالي استخدمنا متغيرا ً ثابتا ً لعرض عدد المرات التي تم بها تشغيل اإلجرائية الفرعية )(‪Test‬‬

‫‪Figure 4-4‬‬

‫‪46‬‬
‫المتغيرات‬

‫هنا تم تعريف المتغير ‪ RunCounter‬كمتغير ثابت من ن ع ‪ Integer‬في كل مرة يتم تشغيل اإلجرائية‬
‫الفرعية )(‪ Test‬يتم زيادة قيمة ‪ RunCounter‬بمقدار ‪ 1‬من خالل السطر البرمجي‪:‬‬
‫‪RunCounter = RunCounter + 1‬‬
‫ار من خالل السطر البرمجي‪:‬‬ ‫يتم عرض النتيجة في مربع‬
‫‪MsgBox RunCounter‬‬

‫متى يحدث إعادة تعيين ‪ Reset‬للمتغيرات‬


‫نطاق المتغيرات ‪ Variables scope‬ال ي دد أين يمكن استخدام المتغير فقط‪ ،‬بل أيضا ً ي دد متى تق م‬
‫‪ VBA‬ب ذف قيمة المتغير من الذاكرة‪ .‬يث أنه – كما تم ذكره سابقا ً‪ -‬تق م الـ ‪ VBA‬ب ذف قيمة‬
‫المتغير الم ج د ضمن نطاق اإلجرائية ‪ Procedure only variable‬بمجرد االنتهاء من تنفيذ‬
‫اإلجرائية‪ .‬المتغيرات األخرى (‪ )Static, Public, and Module only variables‬ت تفظ بقيمتها‬
‫ل ين اغالق المصنف أ االكسيل‪.‬‬
‫يمكنك أيضا ً أن تق م ب ذف قيم المتغيرات من الذاكرة باستخدام ا دى الطرق التالية‪:‬‬
‫‪ -‬عن طريق الضغط على زر ‪( Reset‬المربع األزرق الم ج د على شريط األد ات)‬
‫‪ -‬عن طريق الضغط على زر ‪ End‬عند ظه ر رسالة خطأ‪.‬‬
‫‪ -‬عن طريق استخدام الكلمة المفتا ية "‪ "End‬في أي مكان بداخل الك د‬

‫‪47‬‬
‫الفصل الرابع‬

‫‪Figure4-5‬‬

‫الثوابت ‪Constants‬‬
‫أ يانا ً ت تاج إلى اإلشارة إلى قيمة ثابتة ال تتغير أبدا ً مثل أن تشير إلى ثابت الدائرة "ط ‪ "Pi‬الذي‬
‫يسا ي القيمة ‪ 3.14‬تقريباً‪ .‬لهذا الغرض نستخدم الث ابت ‪ Constants‬يث أن المتغيرات العادية‬
‫‪ Variable‬معرضة ألن تتغير قيمتها مع تشغيل البرنامج (لهذا تدعى متغيرات‪ .‬أليس كذلك؟)‬
‫يتم اإلعالن عن الث ابت باستخدام الكلمة المفتا ية ‪ .Const‬ت ت ي جملة اإلعالن عن المتغير على‬
‫قيمة المتغير‪ .‬الجمل التالية هي أمثلة على الث ابت‪:‬‬
‫‪Const Pi = 3.14‬‬

‫‪48‬‬
‫المتغيرات‬

‫"‪Const ModuleName As String = "Reporting‬‬


‫‪Public Const Rate = 0.075‬‬
‫استخدام الث ابت بدالً من ادراج القيم مباشرة كقيم ثابتة ‪ Hard-coded‬في البرنامج ه من الممارسات‬
‫الممتازة في البرمجة يث أن هذا األمر يسهل قراءة فهم الك د لغير كاتبه‪ ،‬باإلضافة إلى أن هذا األمر‬
‫يسهل من عملية تغيير قيم الث ابت فتتم عملية التغيير مرة ا دة فقط‪ .‬فعلى سبيل المثال اذا كان الك د‬
‫يتكرر به اإلشارة إلى ثابت م دد (مثل نسبة الفائدة ‪ Interest‬مثالً) فمن األفضل أن يتم اإلعالن عن‬
‫ثابت تعيين قيمة تلك القيمة إليه ب يث أنه إذا تغيرت نسبة الفائدة فسن تاج لتغيير تلك النسبة مرة ا دة‬
‫عن طريق تغيير قيمة الثابت‪.‬‬
‫نطاق الثوابت ‪Constants Scope‬‬
‫بالنسبة لنطاق الث ابت فما ينطبق على المتغيرات بهذا الصدد ينطبق على الث ابت‪.‬‬
‫مال ظة‪/‬‬
‫بخالف المتغيرات؛ قيمة الثابت ال يمكن تغييرها بعد اإلعالن عنها‪ .‬اذا ا لت تغييرها في أثناء الك د‬
‫فست صل على رسالة خطأ‪.‬‬

‫التعامل مع المتغيرات النصية ‪Working with Strings‬‬


‫تتعامل ‪ VBA‬مع ن عين من السالسل النصية‪:‬‬
‫‪ -1‬السالسل النصية ذات الطول الثابت ‪ :Fixed-length strings‬هي التي يتم اإلعالن عنها‬
‫مع ت ديد ال د األقصى لعدد ال ر ف في السلسلة النصية‪ .‬ال د األقصى لعدد ال ر ف لهذا‬
‫الن ع ه ‪ 65526‬رف‪.‬‬
‫‪ -2‬السالسل النصية ذات الطول المتغير ‪ :Variable-length strings‬إذا لم يتم ت ديد عدد‬
‫األ رف للمتسلسلة النصية قت اإلعالن عن المتغير‪ ،‬يتم التعامل مع المتسلسلة النصية كذات‬
‫ط ل متغير ‪ .Variable-length string‬في هذه ال الة فال د األعلى لعدد ال ر ف في‬
‫المتسلسلة ه عبارة عن ‪ 2‬مليار رف‪.‬‬

‫‪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‬‬
‫المتغيرات‬

‫جمل التعيين ‪Assignment Statements‬‬


‫جمل التعيين هي التي يتم من خاللها إعطاء القيم للمتغيرات أ الكائنات (مثل الخاليا) هي تستخدم‬
‫عادة المعامل "="‪.‬‬
‫في األسفل بعض األمثلة على جمل التعيين‪:‬‬
‫‪x = 100‬‬
‫‪Z=Z+1‬‬
‫‪y = (y + x) / 20‬‬
‫‪Rate = Range("A1").Value‬‬

‫كما ال ظت من خالل األمثلة السابقة يمكن استخدام جمل التعيين لتعيين قيمة م ددة للمتغير أ تعيين‬
‫نتيجة عملية ما للمتغير كما يمكن إعطاء المتغير قيمة أ د الكائنات كأن تعطي المتغير القيمة الم ج دة‬
‫في الخلية ‪.A1‬‬
‫من الجمل السابقة هناك جملة قد تبد غريبة‪ ،‬إال أنها من التعابير التي يكثر استخدامها في عالم البرمجة‬
‫هي‪:‬‬
‫‪Z=Z+1‬‬
‫مفه م هذه الجملة ه أنه في كل مرة يتم تنفيذ هذه الجملة يتم زيادة قيمة المتغير بمقدار ‪.1‬‬
‫المصفوفات ‪Arrays‬‬
‫تدعم جميع لغات البرمجة ال ديثة المصف فات من بينها لغة ‪ VBA‬منذ إصدارها األ ل‪ .‬المصف فة هي‬
‫مجم عة من المتغيرات التي تتشارك في نفس االسم‪ .‬تتم اإلشارة إلى عنصر م دد بداخل المصف فة‬
‫من خالل استخدام اسم المصف فة مع رقم المرجع ‪ Index number‬للمتغير بداخل ق سين‪ .‬على سبيل‬
‫المثال بإمكانك اإلعالن عن مصف فة من المتغيرات الرقمية من ن ع ‪ Integer‬ت ت ي على ‪10‬‬
‫عناصر ت ت اسم ‪ MyNumbers‬من ثم يمكنك اإلشارة للعنصر األ ل في المصف فة كالتالي‪:‬‬
‫)‪ MyNumers(1‬العنصر الثاني‪ MyNumers(2) :‬هكذا‪.‬‬

‫‪51‬‬
‫الفصل الرابع‬

‫اإلعالن عن المصفوفات ‪Declaring Arrays‬‬


‫قبل أن تشرع باستخدام مصف فة ما يجب أن تق م باإلعالن عنها – ال ي جد هنا أي استثناءات – بخالف‬
‫المتغيرات العادية التي يمكن استخدامها بداخل ك د الـ ‪ VBA‬بد ن اإلعالن عنها‪ .‬يمكنك اإلعالن عن‬
‫المصف فات باستخدام الكلمة المفتا ية ‪ Dim‬أ ‪ Public‬سب النطاق الذي تريده لهذه المصف فة‪ .‬يجب‬
‫ت ديد عدد عناصر المصف فة عند اإلعالن عنها من خالل ادخال الرقم المرجعي األ ل ‪First index‬‬
‫‪ number‬ثم الكلمة المفتا ية ‪ To‬ثم الرقم المرجعي األخير ‪ .Last Index number‬المثال التالي‬
‫ي ضح لنا كيفية اإلعالن عن مصف فة من األرقام ‪ Integer‬ت ت ي على ‪ 10‬عناصر‪:‬‬
‫‪Dim MyNumbers (1 To 10) As Integer‬‬
‫عند اإلعالن عن مصف فة فلك الخيار في أن ت دد الرقم المرجعي ‪ Index‬األدنى األقصى أ أن ت دد‬
‫الرقم المرجعي األقصى فقط‪ .‬في ال لم ت دد الرقم المرجعي األدنى فإن الـ ‪ VBA‬يعتبره ‪ 0‬ليس ‪.1‬‬
‫الجملتين التاليتين لهما نفس التأثير‪:‬‬
‫‪Dim MyNumbers (0 To 10) As Integer‬‬
‫‪Dim MyNumbers (10) As Integer‬‬
‫إذا كنت تريد للـ ‪ VBA‬أن يفترض أن الرقم المرجعي األدنى ه ‪ 1‬ليس ‪ 0‬فبإمكانك ادخال الجملة‬
‫التالية في جزء اإلعالن ‪: Decelerations section‬‬
‫‪Option Base 1‬‬
‫المصفوفات متعددة األبعاد ‪Multidimensional Arrays‬‬
‫المصف فات التي تم التعرض لها في الفقرات السابقة هي عبارة عن مصف فات يدة البعد ‪One-‬‬
‫‪ dimensional‬يمكن تخيل المصف فة ذات البعد ال ا د كعم د ا صف من القيم‪ .‬من الممكن أن تتعامل‬
‫الـ ‪ VBA‬مع مصف فات ذات أبعاد تى ‪ 60‬بعد على الرغم من أنه من النادر جدا ً أن يضطر أ د أن‬
‫يتعامل مع مصف فة ذات أبعاد أكثر من اثنين أ ثالثة‪.‬‬
‫المثال التالي يعرض لنا مصف فة ذات بعدين تسعة عناصر‪:‬‬
‫‪Dim MyArray( 1 To 3, 1 To 3) As Integer‬‬

‫‪52‬‬
‫المتغيرات‬

‫لإلشارة لعنصر م دد بداخل هذه المصف فة يجب أن ت دد الرقم المرجعي ‪ Index number‬لكل بعد‬
‫كما في التالي‪:‬‬
‫‪MyArray (1, 1 ) = 100‬‬
‫هنا عينا القيمة ‪ 100‬للعنصر ال اقع في الم قع ‪.1 1‬‬

‫في ال اقع يمكن تخيل المصف فة ثنائية البعد كمربع أ مستطيل ذات صف ف أعمدة أما المصف فة‬
‫الثالثية فيمكن تخيلها كمت ازي مستطيالت له ط ل عرض ارتفاع‪.‬‬

‫المصفوفات الديناميكية ‪Dynamic Arrays‬‬


‫بإمكانك ايضا ً انشاء مصف فات ديناميكية (ذات عدد عناصر متغير)‪ .‬لإلعالن عن هذا الن ع من‬
‫المصف فات نستخدم أق اسا ً فارغة بعد اسم المصف فة كما في المثال التالي‪:‬‬
‫‪Dim MyArray () As Integer‬‬
‫قبل أن تبدأ باستخدام هذه المصف فة يجب أن تستخدم الكلمة المفتا ية ‪ ReDim‬إلخبار الـ ‪ VBA‬عن‬
‫عدد العناصر بداخل المصف فة‪ .‬عادة يتم ت ديد عدد العناصر في المجم عة في أثناء تشغيل البرنامج‬
‫يث أنه باإلمكان استخدام جملة ‪ ReDim‬بالعدد الذي تريده‪ .‬المثال التالي يعرض لنا كيفية استخدام‬
‫‪ ReDim‬لتغيير عدد العناصر في المصف فة‪:‬‬
‫)‪ReDim MyArray ( 1 To ElementsNo‬‬
‫على افتراض أن المتغير ‪ ElementsNo‬ي ت ي على عدد العناصر المطل ب‪.‬‬

‫‪53‬‬
‫الفصل الرابع‬

‫‪54‬‬
‫التعامل مع كائنات النطاق‬

‫الفصل الخامس‬

‫‪ .5‬التعامل مع كائنات النطاق‬

‫كائن النطاق يمثل نطاقا ً بداخل كائن رقة العمل ‪ .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‬‬

‫اإلشارة لكائنات النطاق من خالل الخاصية ‪Cells‬‬


‫من الممكن اإلشارة إلى النطاقات باستخدام الخاصية ‪ Cells‬يث أن هذه الخاصية تأخذ معاملين هما‬
‫رقم الصف رقم العم د‪ .‬فمثالً إذا أردنا اإلشارة إلى الخلية ‪ B1‬هي ال اقعة في الصف األ ل العم د‬
‫الثاني نستخدم الجملة التالية‪:‬‬
‫)‪Cells(2, 1‬‬
‫يث أن المعامل األ ل يمثل رقم الصف المعامل الثاني يمثل رقم العم د‪.‬‬
‫إلعطاء قيمة م ددة للخلية ‪ 100( A1‬مثالً) يمكن استخدام أي من الجملتين التاليتين‪:‬‬
‫‪Range ("A1").Value = 100‬‬
‫‪Cells(1,1).Value = 100‬‬
‫أما إذا أردنا إعطاء القيمة ‪ 100‬للخاليا في النطاق ‪ A1:B10‬فيمكن استخدام أي من الجملتين التاليتين‪:‬‬

‫‪56‬‬
‫التعامل مع كائنات النطاق‬

‫‪Range ( "A1:B10").Value = 100‬‬


‫‪Range(Cells (1,1) , Cells( 2 ,10)) . Value = 100‬‬
‫تظهر ق ة الخاصية ‪ Cells‬عند استخدام المتغيرات كع امل لها بدالً من األرقام مما يعطيها مر نة‬
‫كبيرة‪.‬‬
‫خاصية اإلزاحة ‪Offset‬‬
‫من خالل هذه الخاصية بإمكانك أن تشير إلى نطاق يبعد عن النطاق ال الي بمقدار عدد م دد من‬
‫الصف ف أ األعمدة‪ .‬تأخذ هذه الخاصية معاملين المعامل األ ل ه عبارة عن عدد الصف ف الثاني‬
‫عدد األعمدة (بالنسبة لعدد الصف ف‪ ،‬الرقم الم جب ه للسير من اليسار لليمين أما السالب فللسير من‬
‫الي مين لليسار‪ ،‬أما بالنسبة لعدد األعمدة‪ ،‬فالرقم الم جب للسير من األعلى لألسفل السالب من األسفل‬
‫لألعلى)‪ .‬فمثالً لإلشارة إلى الخلية التي تبعد بمقدار صفين ثالثة أعمدة عن الخلية ‪ ( A1‬هي الخلية‬
‫‪ ) D3‬نستخدم الجملة التالية‪:‬‬
‫)‪Range ("A1").Offset (2, 3‬‬
‫خاصية القيمة ‪Value‬‬
‫تمثل الخاصية ‪ Value‬القيمة بداخل خلية ما‪ .‬هي من الخصائص التي يمكن قراءتها تغييرها ‪Read-‬‬
‫‪ .write‬لذلك فمن الممكن لك د ‪ VBA‬أن يقرا القيمة فقط بد ن تغييرها كما في السطر البرمجي التالي‬
‫الذي يق م بعرض قيمة الخلية ‪ A1‬في مربع ار ‪:Message Box‬‬
‫‪MsgBox Range("A1").Value‬‬
‫من الجدير بالذكر أنه يمكن قراءة قيمة خلية ا دة فقط لذلك فالجملة التالية ال تعمل تعرض خطا ً‬
‫عند تنفيذ البرنامج‪:‬‬
‫‪MsgBox Range("A1:B10").Value‬‬

‫مالحظة‬
‫إذا كنت تريد أن تق م بقراءة م ت يات مجم عة من الخاليا فيمكنك أن تعرف متغير كـ ‪ 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‬‬
‫إلعطاء قيمة م ددة لمجم عة من الخاليا دفعة ا دة كما في المثال التالي‪:‬‬

‫‪Range("A1: B10").Value = 150‬‬


‫مالحظة‪////‬‬
‫خاصية القيمة ‪ Value‬هي الخاصية االفتراضية لكائن النطاق ‪ Range object‬لذلك يمكن استخدام‬
‫أي من الجملتين التاليتين إلعطاء قيمة للخلية ‪:A1‬‬
‫‪Range ("A1") . Value = 150‬‬
‫‪Range ("A1") = 150‬‬

‫خاصية ‪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‬‬
‫الفصل الخامس‬

‫بعض الوظائف ‪ Methods‬التي يمكن تطبيقها على كائنات النطاق‬


‫ال ظائف هي مجم عة من اإلجراءات التي يمكن تطبيقها على الكائن‪ .‬هناك العشرات من ال ظائف التي‬
‫يمكن تطبيقها على كائنات النطاق في هذا الجزء س ف نستعرض بعضا ً من أهمها‪.‬‬
‫وظيفة التحديد ‪Select‬‬
‫تستخدم هذه ال ظيفة لت ديد نطاق من الخاليا‪ .‬الك د التالي ي دد النطاق ‪ A1:B10‬في رقة العمل‬
‫النشطة‪:‬‬
‫‪Range("A1:B10").Select‬‬

‫قبل استخدام ‪ Select‬لت ديد نطاق ما‪ ،‬من الجيد أن تستخدم سطرا ً برمجيا ً آخر للتأكد أن رقة العمل المطل ب‬
‫ت ديد النطاق بها هي ال رقة النشطة ‪ .Active sheet‬يتم ذلك من خالل ال ظيفة ‪ .Activate‬مثالً إذا كان‬
‫النطاق المطل ب ت ديده ضمن رقة العمل ‪ Sheet1‬نستخدم الك د التالي‪:‬‬
‫‪Sheets( "Sheet1" ) . Activate‬‬
‫‪Range("A1:B10").Select‬‬
‫ال ظ أن الجملة التالية ال تعتبر ص ي ة ترجع قيمة خطأ عند تنفيذ البرنامج إذا لم تكن ‪ Sheet1‬هي ال رقة‬
‫النشطة‪.‬‬
‫‪Sheets("Sheet1").Range("a1").Select‬‬

‫وظائف النسخ واللصق ‪Copy and Paste methods‬‬

‫‪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‬التي تم التنسيق بد ن أن تم الم ت يات‪.‬‬

‫وظيفة الحذف ‪Delete method‬‬


‫تختلف ظيفة ال ذف ‪ Delete‬عن ظيفة المسح ‪ Clear‬فعندما ت ذف نطاقا ً من الخاليا يتم إزا ة‬
‫الخاليا الم يطة لسد مكان الخاليا ال ُمزا ة‪ .‬لذلك يجب أن يتم ت ديد اتجاه االزا ة كمعامل ل ظيفة‬
‫‪ .Delete‬أما إذا أردت ذف صف أ عم د فال يلزم ت ديد اتجاه االزا ة يتم ذف الصف أ العم د‬
‫مباشرة‪.‬‬
‫كي تتخيل عمل هذه ال ظيفة دد نطاق بداخل رقة العمل ثم انقر بزر الما س األيمن اختر ‪Delete‬‬
‫ذف‪ ،‬س ف يظهر مربع ار ينها يطلب منك ت ديد اتجاه االزا ة إذا كنت تريد ذف النطاق أ‬
‫ت ديد إذا ما كنت تريد ذف صف ف أ أعمدة النطاق بأكملها‪.‬‬
‫الك د التالي ي ذف العم د ‪:D‬‬
‫‪Columns("D:D").Delete‬‬
‫أما الك د التالي في ذف خاليا النطاق (‪:)A1:B10‬‬
‫‪Range("A1:B10").Delete xlToLeft‬‬
‫ال ظ هنا اننا استخدمنا الكلمة المفتا ية ‪ xlToLeft‬إلزا ة الخاليا التي على يسار الخاليا الم ذ فة‬
‫يمكن استخدام الكلمة ‪ xlUp‬الزا ة الخاليا التي بأعلى الخاليا الم ذ فة‪.‬‬

‫‪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‬‬

‫جملة ‪IF- Then – [Else]- Endif‬‬


‫في ال كان لديك أكثر من أمر لتنفيذه س ا ًء عند ت قق الشرط أ عند عدم ت ققه‪ ،‬فمن الممكن استخدام‬
‫الشكل التالي من جملة ‪:IF‬‬

‫‪68‬‬
‫جمل الت كم‬

‫‪] Then‬الشرط[ ‪If‬‬


‫]األمر البرمجي في ال ت قق الشرط[‬
‫‪End If‬‬
‫في ال ‪ If - Else‬يصبح الشكل كالتالي‪:‬‬
‫‪] Then‬الشرط[ ‪If‬‬
‫]األمر البرمجي في ال ت قق الشرط[‬
‫‪Else‬‬
‫]األمر البرمجي في ال عدم ت قق الشرط[‬
‫‪End If‬‬
‫مثال‬
‫في هذا المثال‪ ،‬المطل ب ه أنه إذا كانت القيمة في الخلية ‪ A1‬أقل من ‪ 60‬أن يتم كتابة ‪ Fail‬في الخلية‬
‫‪ B1‬باإلضافة إلى عرض مربع ار يعرض الجملة "!!‪."Hard luck‬‬
‫لهذا الهدف نستخدم الك د التالي‪:‬‬
‫)(‪Sub PassFail‬‬
‫‪Dim score As Integer, result As String‬‬
‫‪score = Range("A1").Value‬‬
‫‪If score >= 60 Then‬‬
‫"‪result = "Pass‬‬
‫‪Else‬‬
‫"‪result = "Fail‬‬
‫"!!‪MsgBox "Hard luck‬‬
‫‪End If‬‬

‫‪69‬‬
‫الفصل السادس‬

‫‪Range("B1").Value = result‬‬
‫‪End Sub‬‬

‫في هذا الشكل من أمر ‪ If‬يمكنك إضافة أي عدد من األسطر البرمجية (التي تمثل الشر ط) ت ت جزء‬
‫‪ If‬أي عدد من األسطر البرمجية ت ت جزء ‪ .Else‬هذه الطريقة في كتابة جملة ‪ IF‬تعد في نظر الكثيرين‬
‫أفضل من الطريقة التي تم ذكرها أ الً التي يتم فيها كتابة جملة ‪ If‬على سطر ا د يث أنها باإلضافة‬
‫إلى أنك تستطيع أن تضيف أي عدد من الشر ط أي عدد من الجمل البرمجية في ال ت قق الشرط‪/‬‬
‫أ الشر ط المطل بة‪ ،‬أسهل في القراءة التتبع باإلضافة إلى أنك في هذه ال الة ستكتب جمل برمجة‬
‫أقصر بالتالي س ف تك ن أقل عرضة لألخطاء‪.‬‬
‫استخدام ‪If – Then -Elseif – Endif‬‬
‫في ال كان لديك مجم عة من ال االت ‪ /‬الشر ط لالختيار فيما بينها يمكنك استخدام ‪ Elseif‬مع جملة‬
‫‪ .If‬تأخذ جملة ‪ If‬مع ‪ Elseif‬الشكل العام التالي‪:‬‬

‫‪] Then‬الشرط األ ل[ ‪If‬‬


‫]الك د البرمجي في ال ت قق الشرط األ ل[‬
‫‪ ] Then‬الشرط الثاني[ ‪ElseIf‬‬
‫]الك د البرمجي في ال ت قق الشرط الثاني[‬
‫‪ElseIf‬‬
‫‪.‬‬
‫‪.‬‬
‫‪ ] Then‬الشرط األخير[ ‪ElseIf‬‬
‫]الك د البرمجي في ال ت قق الشرط األخير[‬
‫‪End If‬‬

‫‪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

If – ElseIf – Else ‫استخدام‬


‫ في النهاية يث أنه‬Else ‫ في هذه ال الة يك ن م قع‬،If – ElseIf ‫ مع جملة‬Else ‫من الممكن استخدام‬
.Else ‫في ال عدم ت قق أي من الشر ط المعطاة؛ يتم تطبيق الك د الذي يقع بعد كلمة‬
:‫ كما ه باألسفل‬If – ElseIf – Else ‫ تم إعادة كتابة اإلجرائية السابقة باستخدام‬،‫كمثال على ذلك‬

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

)Nested IFs( If ‫ بداخل‬If ‫غني عن الذكر أنه يمكنك استخدام‬

Comparison operators ‫عوامل المقارنات التي يمكن استخدامها‬


‫نوع المقارنة‬ ‫العامل‬
‫أكبر من‬ >
‫أصغر من‬ <
‫يسا ي‬ =
‫ أصغر من يسا ي‬،‫أكبر من يسا ي‬ >= , <=
‫ال يسا ي‬ <>

73
‫الفصل السادس‬

‫فهم العوامل المنطقية‬


‫تستخدم الع امل المنطقية عادة ً في اجراء المقارنات بين نتائج تنفيذ الجمل البرمجية المنطقية‪ .‬نتيجة‬
‫تطبيق الع امل المنطقية هي إما ص يح ‪True‬أ خطأ ‪ .False‬من أشهر الع امل المنطقية ‪AND,‬‬
‫‪OR, and NOT‬‬
‫الجمل المنطقية هي الجمل البرمجية التي يك ن نتيجة تنفيذها اما ص يح ‪ True‬أ خطأ ‪ False‬فمثالً‬
‫الجملة التالية هي جملة منطقية قد يك ن نتيجة تنفيذها ‪ True‬أ ‪ False‬طبقا ً للقيمة الم ج دة بداخل‬
‫الخلية ‪:A1‬‬
‫‪Range("A1").Value >= 70‬‬
‫العامل ‪AND‬‬
‫يستخدم العامل ‪ AND‬للمقارنة بين نتيجتين منطقيتين ب يث أنه يرجع القيمة ‪ True‬اذا كانت كال‬
‫النتيجتين ‪ .True‬أما إذا كانت ا دي النتيجتين ‪ False‬فإن النتيجة النهائية س ف تك ن ‪ .False‬فمثالً‬
‫الجملة البرمجية التالية تك ن نتيجة تنفيذها ‪ ،True‬فقط في ال كانت نتيجة تنفيذ كال الجملتين المنطقتين‬
‫على جانبي المعامل ‪ AND‬هي ‪( True‬في الة هذا المثال يجب أن تك ن القيمة في الخلية ‪ A1‬اكبر‬
‫من ‪ 70‬القيمة في الخلية ‪ B1‬أكبر من ‪:(100‬‬
‫‪Range("A1").Value >70 AND Range("B1").Value >100‬‬

‫العامل ‪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‬‬

‫جملة ‪Select Case statement‬‬


‫إذا كان لديك العديد من الخيارات لالختيار فيما بينها فإن أنسب جملة لهذا الغرض هي جملة ‪Select‬‬
‫‪( Case‬في كثير من األ يان تك ن أفضل تى من جملة ‪ .)If – Elseif‬تأخذ هذه الدالة جملة شرطية‬
‫ا دة ‪ Expression‬العديد من الخيارات ‪( Options‬النتائج الم تملة لتلك الجملة) عند ت قق أ د‬
‫الخيارات يتم تنفيذ الك د المرافق لذلك الخيار يتم الخر ج من الدالة‪.‬‬
‫تأخذ هذه الجملة الشكل العام التالي‪:‬‬
‫تعبير الف ص ‪Select Case Test_Expression‬‬

‫الخيار األ ل ‪Case‬‬


‫الك د ال تطابق هذا الخيار مع نتيجة الف ص ‪Code‬‬

‫الخيار الثاني ‪Case‬‬


‫الك د ال تطابق هذا الخيار مع نتيجة الف ص ‪Code‬‬
‫‪.‬‬
‫‪.‬‬
‫أخرى ‪Select‬جمل‬
‫‪.‬‬

‫‪77‬‬
‫الفصل السادس‬

‫‪.‬‬

‫‪Case Else‬‬
‫الك د ال عم ج د تطابق‬
‫‪End Select‬‬

‫مثال‬
‫في هذا المثال تم انشاء دالة تق م بأخذ مؤشر األداء للم ظف (قيمة من ‪ 1‬إلى ‪ 10‬يث ‪ 1‬ه األعلى‬
‫تقييماً) مقدار راتب الم ظف‪ ،‬ترجع لنا مقدار مكافئة الم ظف‪ .‬فلدينا اآلن التعبير ‪ Expression‬ه‬
‫عبارة عن قيمة المتغير ‪ ،performance‬هذا التعبير له العديد من الخيارات (من ‪ 1‬تى ‪ .)10‬عند‬
‫تطابق نتيجة التعبير مع أي من الخيارات يتم تنفيذ الك د لذلك الخيار ثم يتم الخر ج من جملة ‪Case‬‬
‫‪ Select‬اذا لم ي دث أي تطابق يتم تنفيذ الك د ال اقع ت ت ‪.Case Else‬‬

‫)‪Function Bonus(performance, salary‬‬


‫‪Select Case performance‬‬
‫‪Case 1‬‬
‫‪Bonus = salary * 0.1‬‬
‫‪Case 2, 3‬‬
‫‪Bonus = salary * 0.09‬‬
‫‪Case 4 To 6‬‬
‫‪Bonus = salary * 0.07‬‬
‫‪Case Is > 8‬‬

‫‪78‬‬
‫جمل الت كم‬

‫‪Bonus = 100‬‬
‫‪Case Else‬‬
‫‪Bonus = 0‬‬
‫‪End Select‬‬
‫‪End Function‬‬

‫بالنسبة للخيارات ال ظ أنه هناك أكثر من شكل لف ص الخيارات‪:‬‬


‫إذا كنا نريد نطابق مع قيمة م ددة نكتب القيمة الم ددة بعد كلمة ‪ Case‬مباشرة (مثل ‪)Case 1‬‬ ‫‪-1‬‬
‫إذا كنا نريد أن نطابق مع أي قيمة ضمن نطاق من القيم المتجا رة نستخدم كلمة ‪( To‬مثل ‪Case‬‬ ‫‪-2‬‬
‫‪)4 To 6‬‬
‫إذا كنا نريد أن نطابق مع أي قيمة ضمن مجم عة من القيم نستخدم الفاصلة مثل ( ‪)Case 2,3‬‬ ‫‪-3‬‬
‫إذا كنا نريد أن نستخدم ع امل المقارنات نستخدم ‪( Is‬مثل ‪)Case Is > 8‬‬ ‫‪-4‬‬

‫مثال ‪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‬‬
‫الفصل السادس‬

‫‪Case Is >= 70‬‬


‫"‪MsgBox "Good‬‬
‫‪Case Is >= 60‬‬
‫"‪MsgBox "Pass‬‬
‫‪Case Else‬‬
‫"‪MsgBox "Fail‬‬
‫‪End Select‬‬
‫‪End Sub‬‬

‫مثال ‪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‬‬
‫جمل الت كم‬

MsgBox "Quarter 2"


Case 7 To 9
MsgBox "Quarter 3"
Case 10 To 12
MsgBox "Quarter 4"
End Select
End Sub

‫ كبديل‬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‬‬
‫جمل التكرار‬

‫الفصل السابع‬

‫‪ .7‬جمل التكرار ‪Looping Statements‬‬

‫من خالل جمل التكرار تستطيع تكرار تنفيذ أ امر م ددة تى يت قق شرط معين‪ .‬من األمثلة على‬
‫استخدام جمل التكرار‪:‬‬
‫تنفيذ عمليات معينة على جميع المصنفات أ أ راق العمل المفت ة‪ .‬مثل فظ اغالق جميع‬ ‫‪-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
‫الفصل السابع‬

‫الخروج من جملة ‪ for‬من خالل جملة ‪Exit For‬‬


‫من الممكن استخدام الجملة ‪ Exit For‬إلنهاء جملة التكرار الخر ج منها‪ .‬عادة ً ما تستخدم هذه الكلمة‬
‫بعد أن يتم الت قق من ج د شرط معين‪ ،‬فإذا ت قق هذا الشرط يتم الخر ج من جملة ‪.for‬‬
‫مثال‬
‫في هذا المثال تم انشاء جملة تكرار تق م بإدخال القيم من ‪ 1‬تى ‪ 10‬في الخاليا بدءا ً من الخلية ‪A1‬‬
‫عم ديا ً باتجاه األسفل بمقدار ‪ 10‬خاليا ‪ -‬من خالل جملة ‪ .Cells(counter, 1) = counter‬تم‬
‫استخدام دالة ‪ If‬لف ص قيمة العداد في ال أصب ت قيمة العداد ‪ 4 counter‬يتم الخر ج من جملة‬
‫‪.For‬‬

‫)(‪Private Sub Exit_For_Demo‬‬


‫‪Dim counter As Integer‬‬
‫‪For counter = 1 To 10‬‬
‫‪Cells(counter, 1) = counter‬‬
‫‪If counter = 4 Then‬‬
‫‪Cells(counter, 1) = counter * 10‬‬
‫‪Exit For‬‬
‫‪End If‬‬
‫‪Next‬‬
‫‪End Sub‬‬
‫مثال ‪2‬‬
‫هنا مثال أكثر تط را ً عن استخدام ‪ Exit For‬مع دالة ‪ .For‬في هذا المثال تم استخدام جملة ‪ For‬مع‬
‫‪ Exit For‬إلنشاء دالة تأخذ معامل ا د ه عبارة عن جملة ثم تق م باستخراج ال ر ف ال اقعة على‬

‫‪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‬‬
‫الفصل السابع‬

‫)‪TextPart = TextPart & Mid(Str, i, 1‬‬


‫‪End If‬‬
‫‪Next i‬‬
‫‪End Function‬‬

‫جملة ‪ 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‬في كل تكرار‪ .‬في كل تكرار يتم تل ين‬
‫الخلية الناتجة عن تقاطع ذلك الصف الفردي مع العم د الز جي بالل ن األس د من خالل الك د‪:‬‬

‫‪Cells(Row, Col).Interior.Color = 0‬‬

‫بالمثل يتم تل ين الخاليا الفردية في الصف ف الز جية‪.‬‬

‫‪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‬‬
‫لف ص اسم كل عنصر من عناصر التجميعة (في هذا المثال عناصر التجميعة عبارة عن‬
‫مصنفات) من ثم فظ إغالق أي مصنف اسمه مختلف عن اسم المصنف ال الي‪.‬‬

‫‪If wb.Name <> ThisWorkbook.Name Then‬‬


‫‪wb.Save‬‬
‫‪wb.Close‬‬
‫‪End 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‬‬
‫جمل التكرار‬

‫‪If‬‬ ‫)‪WorksheetFunction.CountA(Ws.Cells‬‬ ‫=‬ ‫‪0‬‬


‫‪Then‬‬
‫‪Ws.Delete‬‬
‫‪End If‬‬
‫‪Next Ws‬‬
‫‪Application.DisplayAlerts = True‬‬
‫‪End Sub‬‬

‫التكرار باستخدام الجملة ‪Do…While…Loop‬‬

‫عند تطبيق هذه الجملة يتم ف ص شرط معين طالما أن هذا الشرط مت قق ‪ ،True‬يتم تنفيذ األ امر‬
‫بداخل جملة التكرار‪ .‬تأخذ هذه الجملة الشكل العام التالي‪:‬‬

‫]الشرط[ ‪Do While‬‬


‫]مجم عة من األ امر البرمجية[‬
‫‪Loop‬‬

‫ار يظهر الجملة‬ ‫كمثال بسيط على كيفية استخدام هذه الجملة‪ ،‬تق م اإلجرائية باألسفل بعرض مربع‬
‫"‪ " 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

:‫ كالتالي‬Do Until ‫أما المثال الثاني فيمكن إعادة كتابته باستخدام‬

Sub DoWhileDemo()
Do until IsEmpty(ActiveCell.Value )
ActiveCell.Value = ActiveCell.Value * 2
ActiveCell.Offset(1, 0).Select
Loop
End Sub

99
‫الفصل السابع‬

‫‪100‬‬
‫الد ال‬

‫الفصل الثامن‬

‫‪ .8‬استخدام دوال ورقة العمل ودوال ‪VBA‬‬

‫في السابق ذكرنا أنه بإمكانك استخدام الد ال ‪ Function‬بداخل الك د البرمجي الخاص بـ ‪ .VBA‬في‬
‫هذا الفصل س ف نتعرف على أن اع الد ال الثالثة التي يمكن للغة ‪ VBA‬التعامل معها؛ هي الد ال‬
‫المدمجة في ‪ VBA‬الد ال المدمجة في اإلكسيل (تسمى د ال رقة العمل ‪،)Worksheet functions‬‬
‫الد ال المخصصة ‪ Custom functions‬هي التي تق م أنت بكتابتها‪.‬‬

‫ما هي الدالة؟‬
‫الدالة ‪ Function‬هي عبارة عن مجم عة من األسطر البرمجية تم تنظيمها بشكل معين ب يث تق م‬
‫ببعض ال سابات أ اإلجراءات من ثم ترجع قيمة ا دة‪ .‬فمثالً دالة ‪ SUM‬هي أشهر د ال رقة‬
‫العمل تأخذ مجم عة من القيم (س ا ًء أكانت في نطاقات أم ال) ثم ت سب اصل جمع المعطيات ترجع‬
‫قيمة ا دة فقط هي قيمة اصل الجمع‪.‬‬

‫الدوال المدمجة في ‪)Built-In VBA Functions( VBA‬‬


‫ت فر لنا لغة ‪ VBA‬العديد من الد ال المدمجة التي تسهل ياة المبرمج تجعل الك د أكثر سرعة سه لة‪.‬‬
‫بعض تلك الد ال يأخذ معامالً أ مجم عة من المعامالت ‪ Arguments‬بعضها ال يأخذ‪ .‬في هذا‬
‫الجزء س ف نق م باستعراض بعض الد ال‪ .‬بطبيعة ال ال هناك عدد كبير جدا ً من الد ال المدمجة في‬

‫‪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‬‬
‫الد ال‬

‫عند تنفيذ اإلجرائية ن صل على النتيجة كما بالشكل ‪8-1‬‬

‫‪Figure8-1‬‬

‫دالتي ‪Month and MonthName‬‬


‫تق م الدالة ‪ Month‬بعرض رقم الشهر لتاريخ معطى‪ ،‬بينما تق م الدالة ‪ MonthName‬بأخذ رقم‬
‫الشهر عرض اسمه‪.‬‬
‫السطر البرمجي التالي يق م بعرض رقم الشهر للتاريخ المعطى‪:‬‬
‫)‪Month(#1/12/2019#‬‬
‫تذكر أن تضع التاريخ بين عالمتي السلم (‪ ،)#‬ال ظ هنا أن التاريخ يجب أن تتم كتابته بالنظام األمريكي‬
‫(‪ )Month/Day/Year‬بنا ًء على ذلك فنتيجة تنفيذ السطر السابق هي (‪.)1‬‬
‫مثال ‪:2‬‬
‫اإلجرائية التالية تق م بعرض اسم الشهر للتاريخ ال الي‪:‬‬
‫)(‪Sub ShowMonthName‬‬
‫‪Dim MonthNumber As Integer‬‬
‫)‪MonthNumber = Month(Date‬‬
‫)‪MsgBox MonthName(MonthNumber‬‬
‫‪End Sub‬‬

‫‪103‬‬
‫الفصل الثامن‬

‫يمكن اختصار الك د السابق كما يلي‪:‬‬


‫)(‪Sub ShowMonthName‬‬
‫))‪MsgBox MonthName(Month(Date‬‬
‫‪End Sub‬‬

‫ال ظ هنا اننا استخدمنا الد ال المتداخلة ‪ 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‬‬

‫دوال ‪ VBA‬التي ال ترجع قيمة‬


‫هناك بعض د ال الـ ‪ VBA‬ال تق م بإرجاع قيم عند تنفيذها لكنها تق م بفعل معين هي كالتالي‪:‬‬
‫‪ -1‬دالة ‪ :MsgBox‬تم التعرض لهذه الدالة مرات عديدة خالل هذا الفصل الفص ل السابقة‪ ،‬هي‬
‫تق م بعرض مربع ار ي ت ي على نص ‪/‬أ أزرار ت كم‪ .‬إذا كان مربع ال ار الناتج عن‬
‫هذه الدالة ي ت ي على أزرار ت كم ضغط المستخدم على أ د هذه األزرار فإن الدالة تق م‬
‫بإرجاع قيمة م ددة يث أنه من الممكن استخدام هذه القيمة في البرنامج لت ديد كيفية سيره‬
‫(كأن يضغط المستخدم زر ‪ Cancel‬فيتم الغاء العملية أ ‪ OK‬للسير في البرنامج)‪.‬‬
‫‪ -2‬دالة ‪ :InputBox‬تق م هذه الدالة بعرض مربع ار بسيط يطلب من المستخدم ادخال قيمة‬
‫معينة‪ ،‬من ثم يتم استخدام هذه القيمة في البرنامج‪ .‬المثال التالي ي ضح كيفية استخدام هذه‬
‫الدالة يث يطلب البرنامج من المستخدم ادخال رقم من ثم يرجع مربع الرقم‪:‬‬

‫‪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‬‬
‫الفصل الثامن‬

‫طلب المساعدة من محرر األكواد في كتابة الدوال‬


‫لرؤية جميع الد ال المدمجة في ‪VBA‬؛ يمكنك بالطبع اللج ء إلى نظام المساعدة الخاص بـ ‪VBA‬‬
‫عن طريق الضغط على ‪ F1‬ا من خالل الذهاب لقائمة ‪ .Help‬كما يمكنك أيضا ً كتابة ‪ vba‬في أي‬
‫مكان بداخل م رر األك اد متب عا ً بالنقطة ( ‪ ) .‬فيق م م رر األك اد بعرض قائمة بجميع الد ال‬
‫المتا ة في ‪ VBA‬هنا يمكنك االستفادة من ميزة االكمال التلقائي يث أنك بمجرد كتابة األ رف‬
‫األ لى من الدالة المطل بة تى يق م ‪ VBE‬باختصار القائمة ليعرض فقط الد ال التي تبدأ باأل رف‬
‫التي تم كتابتها‪ .‬شكل ‪8-5‬‬

‫‪Figure8-5‬‬

‫دوال ورقة العمل ‪Worksheet Functions‬‬


‫بالرغم من العدد الكبير للد ال المدمجة في ‪ VBA‬إال أنك أ يانا ً قد ال تجد ما تب ث عنه ضمن تلك‬
‫الد ال‪ .‬لكي تعطيك ‪ VBA‬خيارات أخرى فقد سم ت لك لغة ‪ VBA‬الكسيل باستخدام معظم د ال‬
‫رقة العمل (د ال رقة العمل التي ال يسمح لك م رر ‪ VBE‬باستدعائها هي الد ال التي ي جد ما‬
‫يكافئها في الد ال المدمجة في ‪ VBA‬مثل دالة ‪ Now‬على سبيل المثال)‪.‬‬
‫الستخدام د ال رقة العمل من الممكن استخدام الكائن ‪ WorksheetFunction‬الم ج د ضمن‬
‫كائن ‪ Application‬متب عا ً بدالة رقة العمل‪ .‬كمثال على استخدام د ال رقة العمل ‪ SUM‬انظر‬
‫الك د التالي الذي يق م بإيجاد اصل جمع خاليا النطاق ‪.A1:A10‬‬
‫))"‪total = Application.WorksheetFunction.Sum(Range("A1:A10‬‬
‫من الممكن ذف جزء ‪ Application‬أ جزء ‪ WorksheetFunction‬من السطر البرمجي‬
‫السابق ال ص ل على نفس النتيجة‪ .‬فالجمل الثالثة التالية تؤدي إلى نفس النتيجة‪:‬‬

‫‪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
‫الفصل الثامن‬

‫في هذه اإلجرائية يق م السطر‬


‫))"‪TheMax = WorksheetFunction.Max(Range("A1:A10‬‬
‫بإيجاد القيمة القص ى تخزين الناتج في المتغير ‪ .TheMax‬بينما يق م السطر‬
‫‪MsgBox "Minimum number in the range is " & TheMin‬‬
‫بإيجاد القيمة الدنيا تخزين الناتج في المتغير ‪ .TheMin‬يق م السطر التالي بإيجاد ثاني أكبر قيمة‬
‫تخزين الناتج في المتغير ‪Second_Large‬‬
‫)‪Second_Large = WorksheetFunction.Large(Range("A1:A10"), 2‬‬
‫ار متتالية‪.‬‬ ‫من ثم تق م اإلجرائية بعرض النتائج من خالل ثالث مربعات‬
‫مثال على استخدام الدلة ‪VLOOKUP‬‬
‫هذا المثال يفترض أن لديك جد ل باألصناف ي ت ي على اسم الصنف السعر‪ .‬تأخذ اإلجرائية‬
‫التالية رقم المنتج عن طريق مربع ادخال ‪ InputBox‬من ثم تق م بالب ث عن السعر الم افق لذلك‬
‫المنتج عن طريق دالة رقة العمل ‪ VLOOKUP‬ترجع النتيجة من خالل مربع ار ‪.MsgBox‬‬
‫)(‪Sub ShowPrice‬‬
‫‪Dim PartNo As Variant‬‬
‫‪Dim price As Double‬‬
‫)"‪PartNo = InputBox("Enter the part number to get its price‬‬
‫‪Sheets("Prices").Activate‬‬
‫)‪price = WorksheetFunction.VLookup(PartNo, Range("A1:B10"), 2, False‬‬
‫‪MsgBox price‬‬
‫‪End Sub‬‬

‫‪110‬‬
‫الد ال‬

‫تعمل هذه اإلجرائية كالتالي‪:‬‬


‫‪ -1‬تطلب من المستخدم ادخال رقم الصنف من خالل مربع ادخال عن طريق السطر البرمجي‬
‫التالي‪:‬‬

‫)"‪PartNo = InputBox("Enter the part number to get its price‬‬


‫‪ -2‬تتأكد اإلجرائية من أن رقة العمل الفعالة هي ال رقة التي ت ت ي عل جد ل األسعار ( هي‬
‫رقة ‪ )Prices‬من خالل السطر البرمجي التالي‪:‬‬

‫‪Sheets("Prices").Activate‬‬
‫‪ -3‬تق م اإلجرائية باستخدام دالة رقة العمل ‪ VLOOKUP‬للب ث عن سعر الصنف بداللة رقمه‬
‫الذي تم ال ص ل عليه من الخط ة رقم ‪ 1‬من خالل السطر التالي‪:‬‬

‫)‪price = WorksheetFunction. VLookup(PartNo, Range("A1:B10"), 2, False‬‬


‫ار‪.‬‬ ‫‪ -4‬تق م اإلجرائية بعرض السعر من خالل مربع‬

‫‪111‬‬
‫الفصل الثامن‬

‫‪112‬‬
‫التعامل مع األخطاء‬

‫الفصل التاسع‬

‫‪ .9‬التعامل مع األخطاء في ‪VBA‬‬

‫األخطاء من األم ر الشائعة جدا ً عند التعامل مع ‪ ،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‬متب عة‬
‫باسم التسمية التي س ف يستمر البرنامج من بعدها عند د ث خطأ ما‪.‬‬

‫جملة ‪Exit Sub‬‬


‫ال ظ أنه في هذا المثال أننا استخدمنا الجملة ُ ‪ Exit Sub‬قبل التسمية ‪ bad_entry‬مباشرة‪ ،‬يث أن‬
‫هذا األمر يعمل على الخر ج من البرنامج عند ال ص ل لتلك النقطة (بمعنى أدق‪ ،‬إذا اشتغل البرنامج‬
‫بد ن أي أخطاء فإنه سيتم الخر ج من البرنامج قبل التسمية ‪ bad_entry‬إال فإن رسالة الخطأ‬
‫ستظهر على الرغم من أنه ال ت جد أية أخطاء في هذه ال الة‪).‬‬
‫جملة ‪On Error Resume Next‬‬
‫تق م هذه الجملة بتجاهل الخطأ‪ ،‬االستمرار بعد الجملة التي ظهر بها الخطأ‪ .‬في المثال التالي ت ا ل‬
‫الجملة ( ‪ ) x = 20 / i‬اجراء عملية غير شرعية هي القسمة على صفر‪ ،‬إال أن ضع جملة ‪On‬‬
‫‪ Error Resume Next‬في بداية اإلجرائية ال د ن ظه ر الخطأ التشغيلي‪ .‬فهنا البرنامج تجا ز‬
‫الجملة المسببة للخطأ كأنها لم تكن أكمل من بعدها (جملة "‪)MsgBox "This is a test‬‬

‫)(‪Sub test‬‬
‫‪On Error Resume Next‬‬
‫‪Dim i As Integer‬‬
‫‪i=0‬‬
‫‪x = 20 / i‬‬
‫"‪MsgBox "This is a test‬‬
‫‪End Sub‬‬

‫‪118‬‬
‫التعامل مع األخطاء‬

‫جملة ‪Resume Label‬‬


‫تق م هذه الجملة بإلغاء الة الخطأ ‪ Error condition‬من ثم االستمرار في البرنامج من عند‬
‫التسمية ‪ Label‬الم ج دة في الجملة‪ .‬كمثال على ذلك‪ ،‬انظر اإلجرائية التالية ( هي نفس اإلجرائية‬
‫الخاصة بالجذر التربيعي مع جملة ‪ On Error GoTo‬جملة ‪.)Resume Label‬‬
‫في هذه اإلجرائية تم ضع تسمية ‪ Label‬في بداية البرنامج بإسم ‪ .try_again‬في نهاية اإلجرائية‬
‫تم عرض رسالة الخطأ مع أزرار ‪ Yes, No‬استخدمنا الجملة الشرطية ‪ If‬إلخبار البرنامج بأن‬
‫يستمر من عند التسمية ‪ try_again‬في ال ضغط المستخدم على زر ‪ Yes‬من خالل السطر‬
‫البرمجي‪:‬‬
‫‪If ans = vbYes Then Resume try_again‬‬

‫)(‪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‬‬

‫إزالة الشوائب من البرامج ‪Debugging Techniques‬‬


‫الش ائب ‪ Bugs‬ه مصطلح يشير إلى المشاكل التي تظهر في البرامج‪ .‬بمعني أدق‪ ،‬إذا لم يعمل‬
‫البرنامج كما يجب س اء أكانت النتائج التي يخرجها غير منطقية مثل أن تك ن النتائج الرقمية صغيرة‬
‫جدا ً أ كبيرة جدا ً أ إذا كان البرنامج يخرج رسائل خطأ عند تنفيذ عمليات م ددة أ غيرها من‬
‫األخطاء‪ ،‬يقال أن هذا البرنامج به شائبة ‪ .Bug‬ال قيقة أن معظم البرامج ‪ -‬بما فيها البرامج التي‬
‫تنتجها شركات كبيرة مثل مايكر س فت – ت ت ي على ش ائب‪ .‬فالش ائب هي من األم ر ال اردة جدا ً‬
‫عند كتابة البرامج‪ .‬في هذا الفصل س ف نتعرف على أهم الطرق التي يمكن استخدامها الكتشاف‬
‫الش ائب م اضع الخلل في البرامج ‪.Debugging‬‬

‫استخدام مربع الحوار ‪ Message Box‬الكتشاف األخطاء‬


‫من األخطاء الشائعة في البرمجة‪ ،‬أن تظهر قيمة متغير ما بشكل غير المت قع كأن تك ن كبيرة جدا ً أ‬
‫صغيرة جداً‪ .‬من الممكن في هذه ال الة استخدام مربعات ال ار الكتشاف مكمن الخطأ‪.‬‬
‫من خالل هذا التكنيك يتم ادراج مربعات ار في أماكن م ددة بداخل الك د لتعرض قيمة المتغير‬
‫عند كل مكان‪ ،‬ب يث تتم متابعة تغير قيمة المتغير أ الً بأ ل‪ ،‬مما قد يساعد في اكتشاف النقطة التي‬
‫بدأ عندها الخلل‪.‬‬
‫كمثال على ذلك‪ ،‬انظر البرنامج التالي – ه برنامج بسيط ليس له أي فائدة عملية باستثناء ت ضيح‬
‫الفكرة – تق م فكرة البرنامج على أخذ قيمتين من المستخدم ‪ ، a i‬اذا كانت قيمة ‪ a‬أقل من ‪ 1‬يتم‬

‫‪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
‫التعامل مع األخطاء‬

‫‪MsgBox msg & "Value of a: " & a‬‬


‫‪End Sub‬‬

‫‪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
‫التعامل مع األخطاء‬

‫استخدام جملة ‪ Debug.Print‬في تتبع األخطاء‬


‫من الممكن استخدام ‪ Debug.Print‬كبديل لمربع ال ار يث أن هذه الجملة تق م بعرض القيم لكن‬
‫في نافذة التنفيذ الف ري ‪ Immediate Window‬التي يجب اظهارها إذا أردت استخدام هذا التكنيك‬
‫من خالل استخدام االختصار ‪.Ctrl + G‬‬
‫في الك د التالي تم استخدام ‪ Debug.Print‬كبديل عن مربعات ال ار التي استخدمت في المثال‬
‫السابق‪ .‬في الشكل‪ 9-4‬يظهر لنا كيف تظهر القيم في نافذة التنفيذ الف ري‪.‬‬

‫)(‪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‬‬

‫استخدام ‪VBA Debugger‬‬


‫يقدم االكسيل مجم عة من األد ات الت تساعد في عملية اكتشاف تنقيح األخطاء من خالل ما يعرف‬
‫بـ ‪ .VBA Debugger‬هذه األد ات تقدم لنا طرقا ً أكثر ق ة في اكتشاف األخطاء من ال سيلتين اللتين‬
‫تم التطرق لهما سابقا ً (مربعات ال ار ‪ .)Debug.Print‬تاليا ً س ف نتطرق لتلك األد ات تباعاً‪.‬‬
‫نقاط التوقف ‪Breakpoints‬‬
‫تسمح لك نقاط الت قف بإيقاف تنفيذ البرنامج عند نقاط م ددة من ثم النظر عن كثب تدقيق البرنامج‬
‫ب ثا ً عن األخطاء‪ .‬عندما يصل البرنامج إلى نقطة الت قف ‪ Breakpoint‬يدخل البرنامج في ط ر‬
‫الت قف ‪ .Break‬عندما يك ن البرنامج في هذه ال الة يمكنك اجراء عمليات التدقيق التالية‪:‬‬
‫‪ -‬تنفيذ أ امر ‪ VBA‬في نافذة التنفيذ الف رية (سيتم التطرق لهذا الم ض ع ال قاً)‬
‫‪ -‬االستمرار بتنفيذ الك د سطرا ً بسطر يث أن الضغط على زر ‪ F8‬البرنامج في الة الت قف‬
‫يسمح لك بتنفيذ سطرا ً برمجيا ً ا دا ً في كل مرة‪.‬‬

‫‪126‬‬
‫التعامل مع األخطاء‬

‫‪ -‬معرفة قيم المتغيرات بص رة سهلة سريعة من خالل الت رك بمؤشر الما س ف ق المتغير‪،‬‬
‫فيتم عرض قيمة المتغير في نافة صغيرة‪.‬‬
‫‪ -‬ت رير تعديل الك د من ثم االستمرار في التنفيذ‪.‬‬
‫‪ -‬تجا ز تنفيذ بعض األسطر االنتقال مباشرة إلى السطر المطل ب (من الممكن السير في هذه‬
‫العملية لألمام للخلف)‬
‫ادراج نقاط التوقف‬
‫يمكن ادراج نقاط الت قف باستخدام أي من الطرق التالية‪:‬‬
‫‪ -‬من خالل النقر بزر الما س األيمن ف ق السطر الذي نريد ادراج نقطة الت قف عنده‪ ،‬ثم‬
‫اختيار ‪ Toggle‬ثم ‪Breakpoint‬‬
‫‪ -‬من خالل النقر بزر الما س األيسر على المنطقة الرمادية الم ج دة على يسار السطر الذي‬
‫نريد ادراج نقطة الت قف عنده‪.‬‬
‫‪ -‬من خالل ضع مؤشر الما س في السطر المطل ب‪ ،‬من ثم الضغط على ‪.F9‬‬
‫عند ادراج نقطة ت قف عند سطر ما‪ ،‬يتم تل ين ذلك السطر بالل ن األ مر‪ ،‬ت ُ ضع نقطة مراء في‬
‫الهامش الرمادي الم ج د يسار الك د‪ ،‬مقابل السطر المطل ب‪.‬‬

‫‪Figure9-5‬‬

‫إلزالة نقطة ت قف‪ ،‬انقر بزر الما س األيسر ف ق النقطة ال مراء الم ج دة على يسار السطر‪.‬‬

‫‪127‬‬
‫الفصل التاسع‬

‫عند تشغيل برنامج ي ت ي على نقطة ت قف‪ ،‬فإن تنفيذ البرنامج يت قف قبل السطر الذي ي ت ي على‬
‫نقطة لت قف‪ ،‬يتم تظليل السطر بالل ن األصفر يظهر سهم أصفر على يسار السطر‪ ،‬تظهر كلمة‬
‫‪ Break‬في أعلى النافذة‪.‬‬

‫‪Figure9-6‬‬

‫بعد أن يدخل البرنامج في ضع اإليقاف‪:‬‬


‫ت رك بمؤشر الما س ف ق المتغيرات إلظهار قيمها ال الية‪.‬‬ ‫‪-‬‬
‫أ اضغط على زر )‪ Continue (F5‬لالستمرار في تنفيذ البرنامج‪.‬‬ ‫‪-‬‬
‫لتنفيذ البرنامج سطرا ً بسطر اضغط على ‪.F8‬‬ ‫‪-‬‬
‫لتجا ز سطر أ أكثر‪ ،‬انقر ف ق السهم األصفر بزر الما س األيسر باستمرار الضغط رك‬ ‫‪-‬‬
‫السهم للمكان الذي تريد االستمرار من عنده‪.‬‬

‫من الممكن استخدام الكلمة المفتا ية ‪ Stop‬إلدراج نقطة ت قف‪ ،‬يث تُكتب هذه الجملة قبل‬
‫السطر الذي تريد ادراج نقطة الت قف عنده مباشرة‪.‬‬

‫نافذة التنفيذ الفوري ‪Immediate Window‬‬


‫من خالل نافذة التنفيذ الف ري‪ ،‬يمكن تنفيذ أي أمر من أ امر ‪ VBA‬الصال ة‪ .‬تظهر هذه النافذة عادة‬
‫في أسفل م رر الك د‪ ،‬إذا لم تكن هذه النافذة ظاهرة فيمكن اظهارها من خالل االختصار ‪.Ctrl + G‬‬

‫‪128‬‬
‫التعامل مع األخطاء‬

‫لتنفيذ أي أمر في نافذة التنفيذ الف ري يجب كتابة كلمة ‪ Print‬قبل األمر (يمكن االستعاضة بـ ؟ بدالً‬
‫من ‪ .)Print‬على سبيل المثال لعرض قيمة المتغير ‪ i‬نستخدم‪( Print i :‬أ ببساطة ‪ .) ? i‬انظر‬
‫الشكل‪9-7‬‬

‫‪Figure9-7‬‬

‫استخدام نافذة المراقبة ‪Watch Window‬‬


‫تتيح لك نافذة المراقبة معرفة قيمة متغير ما أ مجم عة من المتغيرات عند ت قق شرط معين‪ .‬فمثالً‬
‫في الك د التالي‪ ،‬إذا أردت معرفة قيم المتغير ‪ x‬عند ص ل قيمة ‪ i‬لـ ‪ ،500‬فيمكنك استخدام نافذة‬
‫المراقبة من خالل الذهاب إلى قائمة ‪ Debug‬ثم اختيار ‪.Add Watch‬‬
‫)(‪Sub test‬‬
‫‪Dim i As Double‬‬
‫‪For i = 1 To 1000‬‬
‫‪x = i + (i - 1) ^ 2‬‬

‫‪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‬‬
‫الفصل التاسع‬

‫استخدام نافذة ‪Locals Window‬‬


‫تق م نافذة ‪ Locals‬بعرض قيم جميع المتغيرات ال اقعة ضمن اإلجرائية ال الية‪ ،‬ذلك عند دخ ل‬
‫البرنامج ط ر اإليقاف ‪ .Breakpoint‬يتم ادراج هذه النافذة من خالل الذهاب لقائمة ‪ View‬ثم‬
‫‪.Locals Window‬‬

‫‪Figure9-10‬‬

‫تلميحات لتقليل األخطاء البرمجية‬


‫ا ل أن تستخدم الخيار ‪ Option Explicit‬في بداية البرامج دائما‪ .‬استخدام هذا الخيار يقلل‬ ‫‪-1‬‬
‫من ا تمالية د ث أخطاء بسبب خطأ مطبعي قي كتابة اسم متغير ما‪.‬‬
‫استخدم الكثير من التعليقات‪ .‬ج د التعليقات يساعدك في فهم الك د عند الرج ع له بعد فترة‬ ‫‪-2‬‬
‫من كتابة البرنامج‪ .‬يساعد أيضا ً من يريد العمل على البرنامج من بعدك‪.‬‬
‫كن ذرا ً عند استخدام جملة ‪ .On Error Resume‬ج د هذه الجملة يجعل البرنامج‬ ‫‪-3‬‬
‫يتجا ز الخطأ بد ن أن يعطيك فرصة لمال ظة الخطأ‪ .‬لذلك عند استخدام هذه الجملة تأكد مما‬
‫تريده جيداً‪.‬‬
‫نسق الك د بشكل اضح عن طريق م اذاة كل مجم عة من الجمل ذات العالقة مع بعضها‬ ‫‪-4‬‬
‫البعض (ال ظ كيف تمت م اذاة األ امر في الشكل ‪)9-11‬‬

‫‪132‬‬
‫التعامل مع األخطاء‬

‫‪ -5‬أبق على ك دك سهالً قدر اإلمكان اسلك د ما ً أقصر الطرق‪.‬‬

‫‪Figure9-11‬‬

‫‪133‬‬
‫الفصل التاسع‬

‫‪134‬‬
‫األ داث‬

‫الفصل العاشر‬

‫‪ .10‬األحداث ‪Events‬‬

‫ا دى طرق تنفيذ االجرائيات هي تنفيذها تلقائيا ً عند د ث دث معين‪ .‬ال دث ‪ ،Event‬ه ببساطة‬
‫عبارة عن شيء دث لالكسيل‪ .‬بعض األ داث هي كما يلي‪:‬‬
‫فتح مصنف جديد‬ ‫‪-‬‬
‫فظ المصنف‬ ‫‪-‬‬
‫اغالق المصنف‬ ‫‪-‬‬
‫ادراج أ ذف رقة عمل‬ ‫‪-‬‬
‫التعديل على رقة عمل‬ ‫‪-‬‬
‫طباعة رقة عمل‬ ‫‪-‬‬
‫دخ ل قت معين‬ ‫‪-‬‬
‫د ث خطأ معين‬ ‫‪-‬‬
‫في هذا الفصل س ف نتعرف على األ داث ‪ Events‬األكثر شي عا ً في االكسيل كيفية االستفادة منها‬
‫في تنفيذ االجرائيات‪ .‬في الجد لين التاليين قائمة باأل داث األكثر شي عاً‪ .‬بالطبع هناك أ داث أكثر‬
‫بكثير‪ ،‬إذا كنت تريد معرفة القائمة الكاملة فيمكنك أن تب ث في نظام المساعدة الخاص بم رر األك اد‬
‫‪ VBE‬أ المساعدة عبر االنترنت‪.‬‬

‫‪135‬‬
‫الفصل العاشر‬

‫متى يتم تفعيله‬ ‫الحدث‬


‫عند تنشيط المصنف‬ ‫‪Activate‬‬
‫عند اغالق المصنف‬ ‫‪BeforeClose‬‬
‫عند طباعة المصنف‬ ‫‪BeforePrint‬‬
‫عند فظ المصنف‬ ‫‪BeforeSave‬‬
‫عند إزالة التنشيط عن المصنف‬ ‫‪Deactivate‬‬
‫عند إضافة رقة عمل جديدة للمصنف‬ ‫‪NewSheet‬‬
‫عند فتح المصنف‬ ‫‪Open‬‬
‫عند تنشيط رقة عمل في المصنف‬ ‫‪SheetActivate‬‬
‫عند النقر نقرا ً مزد جا ً على ا دى الخاليا في‬
‫‪SheetBeforeDoubleClick‬‬
‫رقة العمل‬
‫عند النقر بالزر األيمن على ا دى الخاليا في‬
‫‪SheetBeforeRightClick‬‬
‫رقة العمل‬
‫عند اجراء تغيير على ا دى الخاليا‬ ‫‪SheetChange‬‬
‫عند الغاء التنشيط عن ا دى أ راق العمل‬ ‫‪SheetDeactivate‬‬
‫‪ SheetSelectionChange‬عند اجراء تغيير على الت ديد‬

‫متى يتم تفعيله‬ ‫الحدث‬


‫عند تنشيط رقة عمل‬ ‫‪Activate‬‬
‫عند النقر المزد ج على ا دى الخاليا في رقة‬
‫‪ BeforeDoubleClick‬عمل‬
‫عند النقر بالزر األيمن على ا دى الخاليا في رقة‬
‫عمل‬ ‫‪BeforeRightClick‬‬
‫عند اجراء تغيير على ا دى الخاليا‬ ‫‪Change‬‬
‫عند إزالة التنشيط عن رقة العمل‬ ‫‪Deactivate‬‬
‫‪ SelectionChange‬عند اجراء تعديل على الت ديد‬

‫‪136‬‬
‫األ داث‬

‫ما هو معالج‪-‬الحدث ‪Event-Handler‬‬


‫الك د الذي يتم تنفيذه كرد فعل على دث معين يسمى معالج ال دث ‪ .Event-Handler‬عادة يك ن‬
‫عبارة عن إجرائية فرعية ‪ Sub-Procedure‬ليس ‪.Function‬‬
‫لكتابة ‪ Event-Handler‬اتبع الخط ات التالية‪:‬‬
‫دد ال دث الذي تريد أن يتم تنفيذ الك د عند ت ققه‪.‬‬ ‫‪-‬‬
‫في م رر األك اد ‪ VBE‬اذهب إلى العنصر ‪ Object‬المناسب لل دث انقر عليه نقرا ً مزد جاً‪.‬‬ ‫‪-‬‬
‫تك ن العناصر ت ت ‪ .Microsoft Excel Objects‬لأل داث الخاصة بالمصنف انقر نقرا ً‬
‫مزد جا ً على ‪ ThisWorkbook‬أما بالنسبة لأل داث الخاصة بأ راق العمل فانقر نقرا ً مزد جا ً‬
‫على رقة العمل المطل بة (مثل ‪ Sheet1‬مثالً) هكذا‪.‬‬
‫في نافذة الك د الخاصة بالعنصر‪ ،‬اكتب معالج‪-‬ال دث المطل ب‪ .‬في أعلى نافذة الك د هنا قائمتان‬ ‫‪-‬‬
‫منسدلتان‪:‬‬
‫‪ o‬قائمة العنصر ‪Object drop-down list‬‬
‫‪ o‬قائمة اإلجرائية ‪Procedure drop-down list‬‬
‫إذا كنت تريد كتابة ‪ Event-Handler‬للعنصر ‪ ، ThisWorkbook‬انقر نقرا ً مزد جا ً ف ق‬ ‫‪-‬‬
‫‪ ،ThisWorkbook‬ثم من نافذة الك د اختر ‪ Workbook‬من القائمة المنسدلة ‪Object‬‬
‫‪.drop-down list‬‬
‫بالمثل إذا كنت تريد كتابة ‪ Event-Handler‬ل رقة عمل ‪ ،Sheet‬انقر نقرا ً مزد جا ً ف ق‬ ‫‪-‬‬
‫رقة العمل المطل بة ثم من نافذة الك د اختر ‪ Worksheet‬من القائمة المنسدلة ‪Object‬‬
‫‪drop-down list‬‬
‫اختر ال دث المطل ب من قائمة ‪ .Procedure drop-down list‬الشكل ‪ 10-1‬يعرض بعض‬ ‫‪-‬‬
‫األ داث المتا ة ل رقة العمل‪.‬‬
‫عند اختيار ال دث من القائمة المنسدلة يق م ‪ VBE‬تلقائيا ً بإدراج إجرائية معالجة ال دث ‪Event-‬‬ ‫‪-‬‬
‫‪ Handler procedure‬لل دث المطل ب‪.‬‬
‫أدخل الك د المطل ب في إجرائية معالجة ال دث التي تم فت ها في الخط ة السابقة‪.‬‬ ‫‪-‬‬
‫مالحظة‬
‫عند اختيار ‪ Workbook‬من القائمة المنسدلة ‪ Object drop-list‬فإن االكسيل يفترض أن إجرائية الـ‬
‫‪ Event-Handler‬هي لل دث ‪ Open‬بالتالي يفتح اإلجرائية ‪ Workbook_Open‬هذا جيد اذا‬

‫‪137‬‬
‫الفصل العاشر‬

‫كنت فعالً تريد استخدام هذا ال دث‪ .‬أما إذا لم يكن هذا ال دث المطل ب فعليك ذف إجرائية‬
‫‪ .Workbook_Open‬بالمثل اذا اخترت ‪ Worksheet‬من القائمة ‪ Object‬فإن إجرائية معالجة‬
‫ال دث االفتراضية س ف تك ن ‪ Worksheet_SelectionChange‬فإذا لم تكن ب اجة لها فقم‬
‫ب ذفها‪.‬‬

‫‪Figure10-1‬‬

‫يجب أن ي ضع كل ‪ Event-Handler‬في مكانه الص يح‪ ،‬فإذا تم مثالً كتابة معالج دث خاص‬
‫ب رقة العمل في نافذة الك د الخاصة بالمصنف فلن يعمل‪.‬‬

‫‪138‬‬
‫األ داث‬

‫أمثلة على استخدام األحداث لتنفيذ أوامر ‪VBA‬‬


‫فيما يلي مجم عة من األمثلة على أتمتة تنفيذ االجرائيات من خالل األ داث‪ .‬س اء أكانت أ داث متعلقة‬
‫بالمصنف أ ب رقة العمل‪.‬‬
‫أمثلة على أحداث المصنف ‪Workbook Events‬‬
‫الحدث ‪Open Workbook‬‬
‫في هذا المثال مطل ب كتابة ‪ Event-Handler‬يق م بعرض رسالة تذكيرية كل ي م ثالثاء عند فتح‬
‫ملف االكسيل الم دد‪ .‬لكتابة معالج ال دث هذا اتبع الخط ات التالية‪:‬‬
‫‪ -1‬انقر نقرا ً مزد جا ً ف ق ‪ ThisWorkbook‬الم ج د ضمن مستكشف المشاريع على اليسار‪،‬‬
‫لعرض نافذة الك د الخاصة بالمصنف‪.‬‬
‫‪ -2‬من نافذة الك د‪ ،‬اختر ‪ Workbook‬من القائمة المنسدلة ‪Object drop-down list‬‬
‫‪ Workbook_Open‬من القائمة المنسدلة ‪.Procedure drop-down list‬‬
‫‪ -3‬اكتب الك د التالي في اإلجرائية التي فت ها باسم ‪.Workbook_Open‬‬

‫)(‪Private Sub Workbook_Open‬‬


‫‪If Weekday(Now) = 3 Then‬‬
‫"‪MsgBox "Today is Tuseday, Don't forget to submit sales report‬‬
‫‪End If‬‬
‫‪End Sub‬‬

‫في النهاية سيظهر الك د كما في الشكل ‪10-2‬‬

‫‪139‬‬
‫الفصل العاشر‬

‫‪Figure10-2‬‬

‫الحدث ‪Before Close‬‬


‫الك د التالي يق م بف ص المصنف قبل اغالقه‪ ،‬إذا كانت هناك تعديالت على المصنف بد ن أن يك ن‬
‫قد تم فظ المصنف‪ ،‬فإن معالج ال دث هذا يق م ب فظ المصنف بد ن اظهار أية رسائل‪( .‬ذلك يلغي‬
‫السل ك االفتراضي لالكسيل الذي يق م بعرض رسالة تفيد بأن هناك تعديالت لم يتم فظها‪ ،‬هل ترغب‬
‫بال فظ أم ال؟)‬
‫انقر نقرا ً مزد جا ً ف ق ‪ ThisWorkbook‬ثم من نافذة الك د اختر ‪ Workbook‬من قائمة ‪Object‬‬
‫‪ Workbook_BeforeClose‬من نافذة ‪ .Procedure‬في اإلجرائية ‪Workbook_BeforeClose‬‬
‫اكتب التالي‪:‬‬

‫)‪Private Sub Workbook_BeforeClose(Cancel As Boolean‬‬


‫‪If ThisWorkbook.Saved = False Then ThisWorkbook.Save‬‬
‫‪End Sub‬‬

‫‪140‬‬
‫األ داث‬

‫ال ظ أنك من الممكن أن تكب جملة ‪ If‬بالشكل التالي اختصارا ً يث تم استبدال ‪ ThisWorkbook‬بـ‬
‫‪:Me‬‬
‫‪If Me.Saved = False Then Me.Save‬‬

‫مثال على الحدث ‪Activate‬‬


‫ال دث ‪ Activate‬ي صل عند تنشيط المصنف‪ .‬تق م اإلجرائية التالية بتكبير نافذة المصنف عرض‬
‫رسالة ت ت ي على اسم المصنف‪ .‬هذا األمر مفيد إذا كنت تعمل على عدد كبير من المصنفات المفت ة‬
‫كنت تخاف أن تختلط عليك األم ر فتجري تعديالً على المصنف الخطأ‪.‬‬
‫)(‪Private Sub Workbook_Activate‬‬
‫‪ActiveWindow.WindowState = xlMaximized‬‬
‫‪MsgBox Me.Name‬‬
‫‪End Sub‬‬
‫الحدث ‪Deactivate‬‬
‫ال دث ‪ Deactivate‬ي صل عند الغاء التنشيط عن المصنف‪ .‬إجرائية معالجة ال دث التالية هي مثال‬
‫على استخدام ال دث ‪ .Deactivate‬تق م هذه االجرائية بنسخ النطاق الم دد ضعه في ال افظة ذلك‬
‫عند الغاء التنشيط عن المصنف‪ .‬هذا األمر مفيد إذا كان لديك مصنف تريد أن تنسخ مجم عة من‬
‫النطاقات من أ راق العمل بداخله إلى مصنفات أخرى يث أن تلك اإلجرائية تسهل األمر عليك فبدالً‬
‫من ت ديد النطاق ثم اختيار األمر نسخ ‪ Copy‬فيكفي اختيار النطاق فقط ثم الذهاب للمصنف الهدف‬
‫اجراء عملية اللصق‪.‬‬
‫)(‪Private Sub Workbook_Deactivate‬‬
‫‪ThisWorkbook.Windows(1).RangeSelection.Copy‬‬
‫‪End Sub‬‬

‫‪141‬‬
‫الفصل العاشر‬

New Sheet ‫مثال على الحدث‬


‫ ضمن النطاق‬Sheet1 ‫اإلجرائية التالية تق م بنسخ تر يسة رقة العمل الم ج دة في رقة العمل‬
.‫ إلى أي رقة عمل جديدة‬A1:I1
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sheets("sheet1").Range("A1:I1").Copy
Sh.Paste
End Sub

Before Save ‫مثال على الحدث‬


‫ من رقة‬A1 ‫اإلجرائية التالية تق م بتسجيل قت تاريخ آخر مرة تم فيها فظ المصنف في الخلية‬
.Sheet1 ‫العمل‬

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _


Cancel As Boolean)
Worksheets("Sheet1").Range("A1") = Format(Now, _
"dd-mm-yyyy hh:mm:ss")
End Sub

142
‫األ داث‬

‫بعض األمثلة على أحداث أوراق العمل ‪Worksheets Events‬‬


‫الحدث ‪Activate‬‬
‫ي ص هذا ال دث عند تنشيط رقة العمل‪ .‬كمثال تق م إجرائية معالجة ال دث التالية بتنشيط الخلية ‪A1‬‬
‫ل رقة العمل الم ددة في كل مرة يتم فيها تنشيط رقة العمل‪.‬‬
‫لكتابة هذه اإلجرائية (أ أي إجرائية أخري تتعامل مع أ داث رقة العمل) اتبع اإلجراءات التالية‪:‬‬
‫‪ -1‬انقر نقرا ً مزد جا ً على رقة العمل المطل بة من مستكشف المشاريع‬
‫‪ -2‬من نافذة الك د اختر ‪ Worksheet‬من القائمة المنسدلة ‪Object drop-down list‬‬
‫‪ Worksheet_Activate‬من ‪.Procedure drop-down list‬‬
‫‪ -3‬أدخل الك د كما باألسفل‪.‬‬

‫)(‪Private Sub Worksheet_Activate‬‬


‫‪Range("A1").Activate‬‬
‫‪End Sub‬‬

‫الحدث ‪Deactivate‬‬
‫ي صل هذا ال دث عند الغاء التنشيط عن رقة العمل‪ .‬كمثال يق م الك د باألسفل بف ص م ت يات‬
‫الخلية ‪ A1‬عند الغاء التنشيط عن رقة العمل ‪ ،Sheet1‬فإذا كانت فارغة يعرض رسالة خطأ تذكر‬
‫المستخدم بأن يدخل قيمة في تلك الخلية يمنع المستخدم من االنتقال ل رقة عمل أخرى قبل ادخال قيمة‬
‫في الخلية ‪ A1‬في ال رقة ‪.Sheet1‬‬

‫)(‪Private Sub Worksheet_Deactivate‬‬


‫‪If Len(Me.Range("A1").Value) = 0 Then‬‬
‫" ‪MsgBox "Reminder!! Please enter a value in A1‬‬

‫‪143‬‬
‫الفصل العاشر‬

Sheets("sheet1").Activate
End If
End Sub

Select Change ‫الحدث‬


‫ كمثال على هذا ال دث تق م اإلجرائية‬.‫ عند تغير الخاليا الم ددة‬Select_Change ‫ي صل ال دث‬
‫ يك ن نتيجة تنفيذ هذه اإلجرائية‬.‫باألسفل بتل ين صف عم د الخلية النشطة لتسهيل عملية قراءة البيانات‬
.10-3 ‫كما في الشكل‬

Private Sub Worksheet_SelectionChange(ByVal Target As Range)


Cells.Interior.ColorIndex = xlNone
With ActiveCell
.EntireRow.Interior.Color = RGB(248, 203, 173)
.EntireColumn.Interior.Color = RGB(180, 198, 231)
End With
End Sub
:‫تبدأ اإلجرائية بإزالة الل ن عن كافة خاليا رقة العمل من خالل السطر‬
Cells.Interior.ColorIndex = xlNone

:Command Block ‫ثم تق م بتل ين صف عم د الخلية النشطة من خالل كتلة األ امر‬

144
‫األ داث‬

With ActiveCell
.EntireRow.Interior.Color = RGB(248, 203, 173)
.EntireColumn.Interior.Color = RGB(180, 198, 231)
End With

Figure10-3

145
‫الفصل العاشر‬

‫الحدث ‪Worksheet Calculate‬‬


‫ي صل هذا ال دث عند اجراء ا تساب ل رقة العمل ‪ Worksheet Calulate‬س ا ًء أكان اال تساب‬
‫تلقائيا ً أ يد ياً‪ .‬في الك د باألسفل يتم عمل ا ت اء تلقائي لألعمدة ‪ A:F‬في كل مرة يتم فيها إعادة ا تساب‬
‫رقة العمل‪.‬‬
‫)(‪Private Sub Worksheet_Calculate‬‬
‫‪Columns("A:F").AutoFit‬‬
‫‪End Sub‬‬

‫الحدث ‪Worksheet Change‬‬


‫ي صل هذا ال دث عند د ث تغيير على خاليا رقة العمل‪ .‬كمثال على استخدام هذا ال دث؛ تق م‬
‫اإلجرائية باألسفل بإدراج قت تاريخ تعديل أي خلية من خاليا العم د ‪ B‬ذلك في الخلية المجا رة‬
‫(التي تقع في العم د ‪)C‬‬

‫)‪Private Sub Worksheet_Change(ByVal Target As Range‬‬


‫‪If Target.Column <> 2 Then Exit Sub‬‬
‫)"‪Target.Offset(0, 1).Value = Format(Now, "MM / DD / YYYY hh:mm‬‬
‫‪End Sub‬‬

‫االنتقال إلى الكود الخاص بورقة عمل من خالل اكسيل‬


‫لالنتقال بشكل مباشر إلى الك د الخاص ب رقة عمل معينة من خالل االكسيل ( ليس ‪ )VBE‬انقر بزر‬
‫الما س األيمن ف ق رقة العمل ثم اختر ‪ View Code‬كما في الشكل ‪10-4‬‬

‫‪146‬‬
‫األ داث‬

Figure10-4

147
‫الفص ال ادي عشر‬

‫‪148‬‬
‫التفاعل مع المستخدم‬

‫الفصل الحادي عشر‬

‫‪ .11‬التفاعل مع المستخدم من خالل مربعات‬


‫الحوار‬

‫في هذا الفصل سيتم التعرض ل االت مختلفة لكل من دالة ‪ MsgBox‬التي تق م بعرض البيانات ضمن‬
‫مربع ار مع إمكانية أخذ تغذية راجعة من المستخدم‪ ،‬دالة ‪ InputBox‬التي تستخدم إلدخال البيانات‬
‫من خالل مربع ار‪ .‬إضافة إلى ذلك فسيتم التطرق لدالة ‪ Application.InputBox‬التي تُستخدم‬
‫إلدخال أشياء مثل المعادالت أ مراجع النطاقات‪.‬‬
‫الدالة ‪MsgBox‬‬
‫تق م الدالة ‪ MsgBox‬بعرض مربع ار بسيط يمكن استخدامه لعرض معل مات للمستخدم أ أخذ‬
‫تغذية راجعة منه مثل أن يضغط المستخدم على زر م افق أ الغاء األمر‪.‬‬
‫تأخذ هذه الدالة الشكل التالي‪:‬‬
‫)]‪MsgBox(prompt[, buttons][, title‬‬
‫يث أن‪:‬‬
‫‪ :Prompt -‬عبارة عن نص الرسالة الذي س ف يظهر على مربع ال ار‪ .‬ه معامل اجباري‪.‬‬
‫‪ :Buttons -‬هذا المعامل ي ضح ن ع األزرار التي ترغب بإظهارها على مربع ال ار باإلضافة‬
‫إلى أنه يمكن استخدامه أيضا ً لعرض ا دى األيق نات التي قد تساعد في ت ضيح الهدف من‬
‫مربع ال ار (مثل أيق نة الت ذير أ اإلعالم)‪.‬‬

‫‪149‬‬
‫الفص ال ادي عشر‬

‫‪ :Title -‬عن ان مربع ال ار‪.‬‬

‫‪Figure11-1‬‬

‫عرض مربع حوار بسيط‬


‫المثال التالي يق م بعرض مربع ار بسيط يق م بعرض رسالة تطلب من المستخدم أن يضغط على‬
‫زر ‪ OK‬للبدء بطباعة نطاق البيانات المسمى ‪ .data‬ال ظ أن سير البرنامج يت قف ل ين االستجابة‬
‫لمربع ال ار‪.‬‬

‫)(‪Sub test‬‬
‫"‪MsgBox "Press OK to print data...‬‬
‫‪Range("data").PrintOut‬‬
‫‪End Sub‬‬

‫‪150‬‬
‫التفاعل مع المستخدم‬

‫‪Figure11-2‬‬

‫أخذ استجابة من مربع حوار‬


‫إذا كان مربع ال ار ي ت ي على ما ه اكثر من زر ‪ OK‬فيمكنك أن ت دد مسار البرنامج بنا ًء على‬
‫الزر الذي قام المستخدم بضغطه‪ .‬تق م اإلجرائية التالية بعرض مربع ار مع زري ‪Cancel OK‬‬
‫ب يث إذا تم الضغط على ‪ OK‬يتم طباعة البيانات أما إذا تم الضغط على ‪ Cancel‬فيتم الغاء العملية‬
‫يتم عرض رسالة تفيد باإللغاء‪.‬‬
‫)(‪Sub test_msgbox‬‬
‫‪Dim Ans As Integer‬‬
‫)‪Ans = MsgBox ("Do you want to print data", vbYesNo‬‬
‫‪Select Case Ans‬‬
‫‪Case vbYes‬‬
‫‪Sheets("sheet1").Range("data").PrintOut‬‬
‫‪Case vbNo‬‬
‫"‪MsgBox "Printing canceled‬‬
‫‪End Select‬‬
‫‪End Sub‬‬

‫‪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‬فقط‬ ‫‪0‬‬ ‫‪vbOKOnly‬‬
‫عرض زري ‪Cancle OK‬‬ ‫‪1‬‬ ‫‪vbOKCancel‬‬
‫عرض األزرار ‪Abort, Retry, and‬‬
‫‪Ignore‬‬ ‫‪2 vbAbortRetryIgnore‬‬
‫عرض األزرار ‪Yes, NO, and‬‬
‫‪Cancle‬‬ ‫‪3‬‬ ‫‪vbYesNoCancel‬‬
‫عرض زري ‪NO ،Yes‬‬ ‫‪4‬‬ ‫‪vbYesNo‬‬
‫عرض زري ‪Retry, Cancle‬‬ ‫‪5‬‬ ‫‪vbRetryCancel‬‬
‫عرض أيق نة الخطر ‪Critical‬‬ ‫‪16‬‬ ‫‪vbCritical‬‬
‫عرض أيق نة االستفهام ‪Query‬‬ ‫‪32‬‬ ‫‪vbQuestion‬‬
‫عرض أيق نة الت ذير ‪Warning‬‬ ‫‪48‬‬ ‫‪vbExclamation‬‬
‫عرض أيق نة المعل مات ‪Information‬‬ ‫‪64‬‬ ‫‪vbInformation‬‬
‫الزر األ ل ه الزر االفتراضي‬ ‫‪0‬‬ ‫‪vbDefaultButton1‬‬
‫الزر الثاني ه الزر االفتراضي‬ ‫‪256‬‬ ‫‪vbDefaultButton2‬‬
‫الزر الثالث ه الزر االفتراضي‬ ‫‪512‬‬ ‫‪vbDefaultButton3‬‬
‫الزر الرابع ه الزر االفتراضي‬ ‫‪768‬‬ ‫‪vbDefaultButton4‬‬

‫الستخدام أكثر من قيمة للمعامل مثل أن تعرض األزرار ‪ 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‬‬

‫مربع االدخال ‪InputBox‬‬


‫دالة ‪ InputBox‬هي من الد ال المفيدة التي يمكن استخدامها الستقبال ادخال معين من قبل المستخدم‪.‬‬
‫تأخذ الدالة الشكل العام التالي‪:‬‬
‫)]‪InputBox(prompt[, title][, default‬‬
‫يث أن‪:‬‬
‫‪ :Prompt -‬هي الرسالة التي س ف تظهر على مربع ال ار‪ .‬عادة ما ت ت ي على ت جيهات‬
‫للمستخدم ل طبيعة االدخال المت قع‪ .‬هي قيمة اجبارية‬
‫‪ :Title -‬عن ان مربع ال ار‪ .‬هي قيمة اختيارية‪.‬‬
‫‪ :Default -‬النص االفتراضي لإلدخال‪ .‬هي قيمة اختيارية‪.‬‬

‫مثال على دالة ‪InputBox‬‬


‫تستخدم اإلجرائية التالية دالة ‪ InputBox‬ألخذ االسم من المستخدم ثم تق م بعرض جملة تر يبية باسم‬
‫المستخدم من خالل مربع ‪.MsgBox‬‬
‫)(‪Sub test‬‬
‫‪Dim name As String‬‬

‫‪154‬‬
‫التفاعل مع المستخدم‬

‫)"‪name = InputBox("Please enter your name...", "Name‬‬


‫‪MsgBox "Helo " & name‬‬
‫‪End Sub‬‬

‫تم تعريف متغير من ن ع ‪ String‬باسم ‪ name‬لتخزين قيمة االدخال فيه‪ .‬عند تنفيذ اإلجرائية سيظهر‬
‫لنا مربع االدخال كما بالشكل ‪11-5‬‬

‫‪Figure11-5‬‬

‫إذا أدخلنا االسم ‪ Mohammed‬فإن البرنامج سيق م بعرض الرسالة التر يبية كما باألسفل‬

‫‪Figure11-6‬‬

‫‪155‬‬
‫الفص ال ادي عشر‬

‫الدالة ‪Application.InputBox method‬‬


‫ي جد لعنصر البرنامج ‪ Application object‬ظيفة ‪ Method‬تسمى ‪( InputBox‬بخالف الدالة‬
‫‪ )InputBox‬هي تظهر مربع ار شبيه بمربع ال ار الخاص بالدالة ‪ InputBox‬إال أنها أكثر‬
‫مر نة منها يث أنه من الممكن استخدام هذه الـ ‪ Method‬إلدخال أشياء مثل المصف فات أ المعادالت‬
‫إال أن أكثر فائدة لهذه الـ ‪ Method‬ه أنه يمكن استخدامها لت ديد نطاق من البيانات‪.‬‬
‫تأخذ هذه الـ ‪ Method‬الشكل العام التالي‪:‬‬
‫‪Application. InputBox (_Prompt_, _Title_, _Default_,‬‬
‫)_‪_Left_, _Top_, _HelpFile_, _HelpContextID_, _Type‬‬

‫الجد ل التالي ي ضح معامالت الدالة‪:‬‬

‫الوصف‬ ‫مطلوب‪ /‬اختياري‬ ‫االسم‬


‫الرسالة التي سوف تعرض على مربع الحوار‬ ‫مطل ب‬ ‫‪Prompt‬‬
‫عنوان مربع الحوار‬ ‫اختياري‬ ‫‪Title‬‬
‫القيمة االفتراضية‬ ‫اختياري‬ ‫‪Default‬‬
‫موقع مربع الحوار بالنسبة لشاشة االكسيل‬ ‫اختياري‬ ‫‪Left‬‬
‫موقع مربع الحوار بالنسبة لشاشة االكسيل‬ ‫اختياري‬ ‫‪Top‬‬

‫اسم ملف المساعدة‬ ‫اختياري‬ ‫‪HelpFile‬‬

‫الرقم المرجعي للعنوان الذي تريد مساعدة بالنسبة له‪.‬‬ ‫‪ HelpContextID‬اختياري‬


‫نوع البيانات المدخلة‪ .‬إذا لم يكن هذا الخيار موجودا ً‬
‫اختياري‬ ‫‪Type‬‬
‫فإن نوع البيانات االفتراضي هو نص ‪Text‬‬

‫‪156‬‬
‫التفاعل مع المستخدم‬

‫الجد ل التالي ي ضح القيم التي يمكن استخدامها مع المعامل ‪:Type‬‬

‫ما تعنيه‬ ‫القيمة‬


‫صيغة ‪Formula‬‬ ‫‪0‬‬
‫رقم‬ ‫‪1‬‬
‫نص‬ ‫‪2‬‬
‫قيمة منطقية ‪True or False‬‬ ‫‪4‬‬
‫مرجع خاليا (كعنصر نطاق ‪)Range object‬‬ ‫‪8‬‬
‫قيمة خطأ (مثل ‪)N/A#‬‬ ‫‪16‬‬
‫مصف فة‬ ‫‪64‬‬

‫مثال‬
‫يق م البرنامج باألسفل باستخدام ‪ 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‬‬

‫انشاء نموذج المستخدم‬


‫الخط ة األ لى في عملية انشاء نم ذج المستخدم ‪ UserForm‬هي ادراج نم ذج من خالل م رر‬
‫األك اد من خالل النقر بزر الما س األيمن على اسم المصنف الذي نريد انشاء النم ذج بداخله ثم اختيار‬
‫‪ Insert ➔ UserForm‬أ من خالل ت ديد اسم المصنف ثم الضغط على زر ‪Insert UserForm‬‬
‫على شريط األد ات‪.‬‬

‫‪159‬‬
‫الفصل الثاني عشر‬

‫‪Figure12-1‬‬

‫س ف يتم ادراج نم ذج ‪ Form‬كما في الشكل ‪ . 12-1‬بعد أن يتم ادراج النم ذج من الممكن أن تت كم‬
‫بخصائصه من خالل الجزء الخاص بخصائص النم ذج ‪ UserForm properties‬فمثال يمكن تغيير‬
‫ل ن الخلفية من خالل تعديل الخاصية ‪ BackColor‬يمكن تغيير عن ان النم ذج من خالل الخاصية‬
‫‪ .Caption‬يتم تعديل الخصائص من خالل الضغط على ال قل الم ج د على يمين اسم الخاصية فيتم‬
‫فتح قائمة منسدلة (في أغلب األ يان) نختار منها االعداد المطل ب‪ ،‬إذا لم تكن هناك قائمة منسدلة (كما‬
‫في خاصية اسم النم ذج) نكتب قيمة االعداد المطل ب‪ .‬اذا لم تكن نافذة الخصائص ظاهر فيمكن اظهارها‬
‫من خالل الذهاب إلى قائمة ‪ View‬ثم اختيار ‪.Properties Window‬‬

‫‪160‬‬
‫النماذج‬

Figure12-3

Figure12-2

161
‫الفصل الثاني عشر‬

‫إضافة عناصر تحكم للنموذج‬


‫عنصر الت كم ‪ Control‬ه عبارة عن عنصر ي ضع على النم ذج ( مثل األزرار أ مربع النص أ‬
‫الق ائم المنسدلة) يتم من خالله ادخال أ عرض البيانات‪ .‬يتم ادراج عناصر الت كم من خالل صند ق‬
‫األد ات ‪ Toolbox‬الذي يظهر عادة بمجرد ادراج النم ذج‪ .‬إذا لم يكن صند ق األد ات ظاهرا ً‬
‫فيمكن ادراجه من خالل الذهاب إلى قائمة ‪ View‬ثم اختيار ‪.Toolbox‬‬
‫إلضافة عنصر ت كم على النم ذج اختر العنصر المطل ب ثم أدرجه في المكان المطل ب على النم ذج‪.‬‬
‫يمكنك بعد ادراج عنصر الت كم‪ ،‬الت كم ب جمه أ مكانه باستخدام مهارات ال اس ب األساسية مثل‬
‫الس ب اإلفالت أ غيرها‪.‬‬

‫‪Figure12-4‬‬

‫‪162‬‬
‫النماذج‬

‫ظيفة كل منها‬ ‫الجد ل التالي ي ضح عناصر الت كم الشائعة‬

‫ظيفته‬ ‫عنصر الت كم‬


‫الظهار نص‪.‬‬ ‫التسمية الت ضي ية ‪Label‬‬
‫الدخال أ عرض نص‪.‬‬ ‫مربع النص ‪TextBox‬‬
‫يعرض مجم عة من القيم على شكل‬ ‫‪ComboBox‬‬
‫قائمة منسدلة لالختيار من بينها‪.‬‬
‫يمكن إدخال قيمة جديدة غير‬
‫م ج دة من ضمن القيم التي تعرضها‬
‫القائمة المنسدلة‪.‬‬
‫تعرض مجم عة من القيم على شكل‬ ‫القائمة المنسدلة ‪ListBox‬‬
‫قائمة منسدلة لالختيار من بينها‪.‬‬
‫يستخدم لالختيار ما بين ‪ on/off‬أ‬ ‫االختيار‬ ‫مربع‬
‫نعم‪/‬ال‬ ‫‪CheckBox‬‬
‫يستخدم ضمن مجم عات من زرين‬ ‫االختيار‬ ‫زر‬
‫أ أكثر يث يسمح للمستخدم باختيار‬ ‫‪OptionButton‬‬
‫زر ا د فقط في المرة ال ا دة‪.‬‬
‫زر تشغيل‪/‬إيقاف‬ ‫التبديل‬ ‫زر‬
‫‪ToggleButton‬‬
‫ا ية لعناصر أخرى‬ ‫االطار ‪Frame‬‬
‫األ امر زر قابل للضغط‬ ‫زر‬
‫‪CommandButton‬‬
‫شريط األلسنة ‪ TabStrip‬يعرض مجم عة من ألسنة التب يب‬
‫التي يمكن التنقل ما بينها‬
‫شريط التمرير ‪ ScrollBar‬شريط قابل للتمرير‬
‫لعرض الص ر‬ ‫ص رة ‪Image‬‬
‫يسمح للمستخدم بإدخال نطاق‬ ‫عنصر ‪RefEdit‬‬
‫‪Range‬‬

‫‪163‬‬
‫الفصل الثاني عشر‬

‫عنصر التحكم زر األوامر ‪Command Button‬‬


‫نستطيع من خالل هذا العنصر تنفيذ مجم عة من األ امر عند الضغط عليه‪ .‬إلدراج زر أمر‪ ،‬اختر زر‬
‫األمر من صند ق األد ات ثم أدرجه في المكان المناسب على النم ذج ‪ .Form‬عدل ال جم بالشكل‬
‫المناسب ثم غير أي م اصفات أخرى للزر على سبيل المثال من األم ر الجيدة أن تعطي كل زر اسم‬
‫خاص به ‪ Name‬عن ان ‪ Caption‬ذلك من خالل تعديل خصائص الزر من جزء الخصائص‬
‫‪ .Properties part‬بعد ذلك يمكنك إضافة الك د المطل ب للزر‪.‬‬
‫كمثال على استخدام أزرار األ امر افترض أنك تريد انشاء برنامج بسيط يق م بإجراء عملية طباعة‬
‫ل رقة العمل مع إعطاء المستخدم الخيار للطباعة الط لية أ العرضية‪ .‬ابدأ بإدراج نم ذج فارغ ثم‬
‫أضف له ثالث أزرار كما في الشكل ‪ .12-5‬من جزء الخصائص الخاص بكل زر عدل خصائص‬
‫األزرار كالتالي (ال ظ أنه من األم ر ال ُم صى بها أن تبدأ أسماء أزرار األ امر بالبادئة _‪ ،cmd‬لكن‬
‫هذا األمر ليس ملزما يمكنك إعطاء أي اسم للزر بد ن مشاكل)‪:‬‬
‫اسم الزر ‪Name‬‬ ‫عنوان الزر ‪Caption‬‬
‫‪cmd_portrait‬‬ ‫‪Portrait‬‬
‫‪cmd_landscape‬‬ ‫‪Landscape‬‬
‫‪cmd_cancel‬‬ ‫‪Cancel‬‬

‫‪Figure12-5‬‬

‫‪164‬‬
‫النماذج‬

‫اظهار النموذج ‪Show UserForm‬‬


‫إلظهار نم ذج ما يمكنك كتابة جملة برمجية تستخدم أمر ‪ Show‬مع اسم النم ذج المطل ب‪ .‬فمثالً إذا‬
‫أردنا أن نكتب إجرائية تق م بعرض النم ذج السابق (على أساس أن اسم النم ذج ‪ )UserForm1‬فمن‬
‫الممكن استخدام الك د التالي‪:‬‬

‫)(‪Sub print_from‬‬
‫‪UserForm1.Show‬‬
‫‪End Sub‬‬

‫عند تنفيذ هذه اإلجرائية تق م بعرض النم ذج كما في الشكل ‪.12-6‬‬

‫‪Figure12-6‬‬

‫تى هذه الل ظة ال يق م النم ذج بإجراء أي عملية فعند الضغط على أي من األزرار عليه ال ي دث‬
‫شيء يث أنه لم يتم بعد كتابة أي ك د خاص بالنم ذج أ العناصر الم ج دة عليه‪ .‬في الفقرات التالية‬
‫س ف نتعرف على كيفية إضافة األك اد الخاصة بالنماذج‪.‬‬

‫‪165‬‬
‫الفصل الثاني عشر‬

‫كتابة األكواد الخاصة بالنماذج ‪UserForms Codes‬‬


‫لعرض الك د الخاص بنم ذج ما انقر بزر الما س األيمن ف ق اسم النم ذج في مستكشف المشاريع ثم‬
‫اختر ‪ .View Code‬يمكنك أيضا ً أن تنقر نقرا ً مزد جا ً ف ق النم ذج لعرض الك د الخاص به‪ .‬بالمثل‪،‬‬
‫لعرض الك د الخاص بأ د العناصر على النم ذج انقر نقرا ً مزد جا ً عليه أ انقر عليه بزر الما س‬
‫األيمن ثم اختر ‪.View Code‬‬

‫‪Figure12-7‬‬

‫اغالق النموذج ‪Unloading a Form‬‬


‫إلغالق نم ذج ما استخدم الك د ‪ .Unload me‬أنسب مكان ل ضع هذا الك د ه ارفاقه مع زر‬
‫‪ Cancel‬عن طريق التالي‪:‬‬
‫‪ -‬انقر نقرا ً مزد جا ً ف ق زر ‪( Cancel‬أ انقر بالزر األيمن اختر ‪ .)View Code‬س ف يظهر‬
‫لك الك د التالي‪:‬‬
‫)(‪Private Sub cmd_cancel_Click‬‬
‫‪End Sub‬‬

‫‪166‬‬
‫النماذج‬

‫‪ -‬أدخل السطر ‪ Unload me‬بداخل اإلجرائية أعاله كما يلي‪:‬‬


‫)(‪Private Sub cmd_cancel_Click‬‬
‫‪Unload Me‬‬
‫‪End Sub‬‬
‫بياناته من ذاكرة ال اس ب‪.‬‬ ‫اآلن عند الضغط على زر ‪ Cancel‬فسيتم اغالق النم ذج م‬

‫إخفاء النموذج ‪Hiding a form‬‬


‫تق م الـ ‪ Hide method‬بجعل النم ذج غير مرئي‪ .‬مع اال تفاظ بالبيانات الم ج دة فيه‪ .‬يمكن‬
‫في أي ل ظة اظهار النم ذج المخفي من خالل ‪ .Show method‬إخفاء النم ذج قد يك ن مفيدا ً‬
‫في بعض ال االت‪ ،‬أ د األمثلة على ذلك ه عندما تريد أن تظهر نم ذجا ً فرعيا ً من آخر أساسي‬
‫فيمكنك أن تخفي النم ذج األساسي كي تجعل المستخدم يركز على النم ذج الفرعي بعد ادخال‬
‫بيانات الفرعي يتم اظهار النم ذج األساسي مرة أخرى‪.‬‬
‫إلخفاء النم ذج ‪ UserForm1‬مثالً‪ ،‬قم بإدخال الك د ‪ UserForm1.Hide‬في المكان المناسب‬
‫( سب تسلسل سير البرنامج)‪.‬‬

‫تذكر !! الفرق بين ‪ Hide Unload‬ه أن ‪ VBA‬يق م في ال الة األ لى بإغالق النم ذج م‬
‫بياناته من الذاكرة بينما في ال الة الثانية يق م بإخفاء النم ذج مع اإلبقاء على البيانات بداخله كما‬
‫هي‪.‬‬

‫كتابة األكواد الخاصة بأزرار األوامر‬


‫لكتابة الك د الخاص بزر األمر ‪ Portrait‬انقر نقرا ً مزد جا ً ف قه فتظهر لك إجرائية ال دث الخاصة‬
‫بالنقر على الزر كما يلي‪:‬‬
‫)(‪Private Sub cmdPortrait_Click‬‬
‫‪End Sub‬‬

‫‪167‬‬
‫الفصل الثاني عشر‬

‫أدخل الك د التالي بداخل اإلجرائية كما يلي‪:‬‬


‫)(‪Private Sub cmdPortrait_Click‬‬
‫‪Unload Me‬‬
‫‪With ActiveSheet‬‬
‫‪.PageSetup.Orientation = xlPortrait‬‬
‫‪.PrintPreview‬‬
‫‪End With‬‬
‫‪End Sub‬‬

‫ال ظ أننا في هذه اإلجرائية استخدمنا ‪ 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‬‬

‫عنصر التحكم "التسمية التوضيحية" ‪Label‬‬


‫من الممكن استخدام عنصر التسمية الت ضي ية إلدراج نص س اء بشكل ثابت أ متغير‪ .‬عادة ً ما يتم‬
‫استخدام التسمية الت ضي ية مع عناصر الت كم األخرى مثل مربع النص لت ضيح طبيعة البيانات‬
‫الم ج دة بذلك العنصر‪ .‬إلدراج تسمية ت ضي ية نختار ‪ Label‬من صند ق األد ات ‪ Toolbox‬ثم‬
‫ندرج التسمية في المكان المطل ب‪ ،‬بالطبع يمكن الت كم ب جم التسمية من خالل الس ب االفالت‪.‬‬
‫من الممكن عرض قيمة ثابتة في التسمية الت ضي ية من خالل كتابة تلك القيمة في بند ‪Caption‬‬
‫الم ج د ضمن خصائص التسمية الت ضي ية‪ .‬أ عرض قيمة متغيرة من خالل كتابة ك د برمجي كما‬
‫في المثال التالي‪.‬‬
‫مثال‪ :‬في هذا المثال س ف نعدل على المثال السابق ب يث يتم اظهار اسم رقة العمل التي س ف‬
‫طباعتها مع المصنف الذي ي ت يها في أعلى النم ذج كما في الشكل ‪12-11‬‬

‫‪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‬‬
‫الفصل الثاني عشر‬

‫أزرار االختيار ‪Option Buttons‬‬


‫تك ن أزرار االختيار مفيدة عندما ي تاج المستخدم إلى اختيار قيمة ضمن عدد صغير من القيم‪ .‬عادة‬
‫ما تستخدم أزرار االختيار ضمن مجم عات تتك ن من زرين على األقل عادة ً ما ت ضع المجم عة‬
‫بداخل إطار ‪ . Frame‬يستطيع المستخدم اختيار قيمة ا دة فقط من المجم عة‪ .‬في الشكل ‪12-14‬‬
‫تظهر لنا مجم عتين من األزرار ضمن اطارين مختلفين يستطيع المستخدم أن يختار عنصر ا د‬
‫فقط من كل مجم عة‪.‬‬

‫‪Figure12-14‬‬

‫لت ديد المجم عة التي ينتمي إليها أ د أزرار االختيار يمكنك استخدام ا دى الطريقتين اآلتيتين‪:‬‬
‫‪ -‬أضف إطار ‪ Frame‬للنم ذج من ثم ضع أزرار االختيار التي تنتمي لنفس المجم عة لذلك‬
‫اإلطار‪ .‬هذه الطريقة هي المستخدمة في النم ذج الظاهر في الشكل ‪. 12-15‬‬
‫أعط لجميع أزرار المجم عة نفس اسم المجم عة ‪ Group Name‬من خالل الخاصية‬ ‫ِ‬ ‫‪-‬‬
‫‪ .GroupName‬من الممكن أن ت دد جميع أزرار االختيار التي تريد ضمها لنفس المجم عة‬
‫من ثم تغير اسم المجم عة لجميع األزرار مرة ا دة من خالل تغيير ‪ GroupName‬كما‬
‫في الشكل ‪.12-15‬‬

‫‪174‬‬
‫النماذج‬

‫‪Figure12-15‬‬

‫أهم الخصائص الخاصة بزر االختيار ‪Option Button‬‬


‫‪ :GroupName -‬من خالل هذه الخاصية يمكن تعيين اسم مجم عة لزر األمر‪.‬‬
‫‪ : ControlSource -‬خلية رقة العمل المرتبطة بزر االختيار‪ .‬عند اختيار الزر س ف تك ن‬
‫قيمة هذه الخلية ‪ True‬عند عدم االختيار س ف تك ن ‪.False‬‬
‫‪ :Value -‬عند اختيار الزر ستأخذ هذه الخاصية القيمة ‪ True‬عند عدم االختيار ستأخذ القيمة‬
‫‪.False‬‬

‫‪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‬‬
‫النماذج‬

‫صندوق االختيار ‪Check Box‬‬

‫يك ن مربع االختيار مفيدا ً عندما يك ن لديك االختيار بين نعم ال أ ‪ True/False‬أ ‪ On/Off‬هكذا‪.‬‬
‫فيما يلي أهم الخصائص الخاصة بمربع االختيار‪:‬‬
‫‪ :ControlSource -‬خلية رقة العمل المرتبطة بصند ق االختيار‪ .‬عند اختيار الزر س ف‬
‫تك ن قيمة هذه الخلية ‪ True‬عند عدم االختيار س ف تك ن ‪.False‬‬
‫‪ :Value -‬عند اختيار الزر ستأخذ هذه الخاصية القيمة ‪ True‬عند عدم االختيار ستأخذ القيمة‬
‫‪.False‬‬

‫مثال‬
‫في النم ذج الظاهر في الشكل ‪ 12-18‬تم إضافة زر صند ق اختيار لنم ذج الطباعة الذي رد في‬
‫المثال السابق‪ ،‬ب يث ان اختيار هذا الزر يق م بعرض خط ط الشبكة ‪ Gridlines‬عند الطباعة‪.‬‬

‫‪Figure12-18‬‬

‫لعمل هذا النم ذج‪ ،‬قم بإدراج صند ق اختبار للنم ذج الذي استخدمناه في المثال السابق (الخاص بأزرار‬
‫االختيار) ثم قم بتعديل خصائص صند ق االختيار كالتالي‪:‬‬

‫‪179‬‬
‫الفصل الثاني عشر‬

‫‪- Name :chkGrid‬‬


‫‪- Caption :Print Gridlines‬‬
‫بعد أن يتم ادراج صند ق االختيار تغيير خصائصه كما سبق‪ ،‬قم بالتعديل على الك د المرتبط بزر‬
‫األمر ‪ Print‬عن طريق النقر المزد ج عليه من ثم ادراج جملة ‪ If‬التالية في بداية إجرائية معالجة‬
‫ال دث كما ه ظاهر في الشكل ‪: 12-19‬‬
‫‪If chkGrid.Value = True Then‬‬
‫‪ActiveSheet.PageSetup.PrintGridlines = True‬‬
‫‪Else‬‬
‫‪ActiveSheet.PageSetup.PrintGridlines = False‬‬
‫‪End If‬‬

‫تق م هذه الجملة بف ص ما إذا كانت قيمة صند ق االختيار ‪ chkGrid‬هي ‪ True‬فإذا كانت كذلك تنفذ‬
‫السطر التالي‪:‬‬
‫‪ActiveSheet.PageSetup.PrintGridlines = True‬‬

‫الذي يق م بعرض خط ط الشبكة عند الطباعة إال س ف يتم تنفيذ السطر‪:‬‬


‫‪ActiveSheet.PageSetup.PrintGridlines = False‬‬

‫بالتالي لن يتم عرض خط ط الشبكة عند الطباعة‪.‬‬

‫‪180‬‬
‫النماذج‬

‫‪Figure12-19‬‬

‫القائمة ‪List Box‬‬


‫يتم من خالل عنصر الت كم هذا عرض مجم عة من العناصر ليتم اختيار عنصر أ أكثر من قبل‬
‫المستخدم‪ .‬يُظهر لنا الشكل مثاالً لقائمة ‪ ،ListBox‬من الممكن تهيئة القائمة للسماح للمستخدم باختيار‬
‫عنصر ا د من القائمة فقط أ السماح باالختيار المتعدد‪.‬‬

‫‪181‬‬
‫الفصل الثاني عشر‬

‫‪Figure12-20‬‬

‫أهم خصائص عنصر التحكم ‪List Box‬‬


‫‪ : ControlSource‬من الممكن استخدام هذه الخاصية لت ديد إ دى خاليا رقة العمل ب يث‬ ‫‪-‬‬
‫يتم تخزين القيمة الم ددة من القائمة بداخلها‪.‬‬
‫‪ :ListStyle‬من خالل هذه الخاصية يتم الت كم بمظهر القائمة‪.‬‬ ‫‪-‬‬
‫‪ :MultiSelect‬من هنا يتم ت ديد هل من المسم ح باالختيار المتعدد أم ال‪.‬‬ ‫‪-‬‬
‫‪ :RowSource‬من المكن استخدام هذه الخاصية لت ديد نطاق من خاليا رقة العمل ي ت ى‬ ‫‪-‬‬
‫على عناصر القائمة‪.‬‬
‫‪ :Value‬العنصر ال ُم دد بالقائمة‪.‬‬ ‫‪-‬‬
‫مالحظة‬
‫إذا تم تهيئة القائمة ب يث تقبل االختيار المتعدد (من خالل الخاصية ‪ )MultiSelect‬فال يمكن في هذه‬
‫ال الة ت ديد خلية لتعمل كـ ‪ ControlSource‬يث أن نتيجة الت ديد أكثر من قيمة بالتالي ال يمكن‬

‫‪182‬‬
‫النماذج‬

‫ضع جميع تلك القيم بداخل خلية ا دة‪ .‬في هذه ال الة يجب كتابة ماكر يق م بتخزين القيم ال ُمختارة‬
‫بداخل نطاق ما‪.‬‬

‫تعبئة القائمة ‪Populating List‬‬


‫هناك طريقتين لتعبئة القائمة‪ :‬اما من خالل الخاصية ‪ RowSource‬إما برمجيا ً من خالل ‪AddItem‬‬
‫‪ .method‬لتعبئة القائمة من خالل الخاصية ‪ ،RowSource‬دد القائمة المطل بة ثم من جزء‬
‫الخصائص الخاص بها أدخل النطاق الذي ي ت ي على عناصر القائمة في البند ‪ RowSource‬كما‬
‫يظهر في الشكل ‪.12-21‬‬

‫‪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‬‬
‫الفصل الثاني عشر‬

‫يعمل هذا الك د كالتالي‪:‬‬


‫‪ -1‬في البداية تم تعريف متغير باسم ‪ oSheet‬من ن ع ‪Worksheet‬‬
‫‪ -2‬تم استخدام جملة التكرار ‪ For….Next‬للتكرار عبر أ راق العمل بداخل المصنف ثم ادراج‬
‫اسم كل رقة عمل بداخل القائمة من خالل الجملة البرمجية‪:‬‬
‫‪ListBox1.AddItem oSheet.Name‬‬
‫‪ -3‬ثم استخدمنا ‪ ListIndex method‬الختيار أ د العناصر بداخل القائمة بشكل تلقائي من خالل‬
‫السطر البرمجي ‪ ListBox1.ListIndex = 0‬الذي يق م بت ديد العنصر األ ل في القائمة بشكل‬
‫افتراضي ‪.Default value‬‬

‫إلدراج الك د الخاص بزر الطباعة‪ ،‬انقر نقرا ً مزد جا ً ف ق الزر لفتح إجرائية معالجة ال دث الخاص‬
‫بالزر‪ ،‬ثم أدرج الك د التالي‪:‬‬
‫)(‪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‬‬
‫النماذج‬

‫اآلن أصبح الك د الكامل كما في الشكل ‪12-24‬‬

‫‪Figure12-24‬‬

‫مالحظة‬
‫ال ظ هنا التالي‪ :‬قائمة ‪ List Box‬بخالف عناصر الت كم األخرى (مثل ‪ComboBox‬‬
‫‪ )CheckBox‬ال ت تفظ بقيمتها بعد تطبيق ‪ Unload Me‬لذلك خزنّا القيمة الم ددة بداخل القائمة‬
‫بداخل المتغير ‪ Selected_Sheet‬قبل تطبيق ‪.Unload Me‬‬

‫‪187‬‬
‫الفصل الثاني عشر‬

‫استخدام االختيار المتعدد مع القائمة ‪Multi-Select ListBox‬‬


‫تعطيك قائمة ‪ List Box‬إمكانية اختيار أكثر من عنصر في نفس ال قت من خالل تعديل الخاصية‬
‫‪ Mutiselect‬كما في الشكل ‪ .12-25‬ال ظ أن هذه القائمة ت ت ي على ثالث خيارات‪:‬‬
‫‪ :fmMultiSelectSingle -1‬الختيار عنصر ا د فقط‬
‫‪ :fmMultiSelectMulti -2‬الختيار أكثر من عنصر باستخدام النقر بالما س‪.‬‬
‫‪ :fmMultiSelectExtended -3‬الختيار أكثر من عنصر باستخدام النقر بالما س مع زر‬
‫‪.CTRL‬‬

‫‪Figure12-25‬‬

‫‪188‬‬
‫النماذج‬

‫من الممكن تعديل هذه الخاصية من خالل جزء الخصائص الخاص بالقائمة كما بالشكل أعاله‪ .‬أ برمجيا ً‬
‫من خالل الـ ‪ .MultiSelect property‬فمثالً لجعل القائمة ذات اختيار متعدد من خالل البرمجة‬
‫باإلمكان ادخال الك د التالي في إجرائية ال دث الخاصة ببدء النم ذج‪:‬‬
‫‪ListBox1.MultiSelect = fmMultiSelectMulti‬‬
‫يساعدك م رر األك اد في ادخال الخيار المناسب لك من خالل ميزة االختيار التلقائي كما في الشكل‬
‫‪.12-26‬‬

‫‪Figure 12-26‬‬

‫مثال على استخدام القائمة مع االختيار المتعدد‬


‫في الشكل ‪ 12-27‬مثال على استخدام االختيار المتعدد مع قائمة ‪ List Box‬يث أنك من خالل هذا‬
‫النم ذج تستطيع ت دد أكثر من رقة عمل ثم عرض معاينة قبل الطباعة أل راق العمل الم ددة‪.‬‬

‫‪Figure12-27‬‬

‫‪189‬‬
‫الفصل الثاني عشر‬

‫لعمل هذا النم ذج‪ ،‬استخدم المثال السابق؛ من م رر األك اد ‪ VBE‬افتح النم ذج‪ ،‬دد القائمة ثم عدل‬
‫اختر الخيار ‪ fmMultiSelectMulti‬أ‬ ‫خصائصها من جزء الخصائص‬
‫‪. fmMultiSelectExtended‬‬
‫أدخل الك د التالي الخاص بزر الطباعة عن طريق النقر المزد ج ف ق زر الطباعة من ثم كتابة الك د‬
‫في إجرائية معالجة ال دث التي س ف تفتح‪:‬‬

‫)(‪Private Sub CommandButton1_Click‬‬


‫‪Unload Me‬‬
‫‪For i = 0 To ListBox1.ListCount - 1‬‬
‫‪If ListBox1.Selected(i) Then‬‬
‫‪Sheets(ListBox1.List(i)).PrintPreview‬‬
‫‪End If‬‬
‫‪Next i‬‬
‫‪End Sub‬‬
‫بما أننا سم نا باالختيار المتعدد في القائمة ‪ ListBox1‬فال يعد باإلمكان استخدام الخاصية ‪ Value‬يث‬
‫أن االختيار قد يك ن أكثر من قيمة بالتالي فإننا استخدمنا جملة التكرار ‪ For……Next‬للتكرار عبر‬
‫عناصر القائمة ف ص كل عنصر‪ ،‬هل ه ُم دد أم ال؟ من خالل الخاصية ‪ ،Selected‬فإذا كان ُم دد‬
‫يتم عرض المعاينة قبل الطباعة ل رقة العمل التي ت مل نفس اسم العنصر الم دد‪.‬‬

‫‪190‬‬
‫النماذج‬

‫القائمة المنسدلة ‪Combo Box‬‬


‫القائمة المنسدلة ‪ Combo Box‬تجمع ما بين خصائص القائمة ‪ List Box‬مربع ادخال النص ‪Input‬‬
‫‪( Box‬سيتم التطرق له ال قاً)‪ ،‬يث أنك من خالل الـ ‪ Combo Box‬تستطيع إعطاء المستخدم إمكانية‬
‫ادخال قيمة جديدة بخالف العناصر الم ج دة في القائمة باإلضافة إلى إمكانية اختيار عنصر من عناصر‬
‫القائمة‪ .‬بإمكانك أن تلغي إمكانية ادخال القيم الجديدة االقتصار على االختيار من القائمة فقط‪.‬‬

‫مثال على استخدام القائمة المنسدلة‬


‫تم تعديل المثال السابق ب يث نستخدم القائمة المنسدلة بدالً من قائمة ‪ List Box‬الختيار رقة العمل‬
‫التي نريد طباعتها‪ .‬لعمل هذا النم ذج قم بإدراج ‪ Combo Box‬على النم ذج (في هذا المثال أبقينا على‬
‫االسم االفتراضي للقائمة المنسدلة ه ‪ .)ComboBox1‬ثم قم بتعبئة القائمة المنسدلة بأسماء أ راق‬
‫العمل بنفس الطريقة التي استخدمناها في المثال السابق‪ ،‬من خالل إدخال الك د التالي في إجرائية ال دث‬
‫الخاصة ببدء النم ذج‪:‬‬
‫)(‪Private Sub UserForm_Initialize‬‬
‫‪Dim oSheet As Worksheet‬‬
‫‪For Each oSheet In ActiveWorkbook.Worksheets‬‬
‫‪ComboBox1.AddItem oSheet.Name‬‬
‫‪Next oSheet‬‬
‫‪ComboBox1.ListIndex = 0‬‬
‫‪End Sub‬‬

‫ال ظ هنا أننا ددنا القيمة االفتراضية للقائمة المنسدلة من خالل السطر البرمجي‪:‬‬
‫‪ComboBox1.ListIndex = 0‬‬

‫‪191‬‬
‫الفصل الثاني عشر‬

‫بالنسبة للك د الخاص بزر األمر فس ف يك ن كالتالي‪:‬‬


‫)(‪Private Sub CommandButton1_Click‬‬
‫‪Unload Me‬‬
‫‪Sheets(ComboBox1.Value).PrintPreview‬‬
‫‪End Sub‬‬

‫تجدر المال ظة أنه ال ت جد إمكانية لالختيار المتعدد في القائمة المنسدلة‪.‬‬

‫‪Figure12-28‬‬

‫إللغاء إمكانية إدخال قيم جديدة (غير م ج دة ضمن القائمة) عدل الخاصية ‪ Style‬للقيمة‬
‫‪.fmStyleDropDownList‬‬

‫‪192‬‬
‫النماذج‬

‫‪Figure12-29‬‬

‫مربع النص ‪Text Box‬‬


‫يعتبر مربع النص من ال سائل المثالية إلدخال البيانات يث يمكنك من خالله ادخال أي ن ع من البيانات‬
‫مثل النص ص أ األرقام أ غيرها‪ .‬الشكل ‪ 12-30‬يظهر مثاالً على استخدام مربع النص في النماذج‪.‬‬
‫فيما يلي أهم الخصائص الخاصة بمربع النص‪:‬‬
‫‪ :ControlSource‬من الممكن استخدام هذه الخاصية إلدخال عن ان الخلية التي ت ت ي على‬ ‫‪-‬‬
‫النص الذي نرغب بإظهاره في مربع النص‪.‬‬
‫‪ :MaxLength‬ال د األقصى لل ر ف التي يمكن إدخالها في مربع النص‪.‬‬ ‫‪-‬‬
‫‪ :MultiLine‬اذا كانت قيمة هذه الخاصية ‪ True‬فيمكن ادخال أ عرض أكثر من سطر في‬ ‫‪-‬‬
‫مربع النص‪.‬‬
‫‪ :TextAlligne‬للت كم بم اذاة النص‪.‬‬ ‫‪-‬‬

‫‪193‬‬
‫الفصل الثاني عشر‬

‫‪Figure12-30‬‬

‫مثال على استخدام مربع النص‬


‫في الشكل ‪ 12-31‬تم ادراج مربع نص زري أمر في النم ذج‪ ،‬المطل ب برمجة الزر العل ي ب يث‬
‫يعرض القيمة التي تم إدخالها في مربع النص أما الزر السفلي فيق م بتخزين النص الم ج د في مربع‬
‫النص في الخلية ‪ A1‬ل رقة العمل النشطة‪.‬‬

‫‪Figure12-31‬‬

‫‪194‬‬
‫النماذج‬

‫لعمل ذلك انقر ف ق الزر العل ي لفتح إجرائية معالجة ال دث الخاصة به ثم أدخل الك د التالي‪:‬‬

‫)(‪Private Sub CommandButton1_Click‬‬


‫‪MsgBox TextBox1.Value‬‬
‫‪End Sub‬‬

‫اما بالنسبة للزر السفلي فأدخل الك د التالي في إجرائية معالجة ال دث الخاصة به‪:‬‬

‫)(‪Private Sub CommandButton2_Click‬‬


‫‪Range("A1").Value = TextBox1.Value‬‬
‫‪End Sub‬‬

‫مثال‪ .‬بناء نموذج لترحيل البيانات‬


‫يق م النم ذج في الشكل ‪ 12-32‬بتخزين البيانات الم ج دة في مربعي النص على النم ذج إلى رقة‬
‫العمل ‪ Sheet1‬كما ه ظاهر في الشكل‪.‬‬
‫أعط مربع االسم الخاص باسم المنتج‬
‫لعمل هذا النم ذج أدرج عناصر الت كم كما ه ظاهر في الشكل‪ِ .‬‬
‫‪ Product Name‬االسم‪ Name_box :‬مربع االسم الخاص ب صف المنتج ‪Product‬‬
‫‪ Description‬االسم‪.Desc_box :‬‬

‫‪195‬‬
‫الفصل الثاني عشر‬

Figure12-32

:‫ نقرا ً مزد جا ً لفتح إجرائية معالجة ال دث الخاصة بالنقر ف ق الزر ثم أدخل التالي‬OK ‫انقر ف ق زر‬

Private Sub CommandButton1_Click()


last_row = Cells(Rows.Count, 1).End(xlUp).Row
With Sheets("sheet1")
.Cells(last_row + 1, 1) = Name_box.Value
.Cells(last_row + 1, 2) = desc_box.Value
End With
End Sub

196
‫النماذج‬

‫يعمل هذا الك د كالتالي‪:‬‬


‫‪ -‬أ ال تم ت ديد آخر صف ي ت ي على بيانات في العم د األ ل من خالل السطر البرمجي‪:‬‬
‫‪last_row = Cells(Rows.Count, 1).End(xlUp).Row‬‬
‫يث يعمل هذا السطر كالتالي‪ :‬أ الً يق م بت ديد آخر خلية في العم د األ ل من خالل‬
‫‪ Cells(Rows.Count, 1).‬ثم يق م بالسير لألعلى تى يصل أل ل خلية بها بيانات تقابله من خالل‬
‫)‪ .End(xlUp‬ثم يرجع رقم الصف من خالل ‪.Row‬‬
‫‪ -‬بعد أن عرفنا آخر صف ي ت ي على بيانات في العم د األ ل المطل ب اآلن أن نر ل البيانات‬
‫الم ج دة في مربع النص الخاص باسم المنتج إلى الخلية التي تلي آخر خلية بها بيانات في‬
‫العم د األ ل‪ ،‬أن نر ل البيانات الم ج دة في مربع النص الخاص ب صف المنتج إلى الخلية‬
‫التي تلي آخر خلية بها بيانات في العم د الثاني‪ .‬ذلك تم من خالل الك د التالي‪:‬‬
‫)"‪With Sheets("sheet1‬‬
‫‪.Cells(last_row + 1, 1) = Name_box.Value‬‬
‫‪.Cells(last_row + 1, 2) = desc_box.Value‬‬
‫‪End With‬‬

‫أ الً ددنا ال رقة التي نريد أن نر ل البيانات لها من خالل )"‪ With Sheets("sheet1‬ثم من‬
‫خالل السطرين التاليين ددنا الخليتين اللتين تليان آخر صف في العم د األ ل الثاني تم تعيين‬
‫قيمة مربعي النص الخاصين باالسم ال صف إليهما‪.‬‬

‫إضافة زر لمحو بيانات نموذج الترحيل‬


‫البيانات من مربعات النص كما في الشكل ‪. 12-33‬‬ ‫من المفضل إضافة زر للنم ذج يق م بم‬

‫‪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‬‬
‫النماذج‬

Private Sub Add_Button_Click()


If WorksheetFunction.CountIf(Range("A:A"), id_box.Value) > 0 Then
MsgBox ("Duplicate ID!! please use non duplicate ID ...")
Exit Sub
End If
last_row = Cells(Rows.Count, 1).End(xlUp).Row
With Sheets("sheet1")
.Cells(last_row + 1, 1) = id_box.Value
.Cells(last_row + 1, 2) = Name_box.Value
.Cells(last_row + 1, 3) = desc_box.Value
End With
End Sub

‫من المنطقي أن يك ن لكل منتج رقم غير متكرر (فريد) للت قق من أن رقم المنتج غير مستخدم من‬
:‫ كالتالي‬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‬‬

You might also like