Вопрос или проблема
Я пытаюсь написать скрипт 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:
Пожалуйста, поделитесь макетом вашей таблицы с примером текста, если скрипт не работает.
Ответ или решение
Чтобы удалить последний параграф в строке таблицы 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, что является полезным навыком для автоматизации задач.