EVENT PROCEDURES

İÇİNDEKİLER

1- Event Procedure Nedir?

    Event Procedure, excel’de yaptığımız herhangi bir işlemin, olay veya hareketin bazı kodları tetitkleyerek kendi kendine çalışmasıdır. Dilimize tam olarak çevirmeye çalıştığımızda  “olay görevlendirmesi” veya “işlem görevleri”  gibi anlamsız sonuçlar elde ediyoruz. Aslında anlamı ilk cümlede de belirttiğim gibi “Olaylar tarafından tetiklenen görevler”dir. Yani “Event Procedure”, bir nevi “Etki-Tepki” şeklinde görevlerdir. Peki bu etki, olay, değişim anlamına gelen “Event” ler nelerdir?  Şimdiye kadar onlarca kere tekrarladığımız ‘Event’lere ilişkin örnekler aşağıda verilmiştir. Dersin ilerlemesi ile beraber ‘Event’ kavramı ve ne oldukları mantığınızda daha iyi yerleşecektir. Şimdi ‘Event Procedure’ kullanımını görelim.  

 

#Workbook Açmak

#Worksheet Açmak

#Worksheet Değiştirmek

#Worksheet Kapatmak

#Worksheet Kaydetmek

#Worksheet Eklemek

#Bir Hücreyi Seçmek

#Hücreye Değer Atamak

#Hücreye Yorum Yazmak

#Hücrenin Değerini Değiştirmek,

#Bir Alanı Seçmek 

#Bir Hücrenin Rengini Değiştirmek

#Bir Sayfayı Yazdırmak

#Değişikliği Kaydetmek

#Hyperlink Bağlantısı Kurmak

#Worksheet Etkinleştirmek

#Worksheet Penceresinin Boyutunu Değiştirmek

2- Event Procedure Uygulaması

    Şimdiye kadar makrolarda nesneler üzerinde metotların uygulanmasını gördük. Yani genel olarak işlemlerimizin yoğunluğu bu şekildeydi. Bu kapsamda kimi zaman bir hücre, kimi zaman da bir yazı tipi yazdığımız makro için nesne oluyordu.  “Event Procedure” uygulamalarında nesneler ise workbook, worksheet ve ActiveX elemanlarıdır. Kısaca tanımlayacağımız ‘Event Procedure’ ler nerede tanımlandıysa, tanımlandıkları nesne üzerinde bir değişiklik meydana geldiği zaman tetiklenirler. 

    İlk olarak workbook ile başlayalım .

Event Procedure Workbook_1

    İlk önce Workbook nesnesi üzerinde meydana gelen değişikliklerle tetiklenen görevleri görelim. Bunun için ilk önce workbook’un kod ekranına gitmemiz gerekiyor. Bunun için iki farklı yöntem izleyebilirsiniz. İlki VBA Editor Project penceresindeki ThisWorkbook ifadesine, şekilde görüldüğü gibi sağ tıklayıp, “View Code” seçeneğini seçebilirsiniz. Veya daha kolay bir şekilde ThisWorkbook ifadesi üzerine çift tıklayabilirsiniz. Code ekranı açıldıktan sonra da üst sekmede yer alan ok işaretine tıklayarak, seçili olan General’i Workbook ile değiştiriyoruz.

Event Procedure Workbook_2

    Ve siz workbook seçer seçmez sağ tarafta “Declaration” seçeneği, workbook nesnesinin default procedure’ü olan Open procedur’ü ile değişecek ve otomatik olarak Open prosedürüne ait Private Sub kod sayfasına gelecektir.Event Procedure_Workbook_Open()

 

 

NOT: Elimden geldiğince derslerde Türkçe kelimeler kullanmaya  dikkat ediyorum. Ancak bu konuda Event ve Procedure kelimeleri yerine ne Türkçe kelimeler kullanmam kavram kargaşasına yol açtığı için, Event’i aynı şekilde, procedure kelimesini de Tükçe’ye de geçen haliyle prosedür şeklinde kullanacağım.

    Workbook nesnesini seçerek otomatik olarak Open Prosedürünün açılmasını da sağlamış olduk. Peki bu Open prosedürü ne anlama geliyor. Aslında çok basit artık bizim 

Private Sub Workbook_Open()

End Sub 

Adında bir özelleşmiş Sub-Routine’imiz var. Bu da şu anlama geliyor; bizim bu özelleşmiş Sub-Routine içerisine yazdığımız kod, bu workbook her açıldığında otomatik olarak çalışacaktır. Yani bu kodu tetikleyen Event yani olay, workbook_Open() yani Workbook’un açılmasıdır. Şimdi bir örnek üzerinde bu işlemi canlandıralım. 

    Her gün üzerinde çalıştığınız bir workbook’unuz olduğunu düşünün. Peki her seferinde bu workbook’u açtığınızda sizi selamlayan bir mesaj ekranda görüntülense?

Yada workbook’a sizden başka birileri de giriyorsa ve siz onları workbook üzerinde değişiklik yapmamaları gerektiğini bir mesaj ile bildirseniz? Şimdi bu konuda çok basit bir örnek işleyelim.

    Videoda da anlattığımız işlemleri tek tek inceleme fırsatımız oldu. Genel olarak prosedürlerin kullanım şekli bu şekilde. Yani ilk önce nesneyi seçiyoruz, bizim örneğimizde nesne workbook, sonra da prosedürü seçiyor ve özelleştirilmiş Sub-Routine içerisine çalışmasını istediğimiz kodu giriyoruz. 

2.1- Event Procedure - BeforeSave

    Şimdi yeni bir örnekle konuya devam edelim. Örnek olarak seçtiğimiz prosedürümüz BeforeSave prosedürü. Yani; workbook kaydedilmek istendiğinde eğer bir işlemin tetiklenmesini istiyorsanız, bu BeforeSave prosedürünü kullanıyoruz. 

    Örneğimizde bizim dışımızda yapılan değişikliklerin kaydedilmesine izin verilmemesini istiyoruz. Bu amaçla da workbook da ‘Save’ tuşuna basıldığında tetiklenen bir kod yazıyoruz. Bu kod sayesinde birisi Save tuşuna bastığı zaman ekrana bir InputBox açılıyor ve kullanıcıdan şifre talep ediyor. Eğer şifre doğru girilirse, workbook kaydetme işlemini gerçekleştiriyor. Aksi halde yapılan değişiklikler kayıt edilemiyor.

Event Procedure BeforeSave_PrivateSub

    BeforeSave’a ait özelleştirilmiş Sub-Routine’e bakarsanız burada Cancel As Boolean yazdığını görürsünüz. Bu, eğer isterseniz kaydetme event’ini iptal edebilirsiniz demektir. Biz de kod içerisinde If koşullu durumu kullanarak, şifrenin doğru girilmediği anlarda Cancel=True diyerek, kaydetme iptalinin gerçekleştirilmesini sağladık. Şifrenin doğru girildiği anda ise hiç bir sorun yaşanmadan, ekrana hem kaydetme işleminin gerçekleştirildiğini kullanıcıya bildiren bir mesaj yazdırılmasını sağladık hem de kaydetme işleminin normal çalıştığı durumda bıraktık.

Burada Cancel=True—>Kaydedilme İptal Edilsin–> Evet

Cancel=False—>Kaydedilme İptal Edilsin—> Hayır Anlamına Gelir.

3- Private Sub-Routine Nedir?

    Normal bir Sub-Routine’den çok da farklı olmayan Private Sub-Routine’ler otomatik olarak belirli olaylara tepki verebilen Sub-Routine’ler yani görevlerdir. Herhangi bir şekilde VBA Editor’den Play Tuşu, F5 tuşu yada bir tuş ile tetiklenmeye ihtiyaçları yoktur. Sadece belirlenmiş olan tek bir olaya karşı tepki verirler. Örneklerde olduğu gibi kimi zaman workbook açılışına, kimi zaman kapanışına kimi zaman da değişkilikler kaydedilmek istendeiğinde devreye girerler. Kimileri tetiklendikten sonra durdurulamaz, iptal edilemez. Kimileri ise aynı ‘BeforeSave’ gibi iptal edilebilir veya bir koşula bağlanılabilir. Private Sub-Routine  ve Sub-Routine’ler arasında ilk satırları ve tetiklenme mekanizmaları dışında bir farklılık bulunmamaktadır.

Event_Procedure BeforeSave_SifreSormaEkranı

    Save tuşuna basıldığı anda bu talep BeforeSave prosedürünü tetikler. Prosedürde bu kapsamda workbook’u kaydetmeden önce ilk önce bizim kodladığımız şekilde kullanıcıyı uyaran yukarıdaki InputBox ekrana getirir ve şifrenin girilmesini talep eder.

Event Procedure BeforeSave_SifreSorma_OlumsuzCevap

    Eğer kullanıcı şifreyi bilmiyorsa If bloğunda Else bölümü devreye girer, kaydetme işlemini iptal eder. Bu şekilde workbook’unuz, dış müdehalelere karşı korunmuş olur.

Event Procedure BeforeSave_SifreSorma_Olumlu

    Eğer kullanıcı şifreyi biliyorsa da ekrana değişikliklerin kaydedildiğine dair bir mesaj gelir ve ‘OK’ tuşuna basar basmaz yapılan değişiklikler kaydedilmiş olur.

    Bu noktada Workbook’a ait örnekleri sonlandırıp Worksheet’e ait örneklere geçiyoruz. Eğer bu konunun tam olarak aklınıza yerleşmesini istiyorsanız, gördüğünüz örnekleri kendi workbook’unuza uygulamanız ve diğer prosedürleri incelemelisiniz. Ancak bu şekilde Even Procedure konusunun bütün kapsamına ulaşabilirsiniz.

4- Worksheeet Event Procedure Uygulamaları

    Workbook’un nesne olarak değerlendirildiği ve workbook üzerindeki olaylara yanıt veren prosedürlere ait örnekleri gördük. Şimdi de Worksheet’in nesne olarak değerlendirildiği durumları inceleyelim. Aynı Workbook nesnesinde olduğu gibi worksheet nesnesi ile ilgili de Event’lerin tetiklediği çokca prosedür var. Worksheet içinde bir hücre seçme, yeni worksheet ekleme ve etkin hale getirme işlemleri birçok event’ten sadece birkaçıdır. Şimdi bu event ve prosedürlere bir kaç tane örnek verelim. 

    Workbook’a air kodları görüntülemek için biliyorsunuz ya workbook üzerinde sağ tıklayıp açılan seçenkelerden ‘View Code’ seçeneğini seçmemiz gerekiyordu ya da daha basit olarak çift tıklamak. Worksheet için de aynı seçenekler söz konusu. 

    Sheet1(Sheet1)’e çift tıklayarak worksheet’e ait kod ekranını açıyoruz. Sonra da ‘Object’ seçeneğinden (General)’i değiştiriyor ve worksheet’i seçiyoruz. Worksheet nesnesine ait olan ilk event yani olay;

Private Sub Worksheet_SelectionChange (ByVal Target As Range)

End Sub 

     Burada Target As Range ibaresinden Target’in Range tipinde bir değişken olduğunu görüyoruz. Yani worksheet içinde bir hucre, bir alan seçildiğinde bu prosedür devreye girecektir. Mesela seçilen bir hücrenin sarı renge boyanması,  ‘SeçiminDeğişmesi-SelectionChange’ prosedürü ile sağlanabilir. Peki bu ne işime yarar diye sorarsanız, aklıma birkaç örnek geliyor. Worksheet içerisinde maksimum değeri görmek isterseniz bu prosedürü kullanabilirsiniz. Aynı şekilde en küçük değeri de. Kullanılan bir verinin tekrar kullanılmamasını sağlamak için de kullanabilirsiniz. Prosedür içerisinde hemen bir koşullu durum oluşturup boyalı hucredeki değeri okumamasını söyleyerek, maksimum değeri kopyalayan bir Sub-Routine ile en büyükten en küçüğe giden bir liste hazırlayabilirsiniz. Veya amiral battı oyunu oynayabilirsiniz. Tamamen size kalmış. Şimdi burada bir örnek oluşturarak hücre renklerini yani(Target) değiştirecek bir Private Sub yazalım. 

 

4.1- Worksheet_SelectionChange Prosedürü Örnekleri

Sağ tarafta gördüğünüz özelleştirlimiş Sub-Routine, bizim worksheet üzerinde tek ya da blok olarak seçtiğimiz herhangi bir hücrenin renginin açık mavi renge dönüşmesini sağlıyor. Peki bu işlemin sadece tek hücre seçiminde ve belirli bir aralıkta geçerli olması mümkün müdür? Evet tabi ki mümkündür. Prosedürlerin içerisine yazacağımız koşullu durumlarlar ile istediğimiz şekilde prosedürlerin etkilerini sınırlandırabiliriz. 

    İkinci örnekte prosedürü nasıl belirli aralıkta çalışması için programladığımızı görelim.

   

Event Procedure Worksheet_ChangeSelection_Code_1

  • Bu kod içerisinde seçilen alanın Target olarak kullanıldığını yani hedef olarak kullanıldığını görebilirsiniz. Aynı kod içerisinde Target yerine Selection’da kullanabilirsiniz.

Event Procedure Worksheet ChangeSelection_Code_2

    Prosedürü sınırlayan iki adet koşullu durum oluşturduk. Koşullarımızdan ilki seçilen Hedefin(Target yani Selection) hücre sayısının 1’e eşit olması. Bu sayede sadece tek hücre seçtiğimiz zaman hücre 2. koşullu durumu sağlar ise prosedür çalışacak. Aksi durumda yani seçilen alanın birden fazla hücreden oluşması durumunda ilk koşul sağlanamadığı için 2. koşula geçmeden Sub-Routine Sonlanacak.

   İkinci koşul ise seçilen hücrenin satır ve sütun genişkilerinin 10’dan büyük olmamasıdır. Yani 10’a 10 büyüklükteki tablo içerisinde seçeceğiniz tek bir hücrenin rengi değişecektir.

4.2- Önemli Notlar; CountLarge/Range.Row-Range.Column

NOT_1 : CountLarge Metodu

    Seçilen hücreleri saymak amacıyla kullanılan ‘.Count’ metodu Long veri tipinde sonucunu depolamaktadır. Long veri tipinin de depolayabileceği sayı aralığı ise -2 147 783 648 ile 2 147 483 647 arasındadır. Ve bu rakam normal bir excel worksheeti oluşturan 17 179 869 184 adet hücre sayısından küçüktür. Bu durum ‘.Count’ metodunun worksheet üzerinde bütün hücreleri saymak için kullanıldığında programın hata vermesine sebep olur. Bu durumdan bahsetmemim sebebi ise 2.örneğimizde Target’ın sahip olduğu hücreleri saymamız gerektiğidir. Eğer kullanıcı bütün worksheet’i seçerse ve biz de ‘.Count’ metodunu kullanmış olsaydık, Sub-Routine hata vermiş olacaktı.

     Microsoft bu sorunu 2007 sonrası sürümlerinde, ‘.Count’ metodundan daha büyük sayıları sayabilen ‘.CountLarge’ metodunu VBA’ya ekleyerek çözdü. Biz de yanlışlıkla veya bilinçli olarak worksheette yer alan bütün hücrelerin seçilmesi halinde hata ile karşılaşmamak için bu Sub-Routine’de ‘.CountLarge’ metodunu kullandık.

NOT_2 : Range.Row - Range.Column

    Daha önce bir çok kez Offset metodunu kullandık. Offset metodunda sadece parantez içerisinde kaydırmak istediğimiz satır ve sütun sayılarını girerek (ActiveCell.Offset(3,9)) istediğimiz yönde ilerleyebiliyorduk. Burada da benzer bir yöntem izliyoruz. Worksheet başlangıç noktasında itibaren yani sol üst köşeden itibaren olmak üzere sağa ve alta doğru her hücre için bir numara vererek bir alan belirtebiliriz. Bizim örneğimizi ele alalım. 

Target.Row <= 10 demek seçilen hücrenin satırının maksimum 10

Targer.Column <= 10 demek de seçilen hücrenin sütununun maksimum 10. sütun olabileceği anlamına gelmektedir. 

Yani worksheet’in en üst sol köşesinden itibaren 10’a 10’luk bir alan içerisinde bu prosedürün çalışacağı ve sadece bu alanda seçilen hücrelerin renklendirileceği koşula bağlanmıştır.

4.3- Worksheet_Change Prosedürü Örnekleri

     Worksheet_Change(ByVal Target As Range) prosedürü, worksheet içerisinde yer alan bir Alanın, Tek veya birden çok hücreden oluşabilir, değerinin veya değerlerinin değiştirlmesi ile tetiklenen bir prosedürdür. Bu kapsamda bizim işleyeceğimiz örnek; hücrenin değiştiği zaman içine yeni yazılan değeri, kimin değişiklik yaptığını ve hangi tarihte yaptığını yazdıracağız.

4.4- Önemli Notlar; Range.AddComment/Range.Comment.Text

NOT_3 : Range.AddComment

    ‘.AddComment’ metodu sayesinde hücrelere yorum yazdırabilmekteyiz. 

AddComment Parametreleri

    AddComment metodunu yukarıda görüyorsunuz. Tek bir adet parametresi var ve bu parametre de yazmasını istediğiniz yorum. 

    AddComment metodunu bir Range olan Hucre ile yukarıda gördüğünüz şekilde  kullanabiliyoruz. 

    Eğer aynı değeri değişecek olan hücrenin değeri zaten daha önceden değiştirlmiş ve içerisinde de bir yorum varsa ve biz ikinci kez bir değişiklik yapmak istersek, ‘AddComment’ metodu ‘1004’ Run-Time Hatası verecektir. 

    Halihazırda olan bir yorum eğer değiştirilecek veya ilk yorum durum ikinci bir yorum daha eklenecekse o zaman kullanacağımız .Comment.Text’ şeklini kullanırız. Şimdi Not 4’te bu işlemi görelim.

AddComment Mesaj

    Worksheet üzerinde bir hücreye 15 yazdık ve ‘Enter’ a basarak hücrenin değerini değiştirmiş olduk. Bu işlem yani ‘EVENT’otomatik olarak Worksheet_Change prosedürünü çalıştırıyor ve değeri değişmiş olan hücrenin içerisine yorum olarak “Selam” yazdırıyor.

NOT_4 : Range.Comment.Text Metodu

    Not 3’te de bahsedildiği gibi eğer yapılan yorumu değiştirmek veya silip yeni bir yorum eklemek istersek o zaman kullanmamız gereken metot Expression.Comment.Text metodudur. Kısaca bu metot yorumun text kısmını yani yazılı kısmını düzenlememize olanak verir.

Event Procedures-Change_Comment

    Burada oklarla parametleri oklarla göstermeye çalıştım. Şimdi de açıklamalarını inceleyelim.

    Text:

    İlk parametremiz, ilk yoruma eklenecek veya eski yorumun yerine gelecek olan yeni yorum cümlesidir. Burada vbNewLine ile başlamamızın sebebi, önceden yorum varsa okuması kolay olması için yorumların alt alta gelebilmesi içindir. Sonrasında ‘Now’ Fonksiyonu ile değişimin tarihi ve saati, Hucre.Value ile yapılan değişiklik, sonra ayırıcı olması için ‘-‘ ve son olarak da kullanıcının bilgisayardaki adını yazdırıyoruz. Biz bu görselde Hucre olara Range’i yani bir Cell’i kastettik. Worksheet_Change özelleştirilmiş Sub-Routine’inde Target ifadesini kullanacağız:

    Start:

    Start ise yeni yapacağımız yorumun eskisine ekleneceği durumlarda kullanılır. İlk yapılan yorumun, kaçıncı hanesinden sonra yeni yapılan yorumun ekleneceğini bu parametrede girmeliyiz. Bu kapsamda biz ilk yorumun uzunluğu + 1((LEn(Hucre.Comment.Text)+1) sayısını start için vererek ilk yorumun sonunun bir boşluk sonuna yeni yorumun eklenmesini uygun gördük. Text parametresi vbNewLine sayesinde bir alt satırdan başlayacağı için çok sıkıntı yaşanmasa da yine de arada bir boşluk bırakmak her zaman faydalıdır.

    Overwrite:

    Bu bir True-False seçeneğidir. Eğer eski yorumunun silinip sadece yeni yorumun kalmasını istiyorsak True, eski yorum silinmeden yeni yorumun eklenmesini istiyorsak da False seçeneğini seçiyoruz. Aynı bizim bu örnekte yaptığımız gibi.

 

    Sağ tarafta eklenmiş olan kod ile her yapılan değişiklik için, değişiklik yapılan hücreye yapılan değişikliğe dair yorum ekleyebiliyoruz.

     Bu kapsamda kodumuzu daha iyi anlayabilmek açısından 5 kısma ayırdık ve sağ taraftaki görselde gördüğünüz gibi numaralandırdık. 

    Kodu incelemeye başlamadan önce yorum ekleme metotu ve özelliklerine dair hazırlamış olduğumuz Not-3 ve Not-‘ü inceleyelim. Bu notlarda daha önce görmediğimiz  Expression.Comment ve Expression.Comment.Text metotları bulunmaktadır.

Event Procedure Worksheet_Change

    1 Numaralı Kısım 

    Bu kısım, For döngüsünde kullanılacak olan ‘Hucre’ değişkenin tanımlandığı kısımdır. Bir Range tipinde veri olarak tanımlanan ‘Hucre’ değişkeni Target ifadesinin yani bir alanın içinde yer alan bir hücre yerine kullanılacaktır. Burada Target ise değişikliğin meydana geldiği bölgeyi kapsayacaktır.

2 Numaralı Kısım

    Bu kısımda worksheet üzerinde bir anda meydana gelen değişikliklerin ne çapta meydana geldiği kontrol ediliyor. Sınır olarak 1000 hücre kabul ediliyor. Yani eğer 1000 hücreyi aşan bir alanda değişiklik meydana gelirse Sub-Routine’den kapatılacaktır. Bunun sebebi ise Target’ın yani değişiklik yapılan alanın büyümesiyle beraber For döngüsünün bu alanda yapılan değişiklikleri kontrol edip yorum ekleme işleminin uzun süreceğinden dolayıdır.

    3 Numaralı Kısım 

    Değişikliklerin gerçekleştiği alandaki her hücrenin tek tek değerlendirilebilmesi için kurulmuş bir döngüdür. İlk Target içindeki ilk hücreden sonra hücreye kadar tek tek her hücre kontrol edilir ve 4. Kısımdaki If bloğu her bir hücre için çalıştırılır. 

4 Numaralı Kısım

    Bu kısım değişiklik yapılan hücrenin içinde daha önceden yazılmış bir yorum var mı yok mu onu kontrol eden bir koşullu durum bloğudur. Eğer daha önceden hücre içinde bir değişiklik gerçekleşmiş ise If bloğuna ait Else bölümü tetiklenecek ve ilk kez yorum penceresine yorum eklenecektir. Ancak eğer boş değilse o zaman da ilk yorumun bulunduğu satırın bir altına yeni yorum expression.Comment.Text(Text, Start, Overwrite) metoduyla eklenecektir. 

 

    5 Numaralı Kısım 

    Bu kısım tamamiyle yazılmış olan yorumların penceresinin düzenlenmesini kapsamaktadır. Yorum penceresinde 1 veya bir kaç adet yorum bulunduğunda yorum penceresi muhakkak yeterli olacaktır. Ancak ne zaman hücrenin içindeki güncellemelerin sayısı artar, o zaman yorumlar yorum penceresinde okunamamaya başlar. Bu yazdığımız kod ile de yorum penceresi kendisini otomatik olarak kendi içindekilere göre boyutlandıracaktır.

5- Event'lerin Kendi Kendisini Tetiklemesinin Önüne Geçebilmek

    Bazı ‘Event’ler kendini tekrar eden niteliktedir. Yani Event gerçekleştikten sonra kendi kendini tekrar eder ve bir döngü oluşturur. Buna en iyi örnek ‘Workbook_NewSheet’tir. Event yani procedure’ü tetikleyen işlem workbook’a yeni bir sayfa eklenmesidir. Normal durumda tek bire worksheet eklendiği zaman sıkıntı olmamaktadır. Ancak ne zaman Worksheets.Add metodunu kullanırak, birden fazla sheet ekleriz o zaman her sheet eklendiğinde olaylar yeniden tetiklenirler. Şimdi örnek üzerinde bu olaya göz atalım. 

    Event Procedures Workbook_NewSheet_1

    İlk etapta kodu incelediğimizde herhangi bir sıkıntı görünmüyor. Hatta gayet mantıklı bir kod gibi görünüyor. Workbook’a yeni bir sayfa eklediğimizde karşımıza bir veri giriş penceresi çıkıyor ve bize başka sayfa eklemek isteyip istemediğimizi soruyor. Eğer cevap birse, zaten bir adet sayfa eklediğimiz için hiç sayfa eklemeden Sub-Routine’den çıkılıyor. Ama eğer 5 adet sayfa eklemek istiyorsak da 5-1(ilk eklenen ve bu proceduru tetikleyen Event), 4 adet sayfa ekleniyor. İstenilen bu yazdığımız senaryo ancak ortada çok ters bir durum var. Çünkü prosedürü tetikleyen Event sayfa eklenmesi. Yani her sayfa eklendiğinde tekrar bu prosedür tetiklenecek ve bize kaç adet sayfa girmemiz gerektiğini sorarak bir sonsuz döngü yaratacak ve program hata verecektir. Bu durumda kodu yenilememiz, ek kodlar eklememiz gerekmektedir. 

InputBox-Veri Giriş Penceresi Dersini Hatırlamak İsteyenler Allat Yere Alan Tuşa Basarak Dersin Sayfasını Ziyaret Edebilirler.

   

    Event Procedures EnableEvents_False

    Worksheet.Add satırından önce resimde görüldüğü gibi Event’leri kapatıp, sonrasında açarsak bu hatayı by-pass etmiş oluyoruz. Bu gibi Event Procedure’ler düzenlerken Event’leri kapatıp açma seçeneğiniz olduğunu aklınızdan çıkartmayız.

InputBox-Veri Giriş Penceresi Dersini Hatırlamak İsteyenler Allat Yere Alan Tuşa Basarak Dersin Sayfasını Ziyaret Edebilirler.

6- Application Level Events

    Worksheet ve workbook Event ve prosedürlerini şimdilik geride bırakıyoruz. Şimdi ise Event Procedure uygulamalarına daha geniş çerçeveden bakma vakti. İlk olarak Event Procedure işlemlerinin çalıştığı durumları tekrar gözden geçirelim. Aslında dikkatinizi çekmek istediğim nokta; bütün işlemler yani procedure’lerin açık olan worksheet’ler üzerinde veya workbook’lar üzerinde gerçekleşiyor olması. 

     Bir workbook açtıktan sonra VBA Editor penceresinden, workbook veya worksheet’e ait kod ekranını görüntüleyerek istediğimiz kodları, Event’lere göre prosedür oluşturarak girebiliyoruz. Sonra workbook’u kapatsak dahi, ekrana selamlama yazdırdığımız gibi, tekrar workbook’u açtığımızda bizi mesaj karşılayacaktır. 

    Peki biz henüz açılmamış olan workbook’ta bu işlemi gerçekleştirebilir miyiz??? Evet gerçekleştirebiliriz ve bu uygulamanın adı da : ‘Application Level Procedure’ dur. Yani daha önceden yaptığımız örneklerde workbook ve worksheet’te gerçekleşen olaylar(event) procedure’leri tetiklerken, ‘Application Level Procedure’de,  sıfırdan obir workbook luşturmak gibi program(excel) seviyesinde yaptığımız hareketler, yazılan prosedürleri tetiklemektedir.

    Application Level Events, anlam itibariyle de ‘Uygulama Seviyesindeki Olaylar’ anlamına gelir. Workbook oluşturma örneği ile devam edelim. Workbook’u nesne olarak değerlendirdiğimizde workbook’un kod ekranına girip event’lere göre prosedür oluşturmamız gereklidir ki workbook açıldığında tetiklenen prosedür arzu ettiğimiz değişikliği gerçekleştirsin. Ancak uygulama seviyesinde ‘Evenet’lere göre bir prosedür oluşturursak, bu sefer yeni açtığımız workbook, prosedürün yaptığı değişiklikler yapılmış şekilde açılacaktır. Event Prosedür ve Application Level Event arasındaki fark budur. Hazırladığımız örnekle aradaki farkı daha iyi kavrayabileceksiniz.

    İlk olarak bahsi geçen ‘Application’ sınıfına(Class) ve bu sınıfın üyelerine(Members) inceleyelim. Ne yazık ki ‘Application Level Events’ uygulamarını oluşturmak workbook ve worksheet Event Procedure’lerini oluşturmaktan bir adım daha karmaşık. En azından Workbook veya Worksheet üzerine çift tıklayıp nesneye ait ekranı seçemiyoruz. Bu noktada uygulamayı gerçekleştirebilmemiz için;

     View—–>Object Browser’a tıklıyoruz ve açılan Classes penceresinden Application Sınıfını seçiyoruz. Her sınıfın onlarca üyesi vardır ve biz farklı bir sınıf seçtiğimizde o sınıfa ait üyeler Memebers penceresinde listelenir. Bizim işlediğimiz konu itibariyle Application’a ait Event’leri bütün liste içerisinde seçebiliyor olmamız gerekmektedir. Bu konuda Excel bize yardımcı olmak amacıyla elinden geleni yapmış ve sınıflara ait ‘Event’lerin önlerine küçük bir şimşek(yıldırım) işareti eklemiştir. 

    Sağ tarafta ‘Object Browser’ penceresini görmektesiniz. Yeşil kutucuğun içerisinde Application sınıfını ve bu sınıfına ait yine altı yeşil ile çizilmiş ‘AfterCalculate’ Event’ini görüyorsunuz. Members penceresinin sağ tarafında mouse ile tıklanarak listeyi aşağı yukarı hareket ettirmemize olanak veren tutacağın boyundan listenin ne kadar uzun olduğunu, dolayısıyla ‘Member’ sayısının çok fazla olacağını tahmin edebilirsiniz(250 civarı).

Application Level Events Object Browser

Application Level Events Object Browser Members

    Members penceresinin en altına indiğimizde alt alta bir çok ‘Event’ görülebiliyor.

7- Application Level Event Oluşturulması-1

    Application Level Event oluşturmanın iki farklı metodunu bu ders kapsamında göreceğiz. Bunlardan ilki yine ThisWorkbook’a çift tıklayarak açtığımız ekranda yapacağımız kodlamadır. Şimdi bu ilk metodu inceleyelim.

    Yapmamız gereken ilk şey Application’a yani uygulamaya ait bir bağı bünyesinde barındırabilecek bir değişkenin, özel değişkeni tanımlamaktır. 

 

    Bizim bu noktada amacımız tanımlamış olduğumuz xlUygulaması’nı nesne olarak seçebilmektir. Bildiğiniz gibi nesne olarak seçebildikten sonra Event’lere ulaşabiliyoruz. Aynı Workbook ve Worksheet’i ilk başta nesne olarak seçmiş olduğumuz gibi. Ancak gördüğünüz gibi şu anda değişken olarak tanımladığımız xlUygulaması, nesne olarak görüntülenememektedir. Hem xlUygulaması’nın nesne olarak görüntülenmesi hem de Application sınıfına ait Event’lere ulaşmak için ‘WithEvents‘ anahtar kelimesini, değişken tanımlama satırında kullanmamız gerekmektedir. Yani;

    ‘Private WithEvents xlUygulaması As Application’ değişken tanımlama satırını gördüğünüz şekilde değiştirirsek bu sefer xlUygulaması ve tanımlanmış olduğu Application’a ait bütün Eventleri görebiliyor olacağız.

 

 

    Artık Application’ ait bağlantıyı referans olarak barındırabilen bir değişkeni tanımlamış bulunuyoruz.  Artık belirttiğimiz değişkene, nesneye ait bir Private_Subroutine defalut olarak ekranımızda görünmektedir ve bu ‘xlUygulaması_NewWorkbook(ByVal Wb as Workbook)‘ tır. Yani yeni bir workbook sıfırdan açtığımızda buraya yazdığımız kodlar bütün workbook’lar üzerinde işlem yapacaktır.

    Şimdi basit bir kod ile bu işlemi inceleyelim. 

 

    Worksheet ve Workbook’u nesne olarak seçtiğimizde bu kadarı yeterli olmaktaydı. Yani Event meydana geldikten hemen sonra prosedür çalışırdı. Ancak Application Level Event işlemlerinde durum biraz daha farklı. Mesela bu üstte gördüğünüz kodun normal koşullarda çalışması gerekiyor gib ancak siz yeni bir workbook açsanız dahi çalışmayacaktır. Bunun için kod sayfamıza son bir ekleme daha yapmamız gerekiyor. 

    Farkettiyseniz kendimize bir adet ‘xlUygulaması’ değişkeni tanımladık ancak bu tanımladığımız değere bir değer atamadık. Şimdi yapacağımız işlemde değişkenimize bir değer, referans atamak olacaktır. Bunun için ‘Workbook’ nesnesini seçiyoruz. Default olarak yine Workbook_Open Event’i gelecektir. Açılan bu Sub-Routine İçine aşağıda olduğu gibi xlUygulaması’na Application referansını atıyoruz. 

    Private Sub Workbook_Open()

            Set xlUygulaması = Application

    End Sub 

    Kodun en son hali;

 

     Artık her sıfırdan bir workbook açtığımızda ‘Event Level Application’ bu prosedürü tetikleyecek ve açılan her yeni workbook’un birinci sayfasının [a1], [a2], [b1] ve [b2] hücrelerine workbook açılan bilgisayardaki kullanıcı ismi ve tarihi yazılacaktır. İşlem sonunda karşılaşmamız gereken tablo;

Event Procedures_Application_Level

    Kodun yazılı olduğu workbook açıkken excel’de yeni bir workbook açılırsa (CTRL+N), ilk sayfalarında yukarıda gördüğünüz gibi Kurucu, Kurulum Tarihi ve karşılıkları yazılmış olarak açılacaktır. 

    Gördüğünüz gibi yeni açılan workbook’a ile ilgili en ufak bir işlem gerçekleştirmedik. Ancak yine de üzerinde değişiklik yapılmış şekilde açıldı. Yaptığımız değişiklik sayesinde kullandığımız excel programına her açılan yeni workbook’u nasıl açması ile ilgili komut girmiş olduk. Kısaca excel uygulamasını yeni açılan workbook ile ilgili programlamış olduk. Bu sebepten ötürü bu işlemin adı ‘Uygulama Düzeyinde Olaylar’ dır.

8- Application Level Event Oluşturulması-2

     Application Level Event oluşturmak için izlenen ikinci yol ise ‘Class Module’ kullanımıdır. Class Module ile ilgili detaylı notlar ve dersler ileriki dönemlerde işlenecektir. Şimdilik sadece Application Level Events oluşturmak amacıyla kullanacağız. 

    VBA Editor’e Sub-Routine yazmak için ‘MODULE’ ekleme işlemini hatırlıyorsunuz. Class Module’de ayı şekilde VBA Editor’e eklenebiliyor. 

 

     Görselde de görebileceğiniz üzere ‘Class Module’, Module’ün hemen altındaki seçenektir. Sonrasında ilk metotta olduğu gibi bir değiken tanımlıyoruz. Daha sonra da nesneler listesinden class’ı seçiyoruz. Bu seçim ile beraber ‘Class’a ait ‘Initialize’ Event’i kod ekranına default olarak geliyor.

     Class’ı nesne olarak seçtikten sonra Initialize Event’i default olarak ekranda görünür.

 

    Aynı bir modülün adını değiştirirmiş gibi şimdi de Class Module’ün adını Properties penceresinden değiştiriyoruz ve ‘AppLevelEvents’ yapıyoruz. Şimdi kodlamaya başlayabiliriz. Değişken olarak xlUygulama tanımladıktan sonra dediğimiz gibi nesne olarak xlUygulama seçtik ve ilk olarak ekrana Class_Initialize çıktı. Şimdi;

     Private Sub Class_Initialize()

         xlUygualama = Application 

     End Sub

şeklinde bu kısmı değiştiriyoruz. Sonra da Nesne olarak workbook seçiyoruz. Workbook seçilir seçilmez Initialize Private Sub-Routine’in altına 

    Private Sub xlUygualama_NewWorkbook(ByVal Wb As Workbook)

    End Sub 

gelecektir. Şimdi de bu Sub-Routine içerisine 

                                  Wb.Worksheets(“Sheet1”).Range(“a1”).Value = “Kurucu”

                                   Wb.Worksheets(“Sheet1”).Range(“b1”).Value = Environ(“Username”)

                                  Wb.Worksheets(“Sheet1”).Range(“a2”).Value = “Kurulum Tarihi”

                                  Wb.Worksheets(“Sheet1”).Range(“b2”).Value = Date

                                   Wb.Worksheets(“Sheet1”).Range(“a:b”).Columns.AutoFit

kodumuzu yapıştırıyoruz. Artık bu sayfada işimiz bitti. 

 

     Sıra Workbook nesnesine ait kod ekranında yapacağımız değişikliklere geldi. İlk önce daha önceden tanımlamış olduğumuz ve Application’a referans oluşturan değişken tanımını değiştiriyoruz. Artık tanımlamış olduğumuz Class’a ait bir eleman(Instance) oluşturabilmek için bir değişken tanımlıyoruz. 

     Private xlUygulama as AppLevelEvents

     İkinci olarak Workbook_Open() içerisinde yeni tanımladığımız değişkeni, AppLevelEvents sınıfı için yeni bir eleman(Instance) olarak atıyoruz. Bu sayede her yeni workbook açıldığında(Kodun yazılı olduğu workbook açıkken) workbook nesnesi, AppLevelEvents Sınıfını tetikleyecek ve açılan workbook’un ilk sayfasına istediğimiz kurucu ve kurulum tarihlerini yazdıracaktır.

 

     Resimde de görüldüğü gibi artık Class’a ait Elemanlar oluşturmak için Workbook Nesnesine ait kod ekranını kullanıyoruz.

     Yine kodun kayıtlı olduğu workbook açıkken yeni bir workbook açmak istersek, açılacak olan workbook istediğimiz şekilde Sheet1 de kurucu ve kurulum tarihi kayıtlı şekilde açılacaktır. 

     Bu metot ilk metoda göre biraz karışık gelebilir. Ancak birden fazla event’ler için işlem yapmak istenirse daha kullanışlı olacaktır. Yine de tamamiyle seçim size ait.

 

Dünya Çapında Araştırmacılara Ait Çalışmaları Okumak İsterseniz https://www.researchgate.net/profile/Ender_Dagdelen adresini Ziyaret Edebilirsiniz. Ana Sayfaya Dönmek İsterseniz De Aşağıdaki Tuşu Tıklayınız.

HERKESE KOLAY GELSİN, İYİ ÇALIŞMALAR…

Soru ve Öneriler İçin;

[email protected]