האטת ריצת קוד vba
-
@avi-rz כתב בהאטת ריצת קוד vba:
במידה והוא עובר על לולאה מסויימת
הוא לא.
@avi-rz כתב בהאטת ריצת קוד vba:
כמובן היה יותר טוב להסביר יותר מה הקוד עושה
אכן, קשה לי להסביר מה הוא עושה כיוון שאני לא יכול להעלות אותו בשלמותו (מכמה סיבות)
אבל שמתי לב שהוא נתקע דוקא מיד בתחילת הקוד בשורה שהוא מבצע פעולת פתיחת קובץ.
זה תחילת הקוד:' משתנה - שם +נתיב תיקיית הקובץ Dim קובץ_מקור As String קובץ_מקור = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name ' שמירה בשם, אותו שם, אותו נתיב קובץ, הוספת שם הסיומת, החלפת הפורמט Application.DisplayAlerts = False ActiveWorkbook.SaveAs קובץ_מקור & "x", 51 Application.DisplayAlerts = True ' סגירת הקובץ הישן ActiveWindow.Close ' מחיקת הקובץ הישן Kill קובץ_מקור ' פתיחת הקובץ החדש Workbooks.Open קובץ_מקור & "x"
(בשלבים הבאים הקוד מעתיק נתונים ומחיל עליהם עיצוב נוסחאות וסינונים מסוימים)
זו התמונה של המסך מתי שהוא מגיע לנקודה של פתיחת קובץ:
ואז:
לאחר מכן, לפעמים הוא משלים את פעולתו - אבל חוזר לחיים רק לאחר דקה וחצי. ולפעמים הוא פשוט סוגר את התוכנה ומפעיל מחדש.
@איש-ימיני אשמח אם תוכל להרחיב לגבי מילת הקוד שהבאת, איך אני מכניס אותה. תודה!
-
תכניס בתוך הלולאה.
אני משתמש עם זה כבר הרבה זמן.
אתה יכול לחפש על זה בגוגל: VBA code freezes DoEvents
אחד מהתוצאות בגוגל -
@מטעמים כתב בהאטת ריצת קוד vba:
אבל שמתי לב שהוא נתקע דוקא מיד בתחילת הקוד בשורה שהוא מבצע פעולת פתיחת קובץ.
הבעיה היא כך
המחשב פותח את הקובץ ולאחר מכן אתה מסתמא מבקש שגם יגש לקובץ שהמחשב פתח ויעשה בו פעולות.
מה שקורה זה שהמחשב שלך לא מצליח לסיים לפתוח את הקובץ, וכבר הקוד vba שלך שולח בקשה לבצע פעולה בקובץ ומשום שהוא לא מצליח אז הוא קורס....וזו הסיבה שבריצה ע"י F8 הקוד עובד מעולה.
והפתרון לזה הוא להכניס לאחר הקוד של פתיחת הקובץ קוד של טיימר של לולאה שמחכה זמן מסויים לאחר פתיחת הקובץ עד שבוודאות הקובץ נפתח ואז תוכל לגשת לקובץ ולעשות בו פעולות.
(אני לא יודע מה השימוש שלך בקובץ שאתה פותח אבל אם זה שליפת נתונים לפעמים אפשרי לשלוף אותם ללא פתיחת הקובץ כלל).בהצלחה.
-
@אוריי כתב בהאטת ריצת קוד vba:
להכניס לאחר הקוד של פתיחת הקובץ קוד של טיימר של לולאה שמחכה זמן מסויים לאחר פתיחת הקובץ עד שבוודאות הקובץ נפתח ואז תוכל לגשת לקובץ ולעשות בו פעולות.
תוכל לתת דוגמה?
כי עשיתי מה ש @mekev כתב לעיל:ניתן להוסיף השהיה
באמצעות הקוד הבא
(הפוקנציה עוצרת עד לשעה המבוקשת, ע"מ להשיג השהיה של זמן נוכחי תוך כדי הרצת הקוד מוסיפים את הnow+)Application.Wait (Now + TimeValue("00:00:05"))
ולא עזר כ"כ.
-
@מטעמים את האמת אני נתקלתי בזה לפני איזה 3 שנים, וזה היה הפתרון.
- איפה בדיוק שמת את הקוד של ההמתנה (באיזו שורה)???
- ולכמה זמן נתנת לו המתנה ומה יקרה אם תתן לו דקה שלימה להמתין.
אין לי כרגע גישה לקובץ שאיתו היה לי את הבעיה בכדי לבדוק מה בדיוק עשיתי ועם איזה קוד השתמשתי.
-
@אוריי כתב בהאטת ריצת קוד vba:
איפה בדיוק שמת את הקוד של ההמתנה (באיזו שורה)???
ולכמה זמן נתנת לו המתנה ומה יקרה אם תתן לו דקה שלימה להמתין.עשיתי ממש עכשיו כמה ניסיונות,
בסופו של דבר...
העתקתי את השורת קוד כמו שהיא (5 שניות) והדבקתי 4 פעמים לאורך הקוד. והופ.. רץ יפה והאקסל לא נכנס לקיפאון; אמנם זמן העיבוד ממושך קצת (20 שניות זה המון) אבל מה שחשוב לי שהוא לא קורס.תודה לכל המסייעים.
אגב, שלחתי את הקוד ל-@dovid באישי, ואצלו זה כן עבד יפה מלכתכילה. אני מניח שאחד הרכיבים במחשבים שלי קורס, אולי כרטיס מסך לא מספק.
-
אני יודע שהגעתי מאוחר למסיבה...
@אוריי אתה אבחנת את הבעיה נכון, יפה מאוד!
אבל הפתרון הזה עקום לטעמי,
יש אפשרות יותר אלגנטית להמתין עד שהקובץ יהיה מוכן לכתיבה,
@מטעמים תחליף את שורה 13 בדוגמא שהבאת לעיל, בקוד הבא:Dim newWb As Workbook Set newWb = Workbooks.Open(קובץ_מקור & "x", ReadOnly:=False) Do Until newWb.ReadOnly = False DoEvents Loop ' עכשיו אתה חופשי לבצע פעולות
-
@OdedDvir יפה מאוד, אני לא הכרתי את זה (למדתי עוד משהו היום ).
@מטעמים כתב בהאטת ריצת קוד vba:
אגב, שלחתי את הקוד ל-@dovid באישי, ואצלו זה כן עבד יפה מלכתכילה. אני מניח שאחד הרכיבים במחשבים שלי קורס, אולי כרטיס מסך לא מספק.
מעניין לדעת האם אפשר לבדוק למה המחשב קורס ואיזה רכיב כשל?