Excel Nesne Modeli

Giriş
Visual Basic(VB) gibi nesne yönelimli(İngilizce tabiriyle object oriented(OO)) dillerde nesneler ve bu nesnelerin özellikleri(properties), eylemleri(methods) ve olayları(event) bulunur. Gerçi VB tam anlamıyla bir OO dil değildir; bu konsepti destekler ama tam bir OO dil olabilmesi için tüm gereken kriterleri(Encapsulation, Abstraction, Inheritance ve Polymorphism) karşılamaz. Dolayısıyla VBA de tam bir OO dil değildir. Ancak biz burada OO konseptinin detaylarıyla ilgilenmekten ziyade genel anlamda nesne kavramı ve nesnelerin üyeleri üzerinde duracağız. Gündelik hayattan örnek verecek olursak pencere bir nesnedir. Pencerenin kulpu bir alt nesnedir, kulpun yapıldığı madde ve rengi ise bir özelliktir, açılmak ise onun bir eylemidir.(İngilizcesi method olduğu ve programcılıkta metod kelimesi daha çok kullanıldığı için bundan sonra eylem yerine metod terimini kullanacağım.) Şimdi bu gündelik hayattaki pencere kulpuyla ilgili bir örnek yapalım. Eğer Pencerenin Kulpu alüminyumsa pencere kapansın, ahşapsa açılsın, başka bir maddeyse ne yapılacağına kullanıcı karar versin.
                
                            Sub Pencere()
                                If pencere.kulp.malzeme = "alüminyum" Then
                                    pencere.kapat
                                ElseIf pencere.kulp.malzeme = "ahşap" Then
                                    pencere.açıl
                                Else
                                    MsgBox("kararı kullanıcı versin")
                                End If
                            End Sub
                        
            
Pencerenin açılma olayına da bir kod ekleyebilirsiniz, şöyle ki: Eğer pencere açılırsa radyatörün peteklerini kapat, ki bunun da kodlaması şuna benzer birşey olacaktır.
                
                        Sub pencere_afteropen()
                          radyator.statu=off
                        End Sub
                        
            
Gördüğünüz gibi nesnelerin üyeleri(özellikleri ve metodları) nokta(.) ile nesnelerinden ayrılmaktadır. Bu arada kod bloğumuz içine bir döngü de yerleştirebiliriz, mesela evdeki bütün pencereler için bu yukardaki sorgulamaları yapmak istediğimizi düşünün, her pencere için tek tek kod yazmak çok zahmetli olacaktı, bunun yerine çeşitli döngü yapılarını kullanabiliriz. Burada VBA kodlarından ziyade sadece genel mantığı vereceğim, ilerleyen sayfalarda zaten kodlamasının nasıl yapıldığını göreceksiniz.
  • Birinci pencereden başla
  • pencerenin kulpu alüminyumsa açılmasına izin verme,
  • Ahşapsa izin ver
  • Diğer pencereye geç
  • Eğer son penceredeysen programdan çık
  • Başa dön
Detaylar
Üyelerin(Property ve Metodlar) dönen değeri

Excelde hemen herşey bir nesnedir ve bunlar bir hiyerarşi içinde bulunurlar. Hiyerarşinin en tepesinde Application nesnesi vardır, yani Excelin kendisi. Onun altında workbook ve başka nesneler vardır. En sık kullanılacak nesneler bu sayfada detaylıca ele alınacak olup bunların hepsi hiyerarşinin bir seviyesini gösterir. Alt nesneden kastımız aslında, bir propertydir, yani terminolojik olarak nesnenin nesnesi diye bir kavram yok, ancak nesnenin propertysinin dönüş değeri bir nesne tipinde(object type) olduğu için bundan nesnenin alt nesnesi gibi bahsederiz. Ör:Worksheet nesnesinin Range propertysinin dönüş değeri Range nesnesi döndürür ve biz de bunu sanki nesnenin alt nesnesi gibi yorumlarız.

Nesne Modeli Grafik Gösterimi

Excel Nesne Modelinin grafiksel gösterimi aşağı yukarı şöyledir. Eski Excel versiyonlarında buna program içinden ulaşabiliyorduk ancak şuan yok, ulaşabildiğim bu resmi de buradan aldım ancak orda bile Page2/3e tıkladığımda birşey göstermiyor.Excelin Nesne modeli hakkında daha detaylı bilgi edinmek istiyorsanız MSDN'yi ziyaret etmenizi tavsiye ederim.

Collection

O anda açık olan tüm nesne(obje) grubuna collection denir. Bir nesnenin çoğul hali olarak ifade edilir. Ör:Workbook nesnesi, Workbooks collectionının bir üyesidir. Mesela o anda sadece birinci Workbooku kapayacaksanız Workbooks(1).Close derken, tüm Workbookları kapatmak için Workbooks.Close dersiniz. Collection'ları döngüler içinde çok kullanacağız. Mesela aktif dosyanın tüm sayfalarında işlem yapmak için aşağıdaki gibi bir kod yazacağız.

                
                            Sub collectionlar()
                               'Tanımlamalar
                               For each ws in ActiveWorkbook.Sheets
                                'kodlar buraya
                               Next ws
                            End Sub
                        
            

Collection konusunu burada bitirelim, döngülerde ve nesnelerde karşımıza tekrar çıkacak, orada detaylarına değineceğiz. NOT: VBA da bize Collection sınıfını sunar, böylece biz de kendi collectionlarımızı yaratabiliyoruz. Bu konuya da yine ilerleyen sayfalarda değineceğiz.

Class

Felsefeyle ilgilendiyseniz platonun idealar dünyasını duymuşsunuzdur. Ona göre dünyada gördüğümüz herşey idealar dünyasındaki bir ideanın dünyada somutlaşmış halidir. Tıpkı bunun gibi VBA'daki her nesne de bir classın somutlaşmış halidir. VBA ile gelen bi dolu class olmakla birlikte ileri seviye bölümünde göreceğiniz üzere kendi class ve dolayısıyla nesnelerinizi de yaratabilirsiniz. Biz mevcut classlar üzerinden bir örnek verip konuyu burada bitirelim, çünkü gerçekten bu kadar detaya boğulmanıza şu aşamada hiç gerek yok, sadece kavramları genel olarak bilin diye bu konuya değiniyorum. Mesela Workbooks koleksiyonunun bir üyesi olan Workbook nesnesi aslında bir Workbook classının Workbook tipinde bir nesnesidir. Arkaplanda bu class için tanımlanmış özellik ve metodları vardır. Nasıl idealar dünyasındaki bir atın kulakları, uzun kuyruğu, 4 bacağı gibi özellikleri ve kişnemesi, koşması v.s gibi eylemleri(metodları) varsa workbook classı için tanımlanmış name, path gibi özellikler ve open, close, add gibi metodları vardır ve bunlar bütün workbook nesneleri için geçerlidir.

Library(Kütüphane)

Bir veya daha çok classtan oluşan kümelere Library denir. (Teknik not:Bunlar aslında bir dll dosyasından başka birşey değildir). Bunların bir kısmı default olarak VBA projelerimize dahildir, bir kısmını ise ihtiyaca göre biz ekleriz, bir kısmını ise hiç kullanmıyor olacağız. Default olarak gelen ve en sık kullanacağımız kütüphaneler şunlardır.

  • Excel
  • VBA
  • Office

Bunun dışında Access ve Outlookla bilikte çalışmak için bunlara ait kütüphaneleri de VBE içindeki Tools>References menüsünden ekleriz. Bir diğer önemli kütüphane de Scripting.Runtime'dır. Her ikisini de yeri geldiğinde detaylıca göreceğiz.

Object Browser ve nokta notasyonu

Tüm Excel Nesne Modeline ve fazlasına ulaşabileceğiniz yer VBE içinden ulaşabileceğiniz Object Browser'dır. Burda sol üstte önce bir library seçip sonra bu library içindeki classları ve classların hemen yanında da yani sağ altta da bu classlara ait üyelere(metod, özellik ve olaylara) ulaşabilir, en alt blokta da bunlar hakkında kısa bir bilgi alabilirsiniz.

post-thumb

Nesnelerin üyeleri hakkında bilgiye ulaşmanın bir yolu da intellisense teknolojisidir. Object tipli bir dönüş değeri olmayan tüm nesnelerde nesne adını yazıp nokta koyduktan sonra tüm üyelerin gösterilmesine intellisense teknolojisi denir. Bu şekildeki yazım tekniğine de nokta notasyonu denir. Mesela aşağıda bir Range tipli nesnenin intellisense çıktısı görünmektedir.

post-thumb

Tabiki Object Browser toplu bir araştırma ve nesneler yazmak yerine seçme imkanı sunduğu için daha makbuldür, intellisense ise araştırma yapmaktan ziyade daha çok şu işe yaramaktadır. Eğer nesne adından sonra ortaya çıkmıyorsa nesne ismini hatalı yazmışız demektir(Object tipli değil spesifik bir dönüş tipli bir nesne olduğunu varsayıyorum). Ayrıca üye ismini uzun uzun yazmak yerine bir iki harfi yazdıktan sonra Tab tuşuna basarak üye adı otomatik tamamlanmakta ve bu da bize hız kazandırmaktadır. Yukarda bahsettiğimiz nesnelerin dönüş değeri konusunu Intellisense ile bağdaştırmamızda fayda var. Şöyle ki; "Nesne", bildiğiniz gibi Objenin Türkçesidir ama bi ayrım var. Nesne derken nesnenin kendisinden bahsediyoruz, Object derken dönüş tipinden. Bu bağlamda Activesheet de nesnedir ActiveCell de. Ancak ilkinin dönüş tipi Object iken ikincisininki Range'tir. Aktif sayfanın dönüş tipinin WorkSheet olmasını istiyorsak bunu bir değişkene atamalı ve bu değişkeni WorkSheet olarak tanımlamalıyız. Bu arada Activesheet'in dönüş değeri neden Object? diye düşünebilirsiniz. Bunun sebebi, bu nesnenin birden fazla şekle sahip olabilmesidir: Worksheet, Chart gibi. İşte Activesheet'te olduğu gibi, birden fazla anlama gelebilecek nesnelerin dönüş değeri hep Object olmaktadır.

post-thumb

Global sınıfı

Object Browserda Classes bölümünde ilk başta duran mavi renkli bir <globals> classı vardır. Bu class içinde bulunan üyeler global tanımlanmışlardır ve bağlı oldukları nesnenin kullanımına ihtiyaç duymazlar. Örneğin, Math classında bulunan ve mutlak değer almaya yarayan ABS metodunu kullanmak için bir Math nesnesine ihtiyaç duymayız, bu metodu doğrudan kullanırız. İşte bu globals içinde bulunan tüm üyeler, farklı farklı classların global üyelerini gösterirler. (Bunlar C# gibi dillerde static tanımlanan üyelere benzemektedirler)

post-thumb

With ... End With yapısı

Makrolarınızı kaydederken sıklıkla göreceğiniz bir yapı olacak. With.. End With yapısı. Bir nesnenin üyelerine arka arkaya sıklıkla başvurmanız gerektiği durumlarda bu yapıyı kullanırız. Zorunlu değil tabiki ancak, hem daha az kod yazmamızı sağlar hem de okunurluğu iyileştirir. Bu yapıda, With... End With arasında bulunan ilgili nesnenin üyeleri, önlerinde nesnenin adı yazılmadan sadece . işaretini takip edecek şekilde yazılırlar. Şimdi yine yukarıdaki pencere örneği üzerinden giderek bir örnek yapalım.

                
                            With Pencere
                               .kulp.malzeme="alüminyum"
                               .kulp.kalınlık=10
                               .kulp.çevir
                               .aç
                               evi_havalandır 'burada başka bir fonksiyon çağırıyoruz, o yüzden başında . yok
                               If ev.hava="iyi" then
                                   .kapat
                               End If
                            End With