跳转到内容

Visual Basic for Applications/从 VBA 播放 WAV 文件

来自维基教科书,开放的书籍,开放的世界
  • 此代码模块使用现有的 .wav 文件在 Excel VBA 中播放声音。 许多这样的文件可以在 C:\Windows\Media 文件夹中找到,并且可以使用合适的 VBA 程序从文本中生成。
  • 使用的程序是 API。此 API 代码已针对 Win10 64 位和 Excel 2019 64 位进行了测试,运行良好。

代码说明

[编辑 | 编辑源代码]
  • 最通用的版本适用于所有 VBA,它使用 API 函数 sndPlaySound。该代码通过用户的扬声器播放音频 (WAV) 文件,而不是任何内部蜂鸣器。要播放任何声音,文件必须已存在于用户的 PC 上。在 Excel 中,当用户只需要播放字符串时,内置的 Speak 函数更方便。
  • 请注意,sndPlaySound 使用了 wait 参数。 当组装不打算重叠的离散声音时,该函数可以在允许下一行代码运行之前播放其声音。反之,为了将新音符与旧音符的尾部重叠(如钢琴键的演奏),在声音完成之前允许下一行代码运行。将 Wait 参数设置为 False 将导致代码在完成之前运行。
  • 可以从互联网页面下载 wav 声音文件库。 它们通常按类别组织成压缩文件进行下载。也就是说,一组口语数字、口语字母、钢琴键等。如果理想的集合不可用,那么互联网上有几个免费的 文本到 wav 文件应用程序可以下载,这些应用程序允许从键入的文本中创建声音文件。读者可能希望在 我的讨论 页面中评论高质量文件集。
  • 可以通过按顺序播放声音文件来制作非常复杂的结构。 可能的应用包括针对长时间程序运行的进度提供音频建议,或使用微软已经用于进程打开和关闭的声音标点。有些人会在用户窗体上构建整个钢琴键盘,包括降音和升音键。
  • 打算将整数或字母用作序列进行播放的读者可能会有兴趣知道
    • 如果声音文件的名称以它们代表的字符开头,则代码编写任务将大大简化。 例如,表达 one 声音的文件最好称为 1.wavthree 称为 3.wav,字母集也是如此。原因是从代码中的字符串字符可以用来构建要调用的文件的名称。这允许在循环中进行单行调用,而与访问精心命名的文件列表相比。请参阅 ReadIntegers 过程以了解使用方法。显然,如果没有配套的 wav 文件集,此过程对读者来说用处不大。
    • 声音文件的 导入导出 时间会导致相当生硬的传递。为了解决这个问题,请录制一个尽可能多的声音文件,而不是依赖于许多文件的总和来获得结果。

VBA 代码

[编辑 | 编辑源代码]
Option Explicit

'Declaration for Win10 and Office 64 bit
Public Declare PtrSafe Function sndPlaySound Lib "winmm.dll" _
        Alias "sndPlaySoundA" (ByVal lpszSoundName As String, _
           ByVal uFlags As Long) As Long

Sub TestPlayWavFileAPI()
    'run this to play a sound wave (.wav) file
    
    Dim sPath As String
    
    'path to wave file - replace with your own
    sPath = "C:\Windows\Media\Ring08.wav"
    
    'test the no-wait feature
    PlayWavFileAPI sPath, False
    MsgBox "This message box appears during the sound"
    
    'test the wait feature
    PlayWavFileAPI sPath, True
    MsgBox "This message appears only after the sound stops"

End Sub

Function PlayWavFileAPI(sPath As String, Wait As Boolean) As Boolean
    'API declaration of sndPlaySound is modified for 64 bit windows
    'and tests well in Excel 2019 vba version 7.1.
    'For earlier versions it might be necessary to remove the word PtrSafe
    'from the declaration, or to consider another format.
    
    'make sure file exists
    If Dir(sPath) = "" Then
        Exit Function
    End If
    
    If Wait Then
        'hold up follow-on code until sound complete
        sndPlaySound sPath, 0
    Else
        'continue with code run while sound is playing
        sndPlaySound sPath, 1
    End If

End Function

另请参见

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]
华夏公益教科书