نقضي الكثير من الوقت في تكرار المهام البسيطة في إكسل، ;قد تكون هذه المهام، مثل: تنسيق نطاقات متعددة، وإخفاء أوراق متعددة، والنسخ واللصق في العديد من المصنفات، وتطبيق عوامل التصفية على جداول متعددة. وقد تكون هذه المهام مضيعةً للوقت ومملةً للغاية، لكن لحسن الحظ يمكننا استخدام الحلقات في وحدات ماكرو VBA، لتكرار الإجراءات بسرعة كبيرة، بحيث يمكن إكمال المهام التي قد تستغرق ساعات لإنجازها يدويًا في غضون ثوانٍ باستخدام حلقة تكرارية.
الحلقة التكرارية For Next Loop
تعمل على تكرار التعليمات وفقًا لشرط نُسنده لمُتغيّر اختياري وتكون قيمة الفحص مناسبةً لعدد مرات التكرار التي نريد تنفيذها.
الشكل العام لصيغة الحلقة
For variable = Start To End Code Next Element
حيث أن:
- variable: تمثل المُتغيّر الذي سيُحدد عدد مرّات تكرار الحلقة عن طريق قيمة البداية والنهاية له.
- Start: تمثل قيمة البداية للمُتغيّر.
- End: تمثل قيمة النهاية للمُتغيّر.
- Code: التعليمات التي سنُنفذ عليها التكرار.
- Next Element: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على العنصر التالي بإضافة 1 للمُتغيّر.
مثال
لتكن لدينا مثلًا البيانات التالية، بحيث نريد تغيير التنسيق للنصوص في الخلايا إلى خط غامق باستخدام إجراء يعمل على ذلك.
نكتب الإجراء بالصيغة التالية:
Sub test1() Dim counter As Integer For counter = 1 To 10 ActiveCell.Font.Bold = True ActiveCell.Offset(1, 0).Select Next counter End Sub
اقتباسيجب الانتباه إلى حالة الأحرف في الخاصية
property
حيث يجب أن تكون كما هي مُعرفة في لغة الفيجوال بيسك Visual Basic.
آلية عمل الحلقة
بعد أن عرّفنا المُتغيّر وأُسندت له قيمة البداية والنهاية في الحلقة، فستعمل التعليمة ActiveCell.Font.Bold = true
على تغيير تنسيق الخط من العادي إلى الغامق، حيث ActiveCell
هو عنصر الخلية المفعّلة (مكان توضّع المؤشر)، والعنصر Font
هو خط الخلية، أمّا الخاصية Bold
فتأخذ قيمتين true
للخط الغامق وFalse
للخط العادي، وهي القيمة الافتراضية لتنسيق الخط. بعدها ننتقل إلى التعليمة التالية، بحيث تعمل التعليمة (Offset(value1,value2
بالانتقال إلى خلية نُحدّدها عبر نطاق التعليمة، إذ تُمثِّل الوسيطة value1
مقدار الانتقال على العمود بدايةً من الخلية الحالية، أما الوسيطة value2
فتمثّل مقدار الانتقال على الصف بدايةً من الخلية الحالية.
نريد الانتقال في مثالنا لخلية واحدة فقط للأسفل على العمود، فيكون المجال لدينا (Offset(1,0
، أما الأمر Select
فيجعل الخلية مفعّلة (نشطة). بعدها ننتقل إلى التعليمة Next counter
، حيث تنقل المُتغيّر إلى القيمة التالية وتكرر العملية إلى أن تصل لقيمة النهاية المُحددة للمُتغيّر.
أشكال أخرى لكتابة الحلقة السابقة
يمكن كتابة الحلقة بالشكل العكسي لمجال المُتغيّر.
For variable = End To Start
كما يمكننا التحكم بمقدار الزيادة في قيمة المُتغيّر للدورة التالية.
For variable = End To Start Step value
هنا لو كانت قيمة البداية 1 وقيمة النهاية 10 مثلًا وأردنا أن تكون خطوات الزيادة للمُتغيّر هي خطوتين في كل دورة، فستُنفذ الحلقة السابقة 5 عمليات تكرار فقط.
الحلقة التكرارية For Each Next Loop
تُعَد من أقوى تقنيّات الماكرو، وهذا النوع هو الأكثر شيوعًا من الحلقات، حيث تسمح لنا حلقة For Next Loop بالمرور عبر مجموعة من العناصر في إكسل وتكرار بعض العمليات عليها. وقد تتضمن مجموعات العناصر ما يلي:
- خلايا في نطاق.
- أوراق العمل في مصنف.
- المصنفات على الحاسوب.
- الجداول المحورية في ورقة العمل.
- الحقول المحورية في جدول محوري.
- الأشكال الموجودة في ورقة العمل، وأي كائن آخر تتفاعل معه في إكسل.
تتمثل مهمة For Next Loop
في تنفيذ نفس الإجراءات (سطور التعليمات البرمجية) على كل عنصر في المجموعة.
الشكل العام للحلقة
For Each Object In collection Code Next Object
حيث أن:
- Object: تمثل الكائن الذي سننفذ الحلقة عليه.
-
collection: تمثل مجموعة الكائنات التي تمثل الكائن
Object
. - Code: مجموعة التعليمات التي سيكررها الإجراء.
- Next Object: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على الكائن التالي.
اقتباسملاحظة مهمة: لا يتعرف المحرِّر في هذه الحلقة على الكائن في بعض الأحيان، ولتفادي هذا الأمر نُعرف الكائن في بداية الشيفرة على أنه مُتغيّر، ويكون نوعه هذا الكائن وبذلك تعمل الشيفرة بدون أخطاء.
مثال
ليكن لدينا ملف العمل التالي الذي يحتوي على مجموعة من الصفحات المخفية.
إظهار هذه الصفحات يدويًا سيستغرق بعض الوقت، ولكن يمكننا كتابة إجراء بسيط يحوي حلقةً تكراريةً تعمل على تغيير الخاصية visible
لكل صفحة إلى القيمة xlSheetVisible
والتي تجعل الصفحة ظاهرة، ويكون الإجراء بالصيغة التالية:
Sub test2() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.Visible = xlSheetVisible Next ws End Sub
آلية عمل الحلقة
عرّفنا المُتغيّر ws
على أنه عنصر صفحة، ثم وضعناه في الحلقة التكرارية على أنه عنصر المجموعة.
التعليمة ActiveWorkbook.Worksheets
تُحدد مجموعة عناصر صفحات الملف الحالي الذي نعمل عليه لأننا نريد تكرار العملية على جميع أوراق العمل في ActiveWorkbook
. يُحدد المُتغيّر ws
العنصر الأول من المجموعة، بحيث تعمل تعليمة الحلقة التكرارية بالمرور على صفحات الملف واحدة تلو الأخرى، وتُستبدَل الخاصية xlSheetHidden
بالخاصية xlSheetVisible
، إذ أن التعليمة Next
تعمل على نقل العملية إلى العنصر الثاني بالمجموعة، ثم الثالث، وهكذا إلى الوصول لآخر عنصر(صفحة) في المجموعة، وعندها يتوقف التكرار الحلقي ويستمر الماكرو إلى السطر التالي من التعليمات البرمجية وهو إنهاء الإجراء End sub
.
الترتيب الذي تعمل به كل حلقة
تبدأ الحلقة For each
دائمًا عند العنصر الأول في المجموعة ويتكرر حتى العنصر الأخير بالترتيب الذي يظهر به في إكسل، حيث يعتمد هذا على رقم فهرس العناصر في المجموعة، وفيما يلي بعض الأمثلة على الترتيب الذي تعمل به الحلقة للعناصر الشائعة:
- المصنفات: يبدأ في المصنف الذي فُتح أولًا، وتعمل الحلقات على المصنفات بالترتيب الذي فُتحت فيه، بحيث يتعيّن رقم فهرس للمصنفات عند فتحها.
- أوراق العمل: تبدأ من علامة تبويب الورقة الأولى في المصنف، وتتكرر إلى الأخيرة بالترتيب الذي تظهر به علامات التبويب في المصنف.
- الخلايا: تبدأ الحلقات من اليمين إلى اليسار (وبالعكس في النسخ الإنكليزية) ثم إلى الأسفل، أي يبدأ في الخلية الأولى في النطاق ويتكرر إلى العمود التالي في نفس الصف، ثم ينتقل إلى الصف التالي.
- الجداول والجداول المحورية: تبدأ بالعنصر الذي أُنشئ أولًا وتعمل الحلقات على عناصر الورقة بترتيب إنشاءها. ينطبق هذا المبدأ نفسه على العناصر الأُخرى التي نُنشئها في أوراق العمل، مثل: الأشكال، والمخططات، وما إلى ذلك.
الحلقة التكرارية Do Loop
تعمل هذه الحلقة على تكرار العمليات في الشيفرة اعتمادًا على شرط نضعه في صيغة الحلقة.
الصيغة العامة للحلقة
Do until Condition Code Loop
حيث أن:
+Condition: تمثِّل شرط تكرار التعليمات في الحلقة.
- Code: مجموعة التعليمات التي سيكررها الإجراء.
- Loop: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على العنصر التالي.
مثال
لتكن لدينا البيانات السابقة ونريد إعطاء خلفية بلون أحمر للخلايا غير الفارغة، ولإنجاز ذلك نكتب الحلقة التكرارية التالية:
Sub test3() Do Until ActiveCell.Value = "" ActiveCell.Interior.Color = vbRed ActiveCell.Offset(0,1).Select Loop End Sub
آلية عمل الحلقة
تفحص الحلقة الشرط أولًا، وفي حال تحقُّقه تُنفّذ التعليمة على الخلية المُفعّلة عن طريق العنصر Interior
للتحكم بخلفية الخلية عن طريق الخاصية color
، وإعطاءه القيمة vbRed
التي تُمثِّل اللون الأحمر، ثم التعليمة ActiveCell.Offset(0,1) Select
التي تعمل على الانتقال إلى الخلية التالية وتنشيطها، بعدها التعليمة Loop
التي تُعيد الحلقة للبداية لتكرار العمليات على الخلية التي أصبحت نشطةً، وهكذا إلى أن يصل الشرط إلى خلية فارغة، عندها تتوقف الحلقة.
أشكال أخرى لكتابة الحلقة السابقة
يمكن كتابة الحلقة بالصيغة التالية:
Do while Condition Code Loop
تعمل هذه الصيغة بنفس آلية الصيغة السابقة، ولكن في السابقة كان الأمر هو تنفيذ التكرار حتى يتحقّق الشرط، بينما هنا تعمل على تنفيذ التكرار طالما الشرط محقّق.
ولدينا صيغة أُخرى تعمل بنفس الآلية وهي:
Do Code Loop while Condition
تختلف هذه الصيغة عن سابقاتها بأنها ستُنفّذ العمليات داخل الحلقة ثم تتحقّق من الشرط، أي أنّ العمليات هنا ستُنفذ لمرّة واحدة على الأقل، بينما في السابقات يمكن ألّا تُنفّذ العمليات ضمن الحلقة ولا مرّة.
خاتمة
نلاحظ أن العمليات الروتينية التي نُجريها على إكسل لا تُعَد ولا تُحصى، وأنّه بالتطبيق السليم لأفكار الحلقات التكرارية سنتخلص من الروتين الممل، ونوفر الوقت، ونضبط عملياتنا أكثر من الطريقة اليدوية، وكل ما علينا هو دراسة المهمة التي نكرّرها دائمًا ومعرفة عناصرها وخصائصها، وتصميم إجراء يحتوي على إحدى صيغ الحلقات التكرارية بما يتناسب مع تلك العملية، ووضع التعليمات المناسبة لتنفيذ تلك العملية داخل الحلقة التكرارية لِتُنفذها عوضًا عنّا وذلك خلال وقت قياسي.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.