כיצד להשתמש במשתנים בהליכי משנה של Excel ב- Visual Basic for Applications

מבוא

מאמר זה מתאר כיצד להשתמש במשתנים בהליכי משנה של Microsoft Excel ב- Microsoft Visual Basic for Applications.

מידע נוסף

משתנים בהליך משנה

תכונה רבת-עוצמה של שפות תיכנות היא היכולת לאחסן משהו במשתנה כך שניתן יהיה להשתמש בתוכן המשתנה או לשנותו מאוחר יותר בהליך זה. מסמך זה דן בשימוש הבא במשתנים ב- Visual Basic:

  • כיצד הוכרזו משתנים.
  • ההליכים והפרוייקטים הניתנים לשימוש במשתנה.
  • משך החיים של משתנה.

הצהרה על משתנה במאקרו

הדרך הפשוטה ביותר להצהיר על משתנה במאקרו היא להשתמש במשפט Dim. השורה הבאה מצהירה על שני משתנים, כמספרים שלמים:

    Dim x As Integer, y As Integer

כאשר x ו- y מצוינים כמספרים שלמים, אתה אומר ל- Visual Basic לשמור די זיכרון עבור משתנה מספר שלם (2 בתים כל אחד עבור x ו- y) והמידע המאוחסן ב- x או ב- y הוא מספר שלם בין -32768 ל- 32767.

הערה: אם תצהיר על יותר ממשתנה אחד באמצעות משפט Dim יחיד, עליך לציין את סוג הנתונים עבור כל משתנה.

אם לא תציין את סוג הנתונים עבור כל משתנה, כמו בקוד Visual Basic הבא, רק המשתנה y מוגדר כמשתנה מספר שלם. המשתנה x יהיה סוג משתנה:

    Dim x, y As Integer

לקבלת מידע נוסף, ראה סוג הנתונים משתנה להלן.
 

כדי לבצע בדיקת משתנה, בצע את הפעולות הבאות:

  1. שמור וסגור חוברות עבודה פתוחות ולאחר מכן פתח חוברת עבודה חדשה.

  2. הפעל את עורך Visual Basic (הקש ALT+F11).

  3. בתפריט הוספה , לחץ על מודול.

  4. הקלד את הקוד הבא:

    Sub Variable_Test()
        מעומעם x כמספר שלם, y כמספר שלם
        x = 10
        y = 100
        MsgBox "הערך של x הוא " & x & _
        Chr(13) & "the value of y is " & y
    End Sub

  5. הפעל את Variable_Test המאקרו. אתה מקבל את ההודעה הבאה:

    the value of x is 10
    the value of y is 100

  6. לחץ על אישור.

  7. בשורה Variable_Test , שנה את השורה הבאה:

    x = 10

  8. אל:

    x = "error"

  9. הפעל את Variable_Test המאקרו.

תקבל שגיאת זמן ריצה מאחר ש- "error" אינו מספר שלם, ואתה מנסה להקצות ערך מחרוזת זה למשתנה המספר השלם x.
 

סיכום סוג נתונים

אלה הם סוגי הנתונים המשותפים של המשתנים:

סוגי נתונים משתנים נפוצים

סוג נתונים משתנה

אם לא תציין סוג נתונים בעת הצהרה על משתנה, או שלא תצהיר כלל על משתנה, Visual Basic יציין באופן אוטומטי את סוג הנתונים של המשתנה עבור משתנה זה. להלן היתרונות של משתנים שהוצהרת כסוג נתונים זה:

  • המשתנים יכולים להכיל ערכים מחרוזת, תאריך, שעה, ערכים בוליאניים או מספריים.
  • המשתנים יכולים להמיר את הערכים שהם מכילים באופן אוטומטי.

החסרונות הם שמשתנים משתנים דורשים לפחות 16 בתים של זיכרון. 16 בתים של זיכרון יכולים להיות משמעותיים בהליכים גדולים או במודולים מורכבים.

כדי לראות כיצד פעולה זו פועלת במאקרו Variable_Test, בצע את הפעולות הבאות:

שנה את הקוד במאקרו Variable_Test ל:


Sub Variable_Test()
    Dim x, y
    x = "string"
    y = 1.23
    MsgBox "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
End Sub

הפעל את Variable_Test המאקרו.

לא תקבל שגיאה מכיוון שניתן להקצות כל דבר למשתנה השונים x ו- y.

הערה: באפשרותך גם להשמיט את השורה הבאה, ופקודות המאקרו ימשיכו לפעול כאשר המשתנים x ו- y מטופלים כסוגי נתונים של משתנה:

    Dim x, y

טווח משתנה

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

טווח ברמת הפרוצדורה

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

כדי לוודא שמשתנה עם טווח ברמת הפרוצדורה אינו מוצג מחוץ לפרוצדורה שבה הוא מוצהר, בצע שלבים אלה:

  1. הוסף מודול חדש לפרוייקט שלך.

  2. הקלד את שתי פקודות המאקרו הבאות במודול זה:
      Sub Macro1() Dim x As Integer x = 10 MsgBox "x, כפי שנראה על-ידי Macro1 הוא " & x 'השורה הבאה מפעילה את Macro2 Macro2 End Sub Macro2() MsgBox "x, כפי שניתן לראות על-ידי Macro2 הוא " & x End Sub

  3. הפעל את Macro1, ות תקבל את ההודעה הבאה:

    x, as seen by Macro1 is 10

  4. לחץ על אישור, ותת קבל את ההודעה הבאה:

    x, as seen by Macro2 is

  5. לחץ על אישור.

Macro2 אינו מציג ערך עבור המשתנה x מאחר שהמשתנה x מקומי ל- Macro1.

טווח פרטי וציבורי ברמת המודול

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

כדי לראות את ההבדל בין המשפט הציבורי במשפט Dim, בצע את הפעולות הבאות:

  1. שמור וסגור חוברות עבודה פתוחות ולאחר מכן פתח חוברת עבודה חדשה.

  2. הפעל את עורך Visual Basic.

  3. הוסף מודול לפרוייקט שלך.

  4. Type the following code into this module:
    
    Public x As Integer
    Sub Macro_1a()
         x = 10
         MsgBox x
         Macro_1b
    End Sub
    Sub Macro_1b()
         x = x * 2
         MsgBox x
         Macro2
    End Sub
    
  5. הוסף מודול נוסף לפרוייקט שלך.

  6. הקלד את הקוד הבא במודול זה:
    Sub Macro2()
        x = x * 3
        MsgBox x
    End Sub

  7. הפעל Macro_1a המאקרו במודול הראשון.

  8. כאשר המשתנה x מוצהר כ-"Public x As Integer", כל שלוש פקודות המאקרו בפרוייקט כוללות גישה לערך של x. תיבת ההודעה הראשונה מציגה ערך של 10. תיבת ההודעה השניה מציגה ערך של 20 (מכיוון ש- x מוכפל ב- 2 ב- Macro_1b). תיבת ההודעה השלישית מציגה ערך של 60 (מכיוון שהערך של x השתנה ל- 20 ב- Macro_1b ולאחר מכן הוא הוכפל ב- 3 ב- Macro2).

  9. שנה את שורת ההצהרה במודול הראשון מ:

       Public x As Integer

    אל:

       Dim x As Integer

  10. הפעל את Macro_1a המאקרו.

  11. כאשר המשתנה x מוצהר כ"Dim x As Integer", רק לפקודות המאקרו במודול הראשון יש גישה לערך של x. לכן, תיבת ההודעה הראשונה מציגה ערך של 10, תיבת ההודעה השניה מציגה ערך של 20 (מכיוון ש- x מוכפל ב- 2 ב- Macro_1b) ותיבת ההודעה השלישית מציגה ערך של 0 (מכיוון ש- Macro2 אינו רואה את הערך של x וערך אפס שלא אותחל נמצא בשימוש על-ידי מאקרו 2).

  12. שנה את שורת ההצהרה במודול הראשון מ:

      Dim x As Integer

    אל:

        Private x As Integer

  13. הפעל את Macro_1a המאקרו.

  14. אותן תיבות הודעה מוצגות באמצעות טווח המשפט הפרטי שבו הן השתמשו במשפט Dim. למשתנה x יש אותו טווח, שהוא פרטי למודול שבו הוא מוצהר.

הערה: אם ברצונך שהיקף המשתנה יהיה מוגבל למודול שבו הוא מוצהר, השתמש ב- Privatestatement במקום במשפט Dim. שניהם משיגים את אותו אפקט, אך הטווח ברור יותר בעת קריאת הקוד אם אתה משתמש במשפט Private.
 

משך החיים של משתנה

הזמן שבו משתנה שומר על הערך שלו ידוע כ'משך החיים שלו'. הערך של משתנה עשוי להשתנות לאורך משך החיים שלו, אך הוא ישמור ערך. כמו כן, כאשר משתנה מאבד את הטווח, כבר אין לו ערך.
 

אתחול הערך של משתנה

בעת הפעלת מאקרו, כל המשתנים מאותחלים לערך. משתנה מספרי מאותחל לאפס, מחרוזת אורך משתנה מאותחלת למחרוזת באורך אפס (""), ומחרוזת באורך קבוע מתמלאת בקוד ASCII 0. משתני משתנה מאותחלים ל'ריקים'. משתנה ריק מיוצג על-ידי אפס בהקשר מספרי ומחרוזת באורך אפס ("") בהקשר מחרוזת.

משתנים ברמת הפרוצדורה

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

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

  1. הוסף מודול חדש לפרוייקט שלך.

  2. הקלד את שתי פקודות המאקרו הבאות במודול זה:

    Sub Macro1()
        'set x כמשתנה רמת פרוצדורה
       מעומעם x כמספר שלם
       MsgBox "הערך האתחול של x הוא " & x
       x = 10
        MsgBox "x is " & x
        השורה הבאה מפעילה את Macro2
        מאקרו2
        MsgBox "x עדיין " & x
    End Sub
    מאקרו משנה2()
        MsgBox "x, כפי שנראה על-ידי Macro2 הוא " & x
    End Sub

  3. הפעל מאקרו1.

  4. אתה מקבל את ההודעה הבאה:

        the initialized value of x is 0

  5. לחץ על אישור, ות קבל את ההודעה:

     x is 10

  6. לחץ על אישור, ותת קבל את ההודעה הבאה:

    x, as seen by Macro2 is

  7. לחץ על אישור.

  8. Macro2 אינו מציג ערך עבור המשתנה x מאחר שהמשתנה x מקומי ל- Macro1. אתה מקבל את ההודעה הבאה:

    x is still 10

  9. לחץ על אישור.

  10. הפעל מאקרו1.

אתה מקבל את אותן ההודעות המתוארות בשלבים 3 עד 6 מכיוון ברגע ש- Macro1 הפסיק לפעול בשלב 6, הערך של המשתנה x אבד. לכן, בעת הפעלה מחדש של Macro1 בשלב 7, ההודעה הראשונה מציגה את הערך של x כאפס (הערך האתחול).

מילת מפתח סטטית

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

כדי לראות כיצד פועלת מילת המפתח Static, בצע את הפעולות הבאות:

1.

Change the code in Macro1 to:

Sub Macro1()
    'set x as a procedure level variable
    Static x As Integer
       MsgBox "the initialized value of x is " & x
    x = x + 10
    MsgBox "x is " & x
End Sub
  1. הפעל מאקרו1.

  2. תקבל את ההודעה:

    the initialized value of x is 0

  3. לחץ על אישור, ות קבל את ההודעה:

    x is 10

  4. לחץ על אישור.

  5. הפעל את Macro1, ואתה מקבל את ההודעה הבאה:

    the initialized value of x is 10

  6. לחץ על אישור, ותת קבל את ההודעה הבאה:

    x is 20

  7. לחץ על אישור.

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

הערה: אם יש לך משתנה ברמת המודול, משך החיים שלו זהה לזה של משתנה ברמת ההליך הסטטי.

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

1.

Change the code in the module that contains Macro1 to the following:

Dim x As Integer  'create a module-level variable
Sub Macro1()
   MsgBox "the initialized value of x is " & x
   x = x + 10
   MsgBox "x is " & x
End Sub
  1. הפעל את Macro1, ות תקבל את ההודעה הבאה:

    the initialized value of x is 0

  2. לחץ על אישור, ותת קבל את ההודעה הבאה:

    x is 10

  3. לחץ על אישור.

  4. הפעל את Macro1 ות תקבל הודעה זו:

    the initialized value of x is 10

  5. לחץ על אישור.

  6. אתה מקבל את ההודעה הבאה:

    x is 20

  7. לחץ על אישור.

הערכים המופיעים בהודעות שונים בפעם השניה מכיוון שהמשתנה x מוצהר כמשתנה סטטי ושמר את הערך שלו לאחר הפעלת Macro1 בפעם הראשונה.
 

איפוס פרוייקט לאיפוס משתנים

אם ברצונך לאפס את הערך עבור משתנה סטטי או עבור משתנה ברמת המודול, לחץ על לחצן איפוס בלחצן
Standard הכלים, או לחץ על איפוס בתפריט הפעלה.

אם תעשה זאת עבור הפרוייקט Macro1 ולאחר מכן הפעל מחדש את Macro1, הערך של המשתנה x מאותחל חזרה לאפס ואתה מקבל את ההודעה הראשונה:

    the initialized value of x is 0