Пишу свою ф-ю разрезки строки (должна вырезать куски от метки sBeg до метки sEnd, метки входят в кусок) и писать в массив строк так, чтобы при соедиении элементов массива получилась исходная строка. Всегда должен возвращаться сформированный массив (массив существует). Почти написал, тест показал проблему - надо искать sBeg(начало вырезки) и sEnd(конец вырезки) одновременно, затем резать. Может, есть решение попроще, а то замучился уже.
- Код: Выделить всё
Private Sub Form_Load()
Dim s() As String
s = SplitBegToEnd("", "1", "2")
PrintRes s
s = SplitBegToEnd("1", "1", "2")
PrintRes s
s = SplitBegToEnd("12", "1", "2")
PrintRes s
s = SplitBegToEnd("132", "1", "2")
PrintRes s
s = SplitBegToEnd("a", "1", "2")
PrintRes s
s = SplitBegToEnd("1234", "1", "2")
PrintRes s
s = SplitBegToEnd("1342", "1", "2")
PrintRes s
s = SplitBegToEnd("3142", "1", "2")
PrintRes s
s = SplitBegToEnd("12ab1212", "1", "2")
PrintRes s
s = SplitBegToEnd("22a1212a11", "1", "2") 'здесь неверно режет, должно 22a;12;;12;a11;
PrintRes s
s = SplitBegToEnd("11a1212a22", "1", "2")
PrintRes s
End Sub
'режет строку на части по меткам sBeg и sEnd (метки входят в некоторые части)
Public Function SplitBegToEnd(Source As String, sBeg As String, sEnd As String) As String()
Dim sArrTemp() As String, i As Long, Pos As Long, Pos2 As Long
0: Pos = InStr(Pos2 + 1, Source, sBeg)
If Pos = 0 Then Pos = 1
'If Pos > 1 Then: Pos2 = Pos - 1: Pos = 1: GoTo 2
1:
ReDim Preserve sArrTemp(i)
sArrTemp(i) = Mid(Source, Pos2 + 1, Pos - Pos2 - 1)
i = i + 1
3:
Pos2 = InStr(Pos + 1, Source, sEnd)
If Pos2 = 0 Then Pos2 = Len(Source)
2:
ReDim Preserve sArrTemp(i)
sArrTemp(i) = Mid(Source, Pos, Pos2 - Pos + 1)
i = i + 1
If Pos2 < Len(Source) Then
Pos = InStr(Pos2 + 1, Source, sBeg)
If Pos = 0 Then
ReDim Preserve sArrTemp(i)
sArrTemp(i) = Mid(Source, Pos2 + 1)
Else
GoTo 1
End If
End If
'здесь я доделаю сам удаление пустых элементов sArrTemp
'...
ReDim SplitBegToEnd(UBound(sArrTemp))
SplitBegToEnd = sArrTemp
End Function
Public Sub PrintRes(Source() As String)
Dim i As Long
For i = 0 To UBound(Source)
Debug.Print Source(i) & ";";
Next
Debug.Print
End Sub