Un par de veces en las últimas semanas me han preguntado por la posibilidad de emitir sonidos controlados desde nuestros proyectos de VBA. POr lo que en la entrada del día, explicaré una manera rápida de conseguirlo.
Por supuesto nos podríamos conformar con la instrucción .Beep que emite un sonido sin más al llamarlo en nuestras macros. Por ejemplo:
Sub sonido()
Beep
End Sub
Pero lo que hoy veremos será algo más completo; ya que podremos hacer sonar cualquier sonido que se nos antoje, sin necesidad de ningún reproductor de media.... Lo primero que deberíamos tener es el archivo de sonido (.wav)
Para nuestra macro emplearemos la función API PlaySound que se encuentra en la librería de Windows winmm.dll. Asi que emplearemos la instrucción Declare que se usa en el nivel de módulo para declarar referencias a procedimientos externos que están en una biblioteca de vínculos dinámicos(DLL).
Por tanto en la parte de arriba de nuestro módulo dentro de un proyecto de VBA, antes de cualquier otra sentencia, insertaremos el siguiente código:
Los parámetros asociadas a la variable dwFlags son:
Const SND_SYNC = &H0 ' (por defecto) Reproduce el sonido 'sincrónicamente'. Se interrumpe la ejecución de nuestro código hasta la finalización del sonido!!.
Const SND_ASYNC = &H1 ' Reproduce el sonido 'sincrónicamente'. El código continúa sin necesidad de que el sonido finalice.
Const SND_NODEFAULT = &H2 ' En caso no se encuntre el sonido determinado no reproduciría el sonido por defecto, es decir, no sonaría nada...
Const SND_LOOP = &H8 ' Se reproduce el sonido ininterrumpidamente hasta que se ejecute de nuevo la función.
Const SND_NOSTOP = &H10 ' El sonido no se para antes de reproducir el sonido especificado.
Otras constantes:
Const SND_APPLICATION = &H80
Const SND_ALIAS = &H10000
Const SND_ALIAS_ID = &H110000
Const SND_FILENAME As Long = &H20000
Const SND_MEMORY = &H4
Const SND_NOWAIT = &H2000
Const SND_PURGE = &H40
Const SND_RESOURCE = &H40004
Es posible ver algo más de documentación en la página de Microsoft (ver)
Podemos crear entonces la siguiente macro, dentro de un módulo, que reproduzca el sonido elegido. En el ejemplo he optado por un sonido estándar de Windows (el famoso tada!!), que podemos encontrar en la ruta C:\Windows\Media\
Por supuesto, igualmente podríamos haber asociado nuestra macro a un evento del libro o de la hoja, por ejemplo, cada vez que selecionemos una celda (evento _Worksheet_SelectionChange):
Por supuesto nos podríamos conformar con la instrucción .Beep que emite un sonido sin más al llamarlo en nuestras macros. Por ejemplo:
Sub sonido()
Beep
End Sub
Pero lo que hoy veremos será algo más completo; ya que podremos hacer sonar cualquier sonido que se nos antoje, sin necesidad de ningún reproductor de media.... Lo primero que deberíamos tener es el archivo de sonido (.wav)
Para nuestra macro emplearemos la función API PlaySound que se encuentra en la librería de Windows winmm.dll. Asi que emplearemos la instrucción Declare que se usa en el nivel de módulo para declarar referencias a procedimientos externos que están en una biblioteca de vínculos dinámicos(DLL).
Por tanto en la parte de arriba de nuestro módulo dentro de un proyecto de VBA, antes de cualquier otra sentencia, insertaremos el siguiente código:
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _ (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Los parámetros asociadas a la variable dwFlags son:
Const SND_SYNC = &H0 ' (por defecto) Reproduce el sonido 'sincrónicamente'. Se interrumpe la ejecución de nuestro código hasta la finalización del sonido!!.
Const SND_ASYNC = &H1 ' Reproduce el sonido 'sincrónicamente'. El código continúa sin necesidad de que el sonido finalice.
Const SND_NODEFAULT = &H2 ' En caso no se encuntre el sonido determinado no reproduciría el sonido por defecto, es decir, no sonaría nada...
Const SND_LOOP = &H8 ' Se reproduce el sonido ininterrumpidamente hasta que se ejecute de nuevo la función.
Const SND_NOSTOP = &H10 ' El sonido no se para antes de reproducir el sonido especificado.
Otras constantes:
Const SND_APPLICATION = &H80
Const SND_ALIAS = &H10000
Const SND_ALIAS_ID = &H110000
Const SND_FILENAME As Long = &H20000
Const SND_MEMORY = &H4
Const SND_NOWAIT = &H2000
Const SND_PURGE = &H40
Const SND_RESOURCE = &H40004
Es posible ver algo más de documentación en la página de Microsoft (ver)
Podemos crear entonces la siguiente macro, dentro de un módulo, que reproduzca el sonido elegido. En el ejemplo he optado por un sonido estándar de Windows (el famoso tada!!), que podemos encontrar en la ruta C:\Windows\Media\
Public Sub SonidoControlado()
'definimos dos constantes para localizar la ruta y el nombre del archivo
Const RutaSonido As String = "C:\Windows\Media\" 'la ruta del fichero
Const ArchivoSonido As String = "tada.wav" ' ojo, porque el fichero de sonido debe tener extensión wave
Dim Sonido As String
'construimos la ruta completa del archivo de sonido
Sonido = RutaSonido & ArchivoSonido
'llamamos a la función sndPlaySound32
Call PlaySound(Sonido, &H1, &H1 Or &H20000)
End SubPor supuesto, igualmente podríamos haber asociado nuestra macro a un evento del libro o de la hoja, por ejemplo, cada vez que selecionemos una celda (evento _Worksheet_SelectionChange):
Private Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'definimos dos constantes para localizar la ruta y el nombre del archivo
Const RutaSonido As String = "C:\Windows\Media\" 'la ruta del fichero
Const ArchivoSonido As String = "tada.wav" ' ojo, porque el fichero de sonido debe tener extensión wave
Dim Sonido As String
'construimos la ruta completa del archivo de sonido
Sonido = RutaSonido & ArchivoSonido
'llamamos a la función sndPlaySound32
Call PlaySound(Sonido, &H1, &H1 Or &H20000)
End Sub


















