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.
Sub AddNumberedList() 'Основные переменные документа Word, описывающие соответственно 'приложение, документ и диапазон в документе. Dim app As Word.Application, doc As Word.Document, rng As Word.Range 'Переменные, необходимые для работы со списками. Dim lsg As Word.ListGallery 'Галерея шаблонов списков. Dim lst As Word.ListTemplate 'Шаблон списка. 'Получаем доступ к приложению Word. Set app = GetObject(, "Word.Application") 'Получаем доступ к активному документу в этом приложении. Set doc = app.ActiveDocument 'Получаем галерею шаблонов нумерованных списков. Set lsg = app.ListGalleries(2) 'Всего есть 3 галереи: '1-я - маркированные списки. '2-я - нумерованные списки. '3-я - многоуровневые списки. 'Из множества шаблонов нумерованных списков выбираем тот, 'который с арабскими цифрами и скобкой ")". For Each lst In lsg.ListTemplates With lst.ListLevels(1) If Right(.NumberFormat, 1) = ")" And .NumberStyle = 0 Then Exit For End With Next lst 'Получаем ссылку на диапазон всего документа. Set rng = doc.Range rng.Delete 'Вставляем в документ текст, к которому будет применяться список. rng.Text = "пункт 1" & vbCrLf & "пункт 2" & vbCrLf & "пункт 3" 'Определяем формат списка с помощью шаблона lst. rng.ListFormat.ApplyListTemplate lst End Sub
I have been playing with VBA code that permits automatic creation of word documents. In the example below, I write a Word paragraph 6 times. In order to do certain formatting (bullets, numbering, putting text in tables etc…) it appears necessary to make a second pass and apply formatting after text is created. Can this be done in a single pass like VBA allows us to do with bold or italics?
Example:
— toggle numbering
— write line
Sub Sample()
Dim oWordApp As Object, oWordDoc As Object
Dim i As Integer
'~~> 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
' Yields execution so that the operating system can process other events.
DoEvents
' why does this have to be done after creating text?
.Paragraphs(1).Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
.Paragraphs(2).Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
End With
Set oWordApp = Nothing
Set oWordDoc = Nothing
End Sub
example from Excel VBA for creating numbered list in Word
asked May 4, 2014 at 13:16
Mustapha GeorgeMustapha George
2,4779 gold badges47 silver badges79 bronze badges
You can obviously do it. There are few possibilities but I believe the below solution give you a clue of how to use Document.Range(start,end)
property.
With oWordDoc
For i = 0 To 5
.Content.InsertAfter ("Paragraph " & i)
.Content.InsertParagraphAfter
Next
' Yields execution so that the operating system can process other events.
DoEvents
'apply numbering for 6 added paragraphs
.Range(.Paragraphs(1).Range.Start, _
.Paragraphs(6).Range.End) _
.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
ListGalleries(wdNumberGallery).ListTemplates(1), ContinuePreviousList:= _
False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
wdWord10ListBehavior
'... the rest of your code here
answered May 4, 2014 at 21:06
Kazimierz JaworKazimierz Jawor
18.8k7 gold badges35 silver badges55 bronze badges
2
I had some trouble adding bullets, so here is the code that worked for me.
Note that this requires adding a reference to Microsoft Word 15.0 Object Library
Sub Generate()
Dim objWord
Dim objDoc
Dim temp3 As Word.ListTemplate
Dim objSelection
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add
objWord.Visible = True
Set objSelection = objWord.Selection
'Change your text here:
objSelection.TypeText ("This is my text in Word Document using Excel")
objSelection.TypeParagraph
objSelection.TypeText ("Here is more text")
'--------------------------
Set temp3 = objWord.ListGalleries(wdNumberGallery).ListTemplates(1)
With temp3.ListLevels(1)
.Font.Name = "Symbol"
.Font.Size = 11
.NumberFormat = ChrW(61623)
.TrailingCharacter = wdTrailingTab
.NumberStyle = wdListNumberStyleArabic
.NumberPosition = objWord.CentimetersToPoints(0.63)
.Alignment = wdListLevelAlignLeft
.TextPosition = objWord.CentimetersToPoints(1.27)
.TabPosition = wdUndefined
.StartAt = 1
End With
'Apply formatting to our range
objDoc.Range.ListFormat.ApplyListTemplate ListTemplate:=temp3
End Sub
answered Mar 3, 2016 at 18:24
This will do it…
Dim wdApp As Word.Application
Set wdApp = New Word.Application
With wdApp
.Visible = True
.Activate
.Documents.Add
' turn on bullets
.ListGalleries(wdBulletGallery).ListTemplates(1).Name = ""
.Selection.Range.ListFormat.ApplyListTemplate ListTemplate:=.ListGalleries(wdBulletGallery).ListTemplates(1), _
continuepreviouslist:=False, applyto:=wdListApplyToWholeList, defaultlistbehavior:=wdWord9ListBehavior
With .Selection
.ParagraphFormat.Alignment = wdAlignParagraphLeft
.Font.Bold = False
.Font.Name = "Century Gothic"
.Font.Size = 12
.TypeText ("some details")
.TypeParagraph
.TypeText ("some details")
.TypeParagraph
End With
' turn off bullets
.Selection.Range.ListFormat.RemoveNumbers wdBulletGallery
With .Selection
.ParagraphFormat.Alignment = wdAlignParagraphLeft
.TypeText ("some details")
.TypeParagraph
.TypeText ("some details")
.TypeParagraph
End With
' turn on outline numbers
.ListGalleries(wdOutlineNumberGallery).ListTemplates(1).Name = ""
.Selection.Range.ListFormat.ApplyListTemplate ListTemplate:=.ListGalleries(wdOutlineNumberGallery).ListTemplates(1), _
continuepreviouslist:=False, applyto:=wdListApplyToWholeList, defaultlistbehavior:=wdWord9ListBehavior
With .Selection
.ParagraphFormat.Alignment = wdAlignParagraphLeft
.TypeText ("some details")
.TypeParagraph
.TypeText ("some details")
End With
End With
answered May 19, 2014 at 20:18
Mustapha GeorgeMustapha George
2,4779 gold badges47 silver badges79 bronze badges
1
ac1-caesar
Пользователь
Сообщений: 471
Регистрация: 25.07.2013
#2
03.01.2019 13:26:56
Соорудил файл пример с шаблоном.
Разархивировать, открыть эксель файл, нажать кнопку.
Ворд файл с таблицей и нумерованным списком сформируется туда же где находится эксель файл.
Нужно все то же самое, только чтобы во втором столбце каждой строки, нумерация начиналась заново.
Тяжко дружат эксель с вордом….
И синтаксис своеобразный.
Прикрепленные файлы
- Test.zip (35.53 КБ)
Изменено: ac1-caesar — 03.01.2019 14:10:53