Hỏi về hàm kiểm tra lỗi trong VBA

Liên hệ QC

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,300
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Trong VBA mình có một công thức tìm kiếm như sau :
Ws.vlookup(...) hay Ws.match(...). Giả sử các hàm trên trả về lỗi #N/A.
Mình đã thử sử dụng hàm isnull hay iserror để kiểm tra lỗi (trả về true or false) nhưng không được.
Các bạn chỉ giúp mình các cách để thực hiện được yêu cầu trên nha.
Mình cảm ơn.
 
Cái ni chỉ là phỏng chừng thôi, chưa thử

PHP:
Dim WFunc As WorkhsheetFunction
 
 If WFunc.Type(WFunc.VLOOKUP(Rng1, Rng2, 3, False))=16 then
       HDanh = 0
 Else
       HDanh= WFunc.VLOOKUP(Rng1, Rng2, 3, False)
 End If
Bạn thử xem sao?!)(&&@@@$@!^%)(&&@@
 
Upvote 0
Trong VBA mình có một công thức tìm kiếm như sau :
Ws.vlookup(...) hay Ws.match(...). Giả sử các hàm trên trả về lỗi #N/A.
Mình đã thử sử dụng hàm isnull hay iserror để kiểm tra lỗi (trả về true or false) nhưng không được.
Các bạn chỉ giúp mình các cách để thực hiện được yêu cầu trên nha.
Mình cảm ơn.
Làm được chứ... bạn xem tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=111
Có cả đóng các hàm kiểm tra lổi đấy (If Not IsError(....) )
 
Upvote 0
Upvote 0
Upvote 0
Bạn có thể làm 1 VD không
Em không thể nào làm được cái này : if not iserror(Ws.match(dieukien,dulieu,0)) then

Đại khái như thế này: Hàm trong Worksheet không giống như hàm trong VBA, vì error đối với hàm trong Worksheet thì VBA sẽ debug và thông báo lỗi cú pháp hàm - Lỗi 1004 - Unable to get the Match properties of the worksheetFunction class (không biết phải diễn giải sao cho rõ nữa, có thể ca_dafi không rành lắm). Tuy nhiên, chúng ta có thể bẫy lỗi bằng một vài cách sau:

1. Dùng On Error Resume Next

2. Dùng On Error Goto Label. Đại khái như sau:
PHP:
Sub TestErrWithWSFunc()
Dim MyRng As Range, MyFinder As String, Ketqua
Set MyRng = Sheets("DATA").[A2:A20]
MyFinder = InputBox("Nhap du lieu can tim vao day", "Thong Bao")
''//-------------------------------------------------------------------
On Error GoTo Ca_dafi:
Ketqua = Application.WorksheetFunction.Match(MyFinder, MyRng, 0)
MsgBox Ketqua
 ''//-------------------------------------------------------------------
Exit_cadafi:
Exit Sub

Ca_dafi:
MsgBox Err.Number & Chr(13) & Err.Description
Resume Exit_cadafi
End Sub
Bạn xem thêm file đính kèm nhé!
 

File đính kèm

  • Book1.xls
    25.5 KB · Đọc: 57
Lần chỉnh sửa cuối:
Upvote 0
Thử đoạn code này xem, cũng khá đơn giãn:
PHP:
Sub Test()
  Dim Rng As Range, Tim As Variant, KQ As Variant
  Set Rng = [A1].CurrentRegion
  Tim = 1 * InputBox("Nhap so can tim")
  On Error Resume Next
  Err.Clear
  KQ = WorksheetFunction.VLookup(Tim, Rng, 2, 0)
  If Err.Number = 0 Then
    MsgBox "Ket qua can tim la " & KQ
  Else
    MsgBox "Khong co gia tri nao ton tai"
  End If
End Sub
 

File đính kèm

  • Bayloi_01.xls
    19.5 KB · Đọc: 51
Upvote 0
Đại khái như thế này: Hàm trong Worksheet không giống như hàm trong VBA, vì error đối với hàm trong Worksheet thì VBA sẽ debug và thông báo lỗi cú pháp hàm - Lỗi 1004 - Unable to get the Match properties of the worksheetFunction class (không biết phải diễn giải sao cho rõ nữa, có thể ca_dafi không rành lắm). Tuy nhiên, chúng ta có thể bẫy lỗi bằng một vài cách sau:

1. Dùng On Error Resume Next

2. Dùng On Error Goto Label. Đại khái như sau:
PHP:
Sub TestErrWithWSFunc()
Dim MyRng As Range, MyFinder As String, Ketqua
Set MyRng = Sheets("DATA").[A2:A20]
MyFinder = InputBox("Nhap du lieu can tim vao day", "Thong Bao")
''//-------------------------------------------------------------------
On Error GoTo Ca_dafi:
Ketqua = Application.WorksheetFunction.Match(MyFinder, MyRng, 0)
MsgBox Ketqua
 ''//-------------------------------------------------------------------
Exit_cadafi:
Exit Sub

Ca_dafi:
MsgBox Err.Number & Chr(13) & Err.Description
Resume Exit_cadafi
End Sub
Bạn xem thêm file đính kèm nhé!

Cho tớ chen ngang với :

3. Tạo 1 hàm (UDF) cho riêng mình : Khi gọi nó ra sẽ không bị lỗi

4. Dùng Err (post xong mới thấy bác Ndu nói rồi. híc)

5. ................

Thân!
 
Upvote 0
Cảm ơn các anh nhiều!
Cái mình cần tìm ở topic này chính là Err object
Mình mãi tìm cái iserr mà không để ý đến cái Err Object. Quả là rất hay.
Như vậy mấy cái hàm Ws.iserr, isna, iserror... dùng trong trường hợp nào vậy các bạn.
 
Upvote 0
Cảm ơn các anh nhiều!
Cái mình cần tìm ở topic này chính là Err object
Mình mãi tìm cái iserr mà không để ý đến cái Err Object. Quả là rất hay.
Như vậy mấy cái hàm Ws.iserr, isna, iserror... dùng trong trường hợp nào vậy các bạn.

Dùng cho công thức,
còn trong lập trình thì ta phải tự bẫy lỗi,

tuy nhiên nếu thích có thể sử dụng thông qua gán giá trị cho 1 ô (có thẻ ô tạm hoặc chính ô đang tính) // hoặc name, kiểm tra giá trị của ô / name đó là dùng được - nhưng .... thê có vẻ củ chuối -- nhưng đôi khi có ích -- đặc biệt khi xác định lỗi tại ô nào giá trị nào
 
Upvote 0
Dùng cho công thức,
còn trong lập trình thì ta phải tự bẫy lỗi,

tuy nhiên nếu thích có thể sử dụng thông qua gán giá trị cho 1 ô (có thẻ ô tạm hoặc chính ô đang tính) // hoặc name, kiểm tra giá trị của ô / name đó là dùng được - nhưng .... thê có vẻ củ chuối -- nhưng đôi khi có ích -- đặc biệt khi xác định lỗi tại ô nào giá trị nào
Nếu không thích gán vào cell thì gán vào name vậy! Gọn gàng hơn!
 
Upvote 0
Thông thường khi ta dùng công thức trong Excel thì có thể dùng các hàm bẩy lổi như ISNA, ISERROR vân vân... nhưng với VBA có khó khăn hơn!
Tôi đang nghĩ tại sao bạn không lồng COUNTIF vào làm điều kiện bẩy lổi, như vậy có phải là nhanh gọn hơn không? (ngắn nữa là khác)
Ví dụ:
PHP:
Sub Test()
  Dim Rng As Range, Tim As Variant, WF As WorksheetFunction
  Set WF = Application.WorksheetFunction
  Set Rng = [A1].CurrentRegion
  Tim = Val(InputBox("Nhap so can tim vao day"))
  If WF.CountIf(Rng.Resize(, 1), Tim) Then
    MsgBox "Gia tri can tim la " & WF.VLookup(Tim, Rng, 2, 0)
  Else
    MsgBox "Khong co gia tri nao ton tai"
  End If
End Sub
 

File đính kèm

  • Bayloi_02.xls
    19.5 KB · Đọc: 32
Upvote 0
Các cụ cao nhân giúp e khoản này với ạ
e có một code mà sao cứ bị lỗi hoài, các cụ xem file rồi chỉ giáo e với ạ
Khi e nhấn chọn mã hàng trong combobox mã hàng thì thông tin hàng đó sẽ được liệt kê lên các box liên quan, nhưng khi ấn chọn nút ghi phiếu thì nó lại xuất hiện lỗi,
mong các cụ chỉ giao
 

File đính kèm

  • 33e784d41645eb1bb254.png
    33e784d41645eb1bb254.png
    260 KB · Đọc: 7
  • 7091921e038ffed1a79e.png
    7091921e038ffed1a79e.png
    240.7 KB · Đọc: 7
  • c1fccaf75b66a638ff77.png
    c1fccaf75b66a638ff77.png
    26.5 KB · Đọc: 6
Upvote 0
Các cụ cao nhân giúp e khoản này với ạ
e có một code mà sao cứ bị lỗi hoài, các cụ xem file rồi chỉ giáo e với ạ
Khi e nhấn chọn mã hàng trong combobox mã hàng thì thông tin hàng đó sẽ được liệt kê lên các box liên quan, nhưng khi ấn chọn nút ghi phiếu thì nó lại xuất hiện lỗi,
mong các cụ chỉ giao
Đừng xài WorksheetFunction, mà xài trực tiếp Application, ví dụ
Mã:
Public Sub test()
Dim Vi_tri As Variant
Vi_tri = Application.Match(1, 3, 0)' change here
If VBA.TypeName(Vi_tri) = "Error" Then Exit Sub
'next
End Sub
 
Upvote 0
Nếu không thích gán vào cell thì gán vào name vậy! Gọn gàng hơn!
Thầy xem giúp e bài này với ạ!
khi e nhấn chọn mã hàng và điền đủ thông tin vào và nhấn "ghi phiếu" thì bị báo lỗi "Unable to get Match property of the WorksheetFunction class"
Thầy xem giúp e với ạ
Bài đã được tự động gộp:

Đừng xài WorksheetFunction, mà xài trực tiếp Application, ví dụ
Mã:
Public Sub test()
Dim Vi_tri As Variant
Vi_tri = Application.Match(1, 3, 0)' change here
If VBA.TypeName(Vi_tri) = "Error" Then Exit Sub
'next
End Sub
Để e thử xem sao ạ, em cảm ơn cụ ạ
 

File đính kèm

  • 33e784d41645eb1bb254.png
    33e784d41645eb1bb254.png
    260 KB · Đọc: 4
  • 7091921e038ffed1a79e.png
    7091921e038ffed1a79e.png
    240.7 KB · Đọc: 3
  • c1fccaf75b66a638ff77.png
    c1fccaf75b66a638ff77.png
    26.5 KB · Đọc: 3
  • Hoc VBA.xlsm
    97.8 KB · Đọc: 3
Upvote 0
Trong VBA mình có một công thức tìm kiếm như sau :
Ws.vlookup(...) hay Ws.match(...). Giả sử các hàm trên trả về lỗi #N/A.
Mình đã thử sử dụng hàm isnull hay iserror để kiểm tra lỗi (trả về true or false) nhưng không được.
Các bạn chỉ giúp mình các cách để thực hiện được yêu cầu trên nha.
Mình cảm ơn.
Sub quadongian()
Range("b1") = Application.IfError(Application.VLookup("xxx", Range("a1:a100"), 2, 0), False)
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom