TOP

VBA- الدرس 12.2. عناصر التحكم (Controls)

تحتوي عناصر التحكم (Controls) على جميع أنواع الخصائص والعديد من الأحداث المرتبطة بها ، ولكن في الوقت الحالي سنلقي نظرة على عدد قليل فقط من العناصر المستخدمة في البرمجة على VBA.


لنبدأ بإضافة 3 عناصر تحكم - Label و TextBox و CommandButton:

قم بتحرير اسم وخصائص عنصر التحكم هذا (باستخدام الخاصية Caption التي تحتوي على النص) للحصول على النتيجة التالية:

الآن ، عندما ندخل الرقم ونضغط على موافق ، لا يحدث شيء.

لإنشاء إجراء ، سنضيف حدثًا يكتب القيمة المدخلة من مربع النص إلى الخلية A1 ويغلق النموذج.

يمكنك الوصول إلى الخيارات الموضحة أدناه بالنقر المزدوج فوق عنصر التحكم:

تحتوي هذه القائمة المنسدلة على عناصر تحكم متنوعة وهذا النموذج.

حدد الزر (Button) والحدث Click:

Private Sub CommandButton_validate_Click()

     Range("A1") = Textbox_number.Value
     'Textbox_number هو اسم مربع النص
     'Value هي خاصية تحتوي على قيمة مربع النص
    
     Unload Me
     'Unload يغلق النموذج (UserForm)
     'نستخدم Me بدلاً من اسم النموذج (لأن هذا الرمز يقع في منتصف UserForm الذي نريد إغلاقه)
End Sub

سيتم الآن حفظ القيمة المدخلة بالفعل في الخلية A1 قبل إغلاق هذا النموذج (UserForm).

أضف تسمية توضيحية ثانية (Label) وقم بتحرير الخصائص التالية: Caption و Forecolor (اللون: أحمر) و Visible (خطأ لإخفاء عنصر التحكم الافتراضي):

الآن دعنا نضيف حدثًا سيتم إطلاقه عندما يغير المستخدم القيمة الموجودة في حقل النص. سيعرض الحدث رسالة خطأ إذا لم تكن القيمة رقمية.

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'إذا كانت قيمة عددية ...
         Label_error.Visible = False 'العنوان (Label) مخفي
     Else 'خلاف ذلك...
         Label_error.Visible = True 'يتم عرض الاسم
     End If
End Sub

سيتم اختبار القيمة المدخلة في كل مرة يتم فيها إدخال الحرف التالي.

ما زلنا بحاجة إلى إضافة التحقق (التحقق من صحة) القيم المدخلة في النموذج. سنعرض رسالة إذا لم تكن القيمة رقمًا:

Private Sub CommandButton_validate_Click()
     If IsNumeric(Textbox_number.Value) Then 'إذا كانت قيمة عددية ...
         Range("A1") = Textbox_number.Value 'نسخ إلى A1
         Unload Me 'أنا أغلق
     Else 'خلاف ذلك...
         MsgBox "Incorrect value" 'قيمة غير صالحة
     End If
End Sub

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

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'إذا كانت قيمة عددية ...
         Label_error.Visible = False 'العنوان (Label) مخفي
         Me.Width = 156 'عرض النموذج
     Else 'خلاف ذلك...
         Label_error.Visible = True 'يتم عرض الاسم
         Me.Width = 244 'عرض النموذج
     End If
End Sub

يمكنك تنزيل ملف مثال Excel: userform1.xls

ها هي النتيجة:

Checkboxes

فيما يلي مثال على كيفية استخدام CheckBox:

عندما يتم تحديد / عدم تحديد خانة الاختيار ، يمكن تغيير قيمة الخلية المرتبطة باستخدام الحدث Click:

Private Sub CheckBox1_Click() 'رقم 1
     If CheckBox1.Value = True Then 'إذا تم تحديده ...
        Range("A2") = "Checked"
     Else 'إذا لم يتم التحديد ...
        Range("A2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox2_Click() 'رقم 2
     If CheckBox2.Value = True Then 'إذا تم تحديده ...
        Range("B2") = "Checked"
     Else 'إذا لم يتم التحديد ...
        Range("B2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox3_Click() 'رقم 3
     If CheckBox3.Value = True Then 'إذا تم تحديده ...
        Range("C2") = "Checked"
     Else 'إذا لم يتم التحديد ...
        Range("C2") = "Unchecked"
     End If
End Sub

في هذا المثال ، يتم إلغاء تحديد مربعات الاختيار مبدئيًا عند فتح النموذج لأول مرة.

للتحقق من كل خانة اختيار عندما تكون قيمة الخلية المطابقة "محددة" ("Checked") ، سنقوم بإجراء فحص تنشيط النموذج باستخدام UserForm_Initialize:

Private Sub UserForm_Initialize() 'إذا تم التحديد
     If Range("A2") = "Checked" Then
         CheckBox1.Value = True
     End If
     
     If Range("B2") = "Checked" Then
         CheckBox2.Value = True
     End If
     
     If Range("C2") = "Checked" Then
         CheckBox3.Value = True
     End If
End Sub

هنا يمكنك مشاهدة مثال في ملف Excel النهائي: userform2.xls

أزرار الخيارات (Option Buttons)

عند استخدام أزرار الخيارات (Option Buttons أو أحيانًا تسمى أيضًا Radio Buttons) ، يمكن للمستخدم تحديد خيار واحد فقط لكل "مجموعة" ، على عكس مربعات الاختيار ، حيث يمكن للمستخدم تحديد عدة مربعات في وقت واحد.

لإنشاء "مجموعة" ، أدخل أولاً Frame ثم OptionButton:

هنا يمكنك مشاهدة مثال في ملف Excel النهائي: userform3.xls

عند إرسال النموذج ، سيتم إدخال البيانات في الخلية المرتبطة باسم العمود المحدد (column_value) والصف (row_value).

من أجل معرفة الخيارات التي تم تحديدها ، يمكننا أن نفعل نفس الشيء كما في المثال السابق (مع مربعات الاختيار) ، لكننا سنستخدم حلقة لتقليل حجم الكود.

سنستخدم For كل حلقة ، وهو نوع من التكرار لم نقم بتغطيته من قبل. تسمح لك هذه الحلقة بتنفيذ التعليمات لكل كائن في "مجموعة كائنات":

Private Sub CommandButton1_Click()
     Dim column_value As String, row_value As String
     
     'حلقة لكل عنصر تحكم Frame_column
     For Each column_button In Frame_column.Controls
         'إذا كانت قيمة التحكم = True (ثم إذا تم تحديدها) ...
         If column_button.Value Then
            'يأخذ المتغير "column_value" قيمة نص الزر
            column_value = column_button.Caption
         End If
     Next
     
     'دورة لكتلة أخرى
     For Each row_button In Frame_row.Controls
         If row_button.Value Then
             row_value = row_button.Caption
         End If
     Next

     Range(column_value & row_value) = "Cell chosen!"  '"تم تحديد الخلية!"
     
     'إغلاق (تفريغ) النموذج (أنا)
     Unload Me
End Sub

يقوم نموذجنا الآن بإدخال القيمة "تم تحديد الخلية!" في الخلية المحددة.

لتجنب حدوث خطأ ، نحتاج إلى التحقق مما إذا كان المستخدم قد اختار بشكل صحيح من مجموعتين من الخيارات.

في هذا المثال ، عندما لا يكتمل النموذج بعد ، سيتحول زر التأكيد ("Confirm") إلى اللون الرمادي (معطل). إنه ليس الحل الأسهل ، ولكنه مثال جيد على سبب فائدة الوظائف / الإجراءات في منتصف النموذج (UserForm).

قم بتحرير النص وخاصية Enabled لتعطيل الزر.

ستكون النتيجة كما يلي:

في الكود السابق ، استخدمنا حلقتين For كل حلقة للحصول على قيم أزرار الخيارات (Option Buttons). نحتاج الآن إلى استخدام نفس القيم لزر التأكيد ("Confirm") والحدث Click للخيارات العشرة.

للقيام بذلك ، لا نحتاج إلى نسخ الحلقات لكل حدث ، سنقوم باستدعائها من خلال دالة.

بدءًا من الكود السابق وتعديله ، سنحقق هذه النتيجة:

 Private Function column_value()
 'الدالة التي تُرجع قيمة نصية للزر المحدد (column_value)
     For Each column_button In Frame_column.Controls
         If column_button.Value Then
             column_value = column_button.Caption
         End If
     Next
 End Function

 Private Function row_value()
 'دالة تقوم بإرجاع قيمة نصية للزر المحدد (row_value)
     For Each row_button In Frame_row.Controls
         If row_button.Value Then
             row_value = row_button.Caption
         End If
     Next
 End Function

 Private Sub CommandButton1_Click() 'الإجراء الذي يحدث عند النقر فوق ("تأكيد اختيارك")
     Range(column_value & row_value) = "Cell chosen!"  '"تم تحديد الخلية!"
     'column_value و row_value هي القيم التي تم إرجاعها بواسطة هاتين الدالتين
     Unload Me
 End Sub

كل ما تبقى لنا القيام به هو إنشاء روتين يتحقق مما إذا كان قد تم تحديد أزرار الخيارات بشكل صحيح (عن طريق استدعاء وظيفتين) وينشط هذا الزر عند الحاجة.

مرة أخرى ، يتم التحقق من الصحة في إجراء منفصل لتجنب نسخ الرمز 10 مرات لكل حدث من كل زر اختيار:

Private Sub activate_button()
 'تفعيل الزر إذا تم اختبار الحالة بنجاح
     If column_value <> "" And row_value <> "" Then
     'column_value و row_value هي القيم التي تم إرجاعها بواسطة هاتين الدالتين
         CommandButton1.Enabled = True
         CommandButton1.Caption = "Confirm your selection"  '"أكد اختيارك"
     End If
End Sub

Private Sub OptionButton11_Click()
     activate_button 'نبدأ إجراء "activ_button"
End Sub
Private Sub OptionButton12_Click()
     activate_button
End Sub
Private Sub OptionButton13_Click()
     activate_button
End Sub
Private Sub OptionButton14_Click()
     activate_button
End Sub
Private Sub OptionButton15_Click()
     activate_button
End Sub
Private Sub OptionButton16_Click()
     activate_button
End Sub
Private Sub OptionButton17_Click()
     activate_button
End Sub
Private Sub OptionButton18_Click()
     activate_button
End Sub
Private Sub OptionButton19_Click()
     activate_button
End Sub
Private Sub OptionButton20_Click()
     activate_button
End Sub

هنا يمكنك مشاهدة مثال في ملف Excel النهائي: userform3b.xls