VBA kodlama konusunda ne kadar deneyimli olursanız olun, hatalar her zaman bunun bir parçası olacaktır.
Acemi ve uzman bir VBA programcısı arasındaki fark, uzman programcıların hataları etkili bir şekilde nasıl ele alacaklarını ve kullanacaklarını bilmeleridir.
Bu eğitimde, Excel VBA'da hataları etkili bir şekilde ele almak için kullanabileceğiniz çeşitli yolları göstereceğim.
VBA hata işlemeye girmeden önce, Excel VBA'da programlama yaparken karşılaşabileceğiniz farklı hata türlerini anlayalım.
Excel'deki VBA Hatalarının Türleri
Excel VBA'da dört tür hata vardır:
- Sözdizimi hataları
- Derleme hataları
- Çalışma zamanı hataları
- Mantıksal Hatalar
Bu hataların ne olduğunu ve bunlarla ne zaman karşılaşmanız muhtemel olduğunu hızlıca anlayalım.
Sözdizimi hatası
Adından da anlaşılacağı gibi bir sözdizimi hatası, VBA koddaki sözdiziminde yanlış bir şey bulduğunda oluşur.
Örneğin, gerekli olan deyimin/sözdiziminin bir bölümünü unutursanız, derleme hatasını görürsünüz.
Aşağıdaki kodda, ikinci satırdan sonra enter tuşuna basar basmaz bir derleme hatası görüyorum. Bunun nedeni, EĞER ifadesi sahip olması gerekiyor'Sonra' aşağıdaki kodda eksik olan komut.
Eksik bir şey olduğunda sözdizimi hatasını gördüğünüzden emin olmak için Otomatik Sözdizimi denetiminin etkinleştirildiğinden emin olmanız gerekir. Bunu yapmak için, "Araçlar"a ve ardından "Seçenekler"e tıklayın. Seçenekler iletişim kutusunda, 'Otomatik Sözdizimi Kontrolü' seçeneğinin etkinleştirildiğinden emin olun.
'Otomatik Sözdizimi Kontrolü' seçeneği devre dışı bırakılırsa, VBA sözdizimi hatası olan satırı kırmızı olarak vurgulamaya devam eder, ancak hata iletişim kutusunu göstermez.
Derleme hatası
Kodun çalışması için gereken bir şey eksik olduğunda derleme hataları oluşur.
Örneğin, aşağıdaki kodda, kodu çalıştırmayı denediğim anda aşağıdaki hatayı gösterecek. Bu, IF Then ifadesini zorunlu 'End If' ile kapatmadan kullandığım için oluyor.
VBA, siz kodu yazarken her satırı kontrol eder ve satır yanlış olduğunda ve siz enter tuşuna basar basmaz sözdizimi hatasını vurgular. Derleme hataları ise yalnızca kodun tamamı VBA tarafından analiz edildiğinde tanımlanır.
Derleme hatasıyla karşılaşacağınız bazı senaryolar aşağıdadır:
- End IF olmadan bir IF İfadesi Kullanmak
- Next ile For ifadesini kullanma
- End Select'i kullanmadan Select deyimini kullanma
- Değişkeni bildirmemek (bu yalnızca Option Explicit etkinleştirildiğinde çalışır)
- Var olmayan (veya yanlış parametrelerle) bir Alt/İşlev çağırma
Çalışma Zamanı Hataları
Çalışma zamanı hataları, kod çalışırken meydana gelen hatalardır.
Çalışma zamanı hataları, yalnızca tüm sözdizimi ve derleme hataları halledildiğinde ortaya çıkar.
Örneğin, bir Excel çalışma kitabını açması gereken bir kod çalıştırırsanız, ancak bu çalışma kitabı kullanılamıyorsa (silinmiş veya adı değiştirilmiş), kodunuz size bir çalışma zamanı hatası verecektir.
Bir çalışma zamanı hatası oluştuğunda, kodu durduracak ve size hata iletişim kutusunu gösterecektir.
Çalışma zamanı hatası iletişim kutusundaki mesaj biraz daha faydalıdır. Düzeltmenize yardımcı olabilecek sorunu açıklamaya çalışır.
Hata Ayıkla düğmesine tıklarsanız, kodun hataya yol açan kısmı vurgulanır.
Hatayı düzelttiyseniz, kodu kaldığı yerden çalıştırmaya devam etmek için araç çubuğundaki Çalıştır düğmesine tıklayabilirsiniz (veya F5 tuşuna basabilirsiniz).
Ya da koddan çıkmak için Bitir butonuna da tıklayabilirsiniz.
Önemli: Diyalog kutusundaki End butonuna tıklarsanız, kodu karşılaştığınız satırda durduracaktır. Ancak, bundan önceki tüm kod satırları yürütülürdü.Mantıksal Hatalar
Mantıksal hatalar kodunuzu durdurmaz ancak yanlış sonuçlara yol açabilir. Bunlar, giderilmesi en zor hata türleri de olabilir.
Bu hatalar derleyici tarafından vurgulanmaz ve manuel olarak ele alınması gerekir.
Bir mantıksal hata örneği (kendimi sık sık sıkışıp kaldığım) sonsuz bir döngüye giriyor.
Başka bir örnek, yanlış olan bir sonuç verdiğinde olabilir. Örneğin, kodda yanlış bir değişken kullanabilir veya birinin yanlış olduğu yere iki değişken ekleyebilirsiniz.
Mantıksal hataların üstesinden gelmek için kullandığım birkaç yol var:
- Mesaj Kutusunu kodun bir yerine yerleştirin ve her şeyin beklendiği gibi gidip gitmediğini anlamanıza yardımcı olabilecek değerleri/verileri vurgulayın.
- Kodu tek seferde çalıştırmak yerine, her satırı tek tek gözden geçirin. Bunu yapmak için kodda herhangi bir yeri tıklayın ve F8 tuşuna basın. F8'e her bastığınızda bir satırın yürütüldüğünü fark edeceksiniz. Bu, kodu birer birer gözden geçirmenize ve mantıksal hataları belirlemenize olanak tanır.
Derleme/Sözdizimi Hatalarını Bulmak için Hata Ayıklamayı Kullanma
Kodu tamamladığınızda, çalıştırmadan önce kodu derlemek iyi bir uygulamadır.
Bir kodu derlemek için araç çubuğundaki Debug seçeneğine tıklayın ve Compile VBAProject'e tıklayın.
Bir VBA projesini derlediğinizde, koddan geçer ve hataları (varsa) tanımlar.
Bir hata bulması durumunda, size hatayı içeren bir iletişim kutusu gösterecektir. Hataları tek tek buluyor. Yani bir hata bulursa ve düzelttiyseniz, diğer hataları (varsa) bulmak için tekrar derlemeyi çalıştırmanız gerekir.
Kodunuz hatasız olduğunda, VBAProject Derle seçeneği grileşir.
Derlemenin yalnızca 'Sözdizimi' hatalarını ve 'Derleme' hatalarını bulacağını unutmayın. Çalışma zamanı hatalarını BULAMAZ.
VBA kodu yazarken hataların ortaya çıkmasını istemezsiniz. Bunu önlemek için kullanabileceğiniz birçok hata işleme yöntemi vardır.
Bu makalenin sonraki birkaç bölümünde, Excel'de VBA hata işleme için kullanabileceğiniz yöntemleri ele alacağım.
Hata Ayarlarını Yapılandırın (İşlenen ve İşlenmeyen Hatalar)
Kodunuzla çalışmaya başlamadan önce Excel VBA'da bir ayar olup olmadığını kontrol etmeniz gerekir.
VBA araç çubuğuna gidin ve Araçlar'a ve ardından Seçenekler'e tıklayın.
Seçenekler iletişim kutusunda, Genel sekmesine tıklayın ve 'Hata Yakalama' grubu içinde 'İşlenmeyen Hatalarda Kırın' seçeneğinin işaretli olduğundan emin olun.
Üç seçeneği açıklayayım:
- Tüm Hatalarda Ara: Bu, bu hataları işlemek için teknikleri kullanmış olsanız bile, tüm hata türlerinde kodunuzu durduracaktır.
- Sınıfta Mola Modülü: Bu, işlenmeyen tüm hatalardaki kodunuzu durduracak ve aynı zamanda, Kullanıcı formları gibi nesneler kullanıyorsanız, bu nesnelerin içinde kırılacak ve hataya neden olan tam satırı vurgulayacaktır.
- İşlenmeyen Hatalarda Ara: Bu, yalnızca işlenmeyen hatalar için kodunuzu durduracaktır. Bu, işlenmeyen hataların size bildirilmesini sağladığı için varsayılan ayardır. Kullanıcı formları gibi nesneler kullanıyorsanız, bu, nesnede hataya neden olan satırı vurgulamayacak, ancak yalnızca o nesneye atıfta bulunan satırı vurgulayacaktır.
Özetle - Excel VBA ile yeni başlıyorsanız, 'İşlenmeyen Hataları Kırın' seçeneğinin işaretli olduğundan emin olun.
'On Error' İfadeleri ile VBA Hata İşleme
Kodunuz bir hatayla karşılaştığında yapabileceğiniz birkaç şey vardır:
- Hatayı yok sayın ve kodun devam etmesine izin verin
- Yerinde bir hata işleme kodu bulundurun ve bir hata oluştuğunda çalıştırın
Bu hata işleme yöntemlerinin her ikisi de son kullanıcının bir hata görmemesini sağlar.
Bunları yapmak için kullanabileceğiniz birkaç 'Hatada' ifadesi vardır.
Hatada Devam Et Sonraki
Kodunuzda 'On Error Resume Next'i kullandığınızda, karşılaşılan herhangi bir hata yok sayılır ve kod çalışmaya devam eder.
Bu hata işleme yöntemi oldukça sık kullanılır, ancak kullanırken dikkatli olmanız gerekir. Oluşabilecek herhangi bir hatayı tamamen yok saydığı için düzeltilmesi gereken hataları tespit edemeyebilirsiniz.
Örneğin aşağıdaki kod çalıştırılırsa hata verecektir.
Sub AssignValues() x = 20 / 4 y = 30 / 0 End Sub
Bu, bir sayıyı sıfıra bölemediğiniz için olur.
Ancak bu kodda (aşağıda gösterildiği gibi) 'On Error Resume Next' ifadesini kullanırsam hatayı yok sayar ve düzeltilmesi gereken bir sorun olduğunu bilemem.
Sub AssignValues() Hatada Devam Et Sonraki x = 20 / 4 y = 30 / 0 End Sub
On Error Resume Next, yalnızca VBA kodunuzun atması beklenen hataların türünü açıkça bildiğinizde kullanılmalıdır ve bunu yok saymanızda bir sakınca yoktur.
Örneğin, yeni eklenen bir sayfanın A1 hücresine anında tarih ve saat değerini ekleyecek olan VBA olay kodu aşağıdadır (bu kod bir modüle değil, çalışma sayfasına eklenir).
Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Format(Now, "dd-mmm-yyyy ss:dd:ss") End Sub
Bu çoğu durumda harika çalışıyor olsa da, çalışma sayfası yerine bir grafik sayfası eklersem bir hata gösterir. Bir grafik sayfasında hücreler olmadığı için kod bir hata verir.
Dolayısıyla, bu kodda 'On Error Resume Next' ifadesini kullanırsam, çalışma sayfalarında beklendiği gibi çalışacak ve grafik sayfalarıyla hiçbir şey yapmayacaktır.
Private Sub Workbook_NewSheet(ByVal Sh As Object) Hatada Devam Ediyor Sonraki Sh.Range("A1") = Format(Şimdi, "dd-mmm-yyyy ss:dd:ss") End Sub
Not: On Error Resume Next deyimi en iyi, ne tür hatalarla karşılaşacağınızı bildiğiniz zaman kullanılır. Ve sonra bu hataları görmezden gelmenin güvenli olduğunu düşünüyorsanız, onu kullanabilirsiniz.
Bir hata olup olmadığını analiz ederek ve bununla ilgili bir mesaj görüntüleyerek bu kodu bir sonraki aşamaya taşıyabilirsiniz.
Aşağıdaki kod, kullanıcıya bir çalışma sayfasının eklenmediğini bildiren bir mesaj kutusu gösterecektir.
Private Sub Workbook_NewSheet(ByVal Sh As Object) Hata Devam Ediyor Sonraki Sh.Range("A1") = Format(Şimdi, "dd-mmm-yyyy ss:dd:ss") Err.Number 0 ise MsgBox "Sana benziyor bir grafik sayfası ekledi" & vbCrLf & "Error - " & Err.Description End If End Sub
Hata numarasını almak için 'Err.Number' ve hata açıklamasını almak için 'Err.Description' kullanılır. Bunlar, bu eğitimde daha sonra ele alınacaktır.
Hatada GoTo 0
'On Error GoTo 0', hataya neden olan satırdaki kodu durduracak ve hatayı açıklayan bir mesaj kutusu gösterecektir.
Basit bir ifadeyle, varsayılan hata kontrol davranışını etkinleştirir ve varsayılan hata mesajını gösterir.
O zaman neden kullanıyorsun?
Normalde, 'On Error Goto 0' kullanmanıza gerek yoktur, ancak 'On Error Resume Next' ile birlikte kullandığınızda faydalı olabilir.
Açıklamama izin ver!
Aşağıdaki kod, seçimdeki tüm boş hücreleri seçer.
Sub SelectFormulaCells() Selection.SpecialCells(xlCellTypeBlanks).Select End Sub
Ancak seçilen hücrelerde boş hücre olmadığında bir hata gösterecektir.
Bu nedenle, hatayı göstermemek için, bir sonraki Hatada Devam Et'i kullanabilirsiniz.
Şimdi, aşağıdaki kodu çalıştırdığınızda da herhangi bir hata gösterecektir:
Sub SelectFormulaCells() Hatada Sonraki Selection.SpecialCells(xlCellTypeBlanks).Select End Sub
Çok uzak çok iyi!
Sorun, kodun hatanın oluşabileceği bir parçası olduğunda ortaya çıkar ve 'Sonraki Hatada Devam Et' seçeneğini kullandığınızdan, kod basitçe onu yok sayar ve bir sonraki satıra geçer.
Örneğin, aşağıdaki kodda hata istemi olmaz:
Sub SelectFormulaCells() Hatada Devam Sonraki Selection.SpecialCells(xlCellTypeBlanks).Select '… hata içerebilen daha fazla kod End Sub
Yukarıdaki kodda, bir hatanın oluşabileceği iki yer vardır. İlk yer, tüm boş hücreleri seçtiğimiz yer (Selection.SpecialCells kullanarak) ve ikincisi kalan kodda.
İlk hata beklenirken, bundan sonraki herhangi bir hata beklenmez.
Bu, On Error Goto 0'ın kurtarmaya geldiği yerdir.
Kullandığınızda, hata ayarını varsayılana sıfırlarsınız, burada karşılaştığında hata göstermeye başlar.
Örneğin, aşağıdaki kodda boş hücre olmaması durumunda hata olmayacak, ancak '10/0' nedeniyle bir hata istemi olacaktır.
Sub SelectFormulaCells() Hatada Devam Sonraki Selection.SpecialCells(xlCellTypeBlanks).Select On Error GoTo 0 '… hata içerebilen daha fazla kod End Sub
Hatada [Etiket] Git
Yukarıdaki iki yöntem - 'On Error Resume Next' ve 'On Error Goto 0' - hatayı gerçekten ele almamıza izin vermiyor. Biri kodun hatayı yok saymasını sağlar ve ikincisi hata denetimine devam eder.
On Error Go [Etiket], kodunuzda bir hata olması durumunda ne yapmak istediğinizi belirtebileceğiniz bir yoldur.
Bu hata işleyiciyi kullanan kod yapısı aşağıdadır:
Alt Test() Hatada Git Etiketi: X = 10 / 0 'bu satır bir hataya neden oluyor '… .kalan kodunuz buraya gidiyor Exit Sub Label: ' hatayı işlemek için kod End Sub
'Etiket' işleme hatasından önce, bir Çıkış Sub olduğunu unutmayın. Bu, herhangi bir hata olmaması durumunda alttan çıkılmasını ve 'Etiket' kodunun çalıştırılmamasını sağlar. Exit Sub kullanmamanız durumunda, her zaman 'Etiket' kodunu çalıştıracaktır.
Aşağıdaki örnek kodda, bir hata oluştuğunda, kod atlar ve işleyici bölümündeki kodu yürütür (ve bir mesaj kutusu gösterir).
Sub Errorhandler() On Error ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Bir hata var gibi görünüyor" & vbCrLf & Err.Description End Sub
Bir hata oluştuğunda, kodun zaten hataya neden olan satırdan önceki satırları çalıştırdığını ve çalıştırdığını unutmayın. Yukarıdaki örnekte kod, X'in değerini 12 olarak ayarlar ancak hata sonraki satırda oluştuğu için Y ve Z değerlerini ayarlamaz.
Kod, hata işleyici koduna atladığında (bu örnekte ErrMsg), hata işleyici kodunun içindeki ve altındaki tüm satırları yürütmeye ve alt koddan çıkmaya devam edecektir.
Hatada Git -1
Bu biraz karmaşık ve çoğu durumda bunu kullanmanız pek mümkün değil.
Ancak bunun gerekli olduğu bir durumla karşılaştığım için bunu yine de ele alacağım (yalnızca temel bilgileri arıyorsanız, görmezden gelip bir sonraki bölüme geçmekten çekinmeyin).
Mekaniğine girmeden önce, nerede faydalı olabileceğini açıklamaya çalışayım.
Bir hatayla karşılaşıldığı bir kodunuz olduğunu varsayalım. Ancak, yerinde bir hata işleyiciniz olduğu için her şey yolunda. Ancak hata işleyici kodunda başka bir hata olduğunda ne olur (evet… biraz başlangıç filmi gibi).
Böyle bir durumda ilk hata temizlenmediği için ikinci işleyiciyi kullanamazsınız. Yani ilk hatayı hallederken, VBA'nın hafızasında hala var. Ve VBA belleğinde yalnızca bir hata için yer vardır - iki veya daha fazla değil.
Bu senaryoda, On Error Goto -1'i kullanabilirsiniz.
Hatayı siler ve bir sonraki hatayı işlemek için VBA belleğini boşaltır.
Bu kadar konuşma yeter!
Şimdi örneklerle açıklayayım.
Diyelim ki aşağıdaki koda sahibim. Sıfıra bölme olduğu için bu bir hata verecektir.
Sub Errorhandler() X = 12 Y = 20 / 0 Z = 30 End Sub
Bunu halletmek için, aşağıda gösterildiği gibi bir hata işleyici kodu (ErrMsg adıyla) kullanıyorum:
Sub Errorhandler() On Error ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Bir hata var gibi görünüyor" & vbCrLf & Err.Description End Sub
Şimdi yine her şey yolunda. Hata oluşur oluşmaz hata işleyici kullanılır ve aşağıda gösterildiği gibi bir mesaj kutusu gösterir.
Şimdi, hata işleyicide veya sonrasında daha fazla kodum olması için kodu genişletiyorum.
Sub Errorhandler() On Error ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Bir hata var gibi görünüyor" & vbCrLf & Err.Description A = 10 / 2 B = 35 / 0 End Sub
İlk hata işlendiği için ikincisi işlenmediği için aşağıda gösterildiği gibi yine bir hata görüyorum.
Yine de hepsi iyi. Kod beklediğimiz şekilde davranıyor.
İkinci hatayı işlemek için başka bir hata işleyicisi (ErrMsg2) kullanıyorum.
Sub Errorhandler() On Error ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Bir hata var gibi görünüyor" & vbCrLf & Err.Description On Error ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Yine bir hata var gibi görünüyor" & vbCrLf & Err.Description End Sub
Ve işte burası beklendiği gibi çalışmıyor.
Yukarıdaki kodu çalıştırırsanız, ikinci hata işleyiciyi yerleştirdikten sonra bile size bir çalışma zamanı hatası verecektir.
Bu, VBA'nın belleğindeki ilk hatayı temizlemediğimiz için olur.
Evet, hallettik! Ama yine de hafızada kalır.
Ve VBA başka bir hatayla karşılaştığında, hala ilk hataya takılır ve bu nedenle ikinci hata işleyicisi kullanılmaz. Kod, hataya neden olan satırda durur ve hata istemini gösterir.
VBA'nın belleğini temizlemek ve önceki hatayı temizlemek için 'On Error Goto -1' kullanmanız gerekir.
Yani bu satırı aşağıdaki koda ekleyip çalıştırırsanız beklendiği gibi çalışacaktır.
Sub Errorhandler() Hatada Git ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "Bir hata var gibi görünüyor" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Yine bir hata var gibi görünüyor" & vbCrLf & Err.Description End SubNot: Bir alt program sona erdiğinde hata otomatik olarak temizlenir.Bu nedenle, aynı alt programda iki veya ikiden fazla hata aldığınızda 'On Error Goto -1' yararlı olabilir.
Hata Nesnesi
Bir kodla ilgili bir hata oluştuğunda, hatayla ilgili ayrıntıları (hata numarası veya açıklama gibi) almak için kullanılan Err nesnesidir.
Hata Nesnesi Özellikleri
Err Nesnesi aşağıdaki özelliklere sahiptir:
Mülk | Tanım |
Numara | Hata türünü temsil eden bir sayı. Hata olmadığında bu değer 0'dır. |
Tanım | Hatanın kısa bir açıklaması |
Kaynak | Hatanın oluştuğu proje adı |
Yardım İçeriği | Yardım dosyasındaki hata için yardım bağlamı kimliği |
Yardım Dosyası | Yardım dosyasının klasör konumunu ve dosya adını temsil eden bir dize |
Çoğu durumda Err nesnesini kullanmanız gerekmese de, bazen Excel'deki hataları işlerken yararlı olabilir.
Örneğin, aşağıda gösterildiği gibi bir veri kümeniz olduğunu ve seçimdeki her sayı için bitişik hücredeki karekökü hesaplamak istediğinizi varsayalım.
Aşağıdaki kod bunu yapabilir, ancak A5 hücresinde bir metin dizesi olduğundan, bu meydana gelir gelmez bir hata gösterir.
Sub FindSqrRoot() Dim rng As Range Set rng = Her hücre için seçim rng cell.Offset(0, 1).Value = Sqr(cell.Value) Sonraki hücre End Sub
Bu tür bir hata mesajındaki sorun, neyin yanlış gittiği ve sorunun nerede oluştuğu hakkında size hiçbir şey vermemesidir.
Bu hata mesajlarını daha anlamlı hale getirmek için Err nesnesini kullanabilirsiniz.
Örneğin, şimdi aşağıdaki VBA kodunu kullanırsam, hata oluştuğu anda kodu durduracak ve sorunun olduğu hücrenin hücre adresini içeren bir mesaj kutusu gösterecektir.
Sub FindSqrRoot() Dim rng As Range Set rng = Rng On Error'daki Her Hücre İçin Seçim ErrHandler cell.Offset(0, 1).Value = Sqr(cell.Value) Sonraki hücre ErrHandler: MsgBox "Hata Numarası:" & Err .Number & vbCrLf & _ "Hata Açıklaması: " & Err.Description & vbCrLf & _ "Hata: " & cell.Address End Sub
Yukarıdaki kod size basit 'Tür Uyuşmazlığı'ndan çok daha fazla bilgi verir, özellikle hatanın nerede oluştuğunu bilmeniz için hücre adresi.
Kodunuzun sonuna kadar çalıştığından emin olmak için (her hatada kırmak yerine) bu kodu daha da hassaslaştırabilir ve ardından size hatanın oluştuğu hücre adresinin bir listesini verir.
Aşağıdaki kod bunu yapardı:
Sub FindSqrRoot2() Dim ErrorCells As String Dim Dim rng As Range On Error Resume Next Set rng = rng hücresindeki her hücre için seçim.Offset(0, 1).Value = Sqr(cell.Value) Err.Number 0 ise ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Aşağıdaki hücrelerde hata" & ErrorCells Exit Sub End Sub
Yukarıdaki kod sonuna kadar çalışır ve içinde sayı olan tüm hücrelerin karekökünü verir (bitişik sütunda). Ardından, hatanın olduğu tüm hücreleri listeleyen bir mesaj gösterir (aşağıda gösterildiği gibi):
Err Nesne Yöntemleri
Err özellikleri, hatalar hakkında faydalı bilgiler göstermek için kullanışlı olsa da, hata işleme konusunda size yardımcı olabilecek iki Err yöntemi de vardır.
Yöntem | Tanım |
Temizlemek | Err nesnesinin tüm özellik ayarlarını temizler |
Yükseltmek | Bir çalışma zamanı hatası oluşturur |
Bunların ne olduğunu ve bunların Excel'de VBA ile nasıl/neden kullanılacağını hızlıca öğrenelim.
Err Temizleme Yöntemi
Aşağıda gösterildiği gibi bir veri kümeniz olduğunu ve bitişik sütundaki tüm bu sayıların karekökünü almak istediğinizi varsayalım.
Aşağıdaki kod, bitişik sütundaki tüm sayıların kareköklerini alacak ve A5 ve A9 hücresi için bir hata oluştuğuna dair bir mesaj gösterecektir (bunlarda metin olduğu için).
Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = rng hücresindeki her hücre için seçim.Offset(0, 1).Value = Sqr(cell.Value) Err.Number 0 ise ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Aşağıdaki hücrelerde hata" & ErrorCells End Sub
If Then deyiminde Err.Clear yöntemini kullandığımı unutmayın.
Bir hata oluştuğunda ve If koşulu tarafından yakalandığında, Err.Clear yöntemi hata numarasını tekrar 0'a sıfırlar. Bu, IF koşulunun yalnızca ortaya çıktığı hücreler için hataları yakalamasını sağlar.
Err.Clear yöntemini kullanmamış olsaydım, hata oluştuğunda, EĞER durumunda her zaman doğru olurdu ve hata numarası sıfırlanmadı.
Bu işi yapmanın başka bir yolu, hatayı tamamen sıfırlayan On Error Goto -1'i kullanmaktır.
Not: Err.Clear, On Error Goto -1'den farklıdır. Err.Clear yalnızca hata açıklamasını ve hata numarasını siler. tamamen sıfırlamaz. Bu, aynı kodda başka bir hata örneği varsa, onu sıfırlamadan önce çözemeyeceğiniz anlamına gelir (bu, 'Err.Clear' ile değil, 'On Error Goto -1' ile yapılabilir).Err Yükseltme Yöntemi
Err.Raise yöntemi, bir çalışma zamanı hatası oluşturmanıza olanak tanır.
Err.Raise yöntemini kullanmanın sözdizimi aşağıdadır:
Err.Raise [sayı], [kaynak], [açıklama], [yardım dosyası], [yardım bağlamı]
Tüm bu argümanlar isteğe bağlıdır ve bunları hata mesajınızı daha anlamlı hale getirmek için kullanabilirsiniz.
Ama neden bir hatayı kendin dile getirmek isteyesin ki?
İyi soru!
Bu yöntemi, bir hata örneği olduğunda (bu, yine de bir hata olacağı anlamına gelir) kullanabilirsiniz ve ardından bu yöntemi, kullanıcıya hata hakkında daha fazla bilgi vermek için kullanırsınız (VBA'nın gösterdiği daha az yardımcı hata mesajı yerine). varsayılan olarak).
Örneğin, aşağıda gösterildiği gibi bir veri kümeniz olduğunu ve tüm hücrelerin yalnızca sayısal değerlere sahip olmasını istediğinizi varsayalım.
Sub RaiseError() Dim rng As Range Set rng = Hata Seçimi Rng'deki Her Hücre İçin ErrHandler'a Git Değilse (Numeric(Cell.Value)) Sonra Err.Raise vbObjectError + 513, Cell.Address, "Sayı değil", " Test.html" End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
Yukarıdaki kod, belirtilen açıklamaya ve bağlam dosyasına sahip bir hata mesajı gösterecektir.
Şahsen, çoğunlukla yalnızca Excel ile çalıştığım için Err.Raise'i hiç kullanmadım. Ancak, Outlook, Word veya PowerPoint gibi diğer uygulamalarla birlikte Excel ile çalışmak için VBA kullanan biri için bu yararlı olabilir.
Daha fazlasını öğrenmek istemeniz durumunda Err.Raise yöntemiyle ilgili ayrıntılı bir makale burada.
VBA Hatası İşleme En İyi Uygulamaları
VBA kodu yazarken ne kadar yetenekli olursanız olun, hatalar her zaman bunun bir parçası olacaktır. En iyi kodlayıcılar, bu hataları düzgün bir şekilde ele alma becerisine sahip olanlardır.
Excel VBA'da hata işleme söz konusu olduğunda kullanabileceğiniz en iyi uygulamalardan bazıları şunlardır.
- Kodun başında 'On Error Go [Etiket]' seçeneğini kullanın. Bu, oradan meydana gelebilecek herhangi bir hatanın ele alındığından emin olacaktır.
- YALNIZCA oluşabilecek hatalardan emin olduğunuzda 'On Error Resume Next'i kullanın. Yalnızca beklenen hatayla kullanın. Beklenmedik hatalarla kullanmanız durumunda, basitçe görmezden gelir ve ilerler. Belirli bir hata türünü yok saymak ve gerisini yakalamak istiyorsanız, 'Err.Raise' ile 'On Error Resume Next'i kullanabilirsiniz.
- Hata işleyicileri kullanırken, işleyicilerden önce Exit Sub kullandığınızdan emin olun. Bu, hata işleyici kodunun yalnızca bir hata olduğunda yürütülmesini sağlar (aksi takdirde her zaman yürütülür).
- Farklı türde hataları yakalamak için birden çok hata işleyici kullanın. Birden fazla hata işleyiciye sahip olmak, bir hatanın doğru şekilde ele alınmasını sağlar. Örneğin, bir "tür uyuşmazlığı" hatasını "0'a Bölme" çalışma zamanı hatasından farklı şekilde ele almak istersiniz.
Umarım bu Excel makalesini faydalı bulmuşsunuzdur!
İşte beğenebileceğiniz bazı Excel VBA Eğitimleri:
- Excel VBA Veri Türleri - Eksiksiz Bir Kılavuz
- Excel VBA Döngüleri - Sonraki İçin, Yaparken, Yapana Kadar, Her Biri İçin
- Excel VBA Etkinlikleri - Kolay (ve Eksiksiz) Bir Kılavuz
- Excel Visual Basic Düzenleyici - Excel'de Nasıl Açılır ve Kullanılır