اذهب إلى المحتوى

العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA


محمد Albittar

عند كتابة الشيفرات البرمجية، تُصادِفنا العديد من التعليمات التي نحتاج تنفيذها فقط عند تحقّق أمر ما، مثل: تنفيذ شيفرة عند إدخال المستخدم قيمة معينة لإحدى الخلايا، أو عند إجراء تغييرٍ ما عليها، أو عند إدخال قيمة لا توافق الشروط التي وضعناها. بحيث تُنفَّذ الشيفرة بإظهار رسالة معّينة أو بتنفيذ أمر معين في حال تحقّق الشرط، وتنفيذ أوامر أخرى في حال عدم تحقّقه، وتُسمى هذه العملية بالعملية الشرطيّة.

تعليمة IF الشرطية

هي أشهر التعليمات الشرطيّة وتكتب بالصيغة التالية:

IF condition Then code (if the condition is true)

وهي الصيغة الأساسية لكتابة هذه التعليمة، ولكن يمكن كتابتها بشكل أوسع على الصيغة التالية:

IF condition Then
codes (if the condition is true)
End If

حيث أن:

  • condition: الشرط الذي نريد تنفيذ التعليمات عند تحقّقه.
  • codes: مجموعة التعليمات التي ستُنفذ عند تحقّق الشرط السابق.
  • End IF: علامة نهاية العملية الشرطيّة.

مثال

لتكن لدينا البيانات التالية، حيث نريد فحص الخلايا وإعطائها رموز ترتيب في العمود D حسب نوع القسم. نطبق الشرط على الخلية A2 لفهم عمل الشرط، بحيث تعمل الشيفرة على إدخال القيمة A في الخلية D2 عند تحقّقه، ونكتب الشرط بالصيغة التالية:

Sub test_if()
IF Range("A2").Value = "الصحي" Then
Range("D2").Value = "A"
End IF

End Sub

الشرط هنا هو أن تكون قيمة الخلية A2 تساوي القيمة "الصحي"، وبتنفيذ الإجراء من المحرّر نجد أنّ الشيفرة تعمل بطريقة صحيحة، وتُمثّل هذه الصيغة الشروط البسيطة.

اقتباس

عند إسناد القيم للتعليمات، نضع القيم النصية بين إشارتي تنصيص، والقيم الرقمية بدون إشارات تنصيص لتمييزها. حيث أن الأرقام التي تُسند بين إشارتي تنصيص، يَتعامل معها المحرّر على أنها نص ولا تجري عليها العمليات الخاصة بالأرقام.

001IF.gif

تعليمة IF/Else الشرطية

تعمل بنفس مبدأ التعليمة السابقة ولكن في حال لم يتحقّق الشرط نضيف للشيفرة عمليات أُخرى ليُنفّذها، وتكون التعليمة بالصيغة التالية:

IF Condition Then
codes (if the condition is true)
Else
codes (if the condition is false)
End If

حيث أن Else هنا تُنفّذ الأوامر التابعة لها في حال لم يتحقّق الشرط.

مثال

لنطبّق التعليمة الجديدة على الخلية A3 ونضع القيمة السابقة في حال تحقّق الشرط، والقيمة B في حال عدم تحقّقه، ونكتب الشرط بالصيغة التالية:

Sub test_if()
IF Range("A3").Value = "الصحي" Then
Range("D3").Value = "A"
Else
Range("D3").Value = "B"
End IF
End Sub

002IF.gif

تعليمة الشروط المتداخلة IF/Elseif/Else 

تعمل هذه التعلمية على تطبيق شروط متعددة على الخلية، بحيث إذا لم يتحقّق الشرط الأول، ننتقل للشرط الثاني، ثم للثالث وهكذا. وتكون التعليمة بالصيغة التالية:

IF condition Then
codes (if the first condition is true)
Else IF condition Then
codes (if the second condition is true)
Else
codes (if all conditions are false)
End If

مثال

لنطبق التعليمة الجديدة على الخلية A4 ونضع القيمة السابقة في حال تحقّق الشرط الأول، والقيمة C في حال كانت قيمتها هي "الزراعي"؛ أو القيمة D عند عدم تحقّق أي شرط سابق. ونكتب الشرط بالصيغة التالية:

Sub test_if()
IF Range("A4").Value = "الصحي" Then
Range("D4").Value = "A"
ElseIF Range("A4").Value = "الزراعي" Then
Range("D4").Value = "C"
Else
Range("D4").Value = "D"
End IF
End Sub

003IF.gif

تعليمة IF الشرطية مع التعليمات AND/OR

إذا أردنا أن ننفذ عمليات على الخلايا في حال تحقّق عدة شروط مع بعضها، نستخدم التعليمة AND مع تعليمة IF الشرطيّة؛ أما في حال أردنا أن ننفذ عمليات على الخلايا في حال تحقّق أحد الشروط، فسنستخدم التعليمة OR معها، لتصبح الصيغة:

IF condition1 AND/OR condition2 AND/OR condition3 Then
codes (if all conditions are true with AND)
codes (if one of conditions are true with OR)
Else
codes (if all conditions are false)
End If

مثال

لنطبّق أكثر من شرط على الخلية A5، ونضع القيمة E في حال تحقّق الشروط، أو القيمة F في حال عدم تحقّقها، ونكتب الشرط بالصيغة التالية:

Sub test_if()
IF Range("A5").Value = "الصحي" And Range("C5").Value=11 Then
Range("D5").Value = "E"
Else
Range("D5").Value = "F"
End IF
End Sub

004IF.gif

التعليمة الشرطية Select Case

تُستعمل هذه التعليمة إذا أردنا فحص عدة شروط على خلية واحدة، وتنفيذ التعليمة المقابلة للشرط في حال تحقّقه. حيث نلاحظ أنّه يمكن تنفيذ هذه العملية عن طريق التعليمة IF/Elseif/Else، ولكن التكرار الكثير للتعليمة IF في الشيفرة البرمجية سيزيد من حجم العمليات في الإجراء، كما سيؤدي إلى بطء تنفيذه، لكن باستخدام التعليمة Select Case، فسنقلل من حجم الشيفرة البرمجية وبالتالي تصبح عمليةً أكثر من التعليمة السابقة.

الصيغة العامة للتعليمة

Select case Element(object)
Case The first case 
codes (if the case is true)
Case The second case
codes (if the case is true) 
Case Else
codes (If all cases are false)
End Select
  • Element: العنصر الذي نُطبّق الاستعلام عليه للتحقّق.
  • The first case: تمثل شرط التحقّق من القيمة الأولى أو قيمة الفحص الأولى.
  • The second case: تمثل شرط التحقّق من القيمة الثانية أو قيمة الفحص الثانية.
  • Code: التعليمات التي ستُنفَّذ عند تحقّق الحالة السابقة له.

مثال

لدينا الجدول التالي الذي يحتوي على الترتيب التالي، والذي يمثّل أيام الأسبوع. على فرض أنّ السبت هو اليوم الأول، نريد فحص القيمة في الخلية وإعادة ما يقابلها من أيام الأسبوع، ونطبق الصيغة التالية على الخلية A8:

Sub day_name()
Select Case Range("A8").value
Case 1
Range("B8").value="السبت"
Case 2
Range("B8").value="الأحد"
Case 3
Range("B8").value="الإثنين"
Case 4
Range("B8").value="الثلاثاء"
Case 5
Range("B8").value="الأربعاء"
Case 6
Range("B8").value="الخميس"
Case 7
Range("B8").value="الجمعة"
End Select
End Sub

005SelectCaase.gif

عندما تكون الأوامر التي ستُنفّذها الحالة Case متشابهةً في أكثر من حالة، فسيمكننا اختصار الإجراء وتجميع الحالات ذات الأوامر المتشابهة في حالة واحدة، وذلك أيضًا يقلل من حجم الشيفرة، بحيث يصبح شكل العملية بالصيغة التالية:

Select case Element(object)
Case The first case, The second case, The third case
Code
 Case The fourth case, The fifth case
Code
Case Else
Code
End Select

بالعودة إلى مثالنا السابق وبفرض أن يومي الجمعة والسبت هما أيام عطلة وباقي الأيام أيام عمل، وأردنا تطبيق العملية السابقة على البيانات لمعرفة إذا كان ترتيب اليوم يقابل يوم عمل أو يوم عطلة نُطبّق التعليمة السابقة على الخلايا C2 وC5، لتصبح لدينا التعليمة كالتالي:

Select Case Range("A8").Value
Case 1, 2
Range("C5").Value = "يوم عطلة"
 Case 3, 4, 5, 6, 7
Range("C5").Value = "يوم عمل"
End Select

بتكرار العمليات السابقة في الخلية C2، نجد أن الشيفرة تعمل بطريقة صحيحة، ولكن بما أن شرط تحقُّق الحالة هو عبارة عن أرقام تراتبية، يمكننا الاختصار أكثر وكتابة التعليمات بالشكل التالي:

Case 3 To 7
Range("C5").Value = "يوم عمل"

كما يمكن كتابتها بالشكل التالي في حال كانت قيم المطابقة عددية، أي قابلة للقياس:

Case IS<2
Range("C5").Value = "يوم عمل"

كل الصيغ السابقة تؤدي نفس العمل ولكن تختلف السرعة في التنفيذ.

مثال تطبيقي لكل ما سبق

لدينا الملف التالي ونريد كتابة إجراء يعمل على فحص البيانات المُدخلة في الخلايا وإعطاء رسالة في حال كانت إحدى البيانات فارغة أو ترحيل البيانات إلى صفحة ثانية في حال كانت البيانات كاملةً عن طريق زر إدخال.

007Example.PNG

في البداية نضع اسمًا للإجراء الذي سنعمل عليه وليكن DataEntry، ثم نُعرّف المتغيرات التي ستحفظ نتيجة الاستعلامات عن قيم إدخال الخلايا التي نعمل عليها. حيث لدينا ثلاثة أنواع من المتغيرات، وهي: رقمي طويلLong، ونصّي String، وتاريخ Date. بحيث ستتكون لدينا الصيغ التالية:

Sub DataEntry()
Dim name As String
Dim nationalID As Long
Dim bearthday As Date
Dim place_of_birth As String
name = Worksheets("صفحة الإدخال").Range("A1").Value
nationalID = Worksheets("صفحة الإدخال").Range("A2").Value
bearthday = Worksheets("صفحة الإدخال").Range("A3").Value
place_of_birth = Worksheets("صفحة الإدخال").Range("A4").Value
End Sub

نضيف الآن عمليات ترحيل البيانات إلى صفحة البيانات عند الضغط على الزر إدخال، ونضيف إلى الشيفرة التعليمات التالية:

Worksheets("البيانات").Range("A2").Value = name
Worksheets("البيانات ").Range("B2").Value = nationalID
Worksheets("البيانات ").Range("C2").Value = bearthday
Worksheets("البيانات ").Range("D2").Value = place_of_birth

008Example.gif

إلى هنا نكون قد أنجزنا الجزء الأول من المطلوب ولكن ينقصه أمر أساسي، وهو أنه عند إضافة بيانات جديدة يجب أن تعمل الشيفرة أولًا على إضافة صف جديد، ثم تُرحّل البيانات إلى صفحة البيانات كي لا تُستبدل البيانات القديمة بالبيانات الجديدة، ولهذا سنحتاج إلى التعليمة التالية:

Worksheets("البيانات").Range("2:2").Insert

يعمل الأمر insert على إضافة خلايا ضمن النطاق المحدد في العنصر Range، وقد وضعنا المجال 2:2 لأننا نريد إضافة صف كامل.

بعد إضافة الصف وترحيل البيانات إليه، فلابد من تفريغ خلايا الإدخال عن طريق الإجراء وذلك عن طريق التعليمات التالية:

Worksheets("صفحة الإدخال ").Range("A1").ClearContents
Worksheets("صفحة الإدخال ").Range("A2").ClearContents
Worksheets("صفحة الإدخال ").Range("A3").ClearContents
Worksheets("صفحة الإدخال ").Range("A4").ClearContents

حيث يعمل الأمر ClearContents على تفريغ محتوى الخلية.

009Example.gif

بقي لدينا إضافة شرط فحص قيم الخلايا قبل ترحيل البيانات، ويجب ألّا تكون أي خلية من خلايا الإدخال فارغة، لذا نستعمل التعليمة OR مع التعليمة IF لفحص جميع الخلايا بشرط واحد، إذ يجب الانتباه إلى أن الخلايا النصية تُوازَن بالفراغ، أما الخلايا الرقمية فنوازنها بالقيمة 0 للتأكد أنها ليست فارغة، بحيث تكون الصيغة كالتالي:

If name = "" Or nationalID = 0 Or bearthday = 0 Or place_of_birth = "" Then
MsgBox "البيانات غير كاملة"
اقتباس

نفحص الخلايا الرقمية بالقيمة 0، لأننا إذا فحصناها بالفراغ فإن المحرر سيفهم عملية الفحص بأنها موازنة رقم لنص، وهذا يُعَد خاطئًا برمجيًا، ونحن هنا نوازن قيمة خلية رقمية وليست نصية، فالرقم 0 يُعبّر عن القيمة الفارغة في الخلايا الرقمية في إكسل. عند وجود خلية واحدة على الأقل فارغة، فستُظهر لنا التعليمة MsgBox رسالةً تُخبرنا بوجود خلايا فارغة.

بهذا تكون الشيفرة قد أصبحت جاهزةً لإجراء عملية الإدخال كما هو مطلوب والإجراء كاملًا هو التالي:

 Sub DataEntry()
Dim name As String
Dim nationalID As Long
Dim bearthday As Date
Dim place_of_birth As String

name = Worksheets("صفحة الإدخال").Range("B1").Value
nationalID = Worksheets("صفحة الإدخال").Range("B2").Value
bearthday = Worksheets("صفحة الإدخال").Range("B3").Value
place_of_birth = Worksheets("صفحة الإدخال").Range("B4").Value

If name = "" Or nationalID = 0 Or bearthday = 0 Or place_of_birth = "" Then
MsgBox "البيانات غير كاملة"

Else
Worksheets("البيانات").Range("2:2").Insert
Worksheets("البيانات").Range("A2").Value = name
Worksheets("البيانات").Range("B2").Value = nationalID
Worksheets("البيانات").Range("C2").Value = bearthday
Worksheets("البيانات").Range("D2").Value = place_of_birth

Worksheets("صفحة الإدخال").Range("B1").ClearContents
Worksheets("صفحة الإدخال").Range("B2").ClearContents
Worksheets("صفحة الإدخال").Range("B3").ClearContents
Worksheets("صفحة الإدخال").Range("B4").ClearContents
End If
End Sub

010Example.gif

خاتمة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...