Можно ли передать поля массива в функцию с параметром массива? - PullRequest
0 голосов
/ 16 ноября 2018

Я нахожусь в следующей ситуации: у меня есть функция, которая принимает ParamArray типа варианта и генерирует строку из ключевых слов, заданных в его ParamArray, специальным образом путем выполнения mergeToString.

Function function1(ParamArray var() As Variant) As String
    For i = LBound(var) To UBound(var)
       function1 = mergeToString(function1, CStr(var(i))
    Next i
End Function

В другой подпрограмме у меня есть массив строк, полученных из функции Split в VBA, и я хочу использовать его в качестве входных данных для функции1

Sub displayFCTN1()
    Dim arr() As String
    arr() = Split("foo|bar", "|")
    'and here I ran out of ideas...
    Debug.Print function1(**???**)
End Sub

Две строки

function1(**???**)
function1("foo","bar")

должен быть эквивалентен первому, так или иначе используя arr ().

В Matlab это относительно просто - я знаю, VBA - это не Matlab, но это может помочь в качестве расширенного описания моей проблемы: Скорее всего, вы могли бы сделать это с помощью оператора двоеточия в Matlab

function1(arr(:))

с тех пор поля массива arr () считаются «свободными» параметрами.

Есть ли что-то сопоставимое с этим в VBA? Я уже попробовал ReDim, который как-то не справился (насколько я пытался).

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Это требует изменения кода function1, но все равно должно работать с оригинальным.

Sub Test()

    Debug.Print function1("foo", "bar")

    Dim arr() As String
    arr = Split("foo|bar", "|")
    Debug.Print function1(arr)

End Sub

Function function1(ParamArray var() As Variant) As String
    Dim i As Long

    If UBound(var) = 0 Then
        For i = LBound(var(0)) To UBound(var(0))
            'function1 = Join(var(0), "|")
            function1 = mergeToString(function1, CStr(var(0)(i)))
        Next i
    Else
        'Original code.
        For i = LBound(var) To UBound(var)
           'function1 = Join(var, "|")
           function1 = mergeToString(function1, CStr(var(i)))
        Next i
    End If
End Function
0 голосов
/ 16 ноября 2018

Вам необходимо проверить, является ли первый элемент массива массивом:

Sub FFF()
    MsgBox Func1("foo", "bar")
    MsgBox Func1(Split("foo|bar", "|"))
End Sub

Function Func1$(ParamArray var() As Variant)
    Dim s$, x%, args
    args = IIf(IsArray(var(0)), var(0), var)
    '//Do something
    For x = 0 To UBound(args)
        s = s & args(x) & "|"
    Next
    Func1 = Left$(s, Len(s) - 1)
End Function
0 голосов
/ 16 ноября 2018

Обходной путь, как упомянуто в комментариях выше

Sub displayFCTN1()
        Dim arr() As String
        arr() = Split("foo|bar", "|")
        Myhelper arr
    End Sub

    Sub Myhelper(arr)
    Select Case UBound(arr)
    Case 0: Debug.Print function1(arr(0))
    Case 1: Debug.Print function1(arr(0), arr(1))
    Case 2: Debug.Print function1(arr(0), arr(1), arr(2))
    Case 3: Debug.Print function1(arr(0), arr(1), arr(2), arr(3))
    Case 4: Debug.Print function1(arr(0), arr(1), arr(2), arr(3), arr(4))
    'etc up to 29.
    Case Else
    End Select
    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...