【问题标题】:How to pass a cell content that is an array of strings to a function as parameter?如何将作为字符串数组的单元格内容作为参数传递给函数?
【发布时间】:2019-07-15 23:52:31
【问题描述】:

我有这个正确返回字符串数组的 VBA UDF:

Function SplitString(ByVal Str As String, ByVal StrLen As Integer) As String()
    Dim ArrStrs() As String
    Dim ArrCount As Integer
    ReDim ArrStrs((Len(Str) - 1) \ StrLen)
    ArrCount = 0
    For i = 1 To Len(Str) Step StrLen
        ArrStrs(ArrCount) = Mid(Str, i, StrLen)
        ArrCount = ArrCount + 1
    Next

    SplitString = ArrStrs
End Function

我在 Excel 表格的一个单元格中使用了上述函数,比如单元格A1

=SplitString("wordexample";2)

哪个显示

并且,通过进入单元格的编辑模式并点击F9,它会显示

现在,我想将A1 的内容作为名为@9​​87654329@ 的参数传递给另一个UDF。

我尝试了这些和其他一些:

Function MyFunct(ArrayOfStrs As Variant, ParamArray CStrs() As Variant)
'Using Function MyFunct(ArrayOfStrs As String, ParamArray CStrs() As Variant) I get #VALUE! error

    MsgBox ArrayOfStrs(1)   'returns "wo"
    'MsgBox ArrayOfStrs(2)   returns ""
    'MsgBox ArrayOfStrs(...) returns ""

End Function

但我无法将ArrayOfStrs 作为字符串数组。也就是说,似乎只有先前拆分的字符串的第一个值(wo)被传递给MyFunct。事实上,只有ArrayOfStrs(1) 有效(它返回wo)和其他值(rdexample)似乎在ArrayOfStrs 中不可用.

如何正确地将ArrayOfStrs 作为函数参数传递给MyFunct

【问题讨论】:

  • 除了MyFunct 函数头之外,还有助于展示一个实际传递数组的示例。
  • @AAA 我无法从MyFunct 中调用SplitString
  • @TimWilliams 是否可以从SplitString 返回完整数组以填充A1 单元格?如果是这样,如何做到这一点? BTW 为什么A1 只包含第一个元素?
  • 一个单元格只能有一个值 = 即使您输入(例如)={"one","two"},它也只会显示“一个”,而TypeName(Selection.Value) 将是“字符串”。您必须执行类似返回单个分隔值的操作,然后该值可能是 Split() in MyFunct

标签: arrays excel vba arguments


【解决方案1】:

您可以Evaluate A1 的内容,其中A1 包含您在问题中提到的公式:

Function myFunct(myRange As Range)
    Dim ArrayOfStrs As Variant
    Dim msg As String
    Dim I As Long
ArrayOfStrs = Evaluate(myRange.Formula)

msg = ""
For I = LBound(ArrayOfStrs) To UBound(ArrayOfStrs)
    msg = msg & vbLf & ArrayOfStrs(I)
Next I

msg = Mid(msg, 2)

MsgBox msg

End Function

但无需在工作表上输入SplitString 即可获得结果:

Function myFunct2()
    Dim arr As Variant
    Dim I As Long
    Dim msg As String

arr = SplitString("wordexample", 2)
msg = ""
For I = LBound(arr) To UBound(arr)
    msg = msg & vbLf & arr(I)
Next I

msg = Mid(msg, 2)

MsgBox msg

End Function

【讨论】:

  • 也许 myRange.Parent.Evaluate(myRange.Formula) 假设所有内容都在同一张工作表上,否则当其他工作表处于活动状态时结果可能会关闭。
  • @TimWilliams 是的,需要进行大量测试以确保处理有效的内容。而且,虽然它有效,但对我来说似乎是一个尴尬的解决方案。我不明白为什么 OP 不能使用 myFunct2 或一些变体。但是,如果不了解真正的问题,就很难制定一个好的解决方案。所以这个答案更多地是作为一个概念提出的,而不是应该在分布式代码中使用的东西。
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2010-10-03
相关资源
最近更新 更多