السلام عليكم ورحمة الله وبركاته
ونكمل حلقات الأستاذ الكبير ياسر خليل فى الـVBA
الحلقة التاسعة
...................................................................................................................
النهاردة هنضرب 3 أشباح بحجر واحد (نشتغل قناصة) ، يعني الحلقة دي هنتكلم عن 3 أمور ..
هنراجع على كيفية بناء دالة (هنأكد عليها بمثالين) ، ومن خلال المثالين (الشبحين) هنتعلم إزاي نتعامل مع الشروط .. يبقا مراجعة + معلومتين !
حلقة النهاردة مفيهاش كلام كتير ، بس موعدكمش إنتو عارفين طبعي بحب الرغي! معظمها هتكون عملي .. لنبدأ الحلقة على بركة الله
الشكل العام لـ IF الشرطية .. عندنا 4 أشكال :
الشكل الأول والثاني : لو هنتعامل مع شرط واحد وكل اللي يهمنا إن الشرط يتحقق ، مثال :
CODE
If 100 > 90 Then MsgBox "The number 100 is greater than 90"
الجملة لازم تبدأ بـ IF وبعديها جملة الشرط ، جملة الشرط هنا 100 أكبر من 90 (واحد هيقولي مش دي علامة أصغر من ..هقوله متنساش إننا بنكتب من الشمال لليمين ، والعلامة ممكن تقراها حسب الاتجاه ، بالعامية كدا إحنا قرينا رقم 100 مثلا هنلاقي الفتحة نحية الرقم 100 يبقا كدا نقراها أكبر من ) عارف إنها معلومة بسيطة بس فيه ناس ممكن يحصل عندها Confusion.
الشرط اللي بنكتبه بيكون نتيجته حاجة من اتنين يا أبيض يا إسود (يا إما True يا إما False) ، لو كانت نتيجة الشرط True صحيحة بالمعنى البلدي يبقا اللي جاي هيتم تنفيذه ، أما لو كانت False المحرر مش هيعبر الجملة اللي ورا كلمة Then وهيعديها ، ويقول للسطر اللي بعد Then (عدي يا كود مفيش منك مصلحة) 
نجرب نغير علامة أكبر من إلى أصغر من ، ونشوف النتيجة ، مفيش تنفيذ لسطر الكود لأن الشرط لم يتحقق !!
لاحظنا إننا كتبنا كله في سطر واحد .. ممكن اللي فات يتكتب في 3 أسطر في الحالة دي هيكون بالشكل ده
CODE
If 100 > 90 Then
MsgBox "The number 100 is greater than 90"
End If
والسطر المراد تنفيذه في حالة تحقق الشرط (بقول تاني في حالة تحقق الشرط) دا السطر التاني ، طيب والسطر التالت ده جه منين (دا القفلة زي ما اتعودنا قفلة جملة If بتكون جملة End If ، ولاحظوا إننا في الشكل الأول مستعملناش القفلة لأننا كتبناها في سطر واحد فقط ..
الشكل التالت : لما نتعامل مع شرط واحد بردو ، بس في الحالة دي إحنا عايزين نحدد ايه المطلوب من المحرر لما الشرط يتحقق ، وايه المطلوب لما الشرط ميتحققش .. بالمثال يتضح الكلام المكلكع ده :
نفس المثال اللي فات بس هنزود عليه شرط إذا لم يتحقق الشرط ، بيتم استخدام جملة Else بهذا الشكل :
CODE
If 100 > 90 Then
MsgBox "The number 100 is greater than 90"
Else
MsgBox "The number 100 is less than 90"
End If
محدش سألني لحد دلوقتي إزاي بيتم تنسيق الكود بهذا الشكل؟
التنسيق للكود بيخلي الكود أسهل إنك تقراه وتفهم معناه .. يعني لو كتبت الكود بالشكل اللي جاي كدا هيكون أصعب شوية في التعامل معاه لما تيجي تقراه
CODE
If 100 > 90 Then
MsgBox "The number 100 is greater than 90"
Else
MsgBox "The number 100 is less than 90"
End If
طبعا الفرق واضح .. والفرق يوضح أكتر لما تتعامل مع أسطر كثيرة من الأكواد ..
اتعملت إزاي ؟ عن طريق الضغط على المفتاح tab بعد ما أضع المؤشر في أول السطر
المهم مش هنتكلم عن البداية ولا النهاية لجملة If ، إحنا بس هنركز على جملة Else ، هي دي اللي بتفصل بين السطر المراد تنفيذه إذا تحقق الشرط ، والسطر المراد تنفيذه إذا لم يتحقق الشرط ..
السطر اللي قبل Esle دا ليه الأولوية طبعاً بس في حالة تحقق الشرط ، أما السطر اللي بعديها بيكون في حالة عدم تحقق الشرط ..أظن كدا واضحة (عمال أقول الكلام بأكتر من أسلوب وأكتر من مرة ، لأن في الإعاة إفادة)
نجرب الكود مرة بالشكل اللي فات ، ونغير علامة أكبر من إلى علامة أصغر من ونجرب مرة تانية ونلاحظ الرسالة (أقصد مدى تحقق الشرط)
الشكل الرابع والأخير لـ IF دا بقا اللي تقدر من خلاله تضع شروط كتيرة زي ما إنت عايز (خد راحتك ..حط شروطك يا كبير ، والمحرر ينفذ)
هنا المثال هو أفضل شرح ، هنكتب دالة Function وهنستخدم فيها IF مع الشكل الرابع ؛ لأننا عندنا شروط كتير ..
الجماعة اللي بيشتغلوا في المدارس (ربنا يبارك فيهم) ، بيعملوا معادلة لتحديد المستوى أو التقدير (وشروطهم بتكون بالشكل ده :
لو الطالب غ يبقا الناتج غ (حد عنده اعتراض) .. لو درجة الطالب ما بين 0 و 49 يبقا تقديره دون المستوى .. ولو الطالب درجته ما بين 50 و 64 يبقا مقبول .. ولو الطالب درجته ما بين 65 و 74 يبقا تقديره جيد .. ولو الطالب درجته ما بين 75 و 84 يبقا تقديره جيد جداً .. ولو الطالب درجته ما بين 85 و 100 يبقا ممتاز (شفتوا الشروط ..حاجة كدا تحس إنها متشابكة) ..
بالمعادلات ممكن نعملها بالشكل ده :
CODE
=IF(A1="","",IF(A1="غ","غ",IF(AND(A1>=0,A1<50),"دون المستوى",IF(AND(A1>=50,A1<65),"مقبول",IF(AND(A1>=65,A1<75),"جيد",IF(AND(A1>=75,A1<85),"جيد جداً",IF(AND(A1>=85,A1<=100),"ممتاز","")))))))
هي دي المعادلة اللي هتأدي الغرض وتحقق المطلوب .. بس تعرفوا إن طول المعادلة بالشكل ده 188 حرف (الحرف مقصود بيه الحروف والرموز) .. طبعاً المعادلة ممكن نحولها لدالة تحقق لنا المطلوب ، خلينا نشوف ونجرب
CODE
Function Grade(Mark As Variant) As String
If IsEmpty(Mark) Then
Grade = ""
ElseIf Mark = "غ" Then
Grade = "غ"
ElseIf Mark >= 0 And Mark < 50 Then
Grade = "دون المستوى"
ElseIf Mark >= 50 And Mark < 65 Then
Grade = "مقبول"
ElseIf Mark >= 65 And Mark < 75 Then
Grade = "جيد"
ElseIf Mark >= 75 And Mark < 85 Then
Grade = "جيد جداً"
ElseIf Mark >= 85 And Mark <= 100 Then
Grade = "ممتاز"
End If
End Function
اتعرفنا قبل كدا على كيفية بناء الدالة ، ودا مثال تاني لتأكيد التعامل مع بناء الدوال :
بدأنا بكلمة Function لأننا بنتعامل مع دالة وليس إجراء فرعي ، متبوعة باسم الدالة (والتسمية قلنا إنت حر فيها مثلا هنسميها Grade) ، طيب إحنا لما نتعامل مع الدالة دي ، نشوف الدالة دي هتتعامل مع ايه ؟؟ الدالة هتتعامل مع درجة الطالب ، فنسمي المتغير الخاص بالدالة Mark ،والدرجة دي قد تكون أرقام من 0 إلى 100 وقد تكون حروف (غ) بالتالي نخلي نوعها Variant لأن النوع ده من المتغيرات Variables بيتعامل مع أي حاجة ، فهنا هيتعامل مع أرقام ونصوص ، طيب والناتج المفروض هيكون عبارة عن نص ، فدا نخليه String وممكن نخليه Variant بس إحنا عايزين الناتج نص وبس (دون المستوى - مقبول - جيد - جيد جداً - ممتاز - غ - فراغ "")
أعتقد إن الصورة واضحة ، هنا استخدمنا جملة ElseIf مش Else لأننا بنتعامل مع شروط متعددة ، ممكن نفضل نستخدمها لحد آخر شرط ، وممكن قبل الشرط الأخير نستبدلها بـ Else (إنت وراحتك)
بعد كل كلمة ElseIf وضعنا شرط وفي آخر الشرط مننساش كلمة Then
لما يكون فيه أكتر من شرط في نفس الوقت (بمعنى شرطين واجب تحققهم في نفس ذات الوقت بنستخدم المعامل Operator اللي اسمه And)
بمعنى آخر للي ميعرفش المعامل And (لما نستخدم المعامل ده يبقا الشرطين لازم نتيجتهم تكون True عشان ينفذ السطر اللي وراه)
----------------
ناخد مثال فرعي عشان نفهم And :
CODE
X = 10: Y = 20
If X = 10 And Y = 20 Then MsgBox "X = 10" & vbCrLf & "Y =20"
في السطر ده لو اتحقق الشرطين وكانت نتيجتهم صحيحة هيظهر الرسالة اللي مذكورة دي ، أما لو شرط واحد فيهم متحققش ، يبقا مش هيتنفذ الكود ..
معلومة إضافية لعمل سطر جديد في الرسالة نستخدم كلمة vbCrLf أو فيه كلمة أسهل منها بتؤدي نفس الوظيفة اسمها vbNewLine ..
ونلاحظ بردو في الرسالة إننا استخدمنا المعامل & ودا بيستتخدم لربط أو دمج النصوص .. (أعتذر عن الخروج عن الموضوع الأصلي)
----------------
يرجع مرجعونا للدالة الخاصة بالتقدير :
وضعنا الشروط ، وكلما تحقق شرط معين يتم وضع قيمة نصية لاسم الدالة : فلو تحقق الشرط مثلاً إن الدرجة ما بين 50 و 64 ، بنقول ساعتها إن الدالة اللي سميناها Grade ساعتها تحمل القيمة النصية "مقبول" ، ووضعنا النصوص بين أقواس تنصيص كما تعودنا .. يبقا في الحالة دي لو درجة الطالب 55 يبقا التقدير "مقبول" (اللهم اجعلنا من المقبولين)
..
لتطبيق الدالة : اكتب القيم التالية في النطاق A1:A13
0 49 50 55 65 66 74 75 84 85 90 100 غ
في الخلية B1 اكتب المعادلة :
CODE
=Grade(A1)<br />
ونسحب المعادلة لحد بعد آخر النطاق ، يعني خلي المعادلة لحد A15 مثلاً عشان نشوف لما تكون الخلية فارغة ايه اللي هيحصل ..
شوفوا بقا الفرق ما بين المعادلة اللي حطينها في الأول اللي طولها 188 حرف والمعادلة دي ، دي طولها يدوب 9 حروف بس (ادعوا لي !)
** ملحوظة : يا ريت لما نيجي نحط شروط ، نخلي شرط فراغ الخلية يكون في الأول (لأني جربت في دالة أخلي شرط الفراغ في الآخر بيعمل شوية كعبلة ، ودا سببه إننا لو حطينا الشرط مثلا الدرجة ما بين 0 و 49 .. الأول هيتم التعامل مع الخلايا الفارغة إنها صفر وليست خلايا فارغة)
المهم عشان ميحصلش توهااااااان خليكوا تكتبوا شرط الفراغ في أول الشروط (اللي عايز يجرب يحط الشرط ده في الآخر يجرب ويشوف الكعبلة بنفسه)
CODE
Function Grade(Mark As Variant) As String
If Mark = "غ" Then
Grade = "غ"
ElseIf Mark >= 0 And Mark < 50 Then
Grade = "دون المستوى"
ElseIf Mark >= 50 And Mark < 65 Then
Grade = "مقبول"
ElseIf Mark >= 65 And Mark < 75 Then
Grade = "جيد"
ElseIf Mark >= 75 And Mark < 85 Then
Grade = "جيد جداً"
ElseIf Mark >= 85 And Mark <= 100 Then
Grade = "ممتاز"
ElseIf IsEmpty(Mark) Then
Grade = ""
End If
End Function
هوفر عليك وقت في التعديل ، جرب الدالة بهذا الشكل بنفسك ، وروح لورقة العمل واعمل دبل كليك في الخلية B1 عشان تشوف القيم الجديدة أو اضغط F9 لتحديث الدالة ..
المشكلة بتحصل لأن منطق الترتيب في الشروط موجود ، بمعنى آخر إنه ماشي شرط شرط ، وأول ما شرط يتحقق ينتهي تنفيذه للدالة ، فلو وضعنا شرط الدرجة ما بين صفر و49 .. أول ما يلاقي خليه فاضية هيعاملها على إنها صفر وليست فارغة لأننا وضعنا شرط الفراغ في نهاية الدالة ، فنلاقي ناتج المعادلة مع الخلايا الفارغة (دون المستوى) .. انتهت الملحوظة (أنا عارف إن فيه ناس هتدعي عليا بسبب الملحوظة اللي متعتبرش ملحوظة دي .. دي درس جوا درس)@
آخر نقطة نتكلم فيها جملة IsEmpty (ودي دالة مدمجة في محرر الأكواد لاختبار الفراغ :: هل الخلية دي فارغة أم لا ؟؟) ، وممكن نستغنى عنها ونقول :
CODE
If Mark = "" Then
Grade = ""
نرجع للصح ونخلي شرط الفراغ في أول الدالة ..أظن بإذن الله كدا الأمور بقت واضحة تماماً...
ننتقل لمثال آخر وأخير عشان أنا تعبت لكم صراحة :
نفس المثال ولكن بصورة أخرى ..
هنعمل دالة ، هنغير اسمها بس عشان نطبقها في نفس الملف اللي إحنا شغالين عليه .. هنسميها Level
وهنا في المثال القادم بإذن الله هنستخدم حاجة شبيهة بجملة If بس بصراحة ألذ وشكلها أشيك وأسهل في الفهم ..
الجملة اسمها Select Case وبييجي وراها المتغير اللي هنشتغل عليه (اللي هو في الحالة دي Mark درجة الطالب)
وبعدين نبدأ نضع حالات الشرط بكلمة Case متبوعة بالشرط بس بشكل مختلف شوية
وقبل آخر شرط ممكن نستخدم Case Else وممكن نستغنى عنها (مش هتفرق) ، وفي النهاية مننساش القفلة يا عبد المولى (End Select) ..
CODE
Function Level(Mark As Variant) As String
Select Case Mark
Case ""
Level = ""
Case 0 To 49
Level = "دون المستوى"
Case 50 To 64
Level = "مقبول"
Case 65 To 74
Level = "جيد"
Case 75 To 84
Level = "جيد جداً"
Case 85 To 100
Level = "ممتاز"
Case "غ"
Level = "غ"
End Select
End Function
لتطبيق الدالة نروح للخلية C1 في ورقة العمل ونضع المعادلة بهذا الشكل ، ونسحبها لحد A15 مثلا ، عشان نقارن النتائج :
CODE
=Level(A1)<br />
مش هشرح تفاصيلها ؛ لأنها واضحة وضوح الشمس في عز الليل ..(شكلي هنجت ...!!) .. (حد يضغط F5 عشان يعملي ريفرش .. الطالب المنتبه هيقولي كدا غلط لو ضغطنا هنا F5 ، وإحنا جوا محرر الأكواد كدا هينفذ أمر مش هيعمل ريفرش)
بكدا نكون انتهينا من شبحين من أهم أشباح عالم الأكواد (شبح If وشبح Select Case) ، وكمان شبح (بناء الدالة UDF)
أستودعكم الله ، أترككم في رعاية الله ..
كان معكم القناص أبو البراء (صائد الأشباح) من قلعة الرعب أكاديمية الصقر