1

Тема: Можно ли создать автоматические оглавления по разделам?

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

Кто нибудь в курсе, можно ли создавать автособираемые оглавления разделов одного документа?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

2

Re: Можно ли создать автоматические оглавления по разделам?

просмотрите
'\o "Заголовки"
'Включает в оглавление заголовки, оформленные с помощью встроенных стилей заголовков (Стиль заголовка. Оформление заголовка. В Microsoft Word определены девять различных встроенных стилей заголовков: «Заголовок 1» — «Заголовок 9».)
'Например, { TOC \o "1-3" } включит в оглавление только заголовки, оформленные с помощью встроенных стилей «Заголовок 1», «Заголовок 2» и «Заголовок 3». Если диапазон уровней не указан, в список будут включены заголовки всех уровней, используемые в данном документе
'Диапазон уровней должен быть заключен в кавычки

'\n Уровни
'Исключает из оглавления номера страниц для элементов всех или указанных уровней
'Например, использование кода { TOC \n 3-4 } опускает номера страниц для элементов третьего и четвертого уровней
'Чтобы включить в список номера страниц, удалите этот ключ

'\h Гиперссылки
'Оформляет элементы оглавления как гиперссылки
'Гиперссылка. Цветной подчеркнутый текст или графический объект, по щелчку которого выполняется переход к файлу, фрагменту файла или веб-странице в интрасети или Интернете
'Гиперссылки могут также указывать на группы новостей и сайты Gopher, Telnet и FTP

'\u
'Создание оглавления с помощью абзацев в уровне структуры
'Уровень структуры. Формат абзаца, применяемый для присвоения абзацам документа иерархических уровней («Уровень 1» — «Уровень 9»)
'Это позволяет работать с документом в режимах структуры и схемы документа

'если в список включить номера страниц
'тогда не совпадают номера страниц в списке с номерами страниц в документе

3

Re: Можно ли создать автоматические оглавления по разделам?

Ципихович Эндрю пишет:

просмотрите
'\o "Заголовки"
'Включает в оглавление заголовки, оформленные с помощью встроенных стилей заголовков (Стиль заголовка. Оформление заголовка. В Microsoft Word определены девять различных встроенных стилей заголовков: «Заголовок 1» — «Заголовок 9».)
'Например, { TOC \o "1-3" } включит в оглавление только заголовки, оформленные с помощью встроенных стилей «Заголовок 1», «Заголовок 2» и «Заголовок 3». Если диапазон уровней не указан, в список будут включены заголовки всех уровней, используемые в данном документе
'Диапазон уровней должен быть заключен в кавычки

'\n Уровни
'Исключает из оглавления номера страниц для элементов всех или указанных уровней
'Например, использование кода { TOC \n 3-4 } опускает номера страниц для элементов третьего и четвертого уровней
'Чтобы включить в список номера страниц, удалите этот ключ

'\h Гиперссылки
'Оформляет элементы оглавления как гиперссылки
'Гиперссылка. Цветной подчеркнутый текст или графический объект, по щелчку которого выполняется переход к файлу, фрагменту файла или веб-странице в интрасети или Интернете
'Гиперссылки могут также указывать на группы новостей и сайты Gopher, Telnet и FTP

'\u
'Создание оглавления с помощью абзацев в уровне структуры
'Уровень структуры. Формат абзаца, применяемый для присвоения абзацам документа иерархических уровней («Уровень 1» — «Уровень 9»)
'Это позволяет работать с документом в режимах структуры и схемы документа

'если в список включить номера страниц
'тогда не совпадают номера страниц в списке с номерами страниц в документе


Простите, не понял. Задача состоит в том, чтобы создать отдельные автособираемые оглавления в разных разделах.
Например, есть два раздела - 1 и 2.
В разделе 1 каким-то образом заданы заголовки.
В разделе 2 каким-то образом тоже заданы свои заголовки.
Нужно в разделе 1 собрать оглавление из заголовков из раздела 1, а в разделе 2 собрать оглавление из заголовков из раздела 2.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

4

Re: Можно ли создать автоматические оглавления по разделам?

В разделе 1 каким-то образом заданы заголовки.
В разделе 2 каким-то образом тоже заданы свои заголовки.

требует расшифровки, ну раз Вы знаете то и научите компьютер найти эти заголовки

5

Re: Можно ли создать автоматические оглавления по разделам?

Спасибо, Эндрю!
Правильно ли я понял: вы пишете о том, чтобы задать специальные стили заголовков для каждого раздела, а затем для оглавления каждого раздела задается правило с использованием стилей заголовков этого раздела (Ссылки – Оглавление – Оглавление… - кнопка Параметры).
Результат (пример формирования оглавлений таким образом) прилагаю.

А стандартного способа формирования таких оглавлений по разделам не существует?

Post's attachments

Оглавления по разделам.doc 96 Кб, 7 скачиваний с 2012-07-17 

You don't have the permssions to download the attachments of this post.
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

6

Re: Можно ли создать автоматические оглавления по разделам?

берёте и делаете таблицу с одной строки из трёх ячеек, ширина первой ячейки 30 мм, последней 20 мм. в среднюю помещаете заголовок, в первую ложите поле с каким нибудь только Вам известным знаком, потом ищете поля и считываете с соседней ячейки

7

Re: Можно ли создать автоматические оглавления по разделам?

видимо всё спутал, ответ Выше это для описи, а то что нужно Вам это поле типа{TOC \o "1-4" \n \h \u} что означают буквы - я выкладывал

8

Re: Можно ли создать автоматические оглавления по разделам?

Ципихович Эндрю пишет:

видимо всё спутал, ответ Выше это для описи, а то что нужно Вам это поле типа{TOC \o "1-4" \n \h \u} что означают буквы - я выкладывал

Вставил как поле. Получилось единое оглавление для всех разделов. А как сделать, чтобы Word мог отличить заголовки раздела 1 и раздела 2?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

9

Re: Можно ли создать автоматические оглавления по разделам?

так выкладывал же
'\o "Заголовки"
'Включает в оглавление заголовки, оформленные с помощью встроенных стилей заголовков (Стиль заголовка. Оформление заголовка. В Microsoft Word определены девять различных встроенных стилей заголовков: «Заголовок 1» — «Заголовок 9».)
'Например, { TOC \o "1-3" } включит в оглавление только заголовки, оформленные с помощью встроенных стилей «Заголовок 1», «Заголовок 2» и «Заголовок 3». Если диапазон уровней не указан, в список будут включены заголовки всех уровней, используемые в данном документе
'Диапазон уровней должен быть заключен в кавычки
'\n Уровни
'Исключает из оглавления номера страниц для элементов всех или указанных уровней
'Например, использование кода { TOC \n 3-4 } опускает номера страниц для элементов третьего и четвертого уровней
'Чтобы включить в список номера страниц, удалите этот ключ
а вообще более универсально пройтись по скрытым закладкам типа ТОС и наварачивать под себя

10

Re: Можно ли создать автоматические оглавления по разделам?

Для того, чтобы создать оглавление по разделам, надо создать закладки на эти разделы примерно так

Sub BookmarksSection()
Dim Section As Section
Dim Rng As Range
    For Each Section In ActiveDocument.Sections
        Set Rng = Section.Range
        Rng.Bookmarks.Add "Section_" & Section.Index, Rng
    Next Section
End Sub

Далее проще пареной репы.
Ставим курсор в конце раздела.
Добавляем поле ТОС с кодом TOC \b "Section_1" \f \h \z \t "Razdel©;1;Glava©;2"

где
\b "Section_1" ссылка на закладку 1-го раздела
\t "Razdel©;1;Glava©;2" названия и уровни стилей включаемые в заголовки
Делаем все это для всех разделов

11

Re: Можно ли создать автоматические оглавления по разделам?

aap77 пишет:

Для того, чтобы создать оглавление по разделам, надо создать закладки на эти разделы примерно так

Sub BookmarksSection()
Dim Section As Section
Dim Rng As Range
    For Each Section In ActiveDocument.Sections
        Set Rng = Section.Range
        Rng.Bookmarks.Add "Section_" & Section.Index, Rng
    Next Section
End Sub

Далее проще пареной репы.
Ставим курсор в конце раздела.
Добавляем поле ТОС с кодом TOC \b "Section_1" \f \h \z \t "Razdel©;1;Glava©;2"

где
\b "Section_1" ссылка на закладку 1-го раздела
\t "Razdel©;1;Glava©;2" названия и уровни стилей включаемые в заголовки
Делаем все это для всех разделов

Правильно ли я понял, что в этом случае не нужно создавать отдельные стили для каждого раздела?

Еще я хотел бы уточнить про параметр \t "Razdel©;1;Glava©;2".
Например, у меня используются следующие шрифты:
- ООО_Заголовок 1, уровень 1;
- ООО_Заголовок 2, уровень 2;
- ООО_Заголовок 3, уровень 3.

Что мне нужно писать в качестве параметра? :

 [b]\t "ООО_Заголовок 1;1;ООО_Заголовок 2;2;ООО_Заголовок 3;3"[/b]

Так?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

12

Re: Можно ли создать автоматические оглавления по разделам?

Заголовки стилей остаются те же
Меняется только имя закладки
\b "Section_1", \b "Section_2", \b "Section_3" и т.д.

13

Re: Можно ли создать автоматические оглавления по разделам?

В место моих стиле Razdel© и Glava© Ставите свои
\t "ООО_Заголовок 1;1;ООО_Заголовок 2;2;ООО_Заголовок 3;3"

14

Re: Можно ли создать автоматические оглавления по разделам?

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

15

Re: Можно ли создать автоматические оглавления по разделам?

aap77 пишет:

В место моих стиле Razdel© и Glava© Ставите свои
\t "ООО_Заголовок 1;1;ООО_Заголовок 2;2;ООО_Заголовок 3;3"

Спасибо, Александр, сейчас проверю.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

16

Re: Можно ли создать автоматические оглавления по разделам?

Вот макрос создающий оглавление раздела по Вашим стилям

Sub AddTOC_Section()
Dim SectionNum As Variant, SectionName As String
    SectionNum = Selection.Sections(1).Index
    SectionName = "Section_" & SectionNum
    ActiveDocument.Sections(SectionNum).Range.Bookmarks.Add SectionName, ActiveDocument.Sections(SectionNum).Range
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "TOC \b" & SectionName & " \f \h \z \t ""ООО_Заголовок 1;1;ООО_Заголовок 2;2;ООО_Заголовок 3;3""", _
        PreserveFormatting:=True
End Sub

Все что нужно сделать это поставить курсор в нужном разделе и том месте куда хотите вставить оглавление

17

Re: Можно ли создать автоматические оглавления по разделам?

Во вложении форма Worda позволяющая пользователю самому выбирать стили и уровни оглавления, и создавать оглавление раздела на месте курсора

Post's attachments

form_AddTOCSection.rar 2.2 Кб, 16 скачиваний с 2012-07-18 

You don't have the permssions to download the attachments of this post.

18

Re: Можно ли создать автоматические оглавления по разделам?

Макрос отлично работает!

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

19

Re: Можно ли создать автоматические оглавления по разделам?

А форма еще лучше, выбираем стиль, выставляем уровень, жмем добавить, когда все стили добавлены жмем ОК

20

Re: Можно ли создать автоматические оглавления по разделам?

aap77 пишет:

А форма еще лучше, выбираем стиль, выставляем уровень, жмем добавить, когда все стили добавлены жмем ОК

Это будет вообще супер!  smile

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

21

Re: Можно ли создать автоматические оглавления по разделам?

Я форму выложил в посте 17, Александр протестируйте ее плж smile

22

Re: Можно ли создать автоматические оглавления по разделам?

Принцип работы
1. Ставим курсор в конец раздела
2. Запускаем форму
3. В списке стилей выбираем ООО_Заголовок 1
4. Во всплывающем списке Уровень выбираем 1
5. Жмем Добавить
6. В списке стилей выбираем ООО_Заголовок 2
7. Во всплывающем списке Уровень выбираем 2
8. Жмем Добавить (тоже для ООО_Заголовок 3)
9. Жмем OK

Отредактировано aap77 (18.07.2012 15:29:59)

23

Re: Можно ли создать автоматические оглавления по разделам?

aap77 пишет:

Я форму выложил в посте 17, Александр протестируйте ее плж smile

C удовольствием протестирую.
Я импортировал файл формы form_AddTOCSection.frm в редактор VBA.
Но я не помню, как я могу запустить ее из открытого файла?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

24

Re: Можно ли создать автоматические оглавления по разделам?

Во вложении чуть модифицированная форма
Создайте новый модуль или в ThisDocument Создайте процедуру

Sub AddTOC_Section()
    form_AddTOCSection.Show
End Sub
Post's attachments

form_AddTOCSection.rar 2.17 Кб, 6 скачиваний с 2012-07-18 

You don't have the permssions to download the attachments of this post.

25

Re: Можно ли создать автоматические оглавления по разделам?

aap77 пишет:

Во вложении чуть модифицированная форма
Создайте новый модуль или в ThisDocument Создайте процедуру

Sub AddTOC_Section()
    form_AddTOCSection.Show
End Sub

Форма отлично работает!

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

26

Re: Можно ли создать автоматические оглавления по разделам?

Рад был помочь smile

27

Re: Можно ли создать автоматические оглавления по разделам?

Кстати стили можно выбирать в любом порядке, главное чтобы правильно был указан уроыень

28

Re: Можно ли создать автоматические оглавления по разделам?

А можно было бы выбирать только стили с уровнем 1-9?
Вроде бы, уровень определяет свойство OutlineLevel объекта ParagraphFormat.

Александр, ума не приложу, как это можно здесь применить и можно ли?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

29

Re: Можно ли создать автоматические оглавления по разделам?

Можно, но геморойно делать по уровням, самое удобное делать через тег \t. Могу написать макрос составления этого тега

30

Re: Можно ли создать автоматические оглавления по разделам?

aap77 пишет:

Можно, но геморойно делать по уровням, самое удобное делать через тег \t. Могу написать макрос составления этого тега

Тогда бы программа могла сама определить уровень! Это возможно?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

31

Re: Можно ли создать автоматические оглавления по разделам?

Alex_Gur пишет:
aap77 пишет:

Можно, но геморойно делать по уровням, самое удобное делать через тег \t. Могу написать макрос составления этого тега

Тогда бы программа могла сама определить уровень! Это возможно?

Возможно, если стили заголовков оформлены по уровням, то можно написать код ограничений создания оглавления.
Сейчас еще продумываю код вставки заголовков для таблиц, рисунков и т.п. (замена функции Worda Вставить название, чтобы можно было отдельно составлять списки таблиц, рисунков и т.п.

32

Re: Можно ли создать автоматические оглавления по разделам?

Для более универсального составления оглавлений по данной теме для начала написал 2-е основополагающие функции:

Public Function CollecStylesOnTag(Optional Tag As String) As Collection
' Функция возвращает коллекцию стилей на основе _
определенного идентификатора в имени стиля.
' Tag - это не обязательный параметр, являющися идентификатором _
для создания коллекции стилей. Если параметр не задан, то будет _
выводиться окно запроса Тега

Dim Style As Style
    If IsMissing(Tag) = True Then
        Tag = InputBox("Введите идентификатор стилей:")
    End If
    Set CollecStylesOnTag = New Collection
        For Each Style In ActiveDocument.Styles
            If InStr(1, Style.NameLocal, Tag) > 0 Then
                CollecStylesOnTag.Add Style
            End If
        Next Style
End Function

Public Function ListOutLineStyle(Styles As Collection) As Variant
' Функция возвращает массив стилей на основе _
сортировки определенной коллекции Styles

Dim Style As Style, col As Collection
Dim lst() As Variant, i As Byte
    ReDim Preserve lst(1 To Styles.Count, 1 To 2)
        For i = 1 To Styles.Count
            Set Style = Styles(i)
                    lst(i, 1) = Style.NameLocal
                    lst(i, 2) = Style.ParagraphFormat.OutlineLevel
        Next i
        ListOutLineStyle = lst
End Function

На основе этих функций можно составить условие для Оглавления к тегу \t

Public Function ContentStyle() As String
' Функция возвращает строку с тегом \t c Именами Стилей _
и Номерами Уровней для последующего создания поля TOC (Оглавление)
' Пример "\t "ООО_Заголовок 1;1;ООО_Заголовок 2; 1;ООО_Заголовок 2; 1""

Dim StyleTOC As Collection
Dim OutLineStyleTOC As Variant, i As Byte
Dim strText As String
    ContentStyle = "\t "
    strText = Chr(34)
        Set StyleTOC = CollecStylesOnTag("ООО_Заголовок")
        OutLineStyleTOC = ListOutLineStyle(StyleTOC)
            For i = 1 To StyleTOC.Count
                If i < StyleTOC.Count Then
                    strText = strText & OutLineStyleTOC(i, 1) & ";" & OutLineStyleTOC(i, 2) & ";"
                Else
                    strText = strText & OutLineStyleTOC(i, 1) & ";" & OutLineStyleTOC(i, 2) & Chr(34)
                End If
            Next i
     ContentStyle = ContentStyle & strText
End Function

Имя данный набор функций уже легче создавать код для составления Оглавления.
Вот унифицированная функция StyleTOC

Public Function ContentStyle() As String
' Функция возвращает строку с тегом \t c Именами Стилей _
и Номерами Уровней для последующего создания поля TOC (Оглавление)
' Пример "\t "ООО_Заголовок 1;1;ООО_Заголовок 2; 1;ООО_Заголовок 2; 1""

Dim StyleTOC As Collection
Dim OutLineStyleTOC As Variant, i As Byte
Dim strText As String
    ContentStyle = "\t "
    strText = Chr(34)
        Set StyleTOC = CollecStylesOnTag()
        OutLineStyleTOC = ListOutLineStyle(StyleTOC)
            For i = 1 To StyleTOC.Count
                If i < StyleTOC.Count Then
                    strText = strText & OutLineStyleTOC(i, 1) & ";" & OutLineStyleTOC(i, 2) & ";"
                Else
                    strText = strText & OutLineStyleTOC(i, 1) & ";" & OutLineStyleTOC(i, 2) & Chr(34)
                End If
            Next i
     ContentStyle = ContentStyle & strText
End Function

33

Re: Можно ли создать автоматические оглавления по разделам?

Александр, поясните, пожалуйста, как вам удалось "привязать" ParagraphFormat.OutlineLevel к объекту Style?

Я, например, переписал выражение, следующее из вашей программы (из функции ListOutLineStyle), и выдается ошибка 5891. Это свойство недоступно для этого объекта:

ActiveDocument.Styles(i).ParagraphFormat.OutlineLevel
Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

34

Re: Можно ли создать автоматические оглавления по разделам?

Если используется выражение

ActiveDocument.Styles(i).ParagraphFormat.OutlineLevel

то оно используется в цикле

For i = 1 to ActiveDocument.Styles.Count
    ActiveDocument.Styles(i).ParagraphFormat.OutlineLevel
Next i

Ошибка возникает потому, что в цикле перечисляются Стили документа всех типов.
Чтобы ее избежать нужен цикл с условием что Стиль является стилем абзаца

For i = 1 to ActiveDocument.Styles.Count
    If Style.Type = wdParagraph Then
        Level = ActiveDocument.Styles(i).ParagraphFormat.OutlineLevel
    End if
Next i

В моей функции ListOutLineStyle используются только стили абзаца, т.к. Ворд строит оглавление ТОС только на стилях абзаца

35

Re: Можно ли создать автоматические оглавления по разделам?

Можно и такое решение использовать:

Sub ShowStyles()
    Dim i As Integer
    Dim k As Integer
    k = 0
    For i = 1 To ActiveDocument.Styles.Count
        Selection.Style = ActiveDocument.Styles(i)
        If ActiveDocument.Styles(i).Type = wdStyleTypeParagraph Or ActiveDocument.Styles(i).Type = wdStyleTypeParagraphOnly Then
            If Selection.ParagraphFormat.OutlineLevel < wdOutlineLevelBodyText Then
            'отбор стилей с уровнями 1-9
                Selection.Range.Text = i & " " & ActiveDocument.Styles(i).NameLocal & " ; Уровень: " & Selection.ParagraphFormat.OutlineLevel
                'вывод номеров стилей в коллекции, их наименований и уровней параграфов
                Selection.EndKey Unit:=wdLine
                Selection.TypeParagraph
                'переход к новой строке
                Selection.Style = ActiveDocument.Styles("Обычный")
                'установка для новой строки стиля Обычный
                k = k + 1
            End If
        End If
    Next i
    Selection.Range.Text = "Всего стилей:  " & ActiveDocument.Styles.Count
    Selection.EndKey Unit:=wdLine
    Selection.TypeParagraph
    Selection.Range.Text = "Итого отобрано стилей:  " & k
End Sub

Стиль применяется к текущему параграфу, а затем измеряется уровень параграфа и соотносится со стилем.
Не очень красиво, но, вроде, работает. smile
Спасибо за подсказку.

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.