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

نقضي الكثير من الوقت في تكرار المهام البسيطة في إكسل، ;قد تكون هذه المهام، مثل: تنسيق نطاقات متعددة، وإخفاء أوراق متعددة، والنسخ واللصق في العديد من المصنفات، وتطبيق عوامل التصفية على جداول متعددة. وقد تكون هذه المهام مضيعةً للوقت ومملةً للغاية، لكن لحسن الحظ يمكننا استخدام الحلقات في وحدات ماكرو VBA، لتكرار الإجراءات بسرعة كبيرة، بحيث يمكن إكمال المهام التي قد تستغرق ساعات لإنجازها يدويًا في غضون ثوانٍ باستخدام حلقة تكرارية.

الحلقة التكرارية For Next Loop

تعمل على تكرار التعليمات وفقًا لشرط نُسنده لمُتغيّر اختياري وتكون قيمة الفحص مناسبةً لعدد مرات التكرار التي نريد تنفيذها.

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

For variable = Start To End 
Code
Next Element

حيث أن:

  • variable: تمثل المُتغيّر الذي سيُحدد عدد مرّات تكرار الحلقة عن طريق قيمة البداية والنهاية له.
  • Start: تمثل قيمة البداية للمُتغيّر.
  • End: تمثل قيمة النهاية للمُتغيّر.
  • Code: التعليمات التي سنُنفذ عليها التكرار.
  • Next Element: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على العنصر التالي بإضافة 1 للمُتغيّر.

مثال

لتكن لدينا مثلًا البيانات التالية، بحيث نريد تغيير التنسيق للنصوص في الخلايا إلى خط غامق باستخدام إجراء يعمل على ذلك.

001For.PNG

نكتب الإجراء بالصيغة التالية:

Sub test1()
Dim counter As Integer
For counter = 1 To 10
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
Next counter

End Sub

002For.gif

اقتباس

يجب الانتباه إلى حالة الأحرف في الخاصية 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: تُعيد هذه التعليمة الحلقة للبداية لتطبيقها على الكائن التالي.
اقتباس

ملاحظة مهمة: لا يتعرف المحرِّر في هذه الحلقة على الكائن في بعض الأحيان، ولتفادي هذا الأمر نُعرف الكائن في بداية الشيفرة على أنه مُتغيّر، ويكون نوعه هذا الكائن وبذلك تعمل الشيفرة بدون أخطاء.

مثال

ليكن لدينا ملف العمل التالي الذي يحتوي على مجموعة من الصفحات المخفية.

003ForEach.PNG

إظهار هذه الصفحات يدويًا سيستغرق بعض الوقت، ولكن يمكننا كتابة إجراء بسيط يحوي حلقةً تكراريةً تعمل على تغيير الخاصية visible لكل صفحة إلى القيمة xlSheetVisible والتي تجعل الصفحة ظاهرة، ويكون الإجراء بالصيغة التالية:

Sub test2()

Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws

End Sub

004ForEach.gif

آلية عمل الحلقة

عرّفنا المُتغيّر 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

005DoLoop.gif

آلية عمل الحلقة

تفحص الحلقة الشرط أولًا، وفي حال تحقُّقه تُنفّذ التعليمة على الخلية المُفعّلة عن طريق العنصر Interior للتحكم بخلفية الخلية عن طريق الخاصية color، وإعطاءه القيمة vbRed التي تُمثِّل اللون الأحمر، ثم التعليمة ActiveCell.Offset(0,1) Select التي تعمل على الانتقال إلى الخلية التالية وتنشيطها، بعدها التعليمة Loop التي تُعيد الحلقة للبداية لتكرار العمليات على الخلية التي أصبحت نشطةً، وهكذا إلى أن يصل الشرط إلى خلية فارغة، عندها تتوقف الحلقة.

أشكال أخرى لكتابة الحلقة السابقة

يمكن كتابة الحلقة بالصيغة التالية:

Do while Condition
Code
Loop

تعمل هذه الصيغة بنفس آلية الصيغة السابقة، ولكن في السابقة كان الأمر هو تنفيذ التكرار حتى يتحقّق الشرط، بينما هنا تعمل على تنفيذ التكرار طالما الشرط محقّق.

ولدينا صيغة أُخرى تعمل بنفس الآلية وهي:

Do 
Code
Loop while Condition

تختلف هذه الصيغة عن سابقاتها بأنها ستُنفّذ العمليات داخل الحلقة ثم تتحقّق من الشرط، أي أنّ العمليات هنا ستُنفذ لمرّة واحدة على الأقل، بينما في السابقات يمكن ألّا تُنفّذ العمليات ضمن الحلقة ولا مرّة.

خاتمة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...