JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

-->
الصفحة الرئيسية

برنامج اكسيل و تطبيقات الفيجوال بيزيك Introduction To Excel vba

 

بسم الله الرحمن الرحيم

اهلا بكم متابعى موقع عالم الاوفيس

نقدم لكم اليوم مجموعة دورس مهمة فى كيفية التعامل مع الاكسيل الفيجوال بيسك

للاستاذ القدير / محمد طاهر عرفة

فلة منا جزيل الشكر والتقدير والعرفان بالجميل

وجزاة الله خير الجزاء على كل مايقدمة من علم نافع للبشر اجمع  

برنامج اكسيل و تطبيقات الفيجوال بيزيك


الدرس الأول :


مقدمة : بعض المعلومات الخلفية عن لغة البيزيك


كلمة بيزيك هي اختصار ل  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
(long integer)

مثل السابق  و لكن بسعة أكبر

-2,147,483,648 to 2,147,483,647

Single
(single-precision floating-point)

رقم به كسور بالسعة الموضحة

-3.402823E38 to -1.401298E-45 for negative values; 1.401298E-45 to 3.402823E38 for positive values

Double
(double-precision floating-point)

مثل السابق و لكن بسعة أكبر

-1.79769313486231E308 to
-4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values

Currency
(scaled integer)

للمعاملات النقدية

-922,337,203,685,477.5808 to 922,337,203,685,477.5807

Decimal

رقم به كسور بسعة أقل من ال
single  

و ال Double

+/-79,228,162,514,264,337,593,543,950,335 with no decimal point;
+/-7.9228162514264337593543950335 with 28 places to the right of the decimal; smallest non-zero number is
+/-0.0000000000000000000000000001

Date

تاريخ

January 1, 100 to December 31, 9999

Object

شيء

مثل صورة مثلا

Any Object reference

String
(variable-length)

نص

0 to approximately 2 billion

String
(fixed-length)

نص

1 to approximately 65,400

Variant
(with numbers)

أي قيمة في حالة الارقام

Any numeric value up to the range of a Double

Variant
(with characters)

مثل ال Var. Lenght . String

 فى حالة النص

Same range as for variable-length String

User-defined
(using Type)

نوع معرف من قبل المستخدم و هو يتوقف علي أنواع البيانات المستخدمة فى تعريفه

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 يكون الناتج ممتاز

 

أما عن الشق الأخير فهو اذا كان الرقم غير كل ما ذكر سابقا ( و هو هنا أن تكون الدرجة بالسالب ) فاخترنا أن يكون ناتج المعادلة

 ( رقم غريب )

 

 

 

الاسمبريد إلكترونيرسالة