HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Entdecke rund 2 Millionen Excel-Lösungen im
Forumsarchiv
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Kaum Excel/VBA-Kenntnisse
Alwin Weisangler
20.06.2026 16:05:04
AW: Sprachausgabe in Excel
Hallo,

weil es nun mal spannend ist, hier eine weitere und flexiblere API-Lösung zu diesem Thema.
zum Testen mit 3 Files.


Option Explicit
Private Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As LongPtr) As Long

Dim WiedergabeListe As Collection, AktuellerIndex&, ResumePosition&, AktuellesWav$, PauseAktiv As Boolean, Abbruch As Boolean

Sub TextToWav(text As String, wavPath As String)
Dim spk As Object, fil As Object
mciSendString "close mywav", 0, 0, 0
Set spk = CreateObject("SAPI.SpVoice")
Set fil = CreateObject("SAPI.SpFileStream")
fil.Open wavPath, 3, False
Set spk.AudioOutputStream = fil
spk.Speak text
fil.Close
End Sub

Sub SpieleAktuellesWav()
If AktuellerIndex > WiedergabeListe.Count Then Exit Sub
AktuellesWav = WiedergabeListe(AktuellerIndex)
mciSendString "close mywav", 0, 0, 0
mciSendString "open """ & AktuellesWav & """ type waveaudio alias mywav", 0, 0, 0
mciSendString "play mywav", 0, 0, 0
PruefeWiedergabe
End Sub

Sub PauseWiedergabe()
PauseAktiv = True
mciSendString "pause mywav", 0, 0, 0
End Sub

Sub WeiterWiedergabe()
PauseAktiv = False
mciSendString "resume mywav", 0, 0, 0
PruefeWiedergabe
End Sub

Sub StopWiedergabe()
Abbruch = True
PauseAktiv = False
mciSendString "stop mywav", 0, 0, 0
mciSendString "close mywav", 0, 0, 0
End Sub

Function GetMciPosition() As Long
Dim ret As String * 32
mciSendString "status mywav position", ret, 32, 0
GetMciPosition = Val(ret)
End Function

Function GetMciLength() As Long
Dim ret As String * 32
mciSendString "status mywav length", ret, 32, 0
GetMciLength = Val(ret)
End Function

Sub PruefeWiedergabe()
Dim pos&, total&, t#
If PauseAktiv Or Abbruch Then Exit Sub
pos = GetMciPosition()
total = GetMciLength()
If pos >= total Then
AktuellerIndex = AktuellerIndex + 1
SpieleAktuellesWav
Exit Sub
End If
t = Timer
Do While Timer - t < 0.02 ' 20 ms warten
DoEvents
Loop
PruefeWiedergabe
End Sub

Sub StarteWiedergabeListe(ParamArray wavs() As Variant)
Dim i&
Set WiedergabeListe = New Collection
For i = LBound(wavs) To UBound(wavs)
WiedergabeListe.Add wavs(i)
Next i
AktuellerIndex = 1
PauseAktiv = False
Abbruch = False
SpieleAktuellesWav
End Sub

Sub TestTTSQueue()
Dim w1$, w2$, w3$
w1 = Environ$("TEMP") & "\tts1.wav"
w2 = Environ$("TEMP") & "\tts2.wav"
w3 = Environ$("TEMP") & "\tts3.wav"
TextToWav "Dies ist der erste Text.", w1
TextToWav "Dies ist der zweite Text.", w2
TextToWav "Dies ist der dritte Text.", w3
StarteWiedergabeListe w1, w2, w3
End Sub

https://www.herber.de/bbs/user/180837.xlsm

Gruß Uwe
Als Antwort auf diesen Beitrag
Alwin Weisangler
20.06.2026 10:37:56
AW: Sprachausgabe in Excel
Hallo Udo,

bevor ich dir das deinen Dingen passend weiter baue, teste diesen per API-Funktion aufgebauten und asynchron zu VBA arbeitenden Vorschlag:


Option Explicit
Declare PtrSafe Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As LongPtr, ByVal dwFlags As Long) As Long

Const SND_ASYNC As Long = &H1
Const SND_FILENAME As Long = &H20000
Const SND_NOSTOP As Long = &H10

Sub SprecheZweiTexte()
Dim wav1$, wav2$
wav1 = Environ$("TEMP") & "\tts1.wav" ' kann nach Bedarf erweitert werden
wav2 = Environ$("TEMP") & "\tts2.wav"
TextToWav "Ich spreche einen Text und dieser kann jederzeit abgebrochen werden ohne dass es zu irgenwelchen seltsamen Sachen kommen dürfte", wav1
TextToWav "ein weiterer gesprochender Text", wav2
' kann man sowohl mit Schleife als einzeln weiter bauen
PlayWavAndWait wav1
PlayWavAndWait wav2
End Sub

Sub StopSound() ' Das stoppt das jeweilige laufende Wave da asynchron direkt
PlaySound vbNullString, 0, 0
End Sub

Sub TextToWav(text As String, wavPath As String)
Dim spk As Object, fil As Object
Set spk = CreateObject("SAPI.SpVoice")
Set fil = CreateObject("SAPI.SpFileStream")
fil.Open wavPath, 3 ' SSFMCreateForWrite
Set spk.AudioOutputStream = fil
spk.Speak text
fil.Close
End Sub

Sub PlayWavAndWait(wavPath As String)
Dim i#: i = Timer
PlayWavAsync wavPath
Do While Timer < i + 0.1
DoEvents
Loop
Do While SoundIsPlaying()
DoEvents
Loop
End Sub

Sub PlayWavAsync(wavPath As String)
PlaySound wavPath, 0, SND_ASYNC Or SND_FILENAME
End Sub

Function SoundIsPlaying() As Boolean ' PlaySound mit SND_NOSTOP gibt 0 zurück, wenn gerade ein Sound läuft
SoundIsPlaying = (PlaySound(vbNullString, 0, SND_NOSTOP) = 0)
End Function

Was kann dieser Lösungsansatz (mehr ist es im Moment nicht):
- Die Wiedergabe arbeitet asynchron zu VBA
- Es kann jederzeit das aktuell laufende Wave abgebrochen werden (hat aber eine kleine treiberbedingte Latenz)
- Da eine Wave temporär erzeugt wird sollte die Wiedergabe störungsfrei sein

https://www.herber.de/bbs/user/180836.xlsm

Gruß Uwe
Folgenachrichten
Antwort auf Beitrag erstellen
Bitte einen Anwendernamen ohne @ eingeben.
Bitte das Passwort eingeben.
Bitte eine gültige E-Mail-Adresse eingeben.
Bitte einen Betreff eingeben.
Weitere Optionen
Aktivieren, wenn die Frage/der Beitrag noch nicht beantwortet wurde und unter Listen > Offene Threads erscheinen soll.
Beispieldatei hochladen

Bitte einen Nachrichtentext eingeben.