السلام عليكم ورحمة الله وبركاته
أهلاً بكم ومرحباً إخواني وأحبابي في الله ، ومع موضوع جديد وشيق ، حيث سنقوم
بترتيب الأعمدة باستخدام المصفوفات
صدعتكم بالمصفوفات والكلام عن المصفوفات ، ولكن ما يدفعني إلى شرح المصفوفات والتعامل معها هو فقر المحتوى العربي من الدروس في هذا الجانب الهام من التعامل مع الأكواد
النهاردة يا رجالة هناخد مثال بسيط جداً عشان عارف إن الأمثلة المعقدة مش هتفيدنا ، وبدايةً أحب
أعرفكم على البيانات قبل ما نتعامل مع الأكواد ، ودا جانب مهم ، لازم تدي شوية وقت تبص فيهم على الهيكل العام للبيانات لأن دا مهم جداً في التعامل مع أي مشكلة ، عشان كدا هشرح لكم بالوصف والصورة
نفترض أن عندك نطاق من أول الخلية A1 إلى الخلية F10 ، دول كدا كام صف ؟ 10 صفوف !! وكام عمود ؟ 6 أعمدة .. تمام التمام
وأول صف مفترض أنه يكون صف لعناوين الأعمدة دي ..أنا سميت العناوين بشكل بسيط عشان نعرف إحنا هنرتب إزاي زي ما هو واضح في الصورة
في العناوين كتبت العناوين بشكل غير مرتب 6 - 2 - 3 - 1 - 5 - 4 .. حلو الكلام ؟! قول حلو
دا كدا الشكل العام والهيكل العام للبيانات
**
نيجي للمطلوب ، والمطلوب زي ما هو واضح في العنوان إننا نرتب الأعمدة دي بالشكل اللي إحنا عايزينه .. نترجم الكلام دا الأول قبل ما نبدأ نشوف الكود
يعني العنوان Header1 موجود في العمود الرابع ، ومطلوب يكون دا هو العمود الأول .. يبقا نعمل ايه ؟ بشكل مبدئي نخلي أول رقم عايزينه هو 4
طيب والعنوان Header2 موجود في العمود التاني ، ومطلوب يكون دا هو العمود التاني .. بنفس المبدأ نخلي تاني رقم عايزينه هو 2 (دا مفيش فيه تغيير في الترتيب)
العنوان Header3 زي ما هو بردو في نفس ترتيبه ، فياخد الرقم 3 (بردو نفس الكلام مفيش تغيير في الترتيب)
ناخد مثال أخير العنوان Header4 موجود في العمود السادس ، ومطلوب يكون في العمود الرابع .. يبقا نخلي رابع رقم هو 6
وهكذا .. نشوف صورة عشان نفهم الترتيب الجديد هيكون إزاي (صورة ملخبطة يا رب تفهموها لأني أنا نفسي مفهمتش اتعملت مني إزاي
)
خلاصة الرغي دا كله .. إحنا عايزين أرقام الأعمدة المطلوبة بالشكل اللي إنت عايزه وهيكون زي ما هو موجود في الصورة بنفس الترتيب ده 4 - 2 - 3 - 6 - 5 - 1
** بعد ما عرفنا المعطيات والهيكل العام للبيانات وعرفنا المطلوب ..
نيجى لأسهل مرحلة وهي كتابة الكود (أيوا أسهل مرحلة لو فهمت المشكلة كويس) .. كل اللي علينا إننا نترجم الكلام دا لكود ودا هنتعلمه لو في نيتنا نتعلمه .. أيوا والله زي ما بقولكم كدا
أول جزء في الكود جزء تقليدي وهو تعريف المتغيرات وفيه ناس كتير بتهمله لكن أنا أبداً محبش أهمله أبداً أبداً ، ومش هتناقش في القضية دي
الكود فيه متغيرين وبس .. متغير هيمثل نطاق البيانات وهيكون اسمه r ودا اختصار كلمة range ، طبعاً التسمية اختيارية
والمتغير التاني هيمثل المصفوفة اللي هنخزن فيها البيانات ودا اسمه a ودا اختصار كلمة array ، وزي ما قلت التسمية اختيارية .. عشان محدش يعترض
نبدأ نشوف المنطق في كتابة الكود .. أول شيء إحنا هنتعامل مع نطاق محدد والنطاق دي بيبدأ من الخلية A1 وبينتهي في الخلية F10 بس طبعاً أثناء تعيين قيمة للمتغير r هنخلي النطاق مرن من ناحية عدد الصفوف ، ودا السطر اللي من خلاله بنعين النطاق المطلوب التعامل معاه
CODE
Set r = Sheets("Sheet1").Range("A1:F" & Cells(Rows.Count, 1).End(xlUp).Row)
بالنسبة لتعيين النطاق بنستخدم كلمة Set لأن النطاق دا كائن Object ، وبعد علامة يساوي بنحدد ورقة العمل ، ونحدد النطاق بدايته ونهايته ، وهنا الرقم 10 اللي هو آخر النطاق استبدلناه بجملة من خلالها نقدر نعرف رقم آخر صف للنطاق ده بدل ما نكتبه بشكل مباشر .. واللي يحب يعرف التفاصيل الخاصة بهذه الجزئية يروح للموضوع دا
من هنا
دلوقتي نيجي لأهم سطر في الكود وهو لب الموضوع ، واللي عشانه اتعمل الموضوع دا بالكامل ، فيا ريت نركزشوية عشان نفهم السطر دا كويس
CODE
a = Application.Index(r.Value, Evaluate("ROW(1:" & r.Rows.Count & ")"), [{4,2,3,6,5,1}])
نبدأ نترجم السطر دا لكلام مفهوم ومهضوم ، إحنا هنا هنقوم بتخزين البيانات داخل مصفوفة وفي نفس ذات الوقت هنعيد ترتيب البيانات (يعني زي ما بيقولوا : بلحتين بحجر واحد
)
الجزء المسئول عن تخزين بيانات النطاق الأصلي هو r.Value (أيوا هو الجزء ده اللي هيكون من خلاله كل البيانات متخزن داخل المصفوفة)
طيب بقية الكود : مسئول عن ترتيب الأعمدة ، ودا نقدر نعمله استخدام دالة INDEX (وكتير منا يعرفها من خلال ورقة العمل .. بصوا على الصورة عشان تعرفوا البارامترات الخاصة بالدالة)
وهو دا بالظبط اللي عملناه .. المصفوفة المخزنة array هي المصفوفة المخزن فيها البيانات اللي هي r.Value
أرقام الصفوف المطلوبة هنستخرجها من خلال الجزء ده
---------------------------------------------------
CODE
Evaluate("ROW(1:" & r.Rows.Count & ")")
طيب الدالة Evaluate دي بتعمل ايه ؟ دي بالظبط كأنك بتكتب معادلة بس في الكود ، والمعادلة هنا بسيطة جداً .. يعني شكل المعادلة في ورقة العمل لو أخدنا الجزء ده وحبينا نعمله كمعادلة في ورقة العمل هيكون بالشكل ده
بنشيل كلمة Evaluate والقوس المفتوح وعلامة التنصيص ........... وعلامة التنصيص والقوس المقفول ، ونحط مكانهم علامة يساوي =
ونشيل الجزء ده r.Rows.Count (ودا اللي بنعرف من خلاله عدد صفوف النطاق) ، وبنشيل معاه علامة التنصيص وعلامة & اللي قبلها ، وكمان بنشيل علامة & والتنصيص اللي بعدها ، ونضع مكانه الرقم 10 .. فتكون المعادلة بالشكل ده
CODE
=ROW(1:10)<br />
لو كتبا المعادلة في ورقة العمل وحددنا المعادلة في شريط المعادلات ، وضغطنا F9 من لوحة المفاتيح هيطلع لنا ايه؟ هيطلع الناتج بالشكل ده
CODE
={1;2;3;4;5;6;7;8;9;10}<br />
معنى الكلام دا ايه ؟ >>> معناه إنه سيتم استخراج الصفوف كلها داخل النطاق من أول الصف رقم 1 إلى الصف رقم 10
أرقام الأعمدة المطلوب استخراجها
--------------------------------
البارامتر التالت هو المسئول عن الأعمدة واستخدمنا هنا [ ] ودي بالظبط زي Evaluate بس أسهل منها لأن Evaluate بييجي وراها قوس مفتوح وقوس تنصيص وفي آخرها قوس تنصيص وقوس مقفول ..
يعني دول
CODE
Evaluate(" ………")
بيساووا دول
CODE
[ ………]
بالنسبة لأرقام الأعمدة وضعناها داخل أقواس بهذا الشكل { } ودي كأنها مصفوفة بردو
CODE
[{4,2,3,6,5,1}]<br />
طيب سؤال قبل ما نختم الموضوع الدسم ده . هل لازم أكتب كل الأعمدة الموجودة؟ الإجابة : كلا البتة .. ممكن تختار أعمدة معينه فقط ، يعني الكود مرن في نهاية المطاف
** آخر جزئية وهي وضع المصفوفة الجديدة في أي مكان نريده ، وهنفترض إننا عايزين البيانات توضع في الخلية J1 كبداية .. فالسطر هيكون بالشكل ده
CODE
Range("J1").Resize(UBound(a, 1), UBound(a, 2)).Value = a
بنحدد خلية البداية وبعدها بنستخدم كلمة Resize عشان نحدد أبعاد النطاق الجديد اللي هتوضع فيه البيانات ، وكلمة Resize يليها عدد الصفوف ، وعدد الأعمدة ..
عدد الصفوف هيكون نفس عدد صفوف المصفوفة ودا الجزء المسئول عنه
CODE
UBound(a, 1)<br />
عدد الأعمدة هيكون نفس عدد أعمدة المصفوفة ودا الجزء المسئول عنه
CODE
UBound(a, 2)<br />
وبعد ما حددنا أبعاد النطاق اللي هتوضع فيه النتائج بنستخدم الخاصية Value ونقول إنها هتساوي المصفوفة a ...
أرجو أن أكون وفقت في شرح الكود ، وأن تكونوا قد استوعبتم الدرس جيداً
وأخيراً إليكم الكود بالشكل الكامل له
CODE
Sub Reorder_Columns_Using_Arrays()
Dim a As Variant
Dim r As Range
Set r = Sheets("Sheet1").Range("A1:F" & Cells(Rows.Count, 1).End(xlUp).Row)
a = Application.Index(r.Value, Evaluate("ROW(1:" & r.Rows.Count & ")"), [{4,2,3,6,5,1}])
Range("J1").Resize(UBound(a, 1), UBound(a, 2)).Value = a
End Sub
حمل الملف المرفق من هنا
كان معكم أخوكم في الله /
ياسر خليل أبو البراء
والسلام عليكم ورحمة الله وبركاته