统计包含文本的唯一值的数量

我有以下代码计算包含string"ABC-QR"的列中的单元格数量:

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

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

首先,您必须在Visual Basic编辑器的Tools – > References中启用“Microsoft Scripting Runtime”。

您将工作表中的数据分配到一个数组中; 然后将符合string条件的所有内容导入到字典中 ,而不是重复的。 您可以使用.Exists方法检查字典中的重复项。

编辑:正如@Zev在注释中指出的,你甚至不需要使用.Exists方法。 您只需将数组元素指定给字典的键,并将项值分配为1.来自数组的任何重复值都将覆盖前一个键,因此将自动处理重复项。

一旦所有不重复的东西都被导入到字典中,就可以使用字典上的.Count属性。 这将告诉你有多lesslogging符合你的string标准,并且不在传入数组的范围内重复。

 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条logging上,这需要0.2秒来产生计数。

这个数组公式应该可以做到这一点:

 EU.Cells(16,3).FormulaArray = "=SUM(IF(ISERROR(FIND(""ABC-QR"",D4:D1500)),0,1/(COUNTIF(D4:D1500,D4:D1500))))" 

由于它是一个数组公式,它将依次在您的范围内的每个单元上运行并查找您的文本( FIND("ABC-QR",D4:D1500) )。 如果找不到,则返回0到正在运行的SUM() 。 如果find,它使用值1/count ,其中count是单元格值被testing的次数存在您的范围内。