独特的计数(Excel VBA vs公式)更快的方法

64位Win7工作表上的32位Excel 365 300600行x 105列目标:计算每列中唯一条目的数量

试图解决scheme1:公式

{=SUM(1/COUNTIF(A8:A300600,A8:A300600))} 

问题:长时间运行,冻结Excel,必须停止计算

尝试解决scheme2:VBA UDF

 Function UniqueCount(Selection As Range) As Integer Dim UniqueArray() ReDim UniqueArray(0 To Selection.Count) Dim Rng As Range Dim CUniqueCount As Integer CUniqueCount = 0 For Each Rng In Selection For i = 0 To Selection.Count If UniqueArray(i) = Rng.Value Then Exit For If UniqueArray(i) = "" Then UniqueArray(i) = Rng.Value CUniqueCount = CUniqueCount + 1 Exit For End If Next i Next UniqueCount = CUniqueCount End Function 

注意:这是更快,但我仍然在寻找更快的方法

尝试这个

 'Set a reference to MS Scripting runtime ('Microsoft Scripting Runtime') Function UniqueCount(SelRange As Range) Dim Rng As Range Dim dict As New Scripting.Dictionary Set dict = CreateObject("Scripting.Dictionary") For Each Rng In SelRange If Not dict.Exists(Rng.Value) Then dict.Add Rng.Value, 0 End If Next Rng UniqueCount = dict.Count Set dict = Nothing End Function 

我会使用一个数组以及字典:

 Public Function CountUnique(rngInput As Range) As Double Dim rngCell As Range Dim dData As Object Dim vData Dim x As Long Dim y As Long Set dData = CreateObject("Scripting.Dictionary") vData = rngInput.Value2 For x = LBound(vData, 1) To UBound(vData, 1) For y = LBound(vData, 2) To UBound(vData, 2) If LenB(vData(x, y)) <> 0 Then dData(CStr(vData(x, y))) = Empty Next y Next x CountUnique = dData.Count End Function