如何计算两列中的匹配并重置计数器?

时间:2017-02-16 00:25:10

标签: vba excel-vba excel

以下是我的数据:

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

柜台上有些东西已关闭,但我不知道它是什么。

3 个答案:

答案 0 :(得分: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 :(得分:1)

一些SQL怎么样:

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

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

可以找到类似的示例here,并且可以找到对ADO的一些引用{。{3}}。

答案 2 :(得分: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