我对使用高级Excel还是陌生的,因此对于我误识别的任何内容,我都表示歉意。
在尝试自动化电子表格上收集的一些统计信息时,我希望能够定义一个自定义函数(通过名称定义或VBA函数),该函数可以使用不确定长度的数组来计算值。
当前,我可以复制粘贴并更改单元格值的功能如下:
=SUMPRODUCT((I46:I58="D")*(L46:L58<>"Anonymous"))+
SUMPRODUCT((I46:I58="Throwaway")*(L46:L58="Anonymous"))
对于函数的每次使用,对数组的修改都不适合我要处理的数据量,因此,我想找到一种方法来拥有自动填充数组的名称定义(也许通过搜索I列中的特定值)或基于输入单元格填充行号的VBA函数。
我已经基于搜索各种功能尝试了几种不同的解决方案,但是我无法提出一个成功的组合。当每个函数运行的长度不同时,是否有更好的方法以编程方式填充数组值?
答案 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
看起来像这样:
黄色阴影单元格中有=COUNTS()