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.

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

post-thumb

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.

post-thumb

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