Пытаюсь отладить. Я думаю, что индексация массива является проблемой.

Public Function CFR(df(), x As Double, t As Integer) As Double
    Dim i, y As Integer
    Dim discount()
    Dim nom, denom As Double
    ReDim discount(t) As Double

    y = 1
    For i = UBound(df, 1) + 1 To t
        discount(i) = df(UBound(df, 1)) * (x ^ y)
        y = y + 1
    Next I

    nom = (1 - df(UBound(df)) * x ^ (t - UBound(df)))
    denom = Application.WorksheetFunction.Sum(df) + Application.WorksheetFunction.Sum(discount)
    CFR = nom / denim
End Function
0
Fintz 18 Апр 2020 в 09:07
2
С какой проблемой/ошибкой вы столкнулись?
 – 
HTH
18 Апр 2020 в 09:11

1 ответ

Вам действительно следует использовать Option Explicit:

Option Explicit

Public Function CFR(df(), x As Double, t As Integer) As Double
    Dim i As Long, y As Integer
    Dim discount() As Double
    Dim nom, denom As Double
    ReDim discount(t) As Double

    y = 1
    For i = UBound(df, 1) + 1 To t
        discount(i) = df(UBound(df, 1)) * (x ^ y)
        y = y + 1
    Next i

    nom = (1 - df(UBound(df)) * x ^ (t - UBound(df)))
    denom = Application.WorksheetFunction.Sum(df) + Application.WorksheetFunction.Sum(discount)

    CFR = nom / denom

End Function

Проблемы были

1) denim вместо denom

Что использование Option Explicit нашло бы вас немедленно

2) Dim discount() Поскольку VBA предполагает неявный тип Variant для всех явно не объявленных переменных, и это приводит к конфликту с последующими ReDim discount(t) As Double, поскольку оператор Redim() не может изменить тип массива

3) объяснение пункта 2 актуально для незначительной проблемы (в данном случае не блокирующей код):

Dim i, y As Integer

На самом деле читается как:

Dim i As Variant, y As Integer

Если вы хотите, чтобы i имел тип integer, вам нужно написать код:

Dim i As Integer, y As Integer
1
braX 18 Апр 2020 в 10:15
Большое спасибо. Я только что обнаружил, что объект диапазона не может быть проиндексирован. Например. ''' array = range("a1:a10"), то я хочу проиндексировать значение "a2", поэтому я кодирую ''' array(2) Это не работает, но теперь я его меняю.
 – 
Fintz
21 Апр 2020 в 08:48