EXCEL VBADA ON ERROR İFADESİ

 

VBA'da, On Error ifadesi Excel'de bir makro veya prosedürün yürütülmesi sırasında oluşabilecek çalışma zamanı hatalarını işlemek için kullanılır. Bir hata oluştuğunda, VBA kodun yürütülmesini durdurabilir, bir hata mesajı görüntüleyebilir veya hatayı işleyip sonraki kod satırıyla devam edebilir. On Error ifadesi, programcının VBA'nın hatalara nasıl yanıt vermesi gerektiğini tanımlamasını sağlayarak kodun sağlam kalmasını ve beklenmeyen durumlarla başa çıkabilmesini sağlar.


Bir örneğe bakalım. Bu örnekte, VBA makrosu var olmayan bir dizideki (arr) bir öğeye erişmeye çalışır. VBA'daki dizi dizinleri 0'dan başlar, bu nedenle arr(3)'e erişmeye çalışmak "Index out of range" çalışma zamanı hatasıyla sonuçlanacaktır.

VBA Hata Tanımı Örneği - 1

On Error GoTo ErrorHandler'ı kullanarak kod hatayı işler ve kullanıcı dostu bir mesaj görüntüler: "Bir hata oluştu: Dizin aralık dışında." Kod hatadan sonra yürütmeye devam ederek daha sorunsuz bir kullanıcı deneyimi sağlar.

VBA Hata Tanımlama Örneği - 2

ÖNEMLİ NOKTALAR

  • Excel VBA, hata işleme için “VBA On Error” ifadesini sağlar. Bu ifade, bir hata oluştuğunda programa ne yapması gerektiği konusunda rehberlik eder.
  • Üç tür "Hata Üzerine VBA" ifadesi vardır: "Hata Üzerine Etikete Git", "Hata Üzerine Sonrakine Devam Et" ve "Hata Üzerine 0'a Git".
  • VBA kodunun kararlılığını ve güvenilirliğini sağlamak için doğru hata yönetimi esastır.
  • “VBA On Error GoTo 0” ifadesiyle işiniz bittikten sonra hata işlemeyi her zaman sıfırlayın.

ERROR NEDİR?

VBA bağlamında, bir hata, bir programın normal yürütme akışını bozan beklenmeyen veya istisnai bir durumu ifade eder. Hatalar, geçersiz veri girişi, sıfıra bölme, kullanılamayan bir kaynağa erişmeye çalışma veya kodda bir sözdizimi hatasıyla karşılaşma gibi çeşitli nedenlerle oluşabilir. Bu hatalar, uygunsuz şekilde işlenirse programın sonlandırılmasına veya yanlış sonuçlara yol açabilir.


Hata Üzerine İfadelerin Türleri

Üç temel VBA On Error ifadesi türü vardır:

  • Hata Durumunda Devam Et [On Error Resume Next]:  VBA Hata Durumunda Devam Et ifadesi, VBA'ya bir hata oluşsa bile kodu yürütmeye devam etmesini söyler.

Genellikle, bir hatayla karşılaştığında, VBA bunu görmezden gelir ve bir sonraki kod satırına geçer. VBA On Error'da bir sonraki satıra gitme işlemi dikkatli kullanılmazsa riskli olabilir, çünkü kritik hataları gizleyebilir ve beklenmeyen sonuçlara yol açabilir.

  • Hata Durumunda Etikete Git [On Error GoTo Label]: VBA Hata Durumunda Etikete Git ifadesi, bir hata oluştuğunda yürütme akışını belirli bir etikete (tanımlı bir kod bölümüne) yönlendirir.

Programcının hatayı belirlenen konumda zarif bir şekilde ele almasını sağlar. Hata işleme konusunda daha yapılandırılmış bir yaklaşım olarak kabul edilir ve kod sağlamlığını ve sürdürülebilirliğini iyileştirmeye yardımcı olur.

  • Hata Durumunda 0'a Git [On Error GoTo 0]: VBA Hata Durumunda 0'a Git, hata işleme davranışını varsayılan duruma sıfırlar ve çalışma zamanı hatalarını işlenmemiş istisnalar olarak ele alır.

Aktif hata işlemeyi devre dışı bırakır, standart hata mesajını görüntüler ve bir hatayla karşılaşıldığında kod yürütmeyi durdurur.


VBA'da Hataları Ele Almanın En İyi 3 Yolu

Artık VBA'da hataları ele almanın farklı yollarını gördüğümüze göre, bunların nasıl uygulanacağına dair birkaç örneğe bakalım.

Örnek 1 – Hata Durumunda Devam Etme:

Bu yöntem, bir hatayla karşılaşsa bile kodun yürütülmeye devam etmesini istediğinizde kullanılır. “On Error Resume Next” ile VBA hatayı yok sayar ve bir sonraki kod satırına geçer.

VBA On Error Resume Next ifadesi, bir hata oluştuğunda sonlandırmadan kodu yürütmeye devam etmenizi sağlar. Ancak, bu yaklaşım dikkatli kullanılmalıdır, çünkü olası sorunları gizleyebilir ve beklenmeyen davranışlara yol açabilir. İşte nasıl kullanılacağı:

  • Adım 1: Yeni bir Excel çalışma kitabında, Excel'de “ALT + F11” tuşlarına basarak Visual Basic for Applications (VBA) düzenleyicisini açın.
Excel'de Hata Üzerine VBA - Örnek 1 - Adım 1
  • Adım 2: Yeni bir Alt prosedür ekleyin: VBA düzenleyicide, üst menüden “Ekle”ye tıklayın ve yeni bir modül eklemek için “Modül”ü seçin.
Örnek 1 - Adım 2
  • Adım 3: Yeni modülde “Example_OnErrorResumeNext” adında bir alt rutin tanımlayın.
Örnek 1 - Adım 3
  • Adım 4: Sonra, Double VBA veri tipinin result adlı bir değişkeni bildiriyoruz . Bu result değişkeni, bir sonraki adımda gerçekleştirilen bir bölme işleminin sonucunu depolar.
Örnek 1 - Adım 4
  • Adım 5: Bu satırda, onu 0'a bölen ve sonucu result değişkenine atanan VBA kodunu yazıyoruz . Ancak, sıfıra bölme matematiksel olarak tanımsızdır, bu nedenle bu işlem VBA'da bir çalışma zamanı hatasına neden olur.
Örnek 1 - Adım 5
  • Adım 6: Bu satırda, bölme işleminin sonucunu gösteren bir mesaj kutusu gösteren kodu yazıyoruz.
Örnek 1 - Adım 6

Burada, VBA On Error Msgbox'ı "Sonuç:" metnini ve ardından sonuç değişkeninin değerini göstermelidir.

Ancak bir önceki satırda çalışma zamanı hatası oluştuğu için bu satırdaki kod çalıştırılmayacaktır.

Modülü kaydedelim ve kodu çalıştırmayı deneyelim.

Yukarıdaki kodu çalıştırdığınızda sıfıra bölme işlemi yapmaya çalışır, bu da çalışma zamanı hatası oluşturur ve hata nedeniyle tanımlanmamış bir "Sonuç" içeren bir mesaj kutusu görüntüler.

Örnek 1 - Adım 6b
  • Adım 7: Bu hatayı ele almak için, VBA'ya hatayı yok saymasını ve aşağıdaki kod satırıyla devam etmesini söyleyen "On Error Resume Next" gibi VBA On Error ifadesini kullanacağız.
Örnek 1 - Adım 7
  • Adım 8: Güncellenen makroyu kaydedin ve VBE düzenleyicisini kapatın. “Makro” iletişim kutusunu açmak için “ALT + F8” tuşlarına basın.

Listeden “Example_OnErrorResumeNext” makrosunu seçin ve “Çalıştır”a tıklayın.

Örnek 1 - Adım 8
  • Adım 9:  Makroyu çalıştırdığınızda çalışma zamanı hatasını görmeyeceksiniz; bunun yerine “Sonuç: inf” mesajını içeren bir ileti kutusu göreceksiniz.
Excel'de Hata Üzerine VBA - Örnek 1 - Adım 9

İşte tam kod:

Sub Example_OnErrorResumeNext()
On Error Resume Next
‘ Code that may cause an error
Dim result As Double
result = 10 / 0 ‘ Division by zero, but the code continues
MsgBox “Result: ” & result ‘ This line won’t execute due to the error
End Sub


Örnek 2 – Hata Durumunda Git Etiketi:

Bu yöntem, programı hatayı işlediğiniz belirli bir etikete yönlendirir.

Bir hata oluştuğunda, On Error GoTo Label ifadesi VBA'nın belirli bir etikete (önceden tanımlanmış bir kod bölümü) atlamasına yönlendirir. Programcının hatayı uygun şekilde işlemesine olanak tanır. Bu örnekte, var olmayan bir çalışma kitabını açarken bir hata üretilir. Yine de, yürütmeyi durdurmak yerine, VBA "ErrorHandler" etiketine atlar ve hatayı açıklayan bir ileti kutusu görüntüler.

  • Adım 1: Yeni modülde, “Example_OnErrorGoToLabel1” adında bir alt rutin tanımlayarak başlıyoruz.
Excel'de Hata Üzerine VBA - Örnek 2 - Adım 1
  • Adım 2: Bu kod satırında, Workbook türünde bir "wb" değişkeni bildiriyoruz. Bu değişken, bir çalışma kitabını açmaya çalıştığımızda döndürülen çalışma kitabı nesnesini depolar.
Örnek 2 - Adım 2
  • Adım 3: Aşağıdaki satırda, bu alt rutindeki herhangi bir sonraki kod satırında bir hata oluşursa VBA'nın "ErrorHandler" etiketine atlamasını söyleyen bir "VBA On Error" ifadesi yazıyoruz.
Örnek 2 - Adım 3
  • Adım 4: Şimdi “NonExistentWorkbook.xlsx” adlı bir çalışma kitabını açmak ve bunu “wb” değişkenine atamak için bir kod yazalım.

Bu çalışma kitabı mevcut olmadığından, bu işlem bir çalışma zamanı hatasıyla sonuçlanır.

“On Error GoTo ErrorHandler” ifadesi nedeniyle, bu hata oluştuğunda, yürütme programı durdurmak yerine “ErrorHandler” etiketine atlar.

Örnek 2 - Adım 4
  • Adım 5: Daha sonra “VBA On Error Exit Sub” ifadesini yazıyoruz. Kodda hata yoksa, bu satır “ErrorHandler” etiketini takip eden kodun çalıştırılmamasını sağlar.
Örnek 2 - Adım 5
  • Adım 6: Şimdi, “ErrorHandler” etiketini yazıyoruz. Kodda bir hata oluşursa, yürütme bu noktaya atlar. Bu etiketin içindeki kod satırı, hatayı açıklayan bir mesaj kutusu görüntüler.
Excel'de Hata Üzerine VBA - Örnek 2 - Adım 6
  • Adım 7: Güncellenen makroyu kaydedin ve VBE düzenleyicisini kapatın. “Makro” iletişim kutusunu açmak için “ALT + F8” tuşlarına basın.

Listeden “Example_OnErrorGoToLabel1” makrosunu seçin ve “Çalıştır”a tıklayın.

Örnek 2 - Adım 7
  • Adım 8: Makroyu çalıştırdığınızda, gerekli çalışma kitabının kullanılamadığını belirten bir mesaj kutusu göreceksiniz.
Excel'de VBA Hatası - Örnek 2 - Adım 8

İşte tam kod:

Sub Example_OnErrorGoToLabel1()
Dim wb As Workbook
On Error GoTo ErrorHandler
‘ Attempt to open a workbook that doesn’t exist
Set wb = Workbooks.Open(“NonExistentWorkbook.xlsx”)
‘ Normal code continues here
‘ …
Exit Sub
ErrorHandler:
‘ Display a message box with error description
MsgBox “An error occurred: ” & Err.Description
End Sub

Örnek 3 – VBA'da Hata Numarasını Yazdırma

Bu yöntem, hata ayıklama amaçlarına yardımcı olabilecek hata numarasını ve açıklamasını görüntülemeyi içerir.

Bir hata oluştuğunda hata numarasını yazdırmak için Err nesnesini kullanabilirsiniz. Err nesnesi, oluşan son çalışma zamanı hatası hakkında bilgi sağlar.

Etkin çalışma kitabında bulunmayan bir çalışma sayfasına erişmeye çalıştığımız bir örneği ele alalım. Bir hata üretecektir ve bunu “On Error Resume Next” ifadesini kullanarak halledeceğiz.

  • Adım 1: Yeni modülde, “Example_PrintErrorNumber” adlı bir alt rutin bildirerek başlayın.
Excel VBA Hatası - Örnek 3 - Adım 1
  • Adım 2: Sonra, Worksheet türünde bir "ws" değişkeni bildiriyoruz. Bu değişken, bir çalışma sayfasına erişmeye çalıştığımızda çalışma sayfası nesnesini depolar.
Örnek 3 - Adım 2
  • Adım 3: Şimdi, bir "VBA Hatası" ifadesi sağlıyoruz. Bu, VBA'ya bir hata oluşursa bir sonraki kod satırına devam etmesini söyler ve bu hatayı etkili bir şekilde görmezden gelir
Örnek 3 - Adım 3
  • Adım 4: Aşağıdaki kod satırında, etkin çalışma kitabındaki “NonExistentSheet” adlı çalışma sayfasına erişmeye ve bunu “ws” değişkenine atamaya çalışıyoruz.
Örnek 3 - Adım 4

Bu çalışma sayfası mevcut olmadığından, bu işlem bir çalışma zamanı hatasıyla sonuçlanır.

Ancak “On Error Resume Next” ifadesi sayesinde bu hata göz ardı ediliyor ve yürütme bir sonraki kod satırıyla devam ediyor.

  • Adım 5: Şimdi bir hata oluşup oluşmadığını kontrol eden bir kod yazacağız.
Excel VBA Hatası - Örnek 3 - Adım 5

Bir hata oluşursa (bu durumda, “Err.Number” 0 değildir), bir mesaj kutusu hata numarasını ve açıklamasını gösterir.

Daha sonra, “Err.Clear” ifadesi Err nesnesini sıfırlar, hata bilgilerini temizler, böylece daha fazla hata işlenmesini etkilemez.

  • Adım 6:  Güncellenen makroyu kaydedin ve VBE düzenleyicisini kapatın. “Makro” iletişim kutusunu açmak için “ALT + F8” tuşlarına basın.

Listeden “Example_PrintErrorNumber” makrosunu seçin ve “Çalıştır”a tıklayın.

Örnek 3 - Adım 6
  • Adım 7: Makroyu çalıştırdığınızda Hata numarasını ve açıklamasını sağlayan bir mesaj kutusu göreceksiniz.
Excel VBA Hatası - Örnek 3 - Adım 7

İşte tam kod:

Sub Example_PrintErrorNumber()
Dim ws As Worksheet
On Error Resume Next
‘ Attempt to access a worksheet that doesn’t exist
Set ws = ThisWorkbook.Worksheets(“NonExistentSheet”)
‘ Check if an error occurred
If Err.Number <> 0 Then
MsgBox “Error Number: ” & Err.Number & vbCrLf & “Error Description: ” & Err.Description
Err.Clear ‘ Clear the error for further error handling
End If
End Sub

Dikkat Edilmesi Gereken Önemli Noktalar

  • On Error Resume Next'i kullanmak riskli olabilir, çünkü kritik hataları maskeleyebilir ve hata ayıklamayı zorlaştırabilir.
  • Hataları etkili bir şekilde işlemek için her zaman On Error GoTo Label veya diğer yapılandırılmış hata işleme tekniklerini kullanın.
  • Hata işleme, çökmeleri ve veri kaybını önlemek için herhangi bir programda olmazsa olmazdır. Ancak, hataları gizlemek veya ölümcül bir hatadan sonra yürütmeyi sürdürmek için kullanılmamalıdır.
  • On Error GoTo Etiketini kullanırken, bir hata durumunda işleyicinin altındaki kodun yürütülmesini önlemek için hata işleyicisinin içine bir Exit Sub veya Exit Function ifadesi ekleyin.
  • Bir hatayı işledikten sonra Err.Clear'ı kullanarak hatayı temizlemeyi unutmayın; böylece daha fazla hata tespiti için hata nesnesini sıfırlayabilirsiniz.

Yorum Gönder

DT KARİYER KPSS Dünyasına Hoş Geldiniz
Sevgili dostum nasıl yardımcı olabilirim?
Bu alana yazınız...