Функция Excel VBA должна получать либо жестко закодированный список ParamArray, либо Range - PullRequest
0 голосов
/ 28 августа 2018
Function AndSearch1(ByRef target As Range, ParamArray searchList() As Variant) As Boolean
    'AND Boolean logic search using a hardcoded list
    Dim i As Long
    For Each cell In searchList
        i = InStr(target.Value, cell): If i = 0 Then AndSearch1 = False: Exit Function
    Next
    AndSearch1 = True
End Function

Function AndSearch2(ByRef target As Range, ByRef searchList As Range) As Boolean
    'AND Boolean logic search using a list Range
    Dim i As Long
    For Each cell In searchList
        i = InStr(target.Value, cell): If i = 0 Then AndSearch2 = False: Exit Function
    Next
    AndSearch2 = True
End Function

В Excel будет нормально работать:

=AndSearch1(A1,"red","white","blue")

где красный, белый и синий находятся внутри ячеек B1: B3

=AndSearch2(A1,B1:B3)

Но можно ли кодировать одну функцию AndSearch, чтобы она могла получать либо жестко закодированные строки, либо Range?

Спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

К сожалению, в VBA нет ничего похожего на перегрузки функций / методов.

Я не проверял это, но я думаю, что это должно работать для двух конкретных случаев ( либо paramarray из строкового литерала, либо объект с одним диапазоном):

Function AndSearch1(ByRef target As Range, ParamArray searchList() As Variant) As Boolean
    'AND Boolean logic search using a hardcoded list
    Dim i As Long
    Dim myArray as Variant
    myArray = searchList
    If UBound(searchList) = 0 Then
        If TypeName(searchList(0)) = "Range" Then
             If searchList(0).Rows.Count = 1 and searchList(0).Columns.Count > 1 Then
                 myArray = Application.Transpose(Application.Transpose(searchList(0).Value))
             ElseIf searchList(0).Rows.Count > 1 and searchList(0).Columns.Count = 1 Then
                 myArray = searchList(0).Value
             Else
                 'you'd need additional logic to handle 2-dimensional ranges
             End If             
        End If
    End If
    For Each cell In myArray # iterate the myArray instead of the searchList

ПРИМЕЧАНИЕ: я не думаю, что это сработает (но может быть пересмотрено для обработки различных краевых случаев), если вы пропустите диапазон ParamArray, например:

=AndSearch1("A1:B1","C2:C15")

И если это двумерный диапазон.

=AndSearch1("A1:D4")

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

...