כיצד נבחר את האירועים שיפעילו את המאקרו?
במאמר הקודם למדנו כיצד להוסיף מאקרו אירוע (Event Macro) מסוג Worksheet_Change.
במאמר הזה אציג דוגמאות לבחירת הטווחים שיפעילו את האירוע:
כיצד להריץ מאקרו, אם השינוי נעשה בעמודה A:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Debug.Print Target
End If
End Sub
הסבר: מספרה של עמודה A הוא 1 ולכן אנחנו בודקים האם העמודה של ה TARGET, כלומר, העמודה של התא שהפעיל את השינוי, היא 1
הרצת מאקרו אם השינוי נעשה באחת משלוש העמודות הראשונות:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column < 4 Then Debug.Print Target End If End Sub
הסבר: אנו מבקשים לבדוק האם השינוי נעשה באחת משלוש העמודות הראשונות (A:C) ולכן נבדוק אם מספר העמודה של התא שהפעיל את האירוע, קטנה מ-4
הרצת מאקרו אם השינוי נעשה בשורה מספר 4:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 4 Then Debug.Print Target End If End Sub
הרצת מאקרו אם השינוי נעשה בתא שניתן לו השם MyCell
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Name.Name = "MyCell" Then Debug.Print Target End If End Sub
אבל כאן צריך הסבר קצר:
שימו לב לפקודה המשונה Target.Name.Name
מדוע צריך לחזור על Name?
התשובה לכך היא שהמופע הראשון של Name מתייחס לכתובת התא, ואילו המופע השני לשם שניתן לו, כפי שתוכלו לראות בחלונית Watches:
ולמה הוספתי את הפקודה
On Error Resume Next
משום שאם לתא אין שם, תתקבל שגיאה, והקוד יפסיק את ריצתו, ולכן עלינו לומר לקוד שגם אם לתא אין שם, יש להמשיך את ריצת הקוד.
כיצד נריץ קוד רק אם כתובת התא שהפעילה אותו נמצאת בתוך טווח מסוים?
לעתים אנו רוצים להריץ קוד רק אם נעשה שינוי בטבלת נתונים מסוימת.
נניח שטבלת הנתונים שלנו נמצאת בטווח B2:F8
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Intersect(Target, Range("B2:F8")) Then Debug.Print Target End If End Sub
כלומר – אנחנו בודקים אם התא שבו כתבנו את הערך, מצטלב (Intersect) עם הטבלה, ובעברית – האם הוא נמצא בתוך הטבלה או מחוצה לה