为什么我的 VBA UDF 不工作?

Why is my VBA UDF to count distinct not working?

我试图在 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,但是我想学习我可以用来制作我的方法的技术'我正在使用工作。提前谢谢你。

不确定您是否可以那样做。另一种方法是使用 Evaluate:

Public Function f_COUNTDISTINCT(rng_range As Range)

f_COUNTDISTINCT = Evaluate("Sum(1 / CountIf(" & rng_range.Address & "," & rng_range.Address & "))")

End Function

正如@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 已设置为 return 外部引用。这将允许您在 sheet 中输入公式,而不是包含数据的公式。但是,如果您的范围包含 empty/blank 个单元格,该函数将 return 出现 #DIV/0! 错误。要排除 empty/blank 个单元格,请尝试以下操作...

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