Rút gọn code vba

Liên hệ QC

Trần_Minh_5695

Thành viên mới
Tham gia
27/9/21
Bài viết
32
Được thích
2
Mọi người cho e hỏi, e đang xài hàm excel trên vba, nhưng mỗi lần xài hàm thì phải có cụm "Application.WorksheetFunction."
Có cách nào để mình rút gọn code lại được ko ạ?
Mong mn giúp đỡ!
VD: txt_stock.Value = Application.WorksheetFunction.Index(Sheet25.Range("G:G"), Application.WorksheetFunction.Match(txt_part, Sheet25.Range("C:C"), 0))
 
Upvote 0
VD: txt_stock.Value = Application.Index (Sheet25.Range ("G: G"), Application.Match (txt_part, Sheet25.Range ("C: C"), 0))

.
e có thử cách:
Dim fn As WorksheetFunction
Set fn = Application.WorksheetFunction
txt_stock.Value = fn.IfError(fn.Index(Sheet25.Range("G:G"), fn.Match(txt_part, Sheet25.Range("C:C"), 0)), "NotFound")

thì chạy được hàm, nhưg khi bị lỗi giá trị không tìm thấy thì nó nhảy debug chứ ko chạy hàm ifError


1653309747331.png
 

File đính kèm

  • Material_Controll.xlsm
    167 KB · Đọc: 4
Upvote 0
Mọi người cho e hỏi, e đang xài hàm excel trên vba, nhưng mỗi lần xài hàm thì phải có cụm "Application.WorksheetFunction."
Có thể set kiểu này thử xem
Diff:
Dim WF As Object
Set WF = Application.WorksheetFunction
Rồi muốn dùng cái để gọi hàm nào lên thì chỉ cần:
Mã:
WF.hàm.....
 
Upvote 0
Dùng Application.WorksheetFunction.Match, nếu tìm không thấy code sẽ báo lỗi.

Dùng Application.Match, nếu tìm không thấy code sẽ trả về giống trên sheet.

.
 
Upvote 0
Có thể set kiểu này thử xem
Diff:
Dim WF As Object
Set WF = Application.WorksheetFunction
Rồi muốn dùng cái để gọi hàm nào lên thì chỉ cần:
Mã:
WF.hàm.....
cảm ơn bạn :D
để mình thử, hqa h bận nên h mới đọc được
Bài đã được tự động gộp:

Có nhiều cách cho bạn:
h mới biết có cách này
Mình test OK r nha
cảm ơn bạn nhiều :3
Bài đã được tự động gộp:

Có thể set kiểu này thử xem
Diff:
Dim WF As Object
Set WF = Application.WorksheetFunction
Rồi muốn dùng cái để gọi hàm nào lên thì chỉ cần:
Mã:
WF.hàm.....
Mình có thử cách Dim as Object nhưg vẫn báo lỗi :D
1653376396731.png1653376411918.png
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có thử cách Dim as Object nhưg vẫn báo lỗi :D
View attachment 276388View attachment 276389
Vấn đề không nằm ở chỗ khai báo Dim fn As WorksheetFunction hay Dim fn As Object

Vấn đề nằm ở chỗ sự khác biệt giữa Application.WorksheetFunction.<hàm nào đó> và Application.<hàm nào đó>

wf.png

Vì thế khi dùng Application.<hàm nào đó> thì không cần bẫy lỗi kiểu On Error Resume Next, nhưng phải kiểm tra <giá trị mà hàm trả về>. Nếu IsError(<giá trị mà hàm trả về>) thì khi gọi hàm đã có lỗi, ngược lại thì <giá trị mà hàm trả về> là kết quả gọi hàm.

Còn khi dùng Application.WorksheetFunction.<hàm nào đó> thì phải bẫy lỗi kiểu On Error Resume Next. Ngay sau khi gọi hàm thì phải kiểm tra trạng thái của đối tượng ERR. Nếu Err.Number (Err.Number <> 0) thì có nghĩa là khi gọi hàm đã có lỗi, ngược lại thì <giá trị mà hàm trả về> là kết quả gọi hàm.

Vì thế cách dùng phải như sau.
Mã:
Private Sub txt_scan_AfterUpdate()
Dim fn As Object, result
    Set fn = Application.WorksheetFunction
    txt_partValue = Left(txt_scan.Value, 11)
    On Error Resume Next
    result = fn.Index(Sheet25.Range("G:G"), fn.Match(txt_partValue, Sheet25.Range("C:C"), 0))
    txt_stockValue = IIf(Err.Number, "NotFound", result)    ' neu truoc do co loi thi ket qua la "NotFound", con neu khong co loi thi ket qua la result
    Err.Clear
    result = fn.Index(Sheet25.Range("H:H"), fn.Match(txt_partValue, Sheet25.Range("C:C"), 0))
    txt_locValue = IIf(Err.Number, "NotFound", result)  ' neu truoc do co loi thi ket qua la "NotFound", con neu khong co loi thi ket qua la result
End Sub
 
Upvote 0
Rút gọn chữ thôi :D
PHP:
Set WF = Application.WorksheetFunction
Range("A3") = WF.Sum(Range("A1:A2"))
 
Upvote 0
Vấn đề không nằm ở chỗ khai báo Dim fn As WorksheetFunction hay Dim fn As Object

Vấn đề nằm ở chỗ sự khác biệt giữa Application.WorksheetFunction.<hàm nào đó> và Application.<hàm nào đó>

View attachment 276406

Vì thế khi dùng Application.<hàm nào đó> thì không cần bẫy lỗi kiểu On Error Resume Next, nhưng phải kiểm tra <giá trị mà hàm trả về>. Nếu IsError(<giá trị mà hàm trả về>) thì khi gọi hàm đã có lỗi, ngược lại thì <giá trị mà hàm trả về> là kết quả gọi hàm.

Còn khi dùng Application.WorksheetFunction.<hàm nào đó> thì phải bẫy lỗi kiểu On Error Resume Next. Ngay sau khi gọi hàm thì phải kiểm tra trạng thái của đối tượng ERR. Nếu Err.Number (Err.Number <> 0) thì có nghĩa là khi gọi hàm đã có lỗi, ngược lại thì <giá trị mà hàm trả về> là kết quả gọi hàm.

Vì thế cách dùng phải như sau.
Mã:
Private Sub txt_scan_AfterUpdate()
Dim fn As Object, result
    Set fn = Application.WorksheetFunction
    txt_partValue = Left(txt_scan.Value, 11)
    On Error Resume Next
    result = fn.Index(Sheet25.Range("G:G"), fn.Match(txt_partValue, Sheet25.Range("C:C"), 0))
    txt_stockValue = IIf(Err.Number, "NotFound", result)    ' neu truoc do co loi thi ket qua la "NotFound", con neu khong co loi thi ket qua la result
    Err.Clear
    result = fn.Index(Sheet25.Range("H:H"), fn.Match(txt_partValue, Sheet25.Range("C:C"), 0))
    txt_locValue = IIf(Err.Number, "NotFound", result)  ' neu truoc do co loi thi ket qua la "NotFound", con neu khong co loi thi ket qua la result
End Sub
ko ngờ nó cần nhiều code đến thế @@
Cảm ơn bạn nhiều nha
 
Upvote 0
Bác dùng With Application.WorksheetFunction đi. Để trong cụm With...End With thì chỉ cần viết .<tên hàm> không cần viết cụm "Application.WorksheetFunction" phía trước nữa
 
Upvote 0
Web KT
Back
Top Bottom