Application Olayları
Application Eventleri
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 Excel'in 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 bir 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.
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 workbook ve worksheet nesnelerinde de deneyebilirsiniz ama onların eventi zaten kod penceresinde üstteki comboboxlarda otomatik çıktığı için bu zahmete gerek yok.
Şimdi devam ediyoruz, kullanı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çıldığı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üğünüz gibi Class'ları kullandık. Class ve Class modüller hakkında daha fazla bilgiyi buradan edinebilirsiniz.
Workbook Modülde Application Nesnesi Tanımlama
Yukarıda 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 yukarıdaki gibi aynı kodu yazalım. Bu da bu kadar.
myApp_WorkbookOpen ile Dış Bağlantı Tespiti
Aşağıdaki örnekte açılan dosyalarda harici bir bağlantı var mı diye bize söyleyen bir kod bulunuyor.
Bunu yine yukarıdaki örnekte olduğu gibi Personal.xlsb
dosyası içinde ele alalım.
Private Sub myApp_WorkbookOpen(ByVal Wb As Workbook)
If Wb.Connections.Count > 0 Or Wb.Queries.Count > 0 Then
MsgBox "bu dosya harici bağlantı içeriyor"
End If
End Sub
Yazdırma İşlemini Engellemek
Olur da acil bir iş nedeniyle bilgisayarımızı açık bıraktık gittik, birileri gelip bizim iznimiz olmadan bilgisayarımızdan bir şeylerin printini almak isteyebilir. Bunu aşağıdaki kod ile engellemiş oluruz.
Bunu da yine yukarıdaki örnekte olduğu gibi Personal.xlsb
dosyası içinde ele alalım.
Private Sub myApp_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
şifre = InputBox("Yazdırma şifresini girin")
If şifre <> "1234" Then
Cancel = True
MsgBox "Şifreyi bilmiyorsanız bu bilgisayardan hiçbir Excel dosyasının çıktısını alamazsınız"
End If
End Sub