2017-02-16 77 views
0

这里是我的数据之前:如何计算两列中的匹配并重置计数器?

A Ron 
A Ron 
B Jeremy 
C Jeremy 
C Teddy 
C Teddy 
C Teddy 
D George 
D George 

这是我想看到后:

A Ron 2 
B Jeremy 1 
C Jeremy 1 
C Teddy 3 
D George 2 

这里是我的非工作脚本:

Sub Macro() 
i = 1 
Dim lngRow As Long 
For lngRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1 
If Range("A" & lngRow) = Range("A" & lngRow - 1) And _ 
    Range("B" & lngRow) = Range("B" & lngRow - 1) Then 
     i = i + 1 
     Range("C" & lngRow - 1).Value = i 
    Rows(lngRow).Delete 
End If 
Next 
i = 1 
End Sub 

东西是关闭与柜台,但我不知道它是什么。

+1

你有兴趣在非VBA的解决方案? – CallumDA

回答

1

你(二)i = 1是在错误的地方 - 你需要每一个存在的 “钥匙” 发生变化时,复位i

Sub Macro() 
    i = 1 
    Dim lngRow As Long 
    For lngRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1 
     If Range("A" & lngRow) = Range("A" & lngRow - 1) And _ 
      Range("B" & lngRow) = Range("B" & lngRow - 1) Then 
      i = i + 1 
      Range("C" & lngRow - 1).Value = i 
      Rows(lngRow).Delete 
     Else 
      i = 1 
      'Also need to set the previous "total" here, just in case 
      'it is the only record for this "key" 
      Range("C" & lngRow - 1).Value = i 
     End If 
    Next 
End Sub 
1

怎么样SQL:

SELECT F1, F2, COUNT(*) 
FROM [SheetName$] 
GROUP BY F1, F2 

使用ADO连接到Excel工作表,并使用CopyFromRecordset将结果粘贴到新工作表中。

一个类似的例子here,和一些对ADO的引用可以找到here

+0

这样做。我知道这就是这样的事情,但我开始走错了路,无法自己恢复。谢谢!! – ryguy72

1

你可以使用Dictionary对象:

Sub Main() 
    Dim cell As Range, dataRng As Range 

    Set dataRng = Range("A1").CurrentRegion 
    With CreateObject("Scripting.Dictionary") 
     For Each cell In dataRng.Columns(1).Cells 
      .Item(Join(Application.Transpose(Application.Transpose(cell.Resize(, 2).Value)), "|")) = .Item(Join(Application.Transpose(Application.Transpose(cell.Resize(, 2).Value)), "|")) + 1 
     Next cell 
     dataRng.ClearContents 
     dataRng.Columns(1).Resize(.Count).Value = Application.Transpose(.keys) 
     dataRng.Columns(1).Resize(.Count).TextToColumns DataType:=xlDelimited, Other:=True, OtherChar:="|" 
     dataRng.Columns(3).Resize(.Count).Value = Application.Transpose(.Items) 
    End With 
End Sub 
+0

哇!很酷!我从来不知道你可以用VBA做到这一点!感谢分享!!! – ryguy72

+0

不客气。那么你采用了哪种解决方案? – user3598756

+0

嗯,我想我会运行YowE3K中的一个,只是因为我更好地理解逻辑。尽管我非常感谢你的努力!看到完全不同的方法可以得到完全相同的结果是非常有趣的! – ryguy72