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.wav,three 稱為 3.wav,字母集也是如此。原因是從程式碼中的字串字元可以用來構建要呼叫的檔案的名稱。這允許在迴圈中進行單行呼叫,而與訪問精心命名的檔案列表相比。請參閱 ReadIntegers 過程以瞭解使用方法。顯然,如果沒有配套的 wav 檔案集,此過程對讀者來說用處不大。
- 聲音檔案的 匯入 和 匯出 時間會導致相當生硬的傳遞。為了解決這個問題,請錄製一個儘可能多的聲音檔案,而不是依賴於許多檔案的總和來獲得結果。
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
- Pearson - 播放聲音: Chip Pearson 的頁面,包含更多詳細資訊。(目前仍然有現在過時的 32 位程式碼)
- WavePad 下載 : 免費的聲音檔案編輯器,也可以建立聲音檔案。
- SoundTap 流記錄器 : 揚聲器中任何內容的免費流記錄器。屬於 WavePad 套件的一部分。
- Switch 檔案轉換器 : 免費的檔案型別轉換器。屬於 WavePad 套件的一部分。
- ReadPlease 文字閱讀器 : 免費的優質文字閱讀器。現已停產,所以儘快獲取副本。