السلام عليكم ورحمة الله وبركاته
إخواني وأحبابي في الله
قدمت في الآونة الأخيرة بعض الموضوعات التي تشجع على البحث والمحاولة ، والغرض هو خلق جيل قادر على التعامل مع البرمجة بسهولة ويسر وبدون تعقيد .. لذا أستكمل هذه الموضوعات علها يكون لها الأثر إن شاء الله في تطوير مستوانا في البرمجة بالـ VBA
قدمت موضوع يخص النطاق الحالي
من هنا
وموضوع يخص التصفية المتقدمة
من هنا
وموضوع يخص التأكد من وجود ورقة عمل من عدم وجودها
من هنا
وموضوع يشرح الحلقة التكرارية Do While Loop
من هنا
واليوم أقدم لكم الموضوع الحالي الذي سنستفيد من كل ماسبق من موضوعات في كتابة الكود الخاص بهذا الموضوع ...
نبدأ
بالمعطيات كما تعودنا :: بفرض أن لدينا ورقة عمل Sheet1 وبها بيانات بالشكل التالي
والمطلوب إنشاء أوراق عمل بالقيم الموجودة في العمود الثامن أي إنشاء ورقة عمل باسم "ناجح" وإنشاء ورقة عمل باسم "راسب" وإنشاء ورقة عمل باسم "غائب" ، وفي كل ورقة عمل سيتم ترحيل البيانات المرتبطة بكل بيان
استراتيجية العمل :
===========
>> نعلن عن ثلاثة متغيرات .. الأول باسم r ليحمل النطاق الحالي للخلية A1 ، والثاني باسم c ويشير إلى الخلية K1 بالاعتماد على عدد أعمدة النطاق الحالي + 2 ، والمتغير الثالث باسم s من النوع النصي ليحمل اسم ورقة العمل في كل حلقة تكرارية
>> نعين قيمة المتغير r ليساوي النطاق الحالي كما ذكرنا ، ونعين قيمة المتغير c ليشير إلى الخلية K1 ولكن بشكل غير مباشر باستخدام دالة الإزاحة كما شرحنا في موضوع سابق
>> استخراج القيم الغير مكررة في العمود الثامن وهي ثلاثة قيم "ناجح" و"راسب" و"غائب" .. وسيكون ذلك باستخدام التصفية المتقدمة ، حيث توضع القيم في النطاق c كبداية
>> عمل حلقة تكرارية باستخدام Do While يليها الشرط ألا تكون الخلية التالية للخلية c لا تساوي فراغ (راجع الموضوع)
>> داخل الحلقة التكرارية نعين قيمة للمتغير s بحيث تساوي اسم ورقة العمل وستكون موجود في الخلية التالية للخلية c (عمل إزاحة بمقدار واحد)
>> نختبر وجود ورقة العمل باستخدام دالة ISREF ودالة Evaluate فإذا لم تكن موجودة يتم إنشاء ورقة العمل في نهاية أوراق العمل بالمصنف
>> نستخدم التصفية المتقدمة مرة أخرى ولكن هنا سنقوم بنسخ النتائج لورقة العمل الهدف ، ولا ننسى أن هنا نطاق الشرط (يشمل العنوان K1 والخلية التي تليها وهي الخلية K2)
CODE
r.AdvancedFilter xlFilterCopy, c.Resize(2), Worksheets(s).Cells(1)
>> نقوم بحذف الخلية التالية استعداداً للتعامل مع ورقة العمل التي تليها باستخدام السطر التالي
CODE
c.Offset(1).Delete xlShiftUp
>> ثم أخيراً نغلق الحلقة التكرارية باستخدام كلمة Loop
>> أخيراً نقوم بمسح محتويات النطاق الحالي للنطاق c أي مسح محتويات العمود المساعد
شكل المخرجات ستكون بالشكل التالي
رابط الملف المرفق وفيه الحل النهائي من هنا
وفقني الله وإياكم لكل خير
كان معكم أخوكم في الله / ياسر خليل أبو البراء