תוכנות שימוש ב WindowsMediaPlayer בקוד VBA

  • הוסף לסימניות
  • #1
האם מישהו ניסה?

אני צריך להפעיל רשימת השמעה מתוך VBA
ושאוכל לקרא את פרטי השיר המנוגן ולהציגם בטופס

ניסיתי להוסיף בREFERENCES כמה הפניות לWindowsMediaPlayer
אבל מכאן אני לא יודע להמשיך.
אם מישהו יודע כמה פקודות בסיסיות של WMP אולי אוכל להמשיך לבד.

לא הצלחתי למצוא עזרה באינטרנט
 
  • הוסף לסימניות
  • #2
ניסית לשאול את chatgpt?
אני שאלתי את gemini של גוגל, וזו תשובתו:

קוד:
אתה צודק, הדרך הקלה ביותר לשלוט בנגן מדיה ב-VBA היא באמצעות ה-Windows Media Player COM object.  הוספת ההפניה ל-`Windows Media Player` ב-VBA Editor (Tools > References) היא הצעד הראשון הנכון.  לאחר מכן, תוכל להשתמש בקוד VBA הבא כדי לשלוט בנגן:

```vba
Sub PlayPlaylist()

  Dim WMP As Object
  Dim Playlist As Object
  Dim MediaItem As Object

  ' יצירת אובייקט של Windows Media Player
  Set WMP = CreateObject("WMPlayer.OCX.7") ' או  CreateObject("WMPlayer.OCX") אם 7 לא עובד

  'טעינת רשימת השמעה (הדרך תלויה בפורמט רשימת ההשמעה שלך, למשל,  מיקום קובץ .WPL)
  ' דוגמה:  הנחה שרשימת ההשמעה נמצאת ב: "C:\MyPlaylist.wpl"
  On Error Resume Next
  Set Playlist = WMP.playlistCollection.load("C:\MyPlaylist.wpl")
  If Err.Number <> 0 Then
    MsgBox "שגיאה בטעינת רשימת ההשמעה.  אנא ודא שהנתיב תקין.", vbCritical
    Exit Sub
  End If
  On Error GoTo 0

  ' הפעלת רשימת ההשמעה
  WMP.controls.play

  ' קריאה ו הצגת פרטי השיר המנוגן
  Do While WMP.playState <> 8 ' 8 = wmppsStopped
    DoEvents ' מאפשר ל-VBA לעדכן את המסך
    ' גישה לפרטי השיר
    Set MediaItem = WMP.currentMedia
    'הצגת הפרטים בטופס (הנחה שיש לך טופס עם תוויות בשמות txtTitle, txtArtist, txtDuration)
      UserForm1.txtTitle.Caption = MediaItem.title
      UserForm1.txtArtist.Caption = MediaItem.artist
      UserForm1.txtDuration.Caption = Format(MediaItem.duration / 1000, "mm:ss") ' duration is in milliseconds
    Loop
 
  ' שחרור משאבים
  Set MediaItem = Nothing
  Set Playlist = Nothing
  Set WMP = Nothing

End Sub
```

**הסברים:**

* **`CreateObject("WMPlayer.OCX.7")`:** יוצר אובייקט של Windows Media Player.  יכול להיות ש-`.7` לא יהיה הכרחי, תלוי בגירסת ה-WMP המותקנת.  נסו ללא המספר אם לא עובד.
* **`WMP.playlistCollection.load("C:\MyPlaylist.wpl")`:**  טוען רשימת השמעה.  החליפו את `"C:\MyPlaylist.wpl"` בנתיב של רשימת ההשמעה שלכם.  תומך בפורמטים כמו `.wpl`, `.m3u`, ועוד.  אם אתם משתמשים בפורמט אחר, תצטרכו להתאים את הקוד בהתאם.
* **`WMP.controls.play`:** מתחיל את ההשמעה של רשימת ההשמעה.
* **`WMP.playState`:**  מאפשר לבדוק את מצב ההשמעה.  8 (`wmppsStopped`)  מציין שנגמרה ההשמעה.  ישנם ערכים אחרים, ראה תיעוד WMP.
* **`WMP.currentMedia`:**  אובייקט המייצג את הפריט הנוכחי המנוגן.
* **`MediaItem.title`, `MediaItem.artist`, `MediaItem.duration`:**  מאפיינים של האובייקט `MediaItem`.  ישנם מאפיינים נוספים, חפשו בתיעוד ה-WMP.
* **`DoEvents`:** קריטי!  זה מאפשר ל-VBA לעדכן את הטופס בזמן שהשמעה פועלת.  ללא זה, הטופס לא יעודכן עד לסיום ההשמעה.
* **`Format(MediaItem.duration / 1000, "mm:ss")`:** ממיר את משך הזמן (במילישניות) לפורמט דקות:שניות.
* **`UserForm1.txtTitle.Caption = ...` וכו':**  הצגה של נתוני השיר בטופס.  החליפו `UserForm1` בשם הטופס שלכם, ו-`txtTitle`, `txtArtist`, `txtDuration` בשמות התוויות בטופס שלכם.


**שימו לב:**  קוד זה מניח שיש לכם טופס VBA (`UserForm`) עם תוויות להצגת המידע.  תצטרכו ליצור את הטופס הזה ולשים בו תוויות עם השמות הנכונים.  בנוסף, הקוד יתמוך רק בקובצי WPL  ממוקמים באופן מקומי.  לגישה לקבצים מרשתות יש צורך בטיפול נוסף.


זכרו להוסיף ניהול שגיאות (`On Error Resume Next` ו-`On Error GoTo 0`)  כדי לטפל בבעיות אפשריות.  זהו קוד בסיסי, ותוכלו להרחיב אותו על ידי הוספת פונקציונליות נוספת בהתאם לצרכים שלכם.
 
  • הוסף לסימניות
  • #6
בינתיים לא עובד לי לא הקוד של GEMINI ולא הקוד של ZZZCODE.
 
  • הוסף לסימניות
  • #7
בzzzcode יש גם אפשרות של בדיקת שגיאות, תנסה לתת לו את הקוד של עצמו.
אולי בהמשך היום יהיה לי גישה לchatgpt ואבדוק
אגב גם לג'מיני יש דרך לגשת בחדר מחשבים, זה קצת יותר מורכב ודורש הרשמה לחשבון בגוגל, צריך לחפש בגוגל "vertex ai"
 
  • הוסף לסימניות
  • #8
בדקתי בבינה אחרת וזו התשובה:
אני אעזור לך לבדוק את הקוד ולתקן אותו. ראשית, בוא נוודא שכל ההגדרות הבסיסיות נכונות.

  1. קודם כל, בוא נוודא שהוספת את ההפניות הנכונות:
  • פתח את ה-VBA Editor (Alt + F11)
  • לך ל-Tools > References
  • וודא שסימנת את ההפניות הבאות:
    • Windows Media Player
    • Microsoft Scripting Runtime
  1. הנה גרסה מתוקנת של הקוד עם טיפול שגיאות טוב יותר:

vba

' פונקציית Sleep להשהייה
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

Sub PlayPlaylist()
Dim WMP As Object
Dim MediaItem As Object

On Error Resume Next

' ניסיון ראשון - גרסה 7
Set WMP = CreateObject("WMPlayer.OCX.7")
If Err.Number <> 0 Then
Err.Clear
' ניסיון שני - ללא מספר גרסה
Set WMP = CreateObject("WMPlayer.OCX")
If Err.Number <> 0 Then
' ניסיון שלישי - גרסה אחרת
Set WMP = CreateObject("MediaPlayer.MediaPlayer.1")
If Err.Number <> 0 Then
MsgBox "לא הצלחתי ליצור את אובייקט נגן המדיה. אנא וודא:" & vbCrLf & _
"1. Windows Media Player מותקן במחשב" & vbCrLf & _
"2. הוספת את ההפניה המתאימה ב-References", vbCritical
Exit Sub
End If
End If
End If

If WMP Is Nothing Then
MsgBox "לא הצלחתי ליצור את אובייקט נגן המדיה", vbCritical
Exit Sub
End If

' הגדרת נתיב לקובץ מדיה (שנה לנתיב שלך)
WMP.URL = "C:\Path\To\Your\Music\File.mp3"
If Err.Number <> 0 Then
MsgBox "שגיאה בטעינת הקובץ: " & Err.Description, vbCritical
Exit Sub
End If

' הפעלת המדיה
WMP.Controls.play
If Err.Number <> 0 Then
MsgBox "שגיאה בהפעלת המדיה: " & Err.Description, vbCritical
Exit Sub
End If

' השהייה באמצעות Sleep
Sleep 1000 ' השהייה של שנייה אחת

' קבלת מידע על השיר
Set MediaItem = WMP.currentMedia
If Not MediaItem Is Nothing Then
With MediaItem
Debug.Print "כותרת: " & .getItemInfo("Title")
Debug.Print "אמן: " & .getItemInfo("Artist")
Debug.Print "אלבום: " & .getItemInfo("Album")
End With
End If

On Error GoTo 0
End Sub


  1. כמה שינויים חשובים שעשיתי:
  • הסרתי את החלק של רשימת ההשמעה בשלב ראשון כדי לפשט את הבדיקה
  • הוספתי טיפול שגיאות מפורט יותר
  • השתמשתי ב-getItemInfo במקום בגישה ישירה למאפיינים
  • הוספתי המתנה קצרה לטעינת המדיה
  1. כדי לבדוק אם הקוד עובד:
  • שנה את הנתיב C:\Path\To\Your\Music\File.mp3 לנתיב של קובץ מוזיקה אמיתי במחשב שלך
  • הרץ את הקוד
  • בדוק את ה-Immediate Window (Ctrl + G ב-VBA Editor) לראות את פרטי השיר
אם אתה עדיין נתקל בשגיאות ספציפיות, אנא ספר לי:

  1. מה השגיאה המדויקת שאתה מקבל?
  2. באיזה שלב השגיאה מתרחשת?
  3. האם אתה מצליח ליצור את אובייקט ה-WMP?
 
נערך לאחרונה ב:
  • הוסף לסימניות
  • #9
בדיוק בזה נתקעתי. לא הצלחתי ליצור מופע של אובייקט WMP.
לא עם הקוד של ג'מיני ולא של ZZZCODE ולא של @צללית123.


אגב @צללית123, למה יש המתנה של שניה אחת לטעינת המדיה?

קוד:
' פונקציית Sleep להשהייה
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
.
.
.

' השהייה באמצעות Sleep
Sleep 1000 ' השהייה של שנייה אחת

  • הוספתי המתנה קצרה לטעינת המדיה



ZZZCODE יוצר את המופע בצורה שונה
א' מצהיר לפני הSUB
ב' התחביר שונה

זה הקוד של ZZZCODE (אופציה א)
קצת שיניתי את הקוד המקורי
קוד:
Dim WithEvents wmp As WMPLib.WindowsMediaPlayer
Dim playlist As WMPLib.IWMPPlaylist
Dim currentIndex As Integer


Private Sub cmdPlay_Click()
'לחצן הפעלת הנגן
    Set wmp = New WMPLib.WindowsMediaPlayer
    Set playlist = wmp.currentPlaylist
    currentIndex = 0 ' Start with the first song
    LoadPlaylist
    UpdateSongDetails
End Sub

Private Sub LoadPlaylist()
    ' Load your playlist here
    Set playlist = wmp.playlistCollection.getByName("myPlaylist")
    ' For demonstration, we will assume the playlist is already set
End Sub

Private Sub UpdateSongDetails()
    Dim previousSong As String
    Dim nextSong As String

    If currentIndex > 0 Then
        previousSong = playlist.Item(currentIndex - 1).Name
    Else
        previousSong = "No previous song"
    End If

    If currentIndex < playlist.Count - 1 Then
        nextSong = playlist.Item(currentIndex + 1).Name
    Else
        nextSong = "No next song"
    End If

    ' Display the details on the form
    Me.lblPrevious.Caption = "Previous Song: " & previousSong
    Me.lblNext.Caption = "Next Song: " & nextSong
End Sub

Private Sub wmp_PlayStateChange(ByVal newState As Integer)
    If newState = 3 Then ' Playing state
        currentIndex = wmp.currentMedia.Index
        UpdateSongDetails
    End If
End Sub

Private Sub cmdNext_Click()
    If currentIndex < playlist.Count - 1 Then
        currentIndex = currentIndex + 1
        wmp.Controls.playItem (playlist.Item(currentIndex))
        UpdateSongDetails
    End If
End Sub

Private Sub cmdPrevious_Click()
    If currentIndex > 0 Then
        currentIndex = currentIndex - 1
        wmp.Controls.playItem (playlist.Item(currentIndex))
        UpdateSongDetails
    End If
End Sub

אופציה ב
הבדלים בעיקר בהצגת פרטי מדיה שונים (ע"פ בקשתי)

קוד:
 Option Explicit

Dim WithEvents wmp As WMPLib.WindowsMediaPlayer
Dim currentIndex As Integer
Dim playlist As WMPLib.IWMPPlaylist

Private Sub cmdPlay_click()
    Set wmp = New WMPLib.WindowsMediaPlayer
    Set playlist = wmp.currentPlaylist
    currentIndex = 0
    wmp.URL = playlist.Item(currentIndex).sourceURL
    UpdateSongDetails
End Sub

Private Sub wmp_PlayStateChange(ByVal newState As Integer)
    If newState = 3 Then ' Playing state
        UpdateSongDetails
    End If
End Sub

Private Sub UpdateSongDetails()
    Dim currentSong As WMPLib.IWMPMedia
    Dim nextSong As WMPLib.IWMPMedia
    Dim previousSong As WMPLib.IWMPMedia

    Set currentSong = playlist.Item(currentIndex)

    ' Display current song details
    Me.lblCurrent.Caption = "Now Playing: " & currentSong.Name & " - " & currentSong.getItemInfo("Artist") & " - " & currentSong.getItemInfo("Album")

    ' Get next song details
    If currentIndex < playlist.Count - 1 Then
        Set nextSong = playlist.Item(currentIndex + 1)
        Me.lblNext.Caption = "Next: " & nextSong.Name & " - " & nextSong.getItemInfo("Artist") & " - " & nextSong.getItemInfo("Album")
    Else
        Me.lblNext.Caption = "Next: None"
    End If

    ' Get previous song details
    If currentIndex > 0 Then
        Set previousSong = playlist.Item(currentIndex - 1)
        Me.lblPreviousSong.Caption = "Previous: " & previousSong.Name & " - " & previousSong.getItemInfo("Artist") & " - " & previousSong.getItemInfo("Album")

    Else
        Me.lblPrevious.Caption = "Previous: None"
    End If
End Sub

Private Sub cmdNext_Click()
    If currentIndex < playlist.Count - 1 Then
        currentIndex = currentIndex + 1
        wmp.URL = playlist.Item(currentIndex).sourceURL
    End If
End Sub

Private Sub cmdPrevious_Click()
    If currentIndex > 0 Then
        currentIndex = currentIndex - 1
        wmp.URL = playlist.Item(currentIndex).sourceURL
    End If
End Sub
 
  • הוסף לסימניות
  • #11
שאלתי את ZZZCODE :
This declaration doesn't work

Dim wmp As WMPLib.WindowsMediaPlayer
Set wmp = New WMPLib.WindowsMediaPlayer​

תרגמתי לעברית בקצרצרה את תשובתו:
  1. בדוק את ההפניות
  2. בדוק איות
  3. ודא את סביבת העבודה
    • סביבה תומכת MEDIA PLAYER
    • OFFICE תומך פקדי ActiveX
  4. הוסף טיפול בשגיאות בקוד (מצורף דוגמה ON ERROR וכו')
  5. בדוק בעיות תאימות: בסביבת 64 ביט לא ניתן להשתמש בהפניות לספריות של 32 ביט - הפתרון לנסות להפעיל את אופיס של 32 ביט
  6. התקן את MEDIA-PLAYER מחדש...
בקיצור מס 3 ומס 5 הם הרלוונטים.
מה עושים?
האם המדיה פלייר הוא 64 ביט? איך יודעים?
 
  • הוסף לסימניות
  • #12
אני שאלתי את CHATGPT לפני התגובה האחרונה שלך, וזו תשובתו
אם הקוד לא מצליח ליצור אובייקט WMP (Windows Media Player), ייתכן שמדובר באחת מהבעיות הבאות:

פתרון 1: בדוק אם Windows Media Player מותקן במחשב​

  1. פתח את לוח הבקרה (Control Panel).
  2. עבור ל- Programs and Features -> Turn Windows features on or off.
  3. ודא ש- Windows Media Player מופעל תחת הקטגוריה Media Features.

פתרון 2: בדוק את ספריית ה-OCX​

ייתכן שקובץ ה-wmplayer.ocx חסר או לא רשום כראוי במערכת.

  1. פתח את שורת הפקודה כמנהל מערכת.
  2. רשום מחדש את הקובץ עם הפקודה:
    cmd
    Copy code
    regsvr32 wmplayer.ocx
  3. אם זה מצליח, נסה להריץ שוב את הקוד.

פתרון 3: נסה עם ספריית COM אחרת​

ייתכן שגרסת ה-OCX שונה. ב-VBA, נסה להשתמש בפקודה הבאה ליצירת האובייקט:

vba
Copy code
Set WMP = CreateObject("WMPlayer.Application")

אם זה מצליח, תוכל להמשיך לעבוד עם ה-API של Windows Media Player.

פתרון 4: נסה ספרייה חלופית​

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




אם עדיין לא עובד:​

  1. האם Windows Media Player מותקן במחשב?
  2. איזו גרסת Windows מותקנת?
  3. האם אתה רואה את Windows Media Player ברשימת ההפניות של VBA? (Tools -> References)
אם תוכל לספק מידע נוסף, אוכל לעזור לך לתקן את הבעיה.
 
  • הוסף לסימניות
  • #13
מצרף התכתבות מעודכנת עם chatgpt
 

קבצים מצורפים

  • 1שליטה ב-WMP ב-VBA.html
    KB 486.6 · צפיות: 35

פרוגבוט

תוכן שיווקי
פרסומת

הצטרפות לניוזלטר

איזה כיף שהצטרפתם לניוזלטר שלנו!

מעכשיו, תהיו הראשונים לקבל את כל העדכונים, החדשות, ההפתעות בלעדיות, והתכנים הכי חמים שלנו בפרוג!

לוח מודעות

הפרק היומי

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


תהילים פרק כה

אלְדָוִד אֵלֶיךָ יי נַפְשִׁי אֶשָּׂא:באֱלֹהַי בְּךָ בָטַחְתִּי אַל אֵבוֹשָׁה אַל יַעַלְצוּ אֹיְבַי לִי:גגַּם כָּל קוֶֹיךָ לֹא יֵבֹשׁוּ יֵבֹשׁוּ הַבּוֹגְדִים רֵיקָם:דדְּרָכֶיךָ יי הוֹדִיעֵנִי אֹרְחוֹתֶיךָ לַמְּדֵנִי:ההַדְרִיכֵנִי בַאֲמִתֶּךָ וְלַמְּדֵנִי כִּי אַתָּה אֱלֹהֵי יִשְׁעִי אוֹתְךָ קִוִּיתִי כָּל הַיּוֹם:וזְכֹר רַחֲמֶיךָ יי וַחֲסָדֶיךָ כִּי מֵעוֹלָם הֵמָּה:זחַטֹּאות נְעוּרַי וּפְשָׁעַי אַל תִּזְכֹּר כְּחַסְדְּךָ זְכָר לִי אַתָּה לְמַעַן טוּבְךָ יי:חטוֹב וְיָשָׁר יי עַל כֵּן יוֹרֶה חַטָּאִים בַּדָּרֶךְ:טיַדְרֵךְ עֲנָוִים בַּמִּשְׁפָּט וִילַמֵּד עֲנָוִים דַּרְכּוֹ:יכָּל אָרְחוֹת יי חֶסֶד וֶאֱמֶת לְנֹצְרֵי בְרִיתוֹ וְעֵדֹתָיו:יאלְמַעַן שִׁמְךָ יי וְסָלַחְתָּ לַעֲוֹנִי כִּי רַב הוּא:יבמִי זֶה הָאִישׁ יְרֵא יי יוֹרֶנּוּ בְּדֶרֶךְ יִבְחָר:יגנַפְשׁוֹ בְּטוֹב תָּלִין וְזַרְעוֹ יִירַשׁ אָרֶץ:ידסוֹד יי לִירֵאָיו וּבְרִיתוֹ לְהוֹדִיעָם:טועֵינַי תָּמִיד אֶל יי כִּי הוּא יוֹצִיא מֵרֶשֶׁת רַגְלָי:טזפְּנֵה אֵלַי וְחָנֵּנִי כִּי יָחִיד וְעָנִי אָנִי:יזצָרוֹת לְבָבִי הִרְחִיבוּ מִמְּצוּקוֹתַי הוֹצִיאֵנִי:יחרְאֵה עָנְיִי וַעֲמָלִי וְשָׂא לְכָל חַטֹּאותָי:יטרְאֵה אוֹיְבַי כִּי רָבּוּ וְשִׂנְאַת חָמָס שְׂנֵאוּנִי:כשָׁמְרָה נַפְשִׁי וְהַצִּילֵנִי אַל אֵבוֹשׁ כִּי חָסִיתִי בָךְ:כאתֹּם וָיֹשֶׁר יִצְּרוּנִי כִּי קִוִּיתִיךָ:כבפְּדֵה אֱלֹהִים אֶת יִשְׂרָאֵל מִכֹּל צָרוֹתָיו:
נקרא  2  פעמים
למעלה