לולאות מאפשרות לחזור על אותו רצף של פקודות מספר פעמים. ישנם שני סוגים של לולאות:
- For Loops – חזרה על רצף פקודות מספר מוגדר של פעמים:
- For-Next – מספר החזרות נקבע מראש וניתן לקבוע גם את האינטרוולים בין החזרות.
- For-Each – לולאות המבוצעות על Collections (ר' עמ' 62). מספר החזרות תלוי במספר האובייקטים באוסף.
- Do Loops – חזרה על רצף פקודות כל עוד מתקיים תנאי מסוים, כלומר, מספר פעמים לא ידוע מראש:
- Do-While – לולאה שתמשיך לרוץ ולבצע חזרות כל עוד תנאי מוגדר מתקיים ותפסיק כאשר הוא לא יתקיים.
- Do-Until – לולאה שתמשיך לרוץ ולבצע חזרות כל עוד תנאי מוגדר לא מתקיים ותפסיק כאשר הוא יתקיים.
לעיתים קרובות ניתן להשתמש בסוגים שונים של לולאות כדי להגיע לאותה תוצאה רצויה. להלן אופן השימוש בסוגי הלולאות והיתרונות שלהם על פני הסוגים האחרים.
לולאת For-Next
לולאה זו משמשת כאשר צריך להגדיר את כמות החזרות על רצף פקודות נתון. לצורך זה יש להשתמש במשתנה, שמהווה מונה למספר הריצות באופן התחבירי הבא:
For RunsCounter = {Start Number} To {End Number}
Command
Command
Command
Next RunsCounter
RunsCounter – דוגמה למשתנה שסופר את הריצות, עבורו יש להגדיר את המספרים ביניהם ירוץ הקוד (Start Number ו-End Number).
הדוגמה הבאה מציגה לולאה המוגדרת לחזור חמש פעמים:
תוצאת ריצת הקוד בגיליון:
הדוגמה הבאה מציגה קוד אשר בונה בגיליון את לוח הכפל עד 5, באמצעות לולאת For–Next:
תוצאת ריצת הקוד בגיליון:
היתרון העיקרי של לולאת For–Next על פני לולאות אחרות הוא בגמישות ההגדרה שלה, עבור מצבים מסוימים. באמצעות לולאה זו בלבד ניתן להגדיר את האינטרוולים של קפיצות המונה. עד כה נידונה התקדמות של המונה בצעד אחד בכל חזרה. באמצעות הפקודה Step ניתן להגדיר את גודל האינטרוול בין מספר למספר של המונה.
הדוגמה הבאה מציגה לולאה של מונה הצועד מ-1 ועד 20 בקפיצות של 2:
תוצאת ריצת הקוד בגיליון:
הפקודה Offset בדוגמה זו תלויה במונה, המוגדר כמספר השורה. כדי שהקפיצה לא תשפיע על המעבר בין התאים לאורך העמודה, להלן הקוד הבא:
תוצאת ריצת הקוד בגיליון:
ניתן להריץ את המונה גם לאחור. הדוגמה הבאה מציגה לולאה של מונה הצועד מ-50 ועד 1 בקפיצות של 3:
תוצאת ריצת הקוד בגיליון:
לולאת For-Each
כאמור, גם לולאת For–Each מבצעת מספר מוגדר של חזרות, אך ההגדרה הזו היא לא מספרית, אלא נובעת מכמות האובייקטים או הפריטים ב- Collection(ר' עמ' 62). כלומר, לולאת For–Each רצה על כל האובייקטים או הפריטים באוסף ומבצעת פעולות עבור כל אחד מהם. כזכור, האובייקטים או הפריטים באוסף מסודרים ברצף כרונולוגי, בהתאם לסדר זה תרוץ הלולאה על האוסף.
להלן המבנה התחבירי של הלולאה:
For Each {Object} in {Collection}
Command
Command
Command
Next
הדוגמה הבאה מציגה את יצירת לוח הכפל, הפעם באמצעות For–Each במקום For–Next (כפי שבוצע בסעיף הקודם):
- ניתן לראות כי האוסף עליו רצה הלולאה היא של Range בין התאים A1:E5.
- TA– משתנה עזר שמציין את האובייקט הנוכחי (תא בטווח שבין A1:A5) בו נמצאת הלולאה בכל חזרה.
- הפקודה המתבצעת בכל חזרה, היא הזנה לתוך ערך התא הנוכחי את המכפלה של מספר השורה ומספר העמודה של אותו התא:
- Row – מאפיין השייך לאובייקט מסוג Cell (תא) המציין את מספר השורה.
- Column – מאפיין השייך לאובייקט מסוג Cell (תא) המציין את מספר העמודה.
תוצאת ריצת הקוד בגיליון:
באמצעות היכולת לרוץ על כל האובייקטים באוסף נוכל לבצע מספר פעולות חשובות באופן מהיר, קצר ויעיל. למשל: מילוי מהיר ואוטומטי של פריטים בתוך אוסף, יצירת רשימת מאפיינים מותאמת אישית עבור כל אובייקט מותאם אישית (ר' עמ' 65), ריצה על טווח נתונים במסד נתונים גדול ולבדוק כל תא ו/או לשנות את המאפיינים שלו בריצה אוטומטית ומהירה.
היתרונות העיקריים של לולאת For–Each על פני לולאות אחרות:
- For–Each מתאימה לריצה על אובייקטים.
- זמן הריצה של הקוד קצר בהרבה מאשר לולאת For–Next.
הדוגמא הבאה מציגה יצירת אוסף פריטים חדש על בסיס רשימה שקיימת בגיליון. להלן רשימת הפריטים בגיליון:
להלן הקוד ליצירת האוסף:
- ניתן להבחין בשורת הקוד Set {Collection} = Nothing. פקודה זו מנקה אוסף מכל הפריטים שבו.
- רשימת הפריטים בגיליון היא אוסף הנמצא בטווח תאים. עבור כל אובייקט באוסף Range שבין תא A1 בגיליון ועד התא האחרון ברשימה, הוא Range("A1").End(xlDown), מתבצעות חזרות הלולאה.
- VegItem– משתנה עזר שמציין את האובייקט הנוכחי בו נמצאת הלולאה בכל חזרה.
- בכל חזרה נכנס הערך שבתוך התא כפריט חדש לתוך אוסף אחר הוא VeggieColl.
להלן תצוגת חלונית Locals לאחר ריצת הקוד:
לולאות Do-Loop
באמצעות לולאות Do-Loop ניתן לחזור על קטע קוד ביחס להתקיימות תנאי מסוים, כאשר אין לנו מספר חזרות מוגדר. בלולאת Do-While החזרות ממשיכות כל התנאי מתקיים ובלולאת Do-Until החזרות ממשיכות עד לרגע שהתנאי מתקיים.
להלן המבנה התחבירי של הלולאות:
Do While {Condition} Do Until {Condition}
Command Command
Command Command
Command Command
Loop Loop
הדוגמה הבאה מציגה טבלה של מוצרים (מק"ט, שם ומחיר), שיש להוזיל ב-2%:
להלן הקוד עם לולאת Do–While שעוברת בכל תא בטבלה שיש בו מחיר ומוזילה אותו ב-2% (לכדי 0.98 מתוך המחיר):
ניתן לראות כי התנאי של ריצת הלולאה הוא כל עוד ערך התא הפעיל הנוכחי אינו ריק. בכל חזרה התא הפעיל הופך להיות התא בשורה הבאה ברשימה. אם תא זה יהיה ריק, הלולאה תעצור.
תוצאת ריצת הקוד בגיליון:
הדוגמה הבאה מציגה את הקוד עבור אותה הפעולה עם לולאת Do–Until:
ניתן לראות כי ההבדל בתנאי הוא באופרטור: במקום כל עוד (While) ערך התא הפעיל שונה מריק (" "), התנאי הוא עד ((Until שערך התא הפעיל שווה לריק.
הדוגמה הבאה מציגה ציונים של סטודנטים במבחן, שנבחנו במועדים A ו-B:
להלן קוד להוספת 7 נקודות לציוני כל הסטודנטים שנבחנו במועד A בלבד:
תוצאת ריצת הקוד בגיליון: