Количество вхождений подстроки в строку (VBA)
Автор Joss   
02.12.2019 г.

 

В 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))

Просмотров: 1448

  Ваш коментарий будет первым

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code