VBA: создать выбранную строку из массива - PullRequest
0 голосов
/ 16 марта 2019

РЕДАКТИРОВАТЬ: заранее спасибо за вашу помощь.Я хотел бы перебрать массив и создать строку на основе, пока условие больше не будет выполнено.Я думаю, что мой текущий код создает бесконечный цикл.

У меня есть следующее в массиве (подразделы начинаются с "-").Обратите внимание, пожалуйста, игнорируйте кавычки - формат штрихов для маркеров, поэтому пришлось их вставить, чтобы остановить это.

"- Subsection2"

"- Subsection3"

"Второй раздел"

" - Subsection4 "

" Третий раздел "

" - Subsection5 "

Я хотел бы создать новую строку, которая хранит * только те строки / слоты массивов, которые начинаются с «-» до тех пор, пока не будет исключена следующая строка, которая не начинается с «-».Результирующая строка, которую я хочу:

"- Subsection1"

"- Subsection2"

"- Subsection3"

(и исключая "- Subsection 4"and" - подраздел 5 ")

По сути, я хочу, чтобы оставшиеся подразделы были в том же разделе" master ".

Ниже приведена моя попытка:

Dim testArray() As Variant
Dim count1 As Integer
Dim CurrentSectionIndex as Integer

CurrentSectionIndex = ActivePresentation.Slides(i).sectionIndex



    count1 = ActivePresentation.SectionProperties.Count - CurrentSectionIndex


    'clear previous array (I am looping through slides)
    Erase testArray
    ' size the array

    ReDim testArray(1 To count1)


    'Fill the array


    For n = 1 To count1

        testArray(n) = ActivePresentation.SectionProperties.Name(CurrentSectionIndex + n)

        Next n


            Dim AllPostSections As String
            Dim PostSections As String


            For m = LBound(testArray) To UBound(testArray)

            Do While testArray(m) Like "-*"
            PostSections = testArray(m)

            Loop   

            AllPostSections = AllPostSections & PostSections & vbNewLine
            Next m

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 16 марта 2019

Ваше базовое предположение о том, почему вы бы использовали цикл «делать пока / пока», верно, но ваша реализация неверна. Для задачи, которую вы пытаетесь достичь, нет необходимости использовать цикл 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
...