【问题标题】:How to count matches in two columns and reset counter?如何计算两列中的匹配项并重置计数器?
【发布时间】:2017-02-16 20:18:10
【问题描述】:

这是我之前的数据:

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

计数器出了点问题,但我不知道是什么。

【问题讨论】:

  • 您对非 VBA 解决方案感兴趣吗?

标签: vba excel


【解决方案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

【讨论】:

    【解决方案2】:

    一些 SQL 怎么样:

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

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

    一个类似的例子here,和一些ADO的参考可以在here找到。

    【讨论】:

    • 做到了。我知道是这样的,但我走错了路,无法靠自己恢复一切。谢谢!!
    【解决方案3】:

    你可以使用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
    

    【讨论】:

    • 哇!很酷!我从来不知道你可以用 VBA 做到这一点!谢谢分享!!!
    • 好吧,我想我会从 YowE3K 运行那个,只是因为我更了解逻辑。不过我真的很感谢你的努力!!看看完全不同的方法如何获得完全相同的结果,这绝对很有趣!
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多