מאקרו שנפל אחרי עדכון Office: איך מזהים אם זה Mark of the Web, הפניה חסרה ב-References או Declare בלי PtrSafe, ולמה אסור להוריד את רמת האבטחה.
עיקרי הדברים
- הודעת "Microsoft has blocked macros from running because the source of the file is untrusted" אינה שגיאת קוד. היא סימון Zone.Identifier שהמערכת הוסיפה לקובץ.
- הסרת הסימון היא פעולה על קובץ בודד: לחיצה ימנית > Properties > Unblock, או `Unblock-File` ב-PowerShell.
- הפניה שבורה מסומנת במפורש ב-Tools > References עם התחילית `MISSING:`, ומייצרת שגיאת הידור בשורה שאין בה שום קשר לבעיה.
- מ-Office 2019 ומ-Microsoft 365 ההתקנה היא 64 סיביות כברירת מחדל. כל `Declare` חייב אז את המילה `PtrSafe`.
- הורדת רמת האבטחה מטפלת בסימפטום אחד ומשאירה את כל השאר פתוח. זו לא דרך אבחון.
ברוב המקרים הקובץ לא נפגע. שלושה מנגנונים שונים מסבירים כמעט את כל התקלות: חסימת מאקרו בקבצים שמגיעים מחוץ למחשב (Mark of the Web), הפניה שנשברה ב-Tools > References, והצהרת Declare שגרסת Office ב-64 סיביות מסרבת להדר. לכל אחד מהם תיקון אחר.
מה בעצם השתנה - במחשב, לא בקובץ
עדכון Office כמעט אף פעם לא משנה את הקוד שכתוב בקובץ. הוא משנה שלושה דברים סביבו: את גרסת ספריות האובייקטים הרשומות במחשב, את ארכיטקטורת ההידור (32 או 64 סיביות), ואת ההתנהגות שמוגדרת מראש כלפי קבצים שמגיעים מהאינטרנט או משיתוף רשת.
לכן השאלה הראשונה באבחון היא לא "מה בקוד" אלא "איפה הקובץ יושב ומאיפה הוא הגיע". קובץ שרץ שנים מתיקייה מקומית ונשלח לפתע במייל לעובד אחר יתנהג אחרת, בלי שאף שורה השתנתה.
איזו הודעה בדיוק קיבלתם?
ההודעה היא האבחנה. אלה ארבע ההודעות שמכסות את רוב המקרים:
| מה מופיע על המסך | המנגנון | איפה בודקים | התיקון הנכון |
|---|---|---|---|
| "Microsoft has blocked macros from running because the source of the file is untrusted" | סימון Mark of the Web על הקובץ | תכונות הקובץ ב-Explorer | Unblock לקובץ, או Trusted Location לתיקייה |
| "Compile error: Can't find project or library" | הפניה לספרייה שלא נמצאת | Alt+F11 > Tools > References | הסרת השורה עם MISSING: והפניה לגרסה הקיימת |
שגיאה שמצביעה על היעדר PtrSafe בהצהרת Declare | הידור ב-64 סיביות | כל שורת Declare בפרויקט | הוספת PtrSafe ותיקון טיפוסי הנתונים |
הקוד עוצר בשורה תמימה כמו Left(...) או Date | הפניה שבורה שמשבשת פענוח שמות | אותו מסך References | זהה לשורה השנייה |
השורה האחרונה היא זו שמבזבזת הכי הרבה זמן. כשהפניה חסרה, VBA לא מצליח לפענח שמות פונקציות מובנות, ולכן הוא מסמן שגיאה בשורה שנראית שגרתית לגמרי. מי שמתחיל לתקן את השורה הזו מתקן משהו שלא שבור.
למה הסרת Mark of the Web פותרת, והורדת רמת האבטחה לא?
כי מדובר בשני מנגנונים נפרדים. Mark of the Web הוא סימון שמערכת ההפעלה מוסיפה לקובץ שהורד מדפדפן, התקבל כצרופה או הגיע ממיקום שאינו באזור המהימן - והוא נצמד לקובץ עצמו. הסרת הסימון מטפלת בקובץ אחד ומשאירה את ההגנה פעילה לכל היתר.
הורדת רמת האבטחה במרכז יחסי האמון, לעומת זאת, מבטלת את הבדיקה עבור כל קובץ שייפתח באותו מחשב מעכשיו והלאה - כולל הקובץ הבא שיגיע במייל ולא אתם כתבתם אותו. היא גם לא תמיד עוזרת: קובץ שיושב על שיתוף רשת שאינו באזור Local intranet או ברשימת האתרים המהימנים ייחסם בכל מקרה.
שלוש הדרכים הנכונות, לפי סדר ההיקף:
- קובץ בודד: לחיצה ימנית על הקובץ > Properties > סימון Unblock בלשונית General. אם התיבה לא מופיעה,
Unblock-Fileב-PowerShell מסיר את אותו סימון. - תיקייה קבועה שאתם שולטים בה: הוספתה כ-Trusted Location דרך File > Options > Trust Center > Trust Center Settings.
- מקור חוזר, כמו שרת פנימי: הוספת המיקום לאזור האתרים המהימנים של Windows, כך שקבצים ממנו לא מקבלים את הסימון מלכתחילה.
ההפניה שהפכה ל-MISSING
ב-Alt+F11 > Tools > References, הפניה שלא נפתרה מסומנת בתחילית MISSING:. זה קורה כשה-DLL רשום במחשב אבל הקובץ עצמו הוסר, הועבר או הוחלף בגרסה אחרת - למשל אחרי מעבר מ-Outlook בגרסה אחת לגרסה חדשה יותר.
מה שחשוב לדעת לפני שנוגעים: קובץ שנשמר במחשב עם גרסה חדשה יותר יקבע את ההפניה לאותה גרסה, ואז יישבר במחשב עם הגרסה הישנה. זו הסיבה שהתקלה מופיעה אצל חלק מהמשתמשים ולא אצל כולם, ושהיא חוזרת אחרי ש"תוקנה".
- הסירו את הסימון מהשורה עם
MISSING:ולחצו OK. - הריצו Debug > Compile כדי לראות מה עדיין לא מהודר.
- אם הקוד באמת צריך את הספרייה, סמנו את הגרסה שקיימת במחשב והדרו שוב.
- בקוד שרץ אצל כמה משתמשים עם גרסאות שונות, מעבר ל-Late Binding - הצהרה כ-
Objectו-CreateObject- מוציא את ההפניה מהמשוואה.
32 ל-64 סיביות: ההצהרות שמפסיקות להדר
Office 2010 עד 2016 הותקנו כברירת מחדל ב-32 סיביות. מ-Office 2019 ומ-Microsoft 365 ברירת המחדל היא 64 סיביות. ההבדל נוגע רק לקוד שקורא ישירות ל-Windows API בהצהרת Declare.
בקוד ישן, מצביעים ו-handles הוצהרו כ-Long - טיפוס של 4 בתים. בסביבת 64 סיביות אלה ערכים של 8 בתים, והם ייחתכו. מיקרוסופט הוסיפה שלושה כלים: המילה PtrSafe, שמצהירה שהשורה מיועדת ל-64 סיביות; הטיפוס LongPtr, שמתורגם ל-Long ב-32 סיביות ול-LongLong ב-64; והטיפוס LongLong עצמו.
הצהרה ישנה שנראית כך:
Declare Function GetActiveWindow Lib "user32" () As Long
צריכה להפוך לזו:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
שימו לב לנקודה שמפילה תיקונים חלקיים: הוספת PtrSafe בלבד מרגיעה את המהדר אבל לא מתקנת ערך מוחזר שנשאר Long. הקוד ירוץ ויחזיר ערך קטוע. אם צריך שהקובץ יעבוד בשתי הסביבות, עוטפים ב-#If VBA7 Then ו-#If Win64 Then.
סדר אבחון שלא הורס ראיות
- העתיקו את הקובץ הצידה. כל מה שקורה מכאן קורה על העותק.
- רשמו את נוסח ההודעה המדויק, את גרסת Office ואת הארכיטקטורה (File > Account > About).
- בדקו את מקור הקובץ: הורדה, צרופה, שיתוף רשת או תיקייה מקומית.
- אם ההודעה היא חסימת מאקרו - טפלו בסימון, לא ברמת האבטחה.
- אם המאקרו כן רץ אבל נופל - פתחו Alt+F11 והריצו Debug > Compile לפני שקוראים קוד.
- בדקו את מסך References וחפשו
MISSING:. - רק אם אין הפניה חסרה, חפשו
Declareבכל המודולים ובדקוPtrSafe.
מה בודקים לפני שמכריזים שזה תוקן
- הקובץ נבדק אצל משתמש נוסף, לא רק אצל מי שתיקן.
- הקובץ נבדק מהמיקום שממנו הוא באמת נפתח בשגרה, ולא משולחן העבודה.
- רמת האבטחה חזרה למצבה המקורי, אם שונתה זמנית.
- ההפניות נבדקו במחשב עם הגרסה הישנה ביותר שעדיין בשימוש בארגון.
קובץ מאקרו שהפך לתשתית עסקית ושובר את עצמו בכל עדכון הוא סימן מוכר. אותה שאלה עולה כשגיליון אחד מחזיק תהליך שלם - ראו מתי גיליון גדל מעבר לגודלו, העברת ידע מגיליון של אדם אחד, ושיטה לאיחוד ארבעים גיליונות אקסל.
מקורות
שאלות נפוצות
האם אפשר להסיר את הסימון מכל הקבצים בתיקייה בבת אחת?
כן. הפקודה `Unblock-File` ב-PowerShell מקבלת נתיב ומסירה את ה-Zone.Identifier מכל קובץ שהועבר אליה. עדיין מדובר בפעולה על קבצים קיימים בלבד: קובץ חדש שיורד לאותה תיקייה יקבל את הסימון שוב, אלא אם התיקייה הוגדרה כ-Trusted Location.
למה השגיאה מצביעה על שורה שעבדה שנים?
כשהפניה ב-References לא נפתרת, VBA מאבד את היכולת לפענח שמות של פונקציות מובנות, וסימון השגיאה נוחת על השורה הראשונה שמשתמשת באחת מהן. השורה תקינה. הבעיה היא ההפניה החסרה, והיא תיראה במסך Tools > References עם התחילית MISSING.
איך יודעים אם Office מותקן ב-32 או ב-64 סיביות?
File > Account > About, בכל אפליקציית Office. השורה הראשונה מציינת את הגרסה ואת הארכיטקטורה. הנתון הזה קובע אם הצהרות Declare בקוד חייבות את המילה PtrSafe, ולכן הוא הפרט הראשון שכדאי לרשום לפני שנוגעים בקוד עצמו.
חתימה דיגיטלית על הפרויקט פותרת את זה?
היא פותרת חלק. חתימה בתעודה שמוגדרת כמוציא מהימן מאפשרת הרצה בלי לגעת בכל קובץ בנפרד, וזו הדרך הנכונה בארגון שמפיץ קבצים פנימית. היא אינה מטפלת בהפניה חסרה ואינה מטפלת בהצהרות Declare שלא הותאמו ל-64 סיביות.
להמשך קריאה
שירות רלוונטי
הצלת מערכות אקסס ואקסל
לייצב את הקובץ שהעסק רץ עליו, ואז לתקן אותו או להעביר אותו לווב.
על הכותב
יהונתן סעדיה
מפתח פרילנסר לאוטומציה, אתרים ו-MVP
אני יהונתן סעדיה, מפתח בכיר שבונה אוטומציה עסקית, אתרים מותאמים ומוצרי MVP לעסקים קטנים ובינוניים בארה"ב, אירופה וישראל. המדריכים האלה נכתבים מתוך עבודה אמיתית עם לקוחות, לא מתיאוריה.
בוא נעבוד יחדיש לך פרויקט דומה?
ספר לי מה אתה רוצה לבנות או איזה תהליך להפוך לאוטומטי. אני חוזר תוך 24 שעות עסקים עם כמה שאלות ממוקדות, ואז עוברים על זה יחד בשיחת היכרות חינמית של 30 דקות, בלי התחייבות. בסוף יש לך היקף עבודה, לוח זמנים ומחיר קבוע - או תשובה כנה שלא שווה לבנות את זה.
