WorksheetFunction

WorksheetFunction Class'ı ve Kullanımı

VBA'in en önemli fonksiyonlarından bir grup da WorksheetFunction class'ı içinde bulunan metodlardır. Bunlar, adı üzerinde, Excel içinde kullanılan fonksiyonlardır. Burada tüm fonksiyonlar bulunmamakla birlikte önemli bir kısmı dahil edilmiştir. Nelerin olduğunu, aşağıdaki gibi WorksheetFunction yazıp nokta koyduktan sonra intellisense aracılığıyla görebilirsiniz (veya F2'ye basıp object browser'dan da arayabilirsiniz). Genelleme yapacak olursak VBA eşleniği olan fonksiyonlar burada yoktur. Now, Left, Mid gibi.

Bunlar aslında UDF'in tersi gibi düşünülebilirler. Nasıl ki VBA aracılığıyla Excel'e yeni fonksiyonlar kazandırabiliyorsak, Excel aracılığıyla da VBA'e ek fonksiyonlar kazandırmış oluyoruz.

Mesela bir lookup işlemi yapmak istediğinizde tıpkı Excel içinde VLOOKUP yazarmış gibi VBA içinden bu lookup işlemini yapabilirsiniz. Bunun sonucunu bir hücrede görmek yerine bir değişkenin içine depolamış olursunuz, o kadar.

ÖNEMLİ NOT: Bazen WorksheetFunction yerine direkt Application nesnesinin kullanıldığını görebilirsiniz. Bu bağlamda ikisi özdeştir diyebiliriz, aşağıdaki örnekteki gibi. Ancak siz yine de WorksheetFunction'ı kullanın, zira yapılan testler bunun %20 civarında daha hızlı olduğunu söylüyor. Üstelik Application'lı versiyonda Intellisense de çıkmamaktadır. Hata yakalama bağlamında da farkları var ancak o detaya girmeyeceğim, arzu eden buradan bakabilir.

                        
                            x = Application.Sum(Range("A1:A10"))
                            x = WorksheetFunction.Sum(Range("A1:A10"))
                                
                                
Örnekler
Örnek 1

İlk örneğimizde sistemden çektiğimizde 12 haneden küçük portföy kodlarını 12 haneye tamamlayan bir UDF var. Bu örnekte en başa gereken miktarda 0 konulmaktadır. Bunun Excel'de yapmak için kendisine çok benzeyen şu formülü girmem gerekirdi:

                        
                        =REPT("0", 12 - LEN(A2)) & A2
                            
                            

VBA'de ise bu şekilde yapabiliriz:

                        
                        Function portföy12(pk As Range)
                            portföy12 = WorksheetFunction.Rept("0", 12 - Len(pk)) & pk
                        End Function
                            
                            

Hangisini yazmak daha kolay, Excel formülünü mü, UDF'i mi? Böylece bir önceki bölüme ithafen UDF'lerin gücünü de anmış olalım.

Bu arada bunu alternatif olarak şöyle de yapabilirdik ancak WorksheetFunction'ı örneklemek adına böyle yaptık:

                        
                                Function portföy12(pk As Range)
                                    portföy12 = String(12 - Len(pk), "0") & pk
                                End Function
                                    
                                    

Ama diyelim String yöntemi VBA'de yok, siz de WorksheetFunction'ı bilmiyorsunuz. Bu durumda bu UDF'i şöyle yazardık:

                        
                            Function portfoy12(pk As Range)
                                ilave = 12 - Len(pk)

                                For i = 1 To ilave
                                    ek = ek & 0
                                Next i

                                portfoy12 = ek & pk
                            End Function
                                
                                

Gördüğünüz gibi WorksheetFunction bizi gereksiz bir For döngüsü yazmaktan kurtarmış olur (Tabii bu örnekte String alternatifimizin olduğunu bir kez daha altını çizelim, ama her zaman böyle alternatifler olmaz).

Örnek 2

İkinci örneğimizde VLOOKUP kullanımı var. Bu örnekte de 'aranan' isimli bir değeri 'table' isimli bir range içinde arıyoruz. Bunu normal VBA ile yapmak için Dictionary tanımlamak gerekirdi, ki bu da kodlarımızı oldukça uzatırdı.

                        
                            .....
                            sonuc = WorksheetFunction.VLookup(aranan, table, 1, False)
                                
                                
Örnek 3

Aşağıda ise çifte VLOOKUP yapmayı sağlayan bir UDF var, burada COUNTIF fonksiyonunun kullanımı görüyorsunuz:

                        
                            Function Çiftevlookup(alan As Range, sütun As Long, İlk_kriter, İkinci_kriter)
                                Dim rCheck As Range, bFound As Boolean, lLoop As Long
                                On Error Resume Next

                                Set rCheck = alan.Columns(1).Cells(1, 1)
                                For lLoop = 1 To WorksheetFunction.CountIf(alan.Columns(1), İlk_kriter)
                                    Set rCheck = alan.Columns(1).Find(İlk_kriter, rCheck, xlValues, xlWhole, xlNext, xlRows, False)
                                    If UCase(rCheck(1, 2)) = UCase(İkinci_kriter) Then
                                        bFound = True
                                        Exit For
                                    End If
                                Next lLoop

                                If bFound = True Then
                                    Çiftevlookup = rCheck(1, sütun)
                                Else
                                    Çiftevlookup = "#N/A"
                                End If
                            End Function
                                
                                
Örnek 4

Yine bir önceki UDF bölümünde gördüğümüz bir fonksiyonda LARGE ve SMALL fonksiyonlarının kullanımına şahit oluyoruz:

                        
                            Function uçhariçort(alan As Range, Uç As Variant)
                                Dim aratoplam As Double
                                Dim enbüyükler As Double
                                Dim enküçükler As Double

                                For i = 1 To Uç
                                    enbüyükler = enbüyükler + WorksheetFunction.Large(alan, i)
                                Next i

                                For i = 1 To Uç
                                    enküçkler = enküçkler + WorksheetFunction.Small(alan, i)
                                Next i

                                aratoplam = WorksheetFunction.Sum(alan) - enbüyükler - enküçkler
                                uçhariçort = aratoplam / (alan.Count - Uç * 2)
                            End Function