Удалить последний элемент списка с помощью Word VBA - PullRequest
3 голосов
/ 19 декабря 2011

Я пытаюсь удалить последний маркер / элемент из маркированного списка в Word с помощью VBA.

Можно получить пустые элементы с помощью следующего кода, но я не знаю, как удалить эти элементы:

For Each List In ActiveDocument.ListParagraphs
    If Len(List.Range.Text = 2) Then
    'Delete this list Item
    End If
Next

Это пример списка:

  • Элемент 1
  • Позиция 2
  • Позиция 3
  • 1015 *

Я уже пытался выбрать элемент с помощью Range.Text.Select, но это не сработало.

Любые предложения приветствуются, заранее спасибо.

Edit:

Проблема заключается в удалении всего элемента списка, включая маркер списка. list.Range.Delete не работает и похоже, что макрос даже падает.

Окно сообщения появляется только один раз, даже если в Документе есть несколько вхождений, если я удаляю list.Range.Delete, поле появляется один раз для каждого пустого элемента.

Dim list As Paragraph

For Each list In ActiveDocument.ListParagraphs
    MsgBox Len(list.Range.Text)
    If Len(list.Range.Text) = 2 Then
        MsgBox "DELETE"
        list.Range.Delete
    End If
Next

1 Ответ

1 голос
/ 19 декабря 2011

List.Range.Text = 2 не будет true для пустых пунктов списка.Это 1.

Dim list As Paragraph

For Each list In ActiveDocument.ListParagraphs
  If Len(Trim$(list.Range.Text)) = 1 Then
      list.Range.Delete
  End If
Next

РЕДАКТИРОВАТЬ: ActiveDocument, Trim$, как предлагается в комментариях.

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

Общее решение состоит в том, чтобы всегда удалять последний символ из абзаца передисследуя это для длины.Поскольку абзацы, которые должны быть удалены, имеют нулевую длину, мы можем удалить их «влево» (как если бы нажата клавиша Backspace), что сохраняет маркер конца ячейки, а также работает с абзацами, которых нет в таблице.Однако это не сработает, если удаленный абзац не будет пустым:

Dim p As Paragraph

For Each p In ActiveDocument.ListParagraphs
  Dim range_to_examine As Range
  Set range_to_examine = p.Range

  If range_to_examine.End = range_to_examine.Start + 1 Then
    range_to_examine.Collapse wdCollapseStart
    range_to_examine.Delete wdCharacter, -1
  End If
Next
...