UDF tính tổng này sai ở đâu? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Em lò mò làm cái UDF tính tổng theo điều kiện
1. Với điều kiện là USD (hoặc bỏ trống): chạy ok
2. Với điều kiện nhập VND : công thức chạy sai??? (ko chạy)

PHP:
Function CheckAmt(Bill As Range, RngImp As Range, RngExp As Range, Optional Cur As String = "USD") As Long
Application.Volatile (True) 
Dim Cll As Range, check1 As Long, check2 As Long
For Each Cll In RngImp
    If Cll = Bill And Cll.Offset(, 1) = Bill.Offset(, 1) And Cll.Offset(, 1) = Cur Then
        check1 = check1 + Cll.Offset(, 2)
    End If
Next


For Each Cll In RngExp
    If Cll = Bill And Cll.Offset(, 1) = Bill.Offset(, 1) And Cll.Offset(, 1) = Cur Then
        check2 = check2 + Cll.Offset(, 2)
    End If
Next
CheckAmt = check1 + check2

Application.Volatile (False)
End Function

Em gửi file test như đính kèm
 

File đính kèm

Em lò mò làm cái UDF tính tổng theo điều kiện
1. Với điều kiện là USD (hoặc bỏ trống): chạy ok
2. Với điều kiện nhập VND : công thức chạy sai??? (ko chạy)

PHP:
Function CheckAmt(Bill As Range, RngImp As Range, RngExp As Range, Optional Cur As String = "USD") As Long
Application.Volatile (True) 
Dim Cll As Range, check1 As Long, check2 As Long
For Each Cll In RngImp
    If Cll = Bill And Cll.Offset(, 1) = Bill.Offset(, 1) And Cll.Offset(, 1) = Cur Then
        check1 = check1 + Cll.Offset(, 2)
    End If
Next


For Each Cll In RngExp
    If Cll = Bill And Cll.Offset(, 1) = Bill.Offset(, 1) And Cll.Offset(, 1) = Cur Then
        check2 = check2 + Cll.Offset(, 2)
    End If
Next
CheckAmt = check1 + check2

Application.Volatile (False)
End Function

Em gửi file test như đính kèm
Hình như chỗ này
Function CheckAmt(Bill As Range, RngImp As Range, RngExp As Range, Optional Cur As String = "USD") As Long
Sửa thành
Function CheckAmt(Bill As Range, RngImp As Range, RngExp As Range, Optional Cur As String ) As Long
Mới ngó sơ thôi, bạn thử xem
Thân
 
Upvote 0
Em cám ơn
Em làm được rồi,
Em sửa lại như này
PHP:
Function CheckAmt(Bill As Range, RngImp As Range, RngExp As Range, Optional Cur As String = "USD") As Long
Application.Volatile (True) ' If true, Formular will be caculate automatically, other not
Dim Cll As Range, check1 As Long, check2 As Long
For Each Cll In RngImp
    If Cll = Bill And Cll.Offset(, 1) = Cur Then
        check1 = check1 + Cll.Offset(, 2)
    End If
Next


For Each Cll In RngExp
    If Cll = Bill And Cll.Offset(, 1) = Cur Then
        check2 = check2 + Cll.Offset(, 2)
    End If
Next
CheckAmt = check1 + check2

End Function
 
Upvote 0
tôi thử code này với dữ liệu hơn 10.000 dòng, chạy khá chậm. Có cách nào chuyển sang mảng cho nhanh hơn không?

PHP:
Function CheckAmt(Bill As Range, RngImp As Range Optional Cur As String = "USD") As Long
Application.Volatile (True)  If true, Formular will be caculate automatically, other not
Dim Cll As Range, check1 As Long, check2 As Long
For Each Cll In RngImp
    If Cll = Bill And Cll.Offset(, 1) = Cur Then
        check1 = check1 + Cll.Offset(, 2)
    End If
Next

CheckAmt = check1 

End Function
 
Upvote 0
Web KT

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

Back
Top Bottom