Jenis kesalahan vba: debugging dan solusi
Seperti bahasa pemrograman lainnya, VBA tidak beruntung dalam hal kesalahan dan Anda harus mengatasinya apa pun yang terjadi. Kesalahan tersebut dapat berasal dari berbagai sumber, seperti pengkodean yang buruk, operasi yang tidak mungkin dilakukan (seperti membagi dengan nol), atau kesalahan yang tidak terduga.
Cara terbaik untuk menangani hal ini adalah dengan memiliki pemahaman yang baik tentang semua kemungkinan hasil yang dapat Anda capai dengan kode tersebut. Lihat contoh di bawah ini di mana kita memiliki kode VBA yang menghitung akar kuadrat dari suatu bilangan menggunakan nilai yang Anda miliki di sel yang dipilih.
Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub
Namun jika sel aktif memiliki nilai selain angka, Anda akan mendapatkan error runtime, seperti di bawah ini.
Parameter Kesalahan di VBA (Error Catching)
Dalam opsi VBA, Anda dapat mengonfigurasi pengaturan untuk menangani kesalahan sebelum Anda mulai menulis kode. Untuk membuka pengaturan VBA, buka Tools ➤ Options ➤ General ➤ Error Catching. Di sini Anda memiliki tiga opsi yang dapat Anda gunakan.
- Hentikan semua kesalahan : Jika Anda telah mengaktifkan opsi ini, VBA akan menghentikan kode untuk semua jenis kesalahan meskipun Anda telah menggunakan semua jenis teknik penanganan kesalahan.
- Modul Kelas Tampering : Dengan opsi ini, VBA akan menghentikan semua kode Anda yang tidak ditangani oleh teknik apa pun. Dan jika Anda menggunakan objek seperti Userforms, itu juga akan membobol objek tersebut dan menyorot baris persis di mana kesalahannya berada.
- Break on Unhandled Errors : Ini adalah pengaturan default yang membantu Anda mengetahui semua kesalahan yang tidak Anda gunakan teknik penanganan kesalahannya dan menghentikan kode untuk semua kesalahan yang tidak tertangani. (Tetapi, jika Anda menggunakan objek seperti Userforms, ini tidak akan menyorot baris yang menyebabkan kesalahan pada objek, tetapi hanya akan menyorot baris yang mereferensikan objek tersebut).
Jenis Kesalahan VBA
Untuk memahami error VBA, Anda dapat membaginya menjadi empat kategori, dan berikut penjelasan mengenai jenis error tersebut.
1. Kesalahan sintaksis
Saat menulis kode VBA, Anda harus mengikuti sintaks tertentu dan ketika Anda mengabaikannya atau tidak menulisnya sebagaimana mestinya, Anda mungkin menghadapi kesalahan SYNTAX (juga dikenal sebagai kesalahan bahasa). Ini seperti kesalahan ketik yang Anda buat saat menulis kode.
Nah, VBA membantu Anda dengan melaporkan kesalahan tersebut dengan menampilkan pesan kesalahan. Anda hanya perlu memastikan “Pemeriksaan Sintaks Otomatis” diaktifkan di editor VB Anda.
Buka Alat ➤ Opsi dan pastikan untuk mencentang kotak “Pemeriksaan sintaksis otomatis”. Dengan ini, setiap kali Anda membuat kesalahan SYNTAX, VBA menampilkan pesan kesalahan.
Namun jika “Pemeriksaan Sintaks Otomatis” dinonaktifkan, VBA tetap menyorot baris kode yang mengalami kesalahan tetapi tidak menampilkan pesan kesalahan.
2. Kesalahan kompilasi
Hal ini terjadi ketika Anda menulis kode untuk melakukan suatu aktivitas, namun aktivitas tersebut tidak valid atau tidak dapat dilakukan oleh VBA. Contoh terbaiknya adalah ketika Anda memiliki beberapa kode menggunakan pernyataan IF tetapi Anda melewatkan menambahkan END IF di akhir pernyataan dan sekarang ketika Anda menjalankan VBA ini Anda menampilkan pesan kesalahan kompilasi.
Selain itu, ada contoh kesalahan kompilasi lainnya:
- Menggunakan Untuk tanpa Berikutnya ( Untuk Berikutnya ).
- Pilih tanpa memilih akhir ( Select case ).
- Jangan mendeklarasikan variabel ketika Anda telah mengaktifkan “ Opsi Eksplisit ”.
- Memanggil sub/fungsi yang tidak ada.
3. Kesalahan Waktu Proses
Kesalahan runtime terjadi ketika kode dijalankan. Ingat contoh yang saya bagikan kepada Anda di atas ketika kode menghitung akar kuadrat suatu bilangan.
Ketika kesalahan runtime terjadi saat menjalankan kode, itu menghentikan kode dan menampilkan kotak dialog kesalahan dan kotak kesalahan ini berbicara tentang sifat kesalahan yang Anda alami. Misalkan Anda menulis kode yang membuka buku kerja dari lokasi yang Anda tentukan, namun buku kerja tersebut kini dipindahkan atau dihapus oleh seseorang.
Jadi ketika Anda menjalankan kodenya, VBA akan menampilkan kesalahan runtime karena tidak dapat menemukan file ini di lokasi ini. Pesan yang Anda dapatkan dalam kesalahan runtime menjelaskan alasan yang membantu Anda memahami alasan kesalahan tersebut.
Dan ketika terjadi kesalahan runtime, eksekusi kode akan dihentikan. Jika Anda mengklik tombol “Debug”, baris kode yang berisi kesalahan ini akan ditampilkan dengan menyorotnya dengan warna kuning. Atau Anda dapat mengklik tombol “End” untuk menghentikan eksekusi kode dan menutup pesan kesalahan.
4. Kesalahan logis
Ini bukan kesalahan tapi kesalahan saat menulis kode. Jenis kesalahan ini terkadang dapat membuat Anda kesulitan saat menemukan dan memperbaikinya.
Misalkan Anda sedang menulis beberapa kode dan ketika mendeklarasikan suatu variabel Anda menggunakan tipe data yang salah atau Anda menggunakan langkah perhitungan yang salah. Dalam hal ini kode Anda akan berfungsi dengan baik dan Anda tidak akan menemukan kesalahan ini dengan mudah. Cara terbaik untuk mengatasi masalah seperti ini adalah dengan menjalankan setiap baris kode satu per satu.
Menggunakan Alat Debugging di VBA
VBA memberi Anda seperangkat alat untuk men-debug kode Anda dan menghapus bug dari kode Anda.
1. Kompilasi proyek VBA
Di Visual Basic Editor, ada opsi yang dapat Anda gunakan langsung setelah menyelesaikan kode Anda. Opsi kompilasi ini menganalisis setiap baris kode Anda dan menampilkan kotak pesan jika ada kesalahan dalam kode Anda.
Catatan: Opsi Kompilasi VBA hanya melacak kesalahan sintaksis dan kompilasi, bukan kesalahan runtime, karena kesalahan ini hanya terjadi ketika kode sedang berjalan. Untuk menggunakan Kompilasi Proyek VBA, buka ➤ Debug ➤ Kompilasi Proyek VBA.
Setelah Anda menjalankan “Kompilasi Proyek VBA” dan tidak ada kesalahan dalam kode Anda, opsinya akan berwarna abu-abu.
2. Jalankan setiap baris kode satu per satu
Inilah cara saya melakukannya. Ketika saya menyelesaikan sebuah kode, saya cukup menjalankannya baris demi baris untuk memeriksa apakah ada kesalahan. Ini mungkin memerlukan waktu, tetapi ini membantu Anda mengatasi semua kesalahan (sintaks, kompilasi, dan eksekusi).
Pada “Debug Toolbar” terdapat tombol “Step In” yang dapat Anda gunakan untuk menjalankan kode baris demi baris atau Anda cukup menekan F8 untuk menjalankan satu baris lalu tekan lagi untuk menjalankan baris berikutnya dalam kode.
Menggunakan Pernyataan “On ERROR” untuk Menangani Kesalahan VBA
Penting untuk memeriksa kode Anda dan menemukan kemungkinan kesalahan di semua metode debugging yang Anda miliki. Namun cara terbaik dan efisien adalah dengan membuat instruksi penanganan error yang dapat menangani error dan membuat kode Anda sempurna saat dijalankan. Mari kita telusuri pernyataan-pernyataan ini. Ketika kesalahan terjadi pada kode VBA, cara terbaik untuk menangani kesalahan ini adalah:
- Biarkan VBA mengabaikan kesalahan dan menjalankan kodenya
- Biarkan serangkaian instruksi khusus dijalankan ketika terjadi kesalahan.
Di kedua solusi, Anda dapat menggunakan pernyataan “On Error”. Berikut adalah empat pernyataan “On Error” yang dapat Anda gunakan. Dan sekarang mari kita lihat setiap pernyataan satu per satu.
1. Jika Anda melakukan kesalahan, mulai lagi
Baris kode sederhana ini memungkinkan VBA untuk terus mengeksekusi kode meskipun terjadi kesalahan. IDEnya sederhana: pindah ke baris kode berikutnya jika kesalahan terdeteksi di mana saja selama eksekusi.
Pada kode di bawah ini, Anda memiliki dua baris kode:
- Baris pertama menunjukkan nilai pada sel A1 adalah 25 dibagi 0
- Dan baris kedua mengatakan bahwa nilai sel A2 adalah 10 dibagi 5
Sekarang ada masalah dengan kode yang Anda miliki online. Seperti yang Anda ketahui, jika Anda membagi sesuatu dengan 0, hasilnya akan menjadi kesalahan. Jadi ketika Anda menjalankan kode ini, VBA menampilkan pesan kesalahan “Runtime error ’11’ Divide by zero” dan menghentikan eksekusi.
Namun ketika Anda menambahkan “On Error Resume Next” di awal kode dan menjalankan kode, VBA mengabaikan baris kode tempat kesalahan terjadi dan melanjutkan ke baris kedua dan menambahkan nilai tersebut di sel A2.
Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub
Jadi, kapan pun Anda ingin kode Anda berjalan meskipun terjadi kesalahan di mana pun, cukup gunakan pernyataan “On Error Resume Next” di kode Anda.
Namun ada satu hal lagi yang harus Anda perhatikan: ini hanya akan mengabaikan kesalahan yang terjadi setelahnya.
Katakanlah kesalahan terjadi pada baris 5 dan Anda menambahkan “On Error Resume Next” pada baris 8, kesalahan ini tidak akan dilewati. Jadi, cara terbaik adalah menambahkannya sebagai baris kode pertama dalam prosedur.
2. Jika terjadi kesalahan GoTo 0
Ini adalah perilaku default VBA yang ketika terjadi kesalahan, ia menghentikan eksekusi kode.
Ya, menggunakan “On Error GoTo 0″ tidak membuat perbedaan pada kode Anda. VBA hanya akan menghentikan kode dan menampilkan pesan dengan deskripsi kesalahan. Jadi mengapa saya harus repot-repot menggunakannya? Pertanyaan cerdas. Mari kita gunakan contoh yang Anda gunakan di atas dalam ” On Error Resume Next “.
Dalam kode ini, setiap kali terjadi kesalahan, VBA mengambil baris kode berikutnya dan mengeksekusinya dan Anda tidak akan melihat pesan kesalahan apa pun. Namun katakanlah Anda memiliki lebih banyak baris dalam kode Anda dan Anda tidak ingin melebihi baris tersebut jika ada kesalahan dalam kode.
Jadi, jika Anda memasukkan “On Error GoTo 0” setelah baris kode kedua, ini akan mengembalikan penangan kesalahan default VBA yang menampilkan pesan kesalahan setiap kali terjadi kesalahan.
3. Jika terjadi kesalahan GoTo [Label]
Bayangkan sebuah tempat di gedung yang dapat Anda datangi dalam keadaan darurat. Demikian pula, dengan menggunakan “On Error GoTo [Label]”, Anda cukup membuat blok kode terpisah di kode utama Anda untuk menangani kesalahan.
Faktanya, “On Error GoTo [Label]” adalah cara yang jauh lebih baik dan nyaman untuk menangani kesalahan. Pada kode di bawah ini Anda memiliki “On Error GoTo Oh!” Error” sekarang di baris deklarasi ini, kata “Oh!” Kesalahan” adalah labelnya.
Jika Anda melihat di akhir kode di mana Anda memiliki awalan tertentu dengan nama label dan kemudian kode untuk kotak pesan dengan pesan di kode tersebut.
Nah apa jadinya jika terjadi error maka VBA akan loncat ke label “Oh! Error” dan akan mengeksekusi blok kode yang Anda miliki setelah label itu.
Namun ada satu hal yang perlu Anda perhatikan: jika kesalahan tidak terjadi, label yang Anda miliki di kode Anda akan dieksekusi. Ada dua hal yang perlu Anda lakukan:
- Pertama, pastikan Anda menambahkan tag kesalahan di akhir kode.
- Kedua, tambahkan “Exit Sub” sebelum label kesalahan.
Dengan ini, Anda akan mendapatkan keuntungan dalam kedua situasi tersebut. Katakanlah jika terjadi kesalahan dan VBA beralih ke label yang Anda tentukan, hanya akan ada kode dari label itu sendiri ke kode. Dan jika kesalahan tidak terjadi, pernyataan “Keluar Sub” yang Anda miliki sebelum label akan keluar dari prosedur tanpa menjalankan label kesalahan.
4. Jika terjadi kesalahan GoTo -1
Sebelum kita membahas ini, izinkan saya berbagi sesuatu dengan Anda. Ketika kesalahan terjadi pada suatu kode, VBA menyimpan log kesalahan ini di memorinya dan hanya menghapusnya ketika rutinitas selesai.
Wahai VBA! Hiduplah di masa sekarang
Untuk menangani kesalahan kedua dalam kode VBA, Anda harus menghapus kesalahan pertama dari memori VBA. Pada kode di bawah ini, Anda memiliki dua pernyataan “On Error GoTo [Label]” yang menangani kesalahan dari dua blok kode berbeda.
Tetapi jika Anda menjalankan kode ini, ketika kesalahan kedua VBA tidak akan melompat ke label yang Anda tetapkan dan malah akan menampilkan pesan kesalahan “Jenis Tidak Cocok”.
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
Untuk mengatasi masalah ini, Anda dapat menggunakan “On Error GoTo -1” yang memungkinkan VBA menghapus kesalahan saat ini dari penyimpanannya.
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
Sekarang ketika Anda menjalankan kode ini, “On Error GoTo -1” menghapus kesalahan dari memori dan VBA menangani kesalahan dalam pernyataan kedua sesuai keinginan.
Apa lagi yang perlu saya ketahui untuk menangani kesalahan di VBA?
Selain menggunakan teknik penanganan kesalahan, ada beberapa hal lain yang dapat Anda gunakan untuk menangani kesalahan dengan lebih baik.
Kesalahan objek
Ketika kesalahan terjadi saat menjalankan kode, Anda dapat menggunakan objek Err untuk mendapatkan detail tentang kesalahan tersebut. Ada beberapa properti dan metode yang dapat Anda gunakan dengan objek Err. Mari kita pelajari satu per satu.
Properti
Berikut adalah properti yang dapat Anda gunakan dengan objek Err:
- Err.Number : Ketika terjadi kesalahan, nomor disimpan di objek Err. Pada kode di bawah ini, ketika itu terjadi, kotak pesan menampilkan nomor kesalahan.
- Err.Description : Properti ini menampilkan deskripsi kesalahan yang dapat membantu Anda memahami alasan kesalahan tersebut.
- Err.Source: Properti ini memberi tahu Anda di proyek mana kesalahan terjadi.
- Err.HelpContext: Properti ini mengembalikan ID konteks bantuan untuk kesalahan dalam file bantuan.
- Err.HelpContext: Ini adalah nilai string untuk lokasi file bantuan.
Biasanya, ketika Anda menangani kesalahan menggunakan teknik penanganan kesalahan, Anda tidak banyak menggunakan objek Err dalam kode Anda. Namun di bawah ini adalah contoh sederhana untuk menggunakannya.
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
Ketika Anda menjalankan kode di atas, dan jika terjadi kesalahan, maka akan muncul kotak pesan dengan nomor kesalahan dan deskripsi kesalahan.
Metode
Dengan Err Object Anda juga dapat menggunakan dua metode.
- Err.Clear: Metode ini menghapus nomor kesalahan dan deskripsi kesalahan dari memori VBA (ini berbeda dengan “On Error GoTo -1” karena tidak sepenuhnya mereset kesalahan).
- Err.Raise: Dengan metode ini, Anda dapat dengan sengaja membuat kesalahan runtime dalam kode Anda, dan berikut sintaks yang harus diikuti:
Err .Naikkan [angka], [sumber], [deskripsi], [file bantuan], [konteks bantuan]
Tips Cepat Penanganan Kesalahan
Berikut beberapa tip cepat yang dapat Anda gunakan untuk menangani kesalahan VBA dengan lebih baik.
- Gunakan “On Error Resume Next” hanya ketika Anda tahu pasti bahwa kesalahan sedang terjadi dan boleh saja melewatkan baris kode yang memiliki kesalahan dan aman untuk melanjutkan ke baris berikutnya.
- Cara terbaik untuk mengatasi error runtime adalah dengan menggunakan “Error Handler” dengan “On Error GoTo [Label]”. Ini memastikan bahwa setiap kali kesalahan terjadi, Anda akan diberi tahu, tetapi pesan kesalahan buruk itu tidak akan ditampilkan.
- Setiap kali Anda menggunakan error handler, pastikan untuk menggunakan “Exit Sub” terlebih dahulu.