Özel Olaylar

Bundan önceki bölümlerde Excel'in kendi nesnelerinin eventlerinin otomatik olarak kod pencresine eklendiğini (ve bunların değiştirilmemesi gerektiğini) söylemiştik. Bu bölümde kendi nesnelerimize (classlarınıza) ait eventleri nasıl yaratırız bunu göreceğiz. Bunun için Class kavramını biraz biliyor olmanız gerekiyor. Bilmeyenler ön bilgiyi buradan edinebilirler.

Diğer Özel Olaylar

Her ne kadar özel olay olmasa da farklı tanımlama ve erişim şekilleri itibarıyla klasik olaylardan farklı oldukları için WithEvent deyimi ile tanımlanan olayları da özel olay gibi düşünebiliriz. Bundan önce Grafik ve Application için bunları nasıl yazdığımızı görmüştük. Bu tür özel olayları başka nesneler için de kullanabiliyoruz. Tüm kullanılabilir nesnelerin listesini aşağıdaki gibi bir değişken tanımlarken As'den sonra boşluk tuşuna basınca görebilirsiniz.

post-thumb

Bunlardan ComboBox, ListBox, Image v.s gibi ActiveX kontrollerine ait eventleri zaten Formlar konusunda ayrıca ele alıyor olacağız. Bu sayfadaki konsepte göre tanımlamanın pek bir esprisi yok bence. O yüzden bunları geçiyoruz.

Biz burada sadece QueryTable nesnesinin eventlerine bakacağız. ActiveX eventlerine ise buradan ulaşabilirsiniz.

QueryTable Event Örneği

Aşağıdaki kod ile kullanıcıyı uzun bir refresh işlemi için uyarıyoruz, refresh işlemi bitince de bir mesaj kutusu ile haber veriyoruz.

Örnek dosyayı buradan indirebilirsiniz. Aşamalarımız şöyle:

  1. Öncelikle yeni bir dosya açın
  2. VBE'ye geçip bir class modül ekleyin ve propertiesten buna myClass adını verin.
  3. Sonra aşağıdaki kodu bu modüle yapıştırın.
  4. Sonrasında dosyanıza bir veri bağlantısı ekleyin (Access, Excel, Oracle, SQL Server v.s olabilir). Örnek olması adına benim sitemdeki http://www.excelinefendisi.com/Ornek_dosyalar/pivotdata.xlsx dosyasından herhangi bir sayfayı ekleyebilirsiniz. (Veri tabanı bağlantılarına aşina değilseniz önce buraya bakın)
                    
                    Private WithEvents myQT As QueryTable
                    Private Sub Class_Initialize()
                        Set myQT = ActiveSheet.ListObjects(1).QueryTable
                    End Sub
                    Private Sub myQT_AfterRefresh(ByVal Success As Boolean)
                    If Success = True Then
                        MsgBox "refresh işlemi bitti"
                    Else
                        MsgBox "refresh sırasında bir hata oluştu"
                    End If
                    End Sub
                    Private Sub myQT_BeforeRefresh(Cancel As Boolean)
                        cevap = MsgBox("uzun sürecek, iptal edeyim mi", vbYesNo)
                        If cevap = vbYes Then
                            Cancel = True
                            MsgBox "iptal edildi"
                        End If
                    End Sub
                        
                        

Son olarak ThisWorkbook modülünün içine de şunları yazın.

                    
                        Dim myClassNesnesi As myClass
                        Private Sub Workbook_Open()
                           Set myClassNesnesi = New myClass
                        End Sub
                            
                            

Bu kadar basit. Şimdi dosyanızı kaydedip kapatın ve tekrar açın, sonra da data üzerinde bir yere gelip, sağ tıklayıp Refresh diyin. Aşağıdaki mesajı görmeniz lazım.

post-thumb

Kodun çalışma prensibi şöyle:

Bir class modülümüz var. Dosya açılır açılmaz bu classtan bir nesne yaratılıyor. Bu nesne yaratılınca class'ın Initialize eventi devreye giriyor ve bu sefer de myQT nesnesine sayfadaki 1 indexli QueryTable atanıyor. Sonrasındaki refresh işlemleri ise aşikar.