התקשרו אלינו: 052-2928949
ימים א'-ה' בין השעות 9:00-17:00

התקשרו אלינו: 052-2928949 א-ה 9:00-17:00

לולאת For Each

VBA Tip

לולאת For Each

VBA Tip

לולאת For Each

במאמר שעוסק בלולאת FOR למדנו כיצד להגדיר ללולאה ערך התחלה וערך סיום.
לולאת For Each היא לולאה שעובדת בדרך שונה –
היא מאפשרת ביצוע פעולות על אוספים (Collections), אשר מאגדים בתוכם אובייקטים מאותו הסוג.
אוסף גיליונות (sheets), לדוגמה, מאגד בתוכו את כל הגיליונות,
אוסף גרפים (ChartObjects) מאגד בתוכו את כל הגרפים, טווחים מאגדים בתוכם תאים וכד'.

להלן מספר דוגמאות לפריטים באוסף:

  • תאים בטווח
  • גיליונות בקובץ
  • גרף בודד מתוך כל הגרפים בקובץ
  • צורה בודדת מתוך כל הצורות הקיימות בגיליון

 

תחביר:

For each object in collection
      פקודות לביצוע
Next

 

מה שחשוב להבין הוא שאקסל מזהה את האוסף (גיליונות, גרפים, טווח), ומבין מהו האובייקט שעליו צריך לעבוד (גיליון בודד, גרף בודד, תא).
אנחנו מציינים את האובייקט באמצעות משתנה (כדאי לתת למשתנה שם רלוונטי, שיסביר את מהותו כמובן).

ובואו נראה מספר דוגמאות לשימוש בלולאת For Each:

נניח שאנחנו מעוניינים לכתוב בתא A1 בכל אחד מגיליונות הקובץ את שם הגיליון, נוכל לעבור בלולאת For Next במבנה הבא:

 

For i = 1 To Sheets.Count
    Sheets(i).Range("a1") = Sheets(i).Name
Next

כלומר – המשתנה I רץ בלולאה מ-1 ועד מספר הגיליונות הקיים בקובץ (Sheets.Count),
ומשתמש במספר האינדקס הזה כדי לפנות לגיליון הרלוונטי.

ואיך עושים זאת באמצעות לולאת For Each?

 

For Each SH In Sheets
     SH.Range("a1").Value = SH.Name
Next

 

דוגמה ליצירת לוח הכפל באמצעות לולאת For-Each:

 

For Each CL In Range("a1:j10")
    CL.Value = CL.Row * CL.Column
Next

הסבר:

האוסף שאנחנו פונים אליו מצויין על ידי הטווח Range("a1:j10"), ומכאן האקסל מסיק שהאובייקט, שמצויין על ידי שם המשתנה CL הוא תא בודד,

ובמילים אחרות – עורך ה-VBA "יודע" כי האובייקטים המרכיבים את האוסף "טווח" הם אובייקטים מסוג תא,
לפיכך הוא "מבין" כי המשתנה CL מציין "תא".

מכאן נובע כי עבור האובייקטים של האוסף, ניתן להשתמש בכל שם שהוא (בתנאי שהשם אינו שמור, ורצוי שיהיה משמעותי), לצורך ייצוגם.

המאקרו עובר על כל אחד מהתאים שבטווח ומכפיל את מספר השורה של התא  (CL.Row ) במספר העמודה (CL.Column).

קל לראות שהשימוש  בלולאת For Each קצר יותר וקריא יותר מהקוד ליצירת לוח הכפל, באמצעות לולאת For next רגילה:

 

For i = 1 To 10
     For j = 1 To 10
          Cells(i, j) = i * j
     Next
Next

בדוגמה הבאה נתנו לאובייקט המרכיב את האוסף sheets (גיליונות) את השם SH (כמייצג גיליון בודד).

For Each SH In Sheets
     SH.Tab.ColorIndex = 40
Next

לפיכך, המאקרו שלעיל עובר על כל הגיליונות וצובע את הלשוניות בחוברת העבודה בצבע ורוד.
שימו לב הפקודה לא בוחרת את הגיליונות, אלא רק פונה אליהם!

ודוגמה נוספת – הפיכת כל הגליונות לגלויים:

For Each SH In Sheets
    SH.Visible = True
Next

ולסיום, דוגמה ללולאה בתוך לולאה, שעוברת על כל הגיליונות באוסף הגיליונות, ומוחקת את כל הצורות, תוך התייחסות לאוסף הצורות:

For Each SH In Sheets
     For Each shp In SH.Shapes
           shp.Delete
     Next shp
Next SH

כפי שראיתם, ישנם מקרים בהם ניתן לבחור בין לולאת For-Next לבין לולאת For-Each לביצוע אותן הפעולות.

השימוש בלולאת For Each יהיה בדרך כלל אלגנטי וקצר יותר.

 

דילוג לתוכן