1

我正在编写一个用户定义函数(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). 我怎么能那样做?

有用的评论: “单元格 B5 比 B4 和 B3 具有更好的值”意味着,例如,在 B3 中,您具有 12 个月前计算的预测值。在单元格 B5 中,您有有效值和测量值。因此,当您拥有 B5 时,您不再需要 B3,因为“B5 比 B3 更好”

4

4 回答 4

1

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

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

那你可以试试这样...

=get_best(B3:B5)
于 2017-04-04T08:15:49.057 回答
1

您可以避免以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
于 2017-04-04T08:23:20.367 回答
1

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

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

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
于 2017-04-04T08:24:21.840 回答
1

如果最佳值始终位于 a 的底部,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
于 2017-04-04T08:30:16.003 回答