使用来自加载项用户定义函数 (UDF) 的数据填充 Excel 多个单元格

Posted

技术标签:

【中文标题】使用来自加载项用户定义函数 (UDF) 的数据填充 Excel 多个单元格【英文标题】:Populating Excel multiple cells with data from Add-in user defined function (UDF) 【发布时间】:2017-06-27 17:32:22 【问题描述】:

我正在开发一个 Excel 加载项,它需要使用来自服务器的数据填充工作表中的一个或多个单元格。我做了以下操作:

    创建了一个插件 (xlam) 并创建了用户定义的函数: GetMyData() 我从一个简单的 Excel 工作表调用此函数。在 A1 单元格中,我输入了公式 =GetMyData() 我的服务器返回 JSON 数组。我能够解析 JSON,现在尝试使用从服务器获得的值填充 A1 和以下行。 (在这种情况下,我有 20 个值,所以我想填充 A1:A20 单元格)。

问题在于,根据 Microsoft KB,用户定义的函数只能更改活动单元格的值。 https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel 我还尝试运行下面的代码,仅将一个单元格更改为硬编码值:

ActiveWorkbook.Sheets("DataSheet").Cells(1, 1).Value = '12312'

仍然 - 出现异常。

有人可以帮忙解决这个问题吗?

【问题讨论】:

将其更改为 sub 并从按钮调用它。 让函数返回一个垂直数组,突出显示所有单元格,然后数组一次将公式输入到所有单元格中。 您可以使用下面答案中概述的数组公式,但您需要知道返回项目的最大数量是多少,以便您可以将公式填充到正确数量的单元格中.如果这在您的情况下不起作用,那么您需要找到不同的方法。 【参考方案1】:

让函数返回一个垂直数组。

例如:

Function GetMyData() As Variant()
Dim test() As Variant
test = Array(1, 2, 3, 4)
GetMyData = Application.Transpose(test)

End Function

然后突出显示您需要的所有单元格,顶部为活动单元格。

然后把这个公式放到公式栏中:

=GetMyData()

然后按 Ctrl-Shift-Enter 而不是 Enter 以数组输入公式。

如果你选择的多于数组返回的值,你会得到错误。


或者你也可以,使用数组返回,用this处理错误,正常进入,但每次放入单元格时都会运行函数。

把它放在第一个单元格中:

=IFERROR(INDEX(GetMyData(),ROW(1:1)),"")

然后复制/向下拖动直到出现空白

【讨论】:

【参考方案2】:

这是一个简单的例子:

Public Function cerial(d As Date)
    Dim bry(1 To 20, 1 To 1) As String
    For i = 1 To 20
        bry(i, 1) = CStr(d) & "_" & i
    Next i
    cerial = bry
End Function

它创建一个包含 20 个项目的数组。

在工作表中使用它有一个小技巧。

选择,比如说,E1E20。然后在编辑栏中点击,输入数组公式:

=cerial(TODAY())

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

注意:

在本例中,内部数组bry() 是二维的。

【讨论】:

以上是关于使用来自加载项用户定义函数 (UDF) 的数据填充 Excel 多个单元格的主要内容,如果未能解决你的问题,请参考以下文章

在另一个 UDF 中使用来自加载项的 UDF

使用用户定义的函数在 spark 中加入数据集时需要填充其他信息

通过xlwings UDF将数据框返回到excel

在条件格式中使用加载项中的 UDF

Apache Drill UDF:未找到函数签名的匹配项

如何使用 uniroot 解决数据框中的用户定义函数 (UDF)?