使用加载项用户定义函数(UDF)

时间:2017-06-27 17:32:23

标签: excel vba excel-vba ms-office office-interop

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

  1. 创建了一个加载项(xlam)并创建了用户定义的函数: GetMyData()
  2. 我从一个简单的Excel工作表调用此函数。在A1单元格中,我输入了公式= GetMyData()
  3. 我的服务器返回JSON数组。我能够解析JSON,现在尝试使用从服务器获取的值填充A1和以下行。 (在这种情况下,我有20个值,所以我想填充A1:A20单元格。)
  4. 问题在于,根据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'
    

    仍然 - 获得例外。

    任何人都可以帮助解决这个问题吗?

2 个答案:

答案 0 :(得分: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个项目的数组。

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

选择 E1 E20 。然后单击公式栏并输入数组公式:

=cerial(TODAY())

enter image description here

必须使用 Ctrl + Shift + 输入输入

数组公式,而不仅仅是 Enter 键。如果这样做得当,公式将显示在公式栏的括号中。

注意:

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

答案 1 :(得分:2)

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

例如:

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

End Function

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

![enter image description here

然后将此公式放在公式栏中:

=GetMyData()

然后按Ctrl-Shift-Enter而不是Enter to array输入公式。

enter image description here

如果您选择的数字超过数组返回,则会出现错误。

或者您可以使用Array返回,使用它来处理错误并正常输入,但每次将它放入单元格时都会运行该函数。

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

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

然后复制/向下拖动直到你得到空白

enter image description here