ERROR HANDLING
-
Hata Ayıklama

1- Error Handling Nedir?

    Makrolar veya herhangi bir dilde yazılan programların ve uygulamaların çalıştırılmaları esnasında sorunlar ile karşılaşılabilir. Bu ortaya çıkan hataların birden çok nedenleri vardır. Programların çalışması esnasında meydana gelebilecek olan hatalara sadece makroları göz önünde bulundurarak örnek vermek istersek, aranılan kelimenin bulunamaması, Sub-Routine içinde geçen worksheet’in bulunaması veya kullanıcıdan yanlış tipte veri gelmesi yaygın hatalar olarak gösterilebilir. 

    Error Handling işlemi, Sub-Routine’ler çalıştırıldıktan sonra ortaya çıkabilecek hataların öngörülerek, kodlama aşamasında önlemini almaktır. Error handling yada kimi yerlerde duyabileceğiniz adıyla hata ayıklama işlemi asıl değerini, programlama bilmeyen kullanıcıların makroyu kullanması esnasında gösterir. Çünkü makroyu yazan kişi makroyu doğru bir şekilde kullanabilir veya bir hata anında kendi başının çaresine bakabilir. Ancak bu durum, normal bir kullanıcı için geçerli değildir. Kullnıcıların yaptıkları işlemlerde hatalar ile vakit kaybetmelerinin engellenmesi ve işlemlerin sorunsuz yapılabilmesi için Error Handling çok kullanışlı bir uygulamadır.

    Error Handling makrolarda özellikle program çalışırken ortaya çıkan Run-Time Errors ve yanlış yerde kullanılan ifadeler(Worksheets yerine Worksheet yazılması gibi) yüzünden ortaya çıkan Compile Error tipindeki hataların giderilmesi için kullanılır. 

    Şimdi makrolar içerisinde gerçekleştireceğimiz Error Handling uygulamasının Sub-Routine içerisinde nasıl kullanıldığına ait hazırladığımız şablonu inceleyelim. Şablon ‘Marka ve Modeline Göre Otomobil Fiyatları’ tablosundan markaya göre envanterde arama gerçekleştiren bir Sub-Routine içinde hazırlanmıştır. İlk önce Marka ve Modeline Göre Otomobil Fiyatları’ tablomuzu hatırlayalım.

Error Handling Marka ve Modeline Göre Otomobil Fiyatları Tablosu

 

 

2- Örnek-1

    1-Kullanılan değişkenlerin tanımlanması

    2- InputBox yardımıyla kullanıcıdan aradığı araç markasının girilmesi sağlanıyor.

    3- ‘On Error GoTo AracBulunamadıysa’ ifadesi, Error Handling uygulamamızın ilk ifadesidir. Bu ifade hataya sebep olacak olan kod satırının üzerine yazılır. Tabi bizim örneğimizde Arac_Hucresinin Set metodu ile alınmasında bir hata çıkmayacaktır. Çünkü eğer girdiğimiz değer .Find metotu ile bulunamasa dahi Arac_Hucre değişkeninin değeri ‘Nothing’ olacaktır ve sorunsuz bir şekilde bu kod çalıştırılacaktır. Ancak ne zaman ki Arac_Hucresi’nin yani bulunamayan bir Range değişkeni ile MsgBox’ta işlem yapmak istersek o zaman bu satır hata verecektir. Çünkü olmayan bir hücrenin değeri olmaz ve üzerinde herhangi bir metot uygulanamaz. Kısaca burada hata verecek satırın üzerine, hata anında ne yapılması gerektiğini ‘On Error GoTo …’ ifadesi ile belirtiyoruz. Şimdi ise sıra hata anında ne yapılacağı.

    8- Hatanın meydana gelebileceğini öngördük şimdi ise hata meydana gelirse ne olacağını belirlememiz lazım. Bu kapsamda Sub-Routine’in en alt kısmına istediğimiz bir hata adı yazıyoruz. Bizim örneğimizde hata, aradığımız aracın bulunamadığı pozisyonda meydana geleceği için basitçe meydana gelecek hataya ‘AracBulunamadıysa’ adını koyduk ve ve sonuna ‘:’ koyarak enter’a bastık. Otomatikman hatanın adı en sola dayanacaktır. Şimdi de hata meydana geldiğinde buraya yazacağımız kodun çalışmasını istediğimiz için ‘On Error GoTo’ ifadesine yani ‘Hata Anında …  Git’ ifadesine bu hatanın ismini yazıyoruz.

    Yani VBA Editor’e eğer hata gerçekleşirse alternatif olarak ne yapacağını söylüyoruz. 

AracBulunamadıysa: Hata isminin altına da alternatif olarak hata anında ne yapılması gerektiğini yazıyoruz.

    9- Bu kısıma hata anında alternatif olarak çalışması istenilen kod girilir. Bizim örneğimizde aradığımız araç bulunamadığında bir Run-Time hatası ortaya çıkar. Ancak kodu Error Handling işlemiyle modifiye ettiğimizde, burada yani 9. kısımda yazan MsgBox “Arac Markası Envanterimizde Bulunamamaktadır.” kodu çalışır ve program hata vermeden, böyle bir mesaj ile kullanıcı bilgilendirilmiş olur.

    10- Bu kısımda yazan Resume Next, artık alternatif kod da çalıştı, hata veren kodun bir alt satırından Sub-Routine’in çalıştırılmaya devam ettirilmesi gerektiğini VBA Editor’e belirtir. 

    4- Bu satır ile aradığımız araç modelini bir değişkene InputBox yardımıyla atarız.

    5- Belirlenen model sütununda InputBox ile girilmiş olan araç modelini arayan ve bulduğu zaman da aracın marka model ve fiyat bilgilerini kullanıcıya veren satırdır. Bu satır bizim Sub-Routine içerisinde hataya neden olabilecek satırdır. 

    6-On Error  GoTo 0 ifadesi, bu ifadenin altında Sub-Routine içinde başka bir hata meydana gelse dahi, özel olarak aranılan aracın bulunmadığı durum için yazılmış olan  ‘AracBulunamadıysa:’ isimli Error Handling kodunun çalışmamasını sağlar. Eğer bu ifadeyi hata vereceğini düşündüğümüz kodun altına eklemezsek, meydana gelen her hatada ‘AracBulunamadıysa:’ isimli ErrorHadnling çalışacaktır.

    7- Sub-Routine içerisinde kod satırları aşağı doğru sırayla VBA Editor tarafından çalıştırılır. Exit Sub ifadesi ise hata olmadığı anlarda Error Handling satırlarının çalıştırılmasını engeller. Sub-Routine’in sınırını belirler. Eğer Exit-Sub ifadesi kullanılmazsa Error Handling ifadeleri de Sub-Routine’in her çalışmasıyla beraber çalışırlar.   

 

    Altta yer alan görsel, Error Handling işleminin nasıl çalıştığı ile ilgili işlem akışını gösteren bir şablondur.

3- Error Handling İşlemine Ait Şablon

Error Handling Calısma Şablonu

    Şablonda Error Handling işleminin nasıl devreye girdiği, sonrasında ise Sub-Routine’in By-Pass edildiği yerden nasıl devam ettiği yön işaretleri ve çizgiler kullanılarak anlatılmaya çalışılmıştır.

    Aşağıda yer alan kısa videoda Error Handling işleminin Sub-Routine içerisinde nasıl gerçekleştiği ve Error Handling kısmı ile Sub-Routine arasındaki geçişlerin nasıl cereyan  ettiği gösterilmek istenmiştir. 

3.1- Video

4- Error Handling Örnek-2

    Birinci örnek bizlere Error Handling işleminin nasıl yapıldığını basit hatları ile anlatıyor. İkinci örnekte ise durumu biraz daha detaylı hale getiriyoruz. Bu sefer aracın bulunamadığı senaryoya, kullanıcı için bazı seçenekler sunarak ekleme yapıyoruz. Bu kapsamda Error Handling işlemine ait ifadelerin ve bütünüyle Error Handling işleminin bir Sub-Routine içerisinde ne kadar esnek şekilde kullanılabildiğini de görüyoruz. 

    İlk önce değiştirmiş olduğumuz kodu görelim.

Error Handling Ornek 2

 

Error Handling Ornek 2 MsgBox Gorsel

 

    1. numaralı örneğimizde modele göre araç sorgulaması yaptığımızda eğer arac envanterde varsa, aracın fiyat bilgisini MsgBox yardımyla kullanıcıya bildiriyorduk. Bu ikinci örnekte de aynı şekilde devam ediyor. 

    2. örneğin ilk örnekten farklı olan kısmı aranılan aracın bulunamadığı durumda ortaya çıkıyor. İlk örnekte sadece “Araç Markası Envanterimizde Bulunmamaktadır.” yazarken ikinci örneğimizde bu cümleye ek olarak, farklı bir model aramak isteyip istemediğimizi sorarak, eğer istiyorsak tekrar model girme ekranının açılmasını sağlıyoruz. 

     Bu seçeneği sunmak için sadece ilk örneğe ek olarak vbMsgBoxResult tipinde bir değişken tanımlıyoruz. AracBulunamadıysa Error Handling bölümü içinde hem bu değişkene değer atıyoruz hem de If bloğu kullanarak model girme sürecini kullanıcı isteğine göre Resume ifadesini kullanarak tekrarlayabiliyoruz. 

    MsgBox ile ilgili dersi hatırlamak isteyebilecekler için alta ilgili sayfanın geçiş tuşu eklenmiştir.

    MsgBox ile kullanıcıya bilgi verirken ayrıca da kullanıcı için mesaj kutusunun altına bazı tuşlar ekleyebiliyoruz. Eklenen bu tuşlara kullanıcının tıklaması ile tıklanan cevabı ise vbMsgBoxResult tipinde tanımlanan değişkenlere atayabiliyoruz. Sonrasında ise bu değişkenin aldığı değere göre de, bir koşullu durum oluşturup Sub-Routine’in farklı bir işlem yapmasını sağlayabiliyoruz. İşte burada yaptığımız da tam olarak bu.

    Şimdi ilk önce farklı kullandığımız ‘Resume‘ ifadesine değinelim.  Biz birinci örneğimizde Resume ile ilgili konuştuğumuzda, hata veren satırın hemen ardından Sub-Routine’in çalışmasını sağlar demiştik. Aslında bu kullandığımız açıklama doğru ancak eksikti. İlk örnekte çok fazla karışıklığa neden olmamak adına Resume ifadesinin kullanılışını sade tutmuştuk. Şimdi örnek 2 de aslında Resume ifadesinin aslında daha esnek bir kullanımı olduğunu göreceğiz. 

    Resume ifadesi kullanarak Error Handling bloğu işlevini bitirdikten sonra, Sub-Routine içerisinde istediğimiz noktaya geri dönüş yapabiliriz. Yani illa hata veren kodun bitimine gitmek zorunda değiliz. Burada önemli nokta ise Sub-Routine içerisinde gitmek istediğimiz noktaya bir isim vermektir. Sonrasında Resume ifadesinin devamına bu noktanın adını yazarak istediğimiz noktaya gidebiliriz. Şimdi yıldız ile işaretlenmiş noktalara bakalım. Üstteki yıldızın olduğu noktaya gördüğünüz gibi bir ulaşım noktası adı yazılmış ve sonuna iki nokta konmuş. Eğer iki nokta koymazsak burasının Error Handling için bir varış noktası olduğunu VBA Editor tanımlayamaz. Şimdi AracBulunamadıysa bloğu içindeki yıldıza bakalım. Burada da eğer If içerisindeki koşul sağlanırsa Resume AracGirisi kodu çalışacak ve Sub-Routine ‘AracGirisi:’ yazan noktadan çalışmaya başlayacaktır. Şimdi açıklamalara bir şablon ile devam edelim.

    Yukarıda gördüğünüz şemada Sub-Routine’in çalışma şekli görülmektedir. Şimdi de ilk örnekten farklı ve önemli olan kısımları inceleyelim. 

    Error Handling bölümüne geldiğimizde ilk farklılık MsgBox ile kullanıcıya envanterimizde aradığı modelin olmadığını söylemenin yanısıra başka model aramak isteyip istemediğine göre ‘Retry‘ ve ‘Cancel‘ tuşlarına basmasını istiyoruz. Sonra basılan tuşun ne olduğunu da ‘Cevap‘ değişkenininde depoluyoruz. 

Error Handling Ornek 2 MsgBox Gorsel

     İkinci olarak ‘Cevap‘ değişkeninin değerine göre bir koşullu blok oluşturuyoruz. Bu blok ‘Cevap‘ değişkeninin değeri eğer ‘Retry‘ ise ‘Resume AracGirisi‘ ifadesini çalıştırıyor ve Sub-Routine model girdiğimiz InputBox ifadesinin hemen üzerinde tekrar çalışmaya başlamasını sağlıyor. Yani Sub-Routine’i tekrar başlatmaya gerek olmadan farklı bir modeli arayabiliyoruz. Eğer MsgBox‘ta Cancel tuşuna basarsak da ‘Exit Sub’ ifadesi çalışıyor ve arama işlemi ve Sub-Routine sonlanıyor. (Eğer istersek burada yine ‘Resume Next‘ ifadesini kullanarak Sub-Routine içerisine geri dönebiliriz. Ancak Sub-Routine içerisinde kodun çalışmaya devam edeceği yer ile  Sub-Routine içerisindeki Exit Sub arasında herhangi bir kod yer almadığı için direk Exit Sub ile Sub-Routine’den çıkıyoruz. )  

    Son olarak Sub-Routine’in çalışmasına ait görseli sizinle paylaşıyorum.

 

 

4.1- Video

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 İyi Çalışmalar…

Soru ve Öneriler İçin;

[email protected]