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

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

מאקרו אירוע ששומר את הערך הקודם שהיה בתא

VBA Tip

מאקרו אירוע ששומר את הערך הקודם שהיה בתא

VBA Tip

מאקרו אירוע לשמירת הערך הקודם

מאמר נוסף בסדרת המאמרים על מאקרו אירוע, והפעם – איך שומרים את הערך הקודם שבתא?
לצורך הדוגמה, המשתמש צריך להזין בתא A1 נתון שמוגבל לערכים שבין 20 ל-30.
אם המידע אינו עומד בקריטריונים, ימחק הערך שכתב, ויוחזר הערך הקודם.

אז ראשית נכתוב את הקוד לבדיקת המידע.
מכיוון שמדובר בהזנת ערך, נבחר במאקרו אירוע מסוג Worksheet_Change שניצת ברגע שנעשה שינוי בגיליון:

אני מזכירה לכם שכדי להתייחס לתא שבו התרחש האירוע,
לא נשתמש ב ActiveCell, שהוא התא הנוכחי, אלא ב Target שהוא התא שהצית את האירוע.

מה ההבדל בין ActiveCell ל-Target ?

נניח שאנחנו כותבים בתא A1 ערך כלשהו ולוחצים על אנטר בסיום ההזנה.
התא שאמור להצית את האירוע הוא A1, והוא זה שנשמר ב Target,
התא הפעיל הוא A2, משום שלחצנו על Enter בסיום ההזנה, והוא זה שנשמר ב ActiveCell.

ונחזור להמשך הקוד:
אני מעוניינת להגביל את הערכים המוזנים לתא A1 למספרים שבין 20 ל-30.
כאן חשוב להבין שמאקרו אירוע מסוג Change יוצת תמיד כשיהיה שינוי בתא,
ולכן עלינו לבדוק בתחילת הקוד האם מדובר בתא שאותו אנחנו רוצים לבדוק.

If Target.Address = Range("a1").Address Then
End If

ואפשר לכתוב את הפקודה הזאת גם כך:

If Target.Address = "$A$1" Then 
End If

טיפ קטן לקבלת כתובת התא, ללא סימני ה-$:

If Target.Address(False, False) = "A1" Then
End if

עכשיו נוסיף את התנאי

If Target.Address = "$A$1" Then
   If Target < 20 Or Target > 30 Then
      Application.EnableEvents = False
      Target = ""
      Application.EnableEvents = True
   End If
End If

אז מה יש לנו פה?

ערכתי בדיקה האם הערך קטן מ-20 או גדול מ-30 (אלה המקרים שבהם צריך להחזיר את הערך הקודם שהיה בתא).
אם התנאי מתקיים, אני מבקשת למחוק את הערך שקיים ב Target.
אז מה משמעות הפקודה Application.EnableEvents?
מכיוון שמדובר במאקרו אירוע מסוג Change, שמופעל עם שינוי הערך בתא,
אז כאשר נשנה את הערך שהמשתמש הקליד לערך אחר (במקרה שלנו – נשנה את הערך שבתא ל'ריק'),
המאקרו יופעל שוב, כי הערך השתנה, ואנו עלולים להכנס ללולאה אינסופית שבה כל שינוי של התא מצית מחדש את האירוע.
לכן, לפני שאני משנה את ערך התא בקוד, אני מבקשת לכבות את המנגנון שמפעיל את האירועים.
כעת, כאשר אשנה את הערך שבתא, הוא לא יצית שוב את האירוע Change.
לאחר סיום הפעולה, אדליק את המנגנון חזרה, כך שהוא יפעל בפעם הבאה שאזין ערך לתא.

אבל רגע אחד…

לא אמרנו שבמקרה שבו המשתמש הזין ערך שלא נמצא בטווח שקבענו, נרצה להחזיר את הערך הקודם?
אז כדי לעשות את זה, אנחנו צריכים לשמור את הערך הזה במקום כלשהו.
הבעיה היא שאי אפשר לשמור אותו בקוד של האירוע Change, מכיוון שהוא מופעל אחרי שכבר הזנו את הערך החדש והערך הקודם לא קיים יותר.

אז מה הפתרון?

נוסיף אירוע מסוג SelectionChange, שמופעל בכל פעם שאנחנו בוחרים תא כלשהו, ונשמור את הערך בתוך משתנה.
אבל זה לא מספיק, כי כדי שהערך ישמר ביציאה מהקוד, עלינו להכריז עליו כ Public, אשר מוכר בכל המודול.
אז בעצם יש לנו כאן שני מאקרו אירוע שמופעלים: האחד אירוע בעת בחירה, ששומר לתוך משתנה את הערך הנוכחי,
והשני, מאקרו אירוע לאחר שינוי, שבודק האם הערך עומד בכללים שקבענו, ואם לא – מחזיר לתא את הערך הקודם,
שאותו שמרנו במאקרו אירוע בעת בחירה.

והנה הקוד המלא:

Public Tmp

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then

   If Target < 20 Or Target > 30 Then

      Application.EnableEvents = False

      Target = Tmp

      Application.EnableEvents = True

   End If

End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Tmp = Target

End Sub

 

אז מה היה לנו פה?

1. כתיבת מאקרו אירוע מסוג Change שבודק אם הנתון שהוזן לתא עומד בתנאים
2. כתיבת מאקרו אירוע מסוג SelectionChange ששומר את הערך הקיים בתא בעת הכניסה אליו (כלומר – לפני השינוי)
3. הכרזה על המשתנה Tmp כ Public, כדי שיוכר בכל המודול

 

 

דילוג לתוכן