VBA Excel - передача массива в функцию - PullRequest
1 голос
/ 26 марта 2020

Я хочу написать функцию, в которую я могу включить массив. Я предполагаю, что функция будет работать как функция NPV, у нас есть 3 способа задания синтаксиса в строке формул:

1) NPV(0.5, A1:A5)
2) NPV(0.5, A1, A2, A3, A4, A5)
3) NPV(0.5, {10, 20, 23, 25, 27})

Где 10, 20, 23, 25, 27 - значения в диапазоне A1 : A5.

А вот моя функция в VBA:

Function MyNpv(r As Double, Flows As Variant)

Dim i, n As Integer
Dim p As Double
n = Application.Count(Flows)
For i = 1 To n
 p = p + Flows(i) / (r + 1) ^ i
Next i

MyNpv = p

End Function

Тем не менее, моя собственная функция может работать только так:

MyNpv(0.5, A1:A5)

В любом случае я можете объявить мой массив так, чтобы он работал гибко, как функция NPV?

Спасибо.

1 Ответ

0 голосов
/ 26 марта 2020

Используйте ParamArray, L oop, чтобы проверить, что находится в каждой части массива, и затем соответственно откорректировать:

Function MyNpv(r As Double, ParamArray Flows() As Variant)

    Dim FlowsPart As Variant

    Dim p As Double
    p = 0#

    Dim k As Long
    k = 1

    For Each FlowsPart In Flows
        Dim arr As Variant
        arr = FlowsPart

        Dim x As Long
        x = -1

        Dim y As Long
        y = -1

        On Error Resume Next
            x = UBound(arr, 2)
            y = UBound(arr)
        On Error GoTo 0

        Dim j As Long
        Dim i As Long
        If x >= 0 And y >= 0 Then
            For i = LBound(arr, 1) To UBound(arr, 1)
                For j = LBound(arr, 2) To UBound(arr, 2)
                    p = p + arr(i, j) / (r + 1) ^ k
                    k = k + 1
                Next j
            Next i
        ElseIf y >= 0 Then
            For j = LBound(arr) To UBound(arr)
                p = p + arr(j) / (r + 1) ^ k
                k = k + 1
            Next j
        Else
            p = p + arr / (r + 1) ^ k
            k = k + 1
        End If
    Next FlowsPart

    MyNpv = p

End Function

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...