טיפול ב- Excel VBA - כל מה שאתה צריך לדעת!

לא משנה כמה ניסיון אתה בקידוד VBA, טעויות תמיד יהיו חלק מזה.

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

במדריך זה אראה לך דרכים שונות בהן תוכל להתמודד עם טעויות ביעילות ב- Excel VBA.

לפני שנכנס לטיפול בשגיאות VBA, הבה נבין תחילה את סוגי השגיאות השונות שאתה צפוי להיתקל בהן בעת ​​תכנות ב- Excel VBA.

סוגי שגיאות VBA ב- Excel

ישנם ארבעה סוגי שגיאות ב- Excel VBA:

  1. שגיאות תחביר
  2. שגיאות הידור
  3. שגיאות זמן ריצה
  4. שגיאות לוגיות

הבה נבין במהירות מהן השגיאות הללו ומתי אתה צפוי להיתקל בהן.

שגיאת תחביר

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

לדוגמה, אם תשכח חלק מהמשפט/התחביר הדרוש, תראה את שגיאת הידור.

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

הערה: כאשר אתה מקליד קוד ב- Excel VBA, הוא בודק כל משפט ברגע שאתה לוחץ על enter. אם VBA מוצא משהו חסר בתחביר, הוא מציג מיד הודעה עם טקסט כלשהו שיכול לעזור לך להבין את החלק החסר.

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

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

שגיאת הידור

שגיאות הידור מתרחשות כאשר חסר משהו הדרוש להפעלת הקוד.

לדוגמה, בקוד שלהלן, ברגע שאנסה להריץ את הקוד, הוא יראה את השגיאה הבאה. זה קורה כשהשתמשתי בהצהרת IF Then מבלי לסגור אותו עם 'סוף אם' החובה.

שגיאת תחביר היא גם סוג של שגיאת הידור. שגיאת תחביר מתרחשת ברגע שאתה לוחץ על Enter ו- VBA מזהה שמשהו חסר. שגיאת אוסף יכולה להתרחש גם כאשר VBA לא מוצא שום דבר חסר בעת הקלדת הקוד, אך היא מתרחשת כאשר הקוד אוסף או מבוצע.

VBA בודק כל שורה בזמן שאתה מקליד את הקוד ומדגיש את שגיאת התחביר ברגע שהשורה לא נכונה ולחץ על enter. מצד שני, שגיאות הידור מזוהות רק כאשר הקוד כולו מנותח על ידי VBA.

להלן מספר תרחישים שבהם תתקל בשגיאת הידור:

  1. שימוש בהצהרת IF ללא ה- IF IF
  2. שימוש בהצהרת For עם הבא
  3. שימוש במשפט Select מבלי להשתמש ב- End Select
  4. לא מצהיר על המשתנה (זה עובד רק כאשר אופציה מפורשת מופעלת)
  5. קריאת תת/פונקציה שאינה קיימת (או עם פרמטרים שגויים)
הערה לגבי 'אפשרות מפורשת': כאשר תוסיף 'אפשרות מפורשת', תידרש להצהיר על כל המשתנים לפני הפעלת הקוד. אם יש משתנה שלא הוכרז, VBA יציג שגיאה. זהו נוהג טוב מכיוון שהוא מראה שגיאה במקרה שיש לך משתנה שגוי. תוכל לקרוא עוד על Option Explicit כאן.

שגיאות זמן ריצה

שגיאות זמן ריצה הן אלה המתרחשות כאשר הקוד פועל.

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

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

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

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

אם תלחץ על כפתור Debug, הוא יסמן את החלק של הקוד שמוביל לשגיאה.

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

או שאתה יכול גם ללחוץ על כפתור הסיום כדי לצאת מהקוד.

חָשׁוּב: במקרה שתלחץ על כפתור הסיום בתיבת הדו -שיח, הוא יעצור את הקוד בשורה שבה הוא נתקל. עם זאת, כל שורות הקוד לפני כן היו מבוצעות.

שגיאות לוגיות

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

השגיאות אינן מודגשות על ידי המהדר וצריך לטפל בהן באופן ידני.

דוגמה אחת לשגיאה לוגית (שלרוב אני מוצאת את עצמי תקוע בה) היא נתקלת בלולאה אינסופית.

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

ישנן מספר דרכים שבהן אני משתמש להתמודדות עם שגיאות לוגיות:

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

שימוש באגים לאיתור שגיאות הידור/תחביר

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

כדי לאסוף קוד, לחץ על האפשרות Debug בסרגל הכלים ולחץ על Compile VBAProject.

כאשר אתה אוסף פרויקט VBA, הוא עובר את הקוד ומזהה שגיאות (אם קיימות).

במקרה שהוא מוצא שגיאה, הוא יראה לך תיבת דו -שיח עם השגיאה. הוא מוצא שגיאות אחת אחת. אז אם היא מוצאת שגיאה ותיקנת אותה, עליך להריץ שוב את compile כדי למצוא שגיאות אחרות (אם ישנן).

כאשר הקוד שלך נטול שגיאות, האפשרות Compile VBAProject תהיה אפורה.

שים לב כי הידור ימצא רק שגיאות 'תחביר' ושגיאות 'הידור'. הוא לא ימצא את השגיאות בזמן ריצה.

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

בחלקים הבאים של מאמר זה, אסקור את השיטות בהן תוכל להשתמש לטיפול בשגיאות VBA ב- Excel.

הגדרת הגדרות שגיאה (טיפול מול שגיאות לא מטופלות)

לפני שתתחיל לעבוד עם הקוד שלך, עליך לבדוק אם קיימת הגדרה אחת ב- Excel VBA.

עבור לסרגל הכלים של VBA ולחץ על כלים ולאחר מכן לחץ על אפשרויות.

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

הרשו לי להסביר את שלוש האפשרויות:

  1. לשבור על כל השגיאות: זה יעצור את הקוד שלך על כל סוגי השגיאות, גם כאשר השתמשת בטכניקות לטיפול בשגיאות אלה.
  2. מודול פריצה בכיתה: זה יעצור את הקוד שלך על כל השגיאות הלא מטופלות, ויחד עם זאת, אם אתה משתמש באובייקטים כגון צורות משתמש, הוא גם יישבר בתוך האובייקטים האלה וידגיש את הקו המדויק שגורם לשגיאה.
  3. לשבור על שגיאות לא מטופלות: פעולה זו תעצור את הקוד שלך רק עבור השגיאות שאינן מטופלות. זוהי הגדרת ברירת המחדל מכיוון שהיא מבטיחה להודיע ​​לך על טעויות בלתי מטופלות. אם אתה משתמש באובייקטים כגון צורות משתמש, פעולה זו לא תסמן את השורה הגורמת לשגיאה באובייקט, אלא רק תדגיש את השורה המתייחסת לאובייקט זה.
הערה: אם אתה עובד עם אובייקטים כגון צורות משתמש, באפשרותך לשנות הגדרה זו ל'שבירה על מודולי כיתה '. ההבדל בין מס '2 ל -3 הוא שכאשר אתה משתמש במודול Break in Class, הוא יוביל אותך לשורה הספציפית באובייקט שגורם לשגיאה. אתה יכול גם לבחור ללכת עם זה במקום 'לשבור על שגיאות לא מטופלות'.

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

טיפול בשגיאות VBA עם הצהרות 'על שגיאה'

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

  1. התעלם מהשגיאה ותן לקוד להמשיך
  2. החזק קוד טיפול בשגיאה במקום והפעל אותו כאשר מתרחשת שגיאה

שתי שיטות הטיפול בשגיאות אלה מבטיחות שמשתמש הקצה לא יזכה לראות שגיאה.

יש כמה הצהרות 'על שגיאה' בהן תוכל להשתמש כדי לבצע אותן.

על שגיאה המשך הבא

כאשר אתה משתמש ב- 'On Error Resume Next' בקוד שלך, תתעלם מכל שגיאה שנתקלת והקוד ימשיך לפעול.

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

לדוגמה, אם הקוד להלן מופעל, הוא יחזיר שגיאה.

Sub AssignValues ​​() x = 20 /4 y = 30 /0 End Sub

זה קורה מכיוון שלא ניתן לחלק מספר באפס.

אבל אם אשתמש במשפט 'On Error Resume Next' בקוד זה (כפי שמוצג להלן), הוא יתעלם מהשגיאה ולא אדע שיש בעיה שצריך לתקן.

Sub AssignValues ​​() על חידוש השגיאה הבא x = 20 /4 y = 30 /0 סיום תת

ב- Error Resume Next יש להשתמש רק כאשר אתה יודע בבירור את סוג השגיאות שצפוי לזרוק קוד VBA שלך וזה בסדר להתעלם מזה.

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

Sub Workbook_NewSheet פרטי (ByVal Sh כאובייקט) Sh.Range ("A1") = פורמט (עכשיו, "dd-mmm-yyyy hh: mm: ss") End Sub

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

לכן, אם אשתמש במשפט 'On Error Resume Next' בקוד זה, זה יעבוד כצפוי עם גליונות עבודה ולא יעשה דבר עם גליונות תרשים.

תת פרטי Workbook_NewSheet (ByVal Sh כאובייקט) על חידוש השגיאה הבא Sh.Range ("A1") = פורמט (עכשיו, "dd-mmm-yyyy hh: mm: ss") סוף משנה

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

אתה יכול לקחת את הקוד הזה לשלב הבא על ידי ניתוח אם הייתה שגיאה והצגת הודעה רלוונטית עבורו.

הקוד להלן יציג תיבת הודעות שתודיע למשתמש כי לא הוכנס גליון עבודה.

תת פרטי Workbook_NewSheet (ByVal Sh כאובייקט) על חידוש השגיאה הבא Sh.Range ("A1") = פורמט (עכשיו, "dd-mmm-yyyy hh: mm: ss") אם Err.Number 0 ואז MsgBox "נראה כמוך הכניס גיליון תרשים "& vbCrLf &" שגיאה - "& שגיאת תיאור סיום אם סוף תת

'Err.Number' משמש כדי לקבל את מספר השגיאה ו- 'Err.Description' משמש כדי לקבל את תיאור השגיאה. אלה יעסקו בהמשך הדרכה זו.

על שגיאה GoTo 0

'On Error GoTo 0' יעצור את הקוד בשורה הגורמת לשגיאה ומציג תיבת הודעות המתארת ​​את השגיאה.

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

אז למה בכלל להשתמש בו?

בדרך כלל, אינך צריך להשתמש ב- 'On Error Goto 0', אך הוא יכול להיות שימושי כאשר אתה משתמש בו יחד עם 'On Error Resume Next'

הרשה לי להסביר!

הקוד שלהלן יבחר את כל התאים הריקים בבחירה.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). בחר End Sub

אבל זה יראה שגיאה כאשר אין תאים ריקים בתאים שנבחרו.

אז כדי להימנע מהצגת השגיאה, תוכל להשתמש באפשרות 'המשך שגיאה מחדש' הבא '

כעת, היא תציג גם שגיאה בעת הפעלת הקוד שלהלן:

Sub SelectFormulaCells () על שגיאה חידוש הבחירה הבאה.SpecialCells (xlCellTypeBlanks). בחר End Sub

בינתיים הכל טוב!

הבעיה מתעוררת כאשר יש חלק מהקוד שבו עלולה להתרחש שגיאה, ומאחר שאתה משתמש ב- 'On Error Resume Next', הקוד היה פשוט מתעלם ממנו ועובר לשורה הבאה.

לדוגמה, בקוד שלהלן, לא הייתה הודעת שגיאה:

Sub SelectFormulaCells () על שגיאה המשך את הבחירה הבאה Selection.SpecialCells (xlCellTypeBlanks). בחר '… עוד קוד שיכול להכיל שגיאה סיום תת

בקוד לעיל, ישנם שני מקומות בהם יכולה להתרחש שגיאה. המקום הראשון הוא המקום בו אנו בוחרים את כל התאים הריקים (באמצעות Selection.SpecialCells) והשני הוא בקוד הנותר.

אמנם השגיאה הראשונה צפויה, אך כל שגיאה לאחר מכן אינה כזו.

זה המקום שבו On Error Goto 0 בא להציל.

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

לדוגמה, בקוד שלהלן, לא תהיה שגיאה למקרה שאין תאים ריקים, אך תהיה הודעת שגיאה בגלל '10/0 ′

Sub SelectFormulaCells () על שגיאה חידוש בחירה הבאה Selection.SpecialCells (xlCellTypeBlanks). בחר באפשרות שגיאה GoTo 0 '… עוד קוד שיכול להכיל שגיאה סוף תת

על שגיאה עבור [תווית]

שתי השיטות שלעיל - 'On Error Resume Next' ו- 'On Error Goto 0' - אינן מאפשרות לנו לטפל באמת בשגיאה. אחת גורמת לקוד להתעלם מהשגיאה והשנייה לחדש את בדיקת השגיאות.

On Error Go [Label] היא דרך שבה תוכל לציין מה אתה רוצה לעשות במקרה שלקוד שלך יש שגיאה.

להלן מבנה הקוד שמשתמש במטפל השגיאות הזה:

בדיקת משנה () על שגיאה GoTo Label: X = 10 /0 'שורה זו גורמת לשגיאה' … הקוד שנותר שלך נכנס לכאן צא תווית תת: 'קוד לטיפול בשגיאה End Sub

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

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

מטפל משנה שגיאה () על שגיאה GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 יציאה משנה ErrMsg: MsgBox "נראה שיש שגיאה" & vbCrLf & Err. תיאור סיום תת

שים לב שכאשר מתרחשת שגיאה, הקוד כבר הפעל והוציא את השורות לפני השורה הגורמת לשגיאה. בדוגמה שלעיל, הקוד קובע את הערך של X כ -12, אך מכיוון שהשגיאה מתרחשת בשורה הבאה, הוא אינו קובע את הערכים עבור Y ו- Z.

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

על שגיאה עבור אל -1

זה קצת מסובך, וברוב המקרים אין סיכוי שתשתמש בזה.

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

לפני שאני נכנס למכניקה של זה, הרשה לי לנסות ולהסביר היכן זה יכול להיות שימושי.

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

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

בתרחיש זה, תוכל להשתמש ב On Error Goto -1.

הוא מנקה את השגיאה ומשחרר את זיכרון ה- VBA לטיפול בשגיאה הבאה.

די לדבר!

הבה אסביר כעת באמצעות דוגמאות.

נניח שיש לי את הקוד שלהלן. זה יטיל שגיאה מכיוון שיש חלוקה לאפס.

מטפל משנה שגיאות () X = 12 Y = 20 /0 Z = 30 Sub Sub

אז כדי לטפל בזה, אני משתמש בקוד מטפל בשגיאות (עם השם ErrMsg) כפי שמוצג להלן:

מטפל משנה שגיאה () על שגיאה GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 יציאה משנה ErrMsg: MsgBox "נראה שיש שגיאה" & vbCrLf & Err. תיאור סיום תת

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

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

מטפל משנה שגיאה () על שגיאה GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 יציאה משנה ErrMsg: MsgBox "נראה שיש שגיאה" & vbCrLf & Err. תיאור A = 10 /2 B = 35 /0 סיום תת

מכיוון שהשגיאה הראשונה טופלה אך השנייה לא הייתה, אני שוב רואה שגיאה כפי שמוצג להלן.

עדיין הכל טוב. הקוד מתנהג באופן שציפינו ממנו.

אז כדי לטפל בשגיאה השנייה, אני משתמש במטפל שגיאות אחר (ErrMsg2).

מטפל משנה שגיאה () על שגיאה GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 יציאה משנה ErrMsg: MsgBox "נראה שיש שגיאה" & vbCrLf & Err. תיאור על שגיאה GoTo ErrMsg2 A = 10 /2 B = 35 / 0 יציאה משנה ErrMsg2: MsgBox "נראה שיש שוב שגיאה" & vbCrLf & Err. תיאור סיום תת

וכאן זה נמצא לא עובד כמצופה.

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

זה קורה מכיוון שלא ניקינו את השגיאה הראשונה מהזיכרון של VBA.

כן, טיפלנו בזה! אבל זה עדיין נשאר בזיכרון.

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

כדי לנקות את הזיכרון של VBA ולנקות את השגיאה הקודמת, עליך להשתמש ב- 'On Error Goto -1'.

אז אם תוסיף את השורה הזו בקוד שלהלן ותפעיל אותה, היא תעבוד כצפוי.

מטפל משנה שגיאה () על שגיאה GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 יציאה משנה ErrMsg: MsgBox "נראה שיש שגיאה" & vbCrLf & Err. תיאור על שגיאה GoTo -1 על שגיאה GoTo ErrMsg2 A = 10 / 2 B = 35 /0 יציאה משנה ErrMsg2: MsgBox "נראה שיש שוב שגיאה" & vbCrLf & Err. תיאור סיום תת
הערה: השגיאה מתנקה אוטומטית כאשר תת -תוכנית מסתיימת.אז, 'On Error Goto -1' יכול להיות שימושי כאשר אתה מקבל שתיים או יותר משתי שגיאות באותו תוכנית משנה.

אובייקט הטעות

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

נכסי אובייקט Err

לאובייקט Err יש את המאפיינים הבאים:

תכונה תיאור
מספר מספר המייצג את סוג השגיאה. כאשר אין שגיאה, ערך זה הוא 0
תיאור תיאור קצר של השגיאה
מָקוֹר שם הפרויקט שבו אירעה השגיאה
HelpContext מזהה הקשר העזרה עבור השגיאה בקובץ העזרה
HelpFile מחרוזת המייצגת את מיקום התיקיה ואת שם הקובץ של קובץ העזרה

אמנם ברוב המקרים אינך צריך להשתמש באובייקט Err, אך לפעמים הוא יכול להיות שימושי בעת טיפול בשגיאות ב- Excel.

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

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

Sub FindSqrRoot () עמום rng כטווח הגדרת rng = בחירה לכל תא בתא rng.Offset (0, 1) .Value = Sqr (cell.Value) תא הסוף הבא של התא

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

אתה יכול להשתמש באובייקט Err כדי להפוך את הודעות השגיאה האלה למשמעותיות יותר.

לדוגמה, אם אשתמש כעת בקוד ה- VBA שלהלן, הוא יעצור את הקוד ברגע שתתרחש השגיאה ויציג תיבת הודעה עם כתובת התא של התא שבה יש בעיה.

Sub FindSqrRoot () Dim rng As Set Set rng = בחירה לכל תא ב- rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) תא הבא ErrHandler: MsgBox "מספר שגיאה:" & שגיאה .Number & vbCrLf & _ "תיאור שגיאה:" & Err.Description & vbCrLf & _ "Error at:" & cell.Address End Sub

הקוד לעיל ייתן לך הרבה יותר מידע מאשר 'התאמה לא תואמת סוג', במיוחד כתובת התא כדי שתדע היכן התרחשה השגיאה.

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

הקוד שלהלן יעשה זאת:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng as Range on Error Resume הבא הגדר rng = בחירה לכל תא בתא rng.Offset (0, 1) .Value = Sqr (cell.Value) אם Err.Number 0 ואז ErrorCells = ErrorCells & vbCrLf & cell.Address על שגיאה GoTo -1 End אם התא הבא MsgBox "שגיאה בתאים הבאים" & ErrorCells צא משנה Sub Sub

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

שיטות אובייקט שגיאות

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

שיטה תיאור
ברור מנקה את כל הגדרות המאפיין של האובייקט Err
הַעֲלָאָה יוצר שגיאת זמן ריצה

בואו ללמוד במהירות מה הם וכיצד/מדוע להשתמש בהם עם VBA ב- Excel.

Err Clear שיטה

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

הקוד הבא יקבל את השורשים הריבועיים של כל המספרים בעמודה הסמוכה ויציג הודעה כי אירעה שגיאה בתא A5 ו- A9 (מכיוון שיש בהם טקסט).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng as Range on Error Resume הבא הגדר rng = בחירה לכל תא בתא rng.Offset (0, 1) .Value = Sqr (cell.Value) אם Err.Number 0 ואז ErrorCells = ErrorCells & vbCrLf & cell.Address Err. נקה קצה אם התא הבא MsgBox "שגיאה בתאים הבאים" & תאי ErrorCells מסתיימים

שים לב שהשתמשתי בשיטת Err.Clear בתוך המשפט If Then.

לאחר שהתרחשה שגיאה ונלכדה על ידי מצב If, שיטת Err.Clear מאפסת את מספר השגיאה בחזרה ל- 0. זה מבטיח שמצב IF מלכודת את השגיאות רק לתאים שבהם היא מורמת.

אלמלא השתמשתי בשיטת Err.Clear, ברגע שהשגיאה מתרחשת, היא תמיד הייתה נכונה במצב IF, ומספר השגיאה לא התאפס.

דרך נוספת לגרום לעבודה זו היא באמצעות On Error Goto -1, המאפס את השגיאה לחלוטין.

הערה: Err.Clear שונה מ On Error Goto -1. Err.Clear מנקה רק את תיאור השגיאה ואת מספר השגיאה. זה לא מאפס אותו לגמרי. המשמעות היא שאם יש מופע נוסף של שגיאה באותו קוד, לא תוכל להתמודד עם זה לפני איפוסו (מה שניתן לעשות עם 'On Error Goto -1' ולא על ידי 'Err.Clear').

שיטת העלאת טעות

שיטת Err.Raise מאפשרת לך להעלות שגיאת זמן ריצה.

להלן תחביר השימוש בשיטת Err.Raise:

עלייה [מספר], [מקור], [תיאור], [קובץ עזרה], [helpcontext]

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

אבל למה שתרצה להעלות שגיאה בעצמך?

שאלה טובה!

אתה יכול להשתמש בשיטה זו כשיש מופע של שגיאה (מה שאומר שבכל זאת יש שגיאה) ואז תוכל להשתמש בשיטה זו כדי לספר למשתמש יותר על השגיאה (במקום הודעת השגיאה הפחות מועילה שמוצגת ב- VBA כברירת מחדל).

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

Sub RaiseError () Dim rng As Set Set rng = בחירה בשגיאה GoTo ErrHandler עבור כל תא ב- rng אם לא (IsNumeric (Cell.Value)) ואז Err.Raise vbObjectError + 513, Cell.Address, "לא מספר", " Test.html "End If Next Cell ErrHandler: MsgBox Err. תיאור & vbCrLf & Err.Help

הקוד לעיל יציג הודעת שגיאה הכוללת את התיאור שצוין וקובץ ההקשר.

באופן אישי, מעולם לא השתמשתי ב- Err.Raise מכיוון שאני עובד בעיקר עם Excel בלבד. אבל למי שמשתמש ב- VBA לעבודה עם Excel יחד עם יישומים אחרים כגון Outlook, Word או PowerPoint, זה יכול להיות שימושי.

להלן מאמר מפורט על שיטת Err.Raise למקרה שתרצה ללמוד עוד.

VBA טיפול בשגיאות מומלצות

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

להלן מספר שיטות עבודה מומלצות בהן תוכל להשתמש בכל הנוגע לטיפול בשגיאות ב- Excel VBA.

  1. השתמש ב- 'On Error Go [Label]' בתחילת הקוד. זה יוודא שכל טיפול שיכול לקרות משם יטופל.
  2. השתמש ב- 'On Error Resume Next' רק כאשר אתה בטוח לגבי השגיאות שעלולות להתרחש. השתמש בו עם השגיאה הצפויה בלבד. במקרה שאתה משתמש בו עם שגיאות בלתי צפויות, הוא פשוט יתעלם ממנו ויתקדם. אתה יכול להשתמש ב- 'On Error Resume Next' עם 'Err.Raise' אם אתה רוצה להתעלם מסוג מסוים של שגיאה ולתפוס את השאר.
  3. בעת שימוש במטפלי שגיאות, ודא שאתה משתמש ביציאה משנה לפני המטפלים. זה יבטיח שקוד מטפל השגיאות יבוצע רק כשיש שגיאה (אחרת הוא תמיד יבוצע).
  4. השתמש במספר מטפלי שגיאות כדי ללכוד סוגים שונים של טעויות. שימוש במספר מטפל בשגיאות מבטיח שתתייחס לשגיאה כראוי. לדוגמה, תרצה לטפל בשגיאת 'חוסר התאמה מסוג' באופן שונה משגיאת זמן ריצה של 'חלוקה לפי 0'.

מקווה שמצאת מאמר אקסל זה שימושי!

להלן עוד כמה שיעורי VBA של Excel שתמצא חן בעיניך:

  • סוגי נתונים של Excel VBA - מדריך מלא
  • לולאות VBA של Excel - להמשך, עשה בזמן, עשה עד, עבור כל אחת
  • אירועי Excel VBA - מדריך קל (ומלא)
  • עורך Visual Visual Basic - כיצד לפתוח ולהשתמש בו ב- Excel

תוכל לעזור בפיתוח האתר, שיתוף הדף עם החברים שלך

wave wave wave wave wave