模拟在10k周期内运行良好,但在100k周期内得到误差13(类型不匹配)

时间:2012-02-12 08:58:57

标签: excel vba excel-vba

首先,这是我的代码:

Sub SimulatePortfolio()
    Dim lambda As Double
    Dim num As Integer
    Dim cycles As Long
    Column = 12
    q = 1.5
    lambda = 0.05
    cycles = 100000
    Dim data(1 To 100000, 1 To 10) As Integer
    Dim values(1 To 10) As Double
    For i = 1 To 10
        values(i) = 0
    Next i
    temp = lambda
    For i = 1 To cycles
        lambda = temp
        num = 10
        t = 0
        Dim temps(1 To 10) As Integer
        For k = 1 To 10
            temps(k) = 1000
        Next k
        Do While (t < 10 And num > 0)
            t = t + tsim(lambda, num)
            For j = 1 To 10
                If (j > t) Then
                    temps(j) = temps(j) - 50
                End If
            Next j
            num = num - 1
            If (num <= 0) Then
                Exit Do
            End If
            lambda = lambda * q
        Loop
        For l = 1 To 10
            values(l) = values(l) + temps(l)
            data(i, l) = temps(l)
        Next l
    Next i
    For i = 1 To 10
        Cells(i + 1, Column) = values(i) / cycles
        'Problem occurs on this line:
        Cells(i + 1, Column + 1).Value = Application.WorksheetFunction.Var(Application.WorksheetFunction.Index(data, i, 0))
    Next i
End Sub

Function tsim(lambda As Double, num As Integer) As Double
    Dim v As Double
    Dim min As Double
    Randomize
    min = (-1 / lambda) * Log(Rnd)
    For i = 1 To (num - 1)
        Randomize
        v = (-1 / lambda) * Log(Rnd)
        If (min > v) Then
            min = v
        End If
    Next i
    tsim = min
End Function

当我将循环的值设置为10000时,它运行正常,没有任何障碍。当我进入100000个周期时,它会在指定的代码行中出现错误13。

1 个答案:

答案 0 :(得分:6)

我已经意识到Application.Tranpose限制为65536行变量(抛出相同的错误)我使用Index测试了同样的问题

使用变体时, Application.WorksheetFunction.Index似乎也有65536行的限制 - 但标准范围很好

因此,您需要将data转储到范围并使用Index处理范围,或使用两个数组

Sub Test()
Dim Y
Dim Z
'works in xl07/10 
Debug.Print Application.WorksheetFunction.Index(Range("A1:A100000"), 1, 1)
Y = Range("A1:A65536")
`works
Debug.Print Application.WorksheetFunction.Index(Y, 1, 1)
'fails in xl07/10  
Z = Range("A1:A65537")
Debug.Print Application.WorksheetFunction.Index(Z, 1, 1)
End Sub