【问题标题】:Array function in Excel VBAExcel VBA中的数组函数
【发布时间】:2012-05-04 15:47:02
【问题描述】:

我在 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

【问题讨论】:

    标签: arrays excel vba user-defined-functions


    【解决方案1】:

    刚刚发现问题 - 从 VBA 到 Excel 的数组的第一个维度是水平,而不是垂直。要查看Test 的输出,请将数组函数=Test() 放入A1:C1(不是A1:A3)中。

    【讨论】:

    • 结合上述查尔斯·威廉姆斯的回复阅读此回复有点令人困惑,尽管两者都是正确的。一维 VBA 数组作为单行传递给 Excel(如原始测试 UDF 中所示)。 2D VBA 数组与列中的第一个维度一起传递(如 Charles 发布的测试 UDF 中所示)。
    【解决方案2】:

    如果您转置数据,您的功能可以正常工作。为此,您需要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
    

    【讨论】:

    • 我不知道数组的默认方向是向右,而不是向下。
    • 不幸的是,Excel 似乎没有一种简单的自动方式来水平或垂直填充数组。但是,可能会有一些技巧。
    • 是的,正如@andy holaday 指出的那样,Chip Pearson 也已经解决了水平/垂直困境。
    • 当你想要一个垂直条目集时,你可以在数组公式中使用Transpose,而不是在UDF中使用Transpose,或者如果你想要它水平则不用
    【解决方案3】:

    您可能想查看Chip Pearson's advice on returning an array from a UDF

    这是我在这里的第一反应。我希望这不是不合适的。

    【讨论】:

    • 参考 Chip Pearson 的网站永远不会错。至少我希望不会,因为我一直都这样做! +1
    【解决方案4】:

    我发现总是使用二维数组是最简单的,然后你不需要转置等

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多