You are on page 1of 48

‫دورة تدريبية للستاذ أبو هاجر المصري‬

‫إخواني العزاء أعضاء المنتدى الجميل ‪ ،‬تعبت مرارا وتكرارا وإلحاحا ( حلوة إلحاحا دي ) على المشرفين يشرحوا لنا ‪ VBA‬وأوامره‬
‫وأكواده وشفراته والتطبيقات الممكنة بيه وربطه باكسيل ‪ ،‬المهم لم أجد مجيب علما بان الموضوع لو كان اتفتح من البداية وكل مشرف حط‬
‫له كود كل يوم كان زمانه خلصنا منه دلوقتي ‪ ،‬وكان الشرح هيبقى على ايد اساتذة فاهمين ومجربين انا ل الومهم بالطبع عارف ان كلهم‬
‫مشغولين ‪ ،‬وعلشان كده قلت اترجم كتب ومواقع في الموضوع ده ولقيت إني بستفيد بصراحة ‪ ،‬وحبيت إن الكل يستفيد معايا ‪ ،‬بمعنى آخر أنا‬
‫زيي زيكم بالضبط معلوماتي في الفيجوال مع اكسيل زي معلوماتكوا في الكيمياء الحيوية وعلقتها بالعدسات اللصقة ههههههههه ‪...‬‬
‫ومع بعض واحدة واحدة خالص واللي هخلصه ترجمة وتنسيق أعرضه ليكم ‪ ،‬بداية بتعريف ‪ VBA , VBE‬والواجهة والوامر وكيفية كتابة‬
‫الكواد والعمليات البرمجية ‪ ،‬وفي النهاية هعملكو زي مرجع شامل بكل الوامر الممكنة وتعريف موجز بالمر او الكود وبيعمل ايه ومثال لكل‬
‫واحد ‪ ،‬وال المستعان‬
‫نبدأ وبعون ال في الدرس الول‬

‫الجزء الول ( مقدمة إكسيل ‪) VBA‬‬


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

‫‪ )1‬ما هو محرر فيجوال بيزك (‪ ) Visual Basic Editor‬؟؟‬


‫عليك استخدام المصنفات ‪ ،‬والصيغ والرسوم البيانية ‪ ،‬وغيرها من الشياء الجيدة لكسيل معظم الوقت ‪ ،‬حان الوقت الن لتوسيع النطاق‬
‫الخاص بك ‪ ،‬واستكشاف آفاق جديدة تماما من جوانب إكسيل ‪ ،‬إنه محرر الفيجوال بيزك ‪ ، Visual Basic Editor‬عليك معرفة كيفية‬
‫استخدامه ‪ ،‬وتعكف على مهمة كتابة بعض أوامره ‪.‬‬
‫إن محرر فيجوال بيزك ( ‪ ) VBE‬هو عبارة عن برنامج منفصل عن طريقه يمكنك كتابة وتعديل ‪ VBA‬أو الماكرو ‪ ،‬وهو يعمل بسلسة مع‬
‫إكسيل ‪ ،‬ويمكنك تنشيط هذا المحرر (‪ ) VBE‬عن طريق الضغط على{ ‪ } Alt+F11‬عندما يكون إكسيل منشطا ‪ ،‬أو عن طريق استخدام‬
‫القوائم من أدوات – ماكرو – محرر فيجوال بيزك ‪ ..‬كما بالشكل التالي ‪:‬‬

‫الشكل يوضح كيفية استدعاء محرر أوامر الفيجوال بيزك( ‪) VBE‬‬

‫أ) شريط القوائم ‪:‬‬


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

‫ب) مستعرض المشروع (‪: ) Project Explorer‬‬


‫نافذة عرض المشروع تعرض شجرة توضح كل المصنفات المفتوحة في ملف إكسيل الحالي ( بما في ذلك المصنفات الضافية والخفية )‬
‫عندما تعمل على ‪ VBE‬تعتبركل المصنفات والضافات المفتوحة كمشاريع ‪ ،‬يمكنك اعتبار أن المشروع هو عبارة عن مجموعة من‬
‫‪ objects‬أو كائنات رتبت حسب مخطط معين ‪.‬‬
‫اضغط على علمة ( ‪ ) +‬الموجودة على يسار اسم المشروع في نافذة عرض المشاريع لتوسيع المشروع ‪.‬‬

‫‪2‬‬
‫ج) نافذة الكواد ( ‪: ) objects‬‬
‫يضم ‪ VBE‬أداة أخرى ‪ ،‬تحتوي على نافذة الكواد ‪ Code window‬أو ‪ ، Module window‬كل ‪ object‬في المشروع يرتبط بنافذة‬
‫أكواد خاصة به ‪.‬‬
‫على سبيل المثال ‪ ،‬للطلع على نافذة أكواد للورقة ‪ ، Sheet1‬انقر نقرا مزدوجا فوق ‪ Sheet1‬في نافذة مستعرض المشروع ‪ .‬وحتى‬
‫تضيف بعض أوامر ‪ VBA‬فإنها ستظل فارغة ‪...‬‬

‫د) مستعرض الكائنات (‪: ( Object Browser‬‬


‫ويضم ‪ VBE‬أداة أخرى ‪ ،‬تحتوي على نافذة الكائنات المتاحة لك خلل المشروع ‪ ،‬للوصول إلى مستعرض الكائنات ‪ ،‬اضغط ‪ F2‬في شاشة‬
‫‪ ، VBE‬أو من قائمة عرض ( ‪ – ) VIEW‬مستعرض الكائنات (‪ ) Object Browser‬القائمة المنسدلة في العلى قائمة تحتوي على‬
‫مكتبة بها جميع وجوه الكائنات المتاحة حاليا ‪ .,.‬إذا كنت ترغب في تصفح كائنات إكسل ‪ ،‬حدد إكسل من القائمة المنسدلة‪.‬‬

‫‪3‬‬
‫هـ ) نافذة الخصائص (‪: ) Properties Window‬‬
‫الشكل يوضح نافذة الخصائص لحد الكائنات بالمشروع ‪ ،‬وهو على سبيل المثال (‪ ) CommandButton1‬أو زر أمر ‪ ، 1‬فعندما تريد‬
‫تغيير عنوان هذا الزر فإنك تغير في إعدادات ‪ Caption‬لهذا الزر وتضع أي عنوان تريده مثل ( اضغط هنا – خروج – حفظ ‪ ) ...‬يمكنك‬
‫ايضا أن تلعب مع بعض الخصائص الخرى مثل الخط ‪ ،‬الطول لون الخلفية العرض ‪ ،‬والرتفاع لتغيير مظهر ‪. CommandButton1‬‬

‫موجز سريع ‪:‬‬


‫آمل أن أكون قد وفقت في الجزء الول في عرض المقدمة وأساسيات البرمجة عن طريق ‪ VBA‬ببرنامج إكسيل ‪ ،‬وعليك أن تفتح محرر‬
‫أوامر بيزك في إكسيل وحاول استعراض الكائنات الخاصة بالمشروعات وتغيير بعض الخصائص ‪...‬‬

‫ومنتظر ردودكم أكمل وال ل لنها بصراحة أول مرة أعمل موضوع بالشكل ده ‪..‬‬

‫‪4‬‬
‫بسم ال الرحمن الرحيم‬
‫وال يا جماعة أحرجتوني كتير جدا بالكلمات الجميلة والهم منها الدعوات اللي فعل أنا محتاجها جدا‬
‫بصراحة مكنتش متخيل الستجابة دي كلها وده اللي هيخليني بإذن ال إن شاء ال أكمل معاكو الدورة لخرها إن شاء ال‬
‫شكرا لكم جميعا وأفكركم بس إني أتعلم معكم تماما ‪ ،‬ول تنسونا من دعواتكم‬

‫الدرس الثاني‬

‫الجزء الثاني ( الماكــرو ‪) Macro‬‬


‫في هذا الجزء سوف تتعلم ‪:‬‬
‫** عملية تسجيل الماكرو ‪..‬‬
‫** كيفية جعل مهمة معينة عملية أوتوماتيكية ‪..‬‬
‫‪ )1‬تسجيل أول ماكرو لك ‪...‬‬
‫يمكنك استخدام مسجل الماكرو الموجود أصل في إكسيل ليترجم إجراءاتك في محرر أوامر ‪ ، VBA‬وبعد انتهاءك من تسجيل الماكرو يمكنك‬
‫أن ترى أكواد هذه العلمية في مستعرض الكواد ‪ ، Module window‬وقبل عملك للماكرو قم بتحديد الخطوات والجراءات والوامر التي‬
‫تريد من الماكرو أدائها ‪ ،‬واعلم جيداً أن أية حركة أو إجراء ولو بسيط تقوم بعمله أثناء تسجيل الماكرو سيتم تسجيله في محرر ‪ VBA‬تلقائيا‬
‫واعتبارها عملية أو أمر من الوامر ‪..‬‬
‫** في هذا المثال ‪ ،‬سنقوم بتسجيل ماكرو يقوم بتحديد لون خلفية الخلية إلى اللون الصفر‪ .‬لتسجيل الماكرو ‪ ،‬اتبع الخطوات التالية ‪:‬‬
‫أ) حدد المدى على ورقة العمل ثم اختر تسجيل ماكرو جديد‪ ( ...‬من قائمة أدوات ثم ماكرو ثم تسجيل ماكرو جديد )‬

‫ب) في مربع حوار تسجيل ماكرو ‪ ،‬أكتب "‪ "SetBackgroundColor‬في مربع نص اسم الماكرو ‪ .‬اترك باقي الخيارات الفتراضية كما‬
‫هي ثم انقر على زر موافق وهذا يبدأ تسجيل الماكرو ‪..‬‬

‫‪5‬‬
‫ج) في لوحة لون التعبئة ‪ ،‬اختر مربع اللون الصفر الفاتح وهذا العمل سوف يحدد اللون الصفر كلون خلفية لمجموعة خليا قمت بتحديدها ‪.‬‬

‫د) ليقاف عملية تسجيل الماكرو ‪ ،‬انقر على زر إيقاف التسجيل (مستطيل أزرق داكن) على شريط أدوات تسجيل ماكرو‪.‬‬

‫نعم أنت الن قمت بعمل ماكرو جديد ‪ ،‬وأعطيته اسم معين ‪ ،‬ومهمة أو إجراء معين يقوم بعمله ‪..‬‬
‫والن فإن الماكرو المسجل قابل للستخدام ويمكنك تشغيله ‪ ،‬وقبل استخدامه دعنا نلقي نظرة على بناء الجملة داخل ‪.. VBE‬‬
‫قم بالضغط على [‪ [Alt[ + [F11‬في نفس الوقت لفتح محرر ‪ ، VBA‬قم بتوسيع مستعرض وحدات المشروع ‪ Module1‬في مجلد‬
‫‪ Project Explorer‬بالنقر على علمة (‪. )+‬‬

‫انقر نقرا مزدوجا فوق مجلد ‪ Module1‬حتى يمكنك أن ترى الماكرو ‪..‬‬
‫وكما يبين الشكل فإن ‪:‬‬
‫‪ -1‬اسم الماكرو هو (‪) SetBackgroundColor‬‬
‫‪ -2‬رقم اللون المختار كخلفية ( ‪) 36‬‬
‫‪ -3‬نمط الخلفية (‪ ) solid‬أي سادة ‪.‬‬

‫ملحظة مهمة ‪:‬‬


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

‫‪6‬‬
‫‪ )2‬تشغيل الماكرو الذي قمت بتسجيله ‪..‬‬
‫يمكننا تشغيل الماكرو داخل ‪ ، VBE‬ولكننا الن سنقوم بتشغيل الماكرو داخل ورقة العمل ‪.‬‬
‫أ) في أي ورقة عمل قم بتحديد نطاق معين ‪..‬‬

‫ب) تشغيل الماكرو المسجل عن طريق اختيار قائمة أدوات ‪ ---‬ماكرو ‪ ---‬وحدات ماكرو أو اضغط على [‪ [Alt[ + [F8‬في نفس الوقت‬

‫ج) يتم عرض مربع حوار ماكرو ‪ .‬ولما كان هناك واحد فقط في وحدات الماكرو ‪ ،‬افتراضيا الماكرو الوحيد ‪ ،‬يتم اختيار‬
‫‪ .SetBackgroundColor‬وهو اسم الماكرو الذي قمنا بتسجيله ‪ ،‬انقر على زر تشغيل لتشغيل الماكرو ‪.‬‬

‫د) سيتم تلوين الخليا الن باللون الصفر الفاتح كما نريد ‪.‬‬

‫‪7‬‬
‫هـ) يمكنك تعديل الماكرو ‪ ،‬وذلك من خلل محرر ‪ ، VBA‬ثم نستعرض أكواد الماكرو ( نافذة الكواد ) ومن ثم نعدل في البرمجة الخاصة بهذا‬
‫الماكرو ففي مثالنا هذا يمكننا تغيير ‪ ColorIndex = 3‬أي أن اللون بدل من أن يصبح أصفر فاتح يصبح أحمر مثل ‪.‬‬
‫و) يمكننا كذلك أن نضيف ماكرو في شريط الدوات ‪ ،‬وذلك من خلل عمل زر أمر ( قائمة عرض ‪ –View‬أشرطة الدوات ‪– Toolbars‬‬
‫‪ --‬مربع أدوات التحكم ‪ ، ) .Control Toolbox‬ثم بعد ذلك اختيار زر أمر ‪ ،‬وبعد ذلك عمل هذا الزر على ورقة العمل ‪ ،‬بمجرد عمل هذا‬
‫الزر سيطلب البرنامج تعيين ماكرو من قائمة وحدات الماكرو ليكون الخاص بهذا الزر ( أي أننا نخصص ماكرو معين يتم تشغيله بمجرد‬
‫الضغط على هذا الزر )‬

‫ز) يمكنك بعد ذلك تغيير اسم الزر ‪ ،‬أو حتى الدخول إلى ‪ VBE‬عن طريق هذا الزر وتعديل الماكرو كل ذلك عن طريق الضغط بالزر اليمن‬
‫للفارة على زر المر واختيار تحرير النص لتغيير اسم الزر ‪ ،‬أو تعيين ماكرو وبعدها تحرير لتدخل في ‪. VBE‬‬

‫ح) الن بمجرد ضغطك على زر المر فإنك تعطي أمر بتشغيل الماكرو الذي سجلته ‪.‬‬

‫‪8‬‬
‫ملحوظات هامة ‪:‬‬
‫‪-1‬يمكنك استخدام ماكرو التنفيذ المتكرر ‪ ،‬وذلك بإضافة سطر أمر لكود الماكرو كالتالي ‪ActiveCell.Offset)1,0(.Select :‬‬

‫عند النقر على الزر الن فإنه بعد تنفيذ أمر تغيير اللوان للخليا النشطة فإنه سينزل صف واحد لسفل …‬

‫‪ -2‬لماذا في بداية تسجيل الماكرو قمنا بتحديد أي نطاق أول وبعد ذلك قمنا بما فعلناه من خطوات ؟ ذلك أننا بذلك أعطينا أمر للماكرو بأن يتم‬
‫التطبيق فقط على الخليا النشطة من ورقة العمل ‪.‬‬

‫‪ )3‬الملخص ‪..‬‬
‫هكذا قمنا بعمل ماكرو ‪ ،‬وتشغيله ‪ ،‬وربطه بزر على ورقة العمل ‪ ،‬وقمنا بالتنفيذ المتكرر ‪.‬‬

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

‫‪9‬‬
‫السلم عليكم ورحمة ال‬
‫أخواني العزاء نستكمل مع بعض سلسلة الدروس‬

‫( ‪ Collection Objects and Objects‬الجزء الثالث ( الكائنات ومجموعات الكائنات في إكسيل‬

‫‪ :‬في هذا الجزء سوف تتعلم التالي‬


‫‪ ) Objects ( .‬الجسام – الكائنات *‬
‫‪ VBA ) VBA Collection Objects ( .‬مجموعة كائنات *‬
‫‪ ) The Application Object ( .‬كائنات التطبيق *‬
‫‪ ) Workbook and Window Objects ( .‬كائنات المصنف والويندوز *‬
‫‪ ) The Worksheet Object ( .‬كائنات ورقة العمل *‬
‫‪ ) The Range Object ( .‬كائنات النطاق – المدى *‬
‫؟‪ ) Objects ( ..‬ما هي الكائنات (‪1‬‬
‫من السهل جدا فهم ذلك ‪ ،‬يمكنك العتقاد بأن الكائنات هي برامج حاسوبية منفصلة ( وقد تكون مشتركة ) تقوم بأداء وظائف محددة متاحة‬
‫للستخدام المتكرر في برامجك الخاصة ‪ .‬والكائنات أو الجسام تعتبر ديناميكية في ذلك أي أنها تتمتع بسهولة الستخدام والمرونة في‬
‫‪ .‬معالجتها عن طريق الكواد باستخدام معايير مختلفة لذلك‬
‫نأخذ على سبيل المثال ( السيارة ) ‪ ،‬يمكن وصفها بحجمها ولونها والشركة المصنعة لها ( من بين معايير أخرى بالطبع ) وقد نصف السيارة‬
‫بأنها ذات دفع رباعي أو رياضة إلخ ‪ ،...‬وكل ذلك بالضافة إلى اللون والحجم والشركة تعتبر وصف للسيارة ‪ ،‬وبالتالي فكل هذه الصفات هي‬
‫‪ .‬للسيارة ‪ Properties‬خصائص‬
‫والسيارة يمكنها أن تؤدي العديد من الجراءات مثل أن تسير في اتجاه مباشر أو تدور ‪ ،‬والتحرك والدوران تعتبران أفعال من خللها تعرف‬
‫للسيارة ‪ ،‬وأخيرا فإن السيارة مصنوعة من كائنات ‪ Methods‬المهام التي يمكن للسيارة القيام بها ‪ ،‬أي أن التحرك والدوران يعتبران طرق‬
‫أخرى مثل الطارات والهيكل وغيرهما ‪ .‬هذه الكائنات بدورها لها خصائص وطرق لتؤدي عملها ‪ ،‬فإطارات السيارة مثل لها قطر معين‬
‫وقابلية للدوران وكذلك الهيكل مصنوع من اللومنيوم أو التيتانيوم ‪ ،‬وبذلك فإن خامة الطارات تعتبر من الخصائص وقابليتها للدوران تعتبر‬
‫من طرق عمل الطارات ‪ ،‬لذا فإنك تستطيع أن ترى أن هناك نوع من التسلسل الهرمي للكائنات في السيارة وكائنات أو مكونات السيارة‬
‫‪ .‬نفسها تقع في قمة الهرم الوظيفي‬
‫في إكسيل أنا متأكد من أنك على دراية بالكثير من الكائنات ‪ ،‬فهناك كائنات للمصنف ككل وكائنات لورقة العمل وكائنات للمدى والنطاق‬
‫‪ BVA .‬هي لبنات لبناء برنامج بـ ‪ Objects‬وكائنات للرسم البياني وغيرها الكثير والكثير ‪ ،‬هذه الكائنات‬

‫( ‪ VBA ..) VBA Collection Objects‬أ) مجموعة كائنات‬


‫يمكنك التفكير بالسيارة ‪ ،‬اللون والحجم والشركة والطارات والهيكل كلها كائنات منفصلة في ذاتها ‪ VBA‬لفهم ما هي مجموعة كائنات‬
‫‪ .‬هي عبارة عن مجموعة الكائنات المختلفة في البرنامج ‪ VBA‬ولكنها كلها مجتمعة عبارة عن السيارة ‪ .‬ولذلك فإن مجموعة كائنات‬
‫على سبيل المثال فإن أي كائن لورقة العمل يتبع لكائنات المصنف ككل ‪ ،‬وكذلك فإن مجموعة كائنات المصنفات تشمل مجموع كائنات كل‬
‫المصنفات المفتوحة ‪ ،‬والشكل أسفل يبين نافذة إكسيل بها ثلث مصنفات مفتوحة أي أن مجموعة كائنات المصنفات في الشكل عبارة عن‬
‫‪ ..‬مجتمعة ‪ book1+book2+book3‬جميع الكائنات الموجودة في‬

‫‪10‬‬
‫التسلسل الهرمي للجسام والكائنات في إكسيل‬

‫تطبيق ‪Application‬‬
‫المصنفات ‪Workbooks‬‬
‫المصنف ‪Workbook‬‬
‫صفحات ‪Sheets‬‬
‫ورقة عمل ‪Worksheet‬‬
‫نطاق ‪Range‬‬

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

‫‪ The Application Object .‬ب) كائنات التطبيق‬


‫كائنات التطبيق تقع في قمة التسلسل الهرمي لنها تمثل كائنات كامل تطبيق إكسيل ‪ ،‬كما أنها على مستوى عال وفريد من البرمجة ولذلك فإنه‬
‫ومع ذلك هناك عدد قليل من الظروف المعينة التي تحتم استخدام أكواد برمجية في معالجة ‪ VBA .‬نادرا ما تحتاج إلى معالجة من خلل‬
‫‪ VBA .‬كائنات التطبيق ‪ **.‬على سبيل المثال فإن خصائص الطول والعرض لبرنامجك تحتم إعداد حجم نافذة الكسيل من خلل أكواد‬
‫‪ :‬ويمكنك معالجتها كالتالي‬

‫‪CODE‬‬
‫‪Application.Width = 800 ‬‬
‫‪Application.Height = 550‬‬

‫‪11‬‬
‫‪ :‬ومثال آخر ‪ ،‬فإنك قد ترغب في إخفاء شريط الصيغ ‪ ،‬ويكون كذلك **‬

‫‪CODE‬‬
‫‪Application.DisplayFormulaBar = False‬‬

‫عموما أنت بحاجة لستخدام كائنات التطبيق في أغلب الحيان لتحديد الخصائص المتعلقة بمظهر برنامج إكسيل ‪ ،‬منها ما هو مبين أعله أو‬
‫‪ :‬كالتالي‬

‫‪CODE‬‬
‫ليقاف عملية الحسابات التلقائية وجعلها يدويا ‪Application.Calculation = xlManual‬‬
‫ليقاف عملية تحرير الخليا ‪Application.EditDirectlyInCell = False‬‬
‫لتحديد مسار الملفات الفتراضي”‪Application.DefaultFilePath = “D:\My Documents‬‬

‫‪ ..‬كما قد تكوت في حاجة إلى تصفية كائنات التطبيق ( مفيدة جدا ) لضمان سرعة العمل ‪-‬‬

‫‪CODE‬‬
‫‪Application.ScreenUpdating = False‬‬

‫‪ The Workbook and Window Objects.‬ب) كائنات المصنفات وكائنات النوافذ‬


‫قد ل تكون على دراية بكائنات النوافذ ‪ ،‬فكائنات النوافذ تشير إلى جميع النوافذ داخل نفس المصنف أو البرنامج الحالي ‪ ،‬فداخل تطبيق إكسيل‬
‫فإن نافذة مجموعة كائنات تحتوي على كل نوافذ المصنفات المفتوحة ‪ ،‬ونافذة الكائنات تفهرس وفقا لطبقاتها ‪ ،‬ففي الشكل السابق يمكنك‬
‫‪ :‬عن طريق الكود التالي ‪ BOOK2‬استرجاع‬

‫‪CODE‬‬
‫‪Application.Windows(2).Activate‬‬

‫إلى مقدمة الطبقات فإن ‪ BOOK2‬يعتبر في منتصف كائنات نوافذ المصنفات الثلثة المفتوحة ‪ ،‬فبعد أن يتم استرجاع ‪ BOOK2‬وذلك لن‬
‫هذا ‪ Windows Collection Objects،‬من شأنها أن يتغير مؤشرها أو فهرستها إلى الرقم ( ‪ ) 1‬عند استخدام نافذة مجمع الكائنات‬
‫‪ Workbooks collection object .‬باستخدام مجمع كائنات المصنفات ‪ BOOK2‬يختلف عن الوصول إلى‬
‫عن طريق مثال ‪ ،‬ل يوجد غير عدد ‪ Workbooks collection Object‬دعونا نلقي نظرة أكثر تفحصا لمجمع كائنات المصنفات ‪-‬‬
‫مباشرة ‪ ،‬قم بإضافة ‪ Functions‬كما أن مهامها ووظائفها ‪ Workbooks collection Object‬قليل ومحدود من خصائص وطرق‬
‫‪ :‬الكود التالي للمصنف‬

‫‪CODE‬‬
‫)(‪Public Sub exampleWorkbooks‬‬
‫‪Dim j As Integer‬‬
‫‪For j = 1 To 3‬‬
‫‪Workbooks.Add        ‘add a new workbook‬‬
‫‪Next j‬‬
‫‪Workbooks(Workbooks.Count).Activate      ‘activate book3‬‬
‫‪End Sub‬‬

‫‪12‬‬
‫مجهول ‪- Dim ..........‬‬
‫عدد صحيح تام ‪- Integer .....‬‬
‫عن طريق قائمة الماكرو في الكسيل ‪ ،‬سوف ترى على الفور ثلث ‪ exampleWorkbooks‬لتنفيذ هذا الجراء عليك أن تختار ‪-‬‬
‫‪ BOOK3 .‬مصنفات جديدة فتحت في إكسيل ‪ ،‬وبعد ذلك سيتم تنشيط‬
‫()‪ )the Add)( method, Count property and the Activate‬هذه طريقة مباشرة نسبيا ‪ ،‬وقد شاهدت أنت اثنين مثلها ‪-‬‬
‫عامة فإن جميع هذه الساليب والمعالجات للجزاء المكونة للعمليات المبرمجة فإنها سوف توضح بشكل أكثر تفصيل لحقا ‪method(. ،‬‬
‫تشترك في كثير من الخصائص والطرق ‪ collection objects‬مع مختلف الكائنات الخرى ‪ ،‬سوف تجد أن كثيرا من الكائنات المجمعة‬
‫هذا ليس غير اعتيادي ويجب أن تدرك أنه يتوقف على الكائن الذي تقوم باستخدامه ‪ ،‬والمعايير التي ‪properties and methods ،‬‬
‫‪ .‬إما أن تكون متاحة أو مطلوبة لتلك المكونات قد تختلف‬
‫في كائنات المصنفات ‪ ،‬والكود يمكن وضعه في موديول ()‪ close‬التالية ‪ ،‬التي توضح كيفية استخدام طريقة ‪ VBA‬أنظر في إجراءات‬
‫‪ :‬الكائن أو القياسي‬
‫‪CODE‬‬
‫)(‪Public Sub CloseWorkbooks‬‬
‫‪Workbooks(Workbooks.Count).Close SaveChanges:=False‬‬
‫‪Workbooks(1).Close SaveChanges:=False‬‬
‫‪End Sub‬‬

‫‪ .‬وسيقوم الجراء بإغلق أول وآخر مصنف مفتوح في إكسيل دون دفع المستخدم لحفظ التغييرات‬
‫وليس في مجموعة كائنات المصنفات ‪ Workbook Object ،‬استخدمت في كائنات المصنفات ()‪ close‬في المثال أعله طريقة ‪-‬‬
‫()‪ close‬إذا كنت ترغب في إغلق جميع المصنفات في وقت واحد يجب عليك استخدام ‪Workbooks collection object ،‬‬
‫‪ ....‬مع مجموعة كائنات المصنفات ‪method‬‬
‫‪ ..‬الكود أدناه سيغلق مجموعة المصنفات ‪-‬‬

‫‪CODE‬‬
‫‪Workbooks.Close‬‬

‫في هذه الحالة لن تكون هناك خيارات متاحة ‪ ،‬ولذلك سيكون المستخدم حازما وجادا في إنقاذ المصنف المحدد حاليا ‪..‬‬

‫**** آسف جدا لعدم اكتمال هذه الجزئية ‪ ،‬ذلك أنني فعل مشغول جدا هذه اليام عامة ‪ ،‬سوف ألحق الجزء الباقي من هذا الدرس في أقرب‬
‫وقت ممكن وهو << ( كائنات ورقة العمل ‪ ،‬طرق وخصائص ورقة العمل ‪ ،‬كائنات المدى ‪ ،‬استخدام خواص الخليا ‪ ،‬طرق وخصائص المدى‬
‫( الخليا والصفوف والعمدة ) >>‬
‫**** كما أرجو من العضاء جميعه أن يسامحوني على سوء الملء والترجمة حاولت جاهدا ذلك ‪ ،‬وأي عضو شايف غلطة أو توضيح يا‬
‫ريت ميبخلش بيه لنني سوف أضع في نهاية الدورة هذه الملفات تحت استخدامكو ان شاء ال ‪ ...‬وال المستعان‬

‫‪13‬‬
‫الخوة العزاء الفاضل‬
‫نستكمل سويا الجزء الثاني من الجزء الثالث من الدورة ‪3/2‬‬
‫‪ The Worksheet Object .‬د) كائنات ورقة العمل‬
‫تندرج كائنات ورقة العمل تحت كائنات المصنفات في التسلسل الهرمي لمجموعة كائنات برنامج إكسيل ‪ ،‬للتحقق من بعض أحداث ورقة العمل‬
‫‪ workbook :‬في المصنف ‪ sheet1‬للورقة الولي ()‪ SelectionChange‬فقد أضيفت الكواد التالية إلى أحداث‬

‫‪CODE‬‬
‫)‪Private Sub Worksheet_SelectionChange(ByVal Target As Range‬‬
‫‪Dim msgOut As String‬‬
‫‪msgOut = “The name of this worksheet is “ & Worksheets(1).Name‬‬
‫)‪MsgBox (msgOut‬‬
‫‪Worksheets(2).Select‬‬
‫‪End Sub‬‬

‫الخاص بورقة العمل ‪ ،‬وهذا الحدث أو الجراء يفعل حينما يقوم المستخدم ‪ module‬توجد في الـ ()‪ SelectionChange‬إن إجراءات‬
‫هو نطاق يمثل خليا يقوم المستخدم ()‪ SelectionChange‬بتغيير الختيارات الحالية لورقة العمل ‪ ،‬اعلم أن الهدف من إجراء حدث‬
‫‪ .‬بتحديدها ‪ ،‬وسوف نقوم قريبا بشرح كائنات المدى بالتفصيل ولكن لنتجاهلها الن لن مثالنا ل يعتمد عليها‬
‫وتم تعيين قيمتها بـ ( اسم ورقة ‪ String‬مباشر وصريح ‪ ،‬أول ‪ .‬قمنا بتعيين سلسلة متغيرة ()‪ SelectionChange‬الكود في إجراء‬
‫العمل هذه هو ) وهي بدورها متسلسلة مع اسم ورقة العمل التي تم الحصول عليها من خصائص كائنات ورقة العمل ‪ ،‬وكامل مسار الكائن ل‬
‫يستخدم لعادة تسمية ورقة العمل ‪ ،‬وفي هذا الكود فإنه لن يتم تنفيذه إل عندما يقوم المستخدم بإحداث تغيير في ورقة العمل الولى‬
‫من مجمع كائنات أوراق العمل ‪ .‬لذا فإن مسار الكائن يتنقل خلل كائنات المصنف ‪ .‬وهذا هو السبب في إمكانية استخدام أرقام ‪sheet1‬‬
‫فهرسة مع خصائص أوراق العمل داخل كائنات المصنف من دون اهتمام لرجاع الورقة الخاطئة ‪ ،‬وبعد عرض السلسلة في مربع الرسالة فإن‬
‫‪ .‬لكائنات ورقة العمل تستخدم لتحديد ورقة العمل الثانية في مجموعة كائنات ورقة العمل ()‪ Select‬طريقة‬
‫لمجموعة إجراءات الورقة الثانية ‪ .‬ويتم تنفيذ إجراء تفعيل الورقة الثانية وبعد ذلك فإن الكود قد أضيف إلى()‪Worksheet_Activate‬‬

‫‪14‬‬
‫والكود ‪ )Worksheets)2(.Select( ،‬بعد أن يقوم المستخدم أول باختيار ورقة العمل ‪ ،‬أو في هذه الحالة يتم اختيارها بالكود البرمجي‬
‫‪ ...‬في الساس هو نفس الكود السابق‬

‫‪CODE‬‬
‫)(‪Private Sub Worksheet_Activate‬‬
‫‪Dim msgOutput As String‬‬
‫‪msgOutput = “This worksheet is “ & Worksheets(2).Name‬‬
‫)‪MsgBox (msgOutput‬‬
‫‪End Sub‬‬

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

‫‪ Methods and Properties of the Worksheet‬هـ) الطرق وخصائص ورقة العمل‬


‫يمكنك أن ترى ‪ 11‬خاصية من خواص ورقة العمل في نافذة عرض الخصائص ‪ ،‬هذه الخصائص ‪ VBA ،‬اختر ورقة في نافذة مشروع‬
‫‪ .‬متى أردت ذلك ‪ VBA‬تعطيك إمكانية تحديد القيم الخاصة بالكائن مع بداية عمل البرنامج ويمكنك تعديلها بعد ذلك من خلل إجراءات‬
‫‪ :‬هناك ‪ 3‬خصائص من خصائص ورقة العمل ستحتاجها في أغلب الحيان ‪-‬‬
‫‪ Name‬السم ( السم بين قوسين ) ‪ ....‬السم ‪1-‬‬
‫‪ caption‬السم ( بدون أقواس ) مثل عنوان الصفحة الذي يظهر على تبويب إكسيل ‪ ...‬العنوان مثل ‪2-‬‬
‫‪ .... visible property‬والصفات المرئية ‪3-‬‬
‫‪ .‬لتغيير عنوان يمكنك ذلك عن طريق نافذة الخواص ‪ ،‬أو في الكسيل عن طريق النقر بالزر اليمن ثم إعادة تسمية ‪-‬‬
‫‪ :‬يمكنك تغيير عنوان ورقة العمل بالكود التالي ‪-‬‬

‫‪CODE‬‬
‫"‪Worksheets("Sheet1").Name= "Good‬‬

‫أي أن تكون ( ‪ ) true & false‬يمكنها أن تكون قيمة من ‪ 3‬قيم ممكنة ( أي ‪ 3‬اختيارات لها ) ‪ ،‬أول قيمتين هما ‪ visible‬خاصية ‪-‬‬
‫‪ :‬الورقة ظاهرة أو مخفية كالتالي‬
‫‪CODE‬‬
‫‪Worksheets("Good ").Visible= True‬‬
‫‪Worksheets("Good 1").Visible= False‬‬

‫تذكر أن الدوال التي في الخليا يتم حسابها حتى ولو كانت صفحاتها مخفية ‪ ،‬ولكن قبل أن تتمكن من فعل أي شيء برمجيا عليك أول أن ‪-‬‬
‫‪ :‬تقوم بتغيير وضع الورقة من مخفية إلى ظاهرة‬
‫‪CODE‬‬
‫‪Worksheets("Good ").Visible = True‬‬
‫‪Worksheets("Good "). Select‬‬
‫‪Range(“A1”).Value = 10‬‬

‫‪15‬‬
‫‪ :‬هي أن تكون الورقة مخفية للغاية بمعنى ‪ visible‬القيمة الثالثة التي يمكن أن تأخذها خاصية‬
‫‪CODE‬‬
‫‪Worksheets("Good ").Visible = xlVeryHidden‬‬

‫في هذه الحالة ليس فقط ستكون ورقة العمل مخفية ولكنك حتى لن ترى اسمها ضمن أسماء ورقات العمل حتى لو ذهبت إلى‬
‫ل يمكن أن تتغير إل ‪ value xlVeryHidden‬فإنك لن تجدها ضمن أسماء أوراق العمل ‪ ،‬حيث أن ( ‪)Format/Sheets/Unhide‬‬
‫يمكنه تغيير الكود ومن ثم معاينة الورقة ‪ ،‬فلو كانت أكوادك محمية ‪ VBA‬برمجيا ‪ ،‬وهذا يعني أن المستخدم فقط الذي يمكنه الوصول إلى‬
‫بكلمة مرور فإن المستخدم الذي يعرف كلمة المرور فقط هو الذي يمكنه الوصول إلى الكواد والتعديل فيها ‪ ،‬ويمكنك استخدام الخاصية‬
‫لخفاء المعلومات السرية ( كتفاصيل البطاقات الئتمانية ‪ ،‬والبيانات الشخصية ) أو حتى إخفاء أوامر أو إجراءات ل تريد ‪Visible‬‬
‫‪ .‬المستخدم أن يعدل فيها‬

‫‪CODE‬‬
‫‪Worksheets("Good ").Visible = True‬‬
‫‪Worksheets("Good "). Select‬‬
‫‪Range(“A1”).Value = 10‬‬

‫‪ :‬وأخفها مرة أخرى‬


‫‪CODE‬‬
‫‪Worksheets("Good ").Visible = xlVeryHidden‬‬

‫‪ .‬تذكر أن المعادلت والصيغ التي تشير إلى خليا تقع داخل الوراق المخفية تعمل حتى ولو كانت أورارق العمل مخفية للغاية‬
‫‪ :‬قد ترغب في حذف أوراق أو صفحات فهذا هو الكود‬

‫‪CODE‬‬
‫‪Worksheets("Good ").Delete‬‬

‫وقد ترغب بإضافة صفحات جديدة‬


‫‪CODE‬‬
‫‪WorkSheets.Add‬‬

‫بإضافة ورقة جديدة قبل الورقة النشطة ‪ VBA‬وهنا سيقوم‬


‫‪ :‬أما إذا كنت أكثر تحديدا أين تضيف وكم تضيف من أوراق ‪ ،‬فستستخدم أحد الجراءات التالية‬
‫‪ :‬سيكون الكود هكذا ‪ Good‬لو كنت تود إضافة ورقة قبل ورقة اسمها‬

‫‪CODE‬‬
‫)(‪Sub exercise2‬‬
‫)"‪    Sheets.Add after:=Sheets("Good‬‬
‫‪End Sub‬‬

‫‪16‬‬
‫‪ :‬سيكون الكود هكذا ‪ Good‬لو كنت تود إضافة ‪ 3‬ورقات قبل ورقة اسمها‬
‫‪CODE‬‬
‫)(‪Sub exercise2‬‬
‫‪    Sheets.Add after:=Sheets("Good "), Count:=3‬‬
‫‪End Sub‬‬

‫‪ :‬إضافة ورقة في بداية المصنف ‪ ،‬لحظ اختفاء علمة القتباس عند الشارة إلى ترتيب الورقة‬
‫‪CODE‬‬
‫)(‪Sub exercise2 ‬‬
‫)‪    Sheets.Add after:=Sheets(1‬‬
‫‪End Sub ‬‬

‫واستخدام القيمة ( قيمة العدد ) كرتبة ‪ Sheets.Count ،‬وإذا كنت تريد إضافة ورقة بآخر المصنف ‪ ،‬عليك بعد ورقات العمل عن طريق‬
‫‪ :‬للورقة الجديدة التي تريد إضافتها‬
‫‪CODE‬‬
‫)(‪Sub exercise2 ‬‬
‫)‪    Sheets.Add After:=Sheets(Sheets.Count‬‬
‫‪End Sub‬‬

‫‪ .....‬لحظ أننا استعضنا عن رقم او رتبة او ترتيب الورقة بتعداد أوراق العمل‬

‫‪ The Range Object ...‬و) كائنات النطاق أو المدى‬


‫يمكنك استخدام كائنات المدى التي تمثل مجموعة من خلية أو أكثر من خلية متجاورة في ورقة عمل إكسيل ‪ ،‬وهذا مفيد للغاية ‪ ،‬لن هذا‬
‫يسمح لنا باستغلل خصائص خلية أو مجموعة من الخليا في ورقة العمل ‪ ،‬قد تجد نفسك تقوم باستخدام كائنات المدى في كل برنامج تكتبه‬
‫‪ .‬لتطبيق إكسيل ‪ VBA‬عن طريق‬
‫‪ :‬أنظر إلى تلك المثلة من الكواد التي تستخدم كائنات المدى‬
‫‪CODE‬‬
‫”‪Range(“B1”).Value=”Column B‬‬
‫‪Range(“B1:G1”).Columns.AutoFit‬‬
‫‪Range(“B1:C1”, “E1:F1”).Font.Bold = True‬‬

‫‪ -‬مدى أو النطاق ‪ Range‬يعتبر مثال على مجمع كائنات ‪ VBA‬التي ل تستخدم صيغة الجمع في الشارة إلى المدى ‪ ،‬بمعنى أن ‪Range‬‬
‫عبارة عن مجموعة خليا حتى ولو كانت خلية واحدة ‪.‬‬
‫‪ -‬لحظ أن المسار الطويل للكائنات قد حذف في المثلة أعله ‪ ،‬ومن ثم فإن أسطر الكواد المذكورة بأعلى ستعمل على ورقة العمل الحالية ‪-‬‬
‫‪ -‬السطر الول == يدرج النص (‪ ) Column B‬في الخلية ‪ ، B1‬وذلك عن طريق خاصية تحديد القيمة للكائن ‪ .‬فخصائص كائنات النطاق‬
‫استخدمت لرجاع القيمة لخلية واحدة كما في هذا المثال ‪ ،‬لقد شاهدت بالفعل العديد من المثلة عن خصائص القيمة سابقا ‪Value‬‬
‫‪ property‬على الرغم من وجود خصائص قيمة للعديد من الكائنات ‪ ،‬فإن كائنات المدى هي الكثر شيوعا ‪.‬‬
‫‪ -‬السطر الثاني == عند استخدام الطريقة التلقائية ‪ AutoFit)( method‬لتعديل ضبط العمدة في مدى معين ‪ ،‬فإنك بذلك تسمح بعرض‬
‫محتويات الخليا كاملة دون تداخل في العمدة المجاورة ‪ ،‬وهذا يعادل استخدام القوائم في الكسيل ‪... Format, Column, AutoFit‬‬
‫‪ -‬السطر الثالث والخير == يقوم بتحديد شكل الخط إلى أسود من خلل خاصية الخط ‪ Font Object‬وتطبيقها على نطاقين من الخليا في‬
‫ورقة العمل النشطة ‪ ،‬والنطاقان هما (‪ ، ) B1:C1 ، E1:F1‬ومسموح لك فقط بإرجاع نطاقان اثنين فقط كحد أقصى ‪ ،‬وإضافة نطاق ثالث‬
‫إلى القوسين يرجع القيمة الخطأ ‪. run-time error‬‬
‫‪ -‬المثلة أعله وضحت طريقتين فقط من طرق استخدام خصائص كائنات المدى (‪ ، ) AutoFit)(, Columns, and Font‬وإذا كنت‬
‫من المستخدمين العاديين لكسيل فإنك تعتقد أن هناك العديد من الطرق وغيرها من الخصائص المتعلقة بتنسيق خليا جداول البيانات ‪.‬‬
‫‪ -‬تسجيل الماكرو هي الطريقة السرع والسهل لتوليد الكواد التي تحتاج إليها دون البحث عن الوثائق التي تصف الكائنات وخصائصها ‪،‬‬
‫وطرقها ‪ ،‬فبعد تسجيلك للماكرو في موديول منفصل (‪ ، ) separate module‬يمكنك مسح الكواد المسجلة ومن ثم نسخ ولصق الكواد‬

‫‪17‬‬
‫التي تحتاج إليها في برنامجك ‪.‬‬

‫هذا وميعادنا إن شاء ال في الجزء الثالث من الجزء الثالث وهو عن ( استخدام خصائص الخليا وطرق ووسائل المدى وترحيل البيانات )‬
‫فانتظرونا فلدينا المزيد بإذن ال‬
‫والسلم عليكم ورحمة ال وبركاته‬
‫===================================================================‬
‫بسم ال الرحمن الرحيم‬
‫نستكمل أيها الخوة الفاضل الجزء الثالث من الجزء الثالث ‪3/3‬‬

‫‪ ... Using the Cells Property‬استخدام خصائص الخليا (‪I‬‬


‫إن النموذج الخاص بكائنات إكسيل ل يحتوي على كائنات الخلية ‪ ،‬بمعنى أنه للشارة إلى خلية محددة فإنك تستخدم خصائص الخليا أو‬
‫خصائص النطاق ‪ ،‬إن خصائص الخليا تُرجِع كائنات النطاق المشتملة على كل ( بل تحديد ) أو واحدة ( بتعيين الصف والعمود ) من خليا‬
‫الورقة النشطة ‪ ،‬عندما تشير إلى أو ترجع كل خليا الورقة فإنه يجب عليك فقط استخدام خصائص الخليا مع كائنات البرنامج وورقة العمل‬
‫‪ ... :‬فعلى سبيل المثال‬

‫‪CODE‬‬
‫‪Cells(2,2).Select‬‬

‫في ورقة العمل ( ‪ ) B2‬هنا فقد اخترت الخلية‬


‫لختيار أو إرجاع خلية في ورقة العمل يجب أن تحددها عن طريق فهرسها أو دليلها ‪ ،‬الفهرس يمكن أن يكون قيمة واحدة تبدأ من الخليا ‪-‬‬
‫فإننا يمكننا ذلك عن ‪ D5 ،‬في أعلى يسار ورقة العمل ( أو أعلى اليمين في النسخة العربية ) ‪ ،‬على سبيل المثال لرجاع القيمة ‪ 5‬للخلية‬
‫‪ :‬طريق إما إرجاع فهرس الخلية أو بمدلول الصف والعمود ( مستحسن ) كالتالي‬

‫‪CODE‬‬
‫‪Cells(1, 4).Value=5‬‬
‫‪Cells(1, ”D”).Value =5‬‬

‫على حد سواء لورقة العمل ( ‪ ) D1‬وذلك هو التدوين المألوف خلل هذه الدورة ‪ ،‬كل الكودين السابقين سيقومان بإرجاع القيمة ( ‪ ) 5‬للخلية‬
‫النشطة ‪ ،‬كذلك يمكنك استخدام الرقام أو السلسل المرجعية في الشارة إلى العمود ‪ ،‬ولحظ أن الشارة إلى العمود تأتي بعد الشارة إلى‬
‫الصف في المثالين ويفصل بينهما فاصلة ( ‪ ) ,‬وأنا أوصي باستخدام الطريقة الثانية بالمثال أعله حيث أنها تتجنب الغموض في الشارة إلى‬
‫العمود ‪ ،‬وقد تكون الشارة الرقمية أحسن في بعض الحوال كما سيتبين فيما بعد ‪ ،‬ومع بعض المثلة على استخدام خصائص الخليا في‬
‫‪ :‬كائنات النطاق‬

‫‪CODE‬‬
‫‪Range(“C5:E7”).Cells(2, 2).Value = 100‬‬
‫‪Range(“C5:E7”).Cells(2, “A”).Value = 100‬‬

‫قد تؤدي تلك الكواد إلى بعض التخبط لديك لنها تبدو وكأنها ترجع إلى نطاقين مختلفتين ‪ ،‬إل أن المكر ليس كذلك ‪ ،‬ولكن يمكنك استخدام‬
‫‪ .‬هذه المثلة لتوضيح كيف تعمل خصائص الخليا‬
‫( ‪ ) B2 ( ، ) A2‬قبل القراءة ‪ ،‬خمن أول ما هي الخلية في ( ورقة العمل ) التي ستأخذ القيمة ( ‪ ) 100‬في كل الكودين ‪ ،‬إذا خمنت أنهما ‪-‬‬
‫على التوالي عند استخدام أسطر ( ‪ ) D6 ( ، ) A6‬على التوالي فأنت على خطأ ‪ ،‬فبدلً من ذلك ‪ ،‬فإن القيمة ( ‪ ) 100‬ستكون في الخليتين‬
‫فأصبح النطاق ‪ )“C5:E7”( ،‬الكواد بأعلى ‪ ،‬لماذا ؟؟ لن خصائص الخليا استخدمت كائنات نطاق كمرجعية وليس كائنات ورقة العمل ككل‬
‫لو كان النطاق عبارة عن ورقة العمل ‪ ،‬أما في المثال أعله ‪ B2‬الحالي كورقة العمل كاملة ‪ ،‬ولذلك فإن الخلية (‪ )2 ,2‬كانت لتشير إلى الخلية‬

‫‪18‬‬
‫( ‪ ) D6‬أي الصف السادس والعمود الرابع بورقة العمل ( ‪ ) C5:E7‬فإنها تشير إلى الصف الثاني والعمود الثاني داخل النطاق‬
‫وباستخدام السلسلة في خصائص الخلية في الفهرس في المثال الثاني لتقوية اختيار العمود بغض النظر عن النطاق المختار ‪ ،‬يظل الصف ‪،‬‬
‫‪ ) A6 ( .‬كما هو داخل النطاق ‪ ،‬ولكن العمود تم تحديده خارج النطاق ولذلك فإن الفهرس يشير إلى الخلية‬

‫‪ ( ... Method and Properties Range )Cells, Rows and‬طرق ومجموعة خصائص ( الخليا والصفوف والعمدة (‪II‬‬
‫(‪Columns‬‬
‫‪ :‬إليك بعض الكواد للتجول خلل كائنات النطاق‬

‫‪• Selection , ActiveCell‬‬


‫يشكل ما تم تحديده واختياره ‪ ،‬فيمكن أن يكون خلية مفردة ‪ ،‬أو مجموعة خليا أو صف أو عمود أو العديد من هذه ‪ Selection‬إن الكائن ‪-‬‬
‫‪ :‬فعلى سبيل المثال‬

‫‪CODE‬‬
‫‪Range("A1:A50").Select‬‬
‫‪Selection.ClearContents ‬‬

‫‪ ( .‬قيم أو صيغ ) ‪ A50‬إلى ‪ A1‬هذا الكود يقوم بإزالة محتويات الخليا من‬
‫‪ .‬فهو عبارة عن فكرة مهمة جدا سوف تحتاج لتذكرها عندما تبدأ بتطوير إجراءات أكثر تعقيداً ‪ ActiveCell‬أما ‪-‬‬

‫‪• Range, Select‬‬


‫‪ ..‬لتحديد خلية ‪-‬‬

‫‪CODE‬‬
‫‪Range("B1").Select ‬‬

‫‪ ..‬لتحديد خليا متجاورة ‪-‬‬

‫‪CODE‬‬
‫‪Range("A1:A5").Select‬‬

‫‪ ..‬لتحديد خلل غير متجاورة ‪-‬‬

‫‪CODE‬‬
‫‪Range("C1,E5,F6").Select‬‬

‫‪• Columns, Rows, Select, EntireRow, EntireColumn‬‬


‫‪ ..‬لتحديد عمود ‪-‬‬

‫‪CODE‬‬
‫‪Columns("A").Select‬‬

‫‪19‬‬
- ‫ لتحديد مجموعة من العمدة المتجاورة‬...

CODE
Columns("A:B").Select

- ‫ لتحديد أعمدة غير متجاورة‬...

CODE
Range("A:A,C:C,F:F").Select

- ‫ لتحديد صف‬...

CODE
Rows("1").Select

- ‫ يمكنك تحديد العمدة والصفوف بأحد الطرق التالية‬:

CODE
ActiveCell.EntireColumn.Select
ActiveCell.EntireRow.Select
Range("B1").EntireColumn.Select
Range("B1").EntireRow.Select

‫ ) حيث أن‬EntireColumn ( ‫ و‬، ‫ ) كامل العمود‬EntireRow ( ‫كامل الصف‬


‫ إذا تم تحديد أكثر من خلية فإن الكواد التالية ستقوم بتحديد كامل الصف أو العمود التي يشملها ذلك التحديد‬..

CODE
Selection.EntireColumn.Select
Selection.EntireRow.Select

• Cells, CurrentRegion
- ‫لتحديد كل الخليا‬

CODE
Cells.Select

20
‫‪• Offset‬‬
‫‪ ..‬التي تتيح لك التحرك والتنقل أعلى وأسفل يمينا ويسارا ‪ Offset‬الطريقة الكثر استخداما‬
‫‪ ..‬على سبيل المثال لو أردت التحرك خليتين إلى اليمين ‪-‬‬

‫‪CODE‬‬
‫‪Activecell.Offset(0,2).Select‬‬

‫‪..‬ولو أردت التحرك خليتين إلى اليسار ‪-‬‬

‫‪CODE‬‬
‫‪Activecell.Offset(0,­2).Select‬‬

‫‪ ..‬إذا أردت التحرك خليتين إلى أسفل‪-‬‬

‫‪CODE‬‬
‫‪Activecell.Offset(2,0).Select‬‬

‫‪ ..‬إذا أردت التحرك خليتين لعلى ‪-‬‬

‫‪CODE‬‬
‫‪Activecell.Offset(­2,0).Select‬‬

‫‪ ..‬إذا أردت تحديد خلية والتحرك ثلث خليا لسفل ‪-‬‬

‫‪CODE‬‬
‫‪Range(Activecell,Activecell.Offset(3,0)).Select‬‬
‫‪Range("A1",Range("A1").Offset(3,0)).Select‬‬

‫‪• Column, Row, Columns, Rows, Count‬‬


‫‪ ..‬لحظ أن الكواد التالية تقوم بإرسال النتيجة إلى متغير ‪-‬‬

‫‪CODE‬‬
‫ترجع رقم العمود‪myvar = Activecell.Column   ‬‬
‫ترجع رقم الصف‪myvar = Activecell.Row ‬‬

‫ترجع عدد العمدة في التحديد‪myvar = Selection.Columns.Count ‬‬


‫ترجع عدد الصفوف في التحديد‪myvar = Selection.Rows.Count ‬‬

‫ترجع عدد الصفوف في المنطقة الحالية للتحديد‪myvar = Selection.CurrentRegion.Rows.Count ‬‬

‫‪21‬‬
‫‪• Value‬‬
‫‪ ...‬عندما تريد أن تدخل قيمة رقمية في خلية ‪-‬‬

‫‪CODE‬‬
‫‪Range("C1").Select‬‬
‫‪Selection.Value = 56‬‬

‫‪ ..‬لحظ أنه ل يتحتم عليك تحديد الخلية لدخال قيمة لها ‪ ،‬ففي أي مكان يمكنك كتابة التالي ‪-‬‬

‫‪CODE‬‬
‫‪Range("C1").Value = 56‬‬

‫‪ ..‬حتى أنه يمكنك تغيير قيمة خلية في ورقة أخرى تحددها أنت ‪-‬‬

‫‪CODE‬‬
‫‪Worksheets("Good").Range("C1").Value = 56‬‬

‫‪ ..‬يمكنك أيضا إدخال قيمة واحدة لعدة خليا ‪-‬‬

‫‪CODE‬‬
‫‪Range("A1:B33").Value = 56‬‬

‫‪ ) " " ( ..‬هذا إذا كانت القيمة المدخلة عبارة عن أرقام ‪ ،‬أما إذا كنت تريد إدخال نص في خلية فعليك استخدام القواس المزدوجة ‪-‬‬

‫‪CODE‬‬
‫"‪Range("C1").Value  = "Nancy‬‬

‫‪ ..‬إذا كنت تريد أن تدخل نصاً داخل أقواس مزدوجة ‪ ،‬فعليك كتابة النص داخل ‪ 3‬أقواس مزدوجة في الكود ‪-‬‬

‫‪CODE‬‬
‫"""‪Range("C1").Value  = """Peter‬‬

‫‪22‬‬
‫‪• Formula‬‬
‫‪ ..‬كي تدخل صيغة في خلية فأنت في حاجة إلى الكود التالي ‪-‬‬

‫‪CODE‬‬
‫‪Range("A1").Select‬‬
‫"‪Selection.Formula = "=B8+C8‬‬

‫لحظ أن علمتي التساوي في الكود تندرج أحداهما داخل القواس المضاعفة وتقوم بكتابة الصيغة تماما كأنك داخل ورقة العمل ‪ ،‬مرة ‪-‬‬
‫‪ ..‬أخرى أنت لست في حاجة لتحديد خلية ثم كتابة صيغة بداخلها‬

‫‪CODE‬‬
‫"‪Range("A1").Formula = "=B8+C8‬‬

‫‪ ..‬أما إذا كتبت الكود التالي ‪-‬‬

‫‪CODE‬‬
‫"‪Range("A1:A8").Formula = "=C8+C9‬‬

‫وهكذا ‪ ،‬أما إذا كنت تريد تحديد صيغة معينة ثابتة ‪ ) A2 ( = C9+C10 ..‬وفي الخلية ‪ ) A1 ( = C8+C9 ،‬فإن الصيغة في الخلية‬
‫‪ ..‬للخليا فإنه يتحتم عليك استخدام العلمة ( ‪ ) $‬ليقاف ديناميكية الصيغ داخل النطاق المحدد‬

‫‪CODE‬‬
‫"‪Range("A1:A8").Formula = "=$C$8+$C$9‬‬

‫‪ .. Simplifying object references‬تبسيط إرجاع ( الشارة إلى ) كائن (‪2‬‬

‫‪CODE‬‬
‫‪Application.Workbooks(“Book1.xls”).Worksheets(1).Range(“A1”).Value‬‬

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

‫‪CODE‬‬
‫‪Workbooks(“Book1.xls”).Worksheets(1).Range(“A1”).Value‬‬

‫‪ ...‬هو المصنف النشط حاليا ‪ ،‬يمكنك اختصار الشارة إليه أيضا ‪ Book1.xls‬ولو كان ‪-‬‬

‫‪CODE‬‬
‫‪Worksheets(1).Range(“A1”).Value‬‬

‫‪23‬‬
‫‪ ..‬وكذلك لو كانت ورقة العمل الحالية هي الورقة النشطة فإنه يمكن اختصار الشارة إليها أيضا ‪-‬‬

‫‪CODE‬‬
‫‪Range(“A1”).Value‬‬

‫** ‪ Working with Objects‬العمل مع الكائنات **‬


‫لقد تعلمت من خلل أمثلة عديدة تعرضت للكائنات وكيفية إعداد خصائصها وأساليب وطرق إجراء أحداثها ‪ ،‬وهناك بعض الدوات القليلة ‪-‬‬
‫( ‪ )With/End‬التي قد تكون هامة للغاية عند التعامل مع الكائنات ‪ ،‬على سبيل المثال‬
‫بنية الكود أو هيكله يعمل على تبسيط الكود ونوع بيانات الكائنات ‪ ،‬التي تتيح لك الشارة إلى كائن موجود أو إنشاء كائن جديد ‪ ،‬ولنلق ‪-‬‬
‫‪ ..‬نظرة على المثال أدناه‬

‫‪• With/End‬‬
‫أنا دائما أوصي باستخدام هذه التركيبة أو البنية لنها تجعل برنامج أكثر قابلية للقراءة والفهم ‪ ،‬كما سوف ترى في كثير من الحيان ‪-‬‬
‫‪ ...‬في هيكل الماكرو المسجل ‪ ،‬أنظر في الكود التالي ‪With/End‬‬

‫‪CODE‬‬
‫‪Range(“A1:D1”).Select‬‬
‫‪Range(“A1:D1”).Value = 100‬‬
‫‪With Selection.Font‬‬
‫‪       .Bold = True‬‬
‫”‪       .Name = “Times New Roman‬‬
‫‪       .Size = 16‬‬
‫‪End With‬‬
‫‪With Selection‬‬
‫‪   .HorizontalAlignment = xlCenter‬‬
‫‪   .VerticalAlignment = xlCenter‬‬
‫‪End With‬‬

‫الخاصة ‪ Select)( method‬من ورقة العمل النشطة باستخدام طريقة أو أسلوب ‪ A1:D1‬عند التنفيذ ‪ ،‬يقوم هذا الكود باختيار النطاق ‪-‬‬
‫بكائنات النطاق أو المدى ‪ ،‬وفي هذه الحالة فإن خصائص الختيار الخاصة بكائنات الويندوز قد استخدمت لترجع نطاق من الكائنات ‪ ،‬حيث أن‬
‫‪ .‬خصائص الخط ترجع كائن الخط المرتبط مع النطاق المختار أو المحدد‬
‫وخصائص التحديد ‪ ،‬ويتم الدخال عن ()‪ Select‬والبيان أو التعبير أو الصيغة يمكن أن تكون بنفس السهولة التي كتبت بدون طريقة ‪-‬‬
‫‪ .. With Range)“A1:D1”(.Font ( ..‬طريق خصائص النطاق ليتم إرجاع كائن النطاق المرجو ( على سبيل المثال‬
‫مرة أخرى داخل البنية ‪ ،‬أي خاصية من خصائص الكائنات يمكن إعدادها ووضعها بدون وصف أو تحديد الكائن في كل سطر من أسطر ‪-‬‬
‫الكود ‪ ،‬والكائنات التابعة وخصائصها يمكن الوصول إليها أيضا ‪ ،‬كل سطر من أسطر البنية يجب أن يبدأ بنقطة ( ‪ ) .‬متبوعا بخاصية أو اسم‬
‫‪ .‬أو الحالة ‪ Method‬كائن ‪ ،‬وبعد ذلك الطريقة‬
‫‪ End With .‬بعد تعيين الخصائص المرغوبة ‪ ،‬والطرق استخدمت لكائن معين فإننا نختم البنية بـ ‪-‬‬
‫المستخدمة في البناء الثانية استخدمت لتنسيق النطاق المحدد رأسيا وأفقيا ‪ ،‬وبهذه الطريقة ‪ With/End With‬ويجب عليك ملحظة أن ‪-‬‬
‫‪ .‬يبدو الكود الخاص بك مرتبا مقروءا‬
‫تعتبر طريقة واضحة ‪ ،‬ومفيدة بشكل خاص عند استخدام عدد كبير من الخصائص والطرق لمعالجة ‪ With/End With‬لهذا فإن بنية ‪-‬‬
‫‪ .‬كائن واحد بالتتابع في البرنامج‬
‫‪24‬‬
‫‪ The Object Data Type .‬نوع بيانات الكائن (‪3‬‬
‫وأخيرا ‪ ،‬فإن موضوع كائنات إكسيل لن يكتمل بدون مناقشة نوع بيانات الكائنات ‪ ،‬إذا وجدت حالت أو اقتراحات متعددة لنفس الكائن في ‪-‬‬
‫بدل الشارة بشكل مستمر عن طريق التحديدات المقيدة ‪ ،‬وأيضا فإن المتغيرات يمكنك أن ‪variables‬برنامجك يمكنك استخدام المتغيرات‬
‫الخرى وذلك ‪ VBA‬تسند لها دللة السماء ‪ ،‬مما يجل البرنامج أسهل في تفسيره ‪ ،‬ومتغيرات الكائنات عادة مشابهة لنواع بيانات كائنات‬
‫‪ ...‬يجب أن يعلن ويوضح في الكود ‪ ،‬على سبيل المثال‬

‫‪CODE‬‬
‫‪Dim myObject as Object‬‬

‫ومع ذلك فتحديد قيمة لكائن متغير تختلف عن تحديدها لكثر أنواع البيانات ‪ )myObject ( ،‬هنا نعلن عن وجود كائن متغير واسمه ‪-‬‬
‫‪ ..‬يجب أن تستخدم لتحديد مهام الكائن المتغير ‪ Set‬شيوعا ‪ ،‬الكلمة الدليلية‬

‫‪CODE‬‬
‫)”‪Set myObject = Range(“B1:C15‬‬

‫تحديدا ‪ ،‬ويمكن بعد ذلك استخدام خصائص الكائن بالطريقة ( ‪ )myObject‬على أنه ما يمثله المتغير ( ‪ )B1:C15‬هنا تم تحديد النطاق ‪-‬‬
‫‪ ..‬المعتادة‬

‫‪CODE‬‬
‫‪myObject.Font.Bold = True‬‬

‫‪ ..‬تعرض بخط أسود غامق ‪ ،‬والكواد أعله يمكن كتابتها بشكل أكثر كفاءة كما يلي ( ‪ )B1:C15‬وهذا يجعل القيمة في النطاق ‪-‬‬

‫‪CODE‬‬
‫‪Dim myRange as Excel.Range‬‬
‫)”‪Set myRange=Range(“B1:C15‬‬
‫‪myRange.Font.Bold = True‬‬

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

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

‫‪25‬‬
‫بسم ال الرحمن الرحين‬

‫نستكمل سويا السلسلة الدرس الول من الجزء الرابع ( ‪) 4/1‬‬

‫الجزء الرابع المتغيرات وأنواع البيانات والثوابت ‪Variables, Data Types, and Constants‬‬
‫في هذا الجزء سوف تتعلم التالي ‪:‬‬

‫* أنواع المتغيرات ‪.‬‬


‫* توجيه مدخلت المستخدمين ‪.‬‬
‫* المصفوفات ‪.‬‬
‫* التفاعل مع المستخدمين ‪.‬‬
‫‪ -‬كما أن برنامج إكسيل يركز على جداول البيانات ‪ ،‬فمن الطبيعي أن أبدأ الموضوع المتعلق بالمتغيرات بأن أطلب منك التفكير في التالي ‪ :‬ما‬
‫هي أنواع البيانات الممكن إدخالها في خليا جدول البيانات ؟ وكيف يمكنك استخدامها ؟ أنت تعرف أنه يمكنك إدخال الرقام والنصوص في أي‬
‫خلية من خليا جداول بيانات إكسيل ‪...‬‬
‫‪ -‬أيضا فإنك تعلم أو ربما ل تعلم أن تنسيق خليا جداول البيانات يمكن تغييره إلى عدة احتمالت ممكنة ‪ ،‬فعلى سبيل المثال يمكن تنسيق‬
‫الرقام لتصبح غامق ‪ Bold‬في تنسيق نمط الخط أو أحمر في تنسيق لون الخط ‪ ،‬يمكن تنسيقه أيضا على اعتبار أن قيمته تمثل عملة أو‬
‫كنسبة مئوية ‪ ،‬كذلك يمكن تحويل النص الذي تم إدخاله تلقائيا إلى تاريخ أو وقت ‪ ،‬كما أن محتويات أي خلية من خليا جداول البيانات يمكن‬
‫تغييرها أو حذفها في أي وقت ‪..‬‬

‫‪ )1‬إعلن المتغيرات ‪Declaring Variables‬‬


‫‪ -‬عملية إعلن المتغيرات هي أن تخبر الكمبيوتر بأن يحجز مكان في الذاكرة لستخدامه فيما بعد ‪ ،‬وكنتيجة لذلك تعمل أكواد ‪ VBA‬بطريقة‬
‫أكثر كفاءة ‪ ،‬لعلن متغير في الكود استخدم تعبير ( ‪ ) DIM‬وهو اختصار لـ ( ‪. ) Dimension‬‬
‫‪Dim myVar As Integer‬‬
‫‪ -‬واسم المتغير هنا ( ‪ ، ) myVar‬وكما ترى فهو ‪:‬‬
‫‪ -1‬يبدأ بحرف أبجدي ‪ -2 .‬ل يتجاوز ‪ 255‬حرف ‪ -3 .‬ل يحتوى على فواصل ‪.‬‬
‫‪ -‬ل تستخدم علمات الترقيم أو الحروف غير العتيادية الخرى في اسم المتغير ‪.‬‬
‫‪ -‬استخدام الرمز ‪ ) _ ( underscore‬يسمح به ويعمل بشكل جيد لفصل العديد من الكلمات الواردة في اسم متغير واحد ‪ ،‬ومثال على ذلك‬
‫( ‪. ) Car_Type‬‬
‫‪ -‬ل تستخدم كلمات رئيسية محفوظة في ‪ VBA‬لتسمية متغير ‪ ،‬كما ل تستخدم نفس السم الواحد أكثر من مرة في نطاق أكواد واحد‬
‫( سيناقش لحقا في هذا الجزء ) ‪ ،‬وكالعرف المتبع أو كتقليد متبع فإنه يجب أن يكون اسم المتغير واصفا لعمله ‪ ،‬على سبيل المثال إذا كنت‬
‫تستخدم متغير خاص بأنواع السيارات فإنه من الفضل أن يكون اسم المتغير ‪ CarType‬أو ‪ ، carType‬ويفضل أن يبدأ اسم المتغير‬
‫بحروف صغير ( ‪ ) small‬ولبداية السماء التالية حروف كبيرة ‪ ،‬حاول أن تختصر السماء قدر المكان بحيث يكون واضحا ‪.‬‬
‫‪ -‬ومن الصواب إتباع العراف السائدة في تسمية المتغيرات والتي ل تتعارض مع قواعد ‪ VBA‬لتأكيد إعلن المتغيرات بشكل واضح ومفهوم‬
‫‪ ،‬استخدم الخيار ‪ Explicit‬في أول بيان في الموديول ‪ module‬قبل كتابة أي إجراء كالموجود بالشكل أسفل ‪..‬‬

‫‪26‬‬
‫‪ )2‬مجال المتغير ‪Variable Scope‬‬
‫‪ -‬ونطاق المتغير أو مجاله سواء الذي قد يكون متغير خاص أو عام ‪ Private or Public‬يشير إلى الوقت الذي يكون فيه المتغير متاحا‬
‫أو مرئيا للبرنامج ‪ ،‬وعندما يكون المتغير داخل نطاقه ‪ ،‬فإنه يمكن الوصول إليه أو معالجته ‪ ،‬وعندما يكون المتغير خارج نطاقه فإنه يكون‬
‫غير مرئي بالنسبة للبرنامج وبالتالي ل يمكن الوصول إليه ‪.‬‬
‫‪ -‬وإعلن متغير ضمن كتلة إجراءات وأكواد ‪ VBA‬هو عبارة عن مستوى إجرائي متغير ‪ ،‬والمستوى الجرائي المتغير يتم تنفيذه فقط وفق‬
‫الجراء الذي تم إعلن متغير عنه ‪ ،‬في الشكل أسفل ‪ ،‬فإن المتغير ‪ myVar4‬يمكن للبرنامج رؤيته ومن ثم التعامل معه عندما يتم تنفيد‬
‫الكود ‪ )(Activate‬الخاص بورقة العمل ‪..‬‬

‫‪ -‬ما يحدث هو عند تنفيذ البرنامج للحدث ‪ )(Activate‬فإن المتغير ‪ myVar4‬يحجز حجما في الذاكرة ‪ ،‬إن تنفيذ البرنامج يتم عن طريق‬
‫نواتج الحداث المتتابعة حتى الوصول إلى سطر ‪ End Sub‬من الكود ‪ ،‬بعد ذلك يتم تفريغ الذاكرة من المساحة المخصصة للمتغير والتي لم‬
‫تعد متاحة بعد ذلك ‪ ،‬في كل مرة يتم فيها تنفيذ البرنامج يتم حجز مساحة من الذاكرة وتفريغها مرة أخرى ‪ ،‬وبالتالي فإن ‪ myVar4‬لن تحجز‬
‫أو تحتفظ بقيمتها ما بين الستدعاء والتنفيذ ‪...‬‬
‫‪ -‬في هذا الجراء سيقون المتغير ‪ myVar4‬بزيادة قيمته في كل مرة يتم فيها استدعاءه إلى أن يتم التنفيذ ‪.‬‬
‫‪ -‬والمتغيران تم إعلنهما عن طريق الكلمات ‪ Dim‬و ‪ Private‬و ‪ ، Public‬وكلمتي (‪ Private‬و ‪ ) Public‬يستخدمان للعلن عن‬
‫متغير عام ‪ ،‬والمتغير ‪ myVar5‬تتضح رؤيته لي من إجراءات الموديول ‪ ،‬في حين أن ‪ myVar4‬فقط يمكن الوصول إليه بعد إجراء تفعيل‬
‫ورقة العمل ‪ ، )(Activate‬وتعد تلك المتغيرات التي تم إعلنها في قسم العلنات العامة عن طرق بكلمة ‪ Public‬تشير إلى شمولية أو‬
‫عمومية ذلك المتغير ‪.‬‬
‫‪ -‬لذلك فإن الكلمات الرئيسية ( ‪ ) Dim , Private‬لها نفس الوظيفة عند إعلن المتغير في القسم العام في أي موديول ‪ ،‬أما الكلمة‬
‫الرئيسية ‪ Public‬يمكن استخدامها للعلن عن متغير شامل ( ‪ ) global‬في أي موديول قياسي أو موديول خاص بكائن‬

‫‪27‬‬
‫( نستكمل سويا الجزء الرابع وهذا هو الدرس الثاني منه ( ‪2-4‬‬

‫أنواع البيانات (‪3‬‬


‫عند إعلن نوع من المتغيرات فإن ذلك يعني أنه يجب عليك تحديد نوع القيمة التي يمكن تخزينها داخل الذاكرة المخصصة للمتغير ‪ ،‬هناك ‪-‬‬
‫‪ :‬العديد من أنواع البيانات ‪ ،‬وتعد الكثر شيوعا هي التي ضمن الجدول بالسفل ‪ ،‬فعلى سبيل المثال‬

‫‪CODE‬‬
‫‪Dim myInt As Integer‬‬

‫هنا أنت تريد للمتغير ‪ ) Integer (..‬أن يحتوي فقط على عدد ( ‪) myInt‬‬

‫‪ ...‬أنواع البيانات العددية **‬


‫فلو أنك أعلنت عن متغير على ‪ ) Integer – Long – Single – Double ( ،‬تعد أنواع البيانات العددية موجودة بالجدول أسفل ‪-‬‬
‫فإنها يمكن أن تشمل أو تمثل كل العداد الصحيح داخل النطاق المحدد ‪ ،‬ول يمكنها أن تمثل الكسور أو القيم ( ‪Long‬أو ‪ ) Integer‬هيئة‬
‫‪ .‬بدل من ذلك ( ‪ ) Single – Double‬العائمة أو المنحرفة ‪ ،‬ولتدخل تلك القيم داخل نطاق المتغير فعليك استخدام‬
‫‪ .‬انتبه جيدا للقيمة العددية للمتغير الذي أعلنت عنه ‪ ،‬فإن القيمة لو كانت كبيرة جدا على نوع المتغير المستخدم ‪ ،‬فسوف يقف برنامجك ‪-‬‬
‫لن القيمة ‪ 60000‬تعتبر خارج النطاق المسموح لنوع ( ‪ ) overflow error‬على سبيل المثال ‪ ،‬فالكود التالي سوف يولد الخطأ التالي ‪-‬‬
‫‪ ...‬قيمة المتغير العددي‬

‫‪CODE‬‬
‫‪Dim myInt As Integer‬‬
‫‪myInt = 60000‬‬

‫عليك أن تكون حذرا عند خلط أنواع البيانات العددية لنك قد ل تحصل على النتيجة المرجوة ‪ ،‬فالكود أسفل سيتم تنفيذه بدون أخطاء أو ‪-‬‬
‫فإنها يتم ( ‪ ) answer‬مشاكل ‪ ،‬ولكن الناتج سيكون ( ‪ ) 11‬بعد التنفيذ ‪ ،‬وليس ( ‪ ) 10.8‬كما توقعت ‪ ،‬فحسب القيمة المخزنة للجابة‬
‫‪ ..‬تقريبها إلى أقرب عدد صحيح‬

‫‪CODE‬‬
‫‪Dim answer As Integer   ‬‬
‫‪Dim num1 As Single‬‬
‫‪Dim num2 As Integer‬‬
‫‪num1 = 2.7‬‬
‫‪num2 = 4‬‬
‫‪answer = num1 * num2‬‬

‫‪28‬‬
‫كالتالي ‪ :‬ولتفادي ذلك الخطأ ‪ ،‬غير قيمة ( ‪ ) Single‬إلى نوع البيانات ( ‪- ) answer‬‬

‫‪CODE‬‬
‫‪Dim answer As Single ‬‬
‫‪Dim num1 As Single‬‬
‫‪Dim num2 As Integer‬‬
‫‪num1 = 2.7‬‬
‫‪num2 = 4‬‬
‫‪answer = num1 * num2‬‬

‫يمكنك الستعانة بالماكرو أو الكواد للقيام بالكثير من العمليات الحسابية ‪ ،‬يمكنك إضافة أو طرح أو قسمة أو ضرب أو تربيع أو تكعيب ‪-‬‬
‫المتغيرات العددية ‪ ،‬أو ترفعهم لي أس تريده ‪ ،‬أنظر الجدول أسفل لتعرف الرموز المشهورة التي يمكن أن تستخدمها في العمليات الرياضية‬
‫‪ VBA ..‬في‬

‫‪ VBA ..‬أشهر الرموز الرياضية المستخدمة في‬

‫‪ / +‬إضافة ‪Addition‬‬
‫‪ / -‬طرح ‪Subtraction‬‬
‫* ‪ /‬ضرب ‪Multiplication‬‬
‫‪ / /‬قسمة ‪Division‬‬
‫^ ‪ /‬أس ‪Exponential‬‬

‫‪ :‬يمكنك القيام بأي عملية حسابية للمتغيرات العددية ‪ ،‬والتالي بعض المثلة لذلك‬

‫‪CODE‬‬
‫‪Dim num1 As Integer‬‬
‫‪Dim num2 As Integer‬‬
‫‪Dim answer As Integer‬‬
‫‪num1 = 4‬‬
‫‪num2 = 2‬‬
‫‪answer = num1 + num2 ‘ answer Holds 6‬‬
‫‪answer = num1 ­ num2 ‘ answer Holds 2‬‬
‫‪answer = num1 * num2 ‘ answer Holds 8‬‬
‫‪answer = num1 / num2 ‘ answer Holds 2‬‬
‫‪answer = num1 ^ 2 ‘ answer Holds 16‬‬
‫‪answer = 2 ^ num2 ‘ answer Holds 4‬‬

‫‪29‬‬
‫‪ ..‬وأعتقد أنك ستواجه الكثير من هذه العمليات الحسابية في برامجك ‪-‬‬

‫‪ String‬أنواع سلسلة البيانات **‬


‫هكذا يمكن أن تكون البيانات نصا أو عددا أو ‪ ) String ( ،‬لتصف بيانات ( نصية أو رموز ) ‪ ،‬يجب أن تكون نوع البيانات للمتغيرات ‪-‬‬
‫حرفا أو رمزا ( كعلمات الترقيم ) ‪ ،‬وتحديدا ‪ ،‬فإن أي شيء يمكن كتابته بلوحة المفاتيح يمكن تعيينه والوصول إليه عن طريق نوع بيانات‬
‫‪ :‬على سبيل المثال ‪String ،‬‬

‫‪CODE‬‬
‫‪Dim myName As String‬‬
‫”‪myName = “Peter Anderson‬‬

‫هناك نوعان من سلسلة البيانات ‪ ،‬طول متغير وطول ثابت ‪ ،‬فالمثال أعله يعتبر من نوع البيانات ذات الطول المتغير ‪ ،‬لن ‪myName -‬‬
‫يمكنها أن تكون أي نص وأي أحرف ( أنظر الجدول أعله ) ‪ ،‬وفيما يلي مثال للعلن عن سلسلة ثابتة الطول‬

‫‪CODE‬‬
‫‪Dim myString As String * 10‬‬
‫”‪myString = “ABCDEFGHIJKL‬‬

‫يمكنها فقط أن تكون عبارة عن ‪ 10‬رموز ‪ ،‬عند تشغيل الكود فإن فقط أول عشرة رموز في المثال سيتم ‪ myString‬هنا فسلسلة المتغير ‪-‬‬
‫‪ ) User-Defined‬الطول الثابت عادة ما يستخدم كجزء من نوع بيانات تعريف المستخدم ‪ ) ABCDEFGHIJ ( ،‬تخزينها في أي متغير‬
‫‪ .‬وفي معظم الحالت ‪ ،‬فمن المستحسن استخدام الطول المتغير لسلسلة البيانات حيث ل تعرف طول السلسلة المخزنة في المتغير (‬
‫عند إعلن طول سلسلة ثابتة ‪ ،‬ل تستخدم الفاصلة في الرقام التي تحدد حجم السلسلة ‪ ،‬وفي الواقع فإنك ل تستخدم أبداً الفواصل فيما ‪-‬‬
‫‪ VBA .‬يخص القيم الرقمية في‬

‫‪ ..‬التاريخ كنوع بيانات **‬


‫ماذا تفعل لو كنت تريد أن تحسب عدد اليام بين تاريخين معينين ؟ حسنا ‪ ..‬أنت تقوم بالعلن عن متغير ونوع بياناته عبارة عن تاريخ ‪- ،‬‬
‫‪ .‬للعلن عن متغير لتاريخ فل يمكنك إجراء الحسابات عليها ‪ String‬ولو استخدمت السلسلة‬

‫‪CODE‬‬
‫‪Dim Today as Date‬‬
‫هنا المتغير تاريخ ثابت ‪Dim LastTime As Date =  # 6/6/2007#    ‘here the variable is a fix date‬‬
‫‪Dim NumDay As Integer‬‬
‫‪Today  = Now‬‬
‫‪NumDay = Today – LastTime‬‬

‫سيخزن عدد اليام التي انقضت منذ ( ‪ ) 6/6/2007‬ولذلك فإن بيانات التاريخ تعطيك النتائج التي ‪ NumDay‬عند تشغيل هذا الكود ‪ ،‬فإن ‪-‬‬
‫‪ ..‬تريدها بشكل أكثر مرونة‬
‫‪ .‬يتم وضع التواريخ والزمنة بين علمتي (‪ ) #‬كالموضح بالمثال أعله ‪ VBA‬في ‪-‬‬
‫يتم عرض بيانات التاريخ والوقت للمتغيرات طبقا لعدادات التاريخ والوقت في نظامك ‪ ،‬ولذلك فهي تعتمد على إعدادات التاريخ والوقت ‪-‬‬
‫‪ .‬للجهاز الذي يتم تشغيل البرنامج عليه‬

‫‪30‬‬
‫‪ )Variant ( ..‬أنواع البيانات البديلة أو المتنوعة **‬
‫‪ :‬أنواع البيانات البديلة قابلة للمقارنة مع الفئة العامة لتنسيق الرقام مع جداول البيانات في تطبيق إكسيل ‪ ،‬ويتم العلن عنها كالتالي ‪-‬‬

‫‪CODE‬‬
‫‪Dim myUnknown‬‬
‫‪Dim myUnknown2 As Variant‬‬

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

‫‪CODE‬‬
‫‪Dim myVar As Integer‬‬
‫‪myVar = 5‬‬
‫”‪myVar = “Five‬‬

‫داخل متغير عددي ‪ ،‬ولحل هذه ( ‪ ) Five‬في محاولة إدخال السلسلة ( ‪ )mismatch error‬سيؤدي هذا إلى حدوث خطأ عدم توافق ‪-‬‬
‫سيحتجز ( ‪ ) myVar‬وبذلك سيتم تنفيذ الكود ‪ ،‬والمتغير ‪ ) Variant ( ،‬للقيمة البديلة أو المتنوعة ‪ myVar‬المشكلة قم بتغيير المتغير‬
‫‪ ..‬عند الكتمال ‪ ،‬الكود التالي سيعمل بدون مشاكل ( ‪ )Five‬القيمة‬

‫‪CODE‬‬
‫‪Dim myVar‬‬
‫‪myVar = 5‬‬
‫”‪myVar = “Five‬‬

‫من أن يأخذ القيمة العددية ( ‪ ) 5‬ولو لفترة قصيرة ‪ ،‬قبل أن يتخلى عن هذه القيمة ويأخذ القيمة ( ‪ ) myVar‬هذا الكود يمكن المتغير ‪-‬‬
‫( ‪ ) Five‬في النهاية ‪ ،‬ومع الكود أعله أيضا احتمال وقوع مشاكل ووقوف البرنامج عن العمل ‪ ,‬حيث أنه ل يمكن استخدام القيمة ( ‪) Five‬‬
‫‪ .‬في العمليات الحسابية وسينعكس ذلك على أداء برنامجك وربما لتوقفه‬
‫أيضا فإن استخدام قيم البيانات المتنوعة سيجعل من الصعب جدا تصحيح برنامجك ‪ ،‬على الرغم من أنه مغري لستخدام البدائل كوسيلة ‪-‬‬
‫لتجنب الخطاء التي توقف عمل البرنامج ( كالمثال أعله ) ‪ ،‬في الواقع فإن استخدام هذا النوع من البيانات يجعل برنامجك غير محكم ويمكن‬
‫‪ .‬أن يتسبب في أخطاء منطقية يصعب العثور عليها‬

‫‪ ..‬أنواع البيانات المنطقية ** ‪Boolean‬‬


‫بـ ( ‪ ) True ( ) 1‬كما يمكنها أن تعبر عن القيمة ‪ ) True or False ( ،‬تعد البيانات المنطقية بسيطة ‪ ،‬فهي إما قيمة حقيقية أو مزيفة ‪-‬‬
‫بـ ( ‪ ، ) 0‬ويتم استخدامها عادة عند التعامل مع هياكل البرمجة التي تستخدم الشروط ‪ ( ،‬وسوف يتم توضيح ذلك ( ‪ ) False‬وعن القيمة‬
‫‪ ...‬في جزء لحق من الدورة ) ‪ ،‬وإعلن متغير منطقي يتم على النحو التالي‬

‫‪CODE‬‬
‫‪Dim condition As Boolean‬‬
‫‪condition = False‬‬

‫‪31‬‬
‫نوع بيانات الثوابت ** ‪Constants‬‬
‫قد تحتاج في بعض الحوال إلى استخدام متغير ل تتغير قيمته أثنا تنفيذ إجراءات برنامجك ‪ ،‬وفي هذه الحالة فمن الممارسات الجيدة أن تعلن ‪-‬‬
‫عن تلك المتغيرات بأنها ثابتة ‪ ،‬هذا يجعل الكود من السهل عليه قراءتها ومن السهل أيضا عليه تغيير قيمتها إن احتجت ذلك ‪ ،‬كاستخدام‬
‫‪ ..‬نطاقات مسماه في صيغ جداول البيانات‬

‫‪CODE‬‬
‫‪Const PI As Double = 3.14159‬‬
‫‪Dim circumference As Single‬‬
‫‪Dim diameter As Single‬‬
‫‪diameter = 9.33‬‬
‫‪circumference = PI* diameter‬‬

‫أعذرونا على التقصير‬


‫في الدرس القادم ( المصفوفات ) إعلنها – تحديد القيم فيها – المصفوفات متعددة البعاد – ديناميكية المصفوفات ‪...‬‬
‫شكرا لكم ‪ ،‬وأسألكم الدعاء‬
‫الخوة العزاء نستكمل سويا الجزء الرابع وهذا هو الدرس الثالث‬
‫=========================================================================‬
‫( ‪ ) Arrays‬المصفوفات (‪4‬‬
‫المصفوفة هي عبارة عن مجموعة من المتغيرات التي لها اسم مشترك ‪ ،‬على سبيل المثال نحن نشير إلى متغير محدد بعينه في مصفوفة ‪-‬‬
‫‪ .‬من خلل اسم المصفوفة ورقم فهرس هذا المتغير في المصفوفة‬
‫على سبيل المثال يمكنك تحديد مجموعة من ‪ 7‬سلسل متغيرة من البيانات ليمثلوا عدد اليام في السبوع ‪ ،‬وإذا قمت بتسمية المصفوفة ‪-‬‬
‫وهكذا ‪ ) NumDays)2( ( ..‬واليوم الثاني ( (‪ ) NumDays)1‬يمكنك الشارة إلى اليوم الول في السبوع ‪NumDays ،‬‬

‫‪ ..‬إعلن المصفوفة **‬


‫أول أو بالتصريح العام ‪ ،‬إفتراضيا فإن ‪ Dim‬بـ ‪ VBA‬قبل أن تتمكن من استخدام المصفوفة ‪ ،‬يجب عليك العلن عنها أول مثل متغير في ‪-‬‬
‫يحدد القيمة ( ‪ ) 0‬كأقل فهرس ‪ ،‬وبالتالي تحتاج إلى تحديد عدد العناصر بالمصفوفة عن طريق تحديد فهرس أول رقم وفهرس آخر ‪VBA‬‬
‫‪ ...‬رقم بالمصفوفة ‪ ،‬والمثال التالي يوضح كيفية العلن عن عدد اليام في السبوع‬

‫‪CODE‬‬
‫‪Dim NumDays(1 to 7) As Integer‬‬

‫‪ ..‬عندما تعلن عن مصفوفة ‪ ،‬يمكنك أن تحدد فقط القيمة العليا ‪-‬‬


‫‪ ( ..‬أن القيمة الصغرى هي ( ‪ ، ) 0‬والمثالين التاليين يعينان نفس عدد العناصر ( ‪ VBA 100‬كما يفترض ‪-‬‬

‫‪CODE‬‬
‫‪Dim MyArray(0 to 99) As Integer‬‬
‫‪Dim MyArray(99) As Integer‬‬

‫أن يحدد القيمة ( ‪ ) 1‬بأنها القيمة الصغرى في المصفوفة ‪ ،‬فإنه يجب عليك أن تضيف الكود التالي في قسم ‪ VBA‬إذا كنت تريد من ‪-‬‬
‫‪ ..‬العلنات لديك‬

‫‪CODE‬‬
‫‪Option Base 1‬‬

‫‪32‬‬
‫‪ .‬وتم هنا افتراض القيمة ( ‪ ) 1‬كقيمة صغرى للمصفوفة من الن ‪ ،‬وتمثل المصفوفة أعله ‪ 99‬عنصرا بعد هذا الكود ‪-‬‬

‫‪ ..‬تحديد قيم مجموعة من العناصر في مصفوفة **‬


‫‪ ..‬سيكون الكود كالتالي ( ‪ ) MyArray‬افترض أننا بصدد تحديد القيمة ( ‪ ) 5‬للفهرس الثالث في مصفوفة اسمها‬

‫‪CODE‬‬
‫‪MyArray(3) = 5‬‬

‫‪ ..‬المصفوفات متعددة البعاد **‬


‫يتيح لك الحصول على ما يصل إلى ‪ 60‬بعد ‪ ،‬المثال التالي يعلن ( ‪ VBA ) 5‬لقد ألقينا نظرة على المصفوفات ذات البعد الواحد ‪ ،‬كما أن‬
‫‪ ..‬أعداد في مصفوفة ذات بعدين‬

‫‪CODE‬‬
‫‪Dim MyArray(1 to 5, 1 to 5) As Integer ‬‬

‫وإذا كنا نريد إسناد القيمة ( ‪ ) 5‬إلى الفهرس الذي موضعه ( الصف ‪ x 5 ( ،‬يمكنك التفكير في أن هذه المجموعة تحتل المصفوفة ( ‪- 5‬‬
‫‪ ..‬الثاني والعمود الخامس ) من المصفوفة فإننا نستخدم الكود التالي‬

‫‪CODE‬‬
‫‪MyArray(2, 5) = 5‬‬

‫( ‪ ) MyArray‬وبعبارة أخرى ‪ ،‬تم تخزين القيمة المتغيرة ( ‪ ) 5‬في ( الصف الثاني و العمود الخامس ) من المصفوفة ‪-‬‬
‫وللمصفوفات ثلثية البعاد ‪ ،‬يتم التفكير فيها على أساس أنها مصفوفة مكعبة ‪ ،‬تصور مصفوفة مكونة من أكثر من ثلث أبعاد ‪ ،‬في الحقيقة ‪-‬‬
‫‪ .‬هي شيء غاية في الصعوبة ‪ ،‬ولكن ل تقلق من البعد الرابع وما بعده فثق تماما أنك لن تحتاجه‬

‫‪ ...‬المصفوفات الديناميكية **‬


‫‪ ..‬حتى الن فقد قمنا بالعلن عن مصفوفات محددة العناصر ‪ ،‬ولكن إذا أردت العلن عن مصفوفة بدون تحديد عناصرها ‪-‬‬

‫‪CODE‬‬
‫‪Dim MyArray() As Integer‬‬

‫‪ ..‬وهذه هي الطريقة لعمل مصفوفة ديناميكية ‪ ،‬عن طريق وضع قوسين فارغين بعد اسم المصفوفة ‪-‬‬
‫كم عدد عناصر المصفوفة ‪ ،‬وفي أغلب الحيان ‪ ،‬فإن ‪ VBA‬لتخبر الـ ( ‪ ) ReDim‬ولتغيير حجم المصفوفة ‪ ،‬يجب عليك استخدام تعبير ‪-‬‬
‫يمكن استخدامه أي عدد من المرات لتغيير حجم المصفوفة ( ‪ ) ReDim‬عدد عناصر المصفوفة يتحدد من خلل تشغيل برنامجك ‪ ،‬وتعبير‬
‫‪ .‬كلما احتجت ذلك‬
‫‪ ( ..‬على سبيل المثال ‪ ،‬لو كنت بحاجة إلى تغيير حجم مصفوفة إلى ( ‪- 10 * 10‬‬

‫‪CODE‬‬
‫‪ReDim MyArray(10,10) As Integer‬‬

‫‪33‬‬
‫‪ -‬الن فإنك قمت بتغيير الحجم أو العناصر بمصفوفة ديناميكية ‪ ،‬وكذلك لتعرف جيدا أنه عند إعادة تعيين عناصر مصفوفة ديناميكية باستخدام‬
‫( ‪ ) ReDim‬فإنك تمحي كل القيم المخزنة حاليا في جميع العناصر ‪..‬‬
‫‪ -‬وسوف يتم مناقشة جزئية المصفوفات بشكل مفصل في فصل قادم بإذن ال ‪...‬‬

‫** معلش يا جماعة هو جزء بسيط لكنه مهم جدا ‪ ،‬والدرس القادم بإذن ال عن المدخلت والمخرجات في ‪VBA‬‬
‫والسلم عليكم ورحمة ال وبركاته‬

‫=================================================================‬

‫السلم عليكم ورحمة ال وبركاته‬


‫( نستكمل سويا الدرس الرابع والخير من الجزء الرابع ( ‪4-4‬‬

‫‪ ...‬بشكل بسيط ‪ VBA‬المدخلت والمخرجات في (‪5‬‬


‫بالتأكيد أنت تعرف جيدا كيف تقوم كمستخدم بإدخال بيانات أو قيم في خليا ورقة العمل ‪ ،‬وكنتيجة لذلك يمكنك أيضا كمستخدم للبرنامج ‪-‬‬
‫الحصول على مخرجات ونتائج من تلك المدخلت ‪ ،‬ومع ذلك في بعض الحيان تود لو أن تقوم بتلك العملية بشكل أكثر حيوية وتفاعلية‬
‫وديناميكية في التعامل مع المستخدم بدل من التعامل المباشر في خليا ورقة العمل ‪ ،‬والطريقة المثلى في تلك التعاملت هي عن طريق‬
‫‪ )InputBox)( & MsgBox)( ( ..‬وظيفتين هما‬

‫‪ )InputBox)( ( ...‬جمع مدخلت المستخدمين مع **‬


‫يمكن أن تستخدم للستجابة وأحيانا لسرعة التجاوب مع المستخدم ‪ ،‬والذي يحدث هو كالتالي ‪ ،‬يتم إرسال مربع ( ()‪ ) InputBox‬الدالة ‪-‬‬
‫حوار لشاشة البرنامج ليتم عرضه على المستخدم الذي بدوره يقوم بالتعامل معه قبل تنفيذ البرنامج ‪ .‬والصورة التالية توضح أحد تلك‬
‫‪ ..‬المربعات‬

‫‪ :‬والكود التالي يوضح ذلك‬

‫‪CODE‬‬
‫)(‪Sub GetName‬‬
‫‪Dim MyInput ‬‬

‫)"‪MyInput = InputBox("Enter your name‬‬

‫‪MsgBox ("Hello ") & MyInput‬‬

‫‪End Sub‬‬

‫‪34‬‬
‫أو قام ( ‪ ) OK‬في المثال السابق هي إرجعا البيانات المدخلة من المستخدم كسلسلة بمجرد النقر على زر ( ()‪ ) InputBox‬وظيفة ‪-‬‬
‫فإن قيمة السلسلة المتغيرة تصبح ( ‪ ) Cancel‬في لوحة المفاتيح ‪ ،‬لو قام المستخدم بالضغط على زر ( ‪ ) Enter‬المستخدم بالضغط على‬
‫[‪ [, xpos[ [, ypos‬يجب استخدام أقواس تنصيص ‪ ،‬ومن النادر أن تحتاج إلى استخدام ‪ InputBox‬صفر ( "" ) ‪ ،‬ولبناء الجملة لعمل‬
‫أنظر إلى مساعد إكسيل للطلع على وظائف تلك الكلمات ‪[, helpfile, context[ ،‬‬

‫‪CODE‬‬
‫)‪InputBox(prompt [,title] [,default] [,xpos] [,ypos] [,helpfile, context], type‬‬

‫** ولقد قمت بنقلها لكم من مساعد إكسيل وهكذا كانت الترجمة **‬
‫أي سلسلة ‪ ،‬يمثل النص المراد عرضه في مربع الحوار ‪ ،‬وقد يكون النص عبارة عن رقم أو تاريخ أو ‪ String‬ضرورية == ‪Prompt‬‬
‫‪ ..‬قيمة منطقية ‪ ،‬وعامة يقوم الكسيل بداية بتحويل هذه القيمة إلى سلسلة قبل عرضها‬
‫أي قيمة اختيارية متنوعة ‪ ،‬عنوان مربع الدخال ‪ ،‬ولو أهمل هذا العنوان فسوف يكون العنوان الفتراضي ‪ Variant‬إختياري == ‪Title‬‬
‫‪ Input .‬هو‬
‫أي قيمة اختيارية متنوعة ‪ ،‬تقوم بتعيين النص الذي تريده أن يظهر داخل مربع النص في مربع الدخال ‪ Variant ،‬إختياري == ‪Default‬‬
‫‪ .‬ولو تم إهماله فسوف يظهر مربع النص ( الدخال ) فارغا‬
‫بعد ( ‪ ) X‬أي قيمة اختيارية متنوعة ‪ ،‬تقوم بتعيين مكان مربع الدخال على الشاشة ‪ ،‬وتمثل القيمة المدخلة ‪ Variant‬إختياري == ‪Left‬‬
‫‪ point .‬مربع الدخال عن أعلى يسار الشاشة بوحدة قياس‬
‫بعد ( ‪ ) Y‬أي قيمة اختيارية متنوعة ‪ ،‬تقوم بتعيين مكان مربع الدخال على الشاشة ‪ ،‬وتمثل القيمة المدخلة ‪ Variant‬إختياري == ‪Top‬‬
‫‪ point .‬مربع الدخال عن أعلى يسار الشاشة بوحدة قياس‬
‫أي قيمة اختيارية متنوعة ‪ ،‬تمثل اسم ملف المساعدة لمربع الدخال ‪ ،‬ولو تم عمل ملف مساعدة ‪ Variant‬إختياري == ‪HelpFile‬‬
‫‪ .‬وإدراجه بالفعل فسوف تظهر أيقونة مساعدة على مربع الدخال كأحد الخيارات‬
‫‪ .‬أي قيمة اختيارية متنوعة ‪ ،‬تمثل رقم تعريف جزئي داخل ملف المساعدة ‪ Variant‬إختياري == ‪HelpContextId‬‬
‫أي قيمة اختيارية متنوعة ‪ ،‬تمثل نوع إرجاع البيانات ‪ ،‬ولو تم إهمال هذا التعيين ‪ ،‬يرجع مربع الحوار ‪ Variant‬إختياري == ‪Type‬‬
‫‪ :‬القيمة نصا ‪ ،‬التي تكون واحدة أو مجموعة من القيم التالية‬

‫‪CODE‬‬
‫صيغة ‪Type:=0 A formula‬‬
‫رقم‪Type:=1 A number ‬‬
‫سلسلة نصية)‪Type:=2 Text (a string‬‬
‫قيمة منطقية)‪Type:=4 A logical value (True or False‬‬
‫الشارة إلى خلية كنطاق ‪Type:=8 A cell reference, as a Range object‬‬
‫قيمة خاطئة ‪Type:=16 An error value, such as #N/A‬‬
‫مصفوفة‪Type:=64 An array of values ‬‬

‫‪ ....‬إرجاع رقم ‪ InputBox ،‬للنظر إلى مثال آخر عن ‪-‬‬

‫‪CODE‬‬
‫)(‪Sub GetAge‬‬
‫‪Dim MyInput  As Integer‬‬

‫)‪MyInput = Application.InputBox(Prompt:="How old are you ? " , Title:="ENTER_AGE: ", Type:=1‬‬
‫‪MsgBox ("You’re ") & MyInput‬‬
‫‪End Sub‬‬

‫‪35‬‬
‫ويتم وضعها داخل علمات تنصيص ( أقواس مزدوجة ) – ( " ‪ string‬يجب أن تكون سلسلة ‪ Prompt , Title‬كقاعدة عامة ‪ ،‬فإن ‪-‬‬
‫‪ ، ) " .‬ويتم عرض العنوان في شريط عنوان مربع الحوار‬

‫()‪ MsgBox‬مخرجات المستخدمين مع **‬


‫فإن مربع رسالة ( كالموجود بالسفل ) سوف يتم عرضه على المستخدم ‪ ،‬كأن يتم سؤاله أو الختيار فيما ‪ MsgBox)( ،‬باستخدام وظيفة ‪-‬‬
‫‪ ) Yes / No ( ..‬بين‬
‫‪ :‬يتم على النحو التالي ()‪ MsgBox‬وهي أيضا مفيدة أيضا باعتبارها وسيلة في إعلم المستخدم عن نوع مشكلة ما ‪ ،‬وتركيب وظيفة ‪-‬‬

‫‪CODE‬‬
‫)]‪MsgBox(prompt[, buttons] [, title] [, helpfile, context‬‬

‫‪CODE‬‬
‫)”‪Msg = MsgBox(“How Are You”, vbOKOnly, “Message‬‬

‫‪ -‬يمكنك أن تلحظ أنني استخدمت ( ‪ ) Prompt‬كسلسلة نصية ‪ ،‬و ‪ vbOKOnly‬كزر ‪ ،‬والعنوان كان سلسلة نصية أيضا ‪ ،‬لبد من أن‬
‫تكون ‪ Prompt‬عبارة عن سلسلة نصية وتمثل الرسالة التي تريد المستخدم قراءتها ‪ ،‬وأما معلم الزر يتطلب تعبير رقمي ( رقم صحيح أو‬
‫ثابت ) ‪ ،‬كما تخبر ‪ VBA‬عن أي الزرار أو اليقونات التي سوف تضعها في مربع الحوار ‪.‬‬
‫‪ -‬إذا تجاهلت تعيين قيمة للزر ( معلم ) فإن ‪ VBA‬سيضع زر ( موافق ‪ ) OK‬افتراضا ‪ ،‬وإليك قائمة بمعالم أزرة مربعات الحوار ‪:‬‬

‫‪ -‬يمكنك اختيار عرض أيقونة معينة ( للتحذير أو معلومة ) أو زر مساعدة ‪ ،‬وإضافة بعض التنسيقات الضافية على الزرة المختارة ‪.‬‬
‫‪ -‬دالة ‪ )(MsgBox‬ترجع قيمة صحيحة فيما بين ‪ 7-1‬ويتوقف ذلك على الزر المختار ‪.‬‬
‫‪ -‬ومن الواضح أن ذلك غير مفيد إل في حالة وجود أكثر من زر ‪ ،‬القيمة المرجعة ينبغي أن تستخدم بعد ذلك لتحديد مسار العمل في البرنامج‬
‫الخاص بك ‪.‬‬
‫‪ -‬ل تضع الكثير من مربعات الرسائل في برنامجك فذلك يعتبر مزعج للغاية ‪ ،‬وقد تحدث اضطرابات من جراء الرد على رسائل غير هامة ‪.‬‬

‫** بنهاية هذا الجزء **‬


‫فإننا تعرفنا على المتغيرات ‪ ،‬أنواع البيانات ‪ ،‬الثوابت ‪ ،‬المصفوفات ( كنوع من البيانات ) والمدخلت والمخرجات ‪...‬‬
‫في الجزء الخامس بإذن ال سنتعرف على ( الجراءات الفرعية ‪ ،‬والحداث ‪ ،‬و الدوال الوظيفية في ‪) VBA‬‬
‫أسألكم الدعاء‬
‫‪36‬‬
‫نبدأ معاً وبعون ال الجزء الخامس‬

‫** أحب أن أنوه أول على أن الترجمة الحرفية للمصطلحات عقيمة أو بمعنى أدق غير دقيقة ‪ ،‬بمعنى أن التعامل مع المصطلح النجليزي أهم‬
‫وأوضح في إيصال المعلومة ‪ ،‬لذا أنوه على أنني استخدمت التالي ‪:‬‬
‫‪ -1‬مصطلح ( إجراءات فرعية ) للدللة على (‪.. ) Sub procedures‬‬
‫‪ -2‬مصطلح ( إجراءات الحدث أو الحداث ) للدللة على ( ‪.. ) Event Procedures‬‬
‫‪ -3‬مصطلح ( إجراءات الوظائف أو الدوال ) للدللة على ( ‪.. ) Function procedures‬‬

‫الجزء الخامس ‪ :‬الجراءات الفرعية ‪ ،‬والحداث ‪ ،‬وإجراءات الوظائف‬


‫‪VBA Sub, Event and Function Procedures‬‬

‫في هذا الجزء سوف تتعلم التالي ‪:‬‬


‫** إنشاء الجراءات الفرعية ‪ ،‬وإجراءات الحداث ‪ ،‬وإجراءات الوظائف ‪..‬‬
‫** طرق تنفيذ هذه الجراءات ‪..‬‬
‫** كيفية تنفيذ إجراءات الوظائف ‪..‬‬

‫‪ )1‬المقارنة بين الجراءات الفرعية وإجراءات الحدث وإجراءات الوظائف ‪..‬‬


‫‪ -‬الجراءات التي يتم إنشاءها في كود الـ ‪ VBA‬هي تلك التي يتم كتابتها في ‪ ، VBE‬وأكثر أنواع الجراءات شيوعا هي تلك الخاصة بـ‬
‫( الفرعية ‪ ،‬والحداث ‪ ،‬والوظائف ) ( ‪. ) Sub , Events , Functions‬‬
‫* الجراءات الفرعية ‪ ...‬تتكون من التصريحات أو البيانات الخاصة بـ ‪ VBA‬تلك التي تمثل مهمة ( أو مهام ) في إكسيل ‪ ،‬ويتم تنفيذ أكواد‬
‫البرنامج عن استدعائهم ( من قبل جزء آخر بالبرنامج ) ‪..‬‬
‫* إجراءات الحداث ‪ ...‬تلك الجراءات معرفة مسبقا في ‪ VBA‬بحيث ل يمكنك تغيير اسم هذا الجراء ‪ ،‬ول الكائن ضمن هذا الجراء ‪ ،‬ول‬
‫الظروف ضمن أداء هذا الجراء ‪ ،‬ويتم تنفيذ كود البرنامج عند حدوث الحدث مثل (‪.. ) Worksheet_Activate‬‬
‫* إجراءات الوظائف ‪ ...‬هي عبارة عن مجموعة من بيانات ‪ VBA‬التي تمثل عملية حسابية معينة أو إرجاع قيمة معينة ‪ ،‬ول يمكنك إنشاء‬
‫وظيفة أو دالة باستخدام مسجل الماكرو ‪..‬‬
‫‪ -‬أغلب الكواد التي يتم كتابتها بالماكرو في ‪ VBA‬هي عبارة عن إجراءات فرعية ‪ ،‬تعتمد على أكواد ‪ VBA‬التي قمت بكتابتها ‪ ،‬ولو قمت‬
‫بتنفيذ إجراء فرعي سيتم إحداث شيء معين ‪..‬‬
‫‪ -‬أما بالنسبة لجراءات الحداث ‪ ،‬فكل ما عليك القيام به مع هذه الجراءات هو إضافة الكود الخاص بالحدث ليتم تنفيذه عند حلول الظروف‬
‫المناسبة لذلك ‪ ،‬كحدث ( ‪.. ) Worksheet_Activate‬‬
‫‪ -‬وبالنسبة إلى إجراءات الوظائف أو الدوال ‪ ،‬تحتاج فقط للتفكير في دوال ووظائف إكسيل التي تستخدمها كل يوم مثل (‪MAX, SUM,‬‬
‫‪ ) AVERAGE‬وأعتقد أنك على دراية بوظائف تلك الدوال وبمصطلح دالة نفسه ‪ ،‬فالدالة في إكسيل يمكنها أن تؤدي عملية أو ترجع قيمة ‪،‬‬
‫وكذلك الحال بالنسبة لجراءات الوظائف في ‪.. VBA‬‬

‫‪ )2‬العامة و الخاصة ومجال الجراءات ‪Private, Public, and Procedure Scope‬‬


‫‪ -‬يمكن للجراءات في ‪ VBA‬أن تكون إما إجراءات عامة ‪ Public‬أو خاصة ‪ Private‬من حيث المدى أو المجال ‪ ،‬تلك الكلمتين (‬
‫‪ ) Private , Public‬تستخدمان في العلن عن الجراء بطريقة مشابهة للعلن عن المتغيرات مثل ‪ ،‬وعملية التسمية أو العلن تلك‬
‫عملية اختيارية ‪ ،‬وعندما تعلن عن إجراء ما أنه ‪:‬‬
‫‪ -‬عام ‪ ... Public‬تجعل ذلك الجراء مرئيا لجميع الجراءات الخرى في موديولت المشروع ( ‪. ) modules‬‬
‫‪ -‬خاص ‪ ... Private‬يكون هذا الجراء مرئيا فقط للجراءات الموجودة في نفس الموديول ‪.‬‬
‫‪ -‬وإذا لم يتم تحديد نوع الجراء ( عام أو خاص ) فإنه افتراضيا سيكون عام ‪.‬‬

‫*** الجراءات الفرعية ‪*** Sub procedures‬‬


‫‪ -‬لنشاء إجراء ‪ ..‬قم بتنشيط ‪ VBE‬ومن ثم قم بإضافة موديول جديد ‪ ،‬ونقرتين على ( ‪ ، ) Module1‬وهذا من شأنه فتح نافذة الموديول‬
‫والسماح بكتابة الكواد ‪ ،‬أدخل الكود الذي تراه في الصورة التالية ‪..‬‬

‫‪37‬‬
‫‪ -‬تبدأ كتابة الجراء الفرعي بالكلمة ‪ ، Sub‬وتنتهي بكلمة (‪.. ) End Sub‬‬

‫[كود[‪)(Sub Hello‬‬
‫‪“!MsgBox “Hello World‬‬
‫‪/[End Sub‬كود[‬

‫‪ -‬هذا المثال يعرض إجراء فرعي باسم ( ‪ ) Hello‬متبوعا بقوسين ‪ ،‬وفي معظم الحيان فإنها يكونان فارغان ‪ ،‬ومع ذلك فقد تمر على‬
‫إجراءات فرعية من إجراءات أخرى ‪ ،‬فإن أردت استخدام تلك الجراءات فإنه يتعين عليك ترقيمها بين القواس ‪.‬‬
‫‪ -‬ومثل الماكرو الذي قمت بتسجيله في الجزء الثاني مثل باستخدام ( مسجل الماكرو ) في إكسيل فإنه يكون دائما إجراء فرعي ‪.‬‬
‫وكما سترى في وقت لحق في هذا الجزء فإن إكسيل يوفر عدد ل بأس به من طرق تنفيذ إجراءات فرعية ‪.‬‬

‫*** إجراءات الحداث ‪*** Event procedures‬‬


‫‪ -‬عندما يحدث شئ في إكسيل فإننا ندعوه حدث ( ‪ ، ) Event‬ودعونا نرى أمثلة على الحداث في إكسيل ‪..‬‬
‫‪ -1‬فتح مصنف أو إغلقه ‪.‬‬
‫‪ -2‬تنشيط مصنف ‪.‬‬
‫‪ -3‬تنشيط ورقة عمل أو عدم تنشيطها ‪.‬‬
‫‪ -4‬حفظ مصنف ‪.‬‬
‫‪ -5‬حساب ورقة عمل ‪.‬‬
‫‪ -6‬عند النقر على زر ‪.‬‬
‫‪ -7‬الضغط على زر جمع أو القسمة ‪.‬‬
‫‪ -8‬حساب وقت معين ‪.‬‬
‫‪ -9‬حدوث خطأ ‪.‬‬
‫‪ -‬عندما تقوم بإنشاء إجراء حدث ‪ ،‬سيقوم ‪ VBA‬وبشكل تلقائي بتحديده لك ‪ ،‬قم بتنشيط ‪ VBE‬وأنقر مرتين على ‪ Sheet1‬لتستعرض‬
‫نافذة الكواد ‪ ،‬اختر ‪ Worksheet‬ثم اختر حدث ‪ ، Calculate‬لو فعلت ذلك تماما كالمثال بالصورة التالية ‪ ،‬فإن ‪ VBA‬سيقوم بكتابة‬
‫التعبير ‪ )(Private Sub Worksheet_Calculate‬و ‪ End Sub‬تلقائيا ‪ ..‬عندها أضف الكود ‪:‬‬

‫[كود[‪)(Private Sub Worksheet_Calculate‬‬


‫‪"!MsgBox "Welcome‬‬
‫‪/[End Sub‬كود[‬

‫‪38‬‬
‫‪ -‬عندما يتم تنفيذ هذا الكود سيتم عرض مربع رسالة ( ‪ ، ) Welcome‬وسوف تنفذ عندما يكون هناك عملية حسابية في ( ‪ ) Sheet1‬أي‬
‫أن عملية الحساب هي المثير لذاك الحدث ‪.‬‬
‫‪ -‬وسوف أريك مثال آخرا مع حدث آخر وهو ( ‪.. ) Workbook_Open‬‬
‫‪ -1‬افتح مصنف جديد ‪.‬‬
‫‪ -2‬قم بتنشيط ‪ VBE‬بالضغط على ‪ Alt-F11‬في آن واحد ‪.‬‬
‫‪ -3‬انقر مرتان على أيقونة ( ‪ ) ThisWorkbook‬كما بالصورة أعله ‪.‬‬
‫سيقوم ‪ VBE‬بعرض نافذة أكواد فارغة للكائن ‪. ThisWorkbook‬‬
‫‪ -4‬في نافذة الكواد على يمين الشاشة اختر ( ‪ ) Workbook‬من قائمة الكائنات المنسدلة على اليسار ‪.‬‬
‫سيقوم ‪ VBE‬تلقائيا بإدخال التعبيرات أو التصريحات الخاصة ببداية ونهاية الجراء الخاص بـ (‪.. ) Workbook_Open‬‬
‫‪ -5‬أدخل الكود التالي ‪:‬‬

‫[كود[‪)(Private Sub Workbook_Open‬‬


‫‪Dim Msg As String‬‬
‫‪If Today)Now( = 2 Then‬‬
‫‪” Msg = “Its Monday. Welcome back‬‬
‫‪“!Msg = Msg & “to the real world‬‬
‫‪MsgBox Msg‬‬
‫‪End If‬‬
‫‪/[End Sub‬كود[‬

‫‪ -‬يتم تنفيذ ( ‪ ) Workbook_Open‬تلقائيا عند فتح المصنف ‪ ،‬وتستخدم دالة ( ‪ ) Today‬الخاصة بـ ‪ VBA‬لتحديد اليوم في السبوع ‪،‬‬
‫فلو كان اليوم هو ( الثنين ) – وهو اليوم الثاني في أيام السبوع ( إنجليزيا بالطبع ) – يقوم مربع رسالة بتحية المستخدم بالعودة للعمل مرة‬
‫أخرى ‪ ،‬ولو لم يكن اليوم هو الثنين فلن يحدث شيء ‪.‬‬

‫نستكمل سويا المرة القادمة إن شاء ال مع ( إجراءات الوظائف – تسمية الفرعي والوظائف – تنفيذ إجراءات الحداث ‪) ...‬‬
‫أعذروني للتقصير‬
‫والسلم عليكم ورحمة ال وبركاته‬

‫‪39‬‬
‫الدرس الثاني من الجزء الخامس ‪...‬‬

‫*** ‪ Function Procedures‬إجراءات الوظائف ***‬


‫‪ :‬وإليك مثال بسيط ‪ ) End Function ( ،‬وتنتهي بتعبير ( ‪ ) Function‬لجراء وظيفة ما ‪ ،‬عليك كتابة الكود بادئاً بكلمة ‪-‬‬

‫‪CODE‬‬
‫)‪Function SquareRoot(num‬‬
‫)‪SquareRoot = num ^ (1 / 2‬‬
‫‪End Function‬‬

‫تأخذ دالة رقمية واحدة ( وهي التي بين القوسين ) ‪ ،‬و ‪ )SquareRoot ( ،‬في هذا المثال فإن الوظيفة ( المهمة ) المراد تنفيذها تسمى ‪-‬‬
‫الوظائف يمكنها أن تأخذ أي عدد من الصيغ أو الدوال أو المعادلت ( أيها اسم تحب فهو صحيح ) أو ل شئ على الطلق ‪ ،‬في مثالنا عندما‬
‫‪ .‬يتم تنفيذ تلك الصيغة ‪ ،‬يتم إرجاع قيمة مفردة هي الجذر التربيعي للصيغة التي تمر على الوظيفة‬
‫ويحتوي الجزء الرابع ‪ ) Function ( ،‬يتيح لك أي نوع من القيم ( مثل نوع البيانات ) التي تريد إرجاعها بواسطة إجراء ‪ VBA‬كما أن ‪-‬‬
‫‪ .‬على معلومات أكثر عن أنواع البيانات‬
‫الوظائف يمكنك استخدامها بطريقتين فقط ‪ ،‬يمكنك تنفيذها عن طريق إجراء ( إجراء فرعي أو وظيفي ) ‪ ،‬أو استخدامها في صيغة ورقة ‪-‬‬
‫‪ .‬العمل‬
‫‪ :‬بنقم بمثال آخر ‪ ،‬هذه الوظيفة لحساب مساحة المستطيل ‪ ،‬والمعادلة هي ( المساحة = الطول × العرض ) كالتالي ‪-‬‬

‫‪CODE‬‬
‫‪Public Function Rect(ByVal length As Double, width As Double) As Double‬‬
‫‪Rect  = length * width‬‬
‫‪End Function‬‬

‫‪ :‬والذي يمكن أن يكتب على النحو التالي << ()‪ >> Rect‬هذا الجراء استخدم الوظيفة ‪-‬‬

‫‪CODE‬‬
‫)(‪Private Sub CalcRect‬‬
‫‪Dim length As Double‬‬
‫‪Dim width As Double‬‬
‫‪Dim result As Double‬‬
‫))”‪length = Val(InputBox(“Enter the length.”, “Length‬‬
‫))”‪width = Val(InputBox(“Enter the width.”, “Width‬‬
‫)‪result = Rect(length, width‬‬
‫)‪MsgBox (“The area is” & result‬‬
‫‪End Sub‬‬

‫‪ -‬هذا الكود بالفعل بسيط جدا ‪ ،‬أولً يتم سؤال المستخدم لوضع المدخلت ( الطول والعرض ) ‪ ،‬وبعد أن يتم تعيين القيمتين للوظيفة (‬
‫‪ ، ) )(Rect‬هنا تتم عملية حساب النتيجة وكذلك إرجاعها للجراء ‪ ،‬و (‪ ) msgbox‬لعرض مساحة المستطيل ‪.‬‬

‫‪40‬‬
‫‪ )3‬تسمية الفرعي والوظائف ‪.. Naming Subs and Functions ...‬‬
‫‪ -‬هناك قواعد يجب أن تتبع لتسمية الجراءات ‪..‬‬
‫* ‪ VBA‬ل يفرق بين الحرف الكبيرة والصغيرة ‪.‬‬
‫* ل يمكنك استخدام أي من الرموز التالية في عملية التسمية (‪. ) ! ,* ,^ ,@ ,& ,% ,$ ,#‬‬
‫* الحروف والرقام وبعض علمات الترقيم مسموح بها ‪ ،‬ولكن السم يجب أن يبدأ بحرف ‪.‬‬
‫* أي اسم يجب أل يتعدى ‪ 255‬حرف ‪ ،‬بالطبع أنت ل تحتاج لكل هذا العدد من الحرف ‪.‬‬
‫* ل مسافات أو فراغات بين الحرف ‪.‬‬
‫‪ -‬ومن المستحسن بالطبع أن يدل اسم الجراء على المهمة أو الغرض منه ‪ ،‬كمثال ‪GetUserName, InputTaxData,‬‬
‫‪ ، PerformSort‬وهكذا ‪...‬‬
‫‪ -‬بعض المبرمجين يفضلون استخدام الجمل والتعبيرات لتصف الجراءات وصفا شامل ‪ ،‬مثل ‪WriteReportToTextFile ،‬‬
‫‪ Get_Print_Options_and_Print_Report‬وهكذا ‪ ،‬ولستخدام هذه السماء الطويلة نسبيا إيجابيات وسلبيات ‪ ،‬فمن جهة هذه‬
‫السماء تصف الجراء وصفا دقيقا بحيث تزيل الغموض ‪ ،‬ولكن من جهة أخرى من المفضل أل تكون طويلة جدا ‪ ،‬يمكنك تسمية الجراء على‬
‫طريقتك الخاصة بحيث يصف الجراء ولكن تجنب السماء التالية (‪.. ) tIt, DoThis, RunAgain, and Macro1‬‬

‫‪ )4‬تنفيذ إجراءات الحداث ‪.. Executing Events procedures ...‬‬


‫‪ -‬يتم تنفيذ إجراءات الحداث تلقائياً بمجرد إثارة أو حدوث هذا الحدث ‪ ،‬ولقد شاهدت بعض المثلة على إجراءات الحداث مسبقا مثل إجراء (‬
‫‪ ) )(Click‬للتحكم في زر أمر ‪ ،‬و إجراء ( ‪ ) )(Calculate‬الخاص بورقة العمل ‪.‬‬
‫‪ -‬ل يمكنك تغيير اسم إجراءات الحداث ‪ ،‬فهي معرفة مسبقا من قبل ‪ ، VBA‬وهنا فكل ما تحتاج للقيام به هو البحث عن حدث معين ومن ثم‬
‫تدرج ( الكود ) الخاص به ليتم تنفيذه ‪.‬‬
‫‪ -‬عندما يتم حدوث حدث معين أو إثارته مثل ( ‪ ) Worksheet_Activate‬فإن الكود الذي أدرجته في الجراء سيتم تنفيذه ‪ ،‬وسوف‬
‫نناقش هذه الجزئية بشكل مفصل فيما بعد ‪.‬‬

‫‪ )5‬تنفيذ الجراءات الفرعية ‪.. Executing Sub procedures ...‬‬


‫‪ -‬سوف أشرح لك الن الطرق والوسائل التي تستطيع بها تنفيذ هذه الجراءات ‪ ،‬فالجراءات ل قيمة لها حتى تعرف كيف تقوم بتشغيلها ‪.‬‬
‫‪ -‬فلنبدأ مع الجراءات الفرعية ( ‪ ، ) Sub Procedures‬لتنفيذ إجراء فرعي ( ليست القائمة شاملة ) ‪:‬‬
‫* استخدم المر التالي ( ‪ ) Run Sub/UserForm‬من القائمة ( ‪ ) Run‬في نافذة ( ‪ ، ) VBE‬هذا المر يمكن الوصول إليه عن طريق‬
‫الضغط على مفتاح ( ‪ ) F5‬في النافذة الرئيسية ‪ ،‬أو عن طريق القائمة ( ‪. ) Run‬‬
‫* في مربع حوار ماكرو في الكسيل ‪ ،‬قم باختيار التالي (‪ ) Tools-Macro-Macros‬أو ( أدوات – ماكرو – وحدات ماكرو ) أو اضغط‬
‫على مفتاحي ( ‪ ، ) Alt + F8‬عندما يظهر مربع الحوار ماكرو قم باختيار الجراء الفرعي المراد تنفيذه وانقر على زر تشغيل ‪.‬‬
‫* والطريقة السهلة هي عن طريق الضغط على ( ‪ ) Ctrl + key shortcut‬وهو الختصار الذي قمت مسبقا بتعيينه عند كتابة ماكرو‬
‫معين ويجب عليك تذكره للقيام بتنفيذه ‪.‬‬
‫* الضغط على زر أو شكل معين قد قمت مسبقا بتكليفه بتنفيذ إجراء معين عند النقر عليه ‪.‬‬
‫* عن طريق إجراء فرعي آخر قمت بكتابته ‪.‬‬
‫* تلقائيا عندما تفتح أو تغلق مصنف ‪.‬‬
‫* عندما يحدث حدث آخر مثل تنشيط ورقة عمل أو تفعيل ‪ UserForm‬أو أي حدث آخر ‪..‬‬
‫‪ -‬وسوف أريك الن بعض هذه التقنيات في الجزء التالي ‪ ،‬سنقوم بتنفيذ الجراءات التي قمنا بعملها أعلى ‪...‬‬

‫(‪ )A‬تنفيذ الجراءات الفرعية مباشرة ‪...‬‬


‫‪ -‬تعتبر أسرع طريقة لتنفيذ إجراء فرعي عن طريق كتابة ذلك في موديول ‪ VBA‬الخاص بالجراء ‪ ،‬اتبع تلك الخطوات ‪:‬‬
‫* قم بتنشيط نافذة ‪ ، VBE‬ومن ثم افتح نموذج أو الموديول الخاص بالجراء ‪.‬‬
‫* انقل المؤشر في أي مكان في كود الجراء ‪.‬‬
‫* اضغط مفتاح ( ‪ ) F5‬أو اذهب إلى (‪ ) Run Sub/UserForm - Run‬أو من شريط الوامر أنقر علمة تشغيل ‪..‬‬
‫* سيتم تنفيذ هذا الجراء على الفور‬

‫‪41‬‬
‫(‪ )B‬تنفيذ الجراء عن طريق مربع حوار ماكرو ‪.‬‬

‫لسف جدا يا جماعة وال اني مشغول جدا‬


‫اليوم ان شاء ال بخلص معاكم الجزء الخامس باذن ال ‪ ،‬بس بالليل طباع‬
‫‪ .‬تنفيذ الجراء عن طريق مربع حوار ماكرو (‪B‬‬
‫والخطوة التالية توضح كيفية تنفيذ إجراء عن طريق مربع ‪ VBE ،‬في أغلب الحيان فإن تنفيذ إجراء معين يكون من خلل إكسيل وليس ‪-‬‬
‫‪ ..‬حوار ماكرو‬
‫‪ ..‬تنشيط إكسيل *‬
‫‪ .‬لتنشيط إكسيل ‪ ،‬ولو كان الكسيل نشيطا بالفعل تجنب هذه الخطوة ( ‪ ) Alt + F11‬اضغط على‬
‫( ‪ ) Alt + F8‬اضغط على *‬
‫‪ .‬سيتم عرض مربع حوار ماكرو ‪ ) Tools – Macro – Macros ( ،‬أو يمكنك الذهاب إلى ( أدوات – ماكرو – وحدات ماكرو ) أو‬
‫‪ .‬أو انقر مرتين على اسم الماكرو من القائمة ‪ ) Run ( ،‬اختر الماكرو ‪ ،‬ثم تشغيل *‬

‫‪ ..‬تنفيذ الجراء عن طريق مفاتيح الختصار ©‬


‫طريقة أخرى لتنفيذ الماكرو هي عن طريق استخدام مفاتيح الختصار ‪ ،‬ولكن قبل أن يمكنك استخدام هذه الطريقة ‪ ،‬يتوجب عليك القيام ‪-‬‬
‫‪ ...‬ببعض المور ‪ ،‬خاصة تعيين مفتاح اختصار للجراء أول‬
‫يتاح لك خيار تعيين مفتاح اختصار للماكرو في مربع حوار تسجيل ماكرو أثناء قيامك بتسجيل ماكرو جديد ‪ ،‬أما إذا كنت قد قمت بعمل ‪-‬‬
‫إجراء معين بدون خاصية تسجيل الماكرو ‪ ،‬فيمكنك عمل مفتاح اختصار للجراء ( أو تغيير مفتاح اختصار معين مسبقا ) عن طريق الخطوات‬
‫‪42‬‬
‫‪ :‬التالية‬
‫‪ ) Alt + F8 ( .‬أو ( ‪ ) Tools – Macro – Macros‬اختر ( أدوات – ماكرو – وحدات ماكرو ) أو *‬
‫‪ Hello ( .‬اختر اسم الجراء من قائمة الجراءات المتوفرة ( وفي هذا المثال فالجراء اسمه *‬
‫‪ ( .. ) Option ( .‬اضغط زر ( خيارات *‬
‫‪ ) Ctrl (.‬يظهر لك مربع حوار ( خيارات الماكرو ) قم بكتابة مفتاح الختصار داخل المربع المسمى *‬
‫‪ .‬اضغط على زر موافق أو إلغاء لغلق مربع الحوار *‬

‫من فضلك انتبه إلى أنه مفتاح الختصار الذي قمت ‪ + Ctrl ( ،‬بعد تعيين مفتاح الختصار يمكنك تنفيذ الجراء بالضغط على ( المفتاح ‪-‬‬
‫‪ ) Ctrl +‬بتعيينه لتنفيذ الجراء ل يجب أن يطغى على مفاتيح الختصار الخاصة بإكسيل ‪ ،‬على سبيل المثال لو قمت بتعيين مفتاح اختصار‬
‫‪ .‬فإنك لن تستطيع فيما بعد استخدام هذا الختصار لعملية النسخ كما كنت تفعل مسبقا ( ‪C‬‬

‫‪ .‬تنفيذ الجراء عن طريق زر أو شكل (‪)D‬‬


‫الطريقة الخرى لتنفيذ ماكرو هي عن طريق إسناد تنفيذ الماكرو أو الجراء لزر أو أي شكل في المصنف ‪ ،‬ولعمل ذلك اتبع الخطوات التالية ‪-‬‬
‫‪:‬‬
‫‪ .‬قم بتنشيط المصنف *‬
‫‪ ( ) Form ( .‬قم بفتح مجموعة ( نماذج *‬
‫‪ .‬في مجموعة النماذج ( ‪ – Button‬انقر على الداة ( زر *‬
‫‪ .‬قم بالسحب على ورقة العمل لنشاء الزر *‬
‫‪ ( .‬بعد إضافة الزر إلى ورقة العمل ‪ ،‬سيقوم إكسيل تلقائيا بعرض مربع حوار ( تعيين ماكرو ‪-‬‬
‫‪ .‬اختر الماكرو الذي تريد تعيينه للزر *‬
‫‪ .‬اضغط على موافق *‬
‫بهذه الطريقة فإنه بمجرد الضغط على الزر يتم تنفيذ الجراء ‪ ،‬يمكنك كذلك تعيين ماكرو أو إجراء لي شكل أو كائن ‪ ،‬فعلى سبيل المثال لو ‪-‬‬
‫أنك أردت تعيين شكل مستطيل لتنفيذ الجراء ‪ ،‬قم أول برسم المستطيل على ورقة العمل ‪ ،‬ثم انقر بالزر اليمن للفأرة على المستطيل ‪ ،‬واختر‬
‫( تعيين ماكرو ) من القائمة المنزلقة ‪ ،‬ثم اضغط موافق ‪ ،‬وبعد عمل نفس الخطوات السابقة فإنه بمجرد الضغط على المستطيل يتم تنفيذ‬
‫‪ .‬الماكرو‬

‫‪43‬‬
‫‪ .‬تنفيذ إجراء عن طريق إجراء آخر (‪)E‬‬
‫‪ :‬يمكنك أيضا تنفيذ إجراء عن طريق إجراء آخر ‪ ،‬اتبع الخطوات التالية لو أردت تجربة ذلك‬
‫‪ ) Hello ( .‬التي تحمل الجراء ( ‪ ) VBA Module‬قم بتنشيط *‬
‫‪ :‬أدخل الكود التالي *‬

‫‪CODE‬‬
‫)(‪Sub CallSub‬‬
‫‪      Call Hello‬‬
‫‪      End Sub‬‬

‫‪ ) CallSub ( .‬قم بتنفيذ الجراء *‬


‫‪ .‬المثلة أعله ليست على سبيل الحصر ‪ ،‬فهناك طرق أخرى متعددة لتنفيذ الجراء نأمل التطرق لها فيما بعد ‪-‬‬

‫‪ ... Executing Function procedures ..‬تنفيذ إجراءات الوظائف (‪6‬‬


‫‪ :‬يمكنك تنفيذ إجراءات الوظائف فقط بطريقتين ‪-‬‬
‫‪ ..‬إما باستدعاء الوظيفة عن طريق إجراء فرعي آخر ‪ ،‬أو إجراء وظيفة أخرى ‪1-‬‬
‫‪ .‬أو باستخدام الوظيفة أو الدالة عن طريق صيغ ورقة العمل ‪2-‬‬
‫‪ VBA Module :‬إليك مثال بسيط على إجراء وظيفة ‪ ،‬قم بإدخال الكود التالي في *‬

‫‪CODE‬‬
‫)‪Function SquareRoot(num‬‬
‫)‪SquareRoot = num ^ (1/2‬‬
‫‪End Function‬‬

‫على الرغم من بساطة هذه المهمة ‪ ،‬فهي تقوم فقط بحساب الجذر التربيعي للرقم الذي يمر بالجراء ‪ ،‬إل أنها تعتبر نقطة بداية جيدة لنا ‪-‬‬
‫‪ .‬لفهم الوظائف خاصة كيفية إرجاع الوظيفة أو المهمة للقيمة المارة بها‬
‫ولتخبر الوظيفة أي قيمة تود ‪ )SquareRoot ( ،‬هنا فإن الصيغة تقوم بحساب ( عدد مرفوع للقوة ‪ ) 1/2‬ثم أن النتيجة مسندة للمتغير ‪-‬‬
‫‪ .‬كاسم وظيفة مناسب ( ‪ )SquareRoot‬إرجاعها ‪ ،‬تقوم بتعيين هذه القيمة كاسم للوظيفة ‪ ،‬وقد استخدمنا‬
‫‪ :‬استدعاء الوظيفة عن طريق إجراء فرعي آخر (‪)1‬‬
‫أنظر كيف تتم عملية استدعاء للوظيفة عن طريق إجراء فرعي آخر ‪ ،‬نقوم بإدخال كود الجراء البسيط التالي في نفس موديول الوظيفة التي‬
‫‪ ) SquareRoot ) ..‬تحتوي على وظيفة‬

‫‪CODE‬‬
‫)(‪Sub GetSub‬‬
‫)‪Ans = SquareRoot(16‬‬
‫‪MsgBox Ans‬‬
‫‪End Sub‬‬

‫‪.‬الذي هو الجواب ‪ - 4‬عندما يتم تشغيل هذا الجراء ‪ ،‬يقوم الكسيل بعرض مربع رسالة يحتوي على قيمة المتغير ‪) Ans ( ،‬‬
‫‪ :‬ما الذي حدث بالضبط *‬
‫‪ .‬قمنا بتمرير الرقم ‪ 16‬على الوظيفة ‪1-‬‬

‫‪44‬‬
‫‪ .‬قامت الوظيفة بعملية الحساب وأرجعت القيمة ‪ 4‬وقامت بتعيين المتغير على أنه الرقم ‪2- 4‬‬
‫‪ .‬والذي قيمته ‪ 4‬على المستخدم ‪ Ans ،‬بعرض المتغير ‪ MsgBox‬قامت الوظيفة ‪3-‬‬
‫‪ :‬من الكود ‪ Ans‬بحذف المتغير ‪ GetSub‬يمكنك أيضا تبسيط الجراء ‪-‬‬

‫‪CODE‬‬
‫)(‪Sub GetSub‬‬
‫)‪MsgBox SquareRoot(16‬‬
‫‪End Sub‬‬

‫‪ :‬استدعاء مهمة عن طريق صيغ ورقة العمل (‪)2‬‬


‫‪ .‬عن طريق صيغ ورقة العمل ‪ VBA‬إنه لفي غاية البساطة استدعاء إجراء مهمة في ‪-‬‬
‫‪ :‬ثم أدخل الصيغة التالية في أي خلية ‪ )SquareRoot ( ،‬اذهب إلى ورقة العمل في نفس المصنف الذي يتضمن وظيفة *‬

‫‪CODE‬‬
‫)‪=SquareRoot(25‬‬

‫‪ ( .‬ستحصل على القيمة ( ‪ ) 5‬في الخلية ‪ ،‬وهي الجذر التربيعي للرقم ( ‪- 25‬‬
‫يحتوي قيمة ‪ ،‬يمكنك ( ‪ ) C1‬على سبيل المثال لو أنه الخلية ‪ )SquareRoot ( ،‬يمكنك أيضا استخدام مرجع الخلية على أنه الوظيفة ‪-‬‬
‫‪ :‬إدخال الصيغة التالية‬

‫‪CODE‬‬
‫)‪=SquareRoot(C1‬‬

‫‪ -‬في هذه الحالة فإن الصيغة ستقوم بتنفيذ المهمة على الخلية ( ‪. ) C1‬‬

‫(( نقطة هامة جدًا ))‬


‫‪ -‬يمكن استخدام هذه الصيغة عدة مرات كما تريد في ورقة العمل ‪ ،‬ولو أنك قمت باختيار ( ‪ ) Insert-Insert Function‬أو ( إدراج –‬
‫إدراج دالة ) في خلية ما ‪ ،‬ثم قمت باختيار فئة ( معرفة بواسطة المستخدم ) أو (‪ ) User Defined‬ستفاجأ بأن الدالة ( اسم الدالة أو‬
‫الوظيفة ) التي قمت بكتابتها مسبقا في ‪ VBA‬قد أدرجت من دوال إكسيل الجاهزة في مربع حوار إدراج دالة ‪ ،‬كما ترى بالشكل التالي ‪ ،‬فإن‬
‫مربع حوار إدراج دالة قد قام بإضافة الدوال والوظائف الخاصة بك ‪ ...‬جيد للغاية ‪.‬‬

‫‪45‬‬
‫هنا ‪ ،‬وانتهى الجزء الخامس بحول ال وقدرته‬
‫الحمد ل رب العالمين‬
‫وانتظروا الجزء السادس وفيه ( التحكم في التعبيرات المنطقية والحلقات – تعبيرات ‪) If/then/else – select/case‬‬
‫أسأل كل من استفاد الدعاء‬

‫==============================================================‬

‫السلم عليكم ورحمة ال وبركاته‬


‫نعود مرة أخرى والعود أحمد ‪ ،‬آسف جدا ليكم يا جماعة على التأخير وخصوصاً للمتابعين ‪ ،‬فلقد مررت بأوقات عصيبة يعلمها ال وحده ‪،‬‬
‫ولكن الحمد ل استقرت المور مرة أخرى ‪ ،‬ونستكمل سويا الجزء السادس إن شاء ال ‪ ...‬وهو بعنوان ‪:‬‬
‫الجزء السادس ‪ :‬التحكم في المنطق والحلقات‬
‫‪Control Logic And Loops‬‬
‫* في الجزء الول سنناقش التالي ‪:‬‬
‫‪ -1‬المنطق المشروط ‪.‬‬
‫‪ -2‬العبارات المشروطة و (‪ If/Then/Else‬و ‪ ) Select/Case‬في بناء الكواد ‪.‬‬
‫‪ -3‬الحلقات ‪.‬‬

‫‪ -‬جميع لغات البرمجة تحتوي على تعبيرات منطقية يتم استخدامها في السيطرة على سلسلة من البيانات خلل البرنامج ‪ ،‬وبالطبع فإن ‪VBA‬‬
‫ليس استثناء من هذه القاعدة ‪ ،‬فحينما نقول ‪ A < B‬أو ِ‪ A = B‬فهذا يعني أننا نقول ‪:‬‬
‫‪ -‬قيمة المتغير ‪ A‬تكون أكبر من قيمة المتغير ‪> B‬‬
‫‪ -‬قيمة المتغير ‪ A‬مساوية لقيمة المتغير ‪B‬‬
‫‪ -‬والتعبير أعله يتم تقييمها من خلل برنامج الكمبيوتر ( ‪ ، ) True or False‬وعلى أساس ذلك يتم توجيه مسارها للتعبير المنطقي ‪،‬‬
‫وبذلك فالكمبيوتر يقوم باختيار المسار الصحيح لتنفيذه ‪.‬‬
‫‪46‬‬
‫‪ -‬فضل عن ذلك فإن المبرمجين يستخدمون تعبيرات مثل ( ‪ ، ) And , Or , Not‬وسنفهم ذلك جيدا عندما نشاهد مثال عمليا إن شاء ال ‪.‬‬
‫عامة ‪ ،‬كن متأكدا من أنك تعرف هذه الرموز جيدا ‪:‬‬
‫= ‪ Tests for equality‬الختبار للمساواة‬
‫<> ‪Tests for inequality‬الختبار لعدم المساواة‬
‫< ‪ Less than‬أقل من‬
‫> ‪Greater than‬أكبر من‬
‫<= ‪Less than or equal to‬أقل من أو يساوي‬
‫>= ‪ Greater than or equal to‬أكبر من أو يساوي‬

‫‪ -‬أما بخصوص ( ‪ ، ) And , Or , Not‬فإن الثلث جداول أدناه توضح القواعد ‪..‬‬
‫** القيم الحقيقية للصيغة ‪And‬‬
‫‪Condition1 --------- Condition2 ---- Condition1 AND Condition2‬‬

‫‪True ---------------- True ------------------------------ True----‬‬


‫‪True --------------- False ----------------------------- False----‬‬
‫‪False --------------- True ----------------------------- False----‬‬
‫‪False --------------- False ----------------------------- False----‬‬

‫** القيم الحقيقية للصيغة ‪Or‬‬


‫‪Condition1 ----------- Condition2 ------- Condition1 OR Condition2‬‬
‫‪True ------------------ True------------------------------ True----‬‬
‫‪True ------------------- False --------------------------- True----‬‬
‫‪False ----------------- True----------------------------- True----‬‬
‫‪False ----------------- False --------------------------- False ----‬‬
‫** القيم الحقيقية للصيغة ‪Not‬‬

‫‪Condition1 ----------- NOT Condition1‬‬


‫‪True -------------------- False----‬‬
‫‪False --------------------- True----‬‬
‫في هذه الحالة فقط فإن القيمة ل تحتمل غير أحد الحالتين صحيح ‪ /‬خطأ ‪..‬‬

‫‪ )1‬الجمل الشرطية والتشعب ‪.‬‬


‫‪ -‬دعونا الن نبدأ بدراسة بسيطة ولكنها في غاية الهمية لبناء أكواد ‪ ، VBA‬فسوف تستخدمها في جميع برامجك التي ستصممها بإذن ال ‪،‬‬
‫إنها صيغة ( ‪ .. ) If/Then/Else‬هذه البنية تعرف على أنها مشروطة وفي نفس الوقت متفرعة ومتشعبة ‪ ،‬وذلك لنها تستخدم البيانات‬
‫المشروطة في تغيير تدفق أو اتجاه تنفيذ البرنامج ‪.‬‬

‫** ‪** If / Then / Else‬‬


‫هناك طرق عدة لتنفيذ بنية هذا الكود ‪ ،‬وفي أبسط طرق هذه البنية نستخدم سطر واحد من الكود ‪:‬‬
‫‪) If )condition( Then ) code statement‬‬
‫في هذا المثال ‪ ،‬إذا كان تقييم الشرط على أنه صحيح ( ‪ .. ) true‬فإن البرنامج يتبع ما بعد ( ‪ ) then‬ويتم تنفيذه ‪ ،‬وإل فسوف يتم التحويل‬
‫إلى التعبير التالي ( ‪ ، ) next‬وإذا أردت تنفيذ أكثر من تعبير فإنه يتوجب عليك استخدام الفورمة التالية ( ‪ ) if/then – End if‬أي تنهي‬
‫الكود ب ‪.. End If‬‬
‫[كود[‪If )condition( Then‬‬
‫‘‪Block of code statements‬‬
‫‪/[ End If‬كود[‬

‫‪ -‬مرة أخرى ‪ ،‬فإنه يجب أن تكون حالة الشرط ‪ true‬وإل فالصيغة لن يتم تنفيذها ‪.‬‬
‫‪ -‬الجراء التالي عبارة عن لعبة بسيطة لتحديد العمر ‪ ،‬يتم عن طريقها قيام المستخدم بتخمين العمر المحدد مسبقا ‪ ،‬هناك ثلث تراكيب (‬
‫‪ ) if/then‬استخدمت في البرنامج لتحديد أي رسالة سوف يتم إخراجها للمستخدم طبقا لمدخلته ‪...‬‬

‫[كود[‪)(Private Sub GuessAge‬‬

‫‪Dim userGuess As Integer‬‬

‫‪47‬‬
‫‪Dim age As Integer‬‬

‫‪age = 25‬‬
‫‪))“userGuess = Val)InputBox)“Guess a number between 20 and 30.”, “Guess Age‬‬
‫‪If )userGuess < age( Then‬‬
‫‪)“!MsgBox )“Too high‬‬
‫‪)MsgBox )“The answer is “ & age‬‬
‫‪End If‬‬

‫‪If )userGuess > age( Then‬‬


‫‪)“!MsgBox )“Too low‬‬
‫‪)MsgBox )“The answer is “ & age‬‬
‫‪End If‬‬

‫‪)“!If )userGuess = age( Then MsgBox )“You got it‬‬

‫‪/[End Sub‬كود[‬

‫‪ -‬قمنا بإدخال القيمة ( ‪ ) 25‬لتحديد العمر ‪ ،‬وسيقوم المستخدم بتخمين هذا الرقم عن طريق مربعات الدخال ‪..‬‬
‫‪ -‬بنية أو صيغة ( ‪ ) If/Then‬تقوم بمقارنة القيمة المدخلة مع القيمة المخزنة وهي ( ‪ ، ) userGuess‬على سبيل المثال فلو أن‬
‫المستخدم خمن العمر الحقيقي ‪ ،‬عندما يكون الشرط مساو للقيمة المدخلة في مربع الدخال ‪ ،‬فإن رسالة نصية يتم تنفيذها على الفور وهي (‬
‫‪.. ) You got it‬‬
‫‪ -‬كما يجب عليك استخدام صيغة ( ‪ ) If / Then / Else‬في الحالت التالية ‪:‬‬
‫* تنفيذ بعد أكواد مطابقة للشروط الصحيحة ‪.‬‬
‫* اختيار واحد من اثنين من قوالب الكود ليتم تنفيذه ‪.‬‬

‫[كود[‪)If )condition‬‬
‫‘‪This block of code executes if the condition is true‬‬

‫‪Else‬‬
‫‘‪.This block of code executes if the condition is false‬‬
‫‪/[End If‬كود[‬

‫‪ -‬إن صيغة ( ‪ ) If / Then‬في إجراء تخمين العمر يمكنك أن تكتبها كالتالي ( حيث أن <> تعني عدم المساواة )‬

‫[كود[‪If )userGuess >< answer( Then‬‬


‫‪)MsgBox )“Wrong! The answer is “ & answer‬‬
‫‪Else‬‬
‫‪)“!MsgBox )“You got it‬‬
‫‪/[End If‬كود[‬

‫*** آسف مرة أخرى يا جماعة واعذروني على التقصير ‪ ،‬والمرة القادمة باذن ال بيكون معانا كورس يستاهل ‪ ،‬بس بصراحة كنت فرحان‬
‫وانا قاعد على الجهاز وشغال في الموضوع ده ‪ ،‬وقلت أي كم بخلصه على طول هنشره ‪ ،‬وشكرا لكم جميعا يا أحلى منتدى ‪...............‬‬

‫‪48‬‬

You might also like