Excel VBA:function代码不能访问工作表上的其他单元格

我正在用VBA for Excel编写一个内置函数。 我最终试图实现的是一个在工作表单元格内调用的excel函数,它在调用它的单元格下输出一系列数据点(如财务数据提供者的excel函数= BDP()彭博社)。 我不能预先指定输出范围,因为我不知道要输出多less个数据点。

问题似乎是,除了调用函数的单元之外,excel不允许您从函数内编辑表单上的单元格。

为了解决这个问题,我创build了一个简单的程序来隔离问题。

以下函数在Excel表格via = test(10)中调用时,应该在调用它的单元格下方产生一个从1到10的整数列表。

Function test(number As Integer) For i = 1 To number Application.Caller.Offset(i, 0) = i Next i End Function 

代码非常简单,但是在调用此公式的工作表中没有任何反应(有时候除了#Value错误)。 我已经尝试了其他几个规范的代码,例如:

 Function test(number As Integer) Dim tempRange As Range Set tempRange = Worksheets("Sheet1").Range(Application.Caller.Address) For i = 1 To number tempRange.Offset(i, 0) = i Next i End Function 

奇怪的是,在这最后一段代码中,命令“debug.print tempRange.address”确实打印出调用函数的地址。

这个问题似乎是从内部函数中更新工作表上的值。 请问任何人都可以提供一些指导,说明是否有可能通过不同的方法达到这个目的?

谢谢,J

用户定义的函数只允许改变它们input的单元格的值,因为Excel的计算方法是build立在这个假设上的。

绕过这个限制的方法通常涉及一些可怕的事情,例如caching你想要改变的结果和位置,然后在计算事件后重写它们,同时考虑任何可能的循环或无限循环。

最简单的解决scheme是将多单元arrays公式input到比您所需要的更多的单元格中。

但是,如果你真的需要这样做,我会build议看Govert的Excel DNA有一些数组resizerfunction。 调整Excel UDF结果的大小

考虑:

 Public Function test(number As Integer) Dim i As Long, ary() ReDim ary(1 To number, 1 To 1) For i = 1 To number ary(i, 1) = i Next i test = ary End Function 

select一个单元格块(在这种情况下从C1C10 ,并input数组:

 =test(10) 

在这里输入图像说明

数组公式必须使用Ctrl + Shift + Enterinput,而不仅仅是Enter键。