Bundan önceki 3 bölümde Workbook, Worksheet ve Chart eventlerini gördük.
Hatırlarsanız Worksheet eventleri aynı zamanda Workbook eventleri içinde
de geçiyordu. Ör:Workbook_SheetActivate. Bu şu demekti; ilgili workbook içinde herhangi
bir sayfayla ilgili olay meydana geldiğinde bu event kodu tetiklenecekti.
Aynı şekilde açık olan tüm dosya ve sayfaların tamamı için yani Excelin
kendisi için, bir diğer deyişle tüm uygulama(application) seviyesinde geçerli olacak şekilde, herhangi bir
Workbook veya Worksheet veya chart eventi meydana geldiğinde bir kodun
tetiklenmesini istiyorsak Application eventleri kullanırız.
Ancak Application eventlerinin bi farkı var, bunlar diğer üçü gibi kod
penceresinde görünmezler, zira Excel Objects altında böyle bir nesne yoktur.
Aşağıda gördüğünüz üzere, Chart, Sheet ve Workbook var, o kadar.
Peki Application eventlerine nasıl ulaşırız? Bunun 2 yolu var:
İlk yöntemde Object Browser'ı kullanıp Application nesnesine gelin, sonra sağ
tıklayıp Group Members diyin. Propertiler, Metodlar ve
Eventler sıralanacaktır. Eventleri en sonda görebilirsiniz.
Peki ulaştık ama bunları nasıl kullanıcaz? İşte hem bu eventleri görmenin ikinci
yöntemi hem de bunları kullanma yöntemine geldi sıra. Bunun da iki yolu var.
Class modülde Application nesnesi tanımlama
Şimdi ilgili projeye sağ tıklayıp Insert>Class Module diyerek bir class
modülü ekleyelim. Evet, Application eventleri class modüller içinde tanımlanır,
zaten işlemleri normal modülde yaparsanız hata alırsınız. Sonra da tepeye şu
satırları yazın:
Dim WithEvents myApp As Application
Şimdi sol üstteki combodan
myApp'i seçin ve sağdaki comboboxta eventleri
görün. Böylece eventleri görmenin ikinci yolunu da öğrenmiş olduk. Ama devam
edip nasıl kullanacağımıza bakalım.
NOT:Bu iki metodu workbbok ve worksheet
nesnelerinde de deneyebilirsiniz ama onların
eventi zaten kod peneceresinde üstteki comboboxlarda otomatik çıktığı için
bu zahmete gerek yok.
Şimdi
devam ediyoruz, kulanım için birkaç aşamamız
daha var. Öncelikle class modülümüzde şu kodlar olsun. Bu arada properties
penceresinde classımızın Class1 olan adını myClass olarak
değiştirelim.
Private WithEvents myApp As Application
Private Sub Class_Initialize()
Set myApp = Application
End Sub
Private Sub myApp_NewWorkbook(ByVal Wb As Workbook)
MsgBox "Yeni açılan dosya adı:" & Wb.Name
End Sub
Şimdi de Workbook_Open eventine gidip, dosya açılır açılmaz bu classın
yaratılmasını sağlayalım.
Dim myClassNesnesi As myClass
Private Sub Workbook_Open()
Set myClassNesnesi = New myClass
End Sub
Dosyayı kaydedip, kapatalım ve tekrar açalım. Dosya açılınca bu classtan bir nesne yaratılacak, ve nesne
yaratılır yaratılmaz da bu classın Initialize eventi sayesinde kendine ait
bir eventi olan myApp nesnesi yaratılacaktır. Sonrasında her yeni bir dosya açılıdığında(Open
değil, New butonu ile) ilgili dosyanın adı görüntülenecektir. Siz isterseniz
bu eventin içini özelleştirebilirsiniz, zira bu haliyle pek kullanışlı
değil. Aşağıda Çeşitli Örnekler bölümünde biraz daha kullanışlı örnekler
bulabilirsiniz.
NOT:Buraya kadar olan işlemlerde gördüğünz gibi Class'ları
kullandık. Class ve Class modüller hakkında daha fazla bilgiyi
buradan
edinebilirsiniz.
Workbook modülde Application nesnesi tanımlama
Yukarda dedik ki App nesnesini tanımladığımız modülün Class
modül olması lazım. Bildiğiniz gibi Workbook ve Worksheet de aslında bir
class olup bunlara ait kod yazdığımız sayfalar da class modül sayfalarıdır. Dolayısıyla
bunlara ait sayfalarda da bu nesneyi tanımlayabiliriz.
Şimdi, ThisWorkbook modülüne aşağıdaki kodu yazın.
Public WithEvents myApp As Application
Private Sub Workbook_Open()
Set myApp = Application
End Sub
Şimdi de yine aynı penceredeyken sol üstte myApp'i seçerek
NewWorkbook eventine yine yukardaki gibi aynı kodu yazalım. Bu da bu
kadar.
Private Sub myApp_NewWorkbook(ByVal Wb As Workbook)
MsgBox "Yeni açılan dosya adı:" & Wb.Name
End Sub
Son Söz
Hangi yöntem seçilmeli
Peki biz bu iki yöntemden hangisini kullanmalıyız. Tamamen kişisel
tercih olmakla birlikte üstatlara kulak verbiliriz. Derler ki, ayrı bir
class modül kodların derli toplu durması adına daha iyidir. Workbook ve
Worksheet sayfalarında onların kendine has kodlarını yazalım.
Olayların sırası
Elimizde myApp_SheetActivate,Workbook_SheetActivate ve Worksheet_Activate
olaylarının hepsi de varsa, hiyerarşik seviyeye göre işleme girerler. Yani
bir sayfa aktive olduğunda önce Application olayı, sonra Workbook olayı, en
son da sayfa olayı gerçekleşir.