为什么我要计数的VBA UDF不起作用?

时间:2019-07-04 14:47:12

标签: excel vba count user-defined-functions distinct-values

我试图在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)的更优雅方法,但是我想学习可以用来制作所使用方法的技术工作。预先谢谢你。

2 个答案:

答案 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