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

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


محمد Albittar

تتفاعل إجراءات الفيجوال بيسك مع المستخدم عن طريق نوعين من النوافذ، وهما: الرسائل الصندوقية MsgBox، وصناديق الإدخال InputBox.

التعامل مع الرسائل النصية MsgBox

تُستخدَم للتواصل والتفاعل مع المستخدِم، ومن خلالها يمكننا عرض المعلومات وطرح الأسئلة وحفظ الإجابات، كما يمكننا توجيهه لإجراء عمل ما في بعض الأحيان مثل (التأكد من الإغلاق، حفظ الملف قبل الإغلاق).

الشكل العام للصيغة

MsgBox(prompt,[buttons],[title],[help,context])

حيث أن:

  • prompt: هو نص الرسالة التي ستظهر للمستخدِم، وهو مُعطى مطلوب.
  • buttons: هي الأزرار التي سنضيفها للرسالة، وهو مُعطى اختياري، حيث أن القيمة الافتراضيّة له هي زر موافق.
  • title: هو النص الذي سيظهر في شريط العنوان للرسالة، وهو مُعطى اختياري، حيث أن القيمة الافتراضيّة له هي Microsoft Excel.
  • help,context: إرفاق ملف مساعد بمثابة دليل للمستخدم، وهو مُعطى اختياري ولا يُستخدم مع إكسل غالبًا.

001MsgBox.PNG

أشكال الرسائل المستخدمة في MsgBox

يوجد خمس أجزاء تعمل على تشكيل الرسائل، أربعة منها أساسية وواحدة نادرة الاستخدام، بحيث نُدخلها كاملةً ضمن المُعطى button وهي:

  • نوع الأزرار الظاهرة.
  • نوع الأيقونات ضمن الرسالة.
  • تعيين الزر الافتراضي.
  • تعيين نوع الاستجابة.
  • إضافة بعض الخصائص للرسالة.

تحديد نوع الأزرار الظاهرة

لدينا الأنواع التالية التي تُحدد عمل الرسائل عن طريق الأزرار المستخدَمة وهي:

  • vbOKOnly: تعمل على إظهار الزر OK فقط، رقم التعريف الخاص به 0، وهو الإفتراضي عند عدم تحديد نوع الزر المستخدَم. +vbOKCancel: تعمل على إظهار الزر OK مع زر Cancel، ورقم التعريف الخاص به 1.
  • vbAbortRetryIgnore: تعمل على إظهار الأزرار Abort بمعنى فشل العملية، وRetry لإعادة المحاولة، وIgnore بعنى تجاهل الخطأ؛ أما رقم التعريف الخاص به 2.
  • vbYesNoCancel: تعمل على إظهار الأزرار Yes، وNo، وCancel التي تفيد هنا إلغاء العملية؛ أما رقم التعريف الخاص به فهو 3.
  • vbYesNo: تعمل على إظهار الأزرار Yes، وNo ، ورقم التعريف الخاص به هو 4.
  • vbRetryCancel: تعمل على إظهار الأزرار Cancel، وRetry، رقم التعريف الخاص به هو 5.

نستطيع استخدام أحد هذه الأزرار ببساطة، ولكن نحتاج إلى تعريف متغيّر نوعه MsgBoxResult لتخزين نتيجة اختيار المستخدِم فيه لاستعمالها لاحقًا في تنفيذ الأوامر. ولا نُعرّف هذا المتغيّر في حال استخدامنا للزرvbOKOnly فقط.

آلية حفظ نتيجة اختيار المستخدم

على فرض أننا نستعمل الزر من النوع vbYesNoCancel، فسيكون له ثلاثة احتمالات لاختيار المستخدم، ولتكن لدينا الصيغة التالية:

Sub test1()
Dim result As VbMsgBoxResult
result = MsgBox("هل أنت متأكد من الإغلاق", vbYesNoCancel)
End Sub

هنا تكون النتيجة إحدى الاحتمالات التالية vbYes، وvbNo، وvbCancel. وعند الضغط على أحد هذه الأزرار، فستُحفظ قيمته في المتغيّر بحيث يمكننا الاستفادة منها لاحقًا في تنفيذ بعض التعليمات اعتمادًا عليها، وبنفس الطريقة تعمل باقي الأزرار. كما يمكننا استخدام رقم التعريف عوضًا عن الاسم، أي لاستعمال الزر vbYesNoCancel نضع في المُعطى الخاص به الرقم المُعرِّف له بدل اسم الزر وهو 3، والذي يعطي نفس النتيجة.

Sub test1()
Dim result As VbMsgBoxResult
result = MsgBox("هل أنت متأكد من الإغلاق", 3)
End Sub

تحديد نوع الأيقونات الظاهرة

  • vbCritical: إظهار علامة X، ورقم التعريف الخاص به 16.

002MsgBox.PNG

  • vbQuestion: إظهار علامة الاستفهام، ورقم التعريف الخاص به 32.

003MsgBox.PNG

  • vbExclamation: إظهار علامة التعجب الصفراء المثلثة، ورقم التعريف الخاص به 48.

004MsgBox.PNG

  • vbInformation: إظهار علامة التعجب الزرقاء الدائرية، ورقم التعريف الخاص به 64.

005MsgBox.PNG

يمكننا إضافة الأيقونة للرسالة عن طريق الوسيطة buttons، وذلك بإضافة اسم الأيقونة إلى اسم الزر، لنفصل بينهما بإشارة +، وبالعودة للمثال السابق وإضافة الأيقونة سنحصل على الصيغة التالية:

Sub test1()
Dim result As VbMsgBoxResult
result = MsgBox("هل أنت متأكد من الإغلاق", vbYesNoCancel+ vbInformation)
End Sub

أو بالصيغة المرجعية لرقم الخاصية:

Sub test1()
Dim result As VbMsgBoxResult
result = MsgBox("هل أنت متأكد من الإغلاق", 3 + 64)
End Sub

تحديد الزر الافتراضي

يمكننا تحديد أي الأزرار يكون هو الافتراضي عند الضغط على زر Enter من لوحة المفاتيح.

  • vbDefaultButton1: الزر الأول هو الافتراضي، ورقم التعريف الخاص به 0.
  • vbDefaultButton2: الزر الثاني هو الافتراضي، ورقم التعريف الخاص به 256.
  • vbDefaultButton3: الزر الثالث هو الافتراضي، ورقم التعريف الخاص به 512.
  • vbDefaultButton4: الزر الرابع هو الافتراضي، ورقم التعريف الخاص به 768.

تحديد نوع الاستجابة

  • vbApplicationModal: عند استخدامها تُجبر المستخدِم على الاستجابة للرسالة قبل المتابعة، ورقم التعريف الخاص به 0.
  • vbSystemModal: عند استخدامها فإن جميع برامج النظام تتوقف حتى يستجيب المستخدم للرسالة، ورقم التعريف الخاص به 4096.

إضافة بعض الخصائص للرسالة

  • vbMsgBoxHelpButton: إظهار زرّ Help على الرسالة، ورقم التعريف الخاص به 16384.
  • vbMsgBoxSetForeground: جعل نافذة الرسالة في مقدمة النوافذ المفتوحة، ورقم التعريف الخاص به 65536.
  • vbMsgBoxRight: محاذاة نص الرسالة للجهة اليُمنى، ورقم التعريف الخاص به 524288.
  • vbMsgBoxRtlReading: اتجاه الكتابة من اليمين لليسار للغة العربية، ورقم التعريف الخاص به 1048576.
اقتباس

هام جدًا: يمكننا استعمال خاصية واحدة من كل مجموعة من المجموعات السابقة في الرسالة الواحدة، ولا يمكننا استخدام خاصيتين من نفس المجموعة في نفس الرسالة.

مثال تطبيقي

ليكن لدينا جدول البيانات التالية ونريد كتابة إجراء يحذف البيانات ضمن الجدول، ولكن قبل الحذف نريد من المستخدم تأكيد العملية عن طريق MsgBox وفي حال لم يوافق على الحذف تظهر له رسالة أخرى تُعلمه أن البيانات لم تُحذف:

006MsgBox.PNG

لكتابة الإجراء الخاص بالعمليات السابقة، نُعرّف الإجراء ونضع له الاسم "clear"، ثم نُعرّف متغيّر من النوع VbMsgBoxREsult ونُسند إليه الرسالة التي ستظهر للمستخدِم، والتي تحتوي على رسالة تأكيد عملية الحذف. بحيث يكون الزر فيها من النوع vbYesNo، والأيقونة من النوع vbQuestion، بالإضافة لعنوان الرسالة الذي يُعبّر عن تحذير تصبح الصيغة كالتالي:

result = MsgBox("هل أنت واثق من حذف البيانات", vbYesNo + vbQuestion, "تحذير")

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

If result = vbYes Then
ActiveSheet.Range("D12:H29").ClearContents
Else
MsgBox ("البيانات لم تُحذف")
End If

هكذا نكون قد حصلنا على الإجراء المطلوب ويصبح الإجراء كاملًا كالتالي:

Sub Clear()
Dim result As VbMsgBoxResult
result = MsgBox("هل أنت واثق من حذف البيانات", vbYesNo + vbQuestion, "تحذير")
If result = vbYes Then
ActiveSheet.Range("A2:H12").ClearContents
Else
MsgBox ("البيانات لم تُحذف")
End If
End Sub

007MsgBox.gif

التفاعل مع المستخدم عبر صندوق الإدخال عن طريق InputBox

مثل سابقتها، تعمل على إظهار رسالة للمستخدِم، ولكن عن طريقها يستطيع المستخدِم إدخال قيمة ما عبر صندوق إدخال القيم، ولدينا نوعان منها.

الشكل العام للصيغة

InputBox(prompt, [ title ], [ default ], [ xpos ], [ ypos ], [ helpfile, context ])

هذه التعليمة خاصّة بلغة فيجوال بيسك عمومًا، حيث أن:

  • prompt: هو نص الرسالة التي ستظهر للمستخدِم، وهو مُعطى مطلوب.
  • title: هو النص الذي سيظهر في شريط العنوان للرسالة، وهو مُعطى اختياري، حيث أن القيمة الافتراضيّة له هي *Microsoft Excel*.
  • default: هي القيمة الافتراضيّة في صندوق الإدخال، وهو مُعطى اختياري.
  • xpos: هي الموقع الأفقي لظهور الرسالة في الصندوق، وهو مُعطى اختياري، تكون القيمة الافتراضيّة له Left.
  • ypos: هي الموقع الشاقولي لظهور الرسالة في الصندوق وهو مُعطى اختياري، وتكون القيمة الافتراضيّة له Top.
  • help,context: إرفاق ملف مساعد بمثابة دليل للمستخدم، وهو مُعطى اختياري ولا يُستخدم مع إكسل غالبًا.
expression.InputBox (Prompt, [ title ], [ default ], [ xpos ], [ ypos ], [ helpfile, context ], [Type])

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

  • expression: عن طريقها نُحدد كائن من كائنات الإكسل الذي سنطبق التعليمات عليه مثل الكائن Application.
  • type: تحدد نوع البيانات التي سيُدخلها المستخدِم، ولدينا عدة أنواع كما هو موضح في الصورة.

008InputBox.PNG

آلية العمل والفرق بين الصيغتين

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

مثال

لدينا الملف التالي الذي يحتوي على صفحتين، الأولى تسمح لنا بتسجيل الدخول عن طريق صندوقي إدخال الأول لاسم المستخدم، والثاني لكلمة المرور، وإظهار الصفحة الثانية التي تحتوي على بيانات الشركة. حيث أنّ الصفحة الثانية مخفية عن طريق تغيير قيمة الخاصية visible لها إلى القيمة xlSheetVeryHidden، وهي خاصية لا تسمح لنا بإظهار الصفحة من ملف الإكسل بالطريقة التقليدية، إنما فقط عن طريق الإجراءات أو عن طريق القائمة Property التي تحدثنا عنها في درس التعريف عن الواجهة الرئيسية للمحرّر:

009InputBox.PNG

نبدأ الإجراء بتعريف المتغيّرات التي سنُخزن فيها القيم التي سيُدخلها المستخدِم لموازنتها فيما بعد مع القيم الصحيحة لتسجيل الدخول، وتكون لدينا الصيغة التالية:

Dim UserName As String
Dim Password As Double
UserName = InputBox("Enter your user name", "Username", "Your Name")
Password = Application.InputBox("Enter your password", "Password", Type:=1)

كتبنا المُعطى Type:=1 بهذا الشكل وهو طريقة ثانية لكتابة قيم المُعطيات عندما نريد تجاوز المُعطيات التي تسبق المُعطى الذي نريده، ولو أردنا كتابتها بالصيغة الأساسية فستكون كالتالي:

Application.InputBox("Enter your password", "Password", , , , ,1)

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

If UserName = "Maher" And Password = 123 Then
Sheets("data").Visible = xlSheetVisible
Else
MsgBox "Incorrect Username or Password"
End If

يُصبح الإجراء بالكامل كالتالي:

Sub check_user()
Dim UserName As String
Dim Password As Double
UserName = InputBox("Enter your user name", "Username", "Your Name")
Password = Application.InputBox("Enter your password", "Password", Type:=1)
If UserName = "Maher" And Password = 123 Then
Sheets("data").Visible = xlSheetVisible
Else
MsgBox "Incorrect Username or Password"
End If
End Sub 

010InputBox.gif

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

011InputBox.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.


×
×
  • أضف...