具有无限参数的 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
我正在编写一个用户定义函数 (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