提问人:user3113192 提问时间:11/8/2023 最后编辑:user3113192 更新时间:11/8/2023 访问量:55
Excel VBA:在 UDF 中使用参数调用命名函数
Excel VBA: Calling Named Function with Parameters in UDF
问:
我的工作簿中有一个名为“ReadRaw”的命名函数,其中包含两个输入参数,使用 lambda 进行 2D 索引匹配查找,定义如下:
=LAMBDA(runPoint,header,INDEX(Sheet1!$A:$X),XMATCH(runPoint,Sheet1!$A:$A),2,XMATCH(header,Sheet1!$4:$4"),2)
当在单元格中定义时,它按预期工作,如下所示:
=ReadRaw(C4,C2)
我想使用该函数来计算“ReadRaw”的多次调用的平均值,避免使用如下所示的公式,因为我对第二个参数的输入范围会更大。
=AVERAGE(ReadRaw(C4,C2), ReadRaw(C4,D2), ReadRaw(C4,E2))
通话不起作用。我尝试创建一个新的命名函数“AverageReadRaw”,但没有成功:=AVERAGE(ReadRaw(C4,C2:D2)
=LAMBDA(runPoint,header,AVERAGE(ReadRaw(runPoint,header)))
因此,我的下一个想法是在 VBA 中创建一个 UDF,它遍历输入范围并在每个单元格上调用“ReadRaw”并计算平均值。是否可以从 VBA 调用命名函数?
Function AverageReadRaw(runPoint As Long, header As Range) As Variant
Dim RangeLength As Integer
Dim productVal As Long
RangeLength = header.Count()
productVal = 0#
' Run the RearRaw formula for each value in the range
For Each i In header
productVal = productVal + **ReadRaw(runPoint, i)**
AverageReadRaw = productVal / RangeLength
End Function
ReadRaw 调用是我不确定如何定义的。我尝试过 Evaluate、CallByName、Application.Run 但没有成功。
答:
0赞
Paul
11/8/2023
#1
您可以使用 Evaluate() 从 VBA 调用命名公式。但是,您需要获取命名公式并添加参数以形成单个字符串。例如:
productVal = productVal + Evaluate("ReadRaw(" & Cstr(runPoint) & "," & Cstr(i.value) &")")
这将创建一个类似于“ReadRaw(9,3)”的字符串,然后 Evaluate 函数可以计算该字符串。
2赞
Tom Sharpe
11/8/2023
#2
回过头来,如果你想从你的工作表中调用一个数组,你必须允许它处理你的函数定义中的数组。因此,要允许它的标头部分是一个数组,你的 lambda 的主体可以是:
=MAP(
header,
LAMBDA(c, INDEX(Sheet1!$A:$X, XMATCH(runpoint, Sheet1!$A:$A, 2), XMATCH(c, Sheet1!$4:$4, 2)))
)
下面是一个迷你示例:
更明确地说,新函数 ReadRaw2 在名称管理器中显示为
=LAMBDA(runpoint,header,MAP(header, LAMBDA(c, INDEX(Sheet1!$A:$X, XMATCH(runpoint, Sheet1!$A:$A, 2), XMATCH(c, Sheet1!$4:$4, 2)))))
评论
0赞
user3113192
11/8/2023
这正是我所追求的,谢谢!如果可能的话,我希望避免使用VBA,而“MAP”功能是我不知道的缺失环节。
0赞
Tom Sharpe
11/9/2023
很高兴它有所帮助,lambda 辅助函数当然很有用。
上一个:拉取数据问题
评论