2012-03-26 291 views
0

我已经在T-SQL上做了很多工作,但我想在Excel VBA上实现它。如何实现这一目标?我在我的工作表上有一个名为“停止”的字段,它与卡车在执行订单时制造的停靠点有关。我想统计总站数。 1站可以有多个订单交付。在停止列中的数据是这样的:Excel中的SELECT(DISTINCT COUNT)

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中。任何帮助将不胜感激。谢谢!!

+0

好。我找到了答案,因此我想在此发布。我可以使用频率函数来计算停止的不同值,它给了我正确的结果。 这里是一个衬里代码(该范围可被调整) = SUM(N(FREQUENCY(H177:H190,H177:H190)> 0)) 我发现了以下网页上的代码: [HTTP ://www.cpearson.com/excel/duplicates.aspx] [1] [1]:http://www.cpearson.com/excel/Duplicates.aspx – rvphx 2012-03-26 17:40:06

回答

1

还可以尝试

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

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

也不应该你的问题说的答案是停止,并且不是 ???

+0

我的坏..我在看一个不同的数据集! – rvphx 2012-03-26 18:06:26

+0

不是问题:)...它实际上让我难倒了,否则我会更早地发布答案! – playercharlie 2012-03-26 18:23:18

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

谢谢伯尼。现在我遇到了另一个问题。我想插入一个函数(计算不同的值)在一个工作表中有路线的小计。因此,实际上数据看起来像 Route1 订单#停止# Route2 订单#停止 如何在每个小计级别插入函数?我正在考虑在插入小计时根据空白单元格制作动态范围。有任何想法吗? Route1 – rvphx 2012-03-26 20:08:34

+0

@RajivVarma:你很受欢迎。看起来你已经转移到另一个问题。你能否考虑发布一个新问题?谢谢。 – bernie 2012-03-26 20:11:55

+0

完美。路上的新问题。将很快发布链接。 – rvphx 2012-03-26 20:31:23