簡體   English   中英

VBA:函數返回#VALUE

[英]VBA: function returns #VALUE

我有一個潛水艇,可以通過某種型號為期權定價。 然后,我想構建一個函數,以相同的方式執行完全相同的操作,但出現錯誤。 一些輸入可以是向量,因此我嘗試了帶括號或不帶括號的代碼。 我還用“應用程序”切換了“ Worksheet.function”,但沒有一個起作用。

Public Function TaylorPrice1(S0 As Double, sigma As Double, wgt As Double, rho As Double, T As Double, Kappa As Double, r As Double, num As Double) As Double

Dim ModS() As Double
Dim Z As Double
Dim i, j, L, k As Double
Dim Sum1, Sum2, Sum3, Sum4, Sum5 As Double
Dim U1, U2, U20, U2st, U2nd, U2rd, mz, vz As Double
Dim a1, a2, a3, B1, B2, c1, c2, c3, c4, d1, d2, d3, d4, z1, z2, z3, y, y1, y2 As Double
Dim py, pyst, pynd, Ny1, Ny2 As Double
Dim Modrho() As Double

'ReDim S0(num), sigma(num), wgt(num), rho(num, num) As Double
ReDim ModS(num) As Double
ReDim Modrho(num, num) As Double
Z = 1

        Sum1 = 0
        Sum2 = 0
        Sum3 = 0
        Sum4 = 0
        Sum5 = 0
        U1 = 0
        U2 = 0
        U20 = 0
        U2st = 0
        U2nd = 0
        U2rd = 0

        For i = 0 To num - 1
            ModS(i) = wgt(i) * S0(i) * Exp(r * T)
            U1 = U1 + ModS(i)
        Next i

        For i = 0 To num - 1
            For j = 0 To num - 1
                Modrho(i, j) = rho(i, j) * sigma(i) * sigma(j) * T
                U2 = U2 + ModS(i) * ModS(j) * Exp((Z ^ 2) * Modrho(i, j))
            Next j
        Next i

        mz = 2 * Log(U1) - 0.5 * Log(U2)
        vz = Log(U2) - 2 * Log(U1)

        For i = 0 To num - 1
            For j = 0 To num - 1
                U20 = U20 + ModS(i) * ModS(j)
                U2st = U2st + ModS(i) * ModS(j) * Modrho(i, j)
                U2nd = U2nd + ModS(i) * ModS(j) * Modrho(i, j) ^ 2
                U2rd = U2rd + ModS(i) * ModS(j) * Modrho(i, j) ^ 3
            Next j
        Next i

        a1 = -(U2st * Z ^ 2) / (2 * U20)
        a2 = 2 * a1 ^ 2 - ((U2nd * Z ^ 4) / (2 * U20))
        a3 = 6 * a1 * a2 - 4 * a1 ^ 3 - ((U2rd * Z ^ 6) / (2 * U20))

        For k = 0 To num - 1
            For j = 0 To num - 1
                For i = 0 To num - 1
                    Sum1 = Sum1 + 2 * (ModS(i) * ModS(j) * ModS(k) * Modrho(i, k) * Modrho(j, k))
                Next i
            Next j
        Next k

        B1 = (Z ^ 4) / (4 * U1 ^ 3) * Sum1
        B2 = a1 ^ 2 - 0.5 * a2

        For L = 0 To num - 1
            For k = 0 To num - 1
                For j = 0 To num - 1
                    For i = 0 To num - 1
                        Sum2 = Sum2 + 8 * (ModS(i) * ModS(j) * ModS(k) * ModS(L) * Modrho(i, L) * Modrho(j, k) * Modrho(k, L))
                    Next i
                Next j
            Next k
        Next L
        Sum2 = Sum2 + 2 * U2st * U2nd
        For L = 0 To num - 1
            For k = 0 To num - 1
                For j = 0 To num - 1
                    For i = 0 To num - 1
                        Sum3 = Sum3 + 6 * (ModS(i) * ModS(j) * ModS(k) * ModS(L) * Modrho(i, L) * Modrho(j, L) * Modrho(k, L))
                    Next i
                Next j
            Next k
        Next L
        For k = 0 To num - 1
            For j = 0 To num - 1
                For i = 0 To num - 1
                    Sum4 = Sum4 + 6 * (ModS(i) * ModS(j) * ModS(k) * Modrho(i, k) * (Modrho(j, k) ^ 2))
                Next i
            Next j
        Next k

        For k = 0 To num - 1
            For j = 0 To num - 1
                For i = 0 To num - 1
                    Sum5 = Sum5 + 8 * (ModS(i) * ModS(j) * ModS(k) * Modrho(i, j) * Modrho(i, k) * Modrho(j, k))
               Next i
            Next j
        Next k

        c1 = -1 * a1 * B1
        c2 = (Z ^ 6 / (144 * U1 ^ 4)) * (9 * Sum2 + 4 * Sum3)
        c3 = (Z ^ 6 / (48 * U1 ^ 3)) * (4 * Sum4 + Sum5)
        c4 = a1 * a2 - 2 / 3 * a1 ^ 3 - a3 / 6

        d1 = 0.5 * (6 * a1 ^ 2 + a2 - 4 * B1 + 2 * B2) - 1 / 6 * (120 * a1 ^ 3 - a3 + 6 * (24 * c1 - 6 * c2 + 2 * c3 - c4))
        d2 = 0.5 * (10 * a1 ^ 2 + a2 - 6 * B1 + 2 * B2) - (128 * (a1 ^ 3) / 3 - a3 / 6 + 2 * a1 * B1 - a1 * B2 + 50 * c1 - 11 * c2 + 3 * c3 - c4)
        d3 = (2 * a1 ^ 2 - B1) - 1 / 3 * (88 * a1 ^ 3 + 3 * a1 * (5 * B1 - 2 * B2) + 3 * (35 * c1 - 6 * c2 + c3))
        d4 = (-20 * (a1 ^ 3) / 3 + a1 * (-4 * B1 + B2) - 10 * c1 + c2)

        z1 = d2 - d3 + d4
        z2 = d3 - d4
        z3 = d4
        y = Log(Kappa)
        y1 = (mz - y) / (Sqr(vz)) + Sqr(vz)
        y2 = y1 - Sqr(vz)
        Ny1 = Application.Norm_S_Dist(y1, True)
        Ny2 = Application.Norm_S_Dist(y2, True)
        py = (1 / (Sqr(2 * Application.Pi() * vz))) * Exp((-((y - mz) ^ 2) / (2 * vz)))
        pyst = py * 1 / (-vz) * (y - mz)
        pynd = mz / vz * pyst + py * (1 / (-vz)) * (1 + y * (-1 / vz) * (y - mz))
        TaylorPrice1 = (U1 * Exp(-r * T) * Ny1 - Kappa * Exp(-r * T) * Ny2) + (Exp(-r * T) * Kappa * (z1 * py + z2 * pyst + z3 * pynd))

End Function

您正在嘗試將一些函數參數用作數組,但沒有這樣初始化它們

例如

ModS(i) = wgt(i) * S0(i) * Exp(r * T)

你有wgtSO作為

Public Function TaylorPrice1(S0 As Double, sigma As Double, wgt As Double, rho As Double, T As Double, Kappa As Double, r As Double, num As Double) As Double

在您的函數參數中。 同樣適用於

Modrho(i, j) = rho(i, j) * sigma(i) * sigma(j) * T

您可以從可能是數組的所有函數參數中刪除As Double ,並刪除當前注釋的Redim...行,因為取消注釋會立即覆蓋參數值。

謝謝大家的幫助。 我發現了問題。 該函數的輸入實際上是Excel電子表格的單元格范圍。 但是VBA不能將它們識別為數組,因此我不得不轉換數組中的范圍(代碼中的rho)。 由於我也有一個多維數組,因此我發現范圍變量將范圍的值按原始格式存儲為一維行。 例如,我有一個14x14的矩陣,則范圍的第17個值對應於矩陣的第二行,第三列。 我希望這些信息對某人有用。 這就是我解決主要問題的方式

Dim i As Double
Dim j As Double
Dim L As Double
Dim k As Double
Dim S0() As Double
Dim sigma() As Double
Dim wgt() As Double
Dim rho() As Double
Dim Modrho() As Double
Dim ModS() As Double
' transofrmo range nei vettori
Dim cell As Range
Dim num1 As Long, num2 As Long
Dim rhodritto() As Double
num1 = 0
For Each cell In S0Input
      num1 = num1 + 1
Next cell
ReDim S0(num1) As Double
ReDim sigma(num1) As Double
ReDim wgt(num1) As Double
ReDim rho(num1, num1) As Double
ReDim Modrho(num1, num1) As Double
ReDim ModS(num1) As Double


i = 1
For Each cell In S0Input
    S0(i) = cell.Value
    i = i + 1
Next cell
i = 1
For Each cell In sigmaInput
    sigma(i) = cell.Value
    i = i + 1
Next cell
i = 1
For Each cell In wgtInput
    wgt(i) = cell.Value
    i = i + 1
Next cell
num2 = 0
For Each cell In rhoInput
   num2 = num2 + 1
Next cell
ReDim rhodritto(num2)
i = 1
For Each cell In rhoInput
    rhodritto(i) = cell.Value
    i = i + 1
Next cell
k = 1
For i = 1 To num1
    For j = 1 To num1
        rho(i, j) = rhodritto(k)
        k = k + 1
    Next j
Next i

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM