Özellik ikonu

Beep (Windows API)

İndirme izni yok

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.

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
Deyim, modülün en üstüne (Sub ve Function tanımlarından önce) yazılır. Parametreler:
  • 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.
ABC
1AlarmFrekans (Hz)Süre (ms)
2Uyarı800300
3Hata400600
4Bilgi1000150
Alarm ListesiExcelDepo v1.0.0
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.

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.
ABCD
1NotaLa'dan fark (yarım ton)Frekans (Hz)Beep için
2Do4-9261,63Geçerli
3Re4-7293,66Geçerli
4Mi4-5329,63Geçerli
5Sol4-2392,00Geçerli
6La40440,00Geçerli
7Si42493,88Geçerli
8Do53523,25Geçerli
9Çok pes-6013,75Geçersiz
Nota FrekanslarıExcelDepo v1.0.0
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.

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.
ABC
1ÜrünStokAsgari
2Kalem12050
3Defter1840
4Dosya6530
5Zımba510
6Klasör7225
7Silgi920
Stok UyarısıExcelDepo v1.0.0
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.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
10
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst