Как удалить последний абзац в строке таблицы MS Word с помощью VBA-скрипта

Вопрос или проблема

Я пытаюсь написать скрипт VBA, который перемешивает все элементы многоуровенного списка 2 уровня в строке таблицы Microsoft Word. Я использую последнюю версию MS Word (Office 365).

Я почти всё правильно сделал, но мой скрипт снова вставляет строки, добавляя при этом лишний элемент списка. Мне удалось удалить номер списка из последнего абзаца (последней строки), но я не могу избавиться от самого абзаца.

Я пробовал выбрать последний абзац и удалить его (что удаляет всё содержимое строки), я пробовал para.Range.Delete – это, похоже, ничего не делает.

Sub Func()
    Dim tbl As Table
    Dim curRow As Row
    Dim para As Paragraph
    Dim paras() As String
    Dim cnt As Integer
    Dim i As Integer, j As Integer
    Dim temp As String

    If Not Selection Is Nothing And Selection.Tables.Count > 0 Then
        Set tbl = Selection.Tables(1)
        Set curRow = Selection.Rows(1)
    Else
        MsgBox "Пожалуйста, установите курсор внутри таблицы."
        Exit Sub
    End If

    ' Подсчёт количества элементов списка 2 уровня
    cnt = 0
    For Each para In curRow.Range.Paragraphs
        If para.Range.ListFormat.ListLevelNumber = 2 Then
            cnt = cnt + 1
        End If
    Next para

    ' Сбор элементов в массив и удаление из списка
    ReDim paras(1 To cnt)
    cnt = 0
    For Each para In curRow.Range.Paragraphs
        If para.Range.ListFormat.ListLevelNumber = 2 Then
            cnt = cnt + 1
            paras(cnt) = para.Range.Text
            para.Range.Text = ""
        End If
    Next para

    ' Перемешивание массива
    Randomize
    For i = 1 To cnt - 1
        j = Int((cnt - i + 1) * Rnd + i)
        temp = paras(i)
        paras(i) = paras(j)
        paras(j) = temp
    Next i

    ' Вставка перемешанных элементов обратно как элементы списка 2 уровня
    For i = 1 To cnt
        curRow.Range.InsertAfter paras(i)
    Next i

    Set para = curRow.Range.Paragraphs(curRow.Range.Paragraphs.Count - 1)
    para.Range.ListFormat.RemoveNumbers
    ' para.Range.Delete - ничего не делает

End Sub

Пожалуйста, попробуйте

    Set para = curRow.Range.Paragraphs(curRow.Range.Paragraphs.Count - 1)
    para.Range.ListFormat.RemoveNumbers
    para.Range.Characters.Last.Previous.Delete  ' ** добавить ** '

Документация Microsoft:

Свойство Characters.Last (Word)

Пожалуйста, поделитесь макетом вашей таблицы с примером текста, если скрипт не работает.

вставьте описание изображения здесь

Ответ или решение

Чтобы удалить последний параграф в строке таблицы Microsoft Word с помощью VBA скрипта, который также осуществляет перетасовку элементов списка, вам потребуется выполнить несколько шагов. Давайте рассмотрим этот процесс более подробно.

Шаг 1: Определение строки таблицы

Первым делом мы получаем доступ к таблице и текущей строке, в которой находится курсор. Убедитесь, что курсор действительно находится в таблице, для этого используем следующий код:

If Not Selection Is Nothing And Selection.Tables.Count > 0 Then
    Set tbl = Selection.Tables(1)
    Set curRow = Selection.Rows(1)
Else
    MsgBox "Пожалуйста, поместите курсор внутри таблицы."
    Exit Sub
End If

Шаг 2: Подсчет и сбор элементов списка

После этого выделим все параграфы в текущей строке таблицы, у которых уровень списка равен 2, и заполним их в массив:

cnt = 0
For Each para In curRow.Range.Paragraphs
    If para.Range.ListFormat.ListLevelNumber = 2 Then
        cnt = cnt + 1
        paras(cnt) = para.Range.Text
        para.Range.Text = ""
    End If
Next para

Шаг 3: Перетасовка массива

Теперь, когда у нас есть все элементы списка в массиве, перетасуем их:

Randomize
For i = 1 To cnt - 1
    j = Int((cnt - i + 1) * Rnd + i)
    temp = paras(i)
    paras(i) = paras(j)
    paras(j) = temp
Next i

Шаг 4: Вставка перетасованных элементов обратно

Следующим шагом будет вставка перетасованных элементов обратно в строку таблицы:

For i = 1 To cnt
    curRow.Range.InsertAfter paras(i)
Next i

Шаг 5: Удаление последнего параграфа

На этом этапе, чтобы удалить последний параграф (включая номер списка), можно воспользоваться несколькими подходами. Вы можете использовать метод .Delete, как показано ниже, или удалить одиночный символ:

Set para = curRow.Range.Paragraphs(curRow.Range.Paragraphs.Count - 1)
para.Range.ListFormat.RemoveNumbers
If Len(para.Range.Text) > 1 Then
    para.Range.Characters.Last.Previous.Delete  ' Удалить последний параграф
Else
    para.Range.Delete ' Если там только один символ
End If

Этот код сохраняет все предыдущие параграфы и удаляет только последний, тем самым решая проблему с добавлением лишнего элемента списка.

Заключение

В результате выполнения указанного алгоритма, вы получите корректно перетасованные элементы списка местом их вставки, при этом последний параграф будет удален, что устранит проблемы с лишними номерами. Убедитесь, что вы протестировали скрипт на вашем документе, и корректируйте его при необходимости в зависимости от структуры таблицы.

Этот подход позволит вам эффективно управлять содержимым таблицы в Microsoft Word через VBA, что является полезным навыком для автоматизации задач.

Оцените материал
Добавить комментарий

Капча загружается...