דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
  1. דף הבית
  2. תוכנות
  3. יישומי אופיס
  4. וורד
  5. VBA - word
  6. עזרה הדדית - VBA word
  7. מדריך | יציאה באמצע מאקרו עם Undo – בעיה ופתרון

מדריך | יציאה באמצע מאקרו עם Undo – בעיה ופתרון

מתוזמן נעוץ נעול הועבר עזרה הדדית - VBA word
1 פוסטים 1 כותבים 23 צפיות 1 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מ מנותק
    מ מנותק
    מניין
    כתב נערך לאחרונה על ידי מניין
    #1

    כהמשך למה שנכתב כאן, יש בעיה דומה ביציאה באמצע מאקרו במקרה של תנאי, ואני יסביר בצירוף דוגמאות.
    כשכותבים מאקרו ב־Word ומשתמשים באפשרות של הקלטת פעולה אחת בלבד ל־Undo (כלומר, Application.UndoRecord.StartCustomRecord), כדי לתת אפשרות לבטל דרך קונטרול Z, ישנה בעיה שאם מתרחשת שגיאה במהלך המאקרו, עלול להיווצר מצב שבו ה־Undo נשאר "פתוח" – בגלל שלא מבצע את הסיום שנקרא EndCustomRecord, והפעולה לא נשמרת בכלל וזה יכול לשבש את הכל.
    הפתרון שנתנו שם במצב של שגיאה, כדי להבטיח שה־Undo תמיד ייסגר גם אם תתרחש שגיאה, שעוטפים את סיום המאקרו בקטע קוד ייעודי עם תווית [לדוגמא] CleanExit, ומפנים אליו את השגיאה', uבכך מבטיחים שה־Undo תמיד נסגר – בין אם המאקרו הסתיים כראוי, ובין אם לא. ראה דוגמא:

    On Error GoTo ErrHandler
    Application.UndoRecord.StartCustomRecord "שם פעולה"
    ' פעולות שונות...
    
    CleanExit:
        If undoStarted Then Application.UndoRecord.EndCustomRecord
        Exit Sub
    
    ErrHandler:
        MsgBox "שגיאה: " & Err.Description
        Resume CleanExit
    
    

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

    If Selection.Type <> wdSelectionShape Then
        MsgBox "לא נבחרה תמונה"
        Exit Sub
    End If
    

    אם ה־Undo התחיל כבר לפני התנאי הזה, והשורה Exit Sub מופעלת – ה־Undo לא ייסגר! והתוצאה זהה לזו של שגיאה – הקלטה לא שלמה של הפעולה.

    ועל זה יש פתרון פשוט אבל מוגבל, כי אפשר פשוט להתחיל את ה־Undo רק לאחר התנאי, לדוגמא:

    If Selection.Type <> wdSelectionShape Then
        MsgBox "לא נבחרה תמונה"
        Exit Sub
    End If
    
    Application.UndoRecord.StartCustomRecord "שם פעולה"
    ' פעולות...
    

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

    ולכן הפתרון המומלץ הוא לעשות כמו בשגיאה – קפיצה ל־CleanExit
    במקום להשתמש ב־Exit Sub, פשוט מקפיצים ל־CleanExit, בדיוק כפי שמבוצע במצב של שגיאה, לדוגמא:

    If Selection.Type <> wdSelectionShape Then
        MsgBox "לא נבחרה תמונה"
        GoTo CleanExit
    End If
    

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

    On Error GoTo ErrHandler
    Application.UndoRecord.StartCustomRecord "שם פעולה"
    
    ' פעולות שונות של המאקרו...
    
    ' תנאי
    If Selection.Type <> wdSelectionShape Then
        MsgBox "לא נבחרה תמונה"
        GoTo CleanExit
    End If
    
    ' עוד פעולות שונות של המאקרו
    
    CleanExit:
        If undoStarted Then Application.UndoRecord.EndCustomRecord
        Exit Sub
    
    ErrHandler:
            MsgBox "אירעה שגיאה במהלך פעולת המאקרו:" & vbCrLf & Err.Description, vbCritical, "שגיאת מאקרו"
        Resume CleanExit
    
    
    תגובה 1 תגובה אחרונה
    1

    • התחברות

    • אין לך חשבון עדיין? הרשמה

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