MciSendString - fonction non définie

Bonjour,

J'étudie actuellement la fonction mciSendString pour lancer un fichier audio; j'ai récupéré un code sur un forum.

En commençant à regarder le process de déroulement de celui-ci dans la fenêtre variable locales j'ai directement une erreur sur "mciSendString"

Ci-joint le message d"erreur en capture.

4mcisendstring.xlsm (16.29 Ko)
mci erreur de compilation

Bonjour

message d'erreur indiquant que la fonction n'est pas trouvée... en regardant le fichier mis a disposition il semble que la déclaration de la fonction mciSendString soit faite pour un système 64bits...

Donc question : l'ordinateur sur lequel est utilisé est un ordinateur avec Système d'exploitation 64bits ou 32 ??? et le Microsoft office est 64 ou 32 bits ??

a tester donc avec une déclaration pour un ordinateur 32bits ...

voir ici :

https://forum.excel-pratique.com/excel/jouer-mp3-sur-excel-44269#p247534

Fred

Bonsoir,

Effectivement elle est bien déclarée pour un système 64 bits; apparemment le soucis venait du fait que j'avais mis les Private declare function dans un module.

Je n'ai pas compris pourquoi cela posait soucis.

J'aimerais vraiment mieux comprendre cette fonction, car je ne comprends rien au code que j'ai récupéré et ça semble être une fonction très utile pour le contenu multimédia.

Mais dans le code, je bit' pas grande chose de ce qui se passe... et je ne trouve aucun tutoriel d'utilisation/présentation de cette fonction :

"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 = GetShortPathName(ActiveCell.Text)
MsgBox AudioFile
MciError = mciSendString("open" & AudioFile, 0&, 0, 0)
If MciError <> 0 Then
MsgBox ("Erreur MCI : " & MciError)
End If
End Sub
Sub ArretMP3()
Dim AudioFile As String
Dim MciError As Long
AudioFile = GetShortPathName(ActiveCell.Text)
MciError = mciSendString("close all", 0&, 0, 0)
If MciError <> 0 Then
MsgBox ("Erreur MCI : " & MciError)
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 1 Then
If Target <> "" Then
ArretMP3
PlayMP3
Else
ArretMP3
End If
End If
End Sub"

Bonsoir

Private est un argument Facultatif. Il permet de déclarer des procédures disponibles uniquement dans le module dans lequel la déclaration est effectuée. Donc pas exploitable depuis une autre module.. Dans ton cas tu déclarais dans le module 1 et faisait un appel depuis la feuil1... donc logique.. pour plus d'info :

https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/declare-statement

Concernant le code... je vais essayé de faire un peut d'explication (du moins de ce que je comprends...)

POUR :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Target.Column = 1 Then
        If Target <> "" Then
           ArretMP3
           PlayMP3
        Else
            ArretMP3
        End If
    End If
End Sub

Cette partie se lance a chaque fois que quelque chose change dans la feuille, si la cellule cible qui vient d'être sélectionnée est dans la colonne 1 => colonne A et que la cellule n'est pas vide... alors on arrête la lecture en cours pour lire la musique nouvellement sélectionnée.

si la cellule est vide.. alors on arrête la musique

POUR :

Sub ArretMP3()
Dim AudioFile As String
Dim MciError As Long
AudioFile = GetShortPathName(ActiveCell.Text)
MciError = mciSendString("close all", 0&, 0, 0)
   If MciError <> 0 Then
   MsgBox ("Erreur MCI : " & MciError)
   End If
End Sub

pour cette ligne

AudioFile = GetShortPathName(ActiveCell.Text)

elle n'a rien a faire là puisque l'on utilise pas audiofile ensuite... cette ligne peut être supprimée...

MciError = mciSendString("close all", 0&, 0, 0)

Ceci envoi à la sub mciSendString un ordre de fermeture de toutes les fenêtres et elle retourne éventuellement un numéro d'erreur qui est stockée dans Mcierror. SI le retour = 0 c'est tout c'est bien passé, pas d'erreur donc, sinon on affiche le numéro d'erreur et il faudrait dans ce cas creuser un peut plus sur les significations des numéros d'erreur

POUR :

Sub PlayMP3()
   Dim AudioFile As String
   Dim MciError As Long
   AudioFile = GetShortPathName(ActiveCell.Text)
   MciError = mciSendString("open" & AudioFile, "", 0, 0)
   If MciError <> 0 Then
   MsgBox ("Erreur MCI : " & MciError)
   End If
End Sub

Cela concerne la lecture d'un fichier MP3.. On récupère dans la variable Audiofile le nom du fichier avec son chemin avec un formatage spécifique (nécessaire à la sub mciSendString qui attend quelque chose de particulier.)

Edit : il faut que la chaine de caractère finisse par un caractère NULL..

Pointer to a null-terminated string that specifies an MCI command string. For a list, see Multimedia Command Strings.

https://docs.microsoft.com/fr-fr/previous-versions/dd757161(v=vs.85)

Ensuite on lance l'ouverture du fichier a avec l'instruction "open" + le nom du fichier et on récupère le numéro d'erreur en retour.. si tout c'est bien passé le retour = 0 sinon on affiche le numéro d'erreur...

Fred

Bonsoir fred,

Merci pour ta réponse et ton aide détaillée.

Je viens de me pencher pendant un moment sur tout ça mais je n'arrive pas à faire sortir un son ... En fait ça vient du fait, j'ai l'impression, que la chaîne de caractère ne doit pas se terminer par un caractère NULL (du coup j'arrive pas vraiment à savoir ce que c'est, car quand on regarde la page d'aide microsoft ça parle de commande MCI...)

Une autre incompréhension c'est que la variable Mci error puisser être interprété comme une commande. Pourtant il semble juste que l'on charge une viariable nommé MciError d'un contenu non ??

MciError = mciSendString("open" & AudioFile, "", 0, 0)

En tous les cas pour ce qui est de la valeur que j'obtiens pour celle-ci c'est "261"

Pour l'instant je n'arrive pas à comprendre davantage ... j'y rejetterai un coup d'oeil demain matin; peut- être que mes questions seront plus avisées.

Je joins cependant, mon fichier d'exemple avec le code en feuil2 pour la Private et module 3 pour le reste

erreur mci 261

je viens de faire un suivi avec la fenêtre "varaibles locales" et apparemment audioFile ajoute un petit carré comme caractère spécial à la fin de mon fichier après le ".mp3"

et a priori mciError ensuite génère un numéro d'erreur. J'ai fait des recherches sur les caractères spéciaux à mettre dans le nom du fichier mais pff .. Je ne trouve rien du tout

caractere special petit carre

Bonjour

Désolé... mais là cela dépasse mes compétences... j'ai jamais utilisé cela... je regarderais ce soir quand je serais rentré du boulot. Mais.... pas sur que je sois d'une grande aide.

Fred

Effectivement ça a l'air très spécifique. Merci de ton aide :)

Bonjour Fred,

Est ce que tu as pu y jeter un oeil à nouveau du coup ?

Bonsoir..

J'ai essayé mais rien trouvé...

Désolé.

Fred

Bonjour Fred,

Merci en tous les cas pour ton aide. Cette fonction a l'air bien particulière. J'ai essayé en donnant à MCI un AudioFile uniquement composé du nom du fichier via ActiveCell.text mais pareil "Erreur 263"

Je vais refaire un post un peu plus clair sur le sujet mais bon vu le peu de documentation sur le sujet sur le net en dehors de la doc microsoft qui m'est difficilement compréhensible, je vais persévérer à comprendre mais dans la limite du raisonnable ^^

Rechercher des sujets similaires à "mcisendstring fonction definie"