Microsoft 365 fonction mciSendString

Etudiant37000

XLDnaute Nouveau
J'essai actuellement de comprendre comment marche la fonction mciSendString qui apparemment permet de gérer du contenu multimédia.
Microsoft offre quelques infos sur la fonction; mais pour être sincère c'est assez obscure pour moi ....

J'ai découvert cette fonction sur ce post de développez.net :

au post #21

[XL-2007] Lecture d'un fichier .mp3 - Page 2 - Macros et VBA Excel​

hello, Patrick avec un close all cela devrait mieux fonctionner. Comme ceci par exemple : Code : - 1 2 3 4 5 6 7...


Dans mon fichier xcel en feuil2 j'ai mis une adresse de fichier .mp3 dans ma bécane; ça me balance sans arrêt les deux mêmes erreurs, soit la 261 soit la 263.

Visiblement le traitement réalisé par la fontion "GetShortPathName" renvoie un nom de fichier incorrect pour MCI (cf: sur la capture nommée "caractère spécial_pettit carré" on peut voir, dans la console "variables locale" en bas de la fenêtre, qu'après traitement, AudioFile comporte le nom du fichier avec, juste après ".mp3", un petit carré qui s'est ajouté ...)

D'ailleurs je me demande à quoi sert cette fonction GetShortPathName s'appuyant elle-même sur la fonction déclarée en privée "fGetShortPathName" ..?*

Et si je dégage le traitement avec fGetShortPathName et GetshortPathName en chargeant AudioFile de ActiveCell.txt,
ça annonce de nouveau Erreur 263...

Donc cette fonction j'y pige pas grand chose en définitive./


J'espère que tout ce blabla est à peu près clair ^^

Merci

NB : voici le code


"
Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias _
"mciSendStringA" (ByVal lpstrCommand As String, ByVal _
lpstrReturnString As Any, ByVal uReturnLength As Long, ByVal _
hwndCallback As Long) As Long
Private Declare PtrSafe Function fGetShortPathName Lib "kernel32" Alias _
"GetShortPathNameA" (ByVal lpszLongPath As String, ByVal _
lpszShortPath As String, ByVal cchBuffer As Long) As Long
Function GetShortPathName(sLongPathName As String) As String
Dim lLen As Long
Dim sShortPathname As String
If Dir(sLongPathName, vbDirectory) = "" Then Exit Function
sShortPathname = Space$(260)
lLen = fGetShortPathName(sLongPathName, sShortPathname, 260)
'If (lLen = 0) Then Exit Function 'Not needed since DIR was used.
GetShortPathName = sShortPathname
End Function

Sub PlayMP3()
Dim AudioFile As String
Dim MciError As Long
AudioFile = ActiveCell.Text
MciError = mciSendString("play " & AudioFile, 0&, 0, 0)
If MciError <> 0 Then
MsgBox ("Erreur MCI : " & MciError & AudioFile)
End If
End Sub
Sub ArretMP3()
Dim AudioFile As String
Dim MciError As Long
AudioFile = ActiveCell.Text
MciError = mciSendString("close all", 0&, 0, 0)
If MciError <> 0 Then
MsgBox ("Erreur MCI : " & MciError & AudioFile)
End If
End Sub
Sub Sele(ByVal Target As Range)
If Target.Column = 1 Then
If Target <> "" Then
ArretMP3
PlayMP3
Else
ArretMP3
End If
End If
End Sub"

Erreur  MCI 263.jpg
 

Pièces jointes

  • jgrDsp - compteur_jouerLeSon.xlsm
    412.9 KB · Affichages: 6
  • Erreur  MCI 261.jpg
    Erreur MCI 261.jpg
    239.3 KB · Affichages: 10
Solution
bonsoir
ceci fonctionne très bien
VB:
Dim player As Object
 
Sub test()
playMP3 "H:\mes musique\Amy Mc Donald\This is the Life - Amy Mac Donald\02 - This is the life2.mp3"
End Sub

Sub playMP3(chemin)
Set player = CreateObject("new:WMPlayer.OCX.7")
player.URL = chemin
End Sub
 
Sub playerStop()
player.Controls.Stop
End Sub

fanch55

XLDnaute Barbatruc
Bonsoir si c'est pour jouer un son mp3, un vieux classique :
VB:
Public Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _
        ByVal lpszName As String, _
        ByVal hModule As Long, _
        ByVal dwFlags As Long) As Long
Code:
Public Sub Play(File as string)
    If Dir(File) <> vbNullString _
    Then PlaySound File, ByVal 0&, SND_FILENAME Or SND_ASYNC ' On ne joue la musique que si le fichier existe
End Sub
Code:
Public Sub Stop_Play()
    PlaySound vbNullString, 0&, 0&
End Sub
 

Etudiant37000

XLDnaute Nouveau
Bonjour Fanch55

Merci pour ta réponse.
Cependant en essayant je n'ai pas réussi à faire fonctionner cette méthode

Dans le fichier ci-joint j'appelle la fonction Play en Feuil3 dans la procédure "test"

et j'ai déclaré la fonction "Playsound" ainsi que "Play" et "Stop_Play" en module 2. Ca ne lance rien ..

Y a t-il une erreur de ma part ?

Merci de ton aide,
 

Pièces jointes

  • jgrDsp - jouerSon, méthode Fanch55.xlsm
    528.3 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
bonsoir
ceci fonctionne très bien
VB:
Dim player As Object
 
Sub test()
playMP3 "H:\mes musique\Amy Mc Donald\This is the Life - Amy Mac Donald\02 - This is the life2.mp3"
End Sub

Sub playMP3(chemin)
Set player = CreateObject("new:WMPlayer.OCX.7")
player.URL = chemin
End Sub
 
Sub playerStop()
player.Controls.Stop
End Sub
 

fanch55

XLDnaute Barbatruc
Bonjour,
@patricktoulon a donné la solution universelle (wav,mp3,webm)
@Etudiant37000 , une proposition de mise en œuvre selon le dernier classeur joint , si cela te convient, mets le post de Patrick en solution.

VB:
Dim Player As Object
Const AllMusic = 53
Sub Test()
Dim Fd As FileDialog
    Set Fd = Application.FileDialog(msoFileDialogFilePicker)
        With Fd
            .InitialFileName = Getpath(AllMusic) & "\*.*"
            Do
                .AllowMultiSelect = False
                .Filters.Clear
                .Filters.Add "Fichiers Musique", "*.mp3;*.wav;*.webm" ' *.*
                .Title = "Sélection de la musique"
                If Fd.Show = -1 Then
                    PlayerStop
                    playMP3 Fd.SelectedItems(1)
                    .InitialFileName = Fd.SelectedItems(1)
                Else
                    Exit Do
                End If
             Loop
        End With
        PlayerStop
    Set Fd = Nothing
End Sub
Function Getpath(Cible As Variant) As String
    Dim ObjShell As Object
    On Error Resume Next
    Set ObjShell = CreateObject("Shell.Application").Namespace(Cible).self
        If ObjShell Is Nothing Then Getpath = vbNullString Else Getpath = ObjShell.Path
    Set ObjShell = Nothing
End Function

Sub playMP3(chemin)
    Set Player = CreateObject("new:WMPlayer.OCX.7")
    Player.Url = chemin
End Sub
 
Sub PlayerStop()
    If Not Player Is Nothing Then Player.Controls.Stop
End Sub
 

patricktoulon

XLDnaute Barbatruc
Bonjour
dans la version d'etudiant37000
il y ni plus ni moins que ma version vbs dynamique que j'avais mis sur DVP
pour l’arrêter il faut tuer le procc "wscript.exe" dans les taches
je montre aussi comment tuer le procc dans la discussion sur DVP ;)
à copier les chose essayez de les copier en entier ;)

pour l'api ça ne fonctionnera pas avec les MP3
 

Etudiant37000

XLDnaute Nouveau
Bonsoir @Fanch @ Patrick,

Merci pour vos réponses !!
Effectivement Patrick j'ai découvert votre proposition en .VBS il y a quelques semaines et j'ai passé quelques heures à décortiquer pour comprendre comment ça fonctionnait et c'était très intéressant :)

@Fanch : Effectivement, je comprends maintenant le son d'erreur lors de la lecture d'un .mp3; pour les fichiers .Wav tout est ok..
Même si cette méthode ne permet pas de lire d'autre format que les .Wav, c'est tout de même une occasion d'apprendre des choses :
Il ya deux trois trucs sur lesquels je retombe régulièrement ces derniers temps en VBA et qui demeurent encore obscures pour moi :
"Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, _
ByVal dwFlags As Long) As Long
"

Là je comprends qu'on va chercher une fonction dans une librairie et que son vrai nom est "PlaysoundA"
et on choisit d'utiliser les valeurs de 3 variables/paramètres(?) disponibles pour cette fonction (c'est bien ça ?)
Le fait de préciser ByVal sert à ne prendre que la valeur de ?.. (Bon voilà ça c'est une bonne zone d'ombre oO)
lpszName : pour le nom (mais que signifie lpsz??)
hModule : Aucune idée...
dwFlags : en regardant la composition de la Public Sub "Play" je déduis que c'est le paramètre pour déterminer si on lance la lecture en sychrone ou asynchrone..
Mais du coup que signifie le paramètre "SND_FILENAME Or SND_ASYNC"

Je pose pas mal de questions mais je fais des recherches , notamment dans l'aide microsoft, et essaie d'établir des parallèles.

@patrick : J'ai l'impression que tout est clair pour moi dans votre proposition #5 :).
@Fanch : Je teste votre deuxième proposition dès demain matin avant de poser des questions sur ce que je vais peut-être bien comprendre tout seul en suivant l'exécution du code ;)

Au final ce qui ressort comme étant le plus pratique, j'ai l'impression, c'est l'utilisation de l'objet WMP?

mciSendString semble bien loin ... Et tellement compliqué ...

Merci encore :)
 

patricktoulon

XLDnaute Barbatruc
re
ben c'est surtout que des object existent alors pourquoi aller chercher les api
attention dans mon exemple j'utilise le l'ocx de WMP et non l'object WMP


OCX est l'abréviation de "OLE (Object Linking and Embedding) Control Extension".

Il s'agit d'un module de programme indépendant qui peut être utilisé par plusieurs programmes dans un environnement Windows.

Il peut contenir des sous-routines, fonctions et classes implémentables directement dans le programme dans lequel il est référencé.

Remplacés maintenant par les contrôles ActiveX, les OCX sont tout de même encore utilisés et compris par des explorateurs Internet tel qu'Internet Explorer.

en gros il n'a pas d'interface comme le Wmplayer activx
mais c'est facilement remédiable en le construisant dans un userform par exemple
 

Etudiant37000

XLDnaute Nouveau
J'ai remarqué aussi que dans le code en VBS il y avait CreateObject(""WMPlayer.OCX"")" et non new:WMPlayer.OCX.7 comme dans l'exemple que tu donnes ci-dessus
Quelle est la différence entre les deux ? Car si je mets la deuxième syntaxe dans le VBS ça me dit qu'il est impossible pour un composant activeX de créer un objet...
 

Etudiant37000

XLDnaute Nouveau
re
ben c'est surtout que des object existent alors pourquoi aller chercher les api
attention dans mon exemple j'utilise le l'ocx de WMP et non l'object WMP




en gros il n'a pas d'interface comme le Wmplayer activx
mais c'est facilement remédiable en le construisant dans un userform par exemple
Mais du coup qu'est ce qui différencie fondamentalement un objet d'un OCX ?
 

Etudiant37000

XLDnaute Nouveau
Bonsoir @Fanch @ Patrick,

Merci pour vos réponses !!
Effectivement Patrick j'ai découvert votre proposition en .VBS il y a quelques semaines et j'ai passé quelques heures à décortiquer pour comprendre comment ça fonctionnait et c'était très intéressant :)

@Fanch : Effectivement, je comprends maintenant le son d'erreur lors de la lecture d'un .mp3; pour les fichiers .Wav tout est ok..
Même si cette méthode ne permet pas de lire d'autre format que les .Wav, c'est tout de même une occasion d'apprendre des choses :
Il ya deux trois trucs sur lesquels je retombe régulièrement ces derniers temps en VBA et qui demeurent encore obscures pour moi :
"Private Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Long, _
ByVal dwFlags As Long) As Long
"

Là je comprends qu'on va chercher une fonction dans une librairie et que son vrai nom est "PlaysoundA"
et on choisit d'utiliser les valeurs de 3 variables/paramètres(?) disponibles pour cette fonction (c'est bien ça ?)
Le fait de préciser ByVal sert à ne prendre que la valeur de ?.. (Bon voilà ça c'est une bonne zone d'ombre oO)
lpszName : pour le nom (mais que signifie lpsz??)
hModule : Aucune idée...
dwFlags : en regardant la composition de la Public Sub "Play" je déduis que c'est le paramètre pour déterminer si on lance la lecture en sychrone ou asynchrone..
Mais du coup que signifie le paramètre "SND_FILENAME Or SND_ASYNC"

Je pose pas mal de questions mais je fais des recherches , notamment dans l'aide microsoft, et essaie d'établir des parallèles.

@patrick : J'ai l'impression que tout est clair pour moi dans votre proposition #5 :).
@Fanch : Je teste votre deuxième proposition dès demain matin avant de poser des questions sur ce que je vais peut-être bien comprendre tout seul en suivant l'exécution du code ;)

Au final ce qui ressort comme étant le plus pratique, j'ai l'impression, c'est l'utilisation de l'objet WMP?

mciSendString semble bien loin ... Et tellement compliqué ...

Merci encore :)
Pensez-vous qu'il est possible de m'aider à avoir un peu d'éclaircissement sur ces points ? Je viens de demander de l'aide à un ami qui code mais dans les langages qu'il utilise cette syntaxe ne lui est pas du tout familière ...
J'ai essayé de trouver par moi-même mais là je n'arrive pas à faire les liens avec les infos que j'ai eu ..
Je découvre et rien que sur un code comme celui la il ya beaucoup de choses à la fois qui me sont inconnues et donc utiliser la logique et la voie de déduction devient assez compliqué ...
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
299 799
Messages
1 979 189
Membres
206 611
dernier inscrit
Ibrahima Ndoye