【问题标题】:In Excel VBA, how do I write a function that can work in an array formula?在 Excel VBA 中,如何编写可以在数组公式中工作的函数?
【发布时间】:2018-02-18 21:07:01
【问题描述】:

在 Excel VBA 中,我知道我可以在多个单元格上使用数组公式,方法是选择 Col C 的一系列单元格,然后执行 =A1:10*B1:B10 Ctrl-shift-enter。

但假设我希望它不是乘法运算符,而是我的 mymult。

如何编写 mymult 函数?

Function MyMult(a As Integer, b As Integer)
  MyMult = a * b
End Function

我所拥有的东西不起作用

【问题讨论】:

  • 您的预期输出是什么? (1*2)*(1*3)*(1*4) = 24?
  • 您的示例不够充分,因为满足要求的最佳方法是将=a1*b1 放在C1 中,然后双击填充句柄。
  • 还有,当您希望将ab 用作Range 时,为什么还要将它们声明为Integer
  • 还有=SUMPRODUCT(A1:10,B1:B10)
  • @BruceWayne 你问我的预期结果是否是一个数字,它们的乘积。不,这不是一个数字。我说这是多个单元格的数组公式。那是您在执行 ctrl-shift-enter 之前选择多个单元格的地方

标签: excel vba


【解决方案1】:

将参数声明为变体。然后使用Application.Caller.HasArray检查UDF是否作为数组公式使用:

Public Function MyMult(a, b)
  If Application.Caller.HasArray Then
    Dim valsA(), valsB(), r&
    valsA = a.Value
    valsB = b.Value

    For r = LBound(valsA) To UBound(valsA)
      valsB(r, 1) = valsA(r, 1) * valsB(r, 1)
    Next

    MyMult = valsB
  Else
    MyMult = a * b
  End If
End Function

请注意,您需要在按 CTRL + SHIFT + ENTER 之前选择 C1:C3。

【讨论】:

  • 哦,酷,我从来不知道HasArray 的事情。好主意,我必须记住这一点。
  • 有没有办法让数组公式知道并响应特定的行?因此,例如,对于 multiply 函数不仅要将它们相乘,还要根据它是哪一行来附加到结果中,例如i.imgur.com/cITiW6Q.png
  • 数组公式在一次调用中处理所有行并将结果返回到数组中。所以是的,这是可能的。在此示例中,r 是行的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2022-01-22
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多