Genel Bakış
Declare (Declare statement), bir dinamik bağlantı kitaplığında (DLL) bulunan dış yordamı VBA'ya tanıtan modül düzeyi deyimdir. Tanıtımdan sonra Windows API işlevlerini, kendi yazdığınız ya da üçüncü taraf DLL'lerdeki Sub ve Function yordamlarını sanki VBA yordamıymış gibi çağırabilirsiniz. Yordamın adı, bulunduğu kitaplık ve parametre türleri bu deyimle belirtilir.
VBA kitaplığı derleme sırasında değil, yordam ilk çağrıldığında yükler. Kitaplık ya da yordam bulunamazsa çalışma zamanında hata oluşur.
Makro, her sabit için sonucu B sütununa yazar. VBA7 sabiti için Evet, Win64 sabiti için Hayır, Mac sabiti için Hayır sonucu görünür. Aynı sorguları Declare satırlarınızı sarmalamak için kullanırsınız: VBA7 doğruysa PtrSafe'li, değilse PtrSafe'siz bildirim derlenir.
Bu denetim, Declare yazılmış dosyaların hem eski hem yeni Excel'de açılabilmesinin temelidir.
Makro çalıştırıldığında D sütunundaki her satır önce "Hazırlanıyor", yaklaşık 200 milisaniye sonra "İşlendi" olur; toplam bekleme yaklaşık bir saniyedir. Sleep beklerken Excel yanıt vermez, bu nedenle uzun süreler (birkaç saniyeden fazla) vermeyin. Bu örnek bir Windows API çağrısı içerdiği için sayfada çalıştırılmamıştır; tablo makro öncesi durumu gösterir.
Makro çalıştırıldığında B2 hücresine ana ekranın piksel genişliği, B3 hücresine yüksekliği yazılır. Değerler bilgisayarınızın ekranına ve ölçeklendirme ayarına göre değişir. Satır sonundaki alt çizgi (_), uzun Declare satırını bölmek için kullanılmıştır. Bu örnek Windows API çağrısı içerdiği için sayfada çalıştırılmamıştır.
Ne işe yarar ve nereye yazılır
VBA'nın yerleşik özellikleri her işi kapsamaz. Ekran çözünürlüğünü okumak, milisaniye düzeyinde beklemek ya da sistem bilgisine ulaşmak gibi işler için Windows'un kendi kitaplıkları (kernel32, user32 gibi) kullanılır. Declare deyimi, bu kitaplıklardaki yordamın VBA tarafındaki karşılığını oluşturur.- Konum: Declare deyimi yalnızca modülün bildirim bölümüne (tüm yordamların üstüne) yazılır; bir Sub ya da Function içine yazılamaz.
- Kapsam: Standart modülde Public (varsayılan) ya da Private kullanılabilir. Sayfa, ThisWorkbook, UserForm ve sınıf modüllerinde yalnızca Private olabilir.
- Sub ve Function: Geriye değer döndürmeyen yordam için Sub, değer döndüren yordam için Function kullanılır.
VBA kitaplığı derleme sırasında değil, yordam ilk çağrıldığında yükler. Kitaplık ya da yordam bulunamazsa çalışma zamanında hata oluşur.
Söz dizimi
Deyimin iki biçimi vardır:
VBA
2 satır
[Public | Private] Declare PtrSafe Sub ad Lib "kitaplik" [Alias "takmaad"] [([argliste])]
[Public | Private] Declare PtrSafe Function ad Lib "kitaplik" [Alias "takmaad"] [([argliste])] [As tür]
- Public / Private: Yordamın kapsamı; isteğe bağlıdır, varsayılan Public'tir.
- PtrSafe: 64 bit uyumlu VBA7 ortamında (Excel 2010 ve sonrası) zorunludur; 64 bit Excel, bu sözcüğü olmayan Declare satırında derleme hatası verir.
- Sub / Function: Zorunlu; yordamın değer döndürüp döndürmediğini belirler.
- ad: Zorunlu; VBA kodunuzda kullanacağınız yordam adı. Alias verilmezse DLL içindeki adla aynı olmalıdır ve büyük/küçük harfe duyarlıdır.
- Lib: Zorunlu; yordamın bulunduğu DLL ya da kod kaynağının adı, tırnak içinde (ör. "kernel32", "user32").
- Alias: İsteğe bağlı; DLL içindeki gerçek yordam adı. VBA'daki ad ile DLL'deki ad farklıysa ya da DLL adı VBA'da geçersiz karakter içeriyorsa kullanılır.
- argliste: İsteğe bağlı; parametre listesi. Her parametre Optional, ByVal ya da ByRef, ParamArray sözcükleri ve As türü ile tanımlanır. Varsayılan geçiş biçimi ByRef'tir.
- As tür: Yalnızca Function için; döndürülen değerin veri türü. İsteğe bağlıdır, belirtilmezse Variant olur.
64 bit uyumluluğu ve koşullu derleme
Eski Excel sürümleri (2007 ve öncesi) PtrSafe sözcüğünü tanımaz; 64 bit Excel ise onsuz çalışmaz. Aynı dosyanın her iki ortamda çalışması için #If VBA7 Then ... #Else ... #End If koşullu derleme bloğu kullanılır. Bu blokta ayrıca Win64 ve Mac derleme sabitlerini de sorgulayabilirsiniz.- LongPtr: Bellek adresi ya da tutamaç (handle) alan parametreler 32 bitte 4, 64 bitte 8 bayttır. Bunlar için LongPtr veri türünü kullanın; Long yazarsanız 64 bitte hata ya da çökme olabilir.
- ByVal / ByRef: API belgesindeki bildirime uyun. Sayısal değer alan parametreler çoğunlukla ByVal, sonuç yazılacak değişkenler ise ByRef geçirilir.
- String parametreler: DLL'e dizge geçirirken genellikle ByVal String kullanılır; ANSI (A ile biten) işlevlerde VBA dizgeyi dönüştürür. Dizge dolduran işlevlerde önce yeterli uzunlukta tampon ayırmanız gerekir.
- As Any: Parametre türü önceden bilinmiyorsa kullanılabilir ancak tür denetimini kapatır; gerekmedikçe kullanmayın.
1. Derleme sabitlerini sayfaya yazma
Declare satırı yazmadan önce, dosyanızın hangi ortamda çalıştığını anlamanız gerekir. Bu örnek, koşullu derleme sabitlerinin (VBA7, Win64, Mac) değerlerine göre sayfaya sonuç yazar. Kodu standart bir modüle yapıştırın ve DerlemeBilgisiYaz makrosunu çalıştırın.
VBA
28 satır
Option Explicit
' VBA7, Win64 ve Mac derleme sabitlerini sorgulayıp B sütununa yazar
Sub DerlemeBilgisiYaz()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Derleme Bilgisi")
' VBA7: Excel 2010 ve sonrası (PtrSafe kullanılabilir)
#If VBA7 Then
ws.Range("B2").Value = "Evet"
#Else
ws.Range("B2").Value = "Hayır"
#End If
' Win64: 64 bit VBA ortamı
#If Win64 Then
ws.Range("B3").Value = "Evet"
#Else
ws.Range("B3").Value = "Hayır"
#End If
' Mac: Macintosh için derlenmiş mi
#If Mac Then
ws.Range("B4").Value = "Evet"
#Else
ws.Range("B4").Value = "Hayır"
#End If
End Sub
Declare
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Sabit | Sonuç |
| 2 | VBA7 | Evet |
| 3 | Win64 | Hayır |
| 4 | Mac | Hayır |
Derleme BilgisiExcelDepo v1.0.0
Bu denetim, Declare yazılmış dosyaların hem eski hem yeni Excel'de açılabilmesinin temelidir.
2. Sleep ile kısa bekleme
kernel32 kitaplığındaki Sleep yordamı, kodu belirtilen milisaniye kadar bekletir. Aşağıdaki kodu standart bir modüle yapıştırın. Declare satırları modülün en üstünde, koşullu derleme bloğu içinde yer alır. Bu örnek bir Windows API çağrısı içerdiği için burada çalıştırılmaz; kendi dosyanızda deneyebilirsiniz.
VBA
21 satır
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
' Her siparişi sırayla işleyip kısa bir bekleme ekler
Sub SiparisleriIsle()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Worksheets("Sipariş Takibi")
For i = 2 To 6
ws.Cells(i, 4).Value = "Hazırlanıyor"
ws.Range("D" & i).Parent.Calculate
Sleep 200 ' 200 milisaniye bekle
ws.Cells(i, 4).Value = "İşlendi"
Next i
End Sub
Declare
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Sipariş No | Ürün | Şehir | Durum |
| 2 | 1001 | Bakır Cezve | Gaziantep | |
| 3 | 1002 | El Dokuma Kilim | Konya | |
| 4 | 1003 | Çini Tabak | Kütahya | |
| 5 | 1004 | Zeytinyağı Sabunu | İzmir | |
| 6 | 1005 | Ahşap Kaşık | Bursa |
Sipariş TakibiExcelDepo v1.0.0
3. Alias ile GetSystemMetrics kullanımı
Alias, DLL'deki yordama VBA'da başka bir ad vermenizi sağlar. Bu örnekte user32 kitaplığındaki GetSystemMetrics işlevi, EkranOlcusu adıyla tanıtılır ve ana ekranın genişlik ile yüksekliği piksel olarak okunur. Kodu standart modüle yapıştırın. API çağrısı içerdiği için burada çalıştırılmaz.
VBA
21 satır
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function EkranOlcusu Lib "user32" _
Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#Else
Private Declare Function EkranOlcusu Lib "user32" _
Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long
#End If
Private Const SM_CXSCREEN As Long = 0 ' Ekran genişliği
Private Const SM_CYSCREEN As Long = 1 ' Ekran yüksekliği
' Ana ekranın piksel ölçülerini B sütununa yazar
Sub EkranOlculeriniYaz()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Ekran Ölçüleri")
ws.Range("B2").Value = EkranOlcusu(SM_CXSCREEN)
ws.Range("B3").Value = EkranOlcusu(SM_CYSCREEN)
End Sub
Declare
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Ölçü | Piksel |
| 2 | Ekran genişliği | |
| 3 | Ekran yüksekliği |
Ekran ÖlçüleriExcelDepo v1.0.0
Kullanırken dikkat edin
- PtrSafe unutulmasın: 64 bit Excel'de PtrSafe olmayan Declare satırı derleme hatası verir. Dosyayı başkalarıyla paylaşacaksanız #If VBA7 koşullu derlemesi kullanın.
- Tutamaç ve işaretçiler için LongPtr: Pencere tutamacı (hWnd), bellek adresi gibi değerleri Long yerine LongPtr olarak tanımlayın. Long kullanmak 32 bitte çalışır, 64 bitte hataya yol açabilir.
- Kapsam kuralı: Sayfa, ThisWorkbook, UserForm ve sınıf modüllerinde Declare yalnızca Private olarak yazılabilir. Birden fazla modülde kullanılacak bildirimleri standart modüle koyun.
- Yanlış bildirim Excel'i çökertebilir: API parametrelerinin türünü ya da ByVal/ByRef geçişini yanlış yazarsanız Excel beklenmedik biçimde kapanabilir. Çalıştırmadan önce dosyanızı kaydedin ve bildirimi API belgesiyle karşılaştırın.
- Güvenlik ve uyumluluk: Dış DLL çağıran makrolar güvenlik uyarılarına takılabilir ve kurumsal ortamlarda engellenebilir. Macintosh'ta Windows kitaplıkları (kernel32, user32) bulunmaz; bu tür kodları #If Mac ile ayırın.
- Önce yerleşik çözümü deneyin: Pek çok iş için Declare gerekmez. Örneğin ekran ölçüsü için Application.Width, bekleme için Application.Wait gibi yerleşik öğeler vardır; API'ye yalnızca gerçekten ihtiyaç olduğunda başvurun.
- İlgili konular:
- Alias (Declare söz dizimi içinde)
- PtrSafe ve LongPtr
- #If ... Then ... #Else koşullu derleme deyimi
- Public ve Private deyimleri
- ByVal ve ByRef anahtar sözcükleri
- Const deyimi
- Application.Wait yöntemi