TOP

VBA-الدرس 7.1. الشروط (Conditions)

YouLibreCalc for Excel logo

الشروط مفيدة جدًا في البرمجة لأنها تسمح لنا بتنفيذ الإجراءات وفقًا للمعايير المحددة (يتم استخدام نفس المبدأ كما في IF function Excel).

تقوم VBA If ... Then ... Else بتنفيذ مجموعة من العبارات بناءً على ما إذا كان الشرط المحدد صحيحًا أم لا. إذا تم استيفاء الشرط (الاختبار المنطقي) ، يتم تنفيذ مجموعة واحدة من الإجراءات. ومع ذلك ، إذا كان الشرط خاطئًا ، يتم تنفيذ مجموعة بديلة من الإجراءات.

ومع ذلك ، لسهولة القراءة ، يمكنك استخدام عبارة Select Case بدلاً من مستويات متعددة من عبارات If ... Then ... Else المتداخلة.


إذا ... ثم ... آخر

إذن ، الوظيفة الأكثر أهمية التي تحدد الشرط هي IF وسنرى الآن كيف تعمل:

If [مصطلح هنا] Then '=> إذا كان الشرط صحيحًا إذن
   'تعليمات إذا كانت "صحيحة"
Else '=> غير ذلك
   'تعليمات إذا "تكذب"
End If

لنبدأ العملية ونرجع إلى المثال الذي استخدمناه في درس المتغير. كان الغرض من هذا الإجراء هو عرض مربع حوار يعرض القيمة من السلسلة المحددة في الخلية F5:

إذا قمت بكتابة حرف في الخلية F5 ، فسيؤدي ذلك إلى حدوث خطأ. نريد منع هذا.

Sub variables()
   'إعلان المتغيرات
   Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
   'تعيين القيم للمتغيرات
   row_number = Range("F5") + 1
   
   last_name  = Cells(row_number, 1)
   first_name = Cells(row_number, 2)
   age        = Cells(row_number, 3)
   
   'صندوق المحادثة
   MsgBox last_name & " " & first_name & ", " & age & "سنين"
End Sub

دعنا نضيف شرطًا يتحقق مما إذا كانت القيمة التي تم إدخالها في الخلية F5 هي رقم قبل تنفيذ الكود.

سنستخدم الدالة IsNumeric لاختبار الحالة:

Sub variables()
  'إذا كانت القيمة الموجودة بين قوسين (الخلية F5) رقمية (ومن ثم فإن الحالة IF هي TRUE) إذن
  'تنفيذ التعليمات التي تلي بعد ذلك
   If IsNumeric(Range("F5")) Then
   
       'إعلان المتغيرات
       Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
       'تعيين القيم للمتغيرات
       row_number = Range("F5") + 1
       
       last_name  = Cells(row_number, 1)
       first_name = Cells(row_number, 2)
       age        = Cells(row_number, 3)
       
       'صندوق المحادثة
       MsgBox last_name & " " & first_name & ", " & age & "سنين"
    End If
End Sub

نحتاج أيضًا إلى كتابة التعليمات إذا لم يتم استيفاء الشرط الذي وضعناه:

Sub variables()
    If IsNumeric(Range("F5")) Then 'إذا تم استيفاء الشرط
   
       'إعلان المتغيرات
       Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
       'تعيين القيم للمتغيرات
       row_number = Range("F5") + 1
       
       last_name  = Cells(row_number, 1)
       first_name = Cells(row_number, 2)
       age        = Cells(row_number, 3)
       
       'صندوق المحادثة
       MsgBox last_name & " " & first_name & ", " & age & "سنين"
       
    Else 'إذا لم يتم استيفاء الشرط
   
       'مربع الحوار: تحذير
       MsgBox "أدخلت القيمة" & Range("F5") & "ليس صحيحا!"
       
       'احذف محتويات الخلية F5
       Range("F5").ClearContents
    End If
End Sub

الآن القيمة غير الرقمية لن تسبب أي مشاكل.

بالعمل مع المصفوفة التي تحتوي على 16 صفًا من البيانات ، ستكون خطوتنا التالية هي التحقق مما إذا كان متغير row_number هو: "أكبر من أو يساوي 2" و "أقل من أو يساوي 17".

لكن أولاً ، دعنا نلقي نظرة على عوامل المقارنة:

= بالضبط
<> ليس تماما
< أقل من
<= اقل او يساوي
> أكثر من
> = أكبر من أو يساوي

وهذه العوامل المفيدة:

AND [condition1] AND [condition2] يجب استيفاء شرطين
OR[condition1] OR [condition2] يجب استيفاء شرط واحد على الأقل من الشرطين
NOTNOT [condition1] يجب عدم الوفاء بالشرط

الآن دعنا نضيف أحد شروط AND أعلاه بين عوامل المقارنة:

Sub variables()
    If IsNumeric(Range("F5")) Then 'إذا كانت قيمة عددية
    
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        
        row_number = Range("F5") + 1

        If row_number >= 2 And row_number <= 17 Then 'إذا كان الرقم الصحيح
        
            last_name  = Cells(row_number, 1)
            first_name = Cells(row_number, 2)
            age        = Cells(row_number, 3)
            
            MsgBox last_name & " " & first_name & ", " & age & "سنين"
            
        Else 'إذا كان الرقم غير صحيح
            MsgBox "الرقم المدخل" & Range("F5") & "ليس صحيحا!"
            Range("F5").ClearContents
        End If
       
    Else 'إذا لم تكن قيمة عددية
        MsgBox "أدخلت القيمة" & Range("F5") & "ليس صحيحا!"
        Range("F5").ClearContents
    End If
End Sub

إذا أردنا أن نجعل الماكرو أكثر عملية ، فيمكننا استبدال 17 بمتغير يحمل عدد الأسطر. سيسمح لنا ذلك بإضافة صفوف وإزالتها من المصفوفة دون الحاجة إلى تغيير هذا الحد في كل مرة.

للقيام بذلك ، نحتاج إلى إنشاء متغير nb_rows وإضافة هذه الوظيفة.

في هذه الحالة ، سنستخدم دالة WorksheetFunction.CountA ، التي تُماثل وظيفة COUNTA في Excel نفسها.

نريد من هذه الوظيفة حساب عدد الخلايا غير الفارغة في العمود الأول وكتابة القيمة الناتجة إلى المتغير nb_rows:

Sub variables()
    If IsNumeric(Range("F5")) Then 'إذا كان الرقم
    
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        Dim nb_rows As Integer
       
        row_number = Range("F5") + 1
        nb_rows    = WorksheetFunction.CountA(Range("A:A")) 'وظيفة حساب عدد الأسطر
       
        If row_number >= 2 And row_number <= nb_rows Then 'إذا كان الرقم ساري المفعول
        
            last_name  = Cells(row_number, 1)
            first_name = Cells(row_number, 2)
            age        = Cells(row_number, 3)
            
            MsgBox last_name & " " & first_name & ", " & age & "سنين"
            
        Else 'إذا كان الرقم غير صحيح
            MsgBox "الرقم المدخل" & Range("F5") & "ليس صحيحا!"
            Range("F5").ClearContents
        End If

    Else 'إذا لم يكن الرقم
        MsgBox "أدخلت القيمة" & Range("F5") & "ليس صحيحا!"
        Range("F5").ClearContents
    End If
End Sub

عدا ذلك

يتيح ElseIf إضافة شروط إضافية بعد الأمر IF:

If [الشرط 1] Then '=> إذا كان الشرط 1 صحيحًا إذن
   'تعليمات 1
ElseIf [الشرط 2] Then '=> إذا كان الشرط 1 خطأ ولكن الشرط 2 صحيح إذن
   'تعليمات 2
Else '=> غير ذلك
   'تعليمات 3
End If

إذا كان CONDITION 1 صحيحًا ، فسيتم تنفيذ العبارة 1 والخروج من العبارة IF (التي تبدأ بـ IF وتنتهي بـ End If). إذا أرجع CONDITION 2 قيمة خطأ ، فسيتم تنفيذ العبارة 2 ، وإذا كانت النتيجة خطأ ، فسيتم تنفيذ العبارة 3 (ضمن Else).

فيما يلي مثال للصفوف من 1 إلى 6 في الخلية A1 وتعليق على هذه التقديرات في الخلية B1:

Sub scores_comment()
    'المتغيرات
    Dim note As Integer, score_comment As String
    
    note = Range("A1")
   
    'التعليقات على أساس النتيجة المستلمة
    If note = 6 Then
        score_comment = "نتيجة رائعة!"
    ElseIf note = 5 Then
        score_comment = "نقطة جيدة"
    ElseIf note = 4 Then
        score_comment = "درجة مرضية"
    ElseIf note = 3 Then
        score_comment = "نتيجة غير مرضية"
    ElseIf note = 2 Then
        score_comment = "نتيجة سيئة"
    ElseIf note = 1 Then
        score_comment = "النتيجة الرهيبة"
    Else
        score_comment = "النتيجة صفر"
    End If
   
    'التعليق في الخلية B1
    Range("B1") = score_comment
End Sub

Select Case

هناك بديل لاستخدام If مع العديد من عبارات ElseIf ، أي الأمر Select Case ، وهو أكثر ملاءمة لهذا النوع من المواقف.

ضع في اعتبارك مثالاً لماكرو باستخدام عامل التشغيل Select Case:

Sub scores_comment()
    'المتغيرات
    Dim note As Integer, score_comment As String
    
    note = Range("A1")
   
    'التعليقات على أساس النتيجة المستلمة
    Select Case note    '=> درجة الاختبار (نقاط)
        Case Is = 6         '=> إذا كانت القيمة = 6
           score_comment = "نتيجة رائعة!"
        Case Is = 5         '=> إذا كانت القيمة = 5
           score_comment = "نقطة جيدة"
        Case Is = 4         '=> إذا كانت القيمة = 4
           score_comment = "درجة مرضية"
        Case Is = 3         '=> إذا كانت القيمة = 3
           score_comment = "نتيجة غير مرضية"
        Case Is = 2         '=> إذا كانت القيمة = 2
           score_comment = "نتيجة سيئة"
        Case Is = 1         '=> إذا كانت القيمة = 1
           score_comment = "النتيجة الرهيبة"
        Case Else           '=> إذا كانت القيمة لا تساوي أيًا مما سبق
           score_comment = "النتيجة صفر"
    End Select
   
    'التعليق في الخلية B1
    Range("B1") = score_comment
End Sub

تجدر الإشارة إلى أنه يمكننا أيضًا استخدام عوامل مقارنة أخرى:

Case Is >= 6         'إذا كانت القيمة> = 6

أمثلة ذات معاني مختلفة:

Case Is = 6, 7       'إذا كانت القيمة = 6 أو 7
Case Is <> 6, 7      'إذا كانت القيمة لا تساوي 6 أو 7
Case 6 To 10         'إذا كانت القيمة = أي رقم من 6 إلى 10