Bu siteye giriş yaparak Çerez kullanımını kabul etmiş oluyorsunuz. İşbu sitede; çerez olarak, sadece son giriş tarihiniz ve eğer üye olursanız oturum statünüz tutulacaktır. Bunlar dışında başka hiçbir bilgi tutulmamaktadır. Çerezler için detaylı bilgi için buraya tıklayınız.
ANLADIM

DUYURULAR

Yeni eklenen ve/veya güncellenen sayfaları görmek için buraya tıklayınız.

Güncel ödev ve test listesini görmek için buraya tıklayınız.

Sitede yapılan iyileştirmeAer ve hata düzeltmelerine ait tüm bilgilendirmeleri görmek içinburaya tıklayınız.

Baş
Udemy
Konular
Son
Konular
ApplicationOlaylari
Olaylar
VBAMAkro
VBAMakroOlaylar5

Application Olayları

Genel

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 Excelin 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 bi 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.

Peki 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 workbbok ve worksheet nesnelerinde de deneyebilirsiniz ama onların eventi zaten kod peneceresinde üstteki comboboxlarda otomatik çıktığı için bu zahmete gerek yok.

Şimdi devam ediyoruz, kulanı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çılıdığı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üğünz gibi Class'ları kullandık. Class ve Class modüller hakkında daha fazla bilgiyi buradan edinebilirsiniz.

Workbook modülde Application nesnesi tanımlama

Yukarda 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 yukardaki gibi aynı kodu yazalım. Bu da bu kadar.

Private Sub myApp_NewWorkbook(ByVal Wb As Workbook)
   MsgBox "Yeni açılan dosya adı:" & Wb.Name
End Sub

Son Söz

Hangi yöntem seçilmeli

Peki biz bu iki yöntemden hangisini kullanmalıyız. Tamamen kişisel tercih olmakla birlikte üstatlara kulak verbiliriz. Derler ki, ayrı bir class modül kodların derli toplu durması adına daha iyidir. Workbook ve Worksheet sayfalarında onların kendine has kodlarını yazalım.

Olayların sırası

Elimizde myApp_SheetActivate,Workbook_SheetActivate ve Worksheet_Activate olaylarının hepsi de varsa, hiyerarşik seviyeye göre işleme girerler. Yani bir sayfa aktive olduğunda önce Application olayı, sonra Workbook olayı, en son da sayfa olayı gerçekleşir.

Çeşitli Örnekler

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 yukardaki ö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
					

myApp_WorkbookBeforePrint ile Print alma engeli

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 yukardaki ö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
					

TEST SORULARI

Son Sorumuz şuymuş:Bir metindeki tüm noktaları yoketmek istiyorsunuz. Hangi fonksiyonu kullanırdınız?
Soru:

A şıkkı:

B şıkkı:

C şıkkı:

D şıkkı:

Doğru Cevap Etiketler

İlişkili konuyu seç

166186

Label
* Sorulara verilen yanlış cevaplardaki esprili yorumlarım için hoşgörünüze sığınıyorum.
* Test ve Ödevlerdeki bazı detaylar burada anlatılmamış olabilir. Bunları kendiniz araştırıp bulmalısınız.
* Birden çok konuya ait içeriği olan ödevler var. Algoritmik açıdan bakıldığında o an en uygun konuya adreslenmiştir.
Dikkat! Bir soruya cevap verdikten sonra geri dönemezsiniz.
0
0
0
0

SoruID:... Şu an için bu konu için soru bulunmamaktadır. İletişim menüsünden örnek sorularınızı bana iletebilirsiniz.




ÖDEVLER

1
0
Ödev No:178. O anda açık olan dosyanın hangi klasörde olduğunu görmek istiyorsunuz. Ve dosyalar arasında geçiş yaptıkça da bu bilgiyi öğrenmek istiyorsunuz. Nasıl yaparsınız?
Çözüme bakın(Başka türlü de çözülebilir tabi, bu benim çözümüm.)

Private Sub myApp_WorkbookActivate(ByVal Wb As Workbook)
    myApp.Caption = Wb.Path
End Sub



=YORUMLAR ve SORULAR=


DEVİR UYARISI

Herkese merhaba. Hosting maliyetlerinin aşırı artması yüzünden sitemi yakın zamanda(en geç Mayıs 2023) kapatmaya karar vermiştim. Ancak, siteyi yakından takip eden bir arkadaş siteyi devralmak istemiştir. Siteyi, Mayıs ayında kendisine devir etmeye karar verdim. Üyelik bilgilerini bana güvenerek girdiğiniz için, hepsini silmiş bulunuyorum, yani mail adreslerinizi kimseyle paylaşmamış olacağım. Bilginizi rica ederim.