Excel VBA中的数组函数

8
我有一个在VBA中生成字符串数组的函数。当从另一个VBA函数调用时,它可以正常工作,但是当从工作表调用时却无法正常工作。
以下是正确的使用方法:
- 选择A1:A3 - 在公式栏中输入“=Test()”,然后按下“Ctrl-Shift-Enter”将其变成数组函数 - A1应该包含“A”,A2应该包含“B”,A3应该包含“C”
但是,实际尝试时,它会将“A”放入数组的所有三个单元格中。如何将由“Test”返回的数据放入数组的不同单元格中?
以下是函数代码,想要查看的人可以参考一下。请注意,该函数在从其他函数调用时可以正常工作。
Function Test() As String()
    Dim a(1 To 3) As String
    a(1) = "A"
    a(2) = "B"
    a(3) = "C"
    Test = a
End Function
4个回答

9

如果你将数据转置,你的函数就会正常工作。为此,你需要使用Variant()而不是String()

Function Test() As Variant()
    Dim a(1 To 3) As Variant
    a(1) = "A"
    a(2) = "B"
    a(3) = "C"
    Test = Application.Transpose(a)
End Function

1
我不知道数组的默认方向是向右而不是向下。 - Joe
不幸的是,似乎Excel没有一种简单自动的方式来填充数组,无论是水平还是垂直。然而,可能存在一些技巧。 - Mike T
是的,正如@andy holaday所指出的那样,Chip Pearson也已经解决了水平/垂直的问题。 - Mike T
2
与其在UDF中使用Transpose,当您需要垂直输入设置时,可以在数组公式中使用Transpose,或者如果您需要水平输入设置,则不使用。 - brettdj

4

参考Chip Pearson的网站从来不会错。至少我希望不会,因为我一直这样做!+1 - Doug Glancy

3

我发现最简单的方法是始终使用2维数组,这样就不需要进行转置等操作。

Function Test() As String()
    Dim a(1 To 3, 1) As String
    a(1, 1) = "A"
    a(2, 1) = "B"
    a(3, 1) = "C"
    Test = a
End Function

0
刚刚找到问题所在——从 VBA 到 Excel 的数组的第一维是水平的,而不是垂直的。要查看Test函数的输出,请将数组函数=Test()放在A1:C1中(而不是A1:A3)。

阅读此回复与上面的Charles Williams的回复结合起来有点令人困惑,尽管两者都是正确的。一个一维的VBA数组作为单行传递给Excel(如原始的Test UDF中所示)。一个二维的VBA数组是通过第一维列传递的(如Charles发布的Test UDF中所示)。 - Doug Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接