从函数中设置单元格值

然后单元格A1内容是=test(2)其中test是函数:

 Function test(ByRef x As Double) As Double Range("A2") = x test = x * x End Function 

你能解释为什么这给了#VALUE! 在单元格A1和单元格A2没有任何内容? 我期望A2包含2A1包含4 。 没有行Range("A2") = x该函数按预期工作(平方单元的值)

真正让我困惑的是,如果你用子程序calltest包装test ,那么它工作:

 Sub calltest() t = test(2) Range("A1") = t End Sub Function test(ByRef x As Double) As Double Range("A2") = x test = x * x End Function 

但是这不是

 Function test(ByRef x As Double) As Double Range("A2") = x End Function 

当您从工作表单元格中调用某个函数时,您正在将该函数有效地用作用户定义函数,具有如下所述的限制:

http://support.microsoft.com/kb/170787

在文中有一行:

任何环境变化都应该通过使用Visual Basic子程序来完成。

他们如何使用这个词而不是一定要有趣。 我想知道KB的作者是否知道可以从VBA函数中发生环境变化。

现在,当您从另一个VBA Sub / Function调用该函数时,它将被区别对待。 从帮助文档(对不起,我无法find一个网页参考 – 基本上,在VBE中,突出显示function,然后按F1):

就像一个Sub过程一样,一个Function过程是一个独立的过程,可以接受参数,执行一系列的语句,并且改变参数的值。 但是,与Sub过程不同的是,如果要使用函数返回的值,则可以像使用Sqr,Cos或Chr等任何内部函数一样,在expression式的右侧使用Function过程。

所以这听起来像子和function可以做同样的事情,只有在VBA使用,除了函数可以返回值调用函数/子。

这实际上很有趣,因为Excel可以通过对Excel环境的某种“只读”限制来调用函数。

我认为,最后,Excel可以以不同于VBA的方式从工作表单元调用函数。 当你从一个单元格调用它时,它被认为是一个用户定义的函数,它包含了改变Excel环境的限制。 从VBA内调用的地方(从VBA调用原始调用者的地方),它具有Sub所有的function,再加上它可以返回值。

由于Function基本原理,它说明你不能改变或设置工作表单元格。 您需要删除Range("A2") = x

编辑一些额外的链接(我相信总是有用的提供给那些想要分析UDF主题的人): 由Microsoft创build自定义函数