Discussion:
Sound in Excel (VBA)
(zu alt für eine Antwort)
Reinhard Schüll
2007-12-20 10:00:03 UTC
Permalink
Hallo NG,

wie läßt sich ein Sound (Beep oder auch Wavesound) durch Excel auslösen wenn
sich der Wert in einer bestimmten Zelle verändert?

Gruß Reinhard
Klaus "Perry" Pago
2007-12-20 10:33:35 UTC
Permalink
Hallo Reinhard,
Post by Reinhard Schüll
Hallo NG,
wie läßt sich ein Sound (Beep oder auch Wavesound) durch Excel auslösen
wenn sich der Wert in einer bestimmten Zelle verändert?
Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Long, ByVal
dwDuration As Long) As Long

Sub Tonerzeug()
Dim L As Long
L = Beep(440, 1000)
End Sub


Der erste Wert 440 legt die Frequenz in Hertz fest und der zweite Wert 1000
die Dauer des Tones in Millisekunden.

Gruß
Klaus
Reinhard Schüll
2007-12-21 15:55:19 UTC
Permalink
Hallo Klaus,

ich bekomme zwar keine Fehlermeldung aber ich höre keinen Beep. Woran kann
das liegen?

Gruß Reinhard
Post by Klaus "Perry" Pago
Hallo Reinhard,
Post by Reinhard Schüll
Hallo NG,
wie läßt sich ein Sound (Beep oder auch Wavesound) durch Excel auslösen
wenn sich der Wert in einer bestimmten Zelle verändert?
Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Long, ByVal
dwDuration As Long) As Long
Sub Tonerzeug()
Dim L As Long
L = Beep(440, 1000)
End Sub
Der erste Wert 440 legt die Frequenz in Hertz fest und der zweite Wert
1000 die Dauer des Tones in Millisekunden.
Klaus "Perry" Pago
2007-12-21 17:57:40 UTC
Permalink
Hallo Reinhard,
Post by Reinhard Schüll
Hallo Klaus,
ich bekomme zwar keine Fehlermeldung aber ich höre keinen Beep. Woran kann
das liegen?
merkwürdig - ich könnte mit dem Beep ganze Melodien als Klingeltöne
abspielen.
Die Funktion benutzt die WinAPI, also die Programmierschnittstelle zu
Windows. Vielleicht liegt es daran, dass du ein anderes Betriebssystem
verwendest. Oder ist dein Beep generell ausgeschaltet, sodass auch das Bios
beim Rechnerstart nicht beept?

Gruß
Klaus
Reinhard Schüll
2007-12-21 19:31:57 UTC
Permalink
Hallo Klaus,

der Rechner ist n Notebook, WinXp, die WinApi wird von VBA erkannt und
unterstützt. Bleibt echt nur noch das BIOS... muss mal nachschaun dort.

Gruß Reinhard
Reinhard Schüll
2007-12-22 08:59:34 UTC
Permalink
Hallo Klaus,

es war nicht im BIOS, sondern ich hatte den PC Beep im Realtek HD Audio
Output ausgeschaltet gehabt. Dann werde ich mal das Sound-Ereignis mit
Tonhöhe/Frequenz verwenden ...

Gruß Reinhard
Post by Reinhard Schüll
Hallo Klaus,
der Rechner ist n Notebook, WinXp, die WinApi wird von VBA erkannt und
unterstützt. Bleibt echt nur noch das BIOS... muss mal nachschaun dort.
Gruß Reinhard
Klaus "Perry" Pago
2007-12-22 10:44:10 UTC
Permalink
Hallo Reinhard,
Post by Reinhard Schüll
Hallo Klaus,
es war nicht im BIOS, sondern ich hatte den PC Beep im Realtek HD Audio
Output ausgeschaltet gehabt. Dann werde ich mal das Sound-Ereignis mit
Tonhöhe/Frequenz verwenden ...
dann soll es wohl funktionieren.

Nett sind auch Effekte, die bei den ersten einfachen Arcadegames vorkamen
und die man mittels geeigneter Zählschleifen erzeugen kann:

Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Long, ByVal
dwDuration As Long) As Long

Sub Tonerzeug()

For k = 1 To 5
For i = 1000 To 5000 Step 200
L = Beep(i, 5)
Next i
Next k
End Sub

Viel Spaß beim experimentieren

Gruß
Klaus

Michael Zimmermann
2007-12-20 11:41:12 UTC
Permalink
Hallo!
Post by Reinhard Schüll
wie läßt sich ein Sound (Beep oder auch Wavesound) durch
Excel auslösen wenn sich der Wert in einer bestimmten
Zelle verändert?
Private Const SND_ASYNC As Long = &H1&
Private Const SND_FILENAME As Long = &H20000&
Private Const SND_PURGE As Long = &H40&
Private Const SND_LOOP As Long = &H8&


Public Declare Function sndPlaySound32 _
Lib "winmm.dll" _
Alias "sndPlaySoundA" ( _
ByVal lpszSoundName As String, _
ByVal uFlags As Long) _
As Long



sndPlaySound32 "c:\windows\media\start.wav", &H0&

Gruß aus Mainz
Michael
Reinhard Schüll
2007-12-21 15:54:03 UTC
Permalink
Hallo Michael,

funktioniert, Danke dir.

Gruß Reinhard
Post by Michael Zimmermann
Private Const SND_ASYNC As Long = &H1&
Private Const SND_FILENAME As Long = &H20000&
Private Const SND_PURGE As Long = &H40&
Private Const SND_LOOP As Long = &H8&
Public Declare Function sndPlaySound32 _
Lib "winmm.dll" _
Alias "sndPlaySoundA" ( _
ByVal lpszSoundName As String, _
ByVal uFlags As Long) _
As Long
sndPlaySound32 "c:\windows\media\start.wav", &H0&
stefan onken
2007-12-20 11:48:14 UTC
Permalink
Post by Reinhard Schüll
Hallo NG,
wie läßt sich ein Sound (Beep oder auch Wavesound) durch Excel
auslösen wenn sich der Wert in einer bestimmten Zelle
verändert?
Gruß Reinhard
hallo Reinhard,
und wav ginge dann mit
http://tinyurl.com/37btfc

Gruß
stefan
Reinhard Schüll
2007-12-20 15:48:02 UTC
Permalink
Hallo NG-Helfer ...

und dann beeped es wenn sich der Wert z.B. in Zelle D250 ändert? ;-)

Gruß Reinhard
Thomas Ramel
2007-12-20 17:51:22 UTC
Permalink
Grüezi Reinhard

Reinhard Schüll schrieb am 20.12.2007
Post by Reinhard Schüll
und dann beeped es wenn sich der Wert z.B. in Zelle D250 ändert? ;-)
Das (noch) nicht, aber Du kannst das Ganze ja z.B. mit dem
Worksheet_Change()-Ereignis verbinden und dort prüfen ob der Wert in dieser
Zelle sich verändert hat und dann den 'Beep' starten.


Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps
Reinhard Schüll
2007-12-21 15:52:16 UTC
Permalink
Hallo Thomas,

meinst du vielleicht so ?

.... im Modul1

Global Wert_alt, Wert_neu as Variant

... im Worksheet

Private Sub Worksheet_Change(ByVal Target As Range)
If Target = [D250] then
Wert_neu = [D250].Value
If Wert_alt <> Wert_neu then Tonerzeugen
Wert_alt = Wert_neu
End If
End Sub

Sub Tonerzeugen()
......... die Wave-Methode klappt, aber nicht das Beepen........

End Sub

Gruß Reinhard
Thomas Ramel
2007-12-21 17:03:52 UTC
Permalink
Grüezi Reinhard

Reinhard Schüll schrieb am 21.12.2007
Post by Reinhard Schüll
meinst du vielleicht so ?
.... im Modul1
Global Wert_alt, Wert_neu as Variant
... im Worksheet
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = [D250] then
Wert_neu = [D250].Value
If Wert_alt <> Wert_neu then Tonerzeugen
Wert_alt = Wert_neu
End If
End Sub
Sub Tonerzeugen()
......... die Wave-Methode klappt, aber nicht das Beepen........
Hmmm, das kommt ganz darauf an, *wie* oder *aufgrund wessen* sich der Wert
ändert. Folgende Zeile gehört für den Beep jedenfalls in ein allgemeines
Modul deiner Mappe:

Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long


Ich bin dann mal davon ausgegangen, dass er von Hand oder per Copy/Paste in
die Zelle eingetragen wird - da würde dann das Change()-Ereignis greifen.
Die folgenden Zeilen überwachen die Zelle D250:

Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("D250"))
If Not Target Is Nothing Then
Dim L As Long
'die erste Zahl berstimmt die Tonhöhe, die zweite die Länge
L = Beep(500, 200)
End If
End Sub


Wenn Du allerdings das Ergebnis einer Formel drin hast, dann greift das
Calcualte()-Ereignis, das dann noch eine Variable benötigt um den
vorherigen Wert zwischenzuspeichern:

Dim varGoal As Variant

Private Sub Worksheet_Calculate()
If varGoal <> Range("D250").Value Then
Dim L As Long
'die erste Zahl berstimmt die Tonhöhe, die zweite die Länge
L = Beep(500, 200)
varGoal = Range("D250")
End If
End Sub



Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps
Reinhard Schüll
2007-12-21 19:41:43 UTC
Permalink
Hallo Thomas,

also gleich mit der Intersection aufwarten ... tz tz ... ist was für
Mengenlehregeschulte. So verkompliziert wollte ich es nun auch wieder nicht
(schwarzseherisch gesehen ...).

Der Wert in D250 wird durch VBA geändert. Deine Variable VarGoal dürfte aber
nur ne sehr begrenzte Lebensdauer haben (wie wäre es, den alten Wert in eine
unbenutzte Zelle zu schreiben und dann für den Vergleich von dort
auslesen? ) .... und die Beep-erei dürfte außerhalb von Excel ne Lösung
fällig machen.

Gruß Reinhard
Post by Thomas Ramel
Grüezi Reinhard
Hmmm, das kommt ganz darauf an, *wie* oder *aufgrund wessen* sich der Wert
ändert. Folgende Zeile gehört für den Beep jedenfalls in ein allgemeines
Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Long, ByVal
dwDuration As Long) As Long
Ich bin dann mal davon ausgegangen, dass er von Hand oder per Copy/Paste in
die Zelle eingetragen wird - da würde dann das Change()-Ereignis greifen.
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("D250"))
If Not Target Is Nothing Then
Dim L As Long
'die erste Zahl berstimmt die Tonhöhe, die zweite die Länge
L = Beep(500, 200)
End If
End Sub
Wenn Du allerdings das Ergebnis einer Formel drin hast, dann greift das
Calcualte()-Ereignis, das dann noch eine Variable benötigt um den
Dim varGoal As Variant
Private Sub Worksheet_Calculate()
If varGoal <> Range("D250").Value Then
Dim L As Long
'die erste Zahl berstimmt die Tonhöhe, die zweite die Länge
L = Beep(500, 200)
varGoal = Range("D250")
End If
End Sub
Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps
Thomas Ramel
2007-12-22 06:50:11 UTC
Permalink
Grüezi Reinhard

Reinhard Schüll schrieb am 21.12.2007
Post by Reinhard Schüll
also gleich mit der Intersection aufwarten ... tz tz ... ist was für
Mengenlehregeschulte. So verkompliziert wollte ich es nun auch wieder nicht
(schwarzseherisch gesehen ...).
Nunja, irgendwie musst Du doch prüfen ob die Zelle die das Change-Ereignis
ausgelöst hat die war, die dich interessiert.

Intersect ist da 'gängige' Praxis und IMO nicht wirklich kompliziert.
Post by Reinhard Schüll
Der Wert in D250 wird durch VBA geändert.
Dann passt ja alles mit dem Change-Ereignis und der Intersection...
Post by Reinhard Schüll
Deine Variable VarGoal dürfte aber nur ne sehr begrenzte Lebensdauer haben
...und die Variable ist nicht notwendig.
Post by Reinhard Schüll
(wie wäre es, den alten Wert in eine unbenutzte Zelle zu schreiben und
dann für den Vergleich von dort auslesen? )
Oder man deklariert sie in einem allgmeinen Modul und weist ihr beim öffnen
der Mappe übers Open()-Ereignis den aktuellen Wert zu.
Die Variable 'lebt' solange die Mappe geöffnet ist.

Eine weitere Alternative wäre auch ein Name, der diesen Wert aufnimmt; der
ist dann auch nach dem Schliessen und erneuten Öffnen der Mappe noch immer
aktuell.
Post by Reinhard Schüll
.... und die Beep-erei dürfte außerhalb von Excel ne Lösung fällig
machen.
Das ist dann ganz nach Gusto der Fall.
Aber wenn Du die Zelle eh per VBA änderst, könntest Du ja auf die ganze
Überwachung ganz verzichten und die Meldung in der Sub auslösen welche die
Zelle verändert.


Mit freundlichen Grüssen
Thomas Ramel
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps
Reinhard Schüll
2007-12-22 09:07:26 UTC
Permalink
Hallo Thomas,

alles ok und bestens, danke.

Hab das Soundproblem gelöst und denke noch darüber nach ob ich über die
Namensdefinition den Wert aufnehme. Ändern tut VBA den Wert schon, aber VBA
wird übers Intranet gesteuert. Weil das Programm hauptsächlich im
Hintergrund läuft da kam mir die Idee akustisch auf Werte-Veränderungen
aufmerksam gemacht zu werden. Da bietet sich Beep mit der variablen Frequenz
(werde diese auch über VBA verändern je nachdem) an.

Gruß Reinhard
Loading...