Я пытаюсь построить кривую доходности путем интерполяции, используя два набора данных: диапазон календарных дней до погашения и другой диапазон процентных ставок.
У меня есть UDF на VBA, который интерполирует процентные ставки. Он использует в качестве аргументов два диапазона ячеек, выбранных пользователем на листе Excel.
Мне известно, что Excel требует, чтобы эти диапазоны состояли из смежных ячеек.
Я пытаюсь выбрать несмежные ячейки на листе и использовать их значения в качестве диапазонов для аргументов UDF.
В частности, у меня есть два столбца данных, которые я использую в качестве диапазонов. Но иногда мне нужно пропустить одно значение в каждом из этих столбцов и использовать оставшиеся значения в качестве диапазонов для моей пользовательской функции.
Я попытался включить еще два аргумента диапазона в свой UDF и использовать метод объединения, чтобы объединить два диапазона в один, чтобы использовать полученный диапазон в моем коде. Это не сработало.
**** редактировать
Крис,
Спасибо за указание на часы и немедленную Windows. После многих попыток код наконец-то работает, как я и предполагал, но только с отдельными циклами для диапазонов DC_1 и taxas_1.
Как ни странно, это не сработает, если я уберу инструкцию «If k> 1 Then» из цикла. Поэтому мне нужно было сохранить его и заставить ничего не делать.
Я заметил, что косвенная функция не будет работать с таким аргументом, как (A1: A3, C2: C5), поэтому я не могу использовать косвенный ((A1: A3, C2: C5)) в качестве аргумента для UDF. Однако это небольшая проблема.
В случае, если кто-то достигнет этого поста с похожей проблемой, вот код, который я использую.
Public Function Interplin_union(ByVal taxas_1 As Range, ByVal DC_1 As Range, ByVal dias As Integer) As Double
Dim tam1 As Long
Dim taxa1 As Double, taxa2 As Double, alfa As Double, d1 As Double, d2 As Double
Dim k As Long
Dim taxas As Variant
Dim DC As Variant
tam1 = taxas_1.Cells.Count
ReDim taxas(1 To tam1)
ReDim DC(1 To tam1)
Interplin_union = -1
Dim c As Range
k = 1
For Each c In DC_1
'taxas(k) = taxas_1(k)
DC(k) = c
If k > 1 Then
'Debug.Print DC(k)
If DC(k - 1) > DC(k) Then
Interplin_union = CVErr(xlErrNA)
Exit Function
End If
End If
k = k + 1
Next
k = 1
For Each c In taxas_1
taxas(k) = c
If k > 1 Then
'Debug.Print DC(k), taxas(k)
End If
k = k + 1
Next
For k = 1 To (tam1 - 1)
If ((DC(k) < dias) And (DC(k + 1) >= dias)) Then
taxa1 = taxas(k)
taxa2 = taxas(k + 1)
alfa = (taxa2 - taxa1) / (DC(k + 1) - DC(k))
Interplin_union = taxa1 + (alfa * (dias - DC(k)))
End If
Next k
If (dias <= DC(1)) Then
Interplin_union = taxas(1)
ElseIf dias > DC(tam1) Then
Interplin_union = taxas(tam1)
End If
End Function