В VBA нет стандартной функции определяющей количество вхождений подстроки в строку. По этому каждый извращается как может. Вот одно из решений когда-то найденное на просторах интернета
k = len(stroka) - len(replace(stroka, simvol, ""))
С таким же успехом можно подсчитать количество вхождений подстроки:
k = (len(stroka) - len(replace(stroka, podstroka, "")))/len(podstroka)
Ну и оформим всё это в функцию
Public Function fnOccurrenceSubstring(Stroka As String, Podstroka As String) As Integer
If Len(Stroka) = 0 Then
fnOccurrenceSubstring = -1
Exit Function
End If
If Len(bPodstroka) = 0 Then
fnOccurrenceSubstring = -1
Exit Function
End If
fnOccurrenceSubstring = (Len(Stroka) - Len(Replace(Stroka, Podstroka, ""))) / Len(Podstroka)
End Function
Вот ещё один пример из интернета
Function КолСимв(строка As String, символ As String) As Integer
Dim TestPos As Integer
КолСимв = 0
TestPos = 1
Do While InStr(TestPos, строка, символ) > 0
КолСимв = КолСимв + 1
TestPos = InStr(TestPos, строка, символ) + Len(символ)
Loop
End Function
Решить данную задачу можно кучей способов... Вот так
Dim s1 As String, s2 As String
Dim Cnt As Integer
s1 = "es"
s2 = "vest is best forest"
Cnt = 0
While InStr(1, s2, s1) > 0
Cnt = Cnt + 1
s2 = Mid(s2, InStr(1, s2, s1) + Len(s1))
Wend
MsgBox "Count = " & Str(Cnt)
или так
Dim s1 As String, s2 As String
Dim PrevPos As Integer, Cnt As Integer
s1 = "es"
s2 = "vest is best forest"
PrevPos = 1
Cnt = 0
While InStr(PrevPos, s2, s1) > 0
Cnt = Cnt + 1
PrevPos = InStr(PrevPos, s2, s1) + 1
Wend
MsgBox "Count = " & Str(Cnt)
и вот так:
Dim s1 As String, s2 As String
Dim i As Integer, Cnt As Integer
s1 = "es"
s2 = "vest is best forest"
i = 1
Cnt = 0
For i = 1 To Len(s2) - Len(s1) + 1
If Mid(s2, i, Len(s1)) = s1 Then Cnt = Cnt + 1
Next i
MsgBox "Count = " & Str(Cnt)
Ещё один вариант - правда, красиво!
Dim s1 As String, s2 As String
s1 = "es"
s2 = "vest is best forest"
MsgBox "Count = " & UBound(Split(s2, s1))