Excel VBA переделать фун-ю под работу с массивами

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Kokain
Сообщения: 23
Зарегистрирован: 09 авг 2006, 11:03
Откуда: Moscow
Контактная информация:

Всем привет.
Возникла следующая проблема: Есть буржуйская функция сплайн интерполяции. В качестве параметров, среди прочих, надо задать два диапазона (periodcol и ratecol) размера 1*n. Мне необходимо из другого макроса вызывать эту функцию. В качестве параметров periodcol и ratecol мне надо подставить два массива (они уже готовы). Как переделать функцию spline, чтобы она подхватывала массивы? У меня не выходит. Есть вариант выгружать массивы на листы и запускать spline, но этот вариант очень неудобный в моей ситуации и к томуже не изящный. Помогите, пожалуйста.

Код: Выделить всё

Function spline(periodcol As Range, ratecol As Range, x As Range)

Dim period_count As Integer
Dim rate_count As Integer

period_count = periodcol.Rows.count
rate_count = ratecol.Rows.count

    If period_count <> rate_count Then
        spline = "Error: Range count dos not match"
        GoTo endnow
    End If
 
ReDim xin(period_count) As Currency
ReDim yin(period_count) As Currency

Dim c As Integer

    For c = 1 To period_count
        xin(c) = periodcol(c)
        yin(c) = ratecol(c)
    Next c

Dim n As Integer
Dim i, k As Integer
Dim p, qn, sig, un As Single
ReDim u(period_count - 1) As Single
ReDim yt(period_count) As Single

n = period_count
yt(1) = 0
u(1) = 0

    For i = 2 To n - 1
        sig = (xin(i) - xin(i - 1)) / (xin(i + 1) - xin(i - 1))
        p = sig * yt(i - 1) + 2
        yt(i) = (sig - 1) / p
        u(i) = (yin(i + 1) - yin(i)) / (xin(i + 1) - xin(i)) - (yin(i) - yin(i - 1)) / (xin(i) - xin(i - 1))
        u(i) = (6 * u(i) / (xin(i + 1) - xin(i - 1)) - sig * u(i - 1)) / p
    Next i
    
qn = 0
un = 0

yt(n) = (un - qn * u(n - 1)) / (qn * yt(n - 1) + 1)

    For k = n - 1 To 1 Step -1
        yt(k) = yt(k) * yt(k + 1) + u(k)
    Next k

Dim klo, khi As Integer
Dim h, b, a As Single

klo = 1
khi = n
    Do
        k = khi - klo
            If xin(k) > x Then
                khi = k
            Else
                klo = k
            End If
        k = khi - klo
    Loop While k > 1
    
h = xin(khi) - xin(klo)
a = (xin(khi) - x) / h
b = (x - xin(klo)) / h
y = a * yin(klo) + b * yin(khi) + ((a ^ 3 - a) * yt(klo) + (b ^ 3 - b) * yt(khi)) * (h ^ 2) / 6

spline = y

endnow:
End Function
Kokain
Сообщения: 23
Зарегистрирован: 09 авг 2006, 11:03
Откуда: Moscow
Контактная информация:

Попробую переформулировать проблему:
Как объявить переменные periodcol и ratecol функции spline,
и как присвоить массивам xin() yin() значения готовых массивов?
Не работает если просто написать 'один массив равен другому массиву'.
Ответить