Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA:如何通过函数更改另一个单元格的值?_Vba_Excel - Fatal编程技术网

VBA:如何通过函数更改另一个单元格的值?

VBA:如何通过函数更改另一个单元格的值?,vba,excel,Vba,Excel,我是一个Excel VBA新手 如何通过用户定义的函数更改指定单元格的值?此代码有什么问题: Function Test(ByVal ACell As Range) As String ACell.Value = "This text is set by a function" Test := "Result" End Function 我的愿望是。。。当我在单元格E1中键入=Test(E6)时,Excel将在E6中显示指定的文本。Excel VBA将不允许用户定义的函数更改另一单元格

我是一个Excel VBA新手

如何通过用户定义的函数更改指定单元格的值?此代码有什么问题:

Function Test(ByVal ACell As Range) As String
  ACell.Value = "This text is set by a function"
  Test := "Result"
End Function

我的愿望是。。。当我在单元格E1中键入
=Test(E6)
时,Excel将在E6中显示指定的文本。

Excel VBA将不允许用户定义的函数更改另一单元格的值。
UDF唯一可以做的事情(除了一些小的例外)是将值返回到调用它的单元格。

那么为什么不在E6中键入公式呢?这就是Excel逻辑:将公式放在希望结果显示的位置。

VBA UDF可以用作数组函数,将结果返回到多个相邻单元格。 在E1和E2中输入公式,然后按Ctrl-Shift-Enter键创建多单元格数组公式。您的UDF将如下所示:

Public Function TestArray(rng As Range)
    Dim Ansa(1 To 2, 1 To 1) As Variant
    Ansa(1, 1) = "First answer"
    Ansa(2, 1) = "Second answer"
    TestArray = Ansa
End Function

是的,当然有可能

将此代码放入VBA编辑器的模块1中:

Function UDF_RectangleArea(A As Integer, B As Integer)
    Evaluate "FireYourMacro(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & A & "," & B & ")"
    UDF_RectangleArea = "Hello world"
End Function

Private Sub FireYourMacro(ResultCell As Range, A As Integer, B As Integer)
    ResultCell = A * B
End Sub
此示例UDF的结果在另一个相邻单元格中返回。用户定义函数
UDF_RectangleArea
根据其两个参数
A
B
计算矩形面积,并在右侧单元格中返回结果。您可以轻松地修改此示例函数

使用VBA函数可以绕过Microsoft对函数施加的限制。Evaluate仅从UDF中触发VBA宏。对单元格的引用由
Application.Caller
传递。玩得开心


UDF限制文档:

我正在创建一个长函数,它将返回两个结果。由于它是一个很长的函数,并且结果只能计算一次,因此从不同的单元格调用两次会降低显示结果时工作表的速度。但是,如果我的问题的答案是不可能的,我想,我会再添加一个参数,指定需要哪一个结果。啊哈,这也是一个很好的解决方案。谢谢@Charles,我很感激。:-)酷!我想
Rectangle=“Hello world”
应该是
UDF\u RectangleArea=“Hello world”
,不是吗?@vpprof我没有收到你的评论。我看不到您正在引用的
Rectangle=“Hello world”
。它在您的
函数UDF\u RectangleArea
中,就在函数结束之前…@vpprof是的,您是对的。我已在答复中更正了它。非常感谢。