我试图在VBA中创建一个用户定义的函数,该函数执行一个范围内唯一值的计数。所以我使用Excel函数方法作为基础。
Excel函数如下所示:
{= SUM(1/COUNTIF(range,range))}
所以我在VBA中复制此代码的尝试如下:
Public Function f_COUNTDISTINCT(rng_range As Range)
With Application.WorksheetFunction
f_COUNTDISTINCT = .Sum(1 / .CountIf(rng_range, rng_range))
End With
End Function
我没有成功!我怀疑这是因为我需要告诉VBA做与数组公式等效的操作,但是我不确定如何做。我尝试使用方括号进行各种配置都无济于事。
我该怎么做?
注意:我了解使用其他方法(例如此处https://excelchamps.com/blog/count-unique-values-excel/#6)的更优雅方法,但是我想学习可以用来制作所使用方法的技术工作。预先谢谢你。
答案 0 :(得分:1)
如@SJR所述,您可以使用Evaluate方法...
Public Function f_COUNTDISTINCT(rng_range As Range)
With rng_range
f_COUNTDISTINCT = Evaluate("SUM(1/COUNTIF(" & .Address(External:=True) & ", " & .Address(External:=True) & "))")
End With
End Function
请注意,在此示例中,.Address
已设置为返回外部引用。这将使您可以在包含数据的表格之外的其他表格中输入公式。但是,如果您的范围包括空单元格/空单元格,则该函数将返回#DIV/0!
错误。要排除空白/空单元格,请尝试以下操作...
Public Function f_COUNTDISTINCT(rng_range As Range)
With rng_range
f_COUNTDISTINCT = Evaluate("SUMPRODUCT((" & .Address(External:=True) & "<>"""")/COUNTIF(" & .Address(External:=True) & "," & .Address(External:=True) & "&""""))")
End With
End Function
答案 1 :(得分:0)
不确定您可以那样做。一种替代方法是使用评估:
2019-01-01T00:00:00+0200