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
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
Ü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.
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.
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.
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.
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)
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