Ваше базовое предположение о том, почему вы бы использовали цикл «делать пока / пока», верно, но ваша реализация неверна. Для задачи, которую вы пытаетесь достичь, нет необходимости использовать цикл Do While, поскольку в качестве цикла вам необходим цикл For M. Затем в цикле For все, что вам нужно сделать, это протестировать с помощью оператора If для сборки нужной вам строки. Если вы хотите, вы можете заменить цикл for next на цикл Do while, но на самом деле гораздо проще достичь того, что вы хотите, используя коллекции. Вы можете индексировать элементы в коллекции так же, как в массиве, поэтому, если вы не посмотрите на определение переменной, вы можете сказать, использует ли my_array (1) массив или коллекцию.
Приведенный ниже код возьмет коллекцию всех ваших заголовков (тестовый массив) и создаст новую коллекцию, в которой у вас есть только объединенные подзаголовки.
Option Explicit
Dim my_headings As Collection
Dim my_heading As Variant
Dim my_subheadings As Collection
Dim my_collector As String
my_collector = vbNullString
' fill the my_heading collection
Set my_subheadings = New Collection
For Each my_heading In my_headings
If my_heading Like "-*" Then
my_collector = my_collector & my_heading & vbCrLf
Else
If Len(my_collector) > 0 Then
my_sub_headings.Add my_collector
my_collector = vbNullString
End If
End If
Next
Отредактировано: здесь та же логика, что и выше, но с циклом for next, замененным циклом do while. Надеюсь, это прояснит ваши довольно запутанные идеи о том, что делает цикл «делать, пока».
Dim my_headings As Collection
Dim my_subheadings As Collection
Dim my_collector As String
Dim my_index As Long
my_collector = vbNullString
' fill the my_heading collection
Set my_subheadings = New Collection
my_index = 1
Do While my_index <= my_headings.Count
If my_headings(my_index) Like "-*" Then
my_collector = my_collector & my_heading & vbCrLf
Else
If Len(my_collector) > 0 Then
my_sub_headings.Add my_collector
my_collector = vbNullString
End If
End If
my_index=my_index+1
Loop