Rút gọn code vba

MyExcel Liên hệ QC

Trần_Minh_5695

Thành viên mới
Tham gia
27/9/21
Bài viết
21
Đượ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))
 

Phuocam

Thành viên mới
Tham gia
16/5/13
Bài viết
3,986
Được thích
5,918
Donate (Momo)
Donate
Upvote 0

Trần_Minh_5695

Thành viên mới
Tham gia
27/9/21
Bài viết
21
Được thích
2
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

BuiQuangThuan

❆❆❆❆❆❆❆❆❆❆❆❆
Tham gia
17/12/10
Bài viết
1,572
Được thích
1,483
Giới tính
Nam
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

Phuocam

Thành viên mới
Tham gia
16/5/13
Bài viết
3,986
Được thích
5,918
Donate (Momo)
Donate
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

Trần_Minh_5695

Thành viên mới
Tham gia
27/9/21
Bài viết
21
Được thích
2
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

batman1

Thành viên gạo cội
Tham gia
8/9/14
Bài viết
5,605
Được thích
9,344
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

huhumalu

Thành viên thường trực
Tham gia
20/10/09
Bài viết
312
Được thích
208
Rút gọn chữ thôi :D
PHP:
Set WF = Application.WorksheetFunction
Range("A3") = WF.Sum(Range("A1:A2"))
 
Upvote 0

Trần_Minh_5695

Thành viên mới
Tham gia
27/9/21
Bài viết
21
Được thích
2
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

namvu230397

Thành viên mới
Tham gia
12/10/21
Bài viết
47
Được thích
17
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

Group

DIỄN ĐÀN GIẢI PHÁP EXCEL
Top Bottom