Ö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.
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:
- Öncelikle yeni bir dosya açın
- VBE'ye geçip bir class modül ekleyin ve propertiesten buna myClass adını verin.
- Sonra aşağıdaki kodu bu modüle yapıştırın.
- 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.
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.