Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
Space
-
- Combo-маньяк

-
-
- Сообщения: 818
- Зарегистрирован: 11.01.2007 (Чт) 1:19
- Откуда: Украина
Space » 28.08.2008 (Чт) 0:49
Пишу свою ф-ю разрезки строки (должна вырезать куски от метки 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
-
alibek
-
- Большой Человек

-
-
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 28.08.2008 (Чт) 8:26
Непонятно, что же все-таки требуется.
Lasciate ogni speranza, voi ch'entrate.
-
pronto
-
- Постоялец

-
-
- Сообщения: 598
- Зарегистрирован: 04.12.2005 (Вс) 6:20
- Откуда: Владивосток
pronto » 28.08.2008 (Чт) 9:18
Автор, попробуй этот вариант
- Код: Выделить всё
Private ub As Long
Option Explicit
Private Sub Form_Load()
Dim s() As String
s = SplitBegToEnd("11221211212", "1", "2")
Debug.Print "11221211212"
PrintRes s
s = SplitBegToEnd("1", "1", "2")
Debug.Print "1"
PrintRes s
s = SplitBegToEnd("12", "1", "2")
Debug.Print "12"
PrintRes s
s = SplitBegToEnd("132", "1", "2")
Debug.Print "132"
PrintRes s
s = SplitBegToEnd("a", "1", "2")
Debug.Print "a"
PrintRes s
s = SplitBegToEnd("1234", "1", "2")
Debug.Print "1234"
PrintRes s
s = SplitBegToEnd("1342", "1", "2")
Debug.Print "1342"
PrintRes s
s = SplitBegToEnd("3142", "1", "2")
Debug.Print "3142"
PrintRes s
s = SplitBegToEnd("12ab1212", "1", "2")
Debug.Print "12ab1212"
PrintRes s
s = SplitBegToEnd("22a1212a11", "1", "2") '
Debug.Print "22a1212a11"
PrintRes s
s = SplitBegToEnd("11a1212a22", "1", "2")
Debug.Print "11a1212a22"
PrintRes s
End Sub
Public Function SplitBegToEnd(Source As String, sBeg As String, sEnd As String) As String()
Dim tArr() As String, LeftPart As String
Dim i As Long, k As Long
Dim lPos As Long, rPos As Long
Dim ascB As Long, ascE As Long
Dim SourceLen As Long
ascB = Asc(sBeg)
ascE = Asc(sEnd)
ub = 0
ReDim tArr(ub)
SourceLen = Len(Source$)
Do While SourceLen > i
i = i + 1
If Asc(Mid$(Source$, i, 1)) = ascB Then
lPos = i
k = i
Do While SourceLen > k
k = k + 1
If Asc(Mid$(Source$, k, 1)) = ascE Then
rPos = k + 1
LeftPart = Mid$(Source, 1, lPos - 1)
If Len(LeftPart$) > 0 Then
tArr(ub) = LeftPart$
ub = ub + 1
ReDim Preserve tArr(ub)
End If
tArr(ub) = Mid$(Source$, lPos, rPos - lPos)
Source$ = Mid$(Source$, rPos)
SourceLen = Len(Source$)
ub = ub + 1
ReDim Preserve tArr(ub)
i = 0
Exit Do
End If
Loop
End If
Loop
tArr(ub) = Source$
If SourceLen = 0 Then ub = ub - 1
SplitBegToEnd = tArr
End Function
Public Sub PrintRes(Source() As String)
Dim i As Long
For i = 0 To ub 'ound(Source) '- 1
Debug.Print Source(i) & ";";
Next
Debug.Print vbCrLf
End Sub
O, sancta simplicitas!
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 3