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
Sub pencere_afteropen()
radyator.statu=off
End Sub
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.
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.
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.
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.
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.
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.
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)
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