Sao nhúng hàm vào add-in vẫn không thực hiện?

Liên hệ QC

phuongc5

Thành viên hoạt động
Tham gia
26/10/07
Bài viết
146
Được thích
71
Nghề nghiệp
Kế toán
add-in sao nhung ham van ko thuc hien

Xin các huynh giúp 1 việc như sau:
Đệ có 1 code (nguồn lấy từ web 24h.com):
[FONT='.VnTime'][FONT='.VnTime'](http://www6.24h.com.vn/news.php/179/126291[/FONT]http://www6.24h.com.vn/news.php/179/126291)[/FONT]
Public Function OldOfDebt(mRange As Range, toDate As Date) As Double

Dim rDate As Range Cot ngay

Dim rDebit As Range Cot ghi no

Dim rCredit As Range Cot ghi co

Dim mPaid As Double Tong so da thu duoc

Dim mClose As Double So du cuoi tai ngay toDate

Dim mAccDebit As Double Debit cong don

Dim thisAmount As Double

Dim thisDate As Double

Dim mRow As Long Bien dem so dong

Dim i As Long

Dim ret As Double Gia tri tro ve

mRow = mRange.Rows.Count

Set rDate = mRange.Range(Cells(1, 1), Cells(mRow, 1))

Set rDebit = mRange.Range(Cells(1, 2), Cells(mRow, 2))

Set rCredit = mRange.Range(Cells(1, 3), Cells(mRow, 3))

mPaid = Application.WorksheetFunction.Sum(rCredit)

mClose = Application.WorksheetFunction.Sum(rDebit) - Application.WorksheetFunction.Sum(rCredit)

For i = 1 To mRow

If rDebit.Cells(i, 1).Value <> 0 Then

mAccDebit = mAccDebit + rDebit.Cells(i, 1).Value

If mAccDebit > mPaid Then

thisAmount = Application.WorksheetFunction.Min(mAccDebit - mPaid, rDebit.Cells(i, 1).Value)

thisDate = rDate.Cells(i, 1).Value

ret = ret + thisAmount * (toDate - thisDate) / mClose

End If

End If

Next i

OldOfDebt = ret

End Function

Public Function AvgBalance(mRange As Range, toDate As Date) As Double

Dim rDate As Range

Dim rAmount As Range

Dim mRow As Long

Dim mLenght As Long quang thoi gian tu ngay dau den toDate

Dim i As Long

Dim ret As Double

mRow = mRange.Rows.Count

Set rDate = mRange.Range(Cells(1, 1), Cells(mRow, 1))

Set rAmount = mRange.Range(Cells(1, 4), Cells(mRow, 4))

mLenght = toDate - rDate.Cells(1, 1)

For i = 1 To mRow

ret = ret + rAmount.Cells(i, 1) * (toDate - rDate.Cells(i, 1)) / mLenght

Next i

AvgBalance = ret

End Function


Đệ đã add-in nhưng khi thực hiện thì máy báo hàm lỗi. xin các huynh xem rồi chỉ giúp. Đệ có đường link tới web 24h.com mà đã viết code này.
 
Bạn thử lại code sau:
Mã:
Public Function OldOfDebt(mRange As Range, toDate As Date) As Double
Dim rDate As Range 'Cot ngay
Dim rDebit As Range 'Cot ghi no
Dim rCredit As Range 'Cot ghi co
Dim mPaid As Double 'Tong so da thu duoc
Dim mClose As Double 'So du cuoi tai ngay toDate
Dim mAccDebit As Double 'Debit cong don
Dim thisAmount As Double
Dim thisDate As Double
Dim mRow As Long 'Bien dem so dong
Dim i As Long
Dim ret As Double 'Gia tri tro ve
mRow = mRange.Rows.Count
Set rDate = mRange.Range(Cells(1, 1), Cells(mRow, 1))
Set rDebit = mRange.Range(Cells(1, 2), Cells(mRow, 2))
Set rCredit = mRange.Range(Cells(1, 3), Cells(mRow, 3))
mPaid = Application.WorksheetFunction.Sum(rCredit)
mClose = Application.WorksheetFunction.Sum(rDebit) - Application.WorksheetFunction.Sum(rCredit)
For i = 1 To mRow
    If rDebit.Cells(i, 1).Value <> 0 Then
        mAccDebit = mAccDebit + rDebit.Cells(i, 1).Value
        If mAccDebit > mPaid Then
            thisAmount = Application.WorksheetFunction.Min(mAccDebit - mPaid, rDebit.Cells(i, 1).Value)
            thisDate = rDate.Cells(i, 1).Value
            ret = ret + thisAmount * (toDate - thisDate) / mClose
        End If
    End If
Next i
OldOfDebt = ret
End Function
Public Function AvgBalance(mRange As Range, toDate As Date) As Double
Dim rDate As Range
Dim rAmount As Range
Dim mRow As Long
Dim mLenght As Long 'quang thoi gian tu ngay dau den toDate
Dim i As Long
Dim ret As Double
mRow = mRange.Rows.Count
Set rDate = mRange.Range(Cells(1, 1), Cells(mRow, 1))
Set rAmount = mRange.Range(Cells(1, 4), Cells(mRow, 4))
mLenght = toDate - rDate.Cells(1, 1)
For i = 1 To mRow
    ret = ret + rAmount.Cells(i, 1) * (toDate - rDate.Cells(i, 1)) / mLenght
Next i
AvgBalance = ret
End Function
Bạn sửa đoạn (Dim mLenght As Long quang thoi gian tu ngay dau den toDate) thành (Dim mLenght As Long 'quang thoi gian tu ngay dau den toDate)
 
Lần chỉnh sửa cuối:
hỏi tiếp nè!

minhlev ơi!
Code huynh cho đệ làm thì nó không báo lỗi nữa rồi, nhưng đệ lấy 1 ví dụ y như 24h.com mà sao kết quả không giống nhau vậy nhỉ?
[FONT=.VnTime]http://www6.24h.com.vn/news.php/179/126291[/FONT]
 
Lần chỉnh sửa cuối:
add-ins

Huynh ơi! Code này nó vẫn báo lỗi nè. Giúp đệ đi!
Public Function AvgBalance(mRange As Range, toDate As Date) As Double
Dim rDate
As Range
Dim rAmount
As Range
Dim mRow
As Long
Dim mLenght
As Long quang thoi gian tu ngay dau den toDate
Dim i
As Long
Dim ret
As Double
mRow
= mRange.Rows.Count
Set rDate
= mRange.Range(Cells(1, 1), Cells(mRow, 1))
Set rAmount = mRange.Range(Cells(1, 4), Cells(mRow, 4))
mLenght = toDate - rDate.Cells(1, 1)
For
i = 1 To mRow
ret
= ret + rAmount.Cells(i, 1) * (toDate - rDate.Cells(i, 1)) / mLenght
Next i
AvgBalance
= ret
End
Function

 
Vẫn lỗi cũ thôi bạn.
 
Tôi đã thử tính trong bảng tính Excel (dùng công thức) theo các bước tạo Add-in trên và thấy kết quả so với việc sử dụng hàm Add-in này là giống nhau. Tuy nhiên, kết quả đó lại không giống với kết quả trên trang web 24h.com theo địa chỉ bạn phuongc5 đã cung cấp tại bài 1 (mặc dù dữ liệu không hề thay đổi so với trang web 24h.com). Không biết là cách làm của tôi có sai sót chỗ nào không? Hay là kết quả trên trang web 24h.com chỉ mang tính minh hoạ thôi? Nhờ các cao thủ giải thích dùm. Tôi xin gửi kèm theo file đã tự tính toán.
 

File đính kèm

  • ThuAddintinhtuoino_24h.com.rar
    10.9 KB · Đọc: 52
Lần chỉnh sửa cuối:
Thank you!

Cám ơn huynh minhlev nhiều nhiều nha!

Đệ là người rất là tình cờ mới biết đến trang web giaiphapexcel.com và thông qua trang web này mới bắt đầu chập chững biết sơ đẳng về VBA, đệ ko biết viết code nên ko biết code đúng sai thế nào. Nhưng thấy huynh nhiệt tình với câu hỏi của đệ quá. Một lần nữa cám ơn huynh nhiều nhiều!
}}}}}
 
Tạo hàm

1. Function OldOfDebt(mRange As Range, toDate As Date) As Double

Hàm này trả về tuổi của khoản phải thu theo ngày, bằng cách giải đáp số dư còn phải thu tại ngày cuối cùng là các khoản phải thu của các ngày nào theo nguyên tắc khoản đã thu được sẽ là thanh toán cho khoản phải thu đến trước, sau đó tính ra số ngày theo trọng số của từng khoản đối với số dư.

Hàm có hai tham số, thứ nhất mRange chính là vùng tính toán, trong ví dụ là A2:D13; thứ hai toDate là ngày để xác định tuổi (toDate phải lớn hơn ngày cuối cùng phát sinh giao dịch với khách hàng), trong hình là C19. Theo ví dụ hàm tính tuổi của khoản phải thu có giá trị 191.000 là 146,36 ngày trả về tại ô E19.

2. Function AvgBalance(mRange As Range, toDate As Date) As Double

Hàm này có tham số y hệt hàm trên, trả về số dư còn phải thu trung bình của các khách hàng theo tỷ trọng về thời gian. Trong hình, hàm tính ra số dư bình quân trả về ô E21 là 106.791 với mRange là A2:D13 và toDate là 31/12/2005. (Bạn có thể tính được tổn thất do khách hàng này chiếm dụng bằng Hàm x lãi suất trong khoảng thời gian A2 đến A13).
Em đang thắc mắc hàm OldofDebt --> tính ra số ngày trung bình nợ
--> ret = ret + thisAmount * (toDate - thisDate) / mClose
trong đó:
Ret: số ngày trung bình nợ
thisamount: số tiền nợ
todate: ngày cuối cùng (lớn hơn ngày cuối cùng của giao dịch)
thisdate: ngày nợ

-----------
Em chưa hiểu minh logic như nào mà ra được công thức trên

Xin đại cao thủ chỉ giáo
 
Web KT
Back
Top Bottom