2017-08-01 45 views
0

這對我而言是新的。我試圖計算我的ws中有多少個不同的值,問題在於相同的值重複多次,我只想計算一次。有些朋友試圖幫助我處理代碼,但我現在有點迷路了,例如我不知道爲什麼我要使用某個函數,或者爲什麼我必須將「Option Explicit」放在它的上面,任何想法是受歡迎的。在Excel工作表列中計算唯一值

Option Explicit  

Function CountUnique(datarange As Range) 
Dim datarange 
Dim CheckCell 
Dim Counter As Double 
Counter = 0 

For Each CheckCell In datarange.Cells 
    Counter = Counter + (1/(WorksheetFunction.CountIf(datarange, CheckCell.Value))) 
Next 

CountUnique = Counter 

End Function 
+0

您可以通過創建數據透視表實現。如果您確定VBA是唯一的方法,那麼請通過ADODB(工作簿應保存在驅動器中)或循環內的字典來查看SQL Distinct與聚合函數等解決方案。 – omegastripes

回答

0

選項說明時明確,你必須明確聲明所用的所有變量。通過使用Dim和Redim,這可以讓你的代碼更容易被調試。

至於爲什麼它是一個函數,這取決於編碼器。你也可以在子宏中完成你想要做的事情。通過給它一個變量來調用一個函數。在較大的程序中,這可以大大組織事情。

下面是該函數的子調用示例。

Option Explicit 

Function CountUnique(datarange As Range) 
Dim CheckCell 
Dim Counter As Double 
Counter = 0 

For Each CheckCell In datarange.Cells 
    Counter = Counter + (1/(WorksheetFunction.CountIf(datarange, CheckCell.Value))) 
Next 

CountUnique = Counter 
Msgbox Counter 
End Function 

通過運行測試(),它會調用該函數

Sub test() 
    Dim rag As Range 
    Set rag = Range("A1:A23") 
    Call CountUnique(rag) 
    End Sub 
+0

它的工作,只需要改變一些東西。比如設置一個範圍並選擇一個單元格來打印結果而不是顯示一個味精。非常感謝。現在我正在努力加快速度,但恐怕我不能做太多事情。 –

0

如何:

Option Explicit 

Function CountUnique(datarange As Range) As Long 
    Dim c As Collection, r As Range 
    Set c = New Collection 
    On Error Resume Next 
     For Each r In datarange 
      c.Add r.Value, CStr(r.Value) 
     Next r 
    On Error GoTo 0 
    CountUnique = c.Count 
End Function 

enter image description here