بسم الله الرحمن الرحيم
اهلا بكم متابعى موقع عالم الاوفيس
نقدم لكم اليوم مجموعة دورس مهمة فى كيفية التعامل مع الاكسيل الفيجوال بيسك
للاستاذ القدير / محمد طاهر عرفة
فلة منا جزيل الشكر والتقدير والعرفان بالجميل
وجزاة الله خير الجزاء على كل مايقدمة من علم نافع للبشر
اجمع
برنامج اكسيل و تطبيقات الفيجوال بيزيك
الدرس الأول :
مقدمة : بعض
المعلومات الخلفية عن لغة البيزيك
كلمة بيزيك هي
اختصار ل Beginners
All-purpose Symbolic Instruction Code
و قد تم تطويرها
فى عام 1960 كوسية لتعليم البرمجة لطلبة الكليات
و كان يعيبها أن
كل سطر من الكود كان يتم ترجمته قبل تنفيذه مما كان يبطئ الأداء ثم سمحت بعد ذلك الاصدارات الحديثة
بعمل ال Compiling أو تفسير الكود مما زاد من
كفائتها
فى بداية
التسعينات اكتسبت لغة البيزيك الكثير من الشهرة عند بدء اصدارات البيزيك المرئي Visual
Basic و التي تعمل فى
بيئة ويندوز ووصلت الان الي الاصدار السادس. و تلاه بعد ذلك
تقنية الدوت نت و التي تعتبر نقلة نوعية و ليست تحديث
و ما نحن بصدد الكلام عنه فى سلسة الدروس هذه
ليس لغة البيزيك نفسها و
لكن لغة البيزيك للتطبيقات Visual Basic For Applications (
VBA)
كان
الاصدار الخامس من برنامج الاكسيل هو أول برنامج يحتوي علي امكانية استخدام
ال VBA ثم
بعد ذلك أصبح ال VBA هو
لغة البرمجة الموجودة داخل جميع تطبيقات أوفيس .
و
هذه اللغة يستخدمها بكثرة محترفوا استخدام الاكسس ، و لكن لها حظ أقل فى
الانتشار بالنسبة لباقي تطبيقات الأوفيس .
و فى هذه
السلسلة سنتحدث سويا ان شاء الله تعالي عن استخداماتها فى برنامج ال Excel حيث أنه من أكثر
البرامج التي يؤدي استخدام ال VBA فيه
لاضافات مذهلة
قد لا يتصورها المستخدم العادي و الذي سيتحول بعد فترة من
استخدام ال VBA من مستخدم
للبرنامح الي مطور برامج باستخدام الاكسيل ( و هو ماليس متعارف عليه )
و
مع اتقان استخدام ال VBA فى الاكسيل سيكون من السهل استخدامها فى باقي
التطبيقات مثل الوورد و الباو بوينت كل علي حسب الأشياء Objects المجودة فيه
فاستخدام
ال VBA فى
كل تطبيق يعتمد علي ال Object Model الخاص به، فعلي سبيل المثال فى
الاكسيل ال Objects متل
ال Worksheet لا تتواجد
فى التطبيقات الأخري و لذلك سيوجد اختلاف فى التطبيق و لكن المفهوم سيظل و احدا
و سنبدأ بعريف
المصطلحات الأتية :
Objects , Containers ,Collections ,Members,
& Properties
الأشياء
تستطيع التصرف كأوعية للأشياء الأخري فمثلا برنامج الاكسيل هو Object يسمي Application و هو يحوي علي
العديد من الأشياء الأخري
مثل Worksheet و التي بدورها
تحوي العديد من الأشياء مثل المدي Range و يقصد به مجموعة من الخلايا .. و هكذا ...
و كل مجموعة
أشياء متماثلة تسمي Collection و التي هي
بدورها تعتبر شيء أو Object و للتعبير عن عضو فى أي مجموعة نستخدم الفاصل (نقطة) كفاصل بين العضو و
المجموعة التي ينتمي اليها فللإشارة الي خلية فى ورقة عمل فى ملف معين .
Application.Workbooks("Book1.xls").Worksheets("Sheet1").Range("A1")
فى حالة حذف جزء من
الاشارة المرجعية فان البرنامج يستخدم الأشياء الفعالة بصورة افتراضية فاذا كان boook1 هو الفعال فيمكن كتاية
Worksheets("Sheet1").Range("A1")
و اذا كان Sheet1 هو الفعال
فيكتفي ب Range
( "A1")
و كل شيء ( Object) من الأشياء السالف ذكرها علي اختلاف مستوياتها له خواص Properties و Methods أي خواص و أساليب
فالخواص هي Setting خاص بالشيء مثل :
Range("A1").Value
أو Range("A1").Name
أما الأساليب
فهي أفعال يتم
تنفيذها مع الشيء Actions Related to the Object مثل:
Range("A1").ClearContents
====================================================
الدرس
الثاني :
التعرف علي محرر VBE
(Visual Basic Editor) :
حتي اصدار اكسيل 95 كان الكود
البرمجي يظهر كورقة منفصلة فى كتاب العمل Workbook و لكن بدءا من الاصدار 97 أصبح عليك أن تستخدم مصحح VBE حتي تستطيع أن
تري الأقسام البرمجية ، علما بأنها لا تزال تخزن فى ملفات كتاب العمل و
لكن لا يمكن التعامل معها حتي تستخدم ال VBE
لتشغيل محرر VBE هناك 3 طرق
1- اضغط علي ALT
+ F11
2- من قائمة Tools
--, Macros ---, Visual Basic Editor
3- اختيار اليقونة الخاصة ب VBE من شريط الأدوات
هذا بالطبع و
أنت داخل برنامج الاكسيل
بعد
فتح ال VBE نلاحظ أن هناك خمسة أجزاء رئيسية له
1- قضيب
القوائم
2- قضبان الأدوت Toolbars
3- نافذة مستكشف المشروع Project Explorer
4- نافذة الكود Code Window
5- النافذة المباشرة Immediate Window
الجزئين الأول و الثاني لا جديد فيهما علي مستخدم الاكسيل سوي اختلاف المحتويات عن
مثيليهما فى برنامج الاكسيل
التعامل مع مستكشف المشروعات Project Explorer
اذا لم يكن المستكش
مفتوحا فى أقصي يسار الشاشة اضغط CTR+R لفتحه . نلاحظ ان كل كتاب عمل اكسيل أو أي Add-in تكون مفتوحة تعتبر مشروعا بذاتها.
يمكن التفكير فى المشروع ك
كتجميع لمجموعة من الأشياء Objects و يمكن اظهار محتويات المشروع (توسيعه ) بالضغط علي ال (
+ ) و ضغط أو اخفاء المحتويات بالضغط علي )- )
ملحوظة : لتوسيع مشروع
محمي بكلة مرور لا بد من معرفة هذه الكلمة
و التي يمكن
اضافتها من Tools
--, Project Properties --, Protection و منه أيضا يتم تحديد اذا ما كان يسمح باظهار الكود أم
لا ( يظهر فقط باستخدام كلمة السر )
و
عادة ما يتكون المشروع من جزء خاص بالأكواد
المخصصة لكل ورقة عمل Worksheet بالاضافة
الي جزء للأكواد المخصصة لملف العمل ككل و
يمكن اضافة Modules و Class Modules و Forms داخل كل مشروع كما سيلي بالتفصيل لاحقا .
و لكن مبدئيا
لاضافة قسم برمجي Module يجب اختيار اسم
المشروع أولا من مستكشف المشروعات ثم Insert --, Module أو نفس الخطوات من القائمة المختصرة بعد اختيار المشروع
نختار Module من قائمة Insert
لحذف قسم برمجي
نختاره ثم نختار Remove من قائمة File ثم نحدد ما اذا
كنا نرغب فى تصديره
قبل حذفه ام لا
لاستيراد ملف
نفعل العكس : من File نختار Import و ذلك بعد
اختيار المشروع الذي نريد الاستيراد اليه
النافذة
المباشرة Immediate Window
هي مفيدة جدا
لاختبار الكود و قد لا تكون مرئية و لاظهارها نضغط CTR+G
نافذة
الكود
تسمي أحيانا Module
Window و هي تتحوي الكود الخاص بكل
جزء من المشروع ، و لكل جزء فى المشروع نافذة الكود الخاصة به و التي تظهر
بالضغط ضغطة مزدوجة علي هذا الجزء فى نافذة مستكشف المشروعات
و نافذة الكود يمكن أن
تحوي علي 4 أنواع من الاجراءات :
1- الاجراءات
الفرعية : Sub
Procedures و
هي مجموعة من الاجراءات التي تنفذ فعلا
2-اجراءات
الوظائف : Function
Procedures و هي مجوعة من ااجراءات التي تعيد قيمة او أكثر مثل
الدالة sum و التي تجمع أكثر من قيمة و تعيد مجموعها
3-الاعلانات : Declarations و هو معلومات تعطيها للغة ال VBA عن
المتغيرات التي ستستخدمها مثل نوع البيانات لهذا المتغير هل هو نص أم رقم
أم ...
4- اجراءات
المواصفة : Property
Procedure و هي اجراءات خاصة تستخدم فى حالة ال Class
Module
و ألان بعد هذه
المقدمة لنبدأ بمثال بسيط
لاستخدام ال VBA في برنامج ال Excel
لكتابة الكود فى
قسم برمجي Module هناك طريقتان
اما الكتابة و اما التسجيل
الطريقة الأولي
: الكتابة
أضف قسم برمجي
جديد Module كما سبق و
بداخله اكتب :
Sub Hellomsg()
TryAgain:
Msg = "Is ArabTeam2000 Your Favorite Programming Site ?"
Ans = MsgBox(Msg, vbYesNo)
If Ans = vbNo Then
MsgBox "Why it is not ?????, Try Again, You Must Say Yes!!!"
GoTo
TryAgain
Else
MsgBox "Good Answer !! "
End
If
End
Sub
أو
انسخ الكود من هنا و الصقه فى الموديول
لتشغيل
الكود
قف داخل ال Sub بالمؤشر
اضغط علي F5 أو
Run --, Sub أو
اختر أيقونة Run من شريط الأدوات
القياسي
هذا و أنت فى نافذة الكود
أو أغلق نافذة
الكود ز توجه الي ملف ال Excel ثم اضغط ALT+F8
أو اختار Tools,
Macro, Macros
ثم اختار Run بعد اختيار اسم
الSub
فستحصل علي نفس
النتيجة و هذا كله عن طريق تشغيل ال Sub الموجودة فى القسم البرمجي Module1
و
الآن دعونا نحلل ما كتبنا فى هذا الكود
1- علان
الاجراء ( اسم الجراء )
Sub Hellomsg()
2- تخصيص مكان يمكن للكود اعادة التنفيذ اليه لكي نعيد تنفيذ جزء من الكود
TryAgain:
3- تخصيص قيمة للتغيرات Msg, Ans
4- استخدام الدالة Msgbox و الاستفادة بناتج استخدامه ( الثوابت
المبنية VByes, VBno
) فى تحديد الرسالة التي تظهر و تحديد هل نعود الي مكان محدد فى الكود أم لا
و ذلك باستخدام التعبير If, Then, Else ,End if
5- نهاية الSub
و نلاحظ أن فى
هذا الكود مالم تجب ب(نعم) سيظل الكود يعود بك الي النقطة المرجعية TryAgain:
حتي نختار ( نعم )
يمكن عمل مفتاح
مختصر لتشغيل لاجراء
البرمجي و ذلك من خلال
اضغط ALT+F8
أو اختار Tools,
Macro, Macros
ثم اختار اسم
القسم البرمجي ثم اختار Option
وحدد CTR+Q مثلا
و بذلك يمكن تشغيل
لاجراء باستخدام المفتاح المختصر
بعد
أن استخدمنا الكود داخل ملف الاكسيل لابد من تغيير نظام
حماية الملف الي Medium أو Low لأن
فى حالة High لا
يعمل الكود مطلقا وذلك من Tools, Macro, Security و
أقترح عليكم نظام الحماية
المتوسط حيث يسألك عند فتح الملف هل تريد تفعيل الماكرو أم لا و في حالة اختيار
( لا ) لا يعمل أي من الأكواد المكتوبة داخل البرنامج
و الغرض من هذا هو حماية
ملفات الاكسيل من الفيروسات المكتوبة ب VBA فعليك أن تكون متأكد من أنك تريد استخدام الكود فى الملف ! و الا فان كنت
لا تعلم ما يوجد فى الملف من كود فاختار عدم تفعيل الماكرو و استكشف الكود أولا !!
لأن بعض الأكواد المكتوبة ب VBA تفعل أفعال مضرة كثيرة و لا يستهان بها
==================================================
الدرس الثالث : نقل الكميات الموجودة فى عمود
الاجمالي الي عمود السابق و اخلاء عمود الحالي عن طريق الكود
هذا
الدرس سيكون عمليا ، فسنقوم سويا بعمل VBA ماكرو يقوم باداء احدي المهام الروتينية التي
كثيرا ما يقوم مستخدم الاكسيل بعملها ، ووجدت أنسب مثال لذلك هو ما يقوم به من
ينشئ فاتورة أعمال أو مستخلص جديد من نقل الكميات الموجودة فى عمود الاجمالي الي عمود
السابق و اخلاء عمود الحالي من أي قيم
موجودة فيه.
و
بتشغيل هذا الماكرو يقوم المستخدم بتحديد الخلايا الموجود بها قيم الاجمالي ثم
يقوم بتشغيل الماكرو عن طريق الضغط علي CRT+Q أو الاختيار من القائمة كما سبق شرحه فتظهر له رسالتان
الاولي
تسأل عن عدد الاعمدة التي يبعد بها عمود السابق و تكون القيمة الافتراضية لها هي
-2 أي العمود السابق (و يمكن تغييرها ) ، و الثانية تسأل عن عدد الاعمدة الموجود
بها عمود الكمية الحالية و تكون القيمة الافتراضية لها هي -1 أي العمود السابق
للاجمالي مباشرة
قبل
أن نبدأ فى كتابة الماكرو المطلوب سنقوم بتسجيل ماكرو عن طريق تنفيذ بعض الاوامر و
نستخدم الجمل الناتجة منه فى عمل الماكرو الجديد ، حتي لا يظن احد أن عليه أن يحفظ
العديد من الاوامر و لكن ما سنفعله هو التعديل علي كود مسجل و هذا أفضل
من قائمة Tools اختار Macro ثم Record New Macro
انت
الآن فى وضع التسجيل
علم
علي أي مجموعة من الخلايا و اختار Copy ثم علم علي خلية و اختار
Paste Special Values ثم علم علي مجموعة أخري و اضغط Delete
ثم
أوقف تسجيل الماكرو عن طريق الزر الظاهر امامك
نلاحظ
ذكر أي مجموعة و أي خلية ، لأن الغرض حتي الان هو الحصول بسرعة علي الاوامر الخاصة
بالنسخ و اللصق و المسح و التي سجلت لمجموعة معينة من الخلايا بعينها و تحويلها
الي ماكرو يصلح للاستخدام علي أي حالة عامة
اضغط ALT+F11 لمشاهدة
الكود المسجل و تفحصه جيدا و لاحظ اننا سنستخدم الكثير من مكوناته عند اعداد
الماكرو المطلوب لتنفيذ نفس الخطوات علي أي مجموعة خلايا يتم اختيارها و
لصقها كقيم فقط علي خلايا أخري تبعد عنها بعدد متغير من الاعمدة ، و أخيرا مسح
مجموعة أخري من الخلايا تبعد عنها بعدد آخر من الأعمدة
وسنستعرض
فيما يلي الكود المطلوب لتنفيذ الماكرو الفعلي :
قم
بتسجيل ماكرو جديد كما سبق شرحه و اختار قيمة مختصرة لتنفيذه CRT+Q علي سبيل المثال
Sub NEWINV()
تعرف
المتغيرات
Dim MyRow As Long, Mycol As
Long
Dim PreviousCol As Integer,
Coltoclear As Integer
القيام بعد عدد
الاعمدة و الصفوف التي تم التعليم عليها
MyRow =
Selection.Rows.Count
Mycol =
Selection.Columns.Count
التأكد
من انه لم يتم التعليم علي أكثر من عمود ةو الخروج مع اعطاء رسالة فى تلك الحالة
If
Mycol > 1 Then
MsgBox
"Wrong No of Col", vbCritical, "Only one Column Allowed"
Exit
Sub
End
If
السؤال
عن عدد الاعمدة التي يبعد بها عمود السابق و تكون القيمة الافتراضية لها هي -2
PreviousCol =
InputBox("Enter Offset Col for Previous", "no of Col to the
Left", -2)
السؤال
عن عدد الاعمدة الاعمدة التي يبعد بها عمود الحالي و تكون القيمة الافتراضية لها
هي -1
Coltoclear =
InputBox("Enter Offset Col for Current", "no of Col to the
Left", -1)
الحصول
علي الفرق بين القيمتين
colNet =
-PreviousCol + Coltoclear
أخذ
نسخة مما تم اختياره
Selection.Copy
جعل
الخلية التي سيتم اللصق اليها Active أي فعالة
ActiveCell.Offset(0,
PreviousCol).Activate
عمل
لصق للقيم فقط بدون الفورمات
Selection.PasteSpecial
Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
جعل
الخلية التي فى أعلي عمود الحالي فعالة
ActiveCell.Offset(0,
colNet).Activate
احتيار
مجال الحالي كله
Range(ActiveCell, ActiveCell.Offset(MyRow - 1, 0)).Select
الغاء
القيم الموجودة
Selection.ClearContents
End Sub
=================================================
IF ,
Then
IF , ELSEIF, ELSE, Then
Select Case و
و ذلك من خلال تطبيق استنتاج التقدير المناظر لنسبة مئوية من الدرجات ، فمثال من حصل علي 30% يكون تقديره راسب و
من حصل علي 86% يكون تقديره امتياز ...و هكذا ، و ذلك من خلال استخدام أولا
قاعدة IF الموجودة في اكسل ، ثم عن طريق بناء 4
دوال مختلفة تؤدي نفس الغرض و هو
استنتاج التقدير من القيمة.
المثال التطبيقي علي الدرس
و المثال
الذي يشمل استخدام قاعدة IF و
أمثلة الكود اللأربعة موجود هنا
أولا استخدام قاعدة IF الموجودة فى اكسيل
يمكن الحصول علي النتيجة المطلوبة باستخدام
تركيبة مركبة من دالة IF كما
فى المثال التالي
+IF(C16>=85;"ممتاز";IF(C16>=75;"جيد جدا";IF(C16>=65;"جيد";IF(C16>=50;"مقبول";"راسب"))))
حيث C16 هي الخلية التي
بها الدرجة التي حصل عليها الطالب من 100 ، فينتج فى الخلية التي بها المعادلة
عاليه تقدير الطالب
ولكي نفهم كيف تكونت هذه الدالة لندرس استخدام أبسط
لدالة IF و هو استنتاج هل الطالب راسب أم ناجح
تتكون جملة IF من ثلاثة أجزاء : الشرط ، و الناتج اذا تحقق الشرط ، ثم الناتج اذا
لم يتحقق الشرط و لنبدأ بمثال أبسط :
IF(C7>=50;1;0)
أي اذا كانت
القيمة الموجودة فى الخلية C9 أكبر
من أو يساوي 50 يكون الناتج 1 و اذا لم يتحقق الشرط يكون الناتج صفر
و بالطبع
يمكن الحصول علي كلمة كناتج للمعادلة فى حالة تحقق الشرط أو عدم تحققه أو كلاهما
IF(C7>=50;"ناجح";"راسب")
أي اذا كانت
القيمة الموجودة فى الخلية C7 أكبر من أو يساوي 50 يكون الناتج
"ناجح" و اذا لم يتحقق الشرط يكون الناتج "راسب"
أما عن
المعادلة الأصلية
+IF(C16>=85;"ممتاز";IF(C16>=75;"جيد جدا";IF(C16>=65;"جيد";IF(C16>=50;"مقبول";"راسب"))))
ففيها استخدام متداخل للدالة فبعد اختبار
الشرط الأول C16>=85 يكون
الناتج "ممتاز" اذا
تحقق الشرط ، أما اذا لم يتحقق فبدلا من اعطاء قيمة يتم تنفيذ إختبار آخر C16>=75 و بكون ناتج الاختبار الثاني "جيد جدا"
اذا تحقق الشرط ، أما اذا لم يتحقق فبدلا من اعطاء قيمة يتم تنفيذ إختبار
آخر C16>=65 و بكون ناتج
الاختبار الثاني "جيد" اذا تحقق الشرط ، أما اذا لم يتحقق فبدلا
من اعطاء قيمة يتم تنفيذ إختبار آخر C16>=50 و بكون
ناتج الاختبار الثاني "مقبول" اذا تحقق الشرط ،فلا يتم تنفيذ إختبار آخر و لكن
تكون نتيجة الاختبار "راسب"
ثانيا استخدام الكود
و سنقوم هنا باستعراض 4 دوال مختلفة للحصول
علي نفس نتيجة معادلة IF السابقة
و فى البدابة نتعرف علي كيف تصاغ الدالة و الصياغة
النمطية هي
Function FunctionmName()
--سياق
الدالة
End Function
: و يمكن أن تكون الدالة تستقبل متغيرا و في هذه الحالة
يكون شكلها كالتالي
Function FunctionmName(اسم المتغير)
--سياق
الدالة
End Function
: وفى حالة معرفة نوع المتغير يستحسن تعريف نوعه
Function FunctionmName(Myvarriable
as double)
--سياق
الدالة
End Function
و هذا يدفعنا
الي تعريف أنواع المتغيرات الرئيسية كما هي فى التعليمات علي عجالة و هي
Data type |
نوع البيانات |
Range مثال علي المدي |
Byte |
رقم صغير |
0 to 255 |
Boolean |
صح أم خطأ أو نعم أم
لا |
True or False |
Integer |
رقم صحيح بدون كسور بحد أقصي
+32767 أو
- 32768 |
-32,768 to 32,767 |
Long |
مثل السابق و لكن بسعة أكبر |
-2,147,483,648 to
2,147,483,647 |
Single |
رقم به كسور بالسعة الموضحة |
-3.402823E38 to
-1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive
values |
Double |
مثل السابق و لكن بسعة أكبر |
-1.79769313486231E308
to |
Currency |
للمعاملات النقدية |
-922,337,203,685,477.5808
to 922,337,203,685,477.5807 |
Decimal |
رقم به كسور بسعة أقل من ال و ال Double |
+/-79,228,162,514,264,337,593,543,950,335
with no decimal point; |
Date |
تاريخ |
January 1, 100 to
December 31, 9999 |
Object |
شيء مثل صورة
مثلا |
Any Object reference |
String |
نص |
0 to approximately 2
billion |
String |
نص |
1 to approximately 65,400 |
Variant |
أي قيمة في حالة الارقام |
Any numeric value up
to the range of a Double |
Variant |
مثل ال Var. Lenght . String فى
حالة النص |
Same range as for
variable-length String |
User-defined |
نوع معرف من قبل المستخدم و هو يتوقف علي أنواع
البيانات المستخدمة فى تعريفه |
The range of each
element is the same as the range of its data type. |
و قد
تعيد الدالة قيمة أو تكتفي بتنفيذ مجموعة من الإجراءات ، و لكن الحالة الأعم هي أن
تعيد الدالة قيمة و في هذه الحالة يكون من ضمن السياق الجملة الآتية
FunctionmName = Myvalue
و التي تعني أن الدالة ستعيد القيمة Myvalue
كما سنري
فى الدوال الأربعة القادمة
الدالة الاولي
وهذه الدالة تعتمد علي تطبيق قاعدة Select
Case بطريقة المجال ( من الي ) و أيضا مع
استخدام حالة أكبر من قيمة معينة
Function GetGrade(mycell) Dim x As Double x = Round(mycell.Value, 1) Select Case x Case 0 To 49.9 GetGrade = "راسب" Case 50 To 64.9 GetGrade = "مقبول" Case 65 To 74.9 GetGrade = "جيد" Case 75 To 84.9 GetGrade = "جيد جدا" Case Is >= 85 GetGrade = "ممتاز" Case Else GetGrade = "رقم غريب" End Select End Function |
و في بداية الدالة يتم استخدام الدالة Round و ذلك لكي يتم تقريب الرقم الي عدد معين من الأرقام
العشرية و هنا اخترانا رقمان عشريان ، و ذلك لأننا ننوي استخدام رقمان عشريان
عند تحديد مجالات البحث فمثلا المجال الذي حددناه للطالب لكي يكون راسبا هو من
صفر الي 49.9 و لوكنا اخترنا 49.99 لاستخدمنا رقمان عشريان مع الدالة Round ثم بعد ذلك نبدأ فى صياغة جملة ال Select و هنا سيتم تطبيق الجملة علي ناتج
التفريب المسمي X و نبدأ فى تصنيف الحالات بين حملتي Select
Case و End select فتكون الحالة الاولي من صفر الي
49.9 ، و يكون ناتج الدالة (نفس اسم الدالة هو "راسب" و يلي ذلك الحالة الثانية و التي ناتجها
مقبول ... و هكذا الي أن نصل الي الحالة قبل الأخيرة و فيها اخترنا أنه
اذا كان الرقم أكبر من 85 يكون الناتج ممتاز أما عن الشق الأخير فهو اذا كان الرقم
غير كل ما ذكر سابقا ( و هو هنا أن تكون الدرجة بالسالب ) فاخترنا أن يكون ناتج
المعادلة ( رقم غريب ) |
الدالة الثانية
وهذه الدالة تعتمد علي تطبيق قاعدة Select
Case بطريقة المجال مع استخدام حالة
أكبر من قيمة معينة فقط
و هنا يتم اختبار الحالات بترتيب وضع
الشروط الي أن تتحق حالة فيتوقف الاختبار عندها و يتم تسجيل قيمة الدالة عند
هذه الخطوة
Function GetGrade2(mycell) Dim x As Double x = mycell.Value Select Case x Case Is >= 85 GetGrade2 = "ممتاز" Case Is >= 75 GetGrade2 = "جيد جدا" Case Is >= 65 GetGrade2 = "جيد" Case
Is >= 50 GetGrade2 = "مقبول" Case Is >= 0 GetGrade2 = "راسب" Case "else" GetGrade2 = "رقم غريب" End Select End Function |
هنا لم يتم استخدام الدالة Round و ذلك لأنطريقة المجال ( مثل 50 الي 65 ) غير متبعة و
لا داعي لتقريب القيم حيث أن اختبار القيم يعتمد علي اختبار كونها أكبر من
قيمة معينة أم لا و هنا لأن الاختبار سيتوقف عند تحقق الشرط فاما ان
نبدأ بأكبر من 85 (حالة الامتياز ) أو أصغر من 50 ( حالة الرسوب ) و نستمر
تنازليا فى الحالة الأولي و تصاعديا فى الحالة الثانية و هذا المثال يعرض الحالة الأولي فأما ان كان الرقم فعلا أكبر من أو يساوي 85
فيتم تسجيل قيمة الدالة ب "ممتاز" و ينتهي الاختبار بتحقق الشرط و ان
لم يكن ، فيتم اختبار حالة كونه أكبر من 75 ( و هنا يكون قد فشل
اختبار كونه أكبر من 85 ) فمعني ذلك أن الرقم يختبر من حيث كونه أكبر من أو
يساوي 75 و أقل من أو يساوي 85 ، فان تحقق الشرط فتكون قيمة الدالة "جيد
جداً " و ان لم يكن فيتم اختبار الحالة التالية الي أن نصل الي الشق الأخير فهو اذا كان
الرقم غير كل ما ذكر سابقا ( و هو هنا أن تكون الدرجة بالسالب ) فاخترنا أن يكون
ناتج المعادلة ( رقم غريب ) |
الدالة الثالثة
وهذه الدالة تعتمد علي تطبيق قاعدة IF
, THEN بدون استخدام خيارات ELSEIF و ELSE
و هنا يتم اختبار الحالات بترتيب وضع
الشروط الي أن تتحق حالة فيتم تسجيل فيمة الدالة و لكن لا يتوقف الاختبار و
نستمر فى اختبار القيم و يتم تسجيل قيمة جديد للدالة عند نجاح أي اختبار ،
وهذه الطريقة تؤدي الغرض و لكن يعيبها المرور بكافة الاختبارات ، و تمتاز عنها
باقي الطرق بقلة وقت الاختبار
Function GetGrade3(mycell) Dim x As Double x = mycell.Value GetGrade3 = "رقم غريب" If x >= 0 Then GetGrade3 = "راسب" If x >= 50 Then GetGrade3 = "مقبول" If x >= 65 Then GetGrade3 = "جيد" If x >= 75 Then GetGrade3 = "جيد
جدا" If x >= 85 Then GetGrade3 = "ممتاز" End Function |
اما ان نبدأ بأكبر من صفر (حالة الرسوب ) أو
أصغر من 100 ( حالة االامتياز ) و نستمر تنازليا فى الحالة الثانية
و تصاعديا فى الحالة الأولي و هذا المثال يعرض الحالة الأولي فأما ان كان الرقم فعلا أكبر من أو يساوي
صفر فيتم تسجيل قيمة الدالة ب "راسب" و لا ينتهي الاختبار
بتحقق الشرط و بعد ذلك يتم اختبار حالة كونه أكبر من 50 ( و
هنا لا يكون معناه أنه قد فشل اختبار كونه أكبر من صفر
) فاذا نجح الاختبار تصبح القيمة 50 و ان لم يكن تبقي صفر و هكذا .. و نلاحظ أنه اذا لم يتحقق أي من الشروط
المذكورة فيكون مطلوبا أن تعيد الدالة " رقم غريب" كما سبق ، و هنا تم
تسجيله كقيمة مبدأية للدالة قبل اجراء أي اختبار ، بحيث اذا فشلت جميع
الاختبارات تكون القيمة هي "رقم غريب" |
الدالة الرابعة
وهذه الدالة تعتمد علي تطبيق قاعدة IF
, THEN مع استخدام خيارات ELSEIF و ELSE
و هنا يتم اختبار الحالات بترتيب وضع
الشروط الي أن تتحقق حالة فيتم تسجيل فيمة الدالة و لكن لا يتم تسجيل
قيمة جديد للدالة الا عند نجاح الاختبار ، و تكون حالات الاختبار
حالات فريدة أي أنه لا يصح كون القيمة المختبرة تحقق أكثر من شرط ، وهذه الطريقة
تمتاز عن الطريقة السابقة بقلة وقت الاختبار حيث أنه فى الحالة
السابقة كان من الممكن أن تنجح القيمة المختبرة فى تحقيق أكثر من شرط ( أي
أنها أكبر من صفر و أكبر من خمسين و أكبر من 65 - القيمة 68 مثلا ) ، و
بالتالي تيم تسجيل القيمة أكثر من مرة. و هذا م لا يحدث هنا كما سنشاهد سويا
Function
GetGrade4(mycell) Dim x As Double x = mycell.Value If x >= 0 And x
< 50 Then GetGrade4 = "راسب" ElseIf x > 50 And
x <= 65 Then GetGrade4 = "مقبول" ElseIf x > 65 And
x <= 75 Then GetGrade4 = "جيد" ElseIf x > 75 And
x <= 85 Then GetGrade4 = "جيد
جدا" ElseIf x > 85 Then GetGrade4 = "ممتاز" Else GetGrade4 = "رقم
غريب" End If End Function |
اذا كانت القيمة بين صفر و أقل من أو
يساوي 50 يكون ناتج المعالة "راسب " و لا يمكن أن يحقق أي من الشروط التالية و ان كانت القيمة بين 50 و أقل من أو
يساوي 65 يكون ناتج المعالة "مقبول " و لا يمكن أن يحقق أي من الشروط التالية
أو السابقة ... و هكذا الي أن نصل الي الحالة قبل
الأخيرة و فيها اخترنا أنه اذا كان الرقم أكبر من 85 يكون الناتج ممتاز أما عن الشق الأخير فهو اذا كان الرقم
غير كل ما ذكر سابقا ( و هو هنا أن تكون الدرجة بالسالب ) فاخترنا أن يكون ناتج
المعادلة ( رقم غريب ) |