суббота, 8 января 2011 г.

Моя первая функция на VBA

Часто сталкиваюсь с задачей нахождения значения в двумерном массиве с использованием линейной интерполяции. Стандартными средствами Excel это решить можно, но крайне неудобно. Поэтому решил написать надстройку на VBA.
Собственно вот сам код

Public Function ДВИНТЕРП(Массив As Range, Row As Single, Column As Single)
Dim arr()
Dim i As Integer
Dim j As Integer
Dim A As Single
Dim B As Single
arr = Массив.Value
If Row < arr(1, 2) Or Column < arr(2, 1) Then ДВИНТЕРП = "Ошибка!" Exit Function End If For i = 3 To UBound(arr, 1) If arr(i, 1) >= Column Then Exit For
Next i
For j = 3 To UBound(arr, 2)
If arr(1, j) >= Row Then Exit For
Next j
A = (arr(i - 1, j) - arr(i - 1, j - 1)) / (arr(1, j) - arr(1, j - 1)) * (Row - arr(1, j - 1)) + arr(i - 1, j - 1)
B = (arr(i, j) - arr(i, j - 1)) / (arr(1, j) - arr(1, j - 1)) * (Row - arr(1, j - 1)) + arr(i, j - 1)
ДВИНТЕРП = (B - A) / (arr(i, 1) - arr(i - 1, 1)) * (Column - arr(i - 1, 1)) + A
End Function

И макрос для назначения категории и описания

Sub Описание()
Application.MacroOptions Macro:="ДВИНТЕРП", _
Description:="Выполняет интерполяцию в двумерном массиве. Массив должен содержать строку и столбец исходных данных, отсортированных по возрастанию слева направо и сверху вниз соответственно. Row - искомое значение в строке данных, Column - в столбце данных", _
Category:=3
End Sub

Может кому-нибудь пригодится.
На изящество и грамотность кода не претендую - это моя первая функция на VBA, сваял за пару часов с книжкой, плюс тестирование. Но зато работает. Правда есть один минус, для меня очень существенный: при использовании этой функции не получается получить доступ к массиву данных содержащихся в закрытой книге. Пока не нашел способа решить эту проблему, может удастся выкрутиться, а может и нет.


Читать далее