具有无限参数的 UDF

UDF with infinite parameters

我正在编写一个用户定义函数 (UDF),它将一些单元格作为参数。 这些单元格包含相同的数据,但精度级别不同;该函数显示可用的最佳精度。

函数的自变量按照精度从小到大的顺序书写

这是一个例子:

+---+-----------------+---------------------+
|   |        A        |          B          |
+---+-----------------+---------------------+
| 1 | Best            | =get_best(B5;B4;B3) |
| 2 |                 |                     |
| 3 | provisional     | 1                   |
| 4 | definitive      | 2                   |
| 5 | etched in stone | 12                  |
+---+-----------------+---------------------+

函数显示12,因为单元格B5中的信息比B4和B3的值更好。因此,在公式参数中,B5 写在 B4 和 B3 之前。

我的UDF代码如下:

Public Function get_best(r1 As Range, r2 As Range, r3 As Range) As Variant

    get_best = ""

    If r3.Value <> "" Then get_best = r3.Value Else
    If r2.Value <> "" Then get_best = r2.Value Else
    If r1.Value <> "" Then get_best = r1.Value

End Function

有效!但我想对其进行编辑,以便它可以像 =get_best(B7;B6;B5;B4;B3) 这样需要无限的 agoument。 我该怎么做?

有用的评论: "cell B5 has a better value than the B4 and B3" 表示,例如,在 B3 中,您拥有 12 个月前计算的预测值。在单元格 B5 中,您有有效值和测量值。所以当你有了 B5 就不再需要 B3 因为 "B5 is better than B3"

根据您展示的示例,这对您不起作用吗?

Public Function get_best(ByVal Rng As Range) As Variant
    get_best = Application.Max(Rng)
End Function

那你可以这样试试...

=get_best(B3:B5)

您可以避免以这种方式传递任何 range 参数

Public Function get_best() As Variant
    get_best = Cells(Rows.Count, Application.Caller.Column).End(xlUp).Value
End Function

而如果您必须指定一个(连续的)范围,您可以按如下方式操作:

Public Function get_best(r As Range) As Variant
    With r
        If WorksheetFunction.CountA(.Cells) > 0 Then get_best = .Cells(.Rows.Count + 1).End(xlUp).Value
    End With
End Function

我不知道你所说的 "cell B5 has a better value than the B4 and B3" 是什么意思。您的代码会查看哪个单元格包含从参数中的最后一个单元格开始的值。

您可以使用 paramarray 添加任意数量的范围:

Public Function get_best(ParamArray Ranges()) As Variant

    Dim x As Long

    For x = UBound(Ranges) To LBound(Ranges) Step -1
        If Ranges(x) <> "" Then
            get_best = Ranges(x).Value
            Exit For
        End If
    Next x

End Function

如果 best 值始终位于 Range 的底部,但您不确定要搜索的列中的行数,您可以使用这个:

Public Function get_best(rng As Range) As Variant

    Dim lngLastRow As Long

    lngLastRow = rng.Parent.Cells(rng.Parent.Rows.Count, rng.Column).End(xlUp).Row
    get_best = rng.Parent.Cells(lngLastRow, rng.Column).Value

End Function