Пытаюсь отладить. Я думаю, что индексация массива является проблемой.
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
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
Похожие вопросы
Новые вопросы
excel
Только для вопросов по программированию объектов или файлов Excel или по разработке формул. Вы можете комбинировать тег Excel с тегами и вопросами VBA, VSTO, C#, VB.NET, PowerShell, OLE и другими тегами и вопросами, связанными с программированием, если это применимо. НЕ используйте с другим программным обеспечением для работы с электронными таблицами, например [google-sheets].