2015-11-04 13 views
0

32位的Excel 365上64位的Win7 工作表300600排x 105列 目标:计算在每个Column唯一计数(Excel的VBA VS式)更快的方法

尝试的解决方案1的唯一条目的数量:式

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

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

尝试性解决方案2: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 

注:这是速度更快,但我仍然在寻找更快的接近

+0

您是否试过数据模型的数据透视表? – pnuts

+0

我还没有,我这样做的原因是为了将数据集分解成更小的表格,以便上传到我的访问数据库中 - 数据集对于访问的内存限制太大而无法在内部中断。我想我也会通过数据透视表来达到这些限制。当在所有105列中应用公式化方法时,我遇到了同样的限制。 – Schalton

+0

我相信PowerPivot也许能够应付,包括计数和肢解。 – pnuts

回答

0

试试这个

'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 
+0

有趣的是,事后直观地看,计算的持续时间更多地依赖于找到的唯一匹配的数量,因为嵌套迭代复合了选择迭代,所以当UDF的数量很少时,UDF的表现非常相似,但是您的执行当有大量的唯一值时,效果会更好 - 谢谢! – Schalton

1

我会使用数组以及词典:

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 
相关问题