【问题标题】:Apply a scalar VBA function to each cell in an array将标量 VBA 函数应用于数组中的每个单元格
【发布时间】:2020-10-13 13:17:09
【问题描述】:

我有一个执行数值计算的 VBA 函数,例如:

Function MyFunc(ByVal x As Double, ByVal a As Double) As Double
    MyFunc = x + a
End Function

我想使用工作表公式将此函数应用于数组并对值求和。比如在单元格B1我想输入:

=SUM(MyFunc(A1#, 2))

同义(如果A1#是动态数组A1:A3):

=SUM(MyFunc(A1,2), MyFunc(A2,2), MyFunc(A3,2))

我是否可以不必在我的 VBA 函数中显式编写数组循环来执行此操作?

【问题讨论】:

  • 我不这么认为...一旦您将数组作为第一个参数传递,您就会得到类型不匹配。
  • @FaneDuru,“UDF 函数不能在其计算中使用目标单元格值”是什么意思?上述函数适用于单个单元格(而不是数组)。
  • @BigBen,如果我尝试,我确实会遇到错误。但是,如果我使用内置函数而不是 MyFunc,那么它可以工作。我可以将 MyFunc 更改为循环 x 并返回一个数组,但我有几个这样的函数,如果可能的话,我希望避免在每个函数中重复样板循环。
  • 因为内置函数是用来处理数组的。
  • @BigBen:Upsss。他是对的,那么……

标签: arrays excel vba excel-formula


【解决方案1】:

如果您想将溢出传递给 UDF,您可以将其作为 Range 传递:

Function MyFunc(x As Range, a As Double)
    Dim L As Long, U As Long, arr, i As Long
    Dim r As Range
    L = 1
    U = x.Count
    ReDim arr(L To U)

    For i = L To U
        arr(i) = x(i) + a
    Next i
    MyFunc = arr
End Function

所以在单元格 C1 的工作表中,我们输入:

=myfunc(A1#,8)

如您所见,它溢出了,在 C2 中我们输入:

=SUM(myfunc(A1#,8))

如您所见,我们给它一个Range;它返回一个ArraySUM() 可以轻松处理。

【讨论】:

    【解决方案2】:

    您可以将 Evaluate 与 range 结合使用:

    Function MyFunc1(x As Range, ByVal a As Double) As Variant
        MyFunc1 = Application.Evaluate("(" & x.Address & "+" & a & ")")
    End Function
    

    并直接求和:

    Function MyFunc1(x As Range, ByVal a As Double) As Variant
        MyFunc1 = Application.Evaluate("SUM(" & x.Address & "+" & a & ")")
    End Function
    

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2017-01-21
      • 2017-04-02
      • 1970-01-01
      • 2013-10-13
      • 2017-12-09
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多