Статьи из блога

Статьи из блога

Двойная нумерация страниц в документе

Андрей интересуется:

Возникла необходимость вести в документе две нумерации страниц - сквозную (внизу страницы) и внутреннюю, по разделам, то есть часть номеров страниц в верхнем и нижнем колонтитуле не совпадает - можно это автоматизировать?

Стандартными способами в редакторе Word 2003 это сделать не удастся. Но на официальном сайте Microsoft есть замечательная статья на русском языке, описывающая два способа реализации схемы двойной нумерации в одном документе.

Статья называется Как создать две различные схемы нумерации страниц в одном и том же документе Microsoft Word 2002. Несмотря на название, схема корректно работает и в редакторе Word 2003.

 

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

 

К сожалению, в редакторе Word 2007 макрос хоть и работает, но сквозная нумерация страниц не поддерживается (в нижнем колонтитуле). Если кто-нибудь сможет доработать этот макрос для Word 2007, я буду благодарен (не один я, наверное).

Sub twinNumberingPages()
'Двойная нумерация страниц в документе, состоящим из разделов:
'  верхний колонтитул - номер страницы в текущем разделе
'  нижний колонтитул - сквозной номер страницы всего документа
'Создан на основе статьи Microsoft http://support.microsoft.com/kb/291283
'Макрос был поправлен Steven Graig Miller 09.06.2008 г.
Dim oRange As Range
Dim hfRange As Range
Dim nSections As Long
Dim nIndex As Long
'
' Шаг 1: Добавляем поля в начало первой страницы первого раздела
'
Set oRange = ActiveDocument.Range(0, 0) 'определяем начало документа
oRange.Select
oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable1 \h \r", PreserveFormatting:=False
ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
Selection.Move wdCharacter, -1
oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSectionPages, PreserveFormatting:=False
Selection.Move wdCharacter, 1
oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable2 \h \r0", PreserveFormatting:=False
nSections = ActiveDocument.Sections.Count
'
' Шаг 2: Добавляем два поля в начало каждого раздела кроме 1-го раздела
'
If nSections > 1 Then
    For nIndex = 2 To nSections
        Set oRange = ActiveDocument.Sections(nIndex).Range
        oRange.Collapse wdCollapseStart
        oRange.Select
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable2 \h \r", PreserveFormatting:=False
        Selection.Move wdCharacter, -1
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldExpression, PreserveFormatting:=False
        Selection.Move wdCharacter, 3
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable1 \c", PreserveFormatting:=False
        Selection.Move wdCharacter, 3
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable1 \h \r", PreserveFormatting:=False
        Selection.Move wdCharacter, -1
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldExpression, Text:="+", PreserveFormatting:=False
        Selection.Move wdCharacter, 3
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSectionPages, PreserveFormatting:=False
        Selection.Move wdCharacter, 3
        oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable2 \c", PreserveFormatting:=False
    Next nIndex
End If
'
' Шаг 3: Добавляем верхний и нижний колонтитулы
'
ActiveDocument.ActiveWindow.View.ShowFieldCodes = False
Set hfRange = oRange.Sections(1).Headers(wdHeaderFooterPrimary).Range
With hfRange
    .Delete
    .Text = "Страница "
    .MoveEnd unit:=wdCharacter, Count:=1
    .Collapse wdCollapseEnd
    oRange.Fields.Add Range:=hfRange, Type:=wdFieldPage
    .MoveEnd unit:=wdCharacter, Count:=1
    .Collapse wdCollapseEnd
    .Text = " из "
    .MoveEnd unit:=wdCharacter, Count:=1
    .Collapse wdCollapseEnd
    oRange.Fields.Add Range:=hfRange, Type:=wdFieldSectionPages
End With
Set hfRange = oRange.Sections(1).Footers(wdHeaderFooterPrimary).Range
ActiveDocument.ActiveWindow.View.ShowFieldCodes = True
hfRange.Collapse wdCollapseStart
hfRange.Select
hfRange.Fields.Add Range:=Selection.Range, Type:=wdFieldExpression, Text:="+", PreserveFormatting:=False
Selection.Move wdCharacter, 3
oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldSequence, Text:="variable2 \c", PreserveFormatting:=False
Selection.Move wdCharacter, 3
oRange.Fields.Add Range:=Selection.Range, Type:=wdFieldPage, PreserveFormatting:=False
ActiveDocument.ActiveWindow.View.ShowFieldCodes = False
'
' Шаг 4: Устанавливаем формат номеров (нумерация начинается с 1 в каждом разделе)
'
For nIndex = 1 To nSections
    With ActiveDocument.Sections(nIndex).Headers(wdHeaderFooterPrimary)
        .PageNumbers.NumberStyle = wdPageNumberStyleArabic
        .PageNumbers.HeadingLevelForChapter = 0
        .PageNumbers.IncludeChapterNumber = False
        .PageNumbers.ChapterPageSeparator = wdSeparatorHyphen
        .PageNumbers.RestartNumberingAtSection = True
        .PageNumbers.StartingNumber = 1
    End With
Next nIndex
ActiveDocument.Range(0, 0).Select
ActiveWindow.View.Type = wdPrintView    'переключаемся в режим Разметка страницы
ActiveWindow.View.Zoom.PageFit = wdPageFitBestFit
End Sub

Один из читателей сайта - Алексей Вишнивецкий - предложил свое решение двойной нумерации страниц, основанное на статье Грега Макси (Greg Maxey). Ознакомиться с пошаговой инструкцией Алексея можно на его сайте: Двойная нумерация в Word.
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 4

  1. 27.09.2010 в 10:53 | #1

    Чтоб скрипт заработал в Word2007 достаточно в конце добавить строчку:

    ActiveDocument.Fields.Update

  2. Вишнивецкий Алексей
    03.11.2010 в 21:23 | #2

    Решил проблему двойной нумерации значительно проще. Если кто нить разместит эту информацию на этом сайте буду только за)

    http://vishnivetskiy-alexey.narod2.ru/word/

  3. 03.11.2010 в 21:52 | #3

    Алексей, спасибо. Добавил в конец заметки информационный блок с ссылкой на вашу инструкцию.

  4. Анна
    23.08.2013 в 17:31 | #4

    Столкнулась как раз с такой задачей. Воспользовалась способом Алексея, немного его изменив. Ибо у меня порядка 60 разделов, весь текст идентичен, кроме нумерации. Итак, как сохранить единые колонтитулы для всего дока (Word 2010).

    Нумерация по разделам делается стандартно - поле "Page" (начинать с 1) и поле "SectionPage". А теперь про сквозную.

    В начале каждого раздела (именно в начале, это важно) пишем формулу, которую предложил Алексей ({={page}+{pageRef R1}+1}), и назначаем ей стиль (например, "Нумерация сквозная"). А в колонтитуле для номера страницы вставляем поле {={page}+{StyleRef "Нумерация сквозная"}}. Всё. Если номер первой страницы не "1", то эта цифра тоже прописывается в формуле.

    Потом этот стиль можно сделать маленьким, белым, скрытым... каким угодно, чтобы он был не виден.

Оставьте комментарий!

(обязательно)

^ Наверх