Word 2010 VBA - управление нумерованными списками - PullRequest
8 голосов
/ 08 декабря 2011

Я пытаюсь взять нумерованный список, созданный в Outlook, и манипулировать им на основе элементов списка верхнего уровня.К сожалению, я нашел единственный способ манипулирования списком через тип ListParagraph, который разделяет все элементы списка (включая подпункты) одинаково, вместо того, чтобы иметь разные права доступа для каждого уровня в списке.

Есть ли способ получить доступ в одном объекте к элементу списка вместе со всеми его подэлементами?

Спасибо.

Вот то, что я сейчас использую, что прекрасно работает длясписки только с одним уровнем элементов:

    While i <= oMeetingWordDoc.Lists(1).ListParagraphs.Count
      Set oRange = oMeetingWordDoc.Lists(1).ListParagraphs(i).Range
      *Perform actions with oRange
      i = i + 1
    wend

Под списками с «одним уровнем» я имею в виду что-то вроде этого:

  1. Элемент 1
  2. Элемент 2
  3. Элемент 3

Под списками с «подпунктами» я имею в виду что-то вроде этого:

  1. Элемент списка1

    a) Элемент a
    b) Элемент b
    c) Элемент c

  2. Элемент 2

    a)Элемент a
    b) Элемент b

  3. Элемент 3

    a) Элемент a

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Я считаю ListFormat.ListLevelNumber ненадежным.

У меня есть документ, который мне прислали с маркированным списком, в котором есть вложенный (уровень 2) список под одним из пунктов. Вложенный список содержит 3 подпункта. Только подэлемент 2 сообщает, что это ListLevelNumber 2. Остальные продолжают сообщать ListLevelNumber = 1.

В примечании, для подэлементов, сообщающих о неверном уровне списка, ListFormat.ListString установлен на символ, используемый на уровне 2 списка, так что вы можете обойти проблему, проверив оба.

2 голосов
/ 24 декабря 2011

ListFormat.ListLevelNumber - это то, что вы ищете. Вот некоторый код, который будет выводить уровень списка и текст каждого ListParagraph в документе:

Sub listLevels()
    Dim currentList As Range
    Dim i, numLists As Integer

    numLists = ActiveDocument.ListParagraphs.Count

    For i = 1 To numLists
        Set currentList = ActiveDocument.ListParagraphs(i).Range
        MsgBox currentList.ListFormat.ListLevelNumber & " " & currentList.Text
    Next
End Sub

Конечно, вы можете использовать условие ListLevelNumber = 1 для доступа только к спискам верхнего уровня, ListLevelNumber = 2 для второго уровня и т. Д.

Есть ли способ получить в одном объекте элемент списка вместе со всеми его подпунктами?

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

Кроме того, ListFormat также имеет некоторых других членов, которые могут быть полезны, если вы много работаете со списками - покопайтесь в браузере объектов, чтобы узнать больше.

...