2015-11-04 19 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 
相關問題