VBA Hata Denetimi (Error Handling)


Vba’de kod hatalarını denetlerken en cok kullanacağımız ifadelerden bir tanesi On Error ifadesi’dir. Bu ifade sayesinde hata durumunda kodun nasıl davranması gerektiğini ve hata anında yapılacak işlemleri belirleriz. On error ifadesinin üç farklı kullanım biçimi bulunmaktadır. Her birinin üzerinden örneklerle ilerleyerek daha iyi anlaşılmasını sağlayacagız.

  • On Error Goto 0
  • On Error Resume Next
  • On Error Goto <label>

On Error Goto 0 : Bu ifade kod içerisinde hata oluştuğu zaman hata mesajının aynen görüntülenmesini sağlar, vba default hata ayarlarında bu kod kullanılmıştır dolayısıyla kodu yazmakla yazmamak arasında bir fark yoktur.

1.Aşağıdaki kodda herhangi bir hata denetimi yapmadık. Kodu çalıştırdığımızda sıfır a bölünme hata penceresi ekrana geldi.


Sub errorhndlng()

Dim i As Integer

i = 10 / 0

MsgBox i

End Sub

errorhndling

2.Aynı kodu On Error Goto 0 ifadesiyle yazalım:

Sub errorhndlng_1()

Dim i As Integer

On Error GoTo 0

i = 10 / 0

MsgBox i

End Sub

=>Yine aynı hata penceresi karşımıza cıktı.

errorhndling2

On Error Resume Next :

Bu ifade kod hata aldığında hatayı görmezden gelerek kodun bir sonraki adımdan çalışmaya devam etmesini sağlar. Hatayı düzeltmez sadece atlar ve bir sonraki adıma geçer.

3.Bu örnekte “A1:A5” hücre aralığındaki değerleri 10 ile carpıp “B1:B5” hücre aralığına sonuçları yazdıralım. Ancak “A4″ değeri bir string değer oldugu için kod bu kısma geldiğinde Type Mistmatch hatası alacak.

errorhndling2

Sub errorhndlng_2()

Dim i As Integer

For i = 1 To 5

Cells(i, 2).Value = Cells(i, 1).Value * 10

Next i

End Sub

errorhndling2
4.Aynı kodu On Error Resume Next ifadesiyle yazalım:

Sub errorhndlng_3()

Dim i As Integer

On Error Resume Next

'Kod hata aldiginda bir alttaki adima gec

For i = 1 To 5

Cells(i, 2).Value = Cells(i, 1).Value * 10

Next i

End Sub

=>Hata veren adım atlandı ve değerler hücrelere yazdırıldı.

errorhndling2

On Error Goto <label> :

Bu ifade kod hata aldığında kodu bizim kod içerisinde oluşturduğumuz farklı bir adıma götürür.

Sub errorhndlng_4()

Dim yas As Integer

On Error GoTo 10:
'hata durumda "10" ifadesinin oldugu kisma gec
'10 yerine istediginiz ismi yazabilirsiniz.

yas = InputBox("Lutfen yasinizi giriniz")

MsgBox "Yasiniz: " & yas

Exit Sub
'Burada exit sub demezseniz kod hata almasa bile 
'asagiya dogur ilerlerken 10 ifadesini de calistirir 
've hata mesaji ekrana gelir.

10:

MsgBox "Lutfen gecerli bir yas degeri giriniz"

End Sub

*Kodu çalıştıralım:

errorhndling2

*Yaş değerine bir string değer girelim ve kodun çalışmasını izleyelim:

errorhndling3

Resume Ifadeleri:

On error gibi Resume ifadesinin de üç farklı kullanım biçimi vardır.

  • Resume
  • Resume Next
  • Resume <label>

Resume : Resume ifadesi kod hata aldığında hatayı bildiğinizi varsayarak düzeltilmesini bekler ve kaldığı yerden kodu çalıştırmaya devam eder. Biraz tehlikeli bir ifadedir çünkü eğer hatayı düzeltmezseniz kod, hata adımı ile resume adımı arasında sonsuz döngüye girer.

Sub errorhndlng_5()

On Error GoTo hata:

ActiveWorkbook.Worksheets("home").Select

'home isimli bir sayfa yok ise hata bloguna yonlendirdik.

Exit Sub

hata:

Worksheets.Add

ActiveSheet.Name = "home"

'home isimli bir sayfa eklendi

Resume 'hatayi duzelttikten sonra yine basa doner ve hata alinan yeri tekrar calistirir.

End Sub

Resume Next : On Error Resume Next ile aynı işlevi görür. Kodu düzeltmez hata aldığı adımı atlar ve bir sonraki adıma geçer.

Sub errorhndlng_6()

Dim sonuc As Double

Dim i As Integer

On Error GoTo 10:

For i = 0 To 5

sonuc = 20 / i

'i degeri 0 iken 0 a bolunme hatasi alacak

Cells(i, 1).Value = sonuc

Next i

Exit Sub

10:

Resume Next

'resume next ile kodu bir sonraki adima gecirdik yani i=1 degerine atladi

End Sub

*Kodu çalıştıralım:

i=0 değerini atladı (20/0 sıfıra bölünme hatası aldığı için)

20’nin i=1 den 5 e kadar olan değerlere bölümünü hücreye yazdırdı.

errorhndling3
Resume <label> : On Error Goto <label> ifadesiyle aynı işlevi görür. Hata durumda <label> içerisine yazılan kod bloğuna gider ve kodu okumaya oradan devam eder.

Sub errorhndlng_4()

Dim i As Integer

On Error GoTo 10:

i = "microsoft excel"
'integer yerine string degeri girerek hatali tanimlama yaptik.

20:
i = 100

MsgBox i

Exit Sub

10:

MsgBox "i degeri hatali"

Resume 20:
'kodu yeni_i bloguna yonlendirdik

End Sub

Not: Yukarıdaki kodda yeni i değerini 10: bloğu içerisinde de yazarak aynı sonuca ulaşırdık. Resume <label> konusuna örnek vermek amaçlı kod uzatılmıştır. yani:

Sub errorhndlng_4()

Dim i As Integer

On Error GoTo 10:

i = "microsoft excel"
'integer yerine string degeri girerek hatali tanimlama yaptik.

Exit Sub

10:

MsgBox "i degeri hatali"

i = 100

MsgBox i

End Sub
Reklamlar

VBA Hata Denetimi (Error Handling)” üzerine bir yorum

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s