Excel中的SELECT(DISTINCT COUNT)

时间:2012-03-26 17:20:05

标签: excel excel-vba excel-formula vba

我在T-SQL上做了很多努力,但我想在Excel VBA上实现相同的功能。怎么做到这一点?我的表单上有一个名为“Stops”的字段,该字段与卡车在下达订单时所生成的停靠点有关。我想计算停站总数。 1个停止可以有多个订单交付。停止栏上的数据类似于:

Order#  Stops
1527305 1
1527305 1
1529418 2
1529418 2
1527299 3
1527299 3
1528894 5
1528894 5
1529529 6
1529529 6
1529518 7
1529518 7
1527522 8
1527522 8

所以,最终的计数应该是7个独特的停止点。当前代码查看最后一行并将其作为总停止(这是错误的)。我现在的代码如下:

    ActiveCell.Offset(0, 7).Select  ' H = stop number
    Selection.Value = curStop 'sets stop number
        If Selection.Value = 0 Then
            ActiveCell.Offset(-1, 0).Select
            curStop = ActiveCell.Value
            ActiveCell.Offset(1, 0).Select
            Selection.Value = curStop
        End If

我在T-SQL上用一行代码做了一些事情,但不知道如何在Excel上执行此操作。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

您也可以尝试

=SUM(IF($B$2:$B$15,1/COUNTIF($B$2:$B$15,$B$2:$B$15)))

作为数组公式解决方案,假设您的数据在B2:B15中。当然,使用Ctrl + Shift + Enter输入数组公式,而不是输入,所以也许你的解决方案稍微好一些:)

也不应该问你答案是 7 停止,而不是 5 ???

答案 1 :(得分:1)

您已经有了基于公式的解决方案,这可能是您希望在这种情况下使用的解决方案 如果您对使用VBA解决问题的方法感到好奇,请继续阅读。

对于识别唯一值的问题,字典可以是适当的数据结构 特别是,您可以在添加密钥之前检查密钥的存在 测试的例子如下:

(请注意:您必须启用(选中复选框)工具>参考>“Microsoft脚本运行时”。)

Option Explicit

Function uniq_dict(ByRef row As Long, ByRef col As Long)
    Dim dict As New Scripting.Dictionary
    Dim ws As Worksheet
    Set ws = ActiveWorkbook.Sheets("Sheet1")

    For row = 1 To ws.Cells(Rows.Count, col).End(xlUp).row
        If Not dict.Exists(ws.Cells(row, col).Value) Then
            dict.Add ws.Cells(row, col).Value, Null '# can insert something here 
        End If
    Next row

    Set uniq_dict = dict
End Function

Sub call_uniq_dict()
    Dim i As Integer
    Dim k() As Variant
    Dim dict As New Scripting.Dictionary
    Set dict = uniq_dict(1, 1)

    Debug.Print "total items in dict:", dict.Count
    k = dict.Keys
    For i = 0 To dict.Count - 1
        Debug.Print "  dict key:", k(i)
    Next
End Sub

结果:

total items in dict:         5 
  dict key:    1 
  dict key:    2 
  dict key:    3 
  dict key:    7 
  dict key:    8