【问题标题】:VBA: How to change the value of another cell via a function?VBA:如何通过函数更改另一个单元格的值?
【发布时间】:2020-08-10 05:09:07
【问题描述】:

我是 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中显示指定的文本。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    是的,当然有可能。

    将此代码放入VBA编辑器的Module1中:

    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 根据其两个参数AB 计算矩形区域,并在右侧的单元格中返回结果。您可以轻松修改此示例函数。

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

    UDF 限制文档:https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel

    【讨论】:

    • 酷!我想Rectangle = "Hello world" 应该是UDF_RectangleArea = "Hello world",不是吗?
    • @vpprof 我没有得到你的评论。我看不到你引用的Rectangle = "Hello world"
    • 它在你的Function UDF_RectangleArea中,就在函数结束之前...
    • @vpprof 是的,你是对的。我已经在回答中纠正了它。谢谢。
    【解决方案2】:

    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
    

    【讨论】:

    • 啊哈,这也是一个不错的解决方案。谢谢@Charles,我很感激。 :-)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      那为什么不直接在 E6 中输入公式呢?这就是 Excel 逻辑:将公式放在您希望结果出现的位置。

      【讨论】:

      • 我正在创建一个长函数,它将返回两个结果。由于它是一个长函数并且结果只能计算一次,因此从不同的单元格调用它两次应该会降低显示结果时工作表的速度。但是,如果我的问题的答案是不可能的,我想,我会再添加一个参数来指定需要哪一个结果。
      猜你喜欢
      • 2020-12-14
      • 2021-12-30
      • 2020-11-28
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多