اإلصــدار 1.0 نضال الشامي أساسيات البرمجة باستخدام Excel VBA المؤلف نضال الشامي اإلصدار األول 2020 هذا الكتاب منشووووووو ر ت ت رخصة المشاع اإلبداعي نَسب ال ُمصنَّف -غير تجاري - الترخيص بالمثل CC BY-NC-SA هذه الرخصة تتيح لآلخرين التعديل ،التحسين ،وبناء نسخ مشتقة من ال ُمصنَّف ولكن في غير األغراض التجارية ،بشرط نَسب العمل األصلي للمؤلف وترخيص األعمال الجديدة بنفس الرخصة . الغالف نضال الشامي صورة الغالف من االنترنت م ف ظة لصا بها جد ل الم ت يات جدول المحتويات مقدمة 1 1. مدخل إلى 7 ......................................................................................... Excel VBA إذن ،ما هي 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 2. محرر األوامر )15 ......................................................................................... (VBE ما ه م رر أ امر فيج ال بيسيك إلكسيل ) Visual Basic Editor (VBE؟ 15.................. ................................ كيفية إظهار م رر األك اد 15.................................. ................................ ................................ VBE عناصر ن افذ م رر األك اد 17............................... ................................ ................................ VBE نافذة الك د 19..................................... ................................ ................................ Code Window نافذة الخصائص 19........................ ................................ ................................ Properties Window نافذة األ امر الف رية 19.................. ................................ ................................ Immediate Window كتابة برنامجك األ ل بالـ 21.................................... ................................ ................................ VBA vii جد ل الم ت يات فظ ملفات االكسيل التي ت ت ي على ماكر 26..................... ................................ ................................ .3 استخدام مسجل الماكرو 29 ....................................................................................... خط ات انشاء ماكر بسيط يق م بتل ين الصف األ ل بالل ن األصفر 30........................... ................................ كيفية ضع زر للماكر في شريط المهام 32......................... ................................ ................................ كيفية ربط ماكر مع زر Buttonأ شكل 33...................... ................................ ................................ استخدام مراجع الخاليا النسبية عند تسجيل الماكر 34.............. ................................ ................................ ف ص الك د البرمجي الم افق للماكر 34............................ ................................ ................................ 4. المتغيرات 37 ....................................................................................... Variables ما ه المتغير؟ 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 جد ل الم ت يات .5 التعامل مع كائنات النطاق 55 ..................................................................................... اإلشارة لكائنات النطاق من خالل الخاصية 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 .6 جمل التحكم 67 .................................................................................................... جملة 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 ................................... ................................ ................................ 1- دالة 105 ................................. ................................ ................................ :MsgBox 2- دالة 105 ............................... ................................ ................................ :InputBox 3- الدالة 106 .................................... ................................ ................................ :Shell طلب المساعدة من م رر األك اد في كتابة الد ال 108 .............. ................................ ................................ د ال رقة العمل 108 .................. ................................ ................................ Worksheet Functions بعض األمثلة على استخدام د ال رقة العمل 109 ................... ................................ ................................ إيجاد ال د األعلى األدنى ثاني أكبر قيمة في نطاق م دد 109 .................................... ................................ مثال على استخدام الدلة 110 ........................... ................................ ................................ VLOOKUP .9 التعامل مع األخطاء في 113............................................................................... VBA األخطاء التشغيلية 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 ................................ ................................ ................................ 10. األحداث 135............................................................................................. Events ما ه معالج-ال دث 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 ........................................ ................................ .11 التفاعل مع المستخدم من خالل مربعات الحوار 149............................................................ الدالة 149 .................. ................................ ................................ ................................ MsgBox عرض مربع ار بسيط 150 ........................................ ................................ ................................ أخذ استجابة من مربع ار 151 ..................................... ................................ ................................ مربع االدخال 154 ...................................... ................................ ................................ InputBox مثال على دالة 154 ....................................... ................................ ................................ InputBox الدالة 156 ................... ................................ ................................ Application.InputBox method .12 النماذج 159....................................................................................... UserForms انشاء نم ذج المستخدم 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يطلق على كيفية ترتيب الكائنات بداخل اكسيل. Cells Ranges Workshets 11 Workbooks Application الفصل األ ل التجميعات/المجموعات 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 ي ت ي م رر األك اد على العديد من الن افذ التي يمكن الت كم بإظهارها إخفائها سب ال اجة .في غالب األ قات أنت قد ت تاج ألربعة ن افذ أساسية هي: -1 -2 -3 -4 مستكشف المشاريع Project Explorer نافذة الك د البرمجي Code Window نافذة الخصائص Properties Window نافذة األ امر الف رية Immediate Window 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 فحص الكود البرمجي الموافق للماكرو لرؤية الك د البرمجي الخاص بماكر ُمس َجل اتبع الخط ات التالية: -1 -2 -3 -4 افتح م رر األك اد VBEعن طريق الضغط على ALT + F11أ من خالل الذهاب إلى تب يب Developerثم .Visual Basic اذهب إلى مستكشف المشاريع .Project Explorerإذا لم يكن ظاهرا ً فأظهره من خالل الذهاب إلى Viewثم .Project Explorer من مستكشف المشاريع اختر اسم المصنف الذي ي ت ي على الماكر اضغط على رمز + الم ج د لعمل ت سعة Expandللمصنف. اضغط على +بجانب بند Modulesلعمل ت سعة لها .ثم انقر نقرا ً مزد جا ً ف ق .Module1 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/keywordsvisual-basic-for-applications أنواع المتغيرات في VBA يدل ن ع المتغير عل كيفية تخزينه في الذاكرة ،مثل األرقام الص ي ة العشرية ،النص ص ،الت اريخ غيرها .بال ضع االفتراضي ،تستطيع لغة VBAالتعامل مع األن اع المختلفة للمتغيرات بشكل تلقائي، فليس ضر ريا أن تعلن عن المتغير (اسمه ن عه) قبل البدء باستخدامه فيمكنك مثال أن تكتب الجملة البرمجية التالية: x = 100 هنا يق م االكسيل بشكل تلقائي بالتعرف على المتغير xت ديد ن عه كعدد ص يح integerذلك طبقا ً للقيمة التي تم تعيينها للمتغير هي 100ل كانت القيمة المعطاة للمتغير هي " "Ahmedفس ف يق م االكسيل بت ديد ن ع البيانات للمتغير xكـ .Stringعلى الرغم من المر نة التي تمن ها لنا VBAفي 38 المتغيرات هذا األمر إال أن هناك ثمنا ً لذلك ه استخداما ً أقل كفاءة ً لم ارد الكمبي تر تنفيذا ً قد يك ن في بعض األ يان أبطأ مما ل تم ت ديد ن ع البيانات المناسب للمتغير قبالً .بشكل عام ،يُ صى د ما ُ باستخدام ن ع البيانات الذي يستخدم أقل عدد من البايتات. أنواع البيانات في VBA في الجد ل التالي قائمة بأن اع المتغيرات في لغة VBA نوع البيانات Dataنطاق القيم Range Types قيمة عددية ص ي ة من 0تى 255 True or False, On or Off, 0 or 1 -32,768 To 32767 –2,147,483,648 To 2,147,483,647 -3.402823E38 To 1.401298E45 Byte Boolean Integer Long 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 مع الفاصلة العشرية Date Object String Variant 1/1/100 to 12/31/9999 Object in VBA تى 65400رف أي قيمة رقمية بنطاق الـ Doubleأ نصية بنطاق String 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 السطر البرمجي التالي يعرض القيمة Trueإذا كانت الخلية A1ت ت ي على معادلة ذلك: Falseفيما عدا 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عالمة الطالب) من ثم عرض مربع التقدير الذي س ف يك ن كالتالي: الدرجة أكبر من 90 من 80تى أقل من 90 من 70تى أقل من 80 من 60تى أقل من 70 أقل من 60 ار يظهر التقدير ممتاز Excellent جيد جدا ً Very Good جيد Good مقب ل Pass راسب Fail لل ص ل لذلك الهدف نستخدم جملة 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 بالنسبة للخيارات ال ظ أنه هناك أكثر من شكل لف ص الخيارات: -1 -2 -3 -4 إذا كنا نريد نطابق مع قيمة م ددة نكتب القيمة الم ددة بعد كلمة Caseمباشرة (مثل )Case 1 إذا كنا نريد أن نطابق مع أي قيمة ضمن نطاق من القيم المتجا رة نستخدم كلمة ( Toمثل Case )4 To 6 إذا كنا نريد أن نطابق مع أي قيمة ضمن مجم عة من القيم نستخدم الفاصلة مثل ( )Case 2,3 إذا كنا نريد أن نستخدم ع امل المقارنات نستخدم ( Isمثل )Case Is > 8 مثال 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 -4 تنفيذ عمليات معينة على جميع المصنفات أ أ راق العمل المفت ة .مثل فظ اغالق جميع المصنفات المفت ة. تنفيذ عمليات معينة على جميع عناصر مصف فة م ددة. تنفيذ عمليات معينة على جميع ال ر ف في جملة م ددة تنفيذ عمليات معينة على جميع عناصر مجم عة معينة Collectionمثل عناصر مجم عة المخططات 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هكذا. تعمل هذه الدالة بالشكل التالي: -1 -2 -3 -4 -5 -6 تق م الدالة بتخزين قيمة الجملة المدخلة (معامل الدالة) في متغير باسم .Str تعطي المتغير TextPartقيمة فارغة مبدئياً. تم استخدام الدالة المدمجة Lenإلرجاع عدد األ رف في النص المدخل .من خالل )Len(Str تم استخدام جملة Forمع الد ال Mid IsNumberلف ص كل رمز Charachterمن النص بدءا ً من اليسار هل الرمز عبارة عن رقم أم ال .يث أن الدالة Midتق م باستخراج رمز ا د من النص المعطى في كل مرة يتم فيها تنفيذ جملة - Forبدءا ً من اليسار -بينما تق م الدالة IsNumberبف ص هل الرمز رقم أم ال. بالنسبة لجملة ،Forتم استخدام المتغير iكعداد لجملة التكرار ،تم ت ديد القيمة الدنيا للعداد بـ 0العليا بعدد الرم ز في النص المعطى (الذي تم ال ص ل عليه من خالل ).Len(Str تق م جملة Ifالم ج دة بداخل جملة التكرار كل مرة بف ص نتيجة تنفيذ الجملة )) .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إذا كانت الخلية تقع ضمن صف فردي يتم تل ين الخلية بالل ن األس د. )(PaintOddCells Rng As Range, cell As Range )"Rng = Range("A1:A20 Each cell In Rng 94 Sub Dim Set For جمل التكرار If WorksheetFunction.IsOdd(cell.Row) Then cell.Interior.Color = 0 End If Next End Sub Figure 7-3 95 الفصل السابع مثال 5 تق م اإلجرائية التالية ب ذف جميع أ راق العمل الفارغة من المصنف ال الي. تعمل هذه اإلجرائية كالتالي: -1 -2 -3 -4 -5 تم تعريف متغير من ن ع Worksheetباسم ws تم انشاء جملة For Each Nextللتكرار عبر عناصر مجم عة أ راق العمل Worksheets Collectionمن خالل المتغير .ws في كل مرة يتم فيها التكرار يتم تطبيق جملة Ifعلى المتغير wsالذي ي ت ي على إ دى أ راق العمل .تق م جملة Ifباستخدام دالة رقة العمل CouontAلف ص ما إذا كانت خاليا رقة العمل ت ت ي على أية بيانات .يث أنه كما نعلم تق م دالة CountAب ساب عدد الخاليا التي ت ت ي على بيانات في نطاق م دد .تأخذ الدالة CountAالمعامل ws.cellsالذي ه عبارة عن نطاق يشمل جميع خاليا رقة العمل. في كل مرة تك ن فيها نتيجة تنفيذ الدالة CountAصفر (أي أن ال رقة فارغة) يتم ذف رقة العمل من خالل السطر البرمجيWs.Delete : إللغاء رسائل الت ذير التي قد تظهر عند ذف أ راق العمل استخدمنا الجملة في بداية اإلجرائية: Application.DisplayAlerts = False ثم أرجعنا ال ضع لما كان عليه في نهاية اإلجرائية من خالل إعادة تفعيل رسائل الت ذير عن طريق الجملة التالية: Application.DisplayAlerts = True إذا لم نعطل اظهار رسائل الت ذير فس ف يق م االكسيل بإظهار رسالة ت ذير في كل مرة تق م هذه اإلجرائية بم ا لة ذف إ دى أ راق العمل. )(Sub DeleteEmptySheets Dim Ws As Worksheet Application.DisplayAlerts = False For Each Ws In ActiveWorkbook.Worksheets 96 جمل التكرار 0 = )WorksheetFunction.CountA(Ws.Cells If 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 تلميحات لتقليل األخطاء البرمجية -1 -2 -3 -4 ا ل أن تستخدم الخيار Option Explicitفي بداية البرامج دائما .استخدام هذا الخيار يقلل من ا تمالية د ث أخطاء بسبب خطأ مطبعي قي كتابة اسم متغير ما. استخدم الكثير من التعليقات .ج د التعليقات يساعدك في فهم الك د عند الرج ع له بعد فترة من كتابة البرنامج .يساعد أيضا ً من يريد العمل على البرنامج من بعدك. كن ذرا ً عند استخدام جملة .On Error Resumeج د هذه الجملة يجعل البرنامج يتجا ز الخطأ بد ن أن يعطيك فرصة لمال ظة الخطأ .لذلك عند استخدام هذه الجملة تأكد مما تريده جيداً. نسق الك د بشكل اضح عن طريق م اذاة كل مجم عة من الجمل ذات العالقة مع بعضها البعض (ال ظ كيف تمت م اذاة األ امر في الشكل )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 التفاعل مع المستخدم القيمة 0 1 الكلمة vbOKOnly vbOKCancel 2 vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 3 4 5 16 32 48 64 0 256 512 768 ماذا تفعل عرض زر OKفقط عرض زري Cancle OK عرض األزرار Abort, Retry, and Ignore عرض األزرار Yes, NO, and Cancle عرض زري NO ،Yes عرض زري Retry, Cancle عرض أيق نة الخطر Critical عرض أيق نة االستفهام Query عرض أيق نة الت ذير Warning عرض أيق نة المعل مات Information الزر األ ل ه الزر االفتراضي الزر الثاني ه الزر االفتراضي الزر الثالث ه الزر االفتراضي الزر الرابع ه الزر االفتراضي الستخدام أكثر من قيمة للمعامل مثل أن تعرض األزرار 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اختياري الرقم المرجعي للعنوان الذي تريد مساعدة بالنسبة له. اختياري نوع البيانات المدخلة .إذا لم يكن هذا الخيار موجودا ً فإن نوع البيانات االفتراضي هو نص Text Type 156 التفاعل مع المستخدم الجد ل التالي ي ضح القيم التي يمكن استخدامها مع المعامل :Type القيمة 0 1 2 4 ما تعنيه صيغة Formula رقم نص قيمة منطقية True or False 8 مرجع خاليا (كعنصر نطاق )Range object 16 64 قيمة خطأ (مثل )N/A# مصف فة مثال يق م البرنامج باألسفل باستخدام 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 االختيار مربع CheckBox االختيار زر OptionButton التبديل ظيفة كل منها ظيفته الظهار نص. الدخال أ عرض نص. يعرض مجم عة من القيم على شكل قائمة منسدلة لالختيار من بينها. يمكن إدخال قيمة جديدة غير م ج دة من ضمن القيم التي تعرضها القائمة المنسدلة. تعرض مجم عة من القيم على شكل قائمة منسدلة لالختيار من بينها. يستخدم لالختيار ما بين on/offأ نعم/ال يستخدم ضمن مجم عات من زرين أ أكثر يث يسمح للمستخدم باختيار زر ا د فقط في المرة ال ا دة. زر تشغيل/إيقاف زر ToggleButton ا ية لعناصر أخرى االطار Frame األ امر زر قابل للضغط زر CommandButton شريط األلسنة TabStripيعرض مجم عة من ألسنة التب يب التي يمكن التنقل ما بينها شريط التمرير ScrollBarشريط قابل للتمرير لعرض الص ر ص رة Image يسمح للمستخدم بإدخال نطاق عنصر RefEdit Range 163 الفصل الثاني عشر عنصر التحكم زر األوامر Command Button نستطيع من خالل هذا العنصر تنفيذ مجم عة من األ امر عند الضغط عليه .إلدراج زر أمر ،اختر زر األمر من صند ق األد ات ثم أدرجه في المكان المناسب على النم ذج .Formعدل ال جم بالشكل المناسب ثم غير أي م اصفات أخرى للزر على سبيل المثال من األم ر الجيدة أن تعطي كل زر اسم خاص به Nameعن ان Captionذلك من خالل تعديل خصائص الزر من جزء الخصائص .Properties partبعد ذلك يمكنك إضافة الك د المطل ب للزر. كمثال على استخدام أزرار األ امر افترض أنك تريد انشاء برنامج بسيط يق م بإجراء عملية طباعة ل رقة العمل مع إعطاء المستخدم الخيار للطباعة الط لية أ العرضية .ابدأ بإدراج نم ذج فارغ ثم أضف له ثالث أزرار كما في الشكل .12-5من جزء الخصائص الخاص بكل زر عدل خصائص األزرار كالتالي (ال ظ أنه من األم ر ال ُم صى بها أن تبدأ أسماء أزرار األ امر بالبادئة _ ،cmdلكن هذا األمر ليس ملزما يمكنك إعطاء أي اسم للزر بد ن مشاكل): عنوان الزر Caption Portrait Landscape Cancel اسم الزر Name cmd_portrait cmd_landscape cmd_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