我有以下代码,用于计算包含字符串"ABC-QR"的列中的单元格数量:

Ctr = Application.WorksheetFunction.CountIf(Sheet1.Range("D4:D1500"), "*ABC-QR*")
EU.Cells(16, 3) = Ctr


我使用"ABC-QR"是因为这是数据不变的部分。这些单元格中的真实数据是例如"ABC-QR00012345"或它可能具有的任何数字。我想修改我的代码,使其在计数时不包含重复项。

最佳答案

首先,您必须在Visual Basic编辑器的“工具->引用”中启用“ Microsoft脚本运行时”。


您将工作表中的数据分配到数组中;然后将符合字符串条件且不是重复项的所有内容导入dictionary。您可以使用.Exists method检查词典中的重复项。

编辑:正如@Zev在评论中指出的那样,您甚至不需要使用.Exists方法。您可以只将array元素分配给字典的键,然后将item值分配为1。Array中的任何重复值都将覆盖前一个键,因此重复项将被自动处理。

将所有不重复的内容导入字典后,即可使用字典上的.Count属性。这将告诉您在传递给数组的范围内,有多少条记录符合您的字符串条件,并且不是重复记录。

Option Explicit
Sub countNonDuplicates()
    Dim wb As Workbook, ws As Worksheet
    Dim dict As Scripting.Dictionary
    Dim myValues() As Variant
    Dim lRow As Long, i As Long

    Set wb = ThisWorkbook
    Set ws = wb.Sheets(1)
    Set dict = New Scripting.Dictionary
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    myValues = Range(Cells(1, 1), Cells(lRow, 1))

    For i = 1 To UBound(myValues, 1)
        If InStr(myValues(i, 1), "ABC-QR") Then dict(myValues(i,1)) = 1 'arbitrary value
    Next i
    MsgBox (dict.Count)
End Sub


上面的代码当前获取Column A的最后一行,然后获取范围并将其分配给数组。如果您希望使用其他列,请使用所需的列号更新以下语句(下面的示例现在使用Column D

lRow = Cells(Rows.Count, 4).End(xlUp).Row
myValues = Range(Cells(1, 4), Cells(lRow, 4))


另外,它目前正在Sheets(1)上执行上述操作。将工作表编号更改为您所需的。


在100,000条记录上,这需要0.2秒才能产生计数。

关于excel - 计算包含文本的唯一值的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31639324/

10-17 02:28