Excel VBA - 将列表作为函数参数传递

问题描述 投票:2回答:2

有了一些功能,你可以做像=SEARCH({"some","thing"},A1)这样的事情

我怎么能写一个接受像{"some","thing"}这样的参数的函数?

我根据我见过的其他一些答案/网站尝试了Function whatever(my_list as Variant)Function whatever(my_list() as Variant),但它没有用,我不知道为什么。

我认为如果我的函数像=WHATEVER("some","thing"),但我想要额外的参数,如=WHATEVER(A1,{"some","thing"},0,B1),上述情况会有效

我希望在接受它作为参数后循环遍历列表。谢谢!

excel vba
2个回答
1
投票

您可以通过以下功能实现此目的:

Public Function Foo(values As Variant) As String
  Dim i As Long
  For i = LBound(values) To UBound(values)
    Foo = Foo & values(i)
  Next i
End Function

然后在Excel公式中使用它,如下所示:

=Foo({"a","b","c"})

这将返回abc的单元格值。

编辑....

但是该函数不会处理像=Foo({"a","b","c";"d","e","f"})这样的二维数组或者将一个Range传递给函数,比如=Foo(A1:B6)

这有点健壮:

Public Function Foo(ByVal values As Variant) As String

  Dim temp As Variant
  temp = values

  Dim i As Long
  Dim j As Long
  Dim is2D As Boolean

  If IsArray(temp) Then
    On Error Resume Next
    is2D = IsNumeric(LBound(temp, 2))
    On Error GoTo 0

    If is2D Then
      For i = LBound(temp, 1) To UBound(temp, 1)
        For j = LBound(temp, 2) To UBound(temp, 2)
          Foo = Foo & temp(i, j)
        Next j
      Next i
    Else
      For i = LBound(temp) To UBound(temp)
        Foo = Foo & temp(i)
      Next i
    End If
  Else
    Foo = temp
  End If

End Function

0
投票

除了将参数声明为Variant之外,还可以使用IsArray来检查参数是否为数组,如果未知维数,则可以使用For Each而不是For

Public Function MySearch(values, value) As Boolean

    If TypeOf values Is Excel.Range Then values = values  ' convert Range to array or value

    If TypeOf value  Is Excel.Range Then value  = value   ' not sure if this is needed ..

    If Not IsArray(values) Then MySearch = values = value : Exit Function

    Dim v    ' As Variant by default

    For Each v In values
        If v = value Then MySearch = True : Exit Function
    Next i

    MySearch = False
End Function
© www.soinside.com 2019 - 2024. All rights reserved.