Vba word нумерация страниц
Вставка особой нумерации на нечетные страницы с разрывом страницы
По ГОСТ18675-79, если текст в разделе заканчивается на нечетной странице, то номер этой страницы должен иметь вид n/n+1, например 7/8, так как на следующей - четной странице - текст отсутствует, а новый раздел начинается с нечетной страницы (9). Предыдущие страницы имеют нормальную нумерацию. Можно ли в Ворде реализовать такую нумерацию автоматически? |
Я смог частично решить задачу, но уперся в определение разрыва страницы. Мой макрос (ниже) вставляет нужную нумерацию на нечетные страницы, но вот как сделать, чтобы эта нумерация вставлялась только на те нечетные страницы, которые имеют разрыв страницы - не смог осилить.
Пробовал определять разрыв по коду (12), но в цикле это приводит к ошибке (не существует такой объект).
Если кто может помочь, подскажите пожалуйста. Во вложении и документ-образец с текстом и разрывами.
Спасибо.
Здесь сама концепция неправильная - в одном разделе не могут быть разные колонтитулы чётных и нечётных страниц: все колонтитулы чётных страниц одинаковы, все колонтитулы нечётных страниц - одинаковые. Исключение составляет только первая страница раздела, на которой может быть уникальный колонтитул.
Я тоже задумался над этой проблемой. Ее можно было бы решить и без макросов, только полями, но все упирается в проблему определения количества страниц в разделе. А макросом, конечно, проще. Чуть позже решу, ближе к полуночи
Александр, спасибо. Буду ждать, ибо вопрос и меня зацепил так, что вчера полдня убил на раздумья.
- Ты путаешь Разрыв страницы с Разрывом раздела. Здесь речь не о Разрыве страницы, а о Разрыве Раздела.
- И зачем ты на пустых листах вставляешь Разрывы разделов? Я так понимаю, потому что ты хочешь вставить пустую страницу, т.к. речь идёт о двусторонней печати. Для вставки пустых страниц при двусторонней печати надо использовать Разрыв раздела с чётной страницы или Разрыв раздела с нечётной страницы.
- Ничего у вас не получится: если вы вставите какой-то особый номер страницы на одной нечётной странице, то он будет такой же на всех остальных нечётных страницах, а надо, как я понимаю, чтобы особый номер был только на одной нечётной странице - последней в разделе.
Последний раз редактировалось БуреВестник; 12.10.2009 в 16:46 .
Я даже не читая кода (плохо понимаю, что там), уже нашёл 3 ошибки:[*]Ты путаешь Разрыв страницы с Разрывом раздела. Здесь речь не о Разрыве страницы, а о Разрыве Раздела.
Не путаю. Я разрываю страницу (прерываю один раздел) и вставляю новый раздел. Возможно, путаница в терминологиии.
[*]И зачем ты на пустых листах вставляешь Разрывы разделов? Я так понимаю, потому что ты хочешь вставить пустую страницу, т.к. речь идёт о двусторонней печати. Для вставки пустых страниц при двусторонней печати надо использовать Разрыв раздела с чётной страницы или Разрыв раздела с нечётной страницы. |
[*]Ничего у вас не получится: если вы вставите какой-то особый номер страницы на одной нечётной странице, то будет такой же на всех остальных нечётных страницах, а надо, как я понимаю, чтобы особый номер был только на одной нечётной странице - последней в разделе. |
Правильно понимаешь. Но не стоит быть столь категоричным. Практика покажет.
При подготовке данного материала я столкнулся с некоторыми нестыковками… Так, в большинстве случаев у коллекции PageNumbers будет только один класс PageNumber, это и логично, так как нельзя сделать несколько "нумераций" страниц для одного раздела. Вторая нестыковка – если нумерация страниц в ворде для верхнего колонтитула начинается с заданного номера, то это автоматически влияет и на нумерацию для нижнего колонтитула. С одной стороны это понятно, какой смысл задавать различную нумерацию для верхнего и нижнего колонтитула, но, непонятно следующее…
Доступ к коллекции PageNumbers осуществляется через одноименное свойство объекта HeaderFooter, а тот в свою очередь, мы получаем через свойства Headers или Footers класса Section. Как видим, мы можем указать, для какого колонтитула (верхнего или нижнего) нужно задавать нумерацию в Word.
Коллекция PageNumbers – нумерация в Word
Свойства – нумерация страниц в Word
ChapterPageSeparator - Возвращает или устанавливает разделитель, используемый между номером главы и страницы. Значение константы WdSeparatorType:
- wdSeparatorColon - 2 - двоеточие.
- wdSeparatorEmDash - 3 - подчеркнутое тире.
- wdSeparatorEnDash - 4 - стандартное тире.
- wdSeparatorHyphen - 0 - дефис.
- wdSeparatorPeriod - 1 - период.
HeadingLevelForChapter - Возвращает или задает уровень заголовка (от 0 до 8), который применяется к названиям глав в документе.
IncludeChapterNumber – Значение true, если номер главы входит в номера страниц. Чтение и запись.
NumberStyle - Возвращает или задает значение константы WdPageNumberStyle, которая представляет собой стиль нумерации страниц в Word.
RestartNumberingAtSection – Если значение свойства установлено в true, то при вызове метода Add нумерация в ворде будет начинаться с числа 0. Если значение false – то нумерация будет начинаться с числа одни, а попытка переопределить начальный пункт нумерации ворд страницы с помощью свойства StartingNumber ничего не даст. Чтение и запись.
ShowFirstPageNumber – Значение true – происходит автоматическое добавление пункта для нумерации Word страницы в нижний колонтитул.
StartingNumber - Возвращает или устанавливает значение, которое определяет начало нумерации страниц в ворде. Указанный номер может быть виден или не виден на первой странице в зависимости от установок свойства ShowFirstPageNumber. Если свойство RestartNumberingAtSection установлено в false, то будет происходить переопределение свойства StartingNumber так, чтобы нумерация в Word продолжалась из предыдущего раздела
Application - Возвращает объект Application, представляющий приложение Microsoft Word.
Count - Возвращает число номеров страниц в коллекции. В большинстве случаев, колонтитулы содержат только один номер страницы, который является числом 1.
Методы – как сделать нумерацию в ворде
Add (PageNumberAlignment, FirstPage) - Возвращает класс PageNumber, представляющий номера, добавленные в верхний или нижний колонтитул раздела. Оба параметра являются дополнительными.
PageNumberAlignment – Определяет положение номера, значение константы WdPageNumberAlignment:
- wdAlignPageNumberLeft - 0 – По левому краю.
- wdAlignPageNumberCenter - 1 - По центру.
- wdAlignPageNumberRight - 2 – По правому краю.
- wdAlignPageNumberInside - 3 – По левому краю.
- wdAlignPageNumberOutside - 4 – По правому краю.
FirstPage – Если установлено значение false, то номер не добавляется к первой странице. Если этот аргумент опущен, параметры нумерации в ворде определяет свойство DifferentFirstPageHeaderFooter класса PageSetup.
Item (index) – Доступ к объекту PageNumber по его номеру в коллекции PageNumbers. Фактически, количество классов PageNumber ровно 1.
PageNumber – Нумерация в ворде
Свойства – нумерация страниц в ворде
Alignment - Возвращает или задает выравнивание для номера страницы. Значение константы WdPageNumberAlignment (смотрите выше).
Application - Возвращает объект Application, представляющий приложение Microsoft Word.
Index – Позиция элемента в коллекции. Только чтение.
Методы – как в ворде сделать нумерацию страниц
Copy () - Копирует заданный PageNumber в буфер обмена.
Cut ()- Вырезает указанный PageNumber из документа и помещает его в буфер обмена.
Delete () - Удаляет указанный PageNumber. Фактически, мы отменяем нумерацию в Word для выбранного колонтитула
Select () – Выбор указанного PageNumber. После использования этого метода, следует использовать свойство Selection для работы с выбранным элементом.
Хорошо, с теоретической частью мы закончили, теперь можно приступить к программированию. Я приведу два примера кода на языке VBScript и JScript сервера сценариев Windows Script Host:
Пример программного кода на языке VBSCRIPT:
Пример программного кода на языке JSCRIPT:
В данных примерах происходит создание двух документов, для каждого документа создается ссылка на класс Range (переменные oRange1 и oRange2). Это нужно для того, что бы мы смогли добавить текст или страницы в нужный документ. Далее происходит нумерация страниц в Word для первого и второго документа. В одном случаем мы связываем нумерацию страниц в ворд со стилями и списками (в документ будут добавлены заголовки, а номера страниц будут с ними связаны). В другом случаем мы просто задаем стиль нумерация Word для всех страниц и определяем, что нумерация ворд должна начинаться с цифры 5.
Спасибо за внимание. Автор блога Владимир Баталий
Коллекция ListGalleries является отправной точкой, чтобы сделать маркированный или нумерованный список в Word с помощью макросов VBA, или сценариев сервера Windows Script Host. По сути, коллекция хранит объекты ListGallery, которые представляют индивидуальный список, но, ни ListGalleries и ListGallery не содержат средств для формирования списка Word с нужными параметрами. Так, с практической стороны вам понадобится только одно свойство и один метод из коллекции и два свойства и один метод.
Для доступа к коллекции ListGalleries используется одноименное свойство класса Word.Application . Так как данный материал немного запутан, то давайте для начала рассмотрим свойства и метода коллекции и класса, а уже потом я постараюсь показать и объяснить, что и для чего нужно…
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 (смотрите выше) или задать значение напрямую:
Обратите внимание, что мы передаем не номер класса, а его тип (всего три варианта).
После того, как мы определились с нужным типом списка в Word и получили доступ к ListGallery, нам нужно обратиться к свойству ListTemplates, которое позволяет получить доступ к одноименной коллекция:
Хорошо мы получили доступ к коллекции 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
Пример на языке JScript
Хорошо, теперь давайте разберем программный код. В обоих сценариях объявление практически одинаковые переменные, в примере на 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.
Спасибо за внимание. Автор блога Владимир Баталий
Я хочу получить номер текущей страницы String, включая ее формат.
Например: некоторые разделы могут иметь идентификатор главы (1-1), некоторые в римском стиле и т. Д.
Я надеялся получить выбор конкретного нижнего колонтитула, затем перебрать поля и получить данные поля страницы («Вывод - это строка, которую я хочу»).
Насколько я вижу, нет возможности циклически перебрать нижние колонтитулы данного раздела, просто получите общий шаблон и попробуйте поработать с ним.
Мне известно о wdActiveEndAdjustedPageNumber из Selection.Range.Information , но это просто дает мне частичную информацию.
Я ошибаюсь? Можно ли выбрать определенный нижний колонтитул для работы?
Если нет, можете ли вы подсказать мне, как получить следующие данные:
- Значение ближайшего номера главы
- Получение значения номера страницы специального формата, такого как латинский алфавитный шрифт (имеется в виду применение формата страницы к wdActiveEndAdjustedPageNumber )
Изменить для пояснения:
В моем шаблоне слова стиль заголовка 1 создает следующий заголовок: Глава 1 , затем Глава 2 и т. Д.
В формате номера страницы есть возможность включить текущее значение главы в номер страницы.
Например: при условии следующей настройки
будет отображаться с этими страницами в поле < PAGE >: 1-1, 1-2, 1-3, . Моя цель - каким-то образом получить всю эту «ценность» для конкретного нижнего колонтитула.
Вот фрагмент кода, который не будет работать правильно:
Результатом такого метода является «1-1»
Причина, по которой он не работает, заключается в том, что он может извлечь только первую страницу (или вторую, используя wdHeaderFooterEvenPages ).
То же самое касается формата римских чисел или любого другого из этого списка.
Для следующих настроек номера страницы я хочу получить значение в определенном нижнем колонтитуле.
Код выше вернет значения для первой или второй страницы, и все.
Есть ли способ получить доступ к любому нижнему колонтитулу в документе и выполнить мой пример кода?
Если нет, как я могу получить «значение» номера страницы для любого нижнего колонтитула, который я выберу?
Надеюсь, это понятнее.
Читайте также: