2017-08-01 81 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