السبت، 19 أبريل 2014

الأحد، 13 أبريل 2014

إنشاء النماذج في فيجوال بيسك التطبيقات VBA

[ ملاحظة : رابط الموضوع الأصلي في آخر الموضوع ]


نشرت عدة مقالات منذ أكثر من عامين عن استخدام فيجوال بسيك التطبيقات Visual Basic For Applications (VBA) المُتاح مع برامج ميكروسوفت للمكتب MS Office مثل إكسل ووورد. ووجهة نظري أن فيجوال بسيك التطبيقات هو وسيلة متاحة مع هذه البرامج الواسعة الانتشار ولذلك فهي وسيلة مساعدة قوية للمهندسين الصناعيين والمديرين تمكنهم من القيام ببعض المهام التي يصعب أداؤها باستخدام برنامج إكسل مثلا. فلو تعرفت على مبادئ فيجوال بيسك التطبيقات فستتمكن من القيام بمهام عديدة دون الحاجة لشخص متخصص في البرمجة.
أحاول في هذه المقالة إضافة أحد استخدامات فيجوال بسك التطبيقات وهو إنشاء نموذج مثل نماذج ملء أو عرض البيانات. هذه النماذج تكون مفيدة لأنها تعرض البيانات بالشكل الذي نريده وليس في صورة جداول إكسل. وهذه النماذج يمكن التحكم بها لكي تؤدي الوظائف التي تريدها. عندما تتقن استخدام النماذج تجد أنك تقوم بمهام لم تكن تتصور أن تقوم بها في الماضي.
في المقالات السابقة مباشرة لهذه المقالة ناقشت تجربتي مع البرامج مفتوحة المصدر ومنها المكتب المفتوح OpenOffice.org والذي يحتوي على برنامج كلك Calc والذي هو بديل لإكسل. ونصحت بتجربة هذه البرامج مفتوحة المصدر. وأحب أن أشير إلى أن برنامج كلك في المكتب المفتوح يمكن استخدامه لعمل ماكرو كما في إكسل ولكن بلغة مختلفة بعض الشيء. وقد قرأتُ ما يفيد إلى إمكانية استخدام فيجوال بيسك التطبيقات في المكتب المفتوح، وقد جربت هذا الأمر ويبدو أنه يعمل مع وجود بعض المشاكل أحيانا. إن شاء الله بعد مروري بفترة تعلم أساسيات الماكرو في المكتب المفتوح سوف أحاول توضيح ذلك في هذا الموقع.
كيف نضيف نموذجا؟
افترض أننا نريد بناء نموذج (شاشة) لإدخال اسم الطالب ورقمه ودرجته. ونريد حفظ البيانات في ملف إكسل مع إمكانية استدعائها وطباعتها.
نبدأ بإنشاء نموذج. من محرر فيجوال بسيك للتطبيقات من إكسل اختر UserForm من الأيقونة الثانية من اليسار كما بالصورة.
فيظهر لك نافذة جديدة باللون الرمادي. هذا هو النموذج الذي سنستخدمه لإدخال واستعراض بيانات الطلبة.
سنبدأ الآن في إضافة بعض المكونات لهذا النموذج (الشاشة). أي أننا سنصمم شكل الشاشة. لو نظرت على يسار الشاشة تجد مربع يحتوي على أداوات التحكم مثل:
* صندوق (مربع)  الكتابة Text Box وهو مستطيل يستخدم لكتابة بيانات مثل الأسماء أو الأرقام
* زر الأوامر Command Button وهو عبارة عن زر (مستطيل بارز) يستخدم لتنفيذ أوامر محددة مثل نقل البيانات أو عرضها أو غلق النموذج أو الطباعة
* الصندوق المتدلي (المنسدل)  Combo Box وهو صندوق صغير يستخدم لاختيار اسم من مجموعة أسماء أو رقم من مجموعة أرقام
* العنوان Label ويستخدم لكتابة عنوان مثل كتابة اسم أو عنوان لمربع النص
* صندوق الفحص Check Box وهو مربع الصغير يسمح للمستخدم بوضع علامة عليه أو تركه بدون علامة
وهناك أدوات أخرى ولكن دعنا نشرع في استخدام بعض هذه الأدوات.
سنبدأ بوضع زر الأوامر وذلك بالضغط عليه ثم وضعه في النموذج بنفس الأسلوب الذي تستخدمه لرسم مستطيل في أي برنامج
بعد وضع زر الأوامر سنجد أننا بحاجة للتحكم في بعض خصائصه مثل المسمى الذي يظهر عليه. يمكننا التحكم في الخصائص من خلال صندوق الخصائص الذي يظهر في يسار الشاشة.
هذا الصندوق يظهر خصائص هذا الزر مرتبة أبجديا. ويمكنك أن تجرب تغيير بعض الخصائص وتلاحظ تأثيرها. سنبدأ بتغيير اسم الزر الذي يظهر عليه وهو بالإنجليزية Caption. سنغير الاسم من CommandButton1 إلى كلمة “ENTER” أي “إدخال” لتناسب طبيعة النموذج الذي نبنيه.
ولكن خط الكتابة يبدو صغيرا. يمكننا تغيير حجم الخط ونوعه بالضغط على المربع الصغير الذي يظهر عندما نقف بالفأرة داخل مربع Font والي يحتوي على كلمة Tohama فتظهر لنا النافذة التالية:
والآن نريد وضع بعض الخانات التي يمكن لمستخدم البرنامج أن يكتب فيها بيانات الطلبة. نستخدم لذلك صندوق (مربع) النص. ولكن مربع النص يحتاج لعنوان لكي نكتب محتوى هذا المربع مثل الاسم أو الدرحة. لذلك نضع عنوانا Label بجوار مربع النص كما بالشكل. عملية وضع مربع النص والعنوان تتم بنفس الطريقة التي ترسم بها لأشكال في أي برنامج.
ولكننا نحتاج إلى ثلاثة مربعات للنص لكي نكتب: الاسم، الرقم، الدرجة. لذلك نضع مربعين للنص وعنوانين لهما. يمكن أن نضعهما بنفس الطريقة أو نستخدم عملية نسخ ولصق Copy …Paste  للمربع والعنوان الأولين.
ستلاحظ أن عنوان مربع النص الأول هو Label1 وأن عنوان مربع النص الثاني هو Label2 وهكذا. سنقوم بتغيير هذه العناوين إلى Name, Code, Score للمربعات الثلاثة على التوالي. قف على العنوان الأول ثم ابحث في شاشة الخصائص عن Caption وقم بتغييره من Label1  إلى Name وهكذا.
لقد وضعنا المكونات الرئيسية للشاشة. علينا الآن أن تكتب برنامجا يحدد الخطوات التي ستتم عند ضغك زر الأوامر. لذلك نضغط على زر الأوامر مرتين متتاليتين فيظر لنا نافذة لكتابة الأوامر الخاصة بالضغط على هذا الزر. نكتب الأوامر كالتالي:
الأوامر المبينة في الصورة أعلاه هي ثلاثة أوامر فقط وهي تعني أن محتويات محتويات الخلية في الصف الثاني والعمود الأول في الصفحة التي اسمها Sheet1 هي نفس محتويات  مربع النص الأول . وأما محتويات الخلية في الصف الثاني والعمود الثاني في الصفحة التي اسمها Sheet1 فهي نفس محتويات مربع النص الثاني. وأما محتويات الخلية في الصف الثاني والعمود الثالث في الصفحة التي اسمها Sheet1 فهي نفس محتويات مربع النص الثالث. أي أننا ننقل محتويات مربعات النص لأول ثلاث خلايا في الصف الثاني.
ومعنى السطر الأول:
Private Sub CommandButton1_Click()
أن هذه هي الاوامر التي تنفيذها عند الضغط Click على زر الأوامر هذا CommandButton1. وهنا يطرأ سؤال: ألم نغير اسمه إلى Enter؟ لا نحن غيرنا المسمى الذي يظهر في الشاشة عند تشغيلها ولكن لم نغير اسمه داخل البرنامج. لو رجعت لمربع الخصائص لوجدت أن هناك خانة في أعلاه خاصة بالاسم داخل البرنامج (Name).
عند تشغيل الشاشة نرى المنظر التالي:
إن البيانات التي نكتبها في مربعات النص تنتقل عند الضغط على زر الأوامر Enter إلى المربعات A2, B2, C2. الآن نلاحظ أن النموذج ينقل لنا البيانات في السطر الثاني. هذا جيد ولكننا نريد إدخال البيانات واستعراض بيانات أي طالب كما نلاحظ أن الخط داخل مربعات النص صغير. لذلك نقوم ببعض التنسيق والإضافات.
نبدأ بتغيير حجم الخط لمربعات النص:
فيظهر لنا النموذج عند تشغيله
والآن نريد أن نجعل البرنامج يسمح لنا بإدخال بيانات الطلبة واحدا تلو الآخر. لذلك تضيف For …Next  كما هو موضح:
لاحظ أن البرنامج يحدد السطر الذي يكتب فيه بأن يجد الخلية الأولى في السطر فارغة وهو ما يعني أن هذا هو أول سطر فارغ فيكتب فيه.
أمر ثانوي وهو أنه يمكننا وضع بعض العناوين في صفحة إكسل للأعمدة الثلاثة الأولى. عند تشغيل النموذج يظهر كما يلي:
لاحظ أنه عند الضغط على زر الأوامر فإن بيانات الطالب تكتب في السطر المناسب. وقد تلاحظ أنه عند الضغط على زر الأوامر فإن بينات الطالب السابق تبقى كما هي في مربعات النص. هذا أمر غير مرغوب فيه فإننا نريد المربعات فارغة لكتابة بيانات الطالب التالي. بالطبع لا يمنعنا وجود البيانات في المربعات من كتابة بيانات الطالب التالي ولكنه ليس المنظر المقبول.
لذلك نضيف ثلاث خطوات لكي نجعل هذه المربعات تبدو فارغة بمجرد نقل بياناتها لصفحة إكسل. لاحظ الخطوات الثلاث في الأسطر من 8 إلى 10 وهي تعني أن قيمة مربع النص تساوي “” أي لا شيء.
والآن نريد أن نسمح باستعراض البيانات بالإضافة لإدخالها. لذلك سنجعل هنا شاشة أولية لاختيار إما عرض البيانات أو إدخالها.
هذه الشاشة ستقودنا إلى الشاشة الثانية بناء على اختيارنا للإدخال أو للعرض من خلال الضغط على أي من زري الأوامر. عند اختيار عرض البيانات Show فإنه يجب إدخال رقم الطالب في مربع النص المجاور.
والآن علينا تعديل الشاشة الثانية لتناسب الوضع الجديد. نحن بحاجة لزر أوامر يعود بنا إلى الشاشة الرئيسية ونحتاج أن نسمح للمستخدم بالكتابة في مربعات النص في حالة الإدخال و ألا نسمح له بذلك في حالة العرض.
لقد أضفتُ كذلك زر أوامر للطباعة. والآن علينا كتابة برنامج الشاشة الاولى كالتالي:
لاحظ أن CommandButton1 هو زر الإدخال وأن  CommanButton2 هو زر العرض. في حالة العرض فإن مربعات النص تكون غير مُفعلة أي لا يمكن الكتابة بها ولذلك نستخدم
UserForm1.TextBox1.Enabled= False
وقد تسأل لماذا كتبنا هنا  UserForm1 والجواب أننا يجب أن نشير إلى مربع النص في الشاشة الأخرى فلذلك يجب توضيح أنها في تلك الشاشة وإلا فإن البرنامج يعنبرها في الشاشة الرئيسية UserForm2.
في حالة الإدخال فإن هذا الزر سيكون ظاهرا  وفي حالة العرض فإن زر الإدخال لن يكون ظاهرا. ولذلك نستخدم
UserFrom1.CommanButton1.Visible= True   أي أنه ظاهر وفي الحالة الأخرى نستخدم False.
ولتحميل أي شاشة فإننا نستخدم load UserForm1 ونستخدم أمر الإظهار  UserFrom1.Show ولإخفائها نستخدم UserForm1.Hide.
وأما برنامج الشاشة الثانية فيصبح بعد التعديل كما يلي:
لاحظ أن CommandButton3 هو  Back أي الرجوع للشاشة الرئيسية. وأن  CommandButton4  هو زر الطباعة. لاحظ أمر الطباعة
UserForm1.PrintForm وهو ما يعني طباعة هذا النموذج كما هو. والخيار الأصح هو أن تقوم بتصميم شاشة (نموذجا) خاصا للطباعة لأن طباعة النموذج الحالي تشمل طباعة أزرار الأوامر وهو ما لا نريده. ويمكن أن تجرب القيام بذلك بنفسك.
وبهذا يعمل البرنامج كما يلي في حالة العرض:
ويعمل كما بالشكل في حالة الإدخال:
وللاطلاع على ملف إكسل وتجربة الماكرو وفهمه برجاء الضغط هنا
هناك الكثير من الخيارات في تصميم النماذج ولعل هذه تكون مقدمة تفتح لك الباب ولكن حاول تجربة الملف والتعديل فيه وفهم كل التفاصيل.

==========
الدرس مستفاد من المدونة التالية :
http://samehar.wordpress.com/2009/12/02/vba-2/

وهذه بعض الروابط المفيدة من نفس الموقع

ملصق تعليمي .. إحاطة جارية بوصول عدد جديد من دروية تربوية

الفكرة : إنتاج ملصق تعليمي باستخدام برنامج الإيدروماكس
ملاحظة : لو كان لدينا صورة للدورية نفسها لكنت وضعتها في الملصق ذاته.
من تصميمي ..


نموذج خريطة ذهنية مصممة بالإيدروماكس .. المعرب والمبني

خريطة ذهنية حول المعرب والمبني
من تصميمي باستخدام الإيدروماكس