如何使用可变大小的数组输入创建自定义函数?

时间:2018-08-11 22:48:11

标签: excel vba excel-vba excel-formula

我对使用高级Excel还是陌生的,因此对于我误识别的任何内容,我都表示歉意。

在尝试自动化电子表格上收集的一些统计信息时,我希望能够定义一个自定义函数(通过名称定义或VBA函数),该函数可以使用不确定长度的数组来计算值。

当前,我可以复制粘贴并更改单元格值的功能如下:

=SUMPRODUCT((I46:I58="D")*(L46:L58<>"Anonymous"))+
 SUMPRODUCT((I46:I58="Throwaway")*(L46:L58="Anonymous"))

对于函数的每次使用,对数组的修改都不适合我要处理的数据量,因此,我想找到一种方法来拥有自动填充数组的名称定义(也许通过搜索I列中的特定值)或基于输入单元格填充行号的VBA函数。

我已经基于搜索各种功能尝试了几种不同的解决方案,但是我无法提出一个成功的组合。当每个函数运行的长度不同时,是否有更好的方法以编程方式填充数组值?

2 个答案:

答案 0 :(得分:0)

类似以下内容。您添加了其他信息,这些信息对于范围确定而言是不完整的。您可以使用Range.Find方法获取找到"Goal"的单元格,并获取该单元格的行号以确定范围的行尾。未知的是位于哪一列,以及如何确定范围开始的“输出行”

使用该信息,您将在下面的函数中使用该范围地址。

Option Explicit
Public Sub test()   
    Debug.Print Foo(Range("L46:L58"))
    Debug.Print Foo(Range("L46:L90"))   
End Sub

Public Function Foo(ByVal rng As Range) As Double
    rng.Parent.Evaluate ("SUMPRODUCT((" & rng.Address & "=""D"")*(" & rng.Address & "<>""Anonymous""))+SUMPRODUCT((" & rng.Address & "=""Throwaway"")*(" & rng.Address & "=""Anonymous""))")
End Function

答案 1 :(得分:0)

仍然不确定自己要寻找什么,但这是我最好的猜测:

Function Counts()

    Application.Volatile
    Const FORMULA As String = _
               "SUMPRODUCT(1*(I<r1>:I<r2>=""D""),1*(L<r1>:L<r2><>""Anonymous""))+" & _
               "SUMPRODUCT(1*(I<r1>:I<r2>=""Throwaway""),1*(L<r1>:L<r2>=""Anonymous""))"
    Dim clr As Range, f As Range, ws As Worksheet, rv, txt

    Set clr = Application.ThisCell '<< this is the cell holding the formula
    Set ws = clr.Parent            '<< the worksheet

    'find the first "Goal" in ColI
    Set f = ws.Range(ws.Cells(clr.Row, "I"), _
               ws.Cells(ws.Rows.Count, "I").End(xlUp)).Find(what:="Goal", lookat:=xlWhole)
    If Not f Is Nothing Then
        txt = Replace(FORMULA, "<r1>", clr.Row)
        txt = Replace(txt, "<r2>", f.Row)
        'Debug.Print txt
        rv = ws.Evaluate(txt)
    Else
        rv = "No Goal!"
    End If

    Counts = rv

End Function

看起来像这样:

enter image description here

黄色阴影单元格中有=COUNTS()