Saya memiliki kode ini:
Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction
Dim ws As Worksheet: Set ws = Sheets("2012")
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
'within a loop
currName = "Example"
cellNum = wsFunc.VLookup(currName, rngLook, 13, False)
VLookup tidak diharapkan untuk selalu menemukan hasil; tetapi ketika tidak menemukan hasil, baris tersebut error sebelum saya bahkan dapat memeriksa kesalahan pada baris berikutnya.
Kesalahan:
Kesalahan waktu berjalan '1004': Tidak bisa mendapatkan properti VLookup dari kelas WorksheetFunction
Ini berfungsi dengan baik ketika hasilnya ditemukan. Apa cara yang baik untuk menangani kesalahan di sini?
Alih-alih WorksheetFunction.Vlookup
, Anda dapat menggunakan Application.Vlookup
. Jika Anda mengatur Varian
sama dengan ini, ia mengembalikan Error 2042 jika tidak ada kecocokan yang ditemukan. Anda kemudian dapat menguji varian - cellNum
dalam hal ini - dengan IsError
:
Sub test()
Dim ws As Worksheet: Set ws = Sheets("2012")
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
Dim currName As String
Dim cellNum As Variant
'within a loop
currName = "Example"
cellNum = Application.VLookup(currName, rngLook, 13, False)
If IsError(cellNum) Then
MsgBox "no match"
Else
MsgBox cellNum
End If
End Sub
Versi Aplikasi
dari fungsi VLOOKUP
dan MATCH
memungkinkan anda untuk menguji error tanpa memunculkan error. Jika anda menggunakan versi WorksheetFunction
, anda membutuhkan penanganan error yang berbelit-belit yang mengarahkan kembali kode anda ke error handler, kembali ke pernyataan berikutnya untuk dievaluasi, dll. Dengan fungsi Application
, Anda dapat menghindari kekacauan itu.
Hal di atas dapat disederhanakan lebih lanjut dengan menggunakan fungsi IIF
. Metode ini tidak selalu tepat (misalnya, jika Anda harus melakukan lebih banyak / prosedur yang berbeda berdasarkan If/Then
) tetapi dalam kasus ini di mana Anda hanya mencoba untuk menentukan prompt apa yang akan ditampilkan di MsgBox, itu harus bekerja:
cellNum = Application.VLookup(currName, rngLook, 13, False)
MsgBox IIF(IsError(cellNum),"no match", cellNum)
Pertimbangkan metode-metode tersebut bukannya pernyataan On Error ...
. Keduanya lebih mudah dibaca dan dipelihara - hanya sedikit hal yang lebih membingungkan daripada mencoba mengikuti sekumpulan pernyataan GoTo
dan Resume
.
Ada cara untuk melewatkan kesalahan di dalam kode dan tetap melanjutkan perulangan, semoga membantu:
Sub new1()
Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction
Dim ws As Worksheet: Set ws = Sheets(1)
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
currName = "Example"
On Error Resume Next ''if error, the code will go on anyway
cellNum = wsFunc.VLookup(currName, rngLook, 13, 0)
If Err.Number <> 0 Then
''error appeared
MsgBox "currName not found" ''optional, no need to do anything
End If
On Error GoTo 0 ''no error, coming back to default conditions
End Sub
Dari pengalaman saya yang terbatas, hal ini terjadi karena dua alasan utama:
Solusi sederhana di sini adalah menggunakan error handler yang diakhiri dengan Resume Next
Jika lookup_value
Anda adalah sebuah variabel, Anda bisa mengapitnya dengan TRIM()
cellNum = wsFunc.VLookup(TRIM(currName), rngLook, 13, False)