13.07.2018 tarihinde Formlar-Kontroller sayfası eklenmiştir

25.05.2018 Hosting şirketi dğeiştirmekten kaynaklı bir hata nedeniyle Excelent add-ini indirirken hata alınmaktaydı. Bu hata düzeltilmiştir. İki ayrı download alternatifi sunulmuştur. Kurumunuzun BT politikalarının veya şahsi PC’nizdeki güvenlik ayarlarının izin vermesi durumunda yöntemlerden biriyle kurulum yapabilmelisiniz. Bi sorun olursa bana iletebilirseniz sevinirim.

25.04.2018 tarihinde,VBA konularına Formlar-Temeller sayfası eklenmiştir.

VBAMakroOlaylar6

Ö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. 

Kendi Classlarınıza ait olaylar

Bu bölümü yapmaya başladığımda nerden başlayacağıma bi türlü karar veremedim, zira Class konusuna bayağı bir girmek gerekiyordu. Şuan ise sayfaları sırayla hazırladığım için ve henüz Class konusuna girmediğim için biraz anlamsız geldi. O yüzden bu konuyu üstteki paragrafta belirttiğim linke bırakıyorum. 

Diğer özel olaylar

Her ne kadar özel olay olmasa da farklı tanımlama ve erişim şekilleri itibarıyle 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şabilirsinz.

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.

YORUMLAR