Vba hatası türleri: hata ayıklama ve çözüm
Diğer programlama dilleri gibi, VBA da hatalar söz konusu olduğunda şanssızdır ve ne olursa olsun onlarla uğraşmanız gerekir. Kötü kodlama, imkansız işlemler (sıfıra bölmek gibi) veya beklenmeyen hatalar gibi farklı kaynaklardan gelebilirler.
Bunu halletmenin en iyi yolu, kodla elde edebileceğiniz tüm olası sonuçları iyi anlamaktır. Seçilen hücredeki değeri kullanarak sayının karekökünü hesaplayan bir VBA kodumuzun bulunduğu aşağıdaki örneğe bakın.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
Ancak aktif hücrenin sayı dışında bir değeri varsa aşağıdaki gibi çalışma zamanı hatası alırsınız.
VBA’da Hata Parametreleri (Hata Yakalama)
VBA seçeneğinde, kodları yazmaya başlamadan önce hataları işleyecek şekilde ayarı yapılandırabilirsiniz. VBA ayarlarını açmak için Araçlar ➤ Seçenekler ➤ Genel ➤ Hata Yakalama’ya gidin. Burada kullanabileceğiniz üç seçeneğiniz var.
- Tüm hatalarda durdur : Bu seçeneği etkinleştirdiyseniz, her türlü hata işleme tekniğini kullanmış olsanız bile VBA, kodu her türlü hata için durduracaktır.
- Kurcalama Sınıfı Modülü : Bu seçenekle VBA, herhangi bir teknikle ele alınmayan tüm kodlarınızı durduracaktır. Ve eğer Userforms gibi nesneler kullanırsanız, bu nesneler de kırılacak ve hatanın olduğu satırı tam olarak vurgulayacaktır.
- İşlenmeyen Hatalarda Ara : Bu, herhangi bir hata işleme tekniği kullanmadığınız tüm hatalar hakkında bilgi sahibi olmanıza yardımcı olan ve işlenmeyen tüm hatalar için kodu durduran varsayılan ayardır. (Ancak, Userforms gibi nesneler kullanırsanız, bu, nesnede hataya neden olan satırı vurgulamaz, yalnızca o nesneye referans veren satırı vurgular).
VBA Hata Türleri
VBA hatalarını anlamak için bunları dört kategoriye ayırabilirsiniz; aşağıda bu tür hataların açıklaması bulunmaktadır.
1. Sözdizimi hataları
VBA kodunu yazarken belirli bir söz dizimini takip etmeniz gerekiyor ve bunu görmezden geldiğinizde veya olması gerektiği gibi yazmadığınızda SÖZDİZİMİ hatasıyla (dil hatası olarak da bilinir) karşılaşabilirsiniz. Kodlarınızı yazarken yaptığınız yazım hataları gibidir.
VBA, bir hata mesajı görüntüleyerek bu hataları bildirerek size yardımcı olur. VB düzenleyicinizde “Otomatik Sözdizimi Denetimi”nin etkinleştirildiğinden emin olmanız yeterlidir.
Araç ➤ Seçenekler’e gidin ve “Otomatik sözdizimi denetimi” kutusunu işaretlediğinizden emin olun. Bununla, bir SÖZDİZİMİ hatası yaptığınızda, VBA bir hata mesajı görüntüler.
Ancak “Otomatik Sözdizimi Denetimi” devre dışı bırakılırsa, VBA yine de hata içeren kod satırını vurgular ancak hata mesajını görüntülemez.
2. Derleme hataları
Bu, bir etkinliği gerçekleştirmek için kod yazdığınızda, ancak bu etkinlik geçersiz olduğunda veya VBA tarafından gerçekleştirilemediğinde meydana gelir. Bunun en iyi örneği, IF deyimini kullanan bazı kodlarınız olduğu, ancak deyimin sonuna END IF eklemeyi kaçırdığınız ve şimdi bu VBA’yı çalıştırdığınızda bir derleme hatası mesajı gösterdiğiniz durumdur.
Bunun dışında derleme hatalarının başka örnekleri de vardır:
- Sonraki olmadan For’u kullanma ( Sonraki için ).
- Sonu seçmeden seçin ( Büyük /küçük harf seçin ).
- “ Açık Seçenek ”i etkinleştirdiğinizde bir değişken bildirmeyin.
- Var olmayan bir alt/işlev çağrılıyor.
3. Çalışma Zamanı Hataları
Kod yürütüldüğünde bir çalışma zamanı hatası oluşur. Kodun bir sayının karekökünü hesapladığı yukarıda sizinle paylaştığım örneği hatırlayın.
Kodu çalıştırırken bir çalışma zamanı hatası oluştuğunda, kodu durdurur ve size hata iletişim kutusunu gösterir ve bu hata kutusu, karşılaştığınız hatanın doğasından bahseder. Bir çalışma kitabını belirttiğiniz konumdan açan bir kod yazdığınızı, ancak bu çalışma kitabının artık birisi tarafından taşındığını veya silindiğini varsayalım.
Yani kodu çalıştırdığınızda VBA bu dosyayı bu konumda bulamadığından size bir çalışma zamanı hatası gösterecektir. Bir çalışma zamanı hatasında aldığınız mesaj, hatanın nedenini anlamanıza yardımcı olacak nedeni açıklar.
Ve bir çalışma zamanı hatası oluştuğunda kodun yürütülmesi durdurulur. “Debug” butonuna tıkladığınızda bu hatayı içeren kod satırını sarı renkle vurgulayarak size gösterir. Veya kod yürütmeyi durdurmak ve hata mesajını kapatmak için “Sonlandır” düğmesine tıklayabilirsiniz.
4. Mantıksal hata
Bu bir hata değil, kod yazarken oluşan bir hatadır. Bu tür hatalar bazen bulma ve düzeltme konusunda size zorluk çıkarabilir.
Diyelim ki bir kod yazıyorsunuz ve bir değişken bildirirken yanlış veri tipini veya yanlış hesaplama adımlarını kullandınız. Bu durumda kodunuz düzgün çalışacak ve bu hatayı kolayca bulamazsınız. Bu tür problemlerle baş etmenin en iyi yolu her kod satırını tek tek çalıştırmaktır.
VBA’da Hata Ayıklama Araçlarını Kullanma
VBA, kodunuzda hata ayıklamak ve kodlarınızdaki hataları kaldırmak için size bir dizi araç sağlar.
1. VBA projesini derleyin
Visual Basic Editor’da kodunuzu bitirdikten hemen sonra kullanabileceğiniz bir seçenek bulunmaktadır. Bu derleme seçenekleri kodunuzun her satırını analiz eder ve kodunuzda bir hata varsa bir mesaj kutusu görüntüler.
Not: VBA’yı Derle seçeneği, çalışma zamanı hatalarını değil yalnızca sözdizimi ve derleme hatalarını izler çünkü bu hatalar yalnızca bir kod çalışırken ortaya çıkar. VBA Projesini Derleme’yi kullanmak için ➤ Hata Ayıkla ➤ VBA Projesini Derle’ye gidin.
“VBA Projesini Derle”yi çalıştırdığınızda ve kodunuzda hiçbir hata kalmadığında seçenekler gri renkte olacaktır.
2. Her kod satırını tek tek çalıştırın
Ben bu şekilde yapıyorum. Bir kodu tamamladığımda, hata olup olmadığını kontrol etmek için onu satır satır çalıştırırım. Bu zaman alabilir ancak tüm hataları (sözdizimi, derleme ve yürütme) çözmenize yardımcı olur.
“Hata Ayıklama Araç Çubuğu”nda, kodu satır satır çalıştırmak için kullanabileceğiniz bir “Adım Gir” düğmesi vardır veya tek bir satırı çalıştırmak için F8 tuşuna basabilir ve ardından koddaki bir sonraki satırı çalıştırmak için tekrar basabilirsiniz.
VBA Hatalarını İşlemek için “On ERROR” İfadesini Kullanma
Kodlarınızı kontrol etmeniz ve mevcut tüm hata ayıklama yöntemlerindeki olası hataları bulmanız önemlidir. Ancak en iyi ve en etkili yol, bir hatayı ele alabilecek ve kodunuzu çalıştırıldığında kusursuz hale getirebilecek hata işleme talimatları oluşturmaktır. Bu ifadeleri inceleyelim. VBA kodunda bir hata oluştuğunda, bu hatayı gidermenin en iyi yolları şunlar olabilir:
- VBA’nın hatayı görmezden gelmesine ve kodu çalıştırmasına izin verin
- Bir hata oluştuğunda özel bir dizi talimatın yürütülmesine izin verin.
Her iki çözümde de “Hata Durumunda” ifadelerini kullanabilirsiniz. Aşağıda kullanabileceğiniz dört “Hata Durumunda” ifadesi bulunmaktadır. Şimdi her ifadeye tek tek bakalım.
1. Hata yaparsanız yeniden başlayın
Bu basit kod satırı, bir hata oluşmasına rağmen VBA’nın kodu çalıştırmaya devam etmesini sağlar. FİKİR basit: yürütme sırasında herhangi bir yerde bir hata tespit edilirse bir sonraki kod satırına geçin.
Aşağıdaki kodda iki satırlık kod var:
- İlk satır, A1 hücresindeki değerin 25 bölü 0 olduğunu gösterir
- İkinci satırda ise A2 hücre değerinin 10 bölü 5 olduğu yazıyor
Artık çevrimiçi olduğunuz kodda bir sorun var. Bildiğiniz gibi herhangi bir şeyi 0’a bölerseniz sonuç hata olur. Dolayısıyla, bu kodu çalıştırdığınızda VBA, “Çalışma zamanı hatası ’11’ Sıfıra böl” hata mesajını görüntüler ve yürütmeyi durdurur.
Ancak kodun en başına “Hata Durumunda Devam Ettir” seçeneğini ekleyip kodu çalıştırdığınızda, VBA, hatanın oluştuğu kod satırını yok sayar ve ikinci satırla devam eder ve bu değeri A2 hücresine ekler.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
Bu nedenle, herhangi bir yerde meydana gelen bir hataya rağmen kodunuzun çalışmasını istediğinizde, kodunuzdaki “Hata Durumunda Devam Ettir” ifadesini kullanmanız yeterlidir.
Ancak dikkat etmeniz gereken bir şey daha var: yalnızca daha sonra meydana gelen hataları göz ardı edecektir.
Diyelim ki 5. satırda bir hata oluştu ve 8. satıra “Hata Sonra Devam Et” seçeneğini eklediniz, bu hatayı atlamayacaktır. Bu nedenle en iyi yol, onu prosedürdeki ilk kod satırı olarak eklemektir.
2. GoTo 0 hatası durumunda
Bu, bir hata oluştuğunda kod yürütmeyi durduran VBA’nın varsayılan davranışıdır.
Peki, “Hata Durumunda 0’a Git” seçeneğini kullanmak kodunuzda hiçbir fark yaratmaz. VBA, kodu durduracak ve hatanın açıklamasını içeren bir mesaj görüntüleyecektir. Peki neden onu kullanmakla uğraşayım ki? Akıllı soru. Yukarıda ” Hata Durumunda Devam Ettirme ” bölümünde kullandığınız örneği kullanalım.
Bu kodda herhangi bir hata oluştuğunda VBA bir sonraki kod satırını alır ve çalıştırır ve herhangi bir hata mesajı görmezsiniz. Ancak diyelim ki kodunuzda daha fazla satır var ve kodda hata varsa bu satırları aşmak istemiyorsunuz.
Dolayısıyla, ikinci kod satırından sonra “Hata Durumunda 0” yazarsanız, VBA’nın, bir hata oluştuğunda hata mesajları görüntüleyen varsayılan hata işleyicisi geri yüklenir.
3. Git hatası durumunda [Etiket]
Acil durumda gidebileceğiniz bir binada bir yer düşünün. Benzer şekilde, “On Error GoTo [Label]” seçeneğini kullanarak, bir hatayı işlemek için ana kodunuzda ayrı bir kod bloğu oluşturabilirsiniz.
Aslında, “Hata Durumunda [Etiket]’e Git”, hataları ele almanın çok daha iyi ve daha kullanışlı bir yoludur. Aşağıdaki kodda “On Error GoTo Oh!” Bu satır bildiriminde şimdi “Hata” kelimesi, “Oh!” Hata” etiketidir.
Kodun sonuna bakarsanız, etiket adı ile belirli bir başlangıcınız ve ardından kodun üzerinde bir mesaj bulunan bir mesaj kutusu için bir kod görürsünüz.
Şimdi bir hata oluşursa ne olur, VBA “Oh! Error” komutunu verir ve bu etiketten sonra sahip olduğunuz kod bloğunu çalıştırır.
Ancak dikkat etmeniz gereken bir şey var: Eğer bir hata oluşmazsa kodunuzdaki etiket çalıştırılacaktır. Yapmanız gereken iki şey var:
- Öncelikle hata etiketinizi kodun sonuna eklediğinizden emin olun.
- İkinci olarak, hata etiketinin önüne bir “Alt Çıkış” ekleyin.
Bununla her iki durumda da fayda sağlayacaksınız. Diyelim ki bir hata oluşursa ve VBA belirttiğiniz etikete geçerse yalnızca etiketin kendisinden koda kod olacaktır. Ve eğer bir hata oluşmazsa, etiketten önce sahip olduğunuz “Exit Sub” ifadesi, hata etiketini çalıştırmadan prosedürden çıkacaktır.
4. Git hatası -1 durumunda
Bu konuya girmeden önce sizinle bir şey paylaşayım. Bir kodda bir hata oluştuğunda, VBA bu hata günlüğünü belleğinde saklar ve yalnızca rutin tamamlandığında temizler.
Ey VBA! Şimdiki zamanda yaşa
VBA kodundaki ikinci hatayı işlemek için ilk hatayı VBA’nın belleğinden temizlemeniz gerekir. Aşağıdaki kodda, iki farklı kod bloğundan gelen hataları işleyen iki “On Error GoTo [Label]” ifadesine sahipsiniz.
Ancak bu kodu çalıştırırsanız, ikinci hatada VBA ayarladığınız etikete atlamayacak ve bunun yerine “Type Mismatch” hata mesajını gösterecektir.
Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Bu sorunu çözmek için VBA’nın mevcut hatayı deposundan kaldırmasına olanak tanıyan “On Error GoTo -1” seçeneğini kullanabilirsiniz.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub
Artık bu kodu çalıştırdığınızda, “On Error GoTo -1”, hatayı bellekten kaldırır ve VBA, ikinci ifadedeki hatayı istendiği gibi işler.
VBA’daki hataları ele almak için başka neleri bilmem gerekiyor?
Hata işleme tekniklerini kullanmanın yanı sıra, hataları daha iyi ele almak için kullanabileceğiniz birkaç şey daha vardır.
Nesne hatası
Kodu çalıştırırken bir hata oluştuğunda, hatayla ilgili ayrıntıları almak için Err nesnesini kullanabilirsiniz. Err nesnesiyle kullanabileceğiniz birkaç özellik ve yöntem vardır. Bunları birer birer öğrenelim.
Özellikler
Err nesnesiyle kullanabileceğiniz özellikler şunlardır:
- Err.Number : Bir hata oluştuğunda Err nesnesine bir sayı kaydedilir. Aşağıdaki kodda, bu durum oluştuğunda mesaj kutusunda hata numarası görüntülenir.
- Err.Açıklama : Bu özellik, hatanın nedenini anlamanıza yardımcı olabilecek hata açıklamasını görüntüler.
- Err.Source: Bu özellik size hatanın hangi projede oluştuğunu bildirir.
- Err.HelpContext: Bu özellik, yardım dosyasındaki hatanın yardım bağlamı kimliğini döndürür.
- Err.HelpContext: Bu, yardım dosyasının konumu için bir dize değeridir.
Normalde hata işleme tekniklerini kullanarak hatalarla uğraşırken kodlarınızda Err nesnesini pek kullanmazsınız. Ancak aşağıda bunu kullanmak için basit bir örnek verilmiştir.
Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1: MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Description: " & Err.Description End Sub
Yukarıdaki kodu çalıştırdığınızda, eğer bir hata oluşmuşsa, hata numarasını ve hata açıklamasını içeren bir mesaj kutusu görüntüleyecektir.
Yöntemler
Err Object ile iki yöntemi de kullanabilirsiniz.
- Err.Clear: Bu yöntem, hata numarasını ve hata açıklamasını VBA belleğinden temizler (bu, hatayı tamamen sıfırlamadığından “On Error GoTo -1” yönteminden farklıdır).
- Err.Raise: Bu yöntemle kodunuzda kasıtlı olarak bir çalışma zamanı hatası oluşturabilirsiniz ve izlenecek sözdizimi aşağıda verilmiştir:
Err .Raise [sayı], [kaynak], [açıklama], [yardım dosyası], [yardım içeriği]
Hata İşlemeyle İlgili Hızlı İpuçları
VBA hatalarını daha iyi ele almak için kullanabileceğiniz bazı hızlı ipuçlarını burada bulabilirsiniz.
- “Hata Durumunda Devam Ettir” seçeneğini yalnızca bir hatanın oluştuğundan emin olduğunuzda ve hatalı kod satırını atlamanın kabul edilebilir olduğunu ve bir sonraki satıra geçmenin güvenli olduğunu bildiğiniz zaman kullanın.
- Çalışma zamanı hatalarıyla başa çıkmanın en iyi yolu, “Hata İşleyicisi”ni “On Error GoTo [Label]” ile birlikte kullanmaktır. Bu, hata oluştuğunda size bilgi verilmesini sağlar, ancak o kötü hata mesajını görüntülemez.
- Hata işleyicisini her kullandığınızda, önce “Alttan Çıkış”ı kullandığınızdan emin olun.