Excel VBA:在 UDF 中使用参数调用命名函数

Excel VBA: Calling Named Function with Parameters in UDF

提问人:user3113192 提问时间:11/8/2023 最后编辑:user3113192 更新时间:11/8/2023 访问量:55

问:

我的工作簿中有一个名为“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 但没有成功。

VBA 自定义函数-Excel Excel-UDF

评论

0赞 Notus_Panda 11/8/2023
看看 Chris 关于在 VBA 中使用命名 lambda 函数的回答。你对评估的看法是对的,但一定在这个过程中出了什么问题。

答:

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)))
)

下面是一个迷你示例:

enter image description here

更明确地说,新函数 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 辅助函数当然很有用。