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
44.3k7 gold badges65 silver badges115 bronze badges
asked Apr 26, 2012 at 8:36
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 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. Так как данный материал немного запутан, то давайте для начала рассмотрим свойства и метода коллекции и класса, а уже потом я постараюсь показать и объяснить, что и для чего нужно…
Содержание
- ListGalleries – свойства и методы, маркированный и нумерованный список в Word
- ListGallery – свойства и методы, нумерованный и маркированный список в Word
- ListTemplates – свойства и методы, как сделать список в Word
- ListTemplate – свойства и методы, типы списков в Word
ListGalleries – свойства и методы, маркированный и нумерованный список в Word
Count– Количество классов ListGallery в текущей коллекции
Item(index) – Позволяет получить доступ к ListGallery заданного типа.
index – Определяет тип списка в Word, содержит значение константы WdListGalleryType:
- wdBulletGallery — 1 — маркированный список Word.
- wdNumberGallery — 2 — нумерованный список Word.
- wdOutlineNumberGallery — 3 — многоуровневый список.
ListGallery – свойства и методы, нумерованный и маркированный список в 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
Count– Количество классов ListTemplate. Только чтение.
Add(OutlineNumbered, Name) — Возвращает ListTemplate, представляющий новый шаблон списка. Оба параметра являются дополнительными.
OutlineNumbered – True — список будет многоуровневым, False — список содержит только один уровень вложенности.
Name – имя шаблона.
Item(count) — Возвращает отдельный объект ListTemplate в коллекции.
ListTemplate – свойства и методы, типы списков в 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]