Vba numbered list in word

I am trying to use VBA code in Excel to create a numbered list in a Word document.

Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document

Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = True
Set wrdDoc = wrdApp.Documents.Add

With wrdDoc
    For i = 0 To 5
        .Content.InsertAfter ("Paragraph " & i)
        .Content.InsertParagraphAfter
    Next

    .Paragraphs(1).Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
        ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
        False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
        wdWord10ListBehavior
End With

Set wrdApp = Nothing
Set wrdDoc = Nothing

When I run this I get an error:

Method ‘ApplyListTemplateWithLevel’ of object ‘ListFormat’ failed

I have checked the Microsoft Word 12.0 Object Library in the Excel VBA references list.

Deduplicator's user avatar

Deduplicator

44.3k7 gold badges65 silver badges115 bronze badges

asked Apr 26, 2012 at 8:36

ploddingOn's user avatar

6

Ok I found the problem. I remoted into a friends machine to check. I got the same error as you if there were other word documents open. If no other word documents are open then your code just works fine.

Try this code. It latebinds with the Word Application so you don’t need a reference to be added.

Sub Sample()
    Dim oWordApp As Object, oWordDoc As Object

    '~~> Establish an Word application object
    On Error Resume Next
    Set oWordApp = GetObject(, "Word.Application")

    If Err.Number <> 0 Then
        Set oWordApp = CreateObject("Word.Application")
    End If
    Err.Clear
    On Error GoTo 0

    oWordApp.Visible = True

    Set oWordDoc = oWordApp.Documents.Add

    With oWordDoc
        For i = 0 To 5
            .Content.InsertAfter ("Paragraph " & i)
            .Content.InsertParagraphAfter
        Next

        DoEvents

        .Paragraphs(1).Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
        ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
        False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
        wdWord10ListBehavior
    End With

    Set oWordApp = Nothing
    Set oWordDoc = Nothing
End Sub

answered Apr 26, 2012 at 9:58

Siddharth Rout's user avatar

Siddharth RoutSiddharth Rout

146k17 gold badges206 silver badges250 bronze badges

0

I am trying to use VBA code in Excel to create a numbered list in a Word document.

Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document

Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = True
Set wrdDoc = wrdApp.Documents.Add

With wrdDoc
    For i = 0 To 5
        .Content.InsertAfter ("Paragraph " & i)
        .Content.InsertParagraphAfter
    Next

    .Paragraphs(1).Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
        ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
        False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
        wdWord10ListBehavior
End With

Set wrdApp = Nothing
Set wrdDoc = Nothing

When I run this I get an error:

Method ‘ApplyListTemplateWithLevel’ of object ‘ListFormat’ failed

I have checked the Microsoft Word 12.0 Object Library in the Excel VBA references list.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'Option Explicit
 
Sub ВставитьПриложение()
'ПРИЛОЖЕНИЕ
On Error GoTo Err_DOC: If ActiveDocument.Name <> "" Then GoTo NoErr_DOC
Err_DOC: MvbErr (msg): Exit Sub
NoErr_DOC:
    'СООБЩЕНИЯ
    msg = "Продолжить, вставку ""Приложение""?"
    
    Set oRange = ActiveDocument.Range(Start:=Word.Selection.Start, End:=Word.Selection.Start)
    Dim oTable As Table, удалить As Table
    ширина = Fix(25 / 0.3528) 'для ширины столбца в мм
        
    'ПОДТВЕРЖДЕНИЕ
    If MvbYesNo(msg) = vbNo Then Exit Sub
    
    'УДАЛЯЕМ СТАРУЮ ТАБЛИЦУ
    If ActiveDocument.Tables.Count > 0 Then
        For Each удалить In Selection.Tables
        удалить.Delete
        Next удалить
    End If
 
    'ВСТАВЛЯЕМ НОВУЮ ТАБЛИЦУ
    Dim до As Byte: до = 6
    oRange.ParagraphFormat.Reset 'очищаем форматирование
    Set oTable = ActiveDocument.Tables.Add(oRange, 2, 2)
        oTable.Select
        oTable.Columns(1).Width = ширина 'первой колонки
        oTable.PreferredWidthType = 2    'ширина таблицы
        oTable.PreferredWidth = 100      'ширина таблицы
        Selection.Tables(1).Cell(1, 1).Range = "Приложение:"
        Selection.Tables(1).Cell(1, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
        Selection.Tables(1).Cell(2, 1).Range = "Всего"
        Selection.Tables(1).Cell(2, 1).Range.ParagraphFormat.SpaceBefore = до
        Selection.Tables(1).Cell(2, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight
        Selection.Tables(1).Cell(2, 2).Range = "? л."
        Selection.Tables(1).Cell(2, 2).Range.ParagraphFormat.SpaceBefore = до
        Selection.Tables(1).Cell(2, 2).Range.ParagraphFormat.Alignment = wdAlignParagraphLeft
        Selection.Tables(1).Cell(1, 1).VerticalAlignment = wdCellAlignVerticalTop
        Selection.Tables(1).Cell(1, 2).VerticalAlignment = wdCellAlignVerticalTop
        Selection.ParagraphFormat.LineSpacing = LinesToPoints(1) 'междустрочный интервал
        Selection.ParagraphFormat.SpaceBefore = LinesToPoints(0) 'интервал перед параграфа  0.999 = 12
        Selection.ParagraphFormat.SpaceAfter = LinesToPoints(0)  'интервал после параграфа
 
    'ФОРМАТИРУЕМ ТАЛЛИЦЫ
    With oRange
        .Rows.WrapAroundText = False
        .Rows.Alignment = VerticalAlignment   'выравнивание на листе по левому краю поля
        .Rows.HeightRule = wdRowHeightAuto    'убирает галочку "Высота строки"
    End With
 
    'СОЗДАНИЕ И ОБРАБОТКА СПИСКА
    Dim lsg As Word.ListGallery, lst As Word.ListTemplate
        Set app = GetObject(, "Word.Application")
        Set Doc = Selection.Tables(1).Cell(1, 2)    'выделенная таблица
        Set lsg = app.ListGalleries(2)              'нумерованные списки.
        Set rng = Doc.Range
        
    For Each lst In lsg.ListTemplates
        With lst.ListLevels(1)
            If Right(.NumberFormat, 1) = "." And .NumberStyle = 0 Then Exit For '*
        End With
    Next lst
 
    'ОБРАБОТКА INPUTBOX
    Dim Message As String, Title As String, Default As String, MyValue As String
    Message = "Укажите колличество позиций"
    Title = MM
    Default = ""
    MyValue = InputBox(Message, Title, Default)
    rW = ChrW(8234)
    
    If MyValue = "" Then Exit Sub
    If MyValue = 0 Then Exit Sub
    If MyValue = 1 Then rng.Text = rW: GoTo d
    If MyValue = 2 Then MyValue = MyValue - 1
    If MyValue > 2 Then MyValue = MyValue - 1
    
    rng.Delete
    For i = 1 To MyValue 'если 10 - 1
        i = i: txt = txt & rW & vbCrLf
    Next i
    rng.Text = txt & rW
    
d:  'ФОРМАТИРУЕМ СПИСОК
    rng.ListFormat.ApplyListTemplate lst
    With lst.ListLevels(1)
            .Alignment = 2          'выравнивание по правому краю
            .NumberPosition = 20    'отступ слева
            .TextPosition = 20      'задает положение для второй линии
            .TrailingCharacter = 1  'символ после номера 0 - Tab, 1 - пробел
    End With
End Sub
 
Function MvbErr(msg) As String
'MsgBox ОШИБКА АКТИВНОСТИ ДОКУМЕНТА
    msg = "Необходимо открыть или создать документ!"
    Button = vbYes + 64
    Title = MM()
    MvbErr = MsgBox(msg, Button, Title)
End Function
 
Function MvbYesNo(ByVal msg) As String
'MsgBox ДА/НЕТ
    Button = vbYesNo + 64
    Title = MM
    MvbYesNo = MsgBox(msg, Button, Title)
End Function
 
Function MM() 'As String
    MM = "Вставить ""Приложение"""
End Function

Доброго времени суток всем подписчикам и читателям блога scriptcoding.ru. Сегодня мы рассмотрим, как сделать список в Word документе программным путем, с помощью коллекции ListGalleries объектной модели Word.

Коллекция ListGalleries является отправной точкой, чтобы сделать маркированный или нумерованный список в Word с помощью макросов VBA, или сценариев сервера Windows Script Host. По сути, коллекция хранит объекты ListGallery, которые представляют индивидуальный список, но, ни ListGalleries и ListGallery не содержат средств для формирования списка Word с нужными параметрами. Так, с практической стороны вам понадобится только одно свойство и один метод из коллекции и два свойства и один метод.

Для доступа к коллекции ListGalleries используется одноименное свойство класса Word.Application. Так как данный материал немного запутан, то давайте для начала рассмотрим свойства и метода коллекции и класса, а уже потом я постараюсь показать и объяснить, что и для чего нужно…

Содержание

  1. ListGalleries – свойства и методы, маркированный и нумерованный список в Word
  2. ListGallery – свойства и методы, нумерованный и маркированный список в Word
  3. ListTemplates – свойства и методы, как сделать список в Word
  4. ListTemplate – свойства и методы, типы списков в Word

ListGalleries – свойства и методы, маркированный и нумерованный список в Word

создание нумерованного и маркированного списка в word

Count– Количество классов ListGallery в текущей коллекции

Item(index) – Позволяет получить доступ к ListGallery заданного типа.

index – Определяет тип списка в Word, содержит значение константы WdListGalleryType:

  • wdBulletGallery — 1 — маркированный список Word.
  • wdNumberGallery — 2 — нумерованный список Word.
  • wdOutlineNumberGallery — 3 — многоуровневый список.

ListGallery – свойства и методы, нумерованный и маркированный список в Word

создание маркированного и нумерованного списка в Word

ListTemplates— Возвращает ListTemplates, которая представляет все типы списков в Word для указанного списка в коллекции. Только чтение.

Modified(index) – Вернет значение True, если производились изменения в заданном шаблоне списка. Только чтение.

Reset(index) – Позволяет очистить созданный ранее шаблон (index – номер шаблона).

Хорошо, теперь давайте рассмотрим, как сделать список Word, и весь процесс….

Все мы знаем, чтобы сделать список в документе Word, в первую очередь надо выбрать нужные абзацы, после этого мы выбираем типы списков Word. За тип отвечают три вкладки:

  • Маркеры – содержит 7 типов маркеров и позволяет создать собственный список-маркер.
  • Нумерация – также содержит 7 вариантов нумерованного списка в Word и дает возможность создать собственный шаблон.
  • Многоуровневый список – также на выбор дается 7 готовых шаблонов и возможность сформировать собственный.

Аналогичные действия происходят, и тогда, когда надо программно сделать список в Word:

Сначала нам нужно получить доступ к коллекции ListGalleries через одноименное свойство класса Word Application.

Далее нужно получить доступ к ListGallery – мы можем или использовать свойство item (смотрите выше) или задать значение напрямую:

oWord.ListGalleries(1)
oWord.ListGalleries.Item(1)

Обратите внимание, что мы передаем не номер класса, а его тип (всего три варианта).

После того, как мы определились с нужным типом списка в Word и получили доступ к ListGallery, нам нужно обратиться к свойству ListTemplates, которое позволяет получить доступ к одноименной коллекция:

oWord.ListGalleries(1).ListTemplates.Item(1)
oWord.ListGalleries(1).ListTemplates(1)

Хорошо мы получили доступ к коллекции ListTemplates, давайте рассмотрим, для чего она нужна. Как упоминалось выше, для каждого из трех типов списков Word есть 7 заготовленных шаблонов. Фактически, каждый такой шаблон является классом ListTemplate, входящим в состав коллекции. Как и с объектом ListGallery, тут та же ситуация – мы передаем не номер, а тип.

ListTemplates – свойства и методы, как сделать список в Word

типы Word списков

Count– Количество классов ListTemplate. Только чтение.

Add(OutlineNumbered, Name) — Возвращает ListTemplate, представляющий новый шаблон списка. Оба параметра являются дополнительными.

OutlineNumbered – True — список будет многоуровневым, False — список содержит только один уровень вложенности.

Name – имя шаблона.

Item(count) — Возвращает отдельный объект ListTemplate в коллекции.

ListTemplate – свойства и методы, типы списков в Word

как сделать Word список

ListLevels— Возвращает ListLevels, представляющую все списки для указанного ListTemplate.

Name— Возвращает или задает имя указанного класса. Чтение и запись.

OutlineNumbered— Значение true, если указанный ListTemplate является многоуровневым. Чтение и запись.

Convert(level) – Позволяет конвертировать список: многоуровневый в одноуровневый, или наоборот.

level – Дополнительный параметр, который задает уровень вложенности списка Word. Этот аргумент может быть число от 1 до 9. Если этот аргумент опущен, то значение 1 — значение по умолчанию.

Последний этап, который, показывает как сделать список в Word – этап выбора уровня вложенности. По сути, нам надо получить доступ к коллекции ListLevels и объектам ListLevel. Так как данная коллекция и объект содержат довольно много методов и свойств, то я описал их в отдельной статье – «Коллекция Word ListLevels и объект ListLevel«. Но, чтобы не предоставлять вам материал без примеров, мы сделаем два списка в Word, которые сможем многократно использовать. Я сначала приведу вам примеры кода, а уже потом объясню, что и как.

Пример на языке VBScript

' ----------------------------------------------------------------------------
' как сделать список в Word
' нумерованный список в Word
' маркированный список в Word
' ListGallery.vbs
' ----------------------------------------------------------------------------
Option Explicit
 
dim oWord, oDoc, oSel, i, oPars, MyText, oRange
dim REnd                    ' конец текста
dim List1, List2            ' два объекта ListTemplate
 
Set oWord = CreateObject("Word.Application")
Set oDoc = oWord.Documents
oDoc.Add()
Set oSel = oWord.Selection
oWord.Visible = True
 
MyText = "типы списков в Word. "
 
For i=0 to 10
    oSel.TypeText MyText & MyText & MyText & MyText & MyText & MyText & MyText
    oSel.TypeParagraph
Next
 
set oRange = oDoc(1).Range()            'Создаем Range
set oPars = oRange.Paragraphs             'Создаем Paragraps
 
' Определяем конечную позицию для текста
REnd = oPars(oPars.Count).Range.End
 
set List1 = oDoc(1).ListTemplates.Add(false)    ' Первый шаблон
set List2 = oDoc(1).ListTemplates.Add(false)    ' Второй шаблон
 
'--------------------------------------------------------------
'     Заполняем шаблоны
'--------------------------------------------------------------
With List1.ListLevels(1)
    .Alignment = 1
    .NumberPosition = 10
    .NumberStyle = 3
    .TextPosition = 20
    .TrailingCharacter = 0
        With .Font
            .Bold =true
            .Size = 20
            .Shadow = true
            .ColorIndex = 6
        End With
End With
 
With List2.ListLevels(1)
    .Alignment = 1
    .NumberPosition = 20
    .NumberStyle = 4
    .TextPosition = 20
    .TrailingCharacter = 0
        With .Font
            .Bold =true
            .Size = 20
            .Shadow = true
            .ColorIndex = 11
        End With
End With
'--------------------------------------------------------------
 
' выбираем диапазон от 2-го до 4-го абзаца
oRange.SetRange oPars(2).Range.Start, oPars(4).Range.End
' Применяем первый шаблон списка
oRange.ListFormat.ApplyListTemplateWithLevel List1, false, 0, 2
 
' выделяем заново весь диапазон
oRange.SetRange 0, REnd
 
' выбираем диапазон от 2-го до 4-го абзаца
oRange.SetRange oPars(7).Range.Start, oPars(9).Range.End
' Применяем второй шаблон списка
oRange.ListFormat.ApplyListTemplateWithLevel List2, false, 0, 2

Пример на языке JScript

// ----------------------------------------------------------------------------
// как сделать список в Word
// нумерованный список в Word
// маркированный список в Word
// ListGallery.vbs
// ----------------------------------------------------------------------------
 
var oWord1, oDoc1, oSel1, i, oPars1, MyText1, oRange1;
var REnd;                    // конец текста
var List1, List2;            // два объекта ListTemplate
 
oWord1 = WScript.CreateObject("Word.Application");
oDoc1 = oWord1.Documents;
oDoc1.Add();
oSel1 = oWord1.Selection;
oWord1.Visible = true;
 
MyText1 = "типы списков в Word. ";
 
for (i=0; i<=10; i++){
    oSel1.TypeText(MyText1 + MyText1 + MyText1 + MyText1 + MyText1 + MyText1 + MyText1);
    oSel1.TypeParagraph();
}
 
oRange1 = oDoc1(1).Range();                //Создаем Range
oPars1 = oRange1.Paragraphs;             //Создаем Paragraps
 
// Определяем конечную позицию для текста
REnd = oPars1(oPars1.Count).Range.End;
 
List1 = oDoc1(1).ListTemplates.Add(false);        // Первый шаблон
List2 = oDoc1(1).ListTemplates.Add(false);        // Второй шаблон
 
//--------------------------------------------------------------
//     Заполняем шаблоны
//--------------------------------------------------------------
with(List1.ListLevels(1)){
    Alignment = 1;
    NumberPosition = 10;
    NumberStyle = 3;
    TextPosition = 20;
    TrailingCharacter = 0;
        with(Font){
            Bold =true;
            Size = 20;
            Shadow = true;
            ColorIndex = 6;
        }
}
 
with(List2.ListLevels(1)){
    Alignment = 1;
    NumberPosition = 20;
    NumberStyle = 4;
    TextPosition = 20;
    TrailingCharacter = 0;
        with(Font){
            Bold =true;
            Size = 20;
            Shadow = true;
            ColorIndex = 11;
        }
}
//--------------------------------------------------------------
 
// выбираем диапазон от 2-го до 4-го абзаца
oRange1.SetRange(oPars1(2).Range.Start, oPars1(4).Range.End);
// Применяем первый шаблон списка
oRange1.ListFormat.ApplyListTemplateWithLevel(List1, false, 0, 2);
 
// выделяем заново весь диапазон
oRange1.SetRange(0, REnd);
 
// выбираем диапазон от 2-го до 4-го абзаца
oRange1.SetRange(oPars1(7).Range.Start, oPars1(9).Range.End);
// Применяем второй шаблон списка
oRange1.ListFormat.ApplyListTemplateWithLevel(List2, false, 0, 2);

Хорошо, теперь давайте разберем программный код. В обоих сценариях объявление практически одинаковые переменные, в примере на JS к именам я добавил единицу. oWord – хранит доступ к приложению Ворд: «Объект Word Application — свойства«, oDoc – позволит создать новый документ: «Коллекция Word Documents«, oSel – позволит выделять нужный текст: «Объект Word Selection — выделить весь текст в ворде, свойства«, oPars – отвечает за обработку абзацев: «Объект Word Paragraph и коллекция Paragraphs — основные параметры абзаца«, MyText – собственно, текст для вставки в документ, oRange – отвечает за выбор содержимого: «Объект Word Range — Выбор текста«.

Видим, что в обоих сценариях мы создали два объекта List1 и List2, которые содержат отформатированный список Word. Далее происходит процесс вызова метода ApplyListTemplateWithLevelобъекта ListFormat для заданного выбора, к нему и будет применяться сделанный в список Word. Видим, что основные параметры определяются через свойства объекта ListLevel.

title ms.prod ms.assetid ms.date ms.localizationpriority

Lists object (Word)

word

1fd927c5-6186-5ca0-80ae-c2ab225d092c

06/08/2017

medium

Lists object (Word)

A collection of List objects that represent all the lists in the specified document.

Remarks

Use the Lists property to return the Lists collection. The following example displays the number of items in each list in the active document.

For Each li In ActiveDocument.Lists 
 MsgBox li.CountNumberedItems 
Next li

Use Lists (Index), where Index is the index number, to return a single List object. The following example applies the first list format (excluding None) on the Numbered tab in the Bullets and Numbering dialog box to the second list in the active document.

Set temp1 = ListGalleries(wdNumberGallery).ListTemplates(1) 
ActiveDocument.Lists(2).ApplyListTemplate ListTemplate:=temp1

When you use a For Each loop to enumerate the Lists collection, the lists in a document are returned in reverse order. The following example counts the items for each list in the active document, from the bottom of the document upward.

For Each li In ActiveDocument.Lists 
 MsgBox li.CountNumberedItems 
Next li

To add a new list to a document, use the ApplyListTemplate method with the ListFormat object for a specified range.

You can manipulate the individual List objects within a document, but for more precise control you should work with the ListFormat object.

[!NOTE]
Picture-bulleted lists are not included in the Lists collection.

Methods

Name
Item

Properties

Name
Application
Count
Creator
Parent

See also

Word Object Model Reference

[!includeSupport and feedback]

Понравилась статья? Поделить с друзьями:
  • Vba for excel текущая дата
  • Vba for excel на русском
  • Vba not working in excel
  • Vba for excel строковые функции
  • Vba microsoft excel object