Bu siteye giriş yaparak Çerez kullanımını kabul etmiş oluyorsunuz. İşbu sitede; çerez olarak, sadece son giriş tarihiniz ve eğer üye olursanız oturum statünüz tutulacaktır. Bunlar dışında başka hiçbir bilgi tutulmamaktadır. Çerezler için detaylı bilgi için buraya tıklayınız.
ANLADIM

DUYURULAR

Yeni eklenen ve/veya güncellenen sayfaları görmek için buraya tıklayınız.

Güncel ödev ve test listesini görmek için buraya tıklayınız.

Sitede yapılan iyileştirmeAer ve hata düzeltmelerine ait tüm bilgilendirmeleri görmek içinburaya tıklayınız.

Baş
Udemy
Konular
Son
Konular
ExcelNesneModeli
Giris
VBAMAkro
VBAMakroGiriş3

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

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

TEST SORULARI

Son Sorumuz şuymuş:Bir metindeki tüm noktaları yoketmek istiyorsunuz. Hangi fonksiyonu kullanırdınız?
Soru:

A şıkkı:

B şıkkı:

C şıkkı:

D şıkkı:

Doğru Cevap Etiketler

İlişkili konuyu seç

75269

Label
* Sorulara verilen yanlış cevaplardaki esprili yorumlarım için hoşgörünüze sığınıyorum.
* Test ve Ödevlerdeki bazı detaylar burada anlatılmamış olabilir. Bunları kendiniz araştırıp bulmalısınız.
* Birden çok konuya ait içeriği olan ödevler var. Algoritmik açıdan bakıldığında o an en uygun konuya adreslenmiştir.
Dikkat! Bir soruya cevap verdikten sonra geri dönemezsiniz.
4
0
0
0

Soru No:3. Aşağıdakilerden hangisi ile Object Browser'ı açarız?







ÖDEVLER

0
0
ÖdevNo:... Şu an için bu konu için ödev bulunmamaktadır. İletişim menüsünden örnek ödev sorularını bana iletebilirsin.
Çözüme bakın(Başka türlü de çözülebilir tabi, bu benim çözümüm.)




=YORUMLAR ve SORULAR=


DEVİR UYARISI

Herkese merhaba. Hosting maliyetlerinin aşırı artması yüzünden sitemi yakın zamanda(en geç Mayıs 2023) kapatmaya karar vermiştim. Ancak, siteyi yakından takip eden bir arkadaş siteyi devralmak istemiştir. Siteyi, Mayıs ayında kendisine devir etmeye karar verdim. Üyelik bilgilerini bana güvenerek girdiğiniz için, hepsini silmiş bulunuyorum, yani mail adreslerinizi kimseyle paylaşmamış olacağım. Bilginizi rica ederim.