excel vba函数返回数组并粘贴到工作表公式中

Posted

技术标签:

【中文标题】excel vba函数返回数组并粘贴到工作表公式中【英文标题】:excel vba function return array and paste in worksheet formula 【发布时间】:2018-04-05 12:22:49 【问题描述】:

vba 函数是否可以返回数组值并使用 excel 公式粘贴到工作表中?

例如,我想在 Excel 单元格中写一个公式,比如 A1,例如 =GetData(),然后按 Enter。它返回 4 个指标,其中填充了 A1:A4、B1:B4 单元格。

我尝试将 Variant 和 Collection 作为返回类型。值在那里,但它只填充第一个单元格。

Function GetData(Input1 As Range) As Variant       
    Dim value() As Variant
    value(1, 1) = "somevalue"
    value(1, 2) = "somevalue"
    ............
    value(2, 2) = "somevalue"

    GetData = value
End Function

【问题讨论】:

我相信,如果您返回一个数组,您必须选择多个单元格并按 shift-enter 才能获取所有这些值。您可以使用 index() 来获取数组中的特定值,例如:=INDEX(A1:A4,3) 阅读:cpearson.com/excel/arrayformulas.aspx 【参考方案1】:

使用此代码:

Function GetData() As Variant
    Dim value(1 To 2, 1 To 2) As Variant
    value(1, 1) = "1;1"
    value(1, 2) = "1;2"
    value(2, 1) = "2;1"
    value(2, 2) = "somevalue"
    GetData = value
End Function

选择单元格D1E2;然后点击编辑栏;然后输入:

=getdata()

作为数组公式:

数组公式必须使用 Ctrl + Shift + Enter 而不仅仅是 Enter 键。如果正确执行此操作,公式将在公式栏中显示并带有花括号。

编辑#1:

正如 Jeeped 所指出的,一旦以这种方式将公式输入到数组中,数组中的单个单元格就不能自行更改。所以:

Range("D1").Clear

会失败。你需要:

Sub poiuyt()
    Dim r As Range, r2 As Range

    Set r = Range("D1")
    Set r2 = r.CurrentArray
    r2.Clear
End Sub

【讨论】:

单元格范围(2 行 x 2 列)也被“锁定”,因此必须对范围内的所有单元格进行任何更改;您不能对单个单元格进行更改。 @Jeeped 查看我的EDIT#1 我不知道函数返回的行数。列数是预定义的。如何动态设置行范围? @siz 您将使用 Sub 而不是 Function。潜艇可以自行决定其输出的去向。 好的,我如何从 excel 公式中调用 sub?【参考方案2】:

使用连接将数组转换为字符串,检查单元格属性>换行文本。然后你可以将数组填充到单个单元格中。

Value(0) = "somedata"
value(1) = "somedata"
GetData = Join(value, Chr(10))

P/s: Idk 如何加入二维数组

【讨论】:

以上是关于excel vba函数返回数组并粘贴到工作表公式中的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA函数仅粘贴打印区域内的内容而不是整个工作表?

如何将 Excel 数组公式传递给 VBA UDF?

将多维数组传递到 VBA 中的 Excel UDF

Excel VBA 函数失败,但公式在工作表中有效

使用工作表函数编写自定义 Excel 函数的问题

vba粘贴不起作用