تحتوي عناصر التحكم (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
ها هي النتيجة:
فيما يلي مثال على كيفية استخدام 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 أو أحيانًا تسمى أيضًا 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