Excel: передать массив в пользовательской функции? - PullRequest
1 голос
/ 04 декабря 2009

Как передать массив в качестве параметра для определенной пользователем функции в MS Excel VBA?

В конце концов я хочу проверить, что если заданная дата (dateDay) находится в нескольких диапазонах дат (arrayVacation):

Function CB_IsInRangeArr(dateDay As Date, ParamArray arrayVacation() As Variant) As Boolean

    ' Test that the array is in the form of 2 columns and n rows / if not send back an error
    If (UBound(arrayVacation, 1) <> 2) Then
        CB_IsInRangeArr = CVErr(xlErrNA)
    Else
        CB_IsInRangeArr = TRUE
    End If
End Function

Все же уже на этом этапе функция не работает должным образом. Возвращает # ЗНАЧЕНИЕ!

Ответы [ 2 ]

4 голосов
/ 04 декабря 2009

ОК, я добавил функцию

Public Function CB_IsInRangeArr(c As Date, range As range) As Boolean
Dim iRow As Integer

    For iRow = 1 To range.Rows.Count
        Dim startDate As Date, endDate As Date
        startDate = range.Cells(iRow, 1)
        endDate = range.Cells(iRow, 2)
        If (startDate <= c And endDate >= c) Then
            CB_IsInRangeArr = True
            Exit Function
        End If
    Next iRow
End Function

это позволяет вам добавлять диапазоны дат и ячейку для проверяемой даты.

тогда формула в ячейке будет

=CB_IsInRangeArr(C1,A1:B2)

с c1 является датой для проверки, а a1: b2 диапазон дат.

Пожалуйста, спросите, могу ли я помочь в дальнейшем.

2 голосов
/ 05 декабря 2009

Paramarray создает массив вариантов с каждым элементом, содержащим параметр: Попробуйте что-то вроде этого


Function CB_IsInRangeArr(dateDay As Date, ParamArray arrayVacation() As Variant) As Variant

    Dim nParams As Long
    Dim vRangeValues As Variant
    Dim jParam As Long
    Dim j As Long

    nParams = UBound(arrayVacation) - LBound(arrayVacation) + 1
    If nParams &le 0 Then Exit Function
    On Error GoTo Fail

    For jParam = LBound(arrayVacation) To UBound(arrayVacation)

        vRangeValues = arrayVacation(jParam).Value

        For j = LBound(vRangeValues) To UBound(vRangeValues)
            If (vRangeValues(j, 1) &le dateDay And vRangeValues(j, 2) &ge dateDay) Then
                CB_IsInRangeArr = True
                Exit Function
            End If
        Next j

    Next jParam

    Exit Function
Fail:
    CB_IsInRangeArr = CVErr(xlErrNA)
End Function
...