Vba word поля страницы

SharpFellow

55 / 30 / 4

Регистрация: 03.11.2011

Сообщений: 130

1

08.11.2011, 15:03. Показов 10647. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Снова добрый день.
Собственно сабж.

Visual Basic
1
2
3
Set objWord = CreateObject("Word.Application")  '  экземпляр приложения
Set objDoc = objWord.Documents.Add()'  экземпляр документа
objDoc.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2)

Сейчас так.
Ошибка: «Несоответствие типа: ‘CentimetersToPoints'»
Или хотя бы скажите сколько «поинтов» в сантиметре)

________________________
Мои вопросы — ваши ответы.
Вопрос:
Через VBA отключить отображение сетки таблицы в Word.
Ответ:

Visual Basic
1
ActiveDocument.ActiveWindow.View.TableGridlines = True 'или False

В Word: Таблица ->Отображать сетку.



0



R Dmitry

406 / 75 / 6

Регистрация: 31.01.2011

Сообщений: 111

Записей в блоге: 1

08.11.2011, 15:12

2

Цитата
Сообщение от Sharpfellow
Посмотреть сообщение

Снова добрый день.
Собственно сабж.

Visual Basic
1
2
3
Set objWord = CreateObject("Word.Application")  '  экземпляр приложения
Set objDoc = objWord.Documents.Add()'  экземпляр документа
objDoc.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2)

Сейчас так.
Ошибка: «Несоответствие типа: ‘CentimetersToPoints'»
Или хотя бы скажите сколько «поинтов» в сантиметре)

________________________
Мои вопросы — ваши ответы.
Вопрос:
Через VBA отключить отображение сетки таблицы в Word.
Ответ:

Visual Basic
1
ActiveDocument.ActiveWindow.View.TableGridlines = True 'или False

В Word: Таблица ->Отображать сетку.

собственно все работает если корректно обращаться к объекту Word

Visual Basic
1
2
3
4
5
6
Sub Test()
Set objWord = CreateObject("Word.Application")  '  экземпляр приложения
Set objDoc = objWord.Documents.Add() '  экземпляр документа
objDoc.Application.Selection.PageSetup.LeftMargin = objDoc.Application.CentimetersToPoints(5)
objDoc.Application.Visible = True
End Sub



3



SharpFellow

55 / 30 / 4

Регистрация: 03.11.2011

Сообщений: 130

08.11.2011, 15:20

 [ТС]

3

R Dmitry, спасибо.
________
Вопрос:
Через VBA установить поля для документа Word в сантиметрах.
Ответ:

Visual Basic
1
objDoc.Application.Selection.PageSetup.LeftMargin = objDoc.Application.CentimetersToPoints(5) 'левое поле



0



Logo Море(!) аналитической информации!

2006 г.

Word и его объекты
Лекция из курса «Основы офисного программирования и документы Word»

Биллиг Владимир Арнольдович
Интернет-Университет Информационных Технологий, INTUIT.ru

Назад Оглавление Вперёд

Работа с полями документа

Поля (коллекция Fields) используются в документах Word достаточно широко и играют множество самых разных ролей. Поэтому стоит поговорить о них подробнее. В зависимости от назначения поля оно относится к одной из 9 возможных категорий. Нет смысла и возможности заниматься полным анализом этих категорий, но некоторые основные роли, которые играют поля, я перечислю:

  1. Поля могут хранить в документе некоторую обновляемую информацию. Такими полями являются поля Date и Time из категории Date and Time, хранящие текущую дату и текущее время. В полях Author, FileName, KeyWords, NumPages и других полях из категории Document Information содержится подробная информация о документе авторе документа, файле, в котором он находится, числе занимаемых страниц. В полях UserName и UserAddress из категории User Information хранится информация о фамилии и адресе владельца компьютера, используемая по умолчанию для создания поля Author документа, для создания обратного адреса по умолчанию при работе с конвертами. Эта роль полей достаточно понятна. Ясно, как программно и вручную можно работать с такими полями. Заметим, что значения некоторых из упомянутых полей меняются автоматически, например, время, дата, число страниц документа (число страниц документа — 57, число символов — 149609, дата — 01.07.2006, время — 9:27 )

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

  2. Поля играют важную роль при создании документов с помощью слияния. Зачастую возникает необходимость создания группы однотипных документов, отличающихся лишь небольшими деталями. Типичным примером такого рода является группа рассылаемых писем, отличающихся адресом, названием компании и другими деталями. В этом случае создается главный документ, содержащий шаблон письма с полями и документ, хранящий источник данных. Поля главного документа задают переменную часть письма адрес, название компании и другие данные. Значения этих данных хранятся в источнике данных, который может быть таблицей Word, Access или Excel. Слияние главного документа с одной записью источника данных (строкой таблицы) приводит к появлению нового документа (письма). В слиянии могут участвовать как все записи источника данных, так и только часть из них, выбранная по запросу. В результате возникает необходимая совокупность писем. Имена полей в этом случае могут быть произвольными и представляют имена столбцов в таблице, задающей источник данных. Помимо этих полей в главном документе могут встречаться и поля Word из тех 9 категорий, о которых я уже говорил. В ситуациях слияния часто используются такие поля как Ask и Fill-In, позволяя в момент слияния запросить и добавить в документ индивидуальную информацию, не хранящуюся в записях источника данных. Поле Fill-In позволяет запросить данные при создании документа и сделать полученный ответ значением этого поля. Поле Ask работает аналогичным образом, за тем исключением, что ответ не становится значением поля, а связывается с некоторой создаваемой в этот момент закладкой. Затем эту закладку можно использовать в документе различными способами, принятыми для закладок. На деталях работы вручную останавливаться не буду, но пример такого главного документа приведу:

    Главный документ с полями разных типов
    Рис. 1.14.  Главный документ с полями разных типов

    Заметьте, поля в главном документе подсвечены и среди них есть как поля, заданные источником данных, так и общие для Word поля, Ask, Fill-In, Formula, Date. Вот как выглядит источник данных, с которым я проводил эксперименты:

    Источник данных для слияния документов

    увеличить изображение: увеличить изображение,
    Рис. 1.15.  Источник данных для слияния документов

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

    Документ, полученный слиянием главного документа и источника данных
    Рис. 1.16.  Документ, полученный слиянием главного документа и источника данных

  3. Еще одним видом документа Word, использующим поля, является электронная форма. Необходимость в таких документах возникает, например, при пересылке анкет по электронной почте. Получатель формы заполняет поля анкеты, которые могут быть элементами управления: обычными текстовыми окнами ввода, флажками или выпадающими списками. Как поля они имеют имена: FormTextBox, FormCheckBox, FormDropDown.
  4. Говоря о полях, нельзя не упомянуть о таком важном и интересном поле, как поле Formula, позволяющее организовывать вычисления в документах Word. Эти вычисления, чаще всего, организуются в ячейках таблиц Word, но могут быть вставлены и в произвольное место документа. Пример такого поля приведен в главном документе. Строятся формулы аналогично формулам Excel и могут работать как с закладками, используемыми в качестве имен переменных, так и с ячейками таблиц Word. При вычислениях можно использовать некоторые из встроенных функций, допустимых в Excel. Тема вычислений в документах Word , его таблицах заслуживает, конечно, более подробного освещения, чем эти несколько строчек. Но обо всем сказать, нам не дано.
  5. Есть и другие случаи применения полей в документах Word. Например, поля автоматически создаются при создании таблиц ссылок, о которых я рассказывал ранее.

Я постарался кратко описать достаточно сложную тему работы с полями в документах Word. Конечно, обычно работа с полями выполняется вручную. Вряд ли, например, есть смысл создавать документ слияния программным путем. Поэтому, говоря о программировании работы с полями, я ограничусь достаточно простыми примерами. В основе программной работы с полями лежит работа с коллекцией полей Fields(Field). В следующем примере анализируются (печатаются) основные свойства объекта Field:

Public Sub FieldsAnalise()
'Анализирует характеристики полей активного документа
   Dim MyField As Field
   With ActiveDocument
      Debug.Print "Число полей - ", .Fields.Count
      For Each MyField In .Fields
         With MyField
            Debug.Print "Код поля - ", .Code, _
            "Вид поля - ", .Kind, _
            "Тип поля - ", .Type, _
            "Результат поля - ", .Result
         End With
      Next MyField
   End With
End Sub

Листинг 1: html, txt

Приведем результаты отладочной печати для главного документа, имеющего обширную коллекцию полей разного типа:

Листинг 1: html, txt

Большинство полей в этом документе это поля слияния (MergeField), значения которых берутся из источника данных в момент слияния главного документа с записями источника данных. Обратите внимание, ситуация с полями напоминает ситуацию с ячейками Excel, с одной стороны в ячейке содержится формула (в поле код поля), с другой стороны вычисленное по формуле значение (результат поля). По желанию всегда можно включить просмотр в полях либо кода поля, либо результата. По умолчанию, также как и для ячеек Excel, показывается результат поля. Свойство Kind, которое для всех полей нашего документа имеет одинаковое значение, указывает на то, как происходит автоматическое обновление значения поля, имеет ли поле результат.

Для программного создания полей используется, как обычно, метод Add коллекции Fields. Он имеет следующий синтаксис:

Листинг 1: html, txt

Параметр Range определяет область документа, в которую вставляется поле, Type тип поля, из-за разнообразия типов этот параметр имеет около сотни различных значений. Параметр Text чаще всего используется в тех случаях, когда нужно задать переключатели, определяющие специфику работы поля. Последний параметр определяет, будет ли сохраняться форматирование при обновлении значения поля.

Рассмотрим теперь пример программного добавления полей в документ. Я ограничусь достаточно простой ситуацией. Добавим в начало документа три поля, задающие автора документа, дату и время:

Листинг 1: html, txt

В этой процедуре добавляются три пустых абзаца в начало документа, а затем добавляются три поля. Затем демонстрируется еще один способ работы с полями, когда вначале задается пустое поле, а потом в нем печатается текст, определяющий это поле. Конечно, это должен быть разумный текст, определяющий тип поля и его характеристики. Так, зачастую, работают с полями вручную. Заметьте, необходимо обновить это поле, чтобы поле отражало значение результата. Печать результатов до обновления и после обновления позволяет проследить за изменениями значений полей. Приведем результаты отладки:

Листинг 1: html, txt

Работа с фрагментами

StoryRanges(Range) — эта коллекция представляет совокупность частей документа, называемых фрагментами (Story). Количество различных фрагментов документа фиксировано. Нельзя добавлять элементы в эту коллекцию обычным способом, используя метод Add. Фрагменты появляются в коллекции, когда создается соответствующая часть документа. В этот момент определяется и тип фрагмента. Фрагменты имеют тип, задаваемый константами из перечисления wdStoryType. Главный фрагмент, конечно, — текст документа, тип которого задается константой wdMainTextStory. Фрагментами других типов являются комментарии, ссылки, колонтитулы. Заметьте: сам фрагмент является объектом Range. Так что благодаря фрагментам можно, например, работать с коллекцией комментариев, как с единой областью.

Приведем пример, где анализируются типы фрагментов активного документа:

Листинг 1: html, txt

Тестовый документ состоит из фрагментов четырех типов, так как он, кроме текста, содержит комментарии и два типа ссылок. Вот результаты отладочной печати:

Начало текста:				Vladimir Billig
Подстраничные ссылки:		 документ DocTwo используется для экспериментов.
Концевые ссылки:		документ DocThree используется для экспериментов.
Комментарии:	Page: 2	Программный проект этого документа содержит примеры главы 1

Листинг 1: html, txt

Переменные, которые живут долго

У переменных век не долог. Локальные переменные, как правило, заканчивают существование в момент окончания работы процедуры, в которой они описаны. Глобальные переменные живут дольше, некоторые из них могут быть доступными в разных программных проектах системы документов в процессе работы с этими документами.

Однако и локальные и глобальные переменные «умирают» по окончании сеанса работы. Для того чтобы сохранять данные между сеансами работы, необходимо использовать файлы, базы данных и другие внешние источники даных. Замечу, что, конечно, есть еще возможность хранить данные, как часть самого документа, например, в таблицах Word или Excel. Но сейчас мы поговорим еще об одной интересной возможности, предоставляемой при работе с офисными документами. С каждым из документов можно связать коллекцию переменных типа Variant коллекцию Variables(Variable). Эта коллекция для программистов важна — ведь время жизни входящих в нее переменных совпадает со временем жизни документа. По существу речь идет о некотором специальном файле переменных, жестко связанном с самим документом и хранящимся вместе с ним. Тем самым появляется возможность сохранять информацию о работе документе между сеансами. Применения этого полезного средства могут быть самыми разными. Можно сохранять предпочтения, сделанные пользователем при первом сеансе работы с документом, различные настройки документа и так далее. Другое применение связано с предоставлением документа во временное владение с ограничением числа возможных запусков. Например, можно иметь счетчики, подсчитывающие количество вызовов некоторой процедуры и в зависимости от значения счетчика по-разному определять дальнейшую работу с данным документом. Переменные, входящие в коллекцию Variables, создаются не так, как обычные переменные, нет необходимости в их описании в разделе объявлений какого либо модуля. Они имеют фиксированный тип Variant и создаются методом Add, типичным для создания элементов коллекций. Этот метод имеет достаточно прозрачный синтаксис:

Листинг 1: html, txt

В момент создания задается имя переменной и, возможно, инициализирующее ее значение. Тип, как я уже говорил, установлен по умолчанию.

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

Public Sub CreateVar()
   'Создание переменных - хранителей информации
   With ActiveDocument.Variables
      If Not ExistVar("Counter") Then
         'Добавляем переменную
         .AddName:="Counter", Value:=0
      End If
   End With

End Sub

Public Function ExistVar(Name As String) As Boolean
   'Определяет наличие переменнойName в коллекции Variables
   Dim MyVar As Variable
   ExistVar = False
   For Each MyVar In ActiveDocument.Variables
      If MyVar.Name =Name Then
         ExistVar = True: Exit For
      End If
   Next MyVar
End Function

Листинг 1: html, txt

При попытке повторного добавления одной и той же переменной в коллекцию Variables возникает ошибка. В тоже время процедура, в которой происходит добавление, может выполняться многократно. Поэтому я предусматриваю соответствующую проверку на существование переменной с заданным именем в коллекции Variables. Может возникнуть вопрос, куда поместить процедуру CreateVar, создающую переменную. Я поместил ее в процедуру, обрабатывающую событие «Open» документа, но можно упрятать этот вызов и более глубоко. Рассмотрим теперь, как происходит работа с переменной Counter:

Public Sub CheckCounter()
   Const Limit = 10
   'Счетчик Counter может быть использован в любой процедуре,
   'позволяя следить за числом ее выполнения
   With ActiveDocument
      If .Variables("Counter") > Limit Then
         'Исчерпан лимит нормальной работы демо-версии
         Call MsgBox("Исчерпан лимит работы демо-версии", _
               vbCritical, "Конец работы!")
      Else ' продолжаем нормальную работу
         Dim myLocal As Integer
         'Локальные переменные могут работать с глобальным счетчиком
         myLocal = .Variables("Counter")
         Debug.Print "Счетчик = "; myLocal
         
         'В конце работы увеличиваем значение счетчика
         myLocal = myLocal + 1
         .Variables("Counter") = myLocal
      End If
   End With
End Sub

Листинг 1: html, txt

Экспериментируя с тестовым документом, я открывал и закрывал его многократно, время от времени, вызывая процедуру CheckVar. После 11 ее запусков нормальное выполнение было прервано и выдалось предупреждающее сообщение:

Документ в момент выдачи предупреждающего сообщения.

увеличить изображение: увеличить изображение,
Рис. 1.17.  Документ в момент выдачи предупреждающего сообщения.

Назад Оглавление Вперёд


Обратная связь
Информация для авторов

Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum

Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее…

 

Игорь

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

Всем доброго дня.
Необходимо задать поля страницы (лист1), верх 1/низ 0,5/левое 1/ правое 0,5
Пробовал записать макрорекордером, работает, но код жутко огромный.
Есть способы проще?
Поделитесь опытом
Спасибо

 

Игорь

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

#2

08.08.2014 13:29:48

Удалил лишнее из кода…(как я думаю   :)  )
Что скажут специалисты?
Будет работать нормально, или ещё можно допилить?

Код
Sub Макрос1()
    Sheets("Лист1".Select
    Application.PrintCommunication = False
    With ActiveSheet.PageSetup

     .LeftMargin = Application.InchesToPoints(0.393700787401575)
     .RightMargin = Application.InchesToPoints(0.196850393700787)
     .TopMargin = Application.InchesToPoints(0.393700787401575)
     .BottomMargin = Application.InchesToPoints(0.196850393700787)
     .HeaderMargin = Application.InchesToPoints(0.31496062992126)
     .FooterMargin = Application.InchesToPoints(0.31496062992126)
    End With
    Application.PrintCommunication = True
End Sub
 

Ivan.kh

Пользователь

Сообщений: 2024
Регистрация: 04.03.2013

#3

08.08.2014 13:44:06

Для Лист1 по идеи достаточно:

Код
Sub Макрос1()
    With Sheets("Лист1").PageSetup
        .LeftMargin = Application.InchesToPoints(0.393700787401575)
        .RightMargin = Application.InchesToPoints(0.196850393700787)
        .TopMargin = Application.InchesToPoints(0.393700787401575)
        .BottomMargin = Application.InchesToPoints(0.196850393700787)
        .HeaderMargin = Application.InchesToPoints(0.31496062992126)
        .FooterMargin = Application.InchesToPoints(0.31496062992126)
    End With
End Sub

З.Ы. Игорь, у Вас > 50 сообщений на форуме, а код тегом не научились оформлять?

 

Игорь

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

Спасибо за помощь.
Ну и ткните носом где почитать про теги.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#5

08.08.2014 13:49:11

Билл Джелен

Код
Sub Macro1_Version4()
    Dim St As String
    St = "PAGE.SETUP(, , " & _
                     "1.5, 1.5, 1.5, 1.5" & _
                     ", 0, False, False, False, 1, 1, True, 1, 1,False, , " & _
                     "1, 1" & _
                     ", False)"
    Application.ExecuteExcel4Macro St
End Sub

 
 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#6

08.08.2014 13:50:36

Цитата
Игорь пишет: Ну и ткните носом где почитать про теги.

Читать необязательно — достаточно нажать на кнопочку соответствующего тега и в позицию курсора вставить скопированный код.

 

Ivan.kh

Пользователь

Сообщений: 2024
Регистрация: 04.03.2013

#7

08.08.2014 13:52:21

Цитата
Игорь пишет:
Ну и ткните носом где почитать про теги.

 

Игорь

Пользователь

Сообщений: 83
Регистрация: 27.12.2012

#8

11.08.2014 04:58:05

Спасибо, обещаю исправится  :)

Работа с полями документа

Поля (коллекция Fields ) используются в документах Word достаточно широко и играют множество самых разных ролей. Поэтому стоит поговорить о них подробнее. В зависимости от назначения поля оно относится к одной из 9 возможных категорий. Нет смысла и возможности заниматься полным анализом этих категорий, но некоторые основные роли, которые играют поля, я перечислю:

  1. Поля могут хранить в документе некоторую обновляемую информацию. Такими полями являются поля Date и Time из категории Date and Time, хранящие текущую дату и текущее время. В полях Author, FileName, KeyWords, NumPages и других полях из категории Document Information содержится подробная информация о документе авторе документа, файле, в котором он находится, числе занимаемых страниц. В полях UserName и UserAddress из категории User Information хранится информация о фамилии и адресе владельца компьютера, используемая по умолчанию для создания поля Author документа, для создания обратного адреса по умолчанию при работе с конвертами. Эта роль полей достаточно понятна. Ясно, как программно и вручную можно работать с такими полями. Заметим, что значения некоторых из упомянутых полей меняются автоматически, например, время, дата, число страниц документа (число страниц документа — 57, число символов — 149609, дата — 01.07.2006, время — 9:27 )

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

  2. Поля играют важную роль при создании документов с помощью слияния. Зачастую возникает необходимость создания группы однотипных документов, отличающихся лишь небольшими деталями. Типичным примером такого рода является группа рассылаемых писем, отличающихся адресом, названием компании и другими деталями. В этом случае создается главный документ, содержащий шаблон письма с полями и документ, хранящий источник данных. Поля главного документа задают переменную часть письма адрес, название компании и другие данные. Значения этих данных хранятся в источнике данных, который может быть таблицей Word, Access или Excel. Слияние главного документа с одной записью источника данных (строкой таблицы) приводит к появлению нового документа (письма). В слиянии могут участвовать как все записи источника данных, так и только часть из них, выбранная по запросу. В результате возникает необходимая совокупность писем. Имена полей в этом случае могут быть произвольными и представляют имена столбцов в таблице, задающей источник данных. Помимо этих полей в главном документе могут встречаться и поля Word из тех 9 категорий, о которых я уже говорил. В ситуациях слияния часто используются такие поля как Ask и Fill-In, позволяя в момент слияния запросить и добавить в документ индивидуальную информацию, не хранящуюся в записях источника данных. Поле Fill-In позволяет запросить данные при создании документа и сделать полученный ответ значением этого поля. Поле Ask работает аналогичным образом, за тем исключением, что ответ не становится значением поля, а связывается с некоторой создаваемой в этот момент закладкой. Затем эту закладку можно использовать в документе различными способами, принятыми для закладок. На деталях работы вручную останавливаться не буду, но пример такого главного документа приведу:

    Главный документ с полями разных типов

    Рис.
    1.14.
    Главный документ с полями разных типов

    Заметьте, поля в главном документе подсвечены и среди них есть как поля, заданные источником данных, так и общие для Word поля, Ask, Fill-In, Formula, Date. Вот как выглядит источник данных, с которым я проводил эксперименты:

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

    Документ, полученный слиянием главного документа и источника данных

    Рис.
    1.16.
    Документ, полученный слиянием главного документа и источника данных

  3. Еще одним видом документа Word, использующим поля, является электронная форма. Необходимость в таких документах возникает, например, при пересылке анкет по электронной почте. Получатель формы заполняет поля анкеты, которые могут быть элементами управления: обычными текстовыми окнами ввода, флажками или выпадающими списками. Как поля они имеют имена: FormTextBox, FormCheckBox, FormDropDown.
  4. Говоря о полях, нельзя не упомянуть о таком важном и интересном поле, как поле Formula, позволяющее организовывать вычисления в документах Word. Эти вычисления, чаще всего, организуются в ячейках таблиц Word, но могут быть вставлены и в произвольное место документа. Пример такого поля приведен в главном документе. Строятся формулы аналогично формулам Excel и могут работать как с закладками, используемыми в качестве имен переменных, так и с ячейками таблиц Word. При вычислениях можно использовать некоторые из встроенных функций, допустимых в Excel. Тема вычислений в документах Word , его таблицах заслуживает, конечно, более подробного освещения, чем эти несколько строчек. Но обо всем сказать, нам не дано.
  5. Есть и другие случаи применения полей в документах Word. Например, поля автоматически создаются при создании таблиц ссылок, о которых я рассказывал ранее.

Я постарался кратко описать достаточно сложную тему работы с полями в документах Word. Конечно, обычно работа с полями выполняется вручную. Вряд ли, например, есть смысл создавать документ слияния программным путем. Поэтому, говоря о программировании работы с полями, я ограничусь достаточно простыми примерами. В основе программной работы с полями лежит работа с коллекцией полей Fields (Field). В следующем примере анализируются (печатаются) основные свойства объекта Field:

Public Sub FieldsAnalise()
'Анализирует характеристики полей активного документа
	Dim MyField As Field
	With ActiveDocument
		Debug.Print "Число полей - ", .Fields.Count
		For Each MyField In .Fields
			With MyField
				Debug.Print "Код поля - ", .Code, _
				"Вид поля - ", .Kind, _
				"Тип поля - ", .Type, _
				"Результат поля - ", .Result
			End With
		Next MyField
	End With
End Sub


Листинг
1.45.

Приведем результаты отладочной печати для главного документа, имеющего обширную коллекцию полей разного типа:

Число полей -				12 
Код поля -	 DATE	* MERGEFORMAT Вид поля -	 2 	Тип поля -	 31	Результат поля -	13.12.99
Код поля -	 MERGEFIELD Country Вид поля -	 2			Тип поля -	 59	Результат поля -	"Country"
Код поля -	 MERGEFIELD City 	Вид поля -	 2			Тип поля -	 59	Результат поля -	"City"
Код поля -	 MERGEFIELD Address Вид поля -	 2			Тип поля -	 59	Результат поля -	"Address"
Код поля -	 MERGEFIELD FirstName 	Вид поля - 2	Тип поля -	 59	Результат поля -	"FirstName"
Код поля -	 MERGEFIELD LastName		Вид поля - 2	Тип поля -	 59	Результат поля -	"LastName"
Код поля -	 MERGEFIELD HomePhone		Вид поля - 2	Тип поля -	 59	Результат поля -	"HomePhone"
Код поля -	 MERGEFIELD FirstName		Вид поля - 2	Тип поля -	 59	Результат поля -	"FirstName"
Код поля -	 FILLIN "Введите имя (имена) близких!" d "Близкие тебе люди" Вид поля -	 2			Тип поля -	 39			Результат поля -			Близкие тебе люди
Код поля - ASK Vremya "Сколько лет не виделись?" d "1"	Вид поля - 2 Тип поля - 38	Результат поля -			2
Код поля -	 Ref Vremya	Вид поля -	 2		Тип поля -	 3		Результат поля - 2
Код поля -	 = Vremya *365*24*60		Вид поля - 2	Тип поля -	 34	Результат поля -	1051200


Листинг
1.46.

Большинство полей в этом документе это поля слияния (MergeField), значения которых берутся из источника данных в момент слияния главного документа с записями источника данных. Обратите внимание, ситуация с полями напоминает ситуацию с ячейками Excel, с одной стороны в ячейке содержится формула (в поле код поля), с другой стороны вычисленное по формуле значение (результат поля). По желанию всегда можно включить просмотр в полях либо кода поля, либо результата. По умолчанию, также как и для ячеек Excel, показывается результат поля. Свойство Kind, которое для всех полей нашего документа имеет одинаковое значение, указывает на то, как происходит автоматическое обновление значения поля, имеет ли поле результат.

Для программного создания полей используется, как обычно, метод Add коллекции Fields. Он имеет следующий синтаксис:

Add(Range, Type, Text, PreserveFormatting)


Листинг
1.47.

Параметр Range определяет область документа, в которую вставляется поле, Type тип поля, из-за разнообразия типов этот параметр имеет около сотни различных значений. Параметр Text чаще всего используется в тех случаях, когда нужно задать переключатели, определяющие специфику работы поля. Последний параметр определяет, будет ли сохраняться форматирование при обновлении значения поля.

Рассмотрим теперь пример программного добавления полей в документ. Я ограничусь достаточно простой ситуацией. Добавим в начало документа три поля, задающие автора документа, дату и время:

Public Sub CreateFields()
'Работа с полями
	With ActiveDocument
		'Добавление полей разного типа в начало документа
		Dim myRange As Range
		'Установить автора документа
		' .Name = "Vladimir Billig"
		Set myRange = .Range(Start:=0, End:=0)
		.Paragraphs.Add myRange
		.Paragraphs.Add myRange
		.Paragraphs.Add myRange
		myRange.Move Unit:=wdParagraph, Count:=-3
		.Fields.Add Range:=myRange, Type:=wdFieldAuthor
		myRange.Move Unit:=wdParagraph, Count:=1
		.Fields.Add Range:=myRange, Type:=wdFieldDate
		myRange.Move Unit:=wdParagraph, Count:=1
		.Fields.Add Range:=myRange, Type:=wdFieldTime
		
		'Еще один способ добавления полей на примере
		'добавления поля автора с одновременным изменением автора документа
		myRange.Move Unit:=wdParagraph, Count:=1
		myRange.Select
		.Fields.Add Range:=myRange, Type:=wdFieldEmpty, _
		PreserveFormatting:=False
		Selection.TypeText Text:="Author ""Fooler"""
		
		'Печать полей
		FieldsAnalyse
		'Обновление полей
		.Fields.Update
		FieldsAnalyse
	End With
End Sub


Листинг
1.48.

В этой процедуре добавляются три пустых абзаца в начало документа, а затем добавляются три поля. Затем демонстрируется еще один способ работы с полями, когда вначале задается пустое поле, а потом в нем печатается текст, определяющий это поле. Конечно, это должен быть разумный текст, определяющий тип поля и его характеристики. Так, зачастую, работают с полями вручную. Заметьте, необходимо обновить это поле, чтобы поле отражало значение результата. Печать результатов до обновления и после обновления позволяет проследить за изменениями значений полей. Приведем результаты отладки:

Число полей - 4 
Код поля - Author	* MERGEFORMAT Вид поля - 2	Тип поля - 17 Результат поля - Vladimir Billig
Код поля - DATE	* MERGEFORMAT	Вид поля - 2	Тип поля - 31	Результат поля 	14.12.99
Код поля - TIME	* MERGEFORMAT	Вид поля - 2	Тип поля - 32	Результат поля -	12:28
Код поля - Author "Fooler"	Вид поля - 0	Тип поля --1	Результат поля -
Число полей - 4 
Код поля - Author	* MERGEFORMAT Вид поля - 2	Тип поля - 17 Результат поля - Vladimir Billig
Код поля - DATE	* MERGEFORMAT Вид поля - 2	Тип поля - 31	Результат поля -	14.12.99
Код поля - TIME	* MERGEFORMAT Вид поля - 2	Тип поля - 32	Результат поля -	12:28
Код поля - Author "Fooler" Вид поля - 2	Тип поля - 17	Результат поля -	Fooler


Листинг
1.49.

Работа с фрагментами

StoryRanges(Range) — эта коллекция представляет совокупность частей документа, называемых фрагментами (Story). Количество различных фрагментов документа фиксировано. Нельзя добавлять элементы в эту коллекцию обычным способом, используя метод Add. Фрагменты появляются в коллекции, когда создается соответствующая часть документа. В этот момент определяется и тип фрагмента. Фрагменты имеют тип, задаваемый константами из перечисления wdStoryType. Главный фрагмент, конечно, — текст документа, тип которого задается константой wdMainTextStory. Фрагментами других типов являются комментарии, ссылки, колонтитулы. Заметьте: сам фрагмент является объектом Range. Так что благодаря фрагментам можно, например, работать с коллекцией комментариев, как с единой областью.

Приведем пример, где анализируются типы фрагментов активного документа:

Public Sub WorkWithStory()
'Работа с фрагментами (story)
'Анализ возможных типов фрагментов акивного докуммента
	Dim curstory As Range
	With ActiveDocument
		For Each curstory In .StoryRanges
			Select Case curstory.StoryType
			Case wdMainTextStory
				Debug.Print "Начало текста:", curstory.Paragraphs(1).Range.Text
			Case wdCommentsStory
				Debug.Print "Комментарии:", curstory.Text
			Case wdEndnotesStory
				Debug.Print "Концевые ссылки:", curstory.Text
			Case wdFootnotesStory
				Debug.Print "Подстраничные ссылки:", curstory.Text
			Case Else
				Debug.Print "Фрагмент другого типа:", curstory.Text
			End Select
		Next curstory
	End With
End Sub


Листинг
1.50.

Тестовый документ состоит из фрагментов четырех типов, так как он, кроме текста, содержит комментарии и два типа ссылок. Вот результаты отладочной печати:

Начало текста:				Vladimir Billig
Подстраничные ссылки:		 документ DocTwo используется для экспериментов.
Концевые ссылки:		документ DocThree используется для экспериментов.
Комментарии:	Page: 2	Программный проект этого документа содержит примеры главы 1


Листинг
1.51.

Переменные, которые живут долго

У переменных век не долог. Локальные переменные, как правило, заканчивают существование в момент окончания работы процедуры, в которой они описаны. Глобальные переменные живут дольше, некоторые из них могут быть доступными в разных программных проектах системы документов в процессе работы с этими документами.

Однако и локальные и глобальные переменные «умирают» по окончании сеанса работы. Для того чтобы сохранять данные между сеансами работы, необходимо использовать файлы, базы данных и другие внешние источники даных. Замечу, что, конечно, есть еще возможность хранить данные, как часть самого документа, например, в таблицах Word или Excel. Но сейчас мы поговорим еще об одной интересной возможности, предоставляемой при работе с офисными документами. С каждым из документов можно связать коллекцию переменных типа Variant коллекцию Variables(Variable). Эта коллекция для программистов важна — ведь время жизни входящих в нее переменных совпадает со временем жизни документа. По существу речь идет о некотором специальном файле переменных, жестко связанном с самим документом и хранящимся вместе с ним. Тем самым появляется возможность сохранять информацию о работе документе между сеансами. Применения этого полезного средства могут быть самыми разными. Можно сохранять предпочтения, сделанные пользователем при первом сеансе работы с документом, различные настройки документа и так далее. Другое применение связано с предоставлением документа во временное владение с ограничением числа возможных запусков. Например, можно иметь счетчики, подсчитывающие количество вызовов некоторой процедуры и в зависимости от значения счетчика по-разному определять дальнейшую работу с данным документом. Переменные, входящие в коллекцию Variables, создаются не так, как обычные переменные, нет необходимости в их описании в разделе объявлений какого либо модуля. Они имеют фиксированный тип Variant и создаются методом Add, типичным для создания элементов коллекций. Этот метод имеет достаточно прозрачный синтаксис:

Function Add(Name As String, [Value]) As Variable


Листинг
1.52.

В момент создания задается имя переменной и, возможно, инициализирующее ее значение. Тип, как я уже говорил, установлен по умолчанию.

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

Public Sub CreateVar()
	'Создание переменных - хранителей информации
	With ActiveDocument.Variables
		If Not ExistVar("Counter") Then
			'Добавляем переменную
			.AddName:="Counter", Value:=0
		End If
	End With

End Sub

Public Function ExistVar(Name As String) As Boolean
	'Определяет наличие переменнойName в коллекции Variables
	Dim MyVar As Variable
	ExistVar = False
	For Each MyVar In ActiveDocument.Variables
		If MyVar.Name =Name Then
			ExistVar = True: Exit For
		End If
	Next MyVar
End Function


Листинг
1.53.

При попытке повторного добавления одной и той же переменной в коллекцию Variables возникает ошибка. В тоже время процедура, в которой происходит добавление, может выполняться многократно. Поэтому я предусматриваю соответствующую проверку на существование переменной с заданным именем в коллекции Variables. Может возникнуть вопрос, куда поместить процедуру CreateVar, создающую переменную. Я поместил ее в процедуру, обрабатывающую событие «Open» документа, но можно упрятать этот вызов и более глубоко. Рассмотрим теперь, как происходит работа с переменной Counter:

Public Sub CheckCounter()
	Const Limit = 10
	'Счетчик Counter может быть использован в любой процедуре,
	'позволяя следить за числом ее выполнения
	With ActiveDocument
		If .Variables("Counter") > Limit Then
			'Исчерпан лимит нормальной работы демо-версии
			Call MsgBox("Исчерпан лимит работы демо-версии", _
					vbCritical, "Конец работы!")
		Else ' продолжаем нормальную работу
			Dim myLocal As Integer
			'Локальные переменные могут работать с глобальным счетчиком
			myLocal = .Variables("Counter")
			Debug.Print "Счетчик = "; myLocal
			
			'В конце работы увеличиваем значение счетчика
			myLocal = myLocal + 1
			.Variables("Counter") = myLocal
		End If
	End With
End Sub


Листинг
1.54.

Экспериментируя с тестовым документом, я открывал и закрывал его многократно, время от времени, вызывая процедуру CheckVar. После 11 ее запусков нормальное выполнение было прервано и выдалось предупреждающее сообщение:

Like this post? Please share to your friends:
  • Vba word положение курсора
  • Vba word поиск только в таблице
  • Vba word поиск текста по шаблону
  • Vba word поиск текста в таблице
  • Vba word поиск строки