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

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

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

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

מתוזמן נעוץ נעול הועבר תכנות
15 פוסטים 5 כותבים 826 צפיות 5 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מ מנותק
    מ מנותק
    מטעמים
    כתב ב נערך לאחרונה על ידי
    #3

    יש תיעוד של מיקרוסופט כיצד לשלוח קיצורי מקלדת:
    https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/sendkeys-statement

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

    (לדעתי [ואני ממש לא בטוח בזה] ההסבר הוא, שזה לא קוד אמיתי, בקוד אמיתי יש סדר פעולות ברור, לעולם התוכנה לא תריץ את שורה 3 לפני שורה 2, אבל כאן, התוכנה שולחת סדרה של קיצורי מקלדת ללא כל קשר לתוכן פעולתם)

    תגובה 1 תגובה אחרונה
    1
    • האדם החושבה האדם החושב

      הביאו לי כאן את המאקרו הבא:

      Option Explicit 
      Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
      (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
      ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
       Sub OpenWebPage() 
         Dim url As String    
      url = "https://www.example.com" 'Replace with the URL of the webpage you want to open    ShellExecute 0, "open", url, vbNullString, vbNullString, vbNormalFocus
      End Sub
      

      הבעיה היא שאני צריך להדביק טקסט מלוח ההעתקה בתוכנה האחרת ,איך עושים את זה?
      [נפק"מ למאקרו שיחפש באוצר החכמה את הטקסט המועתק ,אולי אם כבר עדיף את הטקסט המודגש ,מכיון שאני יכול להוסיף את זה לתפריט ההקשר] בארד וצ'אט gpt הציעו לי להשתמש בsend key ,השאלה היא איך עושים את זה בדיוק
      בתודה מראש

      מ מנותק
      מ מנותק
      מטעמים
      כתב ב נערך לאחרונה על ידי מטעמים
      #4

      @האדם-החושב כתב בפקודת מאקרו בוורד שפותחת תוכנה אחרת ויכולה לעשות פעולות בתוך התוכנה האחרת:

      למאקרו שיחפש באוצר החכמה את הטקסט המועתק

      ניסיתי לתת לו פקודת מאקרו פשוטה לפתוח את תוכנת לוח שנה ולרדת כמה משבצות:

      Sub OpenKaluach3()
      
      Shell "C:\Program Files (x86)\Kaluach3\Kaluach3.exe"
      
      SendKeys "{DOWN}"
      SendKeys "{DOWN}"
      SendKeys "{DOWN}"
      SendKeys "{DOWN}"
      
      
      End Sub
      
      תגובה 1 תגובה אחרונה
      2
      • OdedDvirO מחובר
        OdedDvirO מחובר
        OdedDvir
        כתב ב נערך לאחרונה על ידי
        #5

        כמו שציין @dovid, ניתן להשתמש בפונקציה SendKeys.
        בהנחה שהתוכנה פתוחה, אפשר לעבור אליה על ידי ציון שמה על ידי פונקציה נוספת: AppActivate.
        הנה דוגמא בסיסית להעתקה של הבחירה בוורד לתוך VSCode:

        Sub PasteInVisualStudioCode()
            SendKeys "^C", True
            AppActivate "Visual Studio Code", True
            SendKeys "^V", True
        End Sub
        

        הערות:

        1. הפרמטר השני True (בשתי הפונקציות) גורם לקוד להמתין עד לסיום הפעולה, אחרת עלול להווצר מצב דומה לזה שציין @מטעמים.
        2. בקוד הנ"ל אין בדיקה האם VSCode פתוח כבר. במקרה שלא - תקפוץ שגיאה.
        האדם החושבה תגובה 1 תגובה אחרונה
        6
        • OdedDvirO OdedDvir

          כמו שציין @dovid, ניתן להשתמש בפונקציה SendKeys.
          בהנחה שהתוכנה פתוחה, אפשר לעבור אליה על ידי ציון שמה על ידי פונקציה נוספת: AppActivate.
          הנה דוגמא בסיסית להעתקה של הבחירה בוורד לתוך VSCode:

          Sub PasteInVisualStudioCode()
              SendKeys "^C", True
              AppActivate "Visual Studio Code", True
              SendKeys "^V", True
          End Sub
          

          הערות:

          1. הפרמטר השני True (בשתי הפונקציות) גורם לקוד להמתין עד לסיום הפעולה, אחרת עלול להווצר מצב דומה לזה שציין @מטעמים.
          2. בקוד הנ"ל אין בדיקה האם VSCode פתוח כבר. במקרה שלא - תקפוץ שגיאה.
          האדם החושבה מנותק
          האדם החושבה מנותק
          האדם החושב
          כתב ב נערך לאחרונה על ידי
          #6

          @OdedDvir מסתבר שזה לא יעבוד באוצר החכמה בלי להוסיף אותו למשתני הסביבה ,לא?

          OdedDvirO תגובה 1 תגובה אחרונה
          0
          • האדם החושבה האדם החושב

            @OdedDvir מסתבר שזה לא יעבוד באוצר החכמה בלי להוסיף אותו למשתני הסביבה ,לא?

            OdedDvirO מחובר
            OdedDvirO מחובר
            OdedDvir
            כתב ב נערך לאחרונה על ידי
            #7

            @האדם-החושב הפקודה AppActivate אינה תלויה במשתני הסביבה, רק בשם האפליקציה.
            הפקודה הנ"ל פשוט מחפשת את החלון עם השם המתאים והופכת אותו ליישום הפעיל (ציינתי שכתנאי מקדים האפליקציה חייבת להיות פתוחה ברקע)

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

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

              Option Explicit
              
              Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
              (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
              ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
              
              Sub OpenWebPage()
                  SendKeys "^C", True 'העתק בחירה
                  Dim url As String
                  url = "C:\Program Files (x86)\ResponsaCD25\RESPONSA.exe" 'Replace with the URL of the webpage you want to open
                  ShellExecute 0, "open", url, vbNullString, vbNullString, vbNormalFocus 'הפעל את בר אילן
                  SendKeys "^O", True 'פתח חיפוש
                  SendKeys "^V", True 'הדבק
                  SendKeys "{ENTER}", True 'בצע חיפוש
              End Sub
              

              אני מקבל את השגיאה הבאה:
              מתמחים.png
              [ניסיתי את זה על בר אילן 25 ,גם כשניסיתי לפתוח את התוכנה ע"י הקלדת הנתיב בcmd קיבלתי את אותה שגיאה]

              ב:

              Sub חיפוש_בספרים_בר_אילן()
              SendKeys "^C", True 'העתק בחירה
              Shell "C:\Program Files (x86)\ResponsaCD25\RESPONSA.exe", True 'הפעל את בר אילן
              SendKeys "^O", True 'פתח חיפוש
              SendKeys "^V", True 'הדבק
              SendKeys "{ENTER}", True 'בצע חיפוש
              
              End Sub
              

              ג:

              Sub חיפוש_בספרים_בר_אילן()
                  SendKeys "^C", True 'העתק בחירה
              AppActivate "RESPONSA", True 'הפעל את בר אילן
                  SendKeys "^O", True 'פתח חיפוש
                  SendKeys "^V", True 'הדבק
                  SendKeys "{ENTER}", True 'בצע חיפוש
              End Sub
              

              בשניהם קיבלתי את השגיאה הבאה:
              תחומים 2.png
              @OdedDvir
              אולי לא הכנסתי את ה AppActivate הנכון? ,איפה אני רואה אותו [הכנסתי לפי מה שמופיע במנהל המשימות]

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

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

                Private Function GetFirstPid(applicationName As String) As Long
                'Returns the FIRST PID of an application by it's name
                    Dim services As Object, processes As Object, process As Object
                    Dim resultPid As Long
                
                    Set services = GetObject("winmgmts:\\.\root\CIMV2")
                    Set processes = services.ExecQuery("SELECT ProcessID FROM Win32_Process WHERE name like ""%" & applicationName & "%""", , 48)
                
                    For Each process In processes
                       resultPid = process.ProcessID
                       Exit For ' Just the first ID please :)
                    Next
                    ' Garbage cleanup
                    Set processes = Nothing
                    Set services = Nothing
                    
                    GetFirstPid = resultPid
                End Function
                
                Sub CopyAndPasteInResponsa()
                    Selection.Copy
                    Dim AppPid As Long
                    AppPid = GetFirstPid("Responsa")
                    If (AppPid = 0) Then
                        AppPid = Shell("C:\Program Files (x86)\ResponsaCD25\RESPONSA.exe", 1)
                    End If
                    AppActivate AppPid
                    SendKeys ("^C")
                End Sub
                
                
                האדם החושבה תגובה 1 תגובה אחרונה
                3
                • OdedDvirO OdedDvir

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

                  Private Function GetFirstPid(applicationName As String) As Long
                  'Returns the FIRST PID of an application by it's name
                      Dim services As Object, processes As Object, process As Object
                      Dim resultPid As Long
                  
                      Set services = GetObject("winmgmts:\\.\root\CIMV2")
                      Set processes = services.ExecQuery("SELECT ProcessID FROM Win32_Process WHERE name like ""%" & applicationName & "%""", , 48)
                  
                      For Each process In processes
                         resultPid = process.ProcessID
                         Exit For ' Just the first ID please :)
                      Next
                      ' Garbage cleanup
                      Set processes = Nothing
                      Set services = Nothing
                      
                      GetFirstPid = resultPid
                  End Function
                  
                  Sub CopyAndPasteInResponsa()
                      Selection.Copy
                      Dim AppPid As Long
                      AppPid = GetFirstPid("Responsa")
                      If (AppPid = 0) Then
                          AppPid = Shell("C:\Program Files (x86)\ResponsaCD25\RESPONSA.exe", 1)
                      End If
                      AppActivate AppPid
                      SendKeys ("^C")
                  End Sub
                  
                  
                  האדם החושבה מנותק
                  האדם החושבה מנותק
                  האדם החושב
                  כתב ב נערך לאחרונה על ידי
                  #10

                  @OdedDvir עכשיו אני מקבל את השגיאה הזאת:
                  93773509-53c0-4cec-a740-7a30c76c9f09-image.png
                  וכשלחצתי על הודעה מפורטת זה מה שהופיע לי:
                  dba02932-35f3-480b-8667-64ef0bb3a579-image.png
                  כשהרצתי את זה כשהתוכנה היתה פתוחה החלון של התוכנה נפתח ,אבל לא נפתח לי החלון חיפוש [שנפתח ע"י קונטרול Q]
                  הקוד היה כזה:

                  Private Function GetFirstPid(applicationName As String) As Long
                  'Returns the FIRST PID of an application by it's name
                      Dim services As Object, processes As Object, process As Object
                      Dim resultPid As Long
                   
                      Set services = GetObject("winmgmts:\\.\root\CIMV2")
                      Set processes = services.ExecQuery("SELECT ProcessID FROM Win32_Process WHERE name like ""%" & applicationName & "%""", , 48)
                   
                      For Each process In processes
                         resultPid = process.ProcessID
                         Exit For ' Just the first ID please :)
                      Next
                      ' Garbage cleanup
                      Set processes = Nothing
                      Set services = Nothing
                      
                      GetFirstPid = resultPid
                  End Function
                   
                  Sub חיפוש_בספרים()
                      Selection.Copy
                      Dim AppPid As Long
                      AppPid = GetFirstPid("Responsa")
                      If (AppPid = 0) Then
                          AppPid = Shell("C:\Program Files (x86)\ResponsaCD25\RESPONSA.exe", 1)
                      End If
                      AppActivate AppPid
                      SendKeys "^O", True
                      SendKeys "^V", True 'הדבק
                      SendKeys "{ENTER}", True 'בצע חיפוש
                  End Sub
                  

                  כלומר הוא מריץ את זה לפני שהתוכנה נפתחת?
                  תודה רבה

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

                    @האדם-החושב

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

                      כלומר הוא מריץ את זה לפני שהתוכנה נפתחת?

                    4. לא הבנתי את השאלה.
                    האדם החושבה תגובה 1 תגובה אחרונה
                    1
                    • OdedDvirO OdedDvir

                      @האדם-החושב

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

                        כלומר הוא מריץ את זה לפני שהתוכנה נפתחת?

                      4. לא הבנתי את השאלה.
                      האדם החושבה מנותק
                      האדם החושבה מנותק
                      האדם החושב
                      כתב ב נערך לאחרונה על ידי
                      #12

                      @OdedDvir

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

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

                      לא ציינת איזו שורה גורמת לשגיאה.

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

                      לא הבנתי את השאלה

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

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

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

                        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                        OdedDvirO תגובה 1 תגובה אחרונה
                        3
                        • dovidD dovid

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

                          OdedDvirO מחובר
                          OdedDvirO מחובר
                          OdedDvir
                          כתב ב נערך לאחרונה על ידי OdedDvir
                          #14

                          @dovid כתב בפקודת מאקרו בוורד שפותחת תוכנה אחרת ויכולה לעשות פעולות בתוך התוכנה האחרת:

                          @OdedDvir נדמה לי שזה בגלל שהCurrent Directory שלו לא מצביע על התיקיה של פרוייקט השות.

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

                          Sub CopyAndPasteInResponsa()
                              Selection.Copy
                              Dim AppPid As Long
                              AppPid = GetFirstPid("Responsa")
                              If (AppPid = 0) Then
                                  ChDir "C:\Program Files (x86)\ResponsaCD25"
                                  AppPid = Shell("RESPONSA.exe", 1)
                              End If
                              AppActivate AppPid
                              SendKeys "^Q", True
                              SendKeys "^C", True
                          End Sub
                          

                          הוספתי גם את הלחיצה על Q^ לפני ההדבקה.

                          ד תגובה 1 תגובה אחרונה
                          4
                          • OdedDvirO OdedDvir

                            @dovid כתב בפקודת מאקרו בוורד שפותחת תוכנה אחרת ויכולה לעשות פעולות בתוך התוכנה האחרת:

                            @OdedDvir נדמה לי שזה בגלל שהCurrent Directory שלו לא מצביע על התיקיה של פרוייקט השות.

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

                            Sub CopyAndPasteInResponsa()
                                Selection.Copy
                                Dim AppPid As Long
                                AppPid = GetFirstPid("Responsa")
                                If (AppPid = 0) Then
                                    ChDir "C:\Program Files (x86)\ResponsaCD25"
                                    AppPid = Shell("RESPONSA.exe", 1)
                                End If
                                AppActivate AppPid
                                SendKeys "^Q", True
                                SendKeys "^C", True
                            End Sub
                            

                            הוספתי גם את הלחיצה על Q^ לפני ההדבקה.

                            ד מנותק
                            ד מנותק
                            דאציג
                            כתב ב נערך לאחרונה על ידי דאציג
                            #15
                            פוסט זה נמחק!
                            תגובה 1 תגובה אחרונה
                            0
                            תגובה
                            • תגובה כנושא
                            התחברו כדי לפרסם תגובה
                            • מהישן לחדש
                            • מהחדש לישן
                            • הכי הרבה הצבעות


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

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

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