Das Clever-Excel-Forum.de - Treffen
... 14.-16. September 2018 im Allgäu ...

Automatische Wiederholung einer Ereignisprozedur
#1
Wer kann mir bei folgendem Problem helfen?

Ich habe in meiner Musikdatenbank über 4000 Lieder enthalten. Dabei kann ich Lieder zum Abspielen auswählen. Die ausgewählten Lieder werden über eine Abfrage in einem Endlosformular aufgelistet.
Mit einem Startbutton kann ich jetzt jedes einzelne Lied abspielen. Ich möchte aber gerne die ausgewählten Lieder automatisch alle hintereinander abspielen.

Die im Button verwendete Prozedur hat folgendes Aussehen:

Private Sub cmdStarten_Click()
    
    Dim objMediaPlayer As WindowsMediaPlayer
    Set objMediaPlayer = Me.ctlMediaPlayer.Object
   
    With objMediaPlayer
    Me!ctlMediaPlayer.URL = Me.Pfad
    End With
    
End Sub

Damit kann ich problemlos einzelne Lieder abspielen. Wie muss die Prozedur aussehen, damit die ausgewählten Lieder hintereinander abgespielt werden

Danke für Eure Hilfe
to top
#2
Hallöchen,

das Problem ist, dass Office nicht so einfach mitbekommt, wann ein Lied zu Ende ist. Wenn Du in Deiner Liste die Laufzeit der Lieder hast, könntest Du in einer Schleife mit der API Sleep oder Application.Wait nach dem Start des Liedes bis zum nächsten warten und dann weiter machen. Das hätte allerdings den Haken, dass bei ungenauen Zeitangaben die Titel entweder abgehackt werden oder Pausen entstehen.

Ich hab so was bei mir in Excel umgesetzt und anders geregelt. Ich schreibe mir eine Playlist (m3u), und starte mit einem Shell-Befehl dann den Mediaplayer mit der Playlist.

Code:
Sub Play_M3U()
'Playlist abspielen
'Variablendeklarationen
Dim strM3U$, m3u, strDrive$
'Laufwerk aufnehmen
strDrive = Split(ThisWorkbook.Path, "\")(0)
'Titelort für M3U zusammensetzen
strM3U = strDrive & "\" & Format(Selection.Cells(1, 1).Row, "00000") & "_" & Split(Selection.Cells(1, 1).Value, "/")(0) & "_" & Format(Date, "YYYYMMDD") & "_" & Format(Now, "hhmm") & ".m3u"
'Textfile oeffnen
Open strM3U For Output As #1
'Alle selektierten Zellen in M3U schreiben
'Schleife uebwer alle selektierten Zellen
For Each Zellen In Selection
  'Titel mit Laufwerk und Pfad eintragen
  Print #1, Replace(Cells(Zellen.Row, 1), "E:", strDrive) & Cells(Zellen.Row, 2) '& vbLf
'Ende Schleife uebwer alle selektierten Zellen
Next
'Textfile schliessen
Close #1
'windowsplayer mit Playlist starten
m3u = Shell("C:\Program Files (x86)\Windows Media Player\wmplayer.exe " & _
" /Listadd """ & strM3U & "", vbNormalFocus)
End Sub
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
to top
#3
Hallo Andre

Deine Prozedur ist offenbar auf Excel zugeschnitten. Ich habe das Ganze aber in Access.
Die Prozedur, die ich eingangs angeführt habe, funktioniert ja im Prinzip problemlos.
Nur muss ich jedes einzelne Lied separat starten. Ich möchte nur, dass sich genau diese
Prozedur sooft wiederholt als Lieder in der Abfrage ausgewählt wurden.
to top
#4
Hallo Herbert,

meine Access-Zeit liegt gut 25 Jahre zurück, daher kann ich nur noch mal meinen Ansatz wiederholen.
Entweder Du gibst eine Playlist aus und spielst diese ab, oder Du musst eine Schleife über die Titel programmieren und dabei die Spieldauer verwenden. Hast Du die Spieldauer nicht in Deiner Tabelle, geht das nicht so einfach, da musst Du sie Dir vor dem Abspielen noch aus der Datei holen.

Wenn Du meinen code auf Deine Bedingungen anpasst, sollte es auch funktionieren.

Hier mal z.B. die Sache mit dem Titel und dem Pfad.

Du übergibst an den Mediaplayer den Pfad einschl Dateiname
Me!ctlMediaPlayer.URL = Me.Pfad

Ich geb das Ding in eine m3u
Print #1, Replace(Cells(Zellen.Row, 1), "E:", strDrive) & Cells(Zellen.Row, 2) '& vbLf

Bei Dir müsste die Zeile dann so aussehen:
Print #1, Me.Pfad

Den Dateinamen für die Playlist mustt Du auch nicht so komplex wie ich machen:

statt
strM3U = strDrive & "\" & Format(Selection.Cells(1, 1).Row, "00000") & "_" & Split(Selection.Cells(1, 1).Value, "/")(0) & "_" & Format(Date, "YYYYMMDD") & "_" & Format(Now, "hhmm") & ".m3u"

z.B.
strM3U = "meineliste.m3u"

usw.

Wie sind denn Deine VBA-Kenntnisse? Kannst Du meine "theoretischen" Vorschläge selbst Umsetzen oder benötigst Du dazu auch Hilfe?
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
to top
#5
Hallo Andre

Ich habe den Ablauf in der Datenbank und mein Problem im Anhang "Ablauf.pdf" dargestellt.
Ich habe die ganze Datenbank an sich fertig und möchte sie gerne in Access behalten.
Ich habe auch eine Vermutung wie das Ganze lösbar wäre, kann aber diese Vermutung nicht
umsetzen, weil meine VBA Kenntnisse nicht soweit reichen.

Danke für Deine Mühe


Angehängte Dateien
.pdf   Ablauf.pdf (Größe: 296,7 KB / Downloads: 7)
to top
#6
Hallo Herbert,

füge mal am Anfang des Moduls folgenden Code ein:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long )


In Deinem Makro verwendest Du das dann so:

Private Sub Befehl15_Click()
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
rs.MoveFirst
Do While Not rs.EOF
Me!ctlMediaPlayer.URL = rs!Pfad
DoEvents
sleep
rs.MoveNext
Loop
End Sub

Wie steht denn Deine Titellänge in der Datenbank?
Als String Min:Sek oder als Zahl in Sekunden oder ... ?
Die Zeit müsstest Du noch in Millisekunden umrechnen.
Das könnte im Prinzip so aussehen (bei Sekunden), wenn das Feld Länge heißen würde:
rs!Länge * 1000
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
to top
#7
Hallo Andre

Danke für Deinen Typ.
Aber ich habe keine Ahnung, was Du mit Anfang des Moduls meinst.
Ich habe kein Modul in dieser Datenbank, ich habe auch kein Makro.
Ich habe lediglich im Abspielformular die angeführten Prozeduren.
to top
#8
Hallo Andre

Deine Hilfe ist mir sehr willkommen. Wenn Du damit einverstanden bist, könnte ich Dir
folgenden Vorschlag machen. Du gibst mir Deine Mailadresse auf meinen Mail account
h.prechtl[ät]aon.at und ich sende Dir einen die gesamte Datenbank, allerdings nur mit
einigen wenigen Liedern. Würdest Du das machen ?
Danke
to top
#9
Hallo Herbert,

Du könntest den Code so schreiben:

Code:
Option Compare Database
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub cmdStarten_Click() 'Befehl15_Click()
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
   rs.MoveFirst
   Do While Not rs.EOF
    Shell ("C:\Programme\Windows Media Player\wmplayer.exe" & " """ & rs!Pfad & """")
   DoEvents
   Stop
   Sleep rs!Länge_Millisek
   rs.MoveNext
   Loop
End Sub

Ich habe hier mal einen Stop-Befehl drin, dadurch pausiert das Abspielen nach jedem Titel im Code. Man müsste sich hier noch was einfallen lassen, wie man das Abspielen unterbrechen kann. Du willst ja bestimmt nicht alle 4000 Titel nacheinander hören?
Diese Variante hat übrigens auch noch den Nachteil, dass bei einem Abspielfehler dann eben über die Titellänger Stillschweigen herrscht :-( Hatte ich hier beim 3. Titel.

Dein ursprünglicher Code basiert übrigens auf dem Mediaplayer-Control, da hab ich aber im Formular keins gefunden.
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
to top
#10
Hallo,

nur als Anregung: Es ließe sich auch die PlayState-Eigenschaft abfragen. Wie z.B. hier: http://www.vb-magazin.de/forums/forums/p...aspx#16677

Gruß Uwe
to top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste