当前位置:编程学习 > VB >>

请教VB高手,XIRR()

各位前辈,我现在需要一函数,功能和EXCEL中的XIRR()函数一样,请问VB语言怎么写,最好能给我份写好的功能代码,本人的技术很差的。我用的平台是VB6.0,
答案:'第一次听说xirr函数,看了一下这个函数的描述给你用递归来计算,其中用了一些方法可以高速接近目标,最高精度可以达到10^-11
'未作错误判断,你可以在调用函数前作一下判断
'函数描述: http://office.microsoft.com/zh-tw/excel-help/HP010343042.aspx
Option Explicit
Const N = 5 '假设5组数字
Dim precision As Double, myvalue As Double
Sub Command1_Click()
    Dim cells(), t1, t2, i As Integer
    ReDim cells(N, 2)
    precision = 0.1 '精度设定
    If precision < 10 ^ -12 Then Exit Sub '超精度退出
    t1 = Split("-10000,2750,4250,3250,2750", ",") '数目必须大于等于N,有效的数字
    t2 = Split("2008-1-1,2008-3-1,2008-10-30,2009-2-15,2009-4-1", ",") '数目必须大于等于N,有效的日期型
    For i = 0 To N - 1
        cells(i, 0) = t1(i): cells(i, 1) = t2(i)
    Next
    xirr cells, 0, 1, 0.1 '二维数组模拟excel的单元格,这里只要给cells赋值其它的不用管
    MsgBox myvalue '得到的结果,可以用format函数来处理一下
End Sub
Function xirr(arr, a, b, c)
    Dim o As Double, i As Double, j As Integer, flag As Integer, aa As Double, tt
        For i = a To b Step c
            For j = 0 To UBound(arr)
                o = o + arr(j, 0) / (1 + i) ^ (Val(CDate(arr(j, 1)) - CDate(arr(0, 1))) / 365)
                If i = a Then tt = o
            Next
            If Abs(o) < precision Then
                myvalue = i
                Exit Function
            End If
            If tt * o < 0 Then
                xirr arr, aa, i, c / 10 '递归调用,每次范围、步进都缩小一个数量级,每提高一级精度只调用一次函数
            End If
            aa = i: tt = o
            DoEvents
            o = 0
        Next
End Function

上一个:一份VB作业
下一个:关于vb的问题

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,