I. La description du lecteur▲
Ce chapitre décrit les éléments constitutifs du lecteur.
La démo complète est téléchargeable au format xla à la fin de ce document.
Un menu personnalisé nommé "XL Music Player" va être ajouté dans Excel lors de l'ouverture du classeur.

Ce menu permet d'afficher le lecteur de CD.
L'UserForm va se placer automatiquement en bas et à droite de l'écran.
Sa taille est volontairement
compacte et de type non modal
pour continuer à travailler dans votre tableur préféré tout en écoutant de la musique...;o)
Le CD audio doit être inséré dans le lecteur avant d'afficher l'UserForm.
Les options de la boîte de dialogue:
*La lecture
*La mise en pause
*L'arrêt du lecteur
*Le passage à la séquence musicale suivante
*Le passage à la séquence musicale précédente
*La modification du volume sonore
*L'éjection du CD
*L'affichage du nombre de titres contenu dans le CD
*L'affichage de la durée totale du CD
*L'affichage de la durée de la séquence en cours
*L'affichage de l'index de la séquence en cours
Remarque:
Les symboles affichés sur certains boutons sont obtenus en appliquant la police Webdings.
II. Les procédures▲
Les premières procédures doivent être placées
dans le module objet ThisWorkbook:
Elles permettent de créer le menu personnalisé lors de l'ouverture du classeur puis de le supprimer
quand vous refermez le classeur.
Option Explicit
'Permet d'ajouter un menu personnalisé dans Excel, lors de l'ouverture
'du classeur.
Private Sub Workbook_Open()
Dim Nouveau As CommandBarControl
On Error Resume Next
Set Nouveau = Application.CommandBars(1).Controls.Add(msoControlPopup, , , , True)
With Nouveau
.Caption = "XL Music Player"
'Attribue une macro à la barre de menu.
.OnAction = "Lancer"
End With
End Sub
'Evenement fermeture classeur.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
'Ferme la boîte de dialogue s'il elle est affichée au moment de la
'fermeture du classeur.
Unload LecteurCD
'Supprime le menu personnalisé lors de la fermeture du classeur
Application.CommandBars(1).Controls("XL Music Player").Delete
End Sub
Ensuite, les fonctions et macros ci dessous sont insérées dans un
module standard:
Option Explicit
Public PresenceCD As Boolean
Public CDenCours As Boolean
'Permet de trouver le Handle du UserForm.
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Permet d'envoyer une commande à l'interface multimédia MCI.
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As Long
'Permet de retrouver la description des erreurs lors de l'utilisation de MCI.
Declare Function mciGetErrorString Lib "winmm.dll" Alias "mciGetErrorStringA" _
(ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long
'La macro "Lancer" est liée au bouton du menu personnalisé "XL Music Player"
Sub Lancer()
On Error GoTo Fin
CDenCours = False
PresenceCD = True
'Affiche l'UserForm (non modal)
LecteurCD.Show 0
'Lance la procédure pour vérifier s'il y a un CD audio dans le lecteur
If PresenceCD = False Or CDenCours = True Then Unload LecteurCD
Fin:
If Err.Number = 91 Then Exit Sub
End Sub
Les procédures suivantes sont placées dans un UserForm nommé "LecteurCD".
La boîte de dialogue contient:
2 labels nommés Label1 et Label2.
7 CommandButton nommés CommandButton1 à CommandButton7.
Option Explicit
'Source: http://www.vbcode.com/asp/showzip.asp?ZipFile=playcd.zip&theID=42
'
Dim Valeur As Long
Dim strFormClassName As String
Dim fPlaying As Boolean, fCDLoaded As Boolean, CtrlEject As Boolean
Dim NbTitres As Integer
Dim DureeTitres() As String
Dim Cmd As String
Dim Mini As Integer, Sec As Integer, Track As Integer
Private Sub UserForm_Initialize()
fCDLoaded = False
CtrlEject = False
' Quitte si le CD est déja utilisé
If SendMCIString("open cdaudio alias cd wait shareable", True) = False Then _
CDenCours = True
Static s As String * 30
' Contrôle si le CD est dans le lecteur
mciSendString "status cd media present", s, Len(s), 0
If CBool(s) = False Then PresenceCD = False
SendMCIString "set cd time format tmsf wait", True
Update
End Sub
Private Sub UserForm_Activate()
With Me 'affiche l'USF en bas et à droite de l'ècran
.Top = Application.Height - Me.Height
.Left = Application.Width - Me.Width
End With
End Sub
Private Function SendMCIString(Cmd As String, fShowError As Boolean) As Boolean
Static Rc As Long
Static errStr As String * 200
'Récupère le Handle de l'Usf: Daniel Klann, mpep
If Val(Application.Version) < 9 Then 'Excel 2000
strFormClassName = "ThunderXFrame"
Else
strFormClassName = "ThunderDFrame" 'Excel 2000/2002
End If
Valeur = FindWindow(strFormClassName, "Lecteur CD") 'Récupère le Handle du UserForm
'************************************************************
If CtrlEject = True Then Exit Function
Rc = mciSendString(Cmd, 0, 0, Valeur)
If fShowError And Rc <> 0 And Len(errStr) <> 200 Then
mciGetErrorString Rc, errStr, Len(errStr)
MsgBox errStr
End If
On Error GoTo 0
SendMCIString = (Rc = 0)
End Function
Private Sub CommandButton1_Click()
' Lecture
SendMCIString "play cd", True
fPlaying = True
End Sub
Private Sub CommandButton2_Click()
' Revenir à la séquence précédente
Dim from As String
If Mini = 0 And Sec = 0 Then
If Track > 1 Then
from = CStr(Track - 1)
Else
from = CStr(NbTitres)
End If
Else
from = CStr(Track)
End If
If fPlaying Then
Cmd = "play cd from " & from
SendMCIString Cmd, True
Else
Cmd = "seek cd to " & from
SendMCIString Cmd, True
End If
Update
End Sub
Private Sub CommandButton3_Click()
' Passer à la séquence suivante
If Track < NbTitres Then
If fPlaying Then
Cmd = "play cd from " & Track + 1
SendMCIString Cmd, True
Else
Cmd = "seek cd to " & Track + 1
SendMCIString Cmd, True
End If
Else
SendMCIString "seek cd to 1", True
End If
Update
End Sub
Private Sub CommandButton4_Click()
' Pause
SendMCIString "pause cd", True
fPlaying = False
Update
End Sub
Private Sub CommandButton5_Click()
' Stop
SendMCIString "stop cd wait", True
Cmd = "seek cd to " & Track
SendMCIString Cmd, True
fPlaying = False
Update
End Sub
Private Sub CommandButton6_Click()
fPlaying = False
'éjecte le CD
SendMCIString "set cd door open", True
CtrlEject = True
Unload Me
End Sub
Private Sub CommandButton7_Click()
'règlage son
Dim R As Long
R = Shell("sndvol32 /t", vbNormalFocus)
End Sub
Private Sub Update()
Dim j As Byte
Dim i As Integer
Dim NumPlage As String
Static s As String * 30
j = 0
' Controle si le CD est dans le lecteur
mciSendString "status cd media present", s, Len(s), 0
If CBool(s) = True Then
If fCDLoaded = False Then
mciSendString "status cd number of tracks wait", s, Len(s), 0
NbTitres = CInt(Mid$(s, 1, 2))
CommandButton6.Enabled = True
If NbTitres = 1 Then Exit Sub
mciSendString "status cd length wait", s, Len(s), 0
Label1 = "Nb de titres: " & NbTitres & " Durée : " & s
ReDim DureeTitres(1 To NbTitres)
'Récupère dans un tableau la durée de chaque titre du CD
For i = 1 To NbTitres
Cmd = "status cd length track " & i
mciSendString Cmd, s, Len(s), 0
DureeTitres(i) = s
Next
For j = 1 To 6
Controls("CommandButton" & j).Enabled = True
Next j
fCDLoaded = True
SendMCIString "seek cd to 1", True
End If
mciSendString "status cd position", s, Len(s), 0
Track = CInt(Mid$(s, 1, 2))
Mini = CInt(Mid$(s, 4, 2))
Sec = CInt(Mid$(s, 7, 2))
'*************************
If Track = 0 Then
MsgBox "impossible de lire ce CD"
Unload Me
Exit Sub
End If
'*************************
NumPlage = "[" & Format(Track, "00") & "]"
Label2 = "Durée du titre " & NumPlage & " : " & DureeTitres(Track)
' vérifie si le CD est en cours de lecture
mciSendString "status cd mode", s, Len(s), 0
fPlaying = (Mid$(s, 1, 7) = "playing")
Else
CommandButton6.Enabled = False
If fCDLoaded = True Then
For j = 1 To 6
Controls("CommandButton" & j).Enabled = False
Next j
fCDLoaded = False
fPlaying = False
Label2 = ""
End If
End If
End Sub
Private Sub UserForm_Terminate()
Cmd = "seek cd to " & Track
SendMCIString Cmd, True
fPlaying = False
Update
SendMCIString "close all", False
End Sub
III. Les macros complémentaires xla▲
Lorsque votre classeur est créé, vous avez la possibilité de l'enregistrer au format xla (macro
complémentaire).
Une macro complémentaire est un fichier Excel, dont les feuilles ne sont pas visibles. Ce type de fichier
est principalement conçu pour stocker des macros.
Il est possible d'activer une macro complémentaire afin qu'elle
se charge automatiquement dès le démarrage d'Excel.
Vous disposez ainsi en permanence des macros contenues dans le fichier.
Pour activer une macro complémentaire:
Utilisez le menu Outils
Macros Complémentaires
Cliquez sur le bouton Parcourir
Sélectionnez le fichier (Par exemple "XL_Music_Player_V01.xla" téléchargeable en fin de tutoriel)
, puis cliquez sur le bouton OK pour valider.
Le classeur est désormais disponible dans la liste des Macros Complémentaires.
Cochez "XL_Music_Player_V01" et cliquez sur le bouton OK pour valider.
Si vous stockez le fichier xla directement dans le répertoire des Macros Complémentaires par défaut,
généralement:
C:\Documents and Settings\NomUtilisateur\Application Data\Microsoft\Macro complémentaires
vous n'avez pas besoin d'utiliser le bouton "Parcourir". Le fichier apparaitra automatiquement dans la
liste des macros complémentaires.
IV. Configurations de test▲
Ce chapitre récapitule les versions du systême d'exploitation et de l'application Excel
utilisées pour les tests:
* WinXP SP1 - Excel2002 : OK
* WinXP SP2 - Excel2002 : OK
* Win XP SP2 - Excel 2003 : OK
* Win2000 SP1 - Excel2000 : Pas OK
* Win2k SP4 - Excel 2003 : OK
* Win XP SP2 - Excel 2007 : OK





