为什么我的 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
我试图在 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