![]() |
برنامج اكسل و تطبيقات الفيجوال بيزيك - الدرس الأول Excel & VBA applications_ Lesson no. 1 إعداد : محمد طاهر |
ملخص : فى هذا الدرس سنبحث كيفية استخدام بعض الاوامر مثل
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)
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)
End Function |
اما ان نبدأ بأكبر من صفر (حالة الرسوب ) أو أصغر من 100 ( حالة االامتياز ) و نستمر تنازليا فى الحالة الثانية و تصاعديا فى الحالة الأولي
و هذا المثال يعرض الحالة الأولي
فأما ان كان الرقم فعلا أكبر من أو يساوي صفر فيتم تسجيل قيمة الدالة ب "راسب" و لا ينتهي الاختبار بتحقق الشرط و بعد ذلك يتم اختبار حالة كونه أكبر من 50 ( و هنا لا يكون معناه أنه قد فشل اختبار كونه أكبر من صفر ) فاذا نجح الاختبار تصبح القيمة 50 و ان لم يكن تبقي صفر و هكذا ..
و نلاحظ أنه اذا لم يتحقق أي من الشروط المذكورة فيكون مطلوبا أن تعيد الدالة " رقم غريب" كما سبق ، و هنا تم تسجيله كقيمة مبدأية للدالة قبل اجراء أي اختبار ، بحيث اذا فشلت جميع الاختبارات تكون القيمة هي "رقم غريب" |
الدالة الرابعة
وهذه الدالة تعتمد علي تطبيق قاعدة IF , THEN مع استخدام خيارات ELSEIF و ELSE
و هنا يتم اختبار الحالات بترتيب وضع الشروط الي أن تتحقق حالة فيتم تسجيل فيمة الدالة و لكن لا يتم تسجيل قيمة جديد للدالة الا عند نجاح الاختبار ، و تكون حالات الاختبار حالات فريدة أي أنه لا يصح كون القيمة المختبرة تحقق أكثر من شرط ، وهذه الطريقة تمتاز عن الطريقة السابقة بقلة وقت الاختبار حيث أنه فى الحالة السابقة كان من الممكن أن تنجح القيمة المختبرة فى تحقيق أكثر من شرط ( أي أنها أكبر من صفر و أكبر من خمسين و أكبر من 65 - القيمة 68 مثلا ) ، و بالتالي تيم تسجيل القيمة أكثر من مرة. و هذا م لا يحدث هنا كما سنشاهد سويا
Function GetGrade4(mycell) Dim x As Double x = mycell.Value
End Function
|
اذا كانت القيمة بين صفر و أقل من أو يساوي 50 يكون ناتج المعالة "راسب " و لا يمكن أن يحقق أي من الشروط التالية
و ان كانت القيمة بين 50 و أقل من أو يساوي 65 يكون ناتج المعالة "مقبول " و لا يمكن أن يحقق أي من الشروط التالية أو السابقة
... و هكذا الي أن نصل الي الحالة قبل الأخيرة و فيها اخترنا أنه اذا كان الرقم أكبر من 85 يكون الناتج ممتاز
أما عن الشق الأخير فهو اذا كان الرقم غير كل ما ذكر سابقا ( و هو هنا أن تكون الدرجة بالسالب ) فاخترنا أن يكون ناتج المعادلة ( رقم غريب ) |