Средства автоматизации работы word

Часть 1. Microsoft Word и Microsoft Excel

Коротко об автоматизации

VBA и средства разработки контроллеров автоматизации

Объектные модели Microsoft Office

Общие принципы создания контроллеров автоматизации

Автоматизация Microsoft Word

   Программные идентификаторы и объектная модель Microsoft Word

   Создание и открытие документов Microsoft Word

   Сохранение, печать и закрытие документов Microsoft Word

   Вставка текста и объектовв документ и форматирование текста

   Перемещение курсора по тексту

   Создание таблиц

   Обращение к свойствам документа

Автоматизация Microsoft Excel

   Программные идентификаторы и объектная модель Microsoft Excel

   Запуск Microsoft Excel, создание и открытие рабочих книг

   Сохранение, печать и закрытие рабочих книг Microsoft Excel

   Обращение к листам и ячейкам

   Создание
диаграмм

Настоящая статья посвящена теме, может быть, и не новой,
но, как показывают письма читателей, по-прежнему актуальной — автоматизации
приложений Microsoft Office. Многие разработчики в процессе работы над своими
проектами (неважно, с помощью какого средства разработки — Delphi, C++Builder,
Visual Basic…) нередко применяют сервисы, предоставляемые Microsoft Office,
например построение сводных таблиц и диаграмм с помощью Microsoft Excel, генерацию
и печать документов с помощью Microsoft Word и т.д. Нередко пользователи, привыкшие
использовать приложения Microsoft Office в повседневной работе, сами настаивают
на применении в приложениях таких сервисов либо просто на сохранении отчетов
и других документов в одном из форматов Microsoft Office. Отметим, что потенциальные пожелания подобного рода
компанией Microsoft учтены достаточно давно — практически все, что в состоянии
сделать пользователь любого приложения Microsoft Office с помощью меню, клавиатуры
и инструментальной панели, может быть произведено и автоматически, то есть либо
из VBA-программы, либо из приложения, созданного с помощью одного из средств
разработки. Иными словами, приложения Microsoft Office являются программируемыми.
Программируемость в общем случае означает возможность
управления данным приложением с помощью макроязыков либо с помощью других приложений.
Все компоненты Microsoft Office поддерживают один и тот же макроязык: Visual
Basic for Applications (VBA), позволяющий создавать приложения непосредственно
внутри документов Office (это называется «решения на базе Microsoft Office»).
Управление же компонентами Office из других приложений осуществляется с помощью
автоматизации (Automation, ранее — OLE Automation) — все приложения
Microsoft Office являются серверами автоматизации (или COM-серверами).
Для создания таких приложений пригодны любые средства
разработки, позволяющие создавать контроллеры автоматизации (COM-клиенты).
Наиболее часто для этой цели используется Visual Basic,
но это могут быть и Delphi, и C++Builder, и Visual C++. Однако прежде чем обсуждать
возможности тех или иных средств разработки, следует разобраться, что такое
автоматизация.

Коротко об автоматизации

Автоматизация — это одна из возможностей, предоставляемых технологией
Microsoft COM (Component Object Model). Не вдаваясь в подробности реализации
этой технологии, заметим, что она используется приложениями (называемыми COM-серверами)
для предоставления доступа к их объектам, а также к свойствам и методам этих
объектов другим приложениям (называемым COM-клиентами), каковыми могут быть
и средства разработки. Например, текстовый процессор, будучи COM-сервером, может
предоставлять другим приложениям доступ к документу, абзацу, закладке с помощью
соответствующих объектов. Для именования (и опознания) COM-серверов обычно используются
специальные строковые обозначения — программные идентификаторы (Programmatic
Identifier, ProgID). Они нужны для того, чтобы операционная система могла с
помощью этих идентификаторов определить, в каком именно каталоге (или на каком
компьютере локальной сети, если используется тот или иной способ удаленного
доступа к серверу) расположен исполняемый файл сервера автоматизации, и запустить
его на выполнение. О том, какие именно программные идентификаторы применяются
для того или иного приложения Microsoft Office, будет сказано в разделах, посвященных
этим приложениям.

Объекты автоматизации с точки зрения программирования мало чем отличаются от
обычных объектов, знакомых нам из теории и практики объектно-ориентированного
программирования. Как и обычные объекты, они обладают свойствами и методами.
Свойство — это характеристика объекта; например, свойством абзаца (объект
Paragraph) может быть его стиль (Style). Методом называется действие, которое
можно выполнить с объектом (например, можно сохранить документ с помощью метода
SaveAs объекта Document).

Нередко серверы автоматизации содержат наборы однотипных объектов, называемых
коллекциями. Например, текстовый процессор может содержать коллекцию документов,
а каждый документ — коллекцию абзацев.

Как узнать, какие объекты доступны в серверах автоматизации? Для этой цели
в комплект поставки любого сервера автоматизации входит документация и файлы
справки, описывающие их объектную модель. Если брать приложения Microsoft Office
2000, то это справочные файлы для программистов на Visual Basic for Applications
VBAxxx9.CHM (для Microsoft Office 97 — VBxxx8.HLP соответственно). Отметим,
что по умолчанию они не устанавливаются, так как нужны разработчикам, а не рядовым
пользователям.

Вся информация об объектах, необходимая контроллерам автоматизации, содержится
в библиотеках типов. Библиотеки типов хранятся в специальном бинарном формате
и обычно представлены в виде файлов с расширениями *.olb или *.tlb, а также
могут содержаться внутри исполняемых файлов (*.exe) или динамически загружаемых
библиотек (*.dll). Библиотеки типов можно просматривать с помощью утилиты OleView,
входящей в состав Microsoft Platform SDK, а средства разработки фирмы Borland
содержат свои собственные утилиты просмотра библиотек типов.

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

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

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

Закончив экскурс в COM и автоматизацию, вернемся к вопросу о том, какие средства
разработки удобно применять для создания контроллеров автоматизации.

в начало

в начало

VBA и средства разработки контроллеров автоматизации

Как уже было сказано выше, контроллеры автоматизации можно создавать с помощью
различных средств разработки, и если вы уже используете какое-либо из инструментальных
средств, поддерживающих создание контролеров автоматизации, можно именно им
и воспользоваться. Единственное, что следует сделать — это узнать, поддерживается
ли вашим средством разработки ранее связывание, если вы планируете его использовать.
Примеры простейших контроллеров автоматизации (как правило, для Microsoft Word
или Microsoft Excel), дающие представление о том, как вызываются методы сервера,
обычно можно найти в комплекте поставки большинства современных средств разработки.

Освоение объектной модели автоматизируемого сервера можно начать с записи необходимой
последовательности действий в виде макроса с помощью VBА. Создать макрос можно,
выбрав из меню приложения Microsoft Office пункт Tools | Macro |Record New Macro.
Просмотр полученного макроса в редакторе кода VBA обычно позволяет понять, как
должен выглядеть код, реализующий эту последовательность действий.

Обсудив возможные средства разработки контроллеров автоматизации, можно наконец
перейти к самим приложениям Microsoft Office, к их объектным моделям и к их
использованию. В качестве средства разработки для приведенных ниже примеров
используется Borland Delphi 5, но поскольку в них приводится последовательность
вызова свойств и методов объектов Microsoft Office, перенос кода на другие языки
программирования не должен вызвать особых затруднений. Если специально не оговорено,
в данной статье во всех примерах используется раннее связывание.

в начало

в начало

Объектные модели Microsoft Office

Как было сказано выше, приложения Microsoft Office предоставляют контроллерам
автоматизации доступ к своей функциональности с помощью своей объектной модели,
представляющей собой иерархию объектов. Объекты могут предоставлять доступ к
другим объектам посредством коллекций.

В качестве иллюстрации того, как выглядит иерархия объектов Microsoft Office,
приведем небольшой фрагмент объектной модели Microsoft Word (рис.1):

В объектных моделях всех приложений Microsoft Office
всегда имеется самый главный объект, доступный приложению-контроллеру и представляющий
само автоматизируемое приложение. Для всех приложений Microsoft Office он называется
Application, и многие его свойства и методы для всех этих приложений также одинаковы.
Наиболее часто мы будем использовать следующие из них:

  1. Свойство Visible (доступное для объекта Application всех приложений Microsoft
    Office) позволяет приложению появиться на экране и в панели задач; оно принимает
    значения True (пользовательский интерфейс приложения доступен) или False (пользовательский
    интерфейс приложения недоступен; это значение устанавливается по умолчанию).
    Если вам нужно сделать что-то с документом Office в фоновом режиме, не информируя
    об этом пользователя, можно не обращаться к этому свойству — в этом случае
    приложение можно будет найти только в списке процессов с помощью приложения
    Task Manager.
  2. Метод Quit закрывает приложение Office. В зависимости от того, какое приложение
    Office автоматизируется, он может иметь параметры или не иметь таковых.
в начало

в начало

Общие принципы создания контроллеров автоматизации

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

  1. Проверить, запущена ли копия приложения-сервера.
  2. В зависимости от результатов проверки запустить копию автоматизируемого
    приложения Office либо подключиться к уже имеющейся копии.
  3. Сделать окно приложения-сервера видимым (в общем случае это не обязательно).
  4. Выполнить какие-то действия с приложением-сервером (например, создать или
    открыть документы, изменить их данные, сохранить документы и пр.)
  5. Закрыть приложение-сервер, если его копия была запущена данным контроллером,
    или отключиться от него, если контроллер подключился к уже имеющейся копии.

Соответствующий код для Delphi представлен в листинге 1.

Здесь мы воспользовались функциями GetActiveOleObject и CreateOleObject для
подключения к уже запущенной копии приложения-сервера или запуска новой, если
сервер не запущен, что приводит к тому, что в вариантную переменную помещается
ссылка на объект Application соответствующего сервера.

Приведенная часть кода контроллера в других средствах разработки может выглядеть
по-другому — она не имеет прямого отношения к методам объектов Office,
так как обусловлена правилами вызова стандартных функций OLE в Delphi (за исключением
вызовов методов Visible и Quit объекта Application). А вот все то, что должно
быть вставлено вместо комментария «Здесь выполняются другие действия с объектами
приложения Office», в разных средствах разработки должно выглядеть более или
менее однотипно — используя созданную вариантную переменную, мы манипулируем
методами и свойствами объекта Application.

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

App.Quit;

несмотря на то что метод Quit объекта Application в случае некоторых приложений
Microsoft Office (например, Microsoft Word) имеет параметры.

При использовании же раннего связывания, например при создании контроллеров
с помощью Delphi, следует более строго подходить к определению параметров —
их число и тип должны соответствовать описанию методов в библиотеке типов. Например,
в случае раннего связывания корректный код на Delphi для закрытия документа
Word со значениями всех параметров по умолчанию будет иметь вид:

App.Quit(EmptyParam, EmptyParam, EmptyParam);

Исключением из этого правила является Visual Basic — это средство разработки
позволяет не задумываться о числе параметров методов при написании кода.

Обсудив общие принципы создания контроллеров автоматизации и узнав, как это
делается средствами Borland Delphi, мы можем перейти к рассмотрению автоматизации
конкретных приложений Microsoft Office. Начнем с одного из самого популярных
компонентов этого пакета — с Microsoft Word.

в начало

в начало

Автоматизация Microsoft Word

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

в начало

в начало

Программные идентификаторы и объектная модель Microsoft Word

Для приложения-контроллера доступны непосредственно следующие объекты:

Объект

Программный идентификатор

Комментарий

Application

Word.Application, Word.Application.9

С помощью этого программного идентификатора создается экземпляр Word
без открытых документов

Document

Word.Document, Word.Document.9, Word.Template.8

С помощью этого программного идентификатора создается экземпляр Word
с одним вновь созданным документом

Все остальные объекты Word являются так называемыми внутренними объектами.
Это означает, что они не могут быть созданы сами по себе; так, объект Paragraph
(абзац) не может быть создан отдельно от содержащего его документа.

Если вспомнить, что основное назначение Word — работа с документами, можно
легко понять иерархию его объектной модели (фрагмент ее был показан на рис.
1). Основным объектом в ней, как иво всех других приложениях Microsoft Office,
является объект Application, содержащий коллекцию Documents объектов типа Document.
Каждый объект типа Document содержит коллекцию Paragraphs объектов типа Paragraph,
Bookmarks типа Bookmark, Characters типа Character и т.д. Манипуляция документами,
абзацами, символами, закладками реально осуществляется путем обращения к свойствам
и методам этих объектов.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией
Microsoft Word. Если же вам встретилась задача, не совпадающая ни с одной из
перечисленных, вы можете попытаться найти подходящий пример на Visual Basic
в справочном файле VBAWRD9.CHM, либо, как уже было сказано выше, записать необходимую
последовательность действий в виде макроса и проанализировать его код.

в начало

в начало

Создание и открытие документов Microsoft Word

Для создания примеров использования Microsoft Word можно использовать код создания
контроллера, приведенный выше, и модифицировать его, заменяя комментарии кодом,
манипулирующим свойствами и методами объекта Word.Application. Мы начнем с создания
и открытия документов.

Создать новый документ Word можно, используя метод Add коллекции Documents
объекта Application:

App.Documents.Add;

Как создать нестандартный документ? Очень просто — нужно указать имя шаблона
в качестве параметра метода Add:

App.Documents.Add(‘C:Program Files _
   Microsoft OfficeTemplates1033Manual.dot’);

Для открытия уже существующего документа следует воспользоваться методом Open
коллекции Documents:

App.Documents.Open(‘C:MyWordFile.doc’);

Отметим, что свойство ActiveDocument объекта Word.Application указывает на
текущий активный документ среди одного или нескольких открытых. Помимо этого
к документу можно обращаться по его порядковому номеру с помощью метода Item;
например ко второму открытому документу можно обратиться так:

App.Documents.Item(2)

Отметим, что нумерация членов коллекций в Microsoft Office начинается с единицы.

Сделать документ активным можно с помощью метода Activate:

App.Documents.Item(1).Activate;

Следующее, чему следует научиться — это сохранять документ Word и закрывать
сам Word.

в начало

в начало

Сохранение, печать и закрытие документов Microsoft Word

Закрытие документа может быть осуществлено с помощью метода Close:

App.Documents.Item(2).Close;

или

App.ActiveDocument.Close ;

Метод Close имеет несколько необязательных (в случае позднего связывания) параметра,
влияющих на правила сохранения документа. Первый из них влияет на то, сохраняются
ли внесенные в документ изменения, и принимает три возможных значения (соответствующие
константы рекомендуется описать в приложении. См. листинг
2):

Третий параметр принимает значения True или False и влияет на то, пересылать
ли документ следующему пользователю по электронной почте. Если эта функциональность
не применяется, можно проигнорировать этот параметр.

Таким образом, при использовании этих параметров закрыть документ можно, например,
так:

App.ActiveDocument.Close(wdSaveChanges, _
   wdPromptUser) ;

Просто сохранить документ, не закрывая его, можно с помощью метода Save:

App.ActiveDocument.Save;

Этот метод также имеет несколько необязательных (в случае позднего связывания)
параметров, первый из которых равен True, если документ сохраняется автоматически,
и False, если нужно выводить диалоговую панель для получения подтверждения пользователя
о сохранении изменений (если таковые были сделаны). Второй параметр влияет на
формат сохраняемого документа, и список его возможных значений совпадает со
списком значений второго параметра метода Close.

Напоминаем, что закрыть сам Word можно с помощью метода Quit объекта Word.Application.
Этот метод имеет в общем случае три параметра, совпадающих с параметрами метода
Close объекта Document.

Вывод документа на устройство печати можно осуществить с помощью метода PrintOut
объекта Document, например:

App.ActiveDocument.PrintOut;

Если нужно изменить параметры печати, следует указать значения соответствующих
параметров метода PrintOut (в случае Microsoft Word их около двадцати).

в начало

в начало

Вставка текста и объектовв документ и форматирование текста

Для создания абзацев в документе можно использовать коллекцию Paragraphs объекта
Document, представляющую набор абзацев данного документа. Добавить новый абзац
можно с помощью метода Add этой коллекции:

App.ActiveDocument.Paragraphs.Add;

Для вставки собственно текста в документ, тем не менее, применяется не объект
Paragraph, а объект Range, представляющий любую непрерывную часть документа
(в том числе и вновь созданный абзац). Этот объект может быть создан разными
способами. Например, можно указать начальный и конечный символы диапазона (если
таковые имеются в документе):

var
   Rng : Variant;
...
   Rng := App.ActiveDocument.Range(2,4);
//со 2-го по 4-й символы

или указать номер абзаца (например, только что созданного):

Rng:= App.ActiveDocument.Paragraphs.Item(1).Range;

или указать несколько абзацев, следующих подряд:

Rng := App.ActiveDocument.Range _
   (App.ActiveDocument.Paragraphs.Item(3).Range.Start,_
   App.ActiveDocument.Paragraphs.Item(5).Range.End)

Вставить текст можно с помощью методов объекта Range InsertBefore (перед диапазоном)
или InsertAfter (после диапазона), например:

Rng.InsertAfter(‘Это вставляемый текст’);

Помимо объекта Range текст можно вставлять с помощью объекта Selection, являющийся
свойством объекта Word.Application и представляющий собой выделенную часть документа
(этот объект создается, если пользователь выделяет часть документа с помощью
мыши, и может быть также создан с помощью приложения-контроллера). Сам объект
Selection можно создать, применив метод Select к объекту Range, например:

var
   Sel : Variant;
...
App.ActiveDocument.Paragraphs.Item(3).Range.Select;

В приведенном выше примере в текущем документе выделяется третий абзац.

Если мы хотим вставить строку текста в документ либо вместо выделенного фрагмента
текста, либо перед ним, это можно сделать с помощью следующего фрагмента кода:

var
   Sel : Variant;
...
   Sel := App.Selection;
   Sel.TypeText(‘Это текст, которым мы заменим _
      выделенный фрагмент’);

Отметим, что если свойство Options.ReplaceSelection объекта Word.Application
равно True, выделенный текст будет заменен на новый текст (этот режим действует
по умолчанию); если же нужно, чтобы текст был вставлен перед выделенным фрагментом,
а не вместо него, следует установить это свойство равным False:

App.Options.ReplaceSelection := False;

Символ конца абзаца при использовании объекта Selection может быть вставлен
с помощью следующего фрагмента кода:

Sel.TypeParagraph;

К объекту Selection, так же как и к объекту Range, можно применить методы InsertBefore
и InsertAfter. В этом случае, в отличие от предыдущего, вставляемый текст станет
частью выделенного фрагмента текста.

С помощью объекта Selection, используя его свойство Font и свойства объекта
Font, такие как Bold, Italic, Size,…, можно отформатировать текст. Например,
таким образом можно вставить строку, выделенную жирным шрифтом:

Sel.Font.Bold := True;
Sel.TypeText(‘Это текст, который мы выделим _
   жирным шрифтом.’);
Sel.Font.Bold := False;
Sel.TypeParagraph;

Для наложения на вставляемый текст определенного заранее стиля можно использовать
свойство Style этого же объекта, например:

Sel.Style := ‘Heading 1’;
Sel.TypeText(‘Это текст, который станет _
   заголовком’);
Sel.TypeParagraph;

Нередко документы Word содержат данные других приложений. Простейший способ
вставить такие данные в документ — использовать метод Paste объекта Range:

Var
   Rng : Variant;
...
   Rng := App.Selection.Range;
   Rng.Collapse(wdCollapseEnd);
   Rng.Paste;

Естественно, в этом случае в буфере обмена уже должны содержаться вставляемые
данные.

Если нужно поместить в буфер обмена часть документа Word, это можно сделать
с помощью метода Copy объекта Range:

Var
   Rng : Variant;
...
   Rng := App.Selection.Range;
   Rng.Copy;

Следующее, чему нужно научиться — перемещению курсора в нужное место текста,
чем мы и займемся в следующем разделе.

в начало

в начало

Перемещение курсора по тексту

Используя метод Collapse, можно «сжать» объект Range или объект Selection,
сократив его размер до нуля символов:

Rng.Collapse(wdCollapseEnd);

Параметр этого метода указывает, в начале или в конце исходного фрагмента окажется
новый объект Range или Selection. Если вы используете позднее связывание и ваше
средство разработки — не Visual Basic, нужно определить в приложении соответствующие
константы:

const
   wdCollapseStart = $00000001;
   //новый объект находится в начале фрагмента
   wdCollapseEnd = $00000000;
   //новый объект находится в конце фрагмента

Перемещать курсор по тексту можно с помощью метода Move объектов Range и Selection.
Этот метод имеет два параметра. Первый указывает на то, в каких единицах измеряется
перемещение — в символах (по умолчанию), словах, предложениях, абзацах и др.
Второй параметр указывает, на сколько единиц при этом нужно переместиться (это
число может быть и отрицательным; по умолчанию оно равно 1). Например, следующий
фрагмент кода:

Rng.Move;

приведет к перемещению курсора на один символ вперед, а

Rng.Move(wdParagraph,3);

приведет к перемещению курсора на три абзаца вперед. Отметим, что этот метод
использует следующие константы:

const          //Единицей перемещения является:
   wdCharacter           = $00000001; //символ
   wdWord = $00000002; //слово
   wdSentence           = $00000003; //предложение
   wdParagraph          = $00000004; //абзац
   wdStory = $00000006; //часть документа
                       //напр., колонтитул,
                       //оглавление и др.)
   wdSection              = $00000008; //раздел
   wdColumn              = $00000009; //колонка таблицы
   wdRow = $0000000A; //строка таблицы
   wdCell = $0000000C; //ячейка таблицы
   wdTable = $0000000F; //таблица

Нередко для перемещения по тексту используются закладки. Создать закладку в
текущей позиции курсора можно путем добавления члена коллекции Bookmarks объекта
Document c помощью метода Add, указав имя закладки в качестве параметра, например:

App.ActiveDocument.Bookmarks.Add(‘MyBookmark’);

Проверить существование закладки в документе можно с помощью метода Exists,
а переместиться на нее — с помощью метода Goto объектов Document, Range
или Selection:

Rng :=
App.ActiveDocument.Goto(wdGoToBookmark,  
   wdGoToNext, ,‘MyBookmark’);
Rng.InsertAfter(‘Текст, вставленный после  
   закладки’);

Значения констант для этого примера таковы:

const

wdGoToBookmark = $FFFFFFFF;
   //перейти к закладке
wdGoToNext = $00000002;
   //искать следующий объект в тексте

Отметим, что с помощью метода Goto можно перемещаться не только на указанную
закладку, но и на другие объекты (рисунки, грамматические ошибки и др.), и направление
перемещения тоже может быть различным. Поэтому список констант, которые могут
быть использованы в качестве параметров данного метода, довольно велик.

в начало

в начало

Создание таблиц

Создавать таблицы можно двумя способами. Первый заключается в вызове метода
Add коллекции Tables объекта Document и последовательном заполнении ячеек данными.
Этот способ при позднем связывании работает довольно медленно.

Второй способ, намного более «быстрый», заключается в создании текста из нескольких
строк, содержащих подстроки с разделителями (в качестве разделителя можно использовать
любой или почти любой символ, нужно только, чтобы он заведомо не встречался
в данных, которые будут помещены в будущую таблицу), и последующей конвертации
такого текста в таблицу с помощью метода ConvertToTable объекта Range. Ниже
приведен пример создания таблицы из трех строк и трех столбцов этим способом
(в качеcтве разделителя, являющегося первым параметром метода ConvertToTable,
используется запятая):

Var
   Rng : Variant;
...
   Rng := App.Selection.Range;
   Rng.Collapse(wdCollapseEnd);
   Rng.InsertAfter(‘1, 2, 3’);
   Rng.InsertParagraphAfter;
   Rng.InsertAfter(‘4,5,6’);
   Rng.InsertParagraphAfter;
   Rng.InsertAfter(‘7,8,9’);
   Rng.InsertParagraphAfter;
   Rng.ConvertToTable(‘,’);

Отметим, что внешний вид таблицы можно изменить с помощью свойства Format,
а также с помощью свойств коллекции Columns, представляющей колонки таблицы,
и коллекции Rows, представляющей строки таблицы объекта Table.

в начало

в начало

Обращение к свойствам документа

Свойства документа можно получить с помощью коллекции BuiltInDocumentProperties
объекта Document, например:

Memo1.Lines.Add(‘Название — ‘ + _
App.ActiveDocument.BuiltInDocumentProperties
[wdPropertyTitle].Value);
Memo1.Lines.Add(‘Автор — ‘ + _
App.ActiveDocument.BuiltInDocumentProperties
[wdPropertyAuthor]. _ Value);
Memo1.Lines.Add(‘Шаблон — ‘ + _
    App.ActiveDocument.BuiltInDocumentProperties 
[wdPropertyTemplate]. _Value) 

Константы, необходимые для обращения к свойствам документа по имени, приведены
в листинге 3.

Итак, в данном разделе мы изучили основные операции, которые наиболее часто
применяются при автоматизации Microsoft Word. Естественно, возможности автоматизации
Word далеко не исчерпываются приведенными примерами, однако я надеюсь, что,
руководствуясь основными принципами создания контроллеров Word, изложенными
в данной статье, и соответствующим справочным файлом, вы сможете ими воспользоваться —
мы с вами уже убедились, что это вовсе не так сложно.

Следующим приложением Microsoft Office, автоматизацию которого мы рассмотрим,
будет Microsoft Excel — второе по популярности приложение Microsoft Office.

в начало

в начало

Автоматизация Microsoft Excel

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

в начало

в начало

Программные идентификаторы и объектная модель Microsoft Excel

Существует три типа объектов Excel, которые могут быть созданы непосредственно
с помощью приложения-контроллера. Эти объекты и соответствующие им программные
идентификаторы перечислены ниже.

Все остальные объекты Excel являются так называемыми внутренними объектами.

Небольшой фрагмент объектной модели Microsoft Excel изображен на рис.2:

Основным в объектной модели Excel является объект Application, содержащий коллекцию
Workbooks объектов типа WorkBook. Каждый объект типа WorkBook содержит коллекцию
WorkSheets-объектов типа WorkSheet, Charts типа Chart и др. Манипуляция рабочими
книгами, их листами, ячейками, диаграммами реально осуществляется путем обращения
к свойствам и методам этих объектов.

Ниже мы рассмотрим наиболее часто встречающиеся задачи, связанные с автоматизацией
Microsoft Excel. Если вам встретилась задача, не совпадающая ни с одной из перечисленных,
вы можете попытаться найти подходящий пример на Visual Basic в справочном файле
VBAXL9.CHM, либо, как и в случае Microsoft Word, записать соответствующий макрос
и проанализировать его код.

в начало

в начало

Запуск Microsoft Excel, создание и открытие рабочих книг

Для создания примеров использования Microsoft Excel можно использовать код
создания контроллера, приведенный в разделе «Общие принципы создания контроллеров
автоматизации», заменив первый оператор в приведенном примере на следующий:

AppProgID := ‘Excel.Application’;

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

Изучение создания контроллеров Excel мы начнем с создания и открытия рабочих
книг.

Создать новую рабочую книгу Excel можно, используя метод Add коллекции Workbooks
объекта Application:

App.WorkBooks.Add;

Для создания рабочей книги на основе шаблона следует указать его имя в качестве
первого параметра метода Add:

App.WorkBooks.Add(‘C:Program FilesMicrosoft _
   OfficeTemplates1033invoice.xlt’);

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

const
   xlWBATChart = $FFFFEFF3;
//рабочая книга состоит из листа с диаграммой
   xlWBATWorksheet = $FFFFEFB9;
//рабочая книга состоит из листа с данными

В этом случае рабочая книга будет содержать один лист типа, заданного указанной
константой (график, обычный лист с данными и др.)

Для открытия уже существующего документа следует воспользоваться методом Open
коллекции WorkBooks:

App.Documents.Open(‘C:MyExcelFile.xls’);

Отметим, что свойство ActiveWorkBook объекта Excel.Application указывает на
текущую активную рабочую книгу среди одной или нескольких открытых. Помимо этого
к рабочей книге можно обращаться по ее порядковому номеру, например ко второй
открытой рабочей книге можно обратиться так:

App.WorkBooks[2]

Обратите внимание на то, что в Delphi при использовании позднего связывания
синтаксис, используемый для обращения к членам коллекций объектов Excel, отличен
от синтаксиса, используемого для обращения к объектам Word — в случае Word
мы использовали метод Item, а в случае Excel мы обращаемся к членам коллекции
как к элементам массива. Если же вы используете Visual Basic, синтаксис, применяемый
для обращения к членам коллекций, будет одинаков для всех коллекций Microsoft
Office.

Сделать рабочую книгу активной можно с помощью метода Activate:

App.WorkBooks[2].Activate;

Следующее, чему следует научиться — это сохранять рабочие книги в файлах.

в начало

в начало

Сохранение, печать и закрытие рабочих книг Microsoft Excel

Закрытие документа может быть осуществлено с помощью метода Close:

App.WorkBooks[2].Close;

или

App.ActiveWorkBook.Close;

Метод Close имеет несколько необязательных (в случае позднего связывания) параметров,
влияющих на правила сохранения рабочей книги. Первый из параметров принимает
значения True или False и влияет на то, сохранять ли изменения, внесенные в
рабочую книгу. Второй параметр (типа Variant) — имя файла, в котором нужно
сохранить рабочую книгу (если в нее были внесены изменения). Третий параметр,
также принимающий значения True или False, влияет на то, следует ли пересылать
документ следующему пользователю по электронной почте, и может быть проигнорирован,
если эта функциональность не используется.

App.ActiveWorkBook.Close(True,’C:MyWorkBook.xls’);

Просто сохранить рабочую книгу, не закрывая ее, можно с помощью методов Save
или SaveAs:

App.ActiveWorkBook.Save;

или

App.ActiveWorkBook.SaveAs(‘C:MyWorkBook.xls’);

Метод SaveAs имеет более десятка параметров, влияющих на то, как именно сохраняется
документ (под каким именем, с паролем или без него, какова кодовая страница
для содержащегося в ней текста и др.).

Закрыть сам Excel можно с помощью метода Quit объекта Excel.Application. В
случае Excel этот метод параметров не имеет.

Вывод документа Excel на устройство печати можно осуществить с помощью метода
PrintOut объекта WorkBook, например:

App.ActiveWorkBook.PrintOut;

Если нужно изменить параметры печати, следует указать значения соответствующих
параметров метода PrintOut (в случае Excel их восемь).

в начало

в начало

Обращение к листам и ячейкам

Обращение к листам рабочей книги производится с помощью коллекции WorkSheets
объекта WorkBook. Каждый член этой коллекции представляет собой объект WorkSheet.
К члену этой коллекции можно обратиться по его порядковому номеру, например:

App.WorkBooks[1].WorkSheets[1].Name := _
   ‘Страница 1’;

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

К листу рабочей книги можно обратиться и по имени, например:

App.WorkBooks[1].WorkSheets[‘Sheet1’].Name := _
   ‘Страница 1’;

Обращение к отдельным ячейкам листа производится с помощью коллекции Cells
объекта WorkSheet. Например, добавить данные в ячейку B1 можно следующим образом:

App.WorkBooks[1].WorkSheets[‘Sheet1’].Cells[1,2].Value:=’25’;

Здесь первая из координат ячейки указывает на номер строки, вторая — на
номер столбца.

Добавление формул в ячейки производится аналогичным способом:

App.WorkBooks[1].WorkSheets[‘Sheet1’] _
   .Cells[3,2].Value := ‘ =SUM(B1:B2)’;

Очистить ячейку можно с помощью метода ClearContents.

Форматирование текста в ячейках производится с помощью свойств Font и Interior
объекта Cell и их подсвойств. Например, следующий фрагмент кода выводит текст
в ячейке красным жирным шрифтом Courier кегля 16 на желтом фоне:

App.WorkBooks[1].WorkSheets[1].Cells[3,2].Interior _
   .Color := clYellow;
App.WorkBooks[1].WorkSheets[1].Cells[3,2].Font _
   .Color := clRed;
App.WorkBooks[1].WorkSheets[1].Cells[3,2] _
   .Font.Name := ‘Courier’;
App.WorkBooks[1].WorkSheets[1].Cells[3,2] _
   .Font.Size := 16;
App.WorkBooks[1].WorkSheets[1].Cells[3,2] _
.Font.Bold := True;

Объект

Программный идентификатор

Комментарий

Application

Excel.Application, Excel.Application.9

С помощью этого программного идентификатора создается экземпляр приложения
без открытых рабочих книг

WorkBook

Excel.AddIn

С помощью этого программного идентификатора создается экземпляр расширения
(add-in) Excel (имеющиеся расширения доступны с помощью пункта меню Tools
| Add-Ins)

 

Excel.Chart, Excel.Chart.8

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

 

Excel.Sheet, Excel.Sheet.8

Рабочая книга, созданная с помощью этих программных идентификаторов,
состоит из одного листа

Вместо свойства Color можно использовать свойство ColorIndex, принимающее значения
от 1 до 56; таблицу соответствий значений этого свойства реальным цветам можно
найти в справочном файле VBAXL9.CHM.

Обратиться к текущей ячейке можно с помощью свойства ActiveCell объекта Excel.Application,
а узнать местоположение ячейки можно с помощью свойства Address объекта Cell,
например:

ShowMessage(App.ActiveCell.Address);

Помимо обращения к отдельным ячейкам, можно манипулировать прямоугольными областями
ячеек с помощью объекта Range, например:

App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’] _
   .Value := ‘Test’;
App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’] _
   .Font.Color := clRed;

Приведенный выше код приводит к заполнению прямоугольного участка текстом и
к изменению цвета шрифта ячеек.

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

App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’].Copy;
App.WorkBooks[1].WorkSheets[2].Range[‘A11:C15’].Select;
App.WorkBooks[1].WorkSheets[2].Paste;

Обратите внимание на то, что диапазон, куда копируются данные, предварительно
выделяется с помощью метода Select.

Отметим, что примерно таким же образом можно копировать данные и из других
приложений (например, из Microsoft Word).

Довольно часто при автоматизации Excel используются его возможности, связанные
с построением диаграмм. Ниже мы рассмотрим, как это сделать.

в начало

в начало

Создание диаграмм

Диаграммам Excel соответствует объект Chart, который может располагаться как
на отдельном листе, так и на листе с данными. Если объект Chart располагается
на листе с данными, ему соответствует член коллекции ChartObjects объекта WorkSheet
и создание диаграммы нужно начать с добавления элемента в эту колекцию:

Ch:=App.WorkBooks[1].WorkSheets[2].ChartObjects.Add(10,50,400,400);

Параметрами этого метода являются координаты левого верхнего угла и размеры
диаграммы в пунктах (1/72 дюйма).

Если же диаграмма располагается на отдельном листе (не предназначенном для
хранения данных), то создание диаграммы нужно начать с добавления элемента в
коллекцию Sheets объекта Application (которая отличается от коллекции WorkSheets
тем, что содержит листы всех типов, а не только листы с данными):

App.WorkBooks[1].Sheets.Add(,,1,xlWBATChart);

В этом случае первый параметр метода Add указывает порядковый номер листа,
перед которым нужно поместить данный лист (или данные листы, если их несколько),
второй параметр — порядковый номер листа, после которого нужно поместить данный
лист (используется обычно один из них), третий параметр — сколько нужно
создать листов, а четвертый — какого типа должен быть лист. Значения четвертого
параметра совпадают со значениями первого параметра метода Add коллекции WorkBooks
объекта Application, и при использовании имен соответствующих констант следует
определить их в приложении-контроллере.

Простейший способ создать диаграмму, с точки зрения пользователя, — создать
ее с помощью соответствующего эксперта на основе прямоугольной области с данными.
Точно так же можно создать диаграмму и с помощью контроллера автоматизации —
для этой цели у объекта Chart, являющегося свойством объекта ChartObject (члена
коллекции ChartObjects), имеется метод ChartWizard. Первым параметром этого
метода является объект Range, содержащий диапазон ячеек для построения диаграммы,
а вторым — числовой параметр, указывающий, какого типа должна быть эта
диаграмма:

Var Ch: Variant;
…
Ch.Chart.ChartWizard _
(App.WorkBooks[1].WorkSheets[2].Range[‘A1:C5’], _
   xl3DColumn);

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

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

Ch.Chart.HasTitle :=1;
Ch.Chart.HasLegend := False;
Ch.Chart.ChartTitle.Text := _
   ‘Пример диаграммы Excel ‘;
Ch.Chart.Axes(1).HasTitle := True;
Ch.Chart.Axes(1).AxisTitle.Text := _
   ‘Подпись вдоль оси абсцисс’;
Ch.Chart.Axes(2).HasTitle := True;
Ch.Chart.Axes(2).AxisTitle.Text := _
   ‘Подпись вдоль оси ординат’;

Еще один способ создания диаграммы — определить все ее параметры с помощью
свойств объекта Chart, включая и определение серий, на основе которых она должна
быть построена. Данные для серии обычно находится в объекте Range, содержащем
строку или столбец данных, а добавление серии к диаграмме производится путем
добавления члена к коллекции SeriesCollection, например:

App.WorkBooks[1].Sheets.Add(,,1,xlWBATChart);
App.WorkBooks[1].Sheets[1].ChartType := xl3DPie;
Rng:=App.WorkBooks[1].WorkSheets[2].Range[‘B1:B5’];
App.WorkBooks[1].Sheets[1].SeriesCollection.Add(Rng);

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

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

В следующих статьях данного цикла будет рассмотрена автоматизация других приложений
Microsoft Office — Microsoft PowerPoint, Microsoft Access, Microsoft Outlook
и др.

КомпьютерПресс 11’2000

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

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

В статье намеренно не рассматриваются подходы с использованием Markdown, Pandoc, Asciidoc, Confluence как более сложные и узкоспециализированные, а статью хотелось сделать доступной и понятной не только молодым людям, но и людям старших возрастов.

Все описанные действия выполнены в программе «Microsoft Word профессиональный плюс 2019». В предыдущих версиях Word последовательность и названия команд могут отличаться, но описанная функциональность так или иначе существует. По минимуму использованы макросы и автоматизация с помощью сторонних средств (в частности Python, использована версия 3.6).

Описанные операции

  • Автоматическая нумерация рисунков (таблиц)

  • Ускоренная вставка поля автоматической нумерации рисунка

  • Ссылка на номер рисунка (таблицы, разделы, пункты)

  • Изменение формата перекрестной ссылки на рисунок (таблицу, раздел, пункт)

  • Ускоренная вставка ссылки на номер рисунка (таблицы)

  • Автозаполняемые поля (Экспресс-блоки) (число страниц, дата)

  • Исправление съезжающей нумерации в списке при выборе «Начать заново с 1»

  • Карта стилей

  • Перенос стилей между документами и очистка стилей

  • Автоматическое содержание (оглавлениие)

  • Макрос. Обрамление выделенного текста двоеточием с обеих сторон

  • Сравнение документов

  • Python. Пакетное сохранение документов в PDF

  • Список сокращений

  • Горячие клавиши

  • Заключение

Автоматическая нумерация рисунков (таблиц)

Классическая проблема: нужно объединить 4 файла, насыщенные рисунками, в один документ. Если это делать «в лоб», после объединения нумерация рисунков собьется. Восстановить ее – большая грустная задача.

Классическое решение: поставить вместо номера рисунка текст «ХХ» и закрасить желтым цветом (желтый цвет предлагается Word по умолчанию для выделения текста). Потом, после объединения частей в один файл, руками проставить номера рисунков в порядке их очередности. Это первое, что делает нормальный человек, действуя интуитивно, и проблема не кажется сложной, пока вы не столкнетесь с документом, в котором рисунков больше сотни, и еще нужно поддерживать актуальность документа (то есть со временем добавлять или исключать рисунки с перекрестными ссылками).

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

Чтобы присвоить рисунку (таблице) номер в автоматическом режиме, нужно нажать непосредственно на рисунок (1), после чего выбрать пункт меню «Ссылки» (2) ⟶ «Вставить название» (3) ⟶ Снять галочку «Исключить подпись из названия» (4) ⟶ «Ок» (5). Под рисунком появится подпись «Рисунок 1», где 1 – это поле автоматической нумерации рисунка (таблицы) (6). Справа от номера, в зависимости от правил именования рисунков, рисунку можно дать название.

Суть данной операции в том, что если 4 человека форматировали наименования рисунков именно так, то после объединения четырех частей документа для проставления корректных номеров рисунков необходимо выделить весь текст документа (Ctrl+A) и обновить автоматические поля (F9). Все рисунки (таблицы) при этом получат правильный порядковый номер (3).

Думаете, что повторить данную процедуру для 1000 рисунков долго? Читаем ниже.

Ускоренная вставка поля автоматической нумерации рисунка (таблицы)

Для быстрой вставки поля автоматического номера рисунка (таблицы) необходимо выделить любое сформированное ранее название рисунка (таблицы) (см. пункт выше), содержащее поле автоматической нумерации (1), скопировать его, перевести курсор под нужный рисунок и вставить скопированное название (2). Название будет скопировано с полем автоматической нумерации с исходным номером. Его нужно будет обновить. Не обязательно делать это сразу. Пока скопированный текст находится в буфере обмена, можно вставить поле автоматической нумерации под всеми рисунками (таблицами) до конца документа, после чего выделить весь текст (Ctrl+A) и обновить автоматические поля (F9). Все рисунки (таблицы) при этом получат правильный порядковый номер (3).

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

Ссылка на номер рисунка (таблицы, раздела, пункта)

Классическая проблема: документ имеет много отсылок на внутренние объекты документа (рисунки, таблицы, разделы, пункты). При изменении номера объекта надо изменить и все отсылки на него, а если они находятся не рядом с объектом, то про них можно просто забыть или пропустить.  

Классическое решение: сначала человек проставляет вместо номеров рисунков (объектов) «ХХ» желтым цветом, то же самое делает и для ссылок на указанные рисунки, затем проставляет номера рисунков по окончанию редактирования документа и начинает сопоставлять ссылки с рисунками, к которым они относятся.

Данный подход приходит в голову первым, однако Word и это умеет делать автоматически. Если в тексте встречаются ссылки на рисунки, то крайне полезно делать их именно ссылкой, а не вручную вписанным номером. Это позволяет отказаться от механической проверки актуальности ссылок, которые обязательно начнут сбиваться при малейшем редактировании документа, и переложить указанную работу исключительно на Word. Более того, при перестановке рисунка по тексту или же вставке новых рисунков ссылки обновляются в соответствии с обновленной нумерацией. Если вдруг ссылка дана на несуществующий объект, то вместо номера рисунка (таблицы) появится сообщение вида «Ошибка! Источник ссылки не найден.». Используя поиск, можно быстро отследить корректность всех перекрестных ссылок по фразе «Ошибка».

Для вставки ссылки на рисунок (таблицу) необходимо перевести курсор мыши в то место, где необходимо вставить ссылку (1), нажать пункт меню «Ссылки» (2), «Перекрестная ссылка» (3), выбрать из выпадающего списка тип ссылки «Рисунок» («Таблица» и т.д.) (4), из выпадающего списка выбрать то, на что вставить ссылку «Постоянная часть и номер» (5), выбрать нужный рисунок (таблицу и др.) (6), нажать кнопку «Вставить» (7). На месте (1) появится ссылка на выбранный рисунок (таблицу и др.).

Если стандартный формат вставки ссылки не подходит (например, необходимо выполнять требования ГОСТ), то можно выполнить другие действия, описанные ниже.

Изменение формата перекрестной ссылки на рисунок (таблицу, раздел, пункт)

По умолчанию Word вставляет фразу «Рисунок N», однако иногда необходимо вставить фразу вида «Рис. N» (или «см. рис. N»). Для этого из перекрестной ссылки необходимо забрать лишь номер, а остальное дописать руками.

Для отображения только номера объекта необходимо выделить поле ссылки (1) и нажать «SHIFT+F9», при этом откроется код ссылки (2), в него нужно дописать сочетание « # » и обязательно поставить в конце пробел (3). Чтобы увидеть номер рисунка (таблицы), необходимо обновить содержимое поля нажатием «F9» (4).

Если у Вас сложилось впечатление, что это слишком долго, то читаем ниже, как можно немного ускориться.

Ускоренная вставка ссылки на номер рисунка (таблицы)

Ускорить процесс вставки ссылок можно достаточно просто, следуя советам дедушки Сазерленда (методология Scrum), а именно: нужно выполнять одну простейшую операцию. Применительно к нашей задаче следует выделить весь текст нажатием «Ctrl+A», отобразить коды автозаполняемых полей нажатием «SHIFT+F9», открыть окно «Перекрестные ссылки» по примеру выше, после чего необходимо пролистывать документ, перенося курсор в нужные места, выбирать нужные ссылки из открытого окна перекрестных ссылок и вставлять их. Окно «Перекрестные ссылки» закрываем только тогда, когда документ отработан до конца.

По аналогии можно быстро изменить отображение перекрестных ссылок на рисунки (таблицы). Для этого выделяем весь текст нажатием «Ctrl+A», отображаем коды автозаполняемых полей нажатием «SHIFT+F9», копируем в буфер обмена текст « # » (пробел в конце обязателен) и вставляем его в конце требуемых полей. Обновляем поля нажатием «F9», когда документ обработан до конца.

Автозаполняемые поля (Экспресс-блоки) (число страниц, дата)

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

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

Все это может выполняться автоматически стандартными средствами Word. В качестве примера вставим автоматическое поле числа страниц документа. Для этого устанавливаем курсор мыши туда, где необходимо вставить автозаполняемое поле (1), выбираем пункт меню «Вставить», затем «Экспресс-блоки» (2), затем «Поле» (3). Откроется окно «Поле» (4), в колонке «Поля» выбираем тип поля, в нашем примере «NumPages» (5), и нажимаем кнопку «Ок» (6). При этом в месте, где был установлен курсор (1), вставится поле, которое при обновлении (F9) поменяет значение на фактическое число страниц.

Для вставки даты вместо «NumPages» (5) необходимо найти «Date» и выбрать необходимый формат. 

Исправление съезжающей нумерации в списке при выборе «Начать заново с 1»

Классическая проблема: надо начать новый нумерованный список, но по умолчанию продолжается старая нумерация. Обычно делают так: нажимают «ПКМ», «Начать заново с 1» и первый номер съезжает к значению по умолчанию.

Классическое решение: каждый раз передвигать отступы первого пункта списка на необходимое место.

 Этого можно не делать если заранее определить отступы для нумерованного списка. Для этого необходимо нажать на первый номер нумерованного списка «ПКМ», затем «Изменить отступы в списке». Проделать это можно сразу для нескольких уровней списков, а еще лучше, если для каждого уровня списка создать отдельный стиль, что позволит быстро изменять отступы по всему документу, но об этом уже ниже.

Карта стилей

Классическая проблема: два человека разрабатывают части документа, в которых используется нумерация разделов и пунктов, выделение заголовков и особое форматирование абзацев. Один человек поддерживал нумерацию механически, второй — используя автонумерацию. При объединении нумерация съезжает, равно как и форматирование.

Классическое решение: выбирается жертва, которая приводит полученный бардак к единому виду.

Это, пожалуй, самая распространенная проблема, которая влечет за собой много нудной, монотонной и неинтересной работы по форматированию документа. Возникает она по причине того, что мало кто знает и пользуется одной из базовых возможностей Word — стилями. Правильно подготовленная карта стилей позволяет экономить уйму времени. Вы знали, что при изменении параметров существующего стиля они применяются ко всему тексту документа, который отформатирован в этом стиле?

Так вот, чтобы форматирование не занимало слишком много времени, хорошей практикой считается перед началом проекта уяснить требования к оформлению документов (например, определенных в ГОСТ или шаблонах заказчика) и собрать карту стилей хотя бы для следующих элементов:

  • Заголовок 1,2,3,4,5,6 уровней;

  • Текст;

  • Нумерованный список;

  • Список;

  • Название таблицы;

  • Текст таблицы;

  • Название рисунка;

  • Рисунок;

  • Программный код.

Шаблон документа с указанными стилями раздается всем членам команды, а еще лучше сохраняется в корпоративном облаке или Confluence.

При таком подходе вставка новых материалов в документ не нарушает целостность форматирования.

Перенос стилей между документами и очистка стилей

Классическая проблема: вы отдаете документ на проверку по отделам организации. И один из сотрудников вносит свои правки в Libre в Ubuntu, а другой делает то же самое, но используя Mac. Потом документы возвращаются к вам, вы обнаруживаете в них 10000 стилей, текст в непонятных шрифтах и нарушение исходного форматирования.

Классическое решение (взято из интернета): нажимаем галочку в правом нижнем углу раздела «Стили» (или «Ctrl» + «Shift» + «Alt» + «S»), затем «Очистить стили».

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

Документ в формате *.docx — это самый обыкновенный архив, который спокойно открывается архиватором (например, WinRAR).

Чтобы открыть документ в WinRAR открываем непосредственно сам архиватор, находим искомый документ, нажимаем правой клавишей мыши и выбираем «Показать содержимое архива». Нам откроется структура папок вида: _rels, customXml, docProps, word. В большей степени нас интересует каталог «Word». Переходим в него. За стили в документе отвечает файл «styles.xml».

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

Если же есть острое желание очистить документ от всех стилей, файл «styles.xml» нужно удалить.

Если совсем не хочется открывать документ в WinRar, вот скрипт (для Windows):

@ECHO OFF
SET Winrar=C:Program FilesWinRARWinRAR.exe
FOR %%I IN (*.docx) DO (
 "%WinRAR%" d "%%I" wordstyles.xml
)

Открываем блокнот, вставляем туда указанный текст и сохраняем в формате *.bat. Переносим полученный файл в каталог с документами, в которых необходимо удалить стили и запускаем.

По-хорошему, чтобы не доводить до подобного, лучше сравнивать документы на предмет выявления правок, и переносить их вручную в документ с нормальным форматированием. Еще лучше ­– отдавать документ на вычитку в формате *.pdf, чтобы не нарушать правило, что изменения в документ вносит только ответственный за документацию.

Автоматическое содержание (оглавление)

Классическая проблема: Вы работаете над документом размером, например, в 300 страниц. По завершении листаете документ и собираете содержание, проставляете номера страниц. Срочно возникает необходимость вставить в текст новый раздел.

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

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

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

Предположим, что у нас есть текст (1). Выделяем в нем нужный заголовок (для нашего примера сразу все), который можно отнести к заголовку первого уровня, и заходим в настройки абзаца (2). Для выбранных абзацев в выпадающем списке «Уровень» (3) выбираем «Уровень 1» и нажимаем «Ок» (4). То же самое проделываем для всех оставшихся абзацев, присваивая им соответствующий уровень.

После того как уровни заголовков проставлены, переходим в пункт меню «Ссылки» (1), «Оглавление» (2), «Настраиваемое оглавление» (3). Здесь в окне «Параметры» (4) можно выполнить более точную настройку параметров содержания или включить в него стили, которым не были заданы уровни. По умолчанию достаточно указать число уровней, которые должны быть перенесены в содержание, нажать «Ок» и посмотреть, все ли, что Вы хотели, оказалось в содержании.

После завершения работы с документом обновление содержание осуществляется, как и любое другое автозаполняемое поле. Необходимо выделить его и нажать «F9». Однако при работе с содержанием будет предложено два варианта: «Полностью» и «Только номера страниц». При выборе параметра «Полностью» форматирование будет сброшено и надо будет править его заново. При обновлении только номеров страниц форматирование не съезжает и выполняется только пересчет страниц.

Макрос. Обрамление выделенного текста двоеточием с обеих сторон

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

Классическое решение: открываете все документы один за одним и читаете. Все, на чем сделан акцент, выделяете кавычками.

Выделить одно слово кавычками не выглядит чем-то сложным, однако если вы работали в какой-нибудь IDE, то скорее всего знаете, насколько удобнее, когда ставится сразу две кавычки (открывающая и закрывающая). Аналога подобной функции в Word мне найти не удалось, зато встроенный инструментарий работы с макросами позволяет это реализовать. А чтобы полученный макрос можно было быстро применять, нужно назначить ему горячую клавишу.

Если изначально написать макрос кодом, моя сборка Word не позволяет назначить ему горячую клавишу. Это можно обойти следующим образом: переходим в пункт меню «Вид» (1), «Макросы» (2), «Запись макроса». Откроется окно «Запись макроса», где нужно ввести имя макроса и назначить его клавишам (4). Откроется окно «Настройка клавиатуры» (5), где нужно задать сочетание клавиш для выполнения макроса (например «Ctrl+2», так как кавычки задаются смежным сочетанием «Shift+2») (6), нажать «Назначить» (7) и «Закрыть» (8). Начнется запись макроса. Ее нужно остановить, для чего заходим в меню «Макросы» (2) и нажимаем «Остановить запись».

Теперь в созданный пустой макрос необходимо добавить код. Для этого переходим в «Макросы» (2), выбираем наш макрос из списка и нажимаем «Изменить». Откроется окно редактирования Visual Basic, содержимое которого необходимо заменить кодом ниже.

Sub Кавычки
'
'Кавычки макрос
'
'
If Right(Selection.Text, 1) = Chr(32) Or _
  Right(Selection.Text, 1) = Chr(13) Then
  Selection.MoveLeft wdCharacter, 1, wdExtend
End If
With Selection
  .InsertBefore Chr(171)  'вместо Char(171) можно использовать '('
  .InsertAfter Chr(187)  'вместо Char(171) можно использовать ')'
End With
End Sub

Теперь при выделении текста и нажатии «Ctrl+2» он будет обрамлен кавычками с обеих сторон.

Сравнение документов

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

 Классическое решение: узнаете у человека, что он исправил, или же открываете два окна со старым и новым документ и начинаете сравнение.

Если вы не пользуетесь программами контроля версий (SVN) вроде GIT, где изменения можно просмотреть в логах, то Word аналогично может подсветить различия двух документов.

Для этого необходимо нажать пункт меню «Рецензирование» (1), «Сравнить» (2), выбрать исходный файл (3), измененный файл (4) и нажать «ОК» (5).

Откроется новое окно Word, в котором в виде комментариев и правок будут доступны все изменения между двумя документами.

Python. Пакетное сохранение документов в PDF

Классическая проблема: передаете комплект документов, а при открытии форматирование начинает съезжать, потому что не хватило шрифтов или еще чего-то.

Классическое решение: передавать документы в формате *.pdf. Для этого вы открываете сначала один документ, нажимаете «Сохранить как», выбираете тип файла «PDF», сохраняете. И так с каждым документом.

Данную процедуру можно автоматизировать с помощью Python, и запуском одного скрипта сохранить пакет документов в формате *.pdf.

Устанавливаем Python, открываем блокнот и вставляем в него следующий код:

import sys
import os
import comtypes.client

def decode_doc_to_pdf(filename):
    wdFormatPDF = 17

    in_file = os.path.abspath(filename+'.docx')
    out_file = os.path.abspath(filename+'.pdf')

    word = comtypes.client.CreateObject('Word.Application')
    doc = word.Documents.Open(in_file)
    doc.SaveAs(out_file, FileFormat=wdFormatPDF)
    doc.Close()
    word.Quit()

def get_list_of_docx_files():
    list_of_all_files = os.listdir('.')  
    list_of_docx_files = []
    for filename in list_of_all_files:
        if filename[-4:] == 'docx':
            list_of_docx_files.append(filename[:-5])
    return list_of_docx_files

docx_list = get_list_of_docx_files()


for filename in docx_list:
    decode_doc_to_pdf(filename)

Сохраняем документ с расширением *.py. Все что нужно сделать дальше, это положить скрипт в папку с документами в формате *.docx и запустить его. Если запуск исполняемого файла скрипта не проходит, то выполнить скрипт через командную строку.

Список сокращений

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

Классическое решение: читаем весь документ от начала до конца, выписываем все сокращения в отдельном файле, перечитываем документ сначала на предмет корректного применения сокращения (проверяем, что сокращение не используется раньше, чем оно введено)

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

Чтобы не нарушать форматирование в основном документе, необходимо сделать его копию. В копии исходного документа необходимо сбросить все форматирование, так как
будет необходимо использовать поиск с подстановочными знаками. Далее нажимаем «Заменить» (1), затем в поле «Найти» (2) вставляем текст « <[А-Я,A-Z]@> » (« <[А-Я]@> » для поиска только русских слов в верхнем регистре). Устанавливаем чекбокс «Подстановочные знаки» (3), нажимаем «Формат» (4), выбираем «Шрифт», затем «Полужирный» и нажимаем «Ок». В строке «Заменить на» (5) появится текст « ^& », после чего нажимаем «Заменить все» (6). Все слова в верхнем регистре будут выделены полужирным шрифтом.

Далее необходимо выделить весь найденный текст в верхнем регистре. Для этого выделяем любое сокращение, отформатированное жирным, нажимаем «Выделить», затем «Выделить текст, имеющий такой же формат». Копируем выделенный текст в буфер обмена (Ctrl+C).

Отсеять слова в верхнем регистре от сокращений и дубликатов можно используя Excel. Если не знакомы с такой процедурой, то открываем Excel, вставляем скопированный текст из буфера обмена в левую верхнюю ячейку. Чтобы удалить дубликаты из получившейся колонки, выделяем ее, переходим на вкладку «Данные» и нажимаем кнопку «Удалить дубликаты».

Появится сообщение вида «Найдено и удалено….осталось». Далее с полученным списком нужно немного поработать руками.

Горячие клавиши

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

Выравнивание

  • CTRL+E — Переключение абзаца между выравниванием по центру и выравниванием по левому краю;

  • CTRL+J — Переключение абзаца между выравниванием по ширине и выравниванием по левому краю;

  • CTRL+R — Переключение абзаца между выравниванием по правому краю и выравниванием по левому краю;

  • CTRL+L — Выравнивание абзаца по левому краю.

Перемещение курсора

  • CTRL+СТРЕЛКА ВЛЕВО — На одно слово влево;

  • CTRL+СТРЕЛКА ВПРАВО — На одно слово вправо;

  • CTRL+СТРЕЛКА ВВЕРХ — На один абзац вверх;

  • CTRL+СТРЕЛКА ВНИЗ — На один абзац вниз.

Удаление слова

  • CTRL+BACKSPACE — Удаление одного слова слева от курсора;

  • CTRL+DEL — Удаление одного слова справа от курсора.

Начертание текста

  • CTRL+B — Добавление полужирного начертания;

  • CTRL+I — Добавление курсивного начертания;

  • CTRL+U — Добавление подчеркивания;

  • CTRL+[ — Уменьшение размера шрифта на 1 пункт;

  • CTRL+] — Увеличение размера шрифта на один пункт;

  • CTRL+SHIFT+> — Увеличение размера шрифта;

  • CTRL+SHIFT+< — Уменьшение размера шрифта.

Прописные буквы

  • SHIFT+F3 — Изменение регистра букв.

Прочее полезное

  • F4 – повтор последнего действия;

  • Alt + двойной клик в любом поле таблицы – выделить таблицу.

Заключение

Какими бы банальными не казались описанные выше операции, это — 90% косяков и ошибок в документах, связанных с оформлением, которые действительно трудно контролировать с ростом объема без четких правил командной работы. Все понимают причины таких ошибок, но не всегда знают, как с ними бороться.

Кто-то просто способен договориться внутри команды о подобных вещах и поделиться опытом, у кого-то подобные правила входят в СМК (Система менеджмента качества), у кого-то описано на уровне СТП (Стандарт предприятия).

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

Создание форм и шаблонов

Основные понятия

Шаблон — это файл, содержащий настройки
Word. Любой документ Word создается на основе некоторого шаблона.
Большинство создается на основе шаблона Normal.dot, который загружается
автоматически, например, при нажатии кнопки «Создать» на стандартной
панели инструментов. При открытии документа, основанного на некотором
шаблоне, последний загружается автоматически.

Форма — это защищенный документ, содержащий
поля для ввода информации и применяемый для заполнения бланков, таблиц и
других типовых документов.

Шаблоны и формы служат для автоматизации разработки типовых
документов и для организации работы с ними неквалифицированных
пользователей ЭВМ.

В редакторе Word имеется набор шаблонов для часто используемых документов. Как правило, эти шаблоны хранятся в папке MSOfficeШаблоны. Однако, пользователь может создавать и свои собственные шаблоны.

В шаблоне может храниться следующая информация:

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

Стиль — это набор форматирующих команд,
сохраняемых под своим именем для многократного использования. Стиль
определяет внешний вид документа. Шаблон Normal.dot содержит несколько
стилей, в том числе стиль «Обычный», используемый при создании
большинства документов.

Создание форм

Формой может быть любой документ, содержащий поля. Существует три типа полей:
для ввода текста; флажок;
раскрывающийся список. Порядок вставки полей достаточно прост: установите курсор в позицию для ввода поля формы, обратитесь к меню Вид/Панели инструментов/Формы. На панели «Формы»
выберите один из трех типов полей. Поскольку формы очень часто
создаются для быстрой разработки типовых документов, на панели «Формы»
имеются инструменты для вставки и редактирования таблиц и для защиты
формы.

Построение формы проходит в 3 этапа:

  • создание текстовой основы (структуры) формы;
  • вставка и настройка полей формы;
  • защита и сохранение формы.

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

О вставке полей формы говорилось выше, поэтому остановимся на их настройке.

Для настройки поля следует на панели «Формы» выбрать «Параметры поля формы». В зависимости о того какое поле выделено, откроется одно из трех окон для настройки.

Окно «Параметры текстового поля» содержит следующие основные поля:

  • «Тип» — позволяет выбрать тип поля формы. Если, например, выбрать
    числовой тип, то при вводе текста в него будет выдано сообщение об
    ошибке;
  • «Текст по умолчанию» — задает текст, который будет появляться в поле перед его заполнением;
  • «Максимальная длина» — максимальное количество символов, которое разрешается вводить в поле;
  • «Формат текста» — позволяет выбрать различные форматы текста для более жесткого контроля за вводом.

Окно «Параметры флажка» позволяет настроить размер флажка и его состояние по умолчанию: «Снят» или «Установлен». Флажок может быть связан с макросом, текстом справки и т.д.

Окно «Параметры поля со списком» позволяет
задать раскрывающийся список, содержащий до 25 значений, из которых
пользователь может выбирать нужное значение при заполнении поля формы.
Имеется возможность добавления, удаления и изменения порядка следования
значений.

Во всех окнах для настройки параметров полей имеется кнопка «Текст
справки», с помощью которой можно подготовить справку по каждому из
полей (в печатных документах этой цели служат подстрочные надписи). В
окне «Текст справки для поля формы» имеются две вкладки: «Строка
состояния» и «Клавиша F1». Текст справки, введенный на первой вкладке
будет автоматически выводиться в строке состояния при активизации
соответствующего поля. Справка, введенная на второй вкладке, выводится в
отдельном окне при нажатии клавиши F1.

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

Первый способ:

  • выбрать меню Сервис/Установить защиту… ;
  • в окне «Защита документа» установить метку «Запретить любые изменения, кроме ввода данных в поля форм» и нажать
    «Ok»;
  • при необходимости ввести текст пароля для открытия документа.

Второй способ заключается в выборе инструмента «Защита формы» на панели «Формы».

Для редактирования структуры формы защиту следует снять повторным нажатием на инструмент «Защита формы».

Создание шаблона

  1. Выполните Файл/Создать…. В окне «Создание документа» установите метку «Шаблон», найдите и выделите шаблон «Обычный», на основе которого будет создан свой шаблон. Нажмите «Ok».

  2. Установите требуемые параметры форматирования документа, введите
    тексты и другую информацию, которую следует сохранить в шаблоне.

  3. Выберите меню Файл/Сохранить как… и папку, в которой нужно сохранить шаблон. В поле «Имя файла» введите имя шаблона и нажмите «Ok». Расширение .dot будет добавлено к имени шаблона автоматически.

Загрузка шаблона

Существует два способа загрузки шаблона:

  • при открытии документа, основанного на некотором шаблоне, последний загружается автоматически;
  • при создании нового документа выберите меню Файл/Создать…
    . В окне «Создание документа» установите
    переключатель «Документ», найдите и выделите нужный шаблон и нажмите
    Ok.


Контрольные вопросы

  1. Что такое шаблон?
  2. На основе какого шаблона создается большинство документов?
  3. Что называется формой?
  4. Для чего служат шаблоны и формы?
  5. Какая информация может храниться в шаблоне?
  6. Что называется стилем?
  7. Какие документы могут служить в качестве формы?
  8. Какие типы полей может содержать документ?
  9. Как вставить поле?
  10. Через сколько этапов проходит построение формы?
  11. Как выполняется создание текстовой основы формы?
  12. Каковы возможности настройки формы?
  13. Как защитить форму?
  14. Как создается шаблон?
  15. Как загрузить шаблон?

Версию Microsoft Visual C# для .NET этой статьи см. в разделе 316384.
 

Сведения о версии этой статьи Microsoft Visual Basic 6.0 см. в разделе 313193.
 

Аннотация

В этой пошаговой статье описывается создание нового документа в Word с помощью службы автоматизации из Visual Basic .NET.

Пример кода

В примере кода в этой статье показано, как сделать следующее:

  • Вставка абзацев с текстом и форматированием.

  • Просмотр и изменение различных диапазонов в документе.

  • Вставка таблиц, форматирование таблиц и заполнение таблиц данными.

  • Добавление диаграммы.

Чтобы создать документ Word с помощью службы автоматизации из Visual Basic .NET, выполните следующие действия.

  1. Запустите Microsoft Visual Studio .NET. В меню Файл выберите пункт Создать, а затем — Проект. В разделе Типы проектов выберите Проекты Visual Basic, а затем — Приложение Windows в разделе Шаблоны. Форма Form1 создается по умолчанию.

  2. Добавьте ссылку на библиотеку объектов Microsoft Word. Для этого выполните следующие действия:

    1. В меню Проект щелкните Добавить ссылку.

    2. На вкладке COM найдите библиотеку объектов Microsoft Word и нажмите кнопку Выбрать.

      Обратите внимание, что Microsoft Office 2003 и более поздние версии Office включают основные сборки взаимодействия (PIA). Microsoft Office XP не включает piA, но их можно скачать.

    3. Нажмите кнопку ОК в диалоговом окне Добавление ссылок, чтобы принять выбранные значения. Если появится запрос на создание оболочек для выбранных библиотек, нажмите кнопку Да.

  3. В меню Вид выберите Панель элементов, чтобы отобразить панель элементов, а затем добавьте кнопку в Form1.

  4. Дважды щелкните Button1. Откроется окно кода для формы.

  5. В окне кода замените приведенный ниже код.

        Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click
    
        End Sub

    С:

        Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim oWord As Word.Application
            Dim oDoc As Word.Document
            Dim oTable As Word.Table
            Dim oPara1 As Word.Paragraph, oPara2 As Word.Paragraph
            Dim oPara3 As Word.Paragraph, oPara4 As Word.Paragraph
            Dim oRng As Word.Range
            Dim oShape As Word.InlineShape
            Dim oChart As Object
            Dim Pos As Double
    
            'Start Word and open the document template.
            oWord = CreateObject("Word.Application")
            oWord.Visible = True
            oDoc = oWord.Documents.Add
    
            'Insert a paragraph at the beginning of the document.
            oPara1 = oDoc.Content.Paragraphs.Add
            oPara1.Range.Text = "Heading 1"
            oPara1.Range.Font.Bold = True
            oPara1.Format.SpaceAfter = 24    '24 pt spacing after paragraph.
            oPara1.Range.InsertParagraphAfter()
    
            'Insert a paragraph at the end of the document.
            '** endofdoc is a predefined bookmark.
            oPara2 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("endofdoc").Range)
            oPara2.Range.Text = "Heading 2"
            oPara2.Format.SpaceAfter = 6
            oPara2.Range.InsertParagraphAfter()
    
            'Insert another paragraph.
            oPara3 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("endofdoc").Range)
            oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:"
            oPara3.Range.Font.Bold = False
            oPara3.Format.SpaceAfter = 24
            oPara3.Range.InsertParagraphAfter()
    
            'Insert a 3 x 5 table, fill it with data, and make the first row
            'bold and italic.
            Dim r As Integer, c As Integer
            oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("endofdoc").Range, 3, 5)
            oTable.Range.ParagraphFormat.SpaceAfter = 6
            For r = 1 To 3
                For c = 1 To 5
                    oTable.Cell(r, c).Range.Text = "r" & r & "c" & c
                Next
            Next
            oTable.Rows.Item(1).Range.Font.Bold = True
            oTable.Rows.Item(1).Range.Font.Italic = True
    
            'Add some text after the table.
            'oTable.Range.InsertParagraphAfter()
            oPara4 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("endofdoc").Range)
            oPara4.Range.InsertParagraphBefore()
            oPara4.Range.Text = "And here's another table:"
            oPara4.Format.SpaceAfter = 24
            oPara4.Range.InsertParagraphAfter()
    
            'Insert a 5 x 2 table, fill it with data, and change the column widths.
            oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("endofdoc").Range, 5, 2)
            oTable.Range.ParagraphFormat.SpaceAfter = 6
            For r = 1 To 5
                For c = 1 To 2
                    oTable.Cell(r, c).Range.Text = "r" & r & "c" & c
                Next
            Next
            oTable.Columns.Item(1).Width = oWord.InchesToPoints(2)   'Change width of columns 1 & 2
            oTable.Columns.Item(2).Width = oWord.InchesToPoints(3)
    
            'Keep inserting text. When you get to 7 inches from top of the
            'document, insert a hard page break.
            Pos = oWord.InchesToPoints(7)
            oDoc.Bookmarks.Item("endofdoc").Range.InsertParagraphAfter()
            Do
                oRng = oDoc.Bookmarks.Item("endofdoc").Range
                oRng.ParagraphFormat.SpaceAfter = 6
                oRng.InsertAfter("A line of text")
                oRng.InsertParagraphAfter()
            Loop While Pos >= oRng.Information(Word.WdInformation.wdVerticalPositionRelativeToPage)
            oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
            oRng.InsertBreak(Word.WdBreakType.wdPageBreak)
            oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
            oRng.InsertAfter("We're now on page 2. Here's my chart:")
            oRng.InsertParagraphAfter()
    
            'Insert a chart and change the chart.
            oShape = oDoc.Bookmarks.Item("endofdoc").Range.InlineShapes.AddOLEObject( _
                ClassType:="MSGraph.Chart.8", FileName _
                :="", LinkToFile:=False, DisplayAsIcon:=False)
            oChart = oShape.OLEFormat.Object
            oChart.charttype = 4 'xlLine = 4
            oChart.Application.Update()
            oChart.Application.Quit()
            'If desired, you can proceed from here using the Microsoft Graph 
            'Object model on the oChart object to make additional changes to the
            'chart.
            oShape.Width = oWord.InchesToPoints(6.25)
            oShape.Height = oWord.InchesToPoints(3.57)
    
            'Add text after the chart.
            oRng = oDoc.Bookmarks.Item("endofdoc").Range
            oRng.InsertParagraphAfter()
            oRng.InsertAfter("THE END.")
    
            'All done. Close this form.
            Me.Close()
    
        End Sub

  6. Добавьте следующий код в начало Form1.vb:

    Imports Word = Microsoft.Office.Interop.Word

  7. Нажмите клавишу F5, чтобы выполнить сборку и запуск программы.

После завершения кода изучите документ, созданный для вас. Документ содержит две страницы отформатированных абзацев, таблиц и диаграммы.

Использование шаблона

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

  • Вы можете иметь больший контроль над форматированием и размещением объектов в документах.

  • Вы можете создавать документы с меньшим количеством кода.

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

oWord.Documents.Add "<Path to your template>MyTemplate.dot"

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

oDoc.Bookmarks.Item("MyBookmark").Range.Text = "Some Text Here"

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

oDoc.Bookmarks.Item("MyBookmark").Range.Style = "MyStyle"

-или-

oWord.Selection.Style = "MyStyle"

Ссылки

Чтобы получить дополнительные сведения об использовании Visual Basic .NET для автоматизации Microsoft Word, щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

301656 Автоматизация Word для выполнения слияния из Visual Basic .NET

Нужна дополнительная помощь?

матически. Правильность ввода формулы можно проверить перетаскиванием формулы целиком мышью (инструмент Lasso Tool) при нажатой клавише Ctrl, при этом не должно оставаться отдельных объектов, т.е. формула должна быть цельной. Для удаления части объекта, или целого объекта, при включённом инструменте Lasso Tool, выберите объект (выделите мышью или обведите вокруг при нажатой левой кнопке мыши), нажмите клавишу Delete.

Для ввода знака плюс в уравнении, используйте соответствующий инструмент. Для ввода текста (цифры) используйте инструмент Text Tool. Для рисования стрелки реакции используйте инструмент Arrow Tool – включите инструмент, нажмите в поле редактирования левой кнопкой мыши, и, не отпуская, перемещайте курсор вправо, по мере движения стрелка будет увеличиваться. С помощью инструмента Atom Tool поместите условие реакции (среда ZnCl2) под стрелку.

Введите формулу последнего соединения. Выровняйте все формулы. Выделите все объекты реакции, нажав Ctrl+A (или команда Edit/Select All), поместите выделенный блок в буфер обмена клавишами Ctrl+C (Edit/Copy). Сохраните формулу для возможности дальнейшего редактирования командой File/Save As, укажите расположение F:, имя Флуоресцеин, тип sketch file (*.skc). Сохраните выделенный блок в файл также в виде изображения командой File/Save As Image, укажите расположение

F:, тип файла Portable Network Graphics (*.png), имя файла Флуоресцеин.

Перейдите в текстовый редактор, вставьте уравнение реакции из буфера обмена в документ (Ctrl+V). В случае некорректной вставки OLEобъекта из буфера обмена отмените вставку и вставьте сохранённый ранее файл Флуоресцеин.png как изображение.

9.5.1. Вставка надписей

Для вставки пояснений, правил, изображений, используются надпи-

си. Командой Word Вставка/Надпись/Нарисовать надпись, нарисуйте небольшой прямоугольник в верхней части страницы, прилепленный к правому отступу. При этом появляется дополнительный раздел Ленты Работы с надписями/ Формат. Установите Положение снизу справа с

176

обтеканием текста вокруг рамки. Выберите для надписи любой очень светлый цвет заливки командой Заливка фигуры. Введите в надпись следующий текст: Бром (Br, №35) – химически активный неметалл, относится к группе галогенов. Измените размер надписи, чтобы она плотно охватывала текст. По умолчанию у надписи присутствует рамка.

9.5.2. Нумерация страниц

Пронумеруйте страницы командой Вставка/Номер страницы/Внизу страницы/По центру (Простой номер 2). Номера страниц являются свойством раздела. Номера размещаются в колонтитулах – областях вверху и внизу страницы. Содержимое колонтитула, введенное единожды, остаётся постоянным для всего раздела, в документе различные надписи в колонтитулах можно разместить, добавив новый раздел командой Разметка страницы/Разрывы. Если в колонтитуле находится вычисляемое поле, его значение меняется. В случае, когда не нужно отображать номер на первой странице, необходимо зайти в колонтитул первой страницы, в котором находится номер, на вкладке

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

удалить номера страниц в колонтитуле нужного раздела.

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

После поля номера страницы можно добавить текст « из » (с пробелами вокруг «из») и поле (команда Вставка/Экспресс-блоки/Поле) NumPages категории О документе, в результате чего формат номера страницы будет иметь вид «1 из 100», где второе число – общее количество страниц документа.

177

9.5.3. Использование сноски

Сноски используются для пояснения терминов в тексте. Установите курсор после слов «Д.К. Максвелл» на первой странице задания, выберите команду Ссылки/Вставить сноску, и введите текст «Джеймс Клерк (Кларк) Максвелл (англ. James Clerk Maxwell; 13 июня 1831, Эдинбург – 5 ноября 1879, Кембридж) – британский физик и математик.». Как вы заметили, текст из Википедии содержит буквы с ударением. Для набора такой буквы используйте следующий прием: нажмите Ctrl+Э, затем букву «a» в английской раскладке. Таким образом, можно вставлять только буквы, похожие по написанию на русские в латинском алфавите. Недостатком является то, что наличие таких символов является причиной пометки слов службой правописания.

9.5.4.Вставка ссылок на литературные источники

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

документом, содержащим множество источников. На вкладке Ссылки, выберите Стиль ссылки на литературу ISO 690 – цифровая ссылка82.

Командой Ссылки/Вставить ссылку/Добавить новый источник добавьте соответственно три источника:

1.Т.И. Трофимова. Курс физики: Учеб. пособие для вузов.—2-е изд., перераб. и доп.— М.: Высш. шк., 1990. 478 с.

2.Википедия – свободная энциклопедия. http://ru.wikipedia.org

3.Ю.Ю.Лурье. Справочник по аналитической химии. М.: Издательство

«Химия», 1971. 456 с.

81Оформление списка литературы http://narfu.ru/agtu/www.agtu.ru/fad08f5ab5ca9486942a52596ba6582elit.html

Как составить список литературы http://www.unkomi.ru/serv/virtbibibl/konsult/literat/

82В оригинальном стиле редактора настройки не соответствуют ГОСТ, поэтому согласно рекомендациям из форумов была произведена правка файла ISO690Nmerical.XSL. Скопировать себе готовый файл можно с сервера ВЦ из папки офисных приложений или найти его на диске C:.

178

Затем удалите обозначения ссылок на литературу в тексте задания и вставьте соответствующие ссылки командой Ссылки/Вставить ссылку.

Переместите курсор в конец документа. Введите текст «Список литературы» (без кавычек), выровняйте текст по центру. В следующей строке выполните команду Ссылки/Список литературы/Вставить список литературы.

9.5.5. Нумерация объектов

Научно-технический документ довольно часто содержит нумерованные объекты и ссылки на них. Если ссылки и нумерацию набирать вручную, то приходится лично следить за правильностью нумерации при перемещении блоков текста. Редактор Word позволяет автоматизировать этот процесс и сам следит за нумерацией объектов и ссылками на них. Первый лист задания содержит нумерацию математических формул и ссылку на последнюю из них. Замените обычный текст автоматической нумерацией. Для этого используйте поля (не путать с полями страницы). Поля – функциональные блоки, которые могут обеспечить автоматическое обновление данных, таких как время, заголовок, число страниц и т. д.

Удалите текст номера справа первой формулы. Вставьте номер командой Ссылки/ Вставить название. В окне укажите подпись –

Формула, установите параметр Исключить подпись из названия, нажмите кнопку Нумерация…, установите параметр Включить номер главы,

начиная со стиля Заголовок 1, разделитель – точка. Нажмите OK, OK. Скопируйте номер формулы, содержащий поля к остальным

формулам, заменив номера обычного текста. Перенумерация полей происходит при обновлении. Обновление можно включить в параметрах для события открытия документа, или сделать это вручную. Одно поле можно обновить командой контекстного меню Обновить поле. Для обновления всех полей документа, например, после перемещения нумерованных объектов, достаточно выделить весь документ (Ctrl+A) и обновить все поля в выделенном блоке клавишей F9, затем нажать мышью в тексте или переместить курсор стрелками для снятия выделения, все значения полей будут обновлены. Если вставка номера вызывает смену форматирования, выбелите строку и примените повторно стиль Формула.

179

Поместите курсор в поле ссылки на формулу (последний абзац первой страницы), удалите текст ссылки, вставьте автоматическую ссылку командой Ссылки/Перекрёстная ссылка, тип ссылки: Формула,

вставить ссылку на: Постоянная часть и номер. Выберите номер 1.3 и нажмите OK.

Для создания своего типа нумерации объектов, можно использовать поля, вставляемые командой Вставка/ Экспресс-блоки/ Поле. Для ссылки на текущий раздел, нужно выбрать поле StyleRef, имя стиля Заголовок 1, выбрать параметр вставить полный номер абзаца. Нажать OK, ввести точку, вставить поле SEQ, в качестве параметра придумать идентификатор, например MEq, который будет обозначать математические формулы (Math Equation), нажать OK. Разные типы объектов должны иметь разные параметры, одни типы – одинаковые. Так, разные параметры должны быть у таблиц, формул, рисунков…

Посмотрите код поля StyleRef, созданного выше, должно быть «{STYLEREF «Заголовок 1» w}». Для заголовков есть сокращённая форма записи вставки номера текущей главы, как это было сгенерировано при вставке первого номера формулы: «{STYLEREF 1 s}», где цифра указывает уровень заголовка, а способ с указанием имени стиля чаще используется для стилей, отличных от заголовков. Если в стиле нумерации заголовка присутствует текст, например: «Глава», «Лабораторная работа» и т.п., то для подавления вывода текста необходимо установить параметр показывать только цифры и разделители (в текст поля добавляется параметр «t»).

Как вы должны были заметить, существуют готовые шаблоны для нумерации рисунков, формул и таблиц. При создании документа нужно вставить номер (возможно, с подписью) у объекта, а затем в документе вставить перекрёстную ссылку на этот абзац. При вставке перекрёстной ссылки на рисунок возникает проблема из-за того, что редактор может минимально вставить «Рисунок N» (где N – номер), когда может требоваться другая запись (рисунка, рисунке, Рис. и т.д.). Текст, конечно можно редактировать, но после обновления полей он восстановится. Выходом из этой ситуации может быть написание нужной формы слова, вставка перекрёстной ссылки с номером рисунка с последующим выделением части поля «Рисунок » и скрытием (Ctrl+Shift+H или

180

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Средства для собак excel
  • Средства автоматизации в программе excel
  • Средства для работы с таблицами word построить таблицу типа объект
  • Средства word для набора текста
  • Средства для кошек excel