从函数中设置单元格值
然后单元格A1
内容是=test(2)
其中test
是函数:
Function test(ByRef x As Double) As Double Range("A2") = x test = x * x End Function
你能解释为什么这给了#VALUE!
在单元格A1
和单元格A2
没有任何内容? 我期望A2
包含2
和A1
包含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自定义函数