Genel Bakış
Beep (Beep function, utilapiset.h), Windows'un kernel32.dll kitaplığındaki bir API işlevidir ve bilgisayarın hoparlöründen belirtilen frekansta ve sürede bir ses çalar. VBA'daki yerleşik Beep deyimi yalnızca varsayılan sistem sesini verirken bu API ile sesin perdesini (Hz) ve uzunluğunu (ms) siz belirlersiniz. Excel'de uyarı, hata ya da işlem bitti sesleri üretmek için Declare deyimiyle tanımlanıp çağrılır.
Deyim, modülün en üstüne (Sub ve Function tanımlarından önce) yazılır. Parametreler:
İşlevin davranışı Windows sürümüne ve ses donanımına göre değişebilir. Yeni Windows sürümlerinde ses varsayılan ses aygıtı üzerinden çalınır; ses kapalıysa ya da aygıt yoksa hiçbir şey duyulmayabilir. Art arda birkaç ses çaldıracaksanız sesler üst üste binebileceğinden önce küçük denemeler yapın.
Sık kullanılan perde değerleri: yaklaşık 440 Hz (La notası), 800-1000 Hz (kısa uyarı), 300-400 Hz (alçak, hata hissi veren ses). Nota frekansları ikinci örnekteki gibi hesaplanabilir.
Makro çalıştığında önce Uyarı, sonra Hata, en sonda Bilgi sesi duyulur. Sayfadaki değerleri değiştirerek farklı perde ve süreleri deneyebilirsiniz. Sonuç ses olduğu için sayfada görünen bir değişiklik olmaz.
Do4 notası için hesaplanan frekans 261,63 Hz ve durumu Geçerli olarak yazılır. La4 satırında frekans 440,00 Hz'dir. Son satırdaki çok pes ses 13,75 Hz çıktığı için Geçersiz sonucunu alır; bu değeri Beep'e vermek başarısız olabilir.
Bu veride Defter, Zımba ve Silgi satırlarında stok asgari düzeyin altında olduğundan üç kısa uyarı sesi duyulur, Hemen Pencere'ye (Immediate) ise üç ürün bildirildiği yazılır. GuvenliBip işlevi geçersiz bir frekansta API'yi hiç çağırmaz ve False döndürür.
Söz dizimi
API işlevi VBA'ya bir Declare deyimiyle tanıtılır. VBA'da Beep adı yerleşik bir deyim olduğundan, işlevi Alias ile farklı bir adla (örneğin ApiBeep) tanımlamak çakışmayı önler. 64 bit Excel için PtrSafe gerekir; eski sürümlerle uyum için koşullu derleme kullanılır:
VBA
5 satır
#If VBA7 Then
Private Declare PtrSafe Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#Else
Private Declare Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If
- dwFreq: sesin frekansı, hertz cinsinden; zorunludur. Geçerli aralık 37 ile 32767 arasıdır.
- dwDuration: sesin süresi, milisaniye cinsinden; zorunludur. Örneğin 500 yarım saniyedir.
Dönüş değeri ve davranış
İşlev başarılıysa sıfırdan farklı bir değer, başarısızsa 0 döndürür. Hata ayrıntısı için VBA'da Err.LastDllError özelliğine bakılabilir. Frekans 37-32767 Hz dışındaysa çağrı başarısız olabilir; bu yüzden değerleri çağırmadan önce denetlemeniz iyi bir uygulamadır.İşlevin davranışı Windows sürümüne ve ses donanımına göre değişebilir. Yeni Windows sürümlerinde ses varsayılan ses aygıtı üzerinden çalınır; ses kapalıysa ya da aygıt yoksa hiçbir şey duyulmayabilir. Art arda birkaç ses çaldıracaksanız sesler üst üste binebileceğinden önce küçük denemeler yapın.
Nerede ve nasıl kullanılır
Kodu Geliştirici > Visual Basic (Developer > Visual Basic) ile açılan düzenleyicide Ekle > Modül (Insert > Module) diyerek eklediğiniz standart modüle yazın. Declare deyimini Private yazarsanız yalnızca o modülde, Public yazarsanız tüm projede kullanılır. Bir sınıf ya da sayfa modülünde Declare yalnızca Private olabilir.Sık kullanılan perde değerleri: yaklaşık 440 Hz (La notası), 800-1000 Hz (kısa uyarı), 300-400 Hz (alçak, hata hissi veren ses). Nota frekansları ikinci örnekteki gibi hesaplanabilir.
1. Frekans ve süreyi sayfadan okuyarak ses çalmak
Sayfada her alarm türü için frekans ve süre yazılıdır. Aşağıdaki kodu standart bir modüle yapıştırın; makro 2-4. satırlardaki değerleri sırayla sese çevirir. Declare içerdiği ve ses ürettiği için bu örnek burada çalıştırılmaz.
VBA
18 satır
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#Else
Private Declare Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If
Sub AlarmlariCal()
Dim s As Long
' 2. satırdan 4. satıra kadar her alarmı çal
For s = 2 To 4
If ApiBeep(Cells(s, 2).Value, Cells(s, 3).Value) = 0 Then
' Dönüş değeri 0 ise çağrı başarısız olmuştur
Debug.Print "Ses çalınamadı: " & Cells(s, 1).Value
End If
Next s
End Sub
Beep
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Alarm | Frekans (Hz) | Süre (ms) |
| 2 | Uyarı | 800 | 300 |
| 3 | Hata | 400 | 600 |
| 4 | Bilgi | 1000 | 150 |
Alarm ListesiExcelDepo v1.0.0
2. Nota frekansını hesaplayıp Beep sınırını denetlemek
Beep'e vermeden önce frekansın 37-32767 Hz aralığında olup olmadığını denetlemek gerekir. Bu örnekte La (440 Hz) notasından yarım ton uzaklığı verilen notaların frekansı hesaplanır ve aralığa uyup uymadığı yazılır. Kod ses çalmadığı için çalıştırılabilir; standart bir modüle yapıştırın.
VBA
21 satır
Option Explicit
Sub NotaFrekansYaz()
Dim s As Long
Dim yarimTon As Double
Dim frekans As Double
For s = 2 To 9
' B sütunu: La notasından yarım ton farkı
yarimTon = Cells(s, 2).Value
' Eşit aralıklı dizilimde frekans = 440 * 2 ^ (fark / 12)
frekans = 440 * 2 ^ (yarimTon / 12)
Cells(s, 3).Value = Round(frekans, 2)
' Beep işlevi için geçerli aralık: 37 - 32767 Hz
If frekans >= 37 And frekans <= 32767 Then
Cells(s, 4).Value = "Geçerli"
Else
Cells(s, 4).Value = "Geçersiz"
End If
Next s
End Sub
Beep
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Nota | La'dan fark (yarım ton) | Frekans (Hz) | Beep için |
| 2 | Do4 | -9 | 261,63 | Geçerli |
| 3 | Re4 | -7 | 293,66 | Geçerli |
| 4 | Mi4 | -5 | 329,63 | Geçerli |
| 5 | Sol4 | -2 | 392,00 | Geçerli |
| 6 | La4 | 0 | 440,00 | Geçerli |
| 7 | Si4 | 2 | 493,88 | Geçerli |
| 8 | Do5 | 3 | 523,25 | Geçerli |
| 9 | Çok pes | -60 | 13,75 | Geçersiz |
Nota FrekanslarıExcelDepo v1.0.0
3. Güvenli sarmalayıcı işlev ve stok uyarısı
Declare deyimini ve API çağrısını tek bir yardımcı işlevde toplamak kodu temiz tutar. Aşağıdaki kod standart modüle yapıştırılır; stoğu asgari düzeyin altına düşen her ürün için kısa bir uyarı sesi çalar. Ses ürettiği için bu örnek çalıştırılmaz.
VBA
29 satır
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#Else
Private Declare Function ApiBeep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If
' Değerleri denetleyip sesi çalan sarmalayıcı işlev
Function GuvenliBip(ByVal frekans As Long, ByVal sure As Long) As Boolean
If frekans < 37 Or frekans > 32767 Then Exit Function
If sure <= 0 Then Exit Function
GuvenliBip = (ApiBeep(frekans, sure) <> 0)
End Function
Sub StokUyar()
Dim s As Long
Dim dusuk As Long
For s = 2 To 7
' B: mevcut stok, C: asgari stok
If Cells(s, 2).Value < Cells(s, 3).Value Then
dusuk = dusuk + 1
Call GuvenliBip(900, 200)
End If
Next s
Debug.Print dusuk & " üründe stok asgari düzeyin altında."
End Sub
Beep
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Ürün | Stok | Asgari |
| 2 | Kalem | 120 | 50 |
| 3 | Defter | 18 | 40 |
| 4 | Dosya | 65 | 30 |
| 5 | Zımba | 5 | 10 |
| 6 | Klasör | 72 | 25 |
| 7 | Silgi | 9 | 20 |
Stok UyarısıExcelDepo v1.0.0
Kullanırken dikkat edin
- Alias kullanın: VBA'da Beep yerleşik bir deyimdir. API'yi aynı adla tanımlamak karışıklığa yol açabilir; bu yüzden Alias "Beep" ile ApiBeep gibi farklı bir ad vermeniz önerilir.
- 64 bit uyumu: 64 bit Excel'de PtrSafe olmayan bir Declare derleme hatası verir. Hem eski hem yeni sürümlerde çalışması gereken dosyalarda #If VBA7 Then koşullu derlemesini kullanın. Bu işlevin parametreleri Long olduğundan 32 ve 64 bit için ayrıca LongPtr gerekmez.
- Frekans sınırı: Frekans 37-32767 Hz dışındaysa çağrı başarısız olabilir. Değerleri sayfadan okuyorsanız önce sayı olup olmadıklarını ve aralığa uyduklarını denetleyin; boş hücre 0 olarak okunur ve geçersizdir.
- Ses duyulmayabilir: Hoparlör kapalıysa, ses aygıtı yoksa ya da uzak masaüstü bağlantısında ses aktarımı kapalıysa hiçbir ses duyulmaz; bu durumda bile işlev hata vermeyebilir. Önemli uyarıları yalnızca sese bırakmayıp mesaj ya da hücre rengiyle de gösterin.
- Bloklama ve zamanlama: Uzun süreler Excel'in o sırada başka işlem yapmasını engelleyebilir; süreleri kısa tutun. Art arda çaldırılan sesler Windows sürümüne göre üst üste binebilir; melodi gibi uygulamalarda önce küçük denemeler yapın.
- Güvenlik: Declare içeren makrolar bazı kurumsal ortamlarda güvenlik ilkeleri nedeniyle engellenebilir. Dosyayı makro içerebilen biçimde (.xlsm) kaydedin.
- İlgili konular:
- Beep deyimi (VBA): varsayılan sistem sesini çalar, frekans belirtilemez.
- Declare deyimi ve PtrSafe anahtar sözcüğü: API işlevlerini VBA'ya tanıtır.
- #If ... Then ... #Else koşullu derleme: 32 ve 64 bit uyumu sağlar.
- MsgBox işlevi: sesin yanında görsel uyarı vermek için.
- Application.Speech.Speak yöntemi: metni sesli okutmak için.
- Err.LastDllError özelliği: API çağrısı hatasının kodunu verir.