Genel Bakış
WorksheetFunction (WorksheetFunction object), Excel'in çalışma sayfası işlevlerini VBA kodundan çağırmanızı sağlayan nesnedir. Application.WorksheetFunction ifadesiyle erişilir. TOPLA, ORTALAMA, DÜŞEYARA, EĞERSAY gibi işlevleri döngü yazmadan, tek satırda kullanmanıza olanak verir. İşlevler VBA içinde İngilizce adlarıyla ve parametreleri virgülle ayrılarak çağrılır.
Parametreler:
İki yaklaşım da geçerlidir. Hata değeriyle çalışmak istiyorsanız Application biçimini, hata oluştuğunda akışı kesmek ya da yakalamak istiyorsanız WorksheetFunction biçimini seçin.
Makro çalıştığında toplam 768, ortalama 128,00, en yüksek değer 168 ve en düşük değer 95 olarak hesaplanır. Sonuçlar hücrelere değer olarak yazılır; B sütunundaki veriler değişirse bu hücreler kendiliğinden güncellenmez, makroyu yeniden çalıştırmanız gerekir.
İlk kod için sonuç 4.250,00, ikinci kod için 1.190,00 olarak gelir. Listede bulunmayan üçüncü kod için makro durmaz; E4 hücresine Bulunamadı yazılır. Bunu sağlayan, hatayı Err.Number ile denetleyip Err.Clear ile temizlememizdir.
İstanbul satışlarının toplamı 39.500,00, İstanbul için kayıt sayısı 3 olarak bulunur. Tüm tutarların ortancası 9.875,00, ikinci büyük tutar 12.500,00 ve yuvarlanmış ortalama 10.481 değerindedir. İç içe çağrıda (.Round(.Average(tutarlar), 0)) bir işlevin sonucu doğrudan diğerine bağımsız değişken olarak verilebilir.
Söz dizimi
WorksheetFunction nesnesi doğrudan değil, Application nesnesinin özelliği olarak kullanılır. Her çalışma sayfası işlevi, bu nesnenin bir yöntemi gibi çağrılır:
VBA
5 satır
Değişken = Application.WorksheetFunction.IşlevAdı(Arg1, Arg2, ...)
' Örnek
Dim toplam As Double
toplam = Application.WorksheetFunction.Sum(Range("B2:B7"))
- IşlevAdı: Çağırmak istediğiniz çalışma sayfası işlevinin İngilizce adı (Sum, VLookup, CountIf gibi). Türkçe ad (TOPLA, DÜŞEYARA) VBA'da çalışmaz. Zorunludur.
- Arg1, Arg2, ...: İşlevin kendi bağımsız değişkenleri. Aralıklar Range nesnesi olarak, ölçütler ve sabitler metin ya da sayı olarak verilir. Gerekli sayısı işleve göre değişir; isteğe bağlı olanlar atlanabilir.
- Dönüş değeri: İşlevin sonucudur; sayı, metin, mantıksal değer ya da dizi olabilir. Sonucu tutacak değişkenin türü uygun olmalıdır; emin değilseniz Variant kullanın.
Önemli özellikler
WorksheetFunction nesnesinin kendi özellikleri azdır; asıl değeri yöntemlerindedir:- Application: Nesneyi barındıran Excel uygulamasını (Application nesnesi) döndürür. Salt okunurdur.
- Parent: Nesnenin üst nesnesini döndürür. Pratikte nadiren gerekir.
- Creator: Nesneyi oluşturan uygulamayı belirten sayısal kodu döndürür. Gündelik kodlarda kullanılmaz.
Önemli yöntemler ve olaylar
Her çalışma sayfası işlevi, WorksheetFunction üzerinde bir yöntemdir. Sık kullanılanlar şunlardır (parantez içinde Türkçe Excel karşılıkları):- Sum (TOPLA), Average (ORTALAMA), Max (MAK), Min (MİN): Temel toplama, ortalama ve uç değer hesapları.
- Count (BAĞ_DEĞ_SAY), CountA (BAĞ_DEĞ_DOLU_SAY), CountIf (EĞERSAY), SumIf (ETOPLA): Sayma ve koşullu toplama.
- Median (ORTANCA), Large (BÜYÜK), Small (KÜÇÜK): İstatistiksel sıralama işlemleri.
- VLookup (DÜŞEYARA), Match (KAÇINCI), Index (İNDİS): Tabloda arama ve konum bulma.
- Round (YUVARLA), Pmt (DEVRESEL_ÖDEME), Transpose (DEVRİK_DÖNÜŞÜM): Yuvarlama, finans ve dizi işlemleri.
Hata yönetimi: WorksheetFunction ve Application farkı
Aynı işlevi iki biçimde çağırabilirsiniz ve hata davranışı farklıdır. Application.WorksheetFunction.VLookup aranan değeri bulamazsa çalışma zamanı hatası 1004 verir ve makro durur; bu hatayı On Error deyimiyle yakalamanız gerekir. Application.VLookup ise hata vermez, #YOK gibi bir hata değeri döndürür; bunu IsError işleviyle denetlersiniz:
VBA
5 satır
Dim sonuc As Variant
sonuc = Application.VLookup("K999", Range("A2:C7"), 3, False)
If IsError(sonuc) Then
MsgBox "Kayıt bulunamadı"
End If
1. Toplam, ortalama ve uç değerler
Altı aylık satış adetleri B sütunundadır. Aşağıdaki makroyu standart modüle yapıştırın; E2:E5 hücrelerine toplam, ortalama, en yüksek ve en düşük değeri yazar.
VBA
17 satır
Option Explicit
Sub OzetHesapla()
Dim ws As Worksheet
Dim veri As Range
Set ws = ActiveSheet
Set veri = ws.Range("B2:B7")
' Birden çok işlevi tek blokta çağırıyoruz
With Application.WorksheetFunction
ws.Range("E2").Value = .Sum(veri)
ws.Range("E3").Value = .Average(veri)
ws.Range("E4").Value = .Max(veri)
ws.Range("E5").Value = .Min(veri)
End With
End Sub
WorksheetFunction
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ay | Satış Adedi | Gösterge | Değer | |
| 2 | Ocak | 120 | Toplam | 768 | |
| 3 | Şubat | 95 | Ortalama | 128,00 | |
| 4 | Mart | 143 | En Yüksek | 168 | |
| 5 | Nisan | 110 | En Düşük | 95 | |
| 6 | Mayıs | 168 | |||
| 7 | Haziran | 132 |
Satış ÖzetiExcelDepo v1.0.0
2. DÜŞEYARA ile hata yakalama
A:C aralığında ürün kodu, ürün adı ve fiyat listesi yer alır. D sütunundaki kodlar aranır ve fiyatlar E sütununa yazılır. Listede olmayan bir kod için makro hata vermek yerine 'Bulunamadı' yazar. Kodu standart modüle yapıştırın.
VBA
26 satır
Option Explicit
Sub FiyatAra()
Dim ws As Worksheet
Dim i As Long
Dim fiyat As Variant
Set ws = ActiveSheet
For i = 2 To 4
fiyat = Empty
' Bulunamazsa VLookup 1004 hatası verir; hatayı yakalıyoruz
On Error Resume Next
fiyat = Application.WorksheetFunction.VLookup( _
ws.Cells(i, 4).Value, ws.Range("A2:C7"), 3, False)
If Err.Number <> 0 Then
ws.Cells(i, 5).Value = "Bulunamadı"
Err.Clear
Else
ws.Cells(i, 5).Value = fiyat
End If
On Error GoTo 0
Next i
End Sub
WorksheetFunction
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ürün Kodu | Ürün | Fiyat | Aranan Kod | Sonuç |
| 2 | K101 | Klavye | 450,00 | K103 | 4.250,00 |
| 3 | K102 | Fare | 275,50 | K105 | 1.190,00 |
| 4 | K103 | Monitör | 4.250,00 | K999 | Bulunamadı |
| 5 | K104 | Kulaklık | 890,00 | ||
| 6 | K105 | Webcam | 1.190,00 | ||
| 7 | K106 | Yazıcı | 3.650,00 |
Fiyat AramaExcelDepo v1.0.0
3. Koşullu toplama ve istatistik
A sütununda şehirler, B sütununda satış tutarları vardır. Makro İstanbul için toplam ve işlem sayısını, ayrıca tüm tutarların ortancasını, ikinci büyük değerini ve yuvarlanmış ortalamasını E2:E6 hücrelerine yazar. Kodu standart modüle yapıştırın.
VBA
24 satır
Option Explicit
Sub SehirAnalizi()
Dim ws As Worksheet
Dim sehirler As Range
Dim tutarlar As Range
Set ws = ActiveSheet
Set sehirler = ws.Range("A2:A9")
Set tutarlar = ws.Range("B2:B9")
With Application.WorksheetFunction
' İstanbul satışlarının toplamı (ETOPLA)
ws.Range("E2").Value = .SumIf(sehirler, "İstanbul", tutarlar)
' İstanbul kayıt sayısı (EĞERSAY)
ws.Range("E3").Value = .CountIf(sehirler, "İstanbul")
' Tüm tutarların ortancası (ORTANCA)
ws.Range("E4").Value = .Median(tutarlar)
' İkinci büyük tutar (BÜYÜK)
ws.Range("E5").Value = .Large(tutarlar, 2)
' Ortalamayı tam sayıya yuvarla (YUVARLA)
ws.Range("E6").Value = .Round(.Average(tutarlar), 0)
End With
End Sub
WorksheetFunction
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Şehir | Tutar | Ölçüt | Sonuç | |
| 2 | İstanbul | 12.500,00 | İstanbul toplamı | 39.500,00 | |
| 3 | Ankara | 8.400,00 | İstanbul işlem sayısı | 3 | |
| 4 | İzmir | 9.650,00 | Ortanca tutar | 9.875,00 | |
| 5 | İstanbul | 15.200,00 | İkinci büyük tutar | 12.500,00 | |
| 6 | Bursa | 7.300,00 | Ortalama (yuvarlanmış) | 10.481 | |
| 7 | Ankara | 10.100,00 | |||
| 8 | İstanbul | 11.800,00 | |||
| 9 | İzmir | 8.900,00 |
Şehir SatışlarıExcelDepo v1.0.0
Kullanırken dikkat edin
- İngilizce işlev adı kullanın: VBA'da işlev adları her zaman İngilizcedir ve bağımsız değişkenler virgülle ayrılır. DÜŞEYARA yerine VLookup, EĞERSAY yerine CountIf yazın. Excel'in dil ayarı bunu değiştirmez.
- Aralıklar Range nesnesi olmalı: Aralığı bağımsız değişken olarak Range nesnesiyle verin; metin olarak "B2:B7" yazmak işe yaramaz. Sayfa belirtmezseniz Range etkin sayfayı kullanır. Bu yüzden başka bir sayfadaki veriler için Worksheets("Ad").Range(...) biçimini tercih edin.
- Hata 1004 ve On Error: WorksheetFunction üzerinden çağrılan işlev hata üretirse (DÜŞEYARA'nın değeri bulamaması gibi) makro durur. Bunu On Error Resume Next ile yakalayıp Err.Number değerini denetleyin ya da Application.VLookup biçimini kullanıp IsError ile sınayın. On Error Resume Next kullandıktan sonra hata yönetimini On Error GoTo 0 ile kapatmayı unutmayın.
- Sonuç değer olarak yazılır: Makronun hücreye yazdığı sonuç sabit bir değerdir, formül değildir. Kaynak veri değişince sonuç güncellenmez. Canlı güncellenen sonuç istiyorsanız hücrenin Formula özelliğine formül yazın.
- Her işlev bulunmaz: Tüm çalışma sayfası işlevleri WorksheetFunction üzerinde yer almaz. VBA'nın kendi karşılığı olanlar (Len, Left, Mid, Abs, Now gibi) ve EĞER, VE, VEYA gibi mantıksal işlevler bu nesnede bulunmaz. Yeni sürümlerle eklenen bazı işlevler de sürüme göre eksik olabilir; yazarken açılan liste işlevi göstermiyorsa Application.Evaluate yöntemini deneyin.
- Performans ipucu: Bir hücre döngüsünde her hücre için işlev çağırmak yavaştır. Mümkünse tüm aralığı tek çağrıda işleve verin; örneğin hücreleri tek tek toplamak yerine Sum ile aralığı bir kerede toplayın.
- İlgili konular: Application nesnesi, Range nesnesi, Evaluate yöntemi, Range.Formula özelliği, On Error deyimi, Err nesnesi, IsError işlevi, With deyimi; TOPLA, ORTALAMA, DÜŞEYARA, EĞERSAY, ETOPLA, ORTANCA, BÜYÜK, YUVARLA.