Примеры автоматизации в 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 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

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

Инфоурок


Информатика

ПрезентацииПрезентация на тему «Автоматизация в Word»



Скачать материал

Презентация на тему автоматизация в Word



Скачать материал

  • Сейчас обучается 615 человек из 76 регионов

  • Сейчас обучается 84 человека из 34 регионов

  • Сейчас обучается 22 человека из 15 регионов

Описание презентации по отдельным слайдам:

  • Презентация на тему автоматизация в Word

    1 слайд

    Презентация на тему автоматизация в Word

  • Автоматизация работы с формой	Форму можно автоматизировать путем сохранения м...

    2 слайд

    Автоматизация работы с формой
    Форму можно автоматизировать путем сохранения макросов в шаблоне формы. Макросы могут выполняться автоматически при входе или выходе курсора из поля формы. Например, при установке пользователем флажка Состоит в браке макрос, выполняемый при выходе, может активизировать связанные поля, такие как Имя супруга.

  • Откройте шаблон, содержащий форму, которую требуется изменить. 
Снимите защит...

    3 слайд

    Откройте шаблон, содержащий форму, которую требуется изменить.
    Снимите защиту с шаблона формы, нажав кнопку Защита формы на панели инструментов Формы.
    Создайте нужные макросы и сохраните их в шаблоне формы. Если нужные макросы содержатся в другом шаблоне, скопируйте их в нужный шаблон формы. Безопасность.  При добавлении макроса в форму будьте внимательны — они могут представлять угрозу безопасности. Рекомендуется пользоваться макросами только из надежных источников.
    Дважды щелкните поле формы, которому требуется назначить макрос. Для запуска макроса при входе в поле формы выберите его в поле Выполнить макрос при входе. Для запуска макроса при выходе из поля формы выберите его в поле Выполнить макрос при выходе.

  • Примечание	Если макросы, выполняемые при входе и выходе, хранятся в шаблоне N...

    4 слайд

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

  • АвтозаменаДля автоматического обнаружения и исправления
опечаток, орфографиче...

    5 слайд

    Автозамена
    Для автоматического обнаружения и исправления
    опечаток, орфографических ошибок и неправильного
    Использования прописных и строчных букв можно
    использовать средство «Автозамена».

  • Использование автозамены	В окне Автозамена надо установить флажок Заменять пр...

    6 слайд

    Использование автозамены
    В окне Автозамена надо установить флажок Заменять при вводе, в поле Заменить ввести назначаемое сочетание символов (имя элемента автозамены), а в поле на: – полный текст заменяемого фрагмента.
    При наборе текста вводят имя элемента, а затем пробел или знак препинания (т.е. символ, который должен следовать далее). При этом имя элемента автоматически заменяется его значением.
    Замечание. В окне Автозамена желательно установить и все остальные флажки, – это избавит от необходимости вручную исправлять последствия случайного нажатия клавиш изменения регистра.

  • Добавление элементов автозамены при проверки орфографииЩелкните правой кнопк...

    7 слайд

    Добавление элементов автозамены при проверки орфографии

    Щелкните правой кнопкой мыши слово, подчеркнутое волнистой красной линией.
    Выделите пункт Автозаменав контекстном меню и выберите вариант замены. Если Microsoft Word не находит вариантов исправления, пункт «Автозамена» в контекстном меню не появится.
    Примечание.  Если слова с ошибками и опечатками не выделяются в тексте, выберите в меню Сервис команду Параметры и откройте вкладку Правописание. Установите флажок автоматически проверять орфографию.
    Если при вводе текста происходят ненужные автоматические замены, то их можно отменить нажатием клавиш CTRL+Z. Для автоматического добавления исключений в список автозамены установите флажок Автоматически добавлять слова в список в диалоговом окне Исключения при автозамене. 

  • Автотекст	Окно Автотекст можно использовать и для другого способа назначения...

    8 слайд

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

  • Создание автотекстаУстановите курсор в то место, куда требуется вставить элем...

    9 слайд

    Создание автотекста
    Установите курсор в то место, куда требуется вставить элемент списка автотекста.
    В меню Вставка выделите пункт Автотекст, а затем выделите категорию, к которой принадлежит нужный элемент.
    Выберите имя нужного элемента списка автотекста.

    В поле Имя элемента нужно ввести произвольное имя,
    предназначенное для вызова элемента. Затем следует
    щелкнуть на кнопке Добавить и закрыть окно кнопкой Ok.
    Для вызова элемента автотекста, назначенного этим
    Способом, нужно набрать имя элемента и нажать
    клавишу F3. Появится полный текст назначенного
    Элемента автотекста.

  • Автоформат 	
	Автоформат может форматировать документ без участия пользовател...

    10 слайд

    Автоформат

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

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

  • Автоформатирование в процессе ввода текстаАвтоформатирование в процессе ввода...

    11 слайд

    Автоформатирование в процессе ввода текста
    Автоформатирование в процессе ввода одно из
    наиболее удачных средств, облегчающих
    создание документа.
    Для установки автоформата в процессе ввода
    текста необходимо выполнить следующие
    действия:
    Выбрать команду Сервис –> Автозамена.
    Перейти на вкладку Автоформат при вводе (рис. 4.31).
    Установить флажки соответственно с требованиями к автоформатированию.
    Нажать ОК.

Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:

6 212 070 материалов в базе

  • Выберите категорию:

  • Выберите учебник и тему

  • Выберите класс:

  • Тип материала:

    • Все материалы

    • Статьи

    • Научные работы

    • Видеоуроки

    • Презентации

    • Конспекты

    • Тесты

    • Рабочие программы

    • Другие методич. материалы

Найти материалы

Другие материалы

  • 15.01.2020
  • 409
  • 0

«Информатика», Босова Л.Л., Босова А.Ю.

  • 15.01.2020
  • 151
  • 0
  • 15.01.2020
  • 410
  • 7
  • 15.01.2020
  • 445
  • 21
  • 15.01.2020
  • 4850
  • 267
  • 15.01.2020
  • 196
  • 0

«Информатика», Босова Л.Л., Босова А.Ю.

«Информатика», Семакин И.Г., Залогова Л.А., Русаков С.В., Шестакова Л.В.

Вам будут интересны эти курсы:

  • Курс повышения квалификации «Информационные технологии в деятельности учителя физики»

  • Курс повышения квалификации «Внедрение системы компьютерной математики в процесс обучения математике в старших классах в рамках реализации ФГОС»

  • Курс повышения квалификации «Организация работы по формированию медиаграмотности и повышению уровня информационных компетенций всех участников образовательного процесса»

  • Курс повышения квалификации «Развитие информационно-коммуникационных компетенций учителя в процессе внедрения ФГОС: работа в Московской электронной школе»

  • Курс профессиональной переподготовки «Информационные технологии в профессиональной деятельности: теория и методика преподавания в образовательной организации»

  • Курс повышения квалификации «Использование компьютерных технологий в процессе обучения в условиях реализации ФГОС»

  • Курс повышения квалификации «Введение в программирование на языке С (СИ)»

  • Курс профессиональной переподготовки «Управление в сфере информационных технологий в образовательной организации»

  • Курс повышения квалификации «Современные тенденции цифровизации образования»

  • Курс повышения квалификации «Специфика преподавания дисциплины «Информационные технологии» в условиях реализации ФГОС СПО по ТОП-50»

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

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

    Удалить материал

  • Федосеенко Наталья Александровна

    • На сайте: 6 лет и 3 месяца
    • Подписчики: 0
    • Всего просмотров: 60121
    • Всего материалов:

      64

  • Файлы

Файлы

Рабочий лист подходит для учеников 7 класса, работающих по учебнику «Информатика. ФГОС», автор Л….

Цель процесса автоматического создания документов

Автоматическое создание документа — базовая единица оптимизации ресурсных затрат Вашей организации. Деятельность любой компании неразрывно связана с документооборотом, будь то управление персоналом — кадровая служба (заявления на отпуск, увольнение, больничный), бухгалтерия, либо же просто формирование определенного пакета документов по той или иной активности компании. Зачастую, сам процесс подготовки документов сводится к монотонным действиям по расстановке конкретных значений по заранее отведенным позициям в шаблоне. Слабыми сторонами данного подхода являются: низкая скорость подготовки документации и высокая степень возникновения ошибки ввиду человеческого фактора. При росте объема документации вероятность ошибки только возрастает, например, Вам нужно подготовить доп соглашения для всего штата сотрудников. Основные задачи программы автоматического создания документов Word на основе шаблонов — свести к минимуму вероятность возникновения ошибок ввода, значительно увеличить скорости самого процесса. Все действия сводятся к выбору записи или записей данных о сотруднике/клиенте/заказе/поставщике из исходной таблицы и указанию шаблона подготавливаемого документа.

Ссылки для скачивания:

— Скачать макрос автоматического создания документов Word по шаблону (архив 208КБ)

Автоматическое создание документа

Как начать работу с автоматическим формированием документов Word:

1. Разархивируйте скачанный архив с файлом с помощью программы 7zip или WinRar.

2. При появлении сообщения о доверенном источнике: закройте программу, кликните правой кнопкой мыши на файле — «Свойства», далее установите галочку напротив «Разблокировать».
сообщение безопасности платежного календаряразблокировать платежный календарь

3. Если в Вашем Excel запуск макросов по умолчанию отключен, в данном окне необходимо нажать «Включить содержимое».включить содержимое

4. Для полноценной работы с файлом необходимо нажать «Разрешить редактирование» при появлении данного сообщения.разрешить редактирование

Автоматическое создание документа — этап 1. Настройка программы

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

Таблица исходных данных состоит из строки меток (условных обозначений каждого столбца) — строка №3, заголовка с названиями столбцов — строка №4 и построчных записей — начиная с 5й строки. Количество колонок, их названия и условные обозначения можно свободно редактировать, соблюдая простые правила:

  • Если Вы добавляете новую колонку, у нее должно быть название и условное обозначение.
  • Для склонения ФИО сотрудника в Родительный или Дательный падежи используйте встроенные функции =RODP() и =DATP() соответственно.
  • Не допускайте наличия пустых колонок (без названий и обозначений) между колонками данных.
  • Не удаляйте колонку «ФИО сотрудника», т.к. она является ключевой для работы программы. Вы можете ее переименовать — заказчик, ответственный, клиент, менеджер и т.д. на свое усмотрение. Она используется в процессе сохранения итогового word документа, как часть имени, например: Иванов А.В. Заявление на отпуск, Петров В.К. Накладная на отгрузку.

Автоматическое создание документа по шаблону

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

Панель кнопочного управления автоматизированного создания документов состоит из следующих элементов интерфейса:

  • Добавить запись — вставляет новую строку в заранее выбранную вами ячейку. Также можно добавлять записи вручную с помощью стандартной вставки строки excel;
  • Добавить группу — вставляет новую серую строку группы в заранее выбранную вами ячейку;
  • Удалить элемент — удаляет любую выбранную строку таблицы данных;
  • Очистить таблицу — полностью стирает данные из таблицы. Можно использовать для очистки листа от тестовых данных;
  • Создать документ — выбор шаблона word для построения документа. Перед этим в таблицы должны быть выбраны записи данных, по которым необходимо произвести построение.

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

Автоматическое создание документа — этап 2. Шаблоны Word

автоматизированный шаблон Word

Процесс подготовки word шаблонов для автоматического построения документов включает в себя рад несложных действий. Создайте общую папку для всех шаблонов, в ней создайте папки категорий, чтобы разделить шаблоны по областям применения (названия категорий укажите на свое усмотрение). В каждой подпапке определенной категории расположите непосредственно документы word с расставленными метками. Метки расположены в 3й строке таблицы над каждый ее столбцом. Поставьте метки в те места шаблона, в которые вы хотите прокачать данные из определенного столбца. Например, там где должно быть фио сотрудника укажите [fio].

Порядок действий запуска автоматического создания документов

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

В первую очередь, выделите строку или диапазон данных таблицы, по которым хотите сформировать документы:

Автоматическое создание документа Word

Шаг номер два — нажмите кнопку «Создать документ». Перед Вами появится диалоговое окно, в котором нужно выбрать подпапку — категорию документа и один, либо несколько шаблонов построения. Далее кликните по кнопке «Сформировать документы».

окно выбора шаблон Word

Мои поздравления! Документы успешно сформированы и лежат по указанному Вами пути для сохранения!

Заказать разработку программ или доработку любого проекта

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

Всегда рад ответить на Ваши вопросы, готов подготовить оптимальные решения обработки данных для Вашего бизнеса, автоматизировать рутинные процессы, связаться со мной можно через WatsApp 89507094770, сайт excellab.ru или написать на почту: goryaninov@bk.ru, профиль вк:

Ссылки для скачивания:

— Скачать макрос автоматического создания документов Word по шаблону (архив 208КБ)

Здесь можно ознакомиться с другими программами автоматизации, которые представлены на моем сайте:

— Дневной табель учета рабочего времени в excel
— Почасовой табель учета рабочего времени в excel
— Табель учета рабочего времени в днях по форме Т-13
— Табель расчет и планирование вахты
— Табель учета рабочего времени с учетом ночных смен
— Платежный календарь в excel

Angry word helper

Возможно, у вас есть ощущение, что тема макросов в Ворде достаточно маргинальная. Кто ими может пользоваться-то вообще? Ну, малварь делают иногда… Да и пишутся они на давно забытом VBA (Visual Basic for Applications, он же несколько урезанный Visual Basic 6 в интерпретируемом виде), фу!

Но на самом деле у многих ведь возникает потребность то какой-нибудь отчётик в ворде написать, то курсовую оформить, то резюме перед отправкой в компанию вашей мечты подправить… А у некоторых работа напрямую связана с Word. Часто различные системы документации предлагают экспорт в форматы doc или docx, которые нужны вашим заказчикам. И бывает, что документы после экспорта выглядят фигово, приходится их исправлять.

Работа в ворде нередко подразумевает выполнение каких-то однообразных повторяющихся действий, которые иногда (но далеко не всегда!) решаются грамотной настройкой стилей и их применением, а также использованием шаблонов. Как же автоматизировать всё остальное? Тут-то нам на помощь приходят те самые макросы.

Что же в них такого хорошего? Ну, например, они автоматически и достаточно быстро выполняют за вас однообразные действия. Могут что-то подсчитать, переформатировать документ, пометить аннотациями подозрительные места, — словом, всё, что запрограммируете. Могут даже в режиме реального времени что-то исправлять и о чем-то предупреждать, пока вы пишете документ. VBA в Word позволяет автоматизировать практически все действия, которые вы можете выполнить с документом вручную.

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

Макросы работают в любой версии Word и требуют минимум правок при переносе с одной версии на другую (а чаще всего вообще не требуют). На макросах можно даже реализовать полноценный пользовательский интерфейс с формами!

Давайте же занырнём в Visual Basic и напишем что-нибудь полезное! В качестве первого примера я покажу, как сделать макрос, который заменит два и более последовательных перевода строки на единственный. Это часто требуется при исправлении документов после экспорта из систем документации, или если вы хотите удалить случайно проставленные лишние переводы строк в собственноручно написанном документе. Макрос сделаем добротный, с пользовательским интерфейсом и прогрессом выполнения операции.

Чтобы начать писать или использовать макросы, сначала требуется убедиться, что в Word’е отображается панель «Разработчик» («Developer»). Если она у вас не отображается, следует зайти после создания нового документа в меню «Файл» («File») -> «Параметры» («Options») -> «Настроить ленту» («Customize Ribbon»), после чего найти там и установить флажок «Разработчик» («Developer»).

Enable Word developer tab

После этого нужно зайти на вкладку «Разработчик» и выбрать меню «Visual Basic».

Word Visual Basic button

В открывшемся окне слева вы увидите два проекта: «Normal» и проект, относящийся к текущему открытому документу. Возможно, в проекте «Normal» у вас уже будет какой-то файл в каталоге «Modules». В любом случае, создайте новый модуль, кликнув правой кнопкой по проекту «Normal» и выбрав «Insert» -> «Module».

Word insert new module

Созданный модуль представляет из себя файл, куда мы и будем писать код макросов. Можно переименовать модуль (по умолчанию его имя будет «Module1») в окне «Properties» -> «Name». Я назову свой модуль «AllMacros». Теперь откроем код модуля, дважды кликнув по его имени, и приступим к созданию макроса. Напомню, что наша цель — заменить два и более последовательных перевода строки на единственный, произведя замены по всему документу. Очевидно, нам потребуется функция, которая осуществляет поиск по тексту, ведь мы хотим найти несколько последовательных переводов строки. В Word это эквивалентно началу нового параграфа. Вы могли бы осуществить поиск начала нового параграфа через обычное окно поиска, введя в поле поиска ^p, ^13 или ^013 (что соответствует ASCII-коду перевода строки). Функция поиска будет выглядеть так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Private Function FindNextText(text As String, useWildcards As Boolean)

    Selection.Find.ClearFormatting

    Selection.Find.Replacement.ClearFormatting

    With Selection.Find

        .Text = text

        .Forward = True

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchKashida = False

        .MatchDiacritics = False

        .MatchAlefHamza = False

        .MatchControl = False

        .MatchWildcards = useWildcards

        .MatchSoundsLike = False

        .MatchAllWordForms = False

        .Wrap = wdFindStop

    End With

    Selection.Find.Execute

    FindNextText = Selection.Find.Found

End Function

Давайте разберём, что тут происходит. Мы объявляем функцию с двумя параметрами. Первый имеет тип String — это текст для поиска, а второй Boolean говорит о том, нужно ли использовать символы подстановки (wildcards). Про них я поговорю позже. В следующих двух строках 2 и 3 мы очищаем форматирование для строки поиска и строки замены, если оно было задано пользователем. Word позволяет задать форматирование строки поиска/замены, а для нашей задачи это не требуется. Далее мы задаём набор параметров для объекта Selection.Find: выставляем неинтересные нам параметры в False, параметр Text — это текст, который мы хотим найти, а параметр MatchWildcards указывает на использование символов подстановки. Параметр Wrap говорит о том, следует ли продолжать поиск, когда мы дошли до той точки, с которой поиск начали, и у нас его значение установлено в wdFindStop, так как мы хотим остановиться, когда дойдём до конца документа, и не зацикливать поиск.

Вообще, всё это обилие свойств и объектов из объектной модели Word, Excel и PowerPoint (да, там тоже есть макросы) хорошо описано в MSDN. Например, вот тут перечислены свойства и методы объекта Find. Есть русская документация (скажем, эта страница), но она выполнена совершенно кринжовым машинным переводом, невозможно читать:

Есть совершенно смехотворные страницы:

В общем, лучше читайте на английском. :D

Кроме того, все доступные объекты, их свойства и методы можно посмотреть прямо в редакторе VBA в самом Word’е. Для этого нужно нажать F2 или выбрать меню «View» -> «Object browser», что приведет к открытию браузера объектов (Object browser), в котором можно пролистать или поискать то, что вам доступно.

Word object browser

Но вернёмся к нашей функции. На строке 19 мы непосредственно выполняем поиск заданного текста с указанными параметрами. Строка 20 — эта конструкция, аналогичная return в си-подобных языках, указывает возвращаемое значение функции. Мы возвращаем булевое значение Selection.Find.Found, которое говорит о том, было ли что-то найдено.

Хочу заметить, что использование объекта Selection.Find и изменение его свойств заменит их значения и для пользователя. Например, если вы в Word искали что-то хитроумное с конкретно заданными параметрами, то выполнение макроса заменит ваши параметры поиска на те, которые мы задали в макросе. В идеале, их можно запомнить, а потом вернуть, но мы не будем так сильно заморачиваться, а просто всё за собой подчистим. Сделаем функцию, которая сбрасывает параметры в значения по умолчанию:

Private Sub ClearFindAndReplaceParameters()

    With Selection.Find

       .ClearFormatting

       .Replacement.ClearFormatting

       .Text = «»

       .Replacement.Text = «»

       .Forward = True

       .Wrap = wdFindStop

       .Format = False

       .MatchCase = False

       .MatchWholeWord = False

       .MatchWildcards = False

       .MatchSoundsLike = False

       .MatchAllWordForms = False

    End With

End Sub

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

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

Word wildcards

Хорошее описание символов подстановки я нашел здесь, правда, на английском языке. Составим регулярное выражение для поиска двух и более последовательных переводов строки: [^013]{2,}. Это очень похоже на классическое регулярное выражение Perl или PCRE, но в квадратных скобках в уникальном стиле Word мы задаем символ перевода строки. Фигурные скобки указывают, что символов перевода подряд должно быть два или более. Тут, кстати, есть нюанс: не во всех версиях/локализациях Word такая регулярка заработает. В некоторых случаях вместо запятой потребуется указать точку с запятой (да, в Microsoft иногда делают крайне странные вещи). Чтобы сделать наш макрос более универсальным, напишем функцию, которая вернёт регулярное выражение, пригодное для поиска в той версии Word, в которой эту функцию запустили:

Private Function GetLineBreakSearchRegExp()

    On Error GoTo Err

    FindNextText «[^013]{2,}», True

    GetLineBreakSearchRegExp = «[^013]{2,}»

    Exit Function

Err:

    GetLineBreakSearchRegExp = «[^013]{2;}»

End Function

Здесь мы сначала пытаемся осуществить поиск с помощью wildcard’а [^013]{2,}. Если всё окей, то вернём из функции этот самый wildcard как рабочий (строка 4). В противном случае произойдёт ошибка, но мы готовы её обработать: мы установили обработчик всех ошибок в строке 2. Нас перекинет на метку Err, и тут мы вернём wildcard, который пригоден для других ревизий Word (в котором запятая внутри фигурных скобок заменена на точку с запятой).

Далее напишем функцию, которая будет заменять несколько последовательных переводов строки на единственный:

Private Sub RemoveNextEnters()

    Selection.MoveStart wdWord, 1

    If Selection.Range.Start <> Selection.Range.End Then Selection.Delete

End Sub

Эта функция подразумевает, что вызывать её будут тогда, когда объект Selection указывает на найденные несколько переводов строки. В строке 2 перемещаем начало выделения (а в выделены у нас будут все найденные последовательные переводы строки) на один символ вперед, а затем в строке 3, если начало выделения не совпадает с его концом, удаляем его содержимое. Таким образом, если было выделено три перевода строки, мы отступаем вперед на 1 символ (оставляя один перевод строки нетронутым), а затем удаляем оставшиеся два.

Осталось написать последнюю функцию, которая будет всем управлять.

Sub RemoveExcessiveEnters()

    Dim lineBreakSearchRegExp As String

    lineBreakSearchRegExp = GetLineBreakSearchRegExp()

    Selection.HomeKey Unit:=wdStory

    While FindNextText(lineBreakSearchRegExp, True) = True

        RemoveNextEnters

    Wend

    ClearFindAndReplaceParameters

End Sub

Здесь мы оперируем ранее написанными функциями. Сначала получаем текст регулярного выражения (wildcard’а) для поиска нескольких переводов строки подряд, затем вызовом HomeKey в строке 5 переходим в самое начало документа (перемещаем туда курсор), а затем в цикле ищем все интересующие нас места и удаляем излишние переводы строки. В конце сбрасываем параметры поиска на значения по умолчанию.

Finished word macro

Вот и всё, макрос можно запускать! Обратите внимание, что все функции, кроме последней, мы пометили Private. Мы не хотим, чтобы их вызывали напрямую. Доступной для вызова снаружи будет только функция RemoveExcessiveEnters. Перед запуском макроса стоит убедиться, что макросы включены. Если вылазит такая панель, то нужно нажать «Включить содержимое» («Enable content»):

Word enable content

Если такой панели нет, то можно зайти в меню «Файл» («File») -> «Сведения» («Info») и включить макросы уже оттуда:

Word enable content from info menu

Вы можете включить макросы на время одного сеанса Word (это по умолчанию и происходит, если нажимаете «Включить содержимое»), так что после перезапуска Word макросы снова будут отключены. Для запуска макроса возвращаемся в Word на панель «Разработчик» и нажимаем кнопку «Макросы» («Macros»), выбираем наш макрос RemoveExcessiveEnters и нажимаем «Выполнить» («Run»). Разумеется, у вас должен быть открыт какой-нибудь подопытный документ, где имеются лишние переводы строк. В качестве бонуса наш макрос ещё и удалит пустые элементы списков, потому что они представляют из себя точно такие же несколько переводов строки подряд.

Word macro: before and after

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

Undo Word macro

Макросы можно отлаживать через окно VBA, в котором мы писали макрос. Кликнув слева от строки кода, можно, как и в других средах разработки, поставить точку останова, а потом запустить макрос кнопкой «Run». Запустится та функция, на которой у вас находится курсор. Если вы поставите курсор на функцию с параметрами, то появится обычный запрос на выбор макроса для запуска, как при нажатии на кнопку «Макросы» в Word.

Debug Word macros

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

Код макроса можно скачать тут. Вы сможете его импортировать к себе в Word, кликнув правой кнопкой на «Normal» -> «Import file…» и выбрав загруженный файл.

P.S. Кстати, рекомендую создавать бэкапы своих макросов, экспортируя их куда-нибудь на диск. Даже лицензионный Word имеет свойство их иногда по какой-то причине удалять из шаблона Normal, в котором мы их создавали.

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