我有以下代码来计算包含字符串"ABC-QR"
的列中的单元格数量:
Ctr = Application.WorksheetFunction.CountIf(Sheet1.Range("D4:D1500"), "*ABC-QR*")
EU.Cells(16, 3) = Ctr
我使用了"ABC-QR"
,因为这是不会发生变化的数据部分。这些单元格中的真实数据例如是"ABC-QR00012345"
,或者它可能具有的任何数字。我想将代码修改为不包含重复项。
答案 0 :(得分:5)
首先,您必须在工具中启用“Microsoft Scripting Runtime” - > Visual Basic编辑器中的引用。
您将工作表中的数据分配到数组中;然后将符合字符串条件且不重复的所有内容导入dictionary。您可以使用.Exists
method检查词典中的重复项。
编辑:正如@Zev在评论中所指出的,您甚至不需要使用.Exists
方法。您可以将数组元素分配给字典的键,并将项值指定为1.数组中的任何重复值都将覆盖前一个键,因此将自动处理重复项。
一旦将不重复的所有内容导入字典,您就可以在字典上使用.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秒才能产生计数。
答案 1 :(得分:1)
这个数组公式可以解决这个问题:
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()
。如果找到,则使用值1/count
,其中count
是您测试的单元格值存在的范围。