Как индексировать значение в массиве? - PullRequest
0 голосов
/ 18 апреля 2020

Я поражен этой простой функцией в VBA в течение дня.

Пытаюсь отладить себя, но не могу понять, почему она не работает.

Мое лучшее предположение - индексация массива Это проблема.

, пожалуйста, помогите мне.

Большое спасибо

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 Ответ

1 голос
/ 18 апреля 2020

вы действительно должны использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...