Передача массивов со значениями, возвращенными из другой пользовательской функции - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть 2 рассматриваемые функции:

' Starting from first row, navigate through headers (rows) in lookup_range and return cell value at row_index if we reach a single column Range at the end of navigation; N/A otherwise.
Public Function HLOOKUPRANGE(headers() As Variant, lookup_range As range, row_index As Integer) As Variant
' returns the minimum value in search range that is greater than or equal to target.
Public Function MINGE(search As range, target As Variant) As Variant

В моей рабочей таблице Excel HLOOKUPRANGE работает следующим образом:

=HLOOKUPRANGE({"Color", "Red", "Alpha", 50}, A1:Z30, SELECTED_INDEX)
=HLOOKUPRANGE({"Color", "Blue", "Alpha", 100}, A1:Z30, SELECTED_INDEX)

Но как я могу заставить его работать с другой функцией,как это?:

=HLOOKUPRANGE({"Color", "Red", "Alpha", MINGE(A4:Z4, INPUT_ALPHA_VALUE)}, A1:Z:30, SELECTED_INDEX)

Excel не позволяет мне поместить MINGE между {}, и я думаю, что проблема заключается в такой передаче массивов.Что я могу сделать, чтобы передать результат MINGE в HLOOKUPRANGE?

Подсказка: MINGE равен "MINimum Greater than or Equal"

1 Ответ

0 голосов
/ 14 февраля 2012

Два способа, о которых я могу думать ...

WAY 1

Напишите третью функцию, которая объединит массив со значением MINGE.Я создал образец, так как не знаю, что делают HLOOKUPRANGE и MINGE, но концепция та же.

SID () имитирует HLOOKUPRANGE в этом примере.Но все, что он делает в данный момент, это суммирует значения

Так что, если вы введете

=SID({1,2,3,4,5})

, это даст вам сумму 15. Теперь допустим, что мы хотели получить сумму

=SID({1,2,3,4,5,MINGE()}) 

где значение MINGE () равно 6. Вот как мы это сделаем

=SID(Unite({1,2,3,4,5},6))

Что даст вам 21. Этот код входит в модуль

Option Explicit

Dim TempAr() As Variant

Public Function Sid(headers() As Variant) As Variant
    Dim temp As Long, i As Long
    For i = LBound(headers) To UBound(headers)
        temp = temp + headers(i)
    Next i
    Sid = temp
End Function

Public Function Unite(MyArray() As Variant, Vl As Variant) As Variant
    Dim n As Long, i As Long

    n = UBound(MyArray)

    ReDim Preserve TempAr(n + 1)

    For i = LBound(MyArray) To UBound(MyArray)
        TempAr(i) = MyArray(i)
    Next i

    TempAr(n + 1) = Vl
    Unite = TempAr
End Function

Если бы я применил то же самое к вашим функциям, то это выглядело бы примерно так

=HLOOKUPRANGE(UNITE({"Color", "Red", "Alpha"},MINGE(A4:Z4, INPUT_ALPHA_VALUE)), A1:Z30, SELECTED_INDEX)

WAY 2

Вы могли бы слегка изменить функцию HLOOKUPRANGE напринять дополнительные значения.Например, формула

= SUM ({1,2,3,4,5}, {6}) делает то же самое, что и выше в рабочей таблице.

Таким образом, вы можете изменить свойHLOOKUPRANGE () для

Public Function HLOOKUPRANGE(headers() As Variant, lookup_range As Range, _
row_index As Integer, Optional HeadersItem1 As Variant, _
Optional HeadersItem2 As Variant) As Variant
    '~~> In the code add HeadersItem1 and HeadersItem2 to headers()
    '~~> If they are not blank
End Function

ИСПОЛЬЗОВАНИЕ будет выглядеть следующим образом

=HLOOKUPRANGE({"Color", "Red", "Alpha"}, A1:Z30, SELECTED_INDEX,MINGE(A4:Z4, INPUT_ALPHA_VALUE)))

или

=HLOOKUPRANGE({"Color", "Red"}, A1:Z30, SELECTED_INDEX,MINGE(A4:Z4, INPUT_ALPHA_VALUE)),SELECTED_INDEX,MINGE(B4:B4, INPUT_ALPHA_VALUE)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...