我试图计算从第 2 行开始的 AJ 列中每行中这个短语“SMM:”的出现次数,然后将每行的值分配给从第 2 行开始的 BL 列。
Sub calculateamlp()
Dim charactercount As Integer
Dim rangeAG As Range
Dim cellCheck As Range
Dim f As Integer
f = 2
Worksheets("pptsr").Activate
Set rangeAG2 = Range("BL2", Range("BL2").End(xlDown))
Set rangeAG = Range("Aj2", Range("Aj2").End(xlDown))
For Each cellCheck In rangeAG
charactercount = Len(cellCheck) - Len(WorksheetFunction.Substitute(cellCheck, ":", ""))
Worksheets("pptsr").Range("BL2" & f).Value = charactercount
f = f + 1
Next cellCheck
End Sub
Run Code Online (Sandbox Code Playgroud)
小智 5
该函数通过使用子字符串来计算分割字符串中的元素数量来获得计数。
Function getStrOccurenceCount(Text As String, SubString As String)
getStrOccurenceCount = UBound(Split(Text, SubString))
End Function
Run Code Online (Sandbox Code Playgroud)
你可以这样修改你的代码
工作表(“pptsr”)。范围(“BL2”&f)。Value = getStrOccurenceCount(cellCheck.Text,“SMM:”)
以下是如何使用getStrOccurenceCount
with 数组来提高效率。
Sub calculateamlp2()
Const SUBSTRING As String = "SMM:"
Dim rangeAG As Range
Dim data As Variant
Dim x As Long
Set rangeAG = Range("AJ2", Range("AJ2").End(xlDown))
data = rangeAG.Value
For x = 1 To UBound(data)
data(x, 1) = getStrOccurenceCount(CStr(data(x, 1)), SUBSTRING)
Next
rangeAG.EntireRow.Columns("BL").Value = data
End Sub
Run Code Online (Sandbox Code Playgroud)
演示:样本数据999,999行,执行时间0.9375秒:
为了精确匹配,您应该使用“vbBinaryCompare”。如果您想将“smm:”与“SMM:”匹配,那么您应该使用“vbTextCompare”。尝试这个:
Sub calculateamlp()
Dim count As Long, i As Long, j As Long, rw As Long
Dim ws As Worksheet
Set ws = Worksheets("pptsr")
With ws
rw = .Range("AJ" & .Rows.count).End(xlUp).Row
For i = 2 To rw
For j = 1 To Len(.Cells(i, "AJ"))
If InStr(j, .Cells(i, "AJ"), "SMM:", vbTextCompare) Then
count = count + 1
j = InStr(j, .Cells(i, "AJ"), "SMM:", vbTextCompare)
End If
Next j
.Cells(i, "BL") = count
count = 0
Next
End With
End Sub
Run Code Online (Sandbox Code Playgroud)