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

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. האטת ריצת קוד vba

האטת ריצת קוד vba

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

    יש לי קוד vba שאני מריץ אותו מדי יום על קובץ אקסל מאוד כבד.

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

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

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

    [יש לציין שניסיתי גם להריץ את הקוד על מחשב סופר מהיר (מעבד i9 דור 13, זיכרון 64gb) והבעיה צצה בדיוק כמו במחשב שלי.]

    M תגובה 1 תגובה אחרונה
    0
    • M מנותק
      M מנותק
      mekev
      השיב למטעמים ב נערך לאחרונה על ידי mekev
      #2

      @מטעמים

      @מטעמים כתב בהאטת ריצת קוד vba:

      אשמח לדעת אם יש דרך לתת לקוד השהיות בפעולה שלו מדי פעם.

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

      Application.Wait (Now + TimeValue("00:00:05"))
      

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

      מ תגובה 1 תגובה אחרונה
      2
      • מ מנותק
        מ מנותק
        מטעמים
        השיב לmekev ב נערך לאחרונה על ידי
        #3

        @mekev כתב בהאטת ריצת קוד vba:

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

        יש אפשרות לתת לו השהיה שבוחנת אם השורה הקודמת בוצעה ורק אז לעבור למטלה הבאה?

        A תגובה 1 תגובה אחרונה
        1
        • איש ימיניא מנותק
          איש ימיניא מנותק
          איש ימיני
          כתב ב נערך לאחרונה על ידי
          #4

          אולי תנסה להוסיף:

          DoEvents
          
          תגובה 1 תגובה אחרונה
          1
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #5

            @מטעמים מאוד מפתה אותי כמתכנת לראות את הקוד, יש סיכוי?

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            מ תגובה 1 תגובה אחרונה
            4
            • A מנותק
              A מנותק
              avi rz
              השיב למטעמים ב נערך לאחרונה על ידי
              #6

              @מטעמים כתב בהאטת ריצת קוד vba:

              יש אפשרות לתת לו השהיה שבוחנת אם השורה הקודמת בוצעה ורק אז לעבור למטלה הבאה?

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

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

              מ תגובה 1 תגובה אחרונה
              2
              • איש ימיניא מנותק
                איש ימיניא מנותק
                איש ימיני
                כתב ב נערך לאחרונה על ידי
                #7

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

                תגובה 1 תגובה אחרונה
                1
                • מ מנותק
                  מ מנותק
                  מטעמים
                  השיב לdovid ב נערך לאחרונה על ידי
                  #8

                  @dovid כתב בהאטת ריצת קוד vba:

                  @מטעמים מאוד מפתה אותי כמתכנת לראות את הקוד, יש סיכוי?

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

                  תגובה 1 תגובה אחרונה
                  0
                  • מ מנותק
                    מ מנותק
                    מטעמים
                    השיב לavi rz ב נערך לאחרונה על ידי מטעמים
                    #9

                    @avi-rz כתב בהאטת ריצת קוד vba:

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

                    נשמע מעניין, תוכל להדגים את זה בקוד?

                    תגובה 1 תגובה אחרונה
                    0
                    • מ מנותק
                      מ מנותק
                      מטעמים
                      כתב ב נערך לאחרונה על ידי
                      #10

                      @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"
                      

                      (בשלבים הבאים הקוד מעתיק נתונים ומחיל עליהם עיצוב נוסחאות וסינונים מסוימים)
                      זו התמונה של המסך מתי שהוא מגיע לנקודה של פתיחת קובץ:
                      86777e39-8356-42d9-9a04-425775564398-image.png
                      ואז:
                      631a8319-53a5-4c7c-8433-ac5510c31fb0-image.png

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

                      @איש-ימיני אשמח אם תוכל להרחיב לגבי מילת הקוד שהבאת, איך אני מכניס אותה. תודה!

                      אורייא תגובה 1 תגובה אחרונה
                      0
                      • איש ימיניא מנותק
                        איש ימיניא מנותק
                        איש ימיני
                        כתב ב נערך לאחרונה על ידי איש ימיני
                        #11

                        תכניס בתוך הלולאה.
                        אני משתמש עם זה כבר הרבה זמן.
                        אתה יכול לחפש על זה בגוגל: VBA code freezes DoEvents
                        אחד מהתוצאות בגוגל

                        תגובה 1 תגובה אחרונה
                        0
                        • dovidD מנותק
                          dovidD מנותק
                          dovid ניהול
                          כתב ב נערך לאחרונה על ידי
                          #12

                          @איש-ימיני, אין בכלל לולאה...

                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                          תגובה 1 תגובה אחרונה
                          3
                          • אורייא מנותק
                            אורייא מנותק
                            אוריי
                            השיב למטעמים ב נערך לאחרונה על ידי אוריי
                            #13

                            @מטעמים כתב בהאטת ריצת קוד vba:

                            אבל שמתי לב שהוא נתקע דוקא מיד בתחילת הקוד בשורה שהוא מבצע פעולת פתיחת קובץ.

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

                            וזו הסיבה שבריצה ע"י F8 הקוד עובד מעולה.

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

                            בהצלחה.

                            ניתן לפנות אלי גם ב al0548446188@gmail.com
                            ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

                            מ תגובה 1 תגובה אחרונה
                            2
                            • מ מנותק
                              מ מנותק
                              מטעמים
                              השיב לאוריי ב נערך לאחרונה על ידי
                              #14

                              @אוריי כתב בהאטת ריצת קוד vba:

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

                              תוכל לתת דוגמה?
                              כי עשיתי מה ש @mekev כתב לעיל:

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

                              Application.Wait (Now + TimeValue("00:00:05"))
                              

                              ולא עזר כ"כ.

                              אורייא תגובה 1 תגובה אחרונה
                              0
                              • אורייא מנותק
                                אורייא מנותק
                                אוריי
                                השיב למטעמים ב נערך לאחרונה על ידי אוריי
                                #15

                                @מטעמים את האמת אני נתקלתי בזה לפני איזה 3 שנים, וזה היה הפתרון.

                                1. איפה בדיוק שמת את הקוד של ההמתנה (באיזו שורה)???
                                2. ולכמה זמן נתנת לו המתנה ומה יקרה אם תתן לו דקה שלימה להמתין.

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

                                ניתן לפנות אלי גם ב al0548446188@gmail.com
                                ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

                                מ תגובה 1 תגובה אחרונה
                                1
                                • מ מנותק
                                  מ מנותק
                                  מטעמים
                                  השיב לאוריי ב נערך לאחרונה על ידי
                                  #16

                                  @אוריי כתב בהאטת ריצת קוד vba:

                                  איפה בדיוק שמת את הקוד של ההמתנה (באיזו שורה)???
                                  ולכמה זמן נתנת לו המתנה ומה יקרה אם תתן לו דקה שלימה להמתין.

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

                                  תודה לכל המסייעים.

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

                                  אורייא תגובה 1 תגובה אחרונה
                                  2
                                  • OdedDvirO מחובר
                                    OdedDvirO מחובר
                                    OdedDvir
                                    כתב ב נערך לאחרונה על ידי OdedDvir
                                    #17

                                    אני יודע שהגעתי מאוחר למסיבה...
                                    @אוריי אתה אבחנת את הבעיה נכון, יפה מאוד!
                                    אבל הפתרון הזה עקום לטעמי,
                                    יש אפשרות יותר אלגנטית להמתין עד שהקובץ יהיה מוכן לכתיבה,
                                    @מטעמים תחליף את שורה 13 בדוגמא שהבאת לעיל, בקוד הבא:

                                    Dim newWb As Workbook
                                    Set newWb = Workbooks.Open(קובץ_מקור & "x", ReadOnly:=False)
                                    Do Until newWb.ReadOnly = False
                                        DoEvents
                                    Loop
                                    ' עכשיו אתה חופשי לבצע פעולות
                                    
                                    תגובה 1 תגובה אחרונה
                                    6
                                    • מ מנותק
                                      מ מנותק
                                      מטעמים
                                      כתב ב נערך לאחרונה על ידי
                                      #18

                                      @OdedDvir זה אכן עזר.

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

                                      OdedDvirO תגובה 1 תגובה אחרונה
                                      1
                                      • OdedDvirO מחובר
                                        OdedDvirO מחובר
                                        OdedDvir
                                        השיב למטעמים ב נערך לאחרונה על ידי
                                        #19

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

                                        Do Until Not Workbooks.Open(SourceFile, ReadOnly:=False).ReadOnly
                                            DoEvents
                                        Loop
                                        ' עכשיו אתה חופשי לבצע פעולות
                                        
                                        תגובה 1 תגובה אחרונה
                                        4
                                        • אורייא מנותק
                                          אורייא מנותק
                                          אוריי
                                          השיב למטעמים ב נערך לאחרונה על ידי אוריי
                                          #20

                                          @OdedDvir יפה מאוד, אני לא הכרתי את זה (למדתי עוד משהו היום 😉 ).

                                          @מטעמים כתב בהאטת ריצת קוד vba:

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

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

                                          ניתן לפנות אלי גם ב al0548446188@gmail.com
                                          ותמיד... אבל תמיד תוכלו לשאול אותי ב :) כאן שאלות באקסל

                                          מ תגובה 1 תגובה אחרונה
                                          0

                                          • 1
                                          • 2
                                          בא תתחבר לדף היומי!
                                          • התחברות

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

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