MS Word Visial Basic for Delphi.
Или как управлять Word'ом из Delphi.
(для непродвинутых)

© Терехов А В. 2003


Вступление

Во многих случаях требуется очень быстро создать отчет нужной формы. Например, поменялась форма платежки - куда бежать? Тем более, что и бух.программа, так сказать, не лицензионная... Или, например, надо сделать кучу претензионных писем с одним и тем же текстом, но с разными цифрами и реквизитами. Или, например...
Случаев таких, повторюсь, очень много.
Короче, для тех, кто работает в офисе, проблемы известные.
И тут на помощь можно привлечь MS Word.
Почему Word, а не множество различных компонентов для построения отчетов?
    Аргументы ЗА:
  1. Все умеют работать с MS Word
  2. Создание шаблонов отчетов не составляет проблем
  3. Изменение шаблона не требует перекомпиляции программы
  4. Полученный отчет позволяет себя редактировать
  5. Производимый эффект повышает Ваш рейтинг как программиста в глазах руководителей и предоставляет шансы на повышение оклада
    Аргументы ПРОТИВ:
  1. Предоставляемые Delphi компоненты на закладе Servers неповоротливые, работают медленно, отсутствует документация, что сводит на нет все аргументы ЗА.

Как быть? Вот тут-то и приходит на помощь Microsoft Word Visial Basic.

    Необходимый инструментарий:
  1. Delphi 3.0 и выше
  2. MS Word'97 и выше
  3. файл справки от Microsoft Word Visial Basic - vbawrd8.hlp (файл справки устанавливается при инсталляции MS Office)
  4. список констант MS Word VB, находится в word97.pas от Delphi 5 ( список констант прилагается)

Как получить справку по MS Word Visial Basic

  1. Запускаем файл vbawrd8.hlp
  2. Переходим на закладку "Предметный указатель"
  3. В окне ввода пишем Application и выбираем Application object
  4. Получаем справку, удивительно похожую на справку, прилагаемую к Delphi
В справке можно увидеть все объекты, предоставляемые MS Word Visial Basic для работы с Word'ом, а также все их свойства и методы. А также куча примеров на все случаи жизни.
Тем кому не хочется разбираться с трансляцией кодов примеров с Visial Basic'а на Pascal - не разбирайтесь. Самое главное, есть названия доступных объектов, есть названия их свойств и методов со всеми возможными параметрами. Этого вполне достаточно для эффективной работы.
Для более дотошных - ниже по тексту есть пример такой трансляции.

Доступ к объектам MS Word VB из Delphi

Немного отвлечемся.
С самого начала своего существования MS Word имел встроенный язык WordBasic. Управление MS Word'ом осуществлялось с помощью команд (около 900). Почти во всех справках по первым версиям Delphi (в тройке точно) и в литературе управление MS Word'ом описывается посредством именно этого языка.
var
  Word: Variant;
begin
 Word := CreateOleObject('Word.Basic');
 Word.FileNew('Normal');
 Word.Insert('This is the first line'#13);
 Word.Insert('This is the second line'#13);
 Word.FileSaveAs('c:\temp\test.txt', 3);
end;
Затем в MS Word появился Visial Basic. Этот язык является объектно-ориентированным, т.е. отличается от WordBasic'а также как Delphi отличается от Pascal'я.
Чуть позже и в Delphi (в четверке не знаю, а в пятерке точно) появилась закладка Servers, имеющая компоненты WordApplication, WordDocument, etc., которые подключаются к MS Word Visial Basic (подключаются они, кстати, не к OLE-серверу, а к COM-серверу MS Word VB).
Казалось бы вопрос управления MS Word'ом решен. Но не тут-то было... (см. аргументы ПРОТИВ в начале статьи). И что самое печальное, информации по поводу управления OLE-сервером Visial Basic'а для Word почти нет. Точнее, информации море, но вся она разрознена, так что кажется, что ее нет совсем. Какие объекты можно использовать? Что умеют делать эти объекты? Как их использовать? Вопросов много.
В статье я попытался объединить информацию, "прикрутив" использование справки от VB к возможностям, предоставляемых Delphi.
Однако, продолжим...

Объект Application является одним из ключевых объектов MS Word Visial Basic'а. Для нашей задачи именно этот объект подходит наиболее всего. Вот им и займемся.
Чтобы начать работать с Word.Application первым делом надо получить к нему доступ. Для этого воспользуемся функцией CreateOleObject.

    Итак:
  1. В клаузу USES дописываем ComOBJ, где реализована функция CreateOleObject
  2. Объявляем переменную WordApp, имеющую тип OleVariant
  3. Устанавливаем связь с объектом Word.Application:
    WordApp:=CreateOleObject('Word.Application');
  4. В результате чего получаем доступ к свойствам, методам и дочерним объектам Word.Application, обращаясь к переменной WordApp также, как это принято в Delphi
Многие параметры, которые имеет Word.Application по умолчанию, нас устраивать не будут. Например, при создании свойство Visible этого объекта имеет значение False. Для того, чтобы объект стал виден, надо указать следующее:
WordApp.Visible:=True;

Создание объекта Word.Application - это первый шаг.
Так как мы планируем использовать документы Word'а в качестве шаблонов, то нам надо получить доступ к дочернему объекту Word.Application.Documents, который, так сказать, и будет управлять всем процессом.
Но прежде, чем пытаться получить к нему доступ, надо или создать новый документ или открыть существующий.
WordApp.Documents.Open('название_документа'); - открыть документ
WordApp.Documents.Add; - создать документ
Метод Add имеет два параметра по управлению файлом шаблонов MS Word, но мы их рассматривать не станем.

Три способа получения доступа к дочерним объектам Documents на примере объекта Tables (таблицы).
Почему таблицы? Потому что для создания шаблонов отчетов использование таблиц - наиудобнейшее решение. Расставил в нужных местах страницы таблицы и обращайся к их ячейкам по номеру таблицы, номеру строки и номеру столбца - очень удобно.

Способ первый.
Обращаемся к объектам активного документа через свойство Word.Application ActiveDocument:

WordApp.ActiveDocument.Tables - обращаемся к объекту "Таблицы" активного документа
Способ второй.
Обращаемся к объектам любого существующего документа через объект Documents
WordApp.Documents.Item(1).Tables - обращаемся к объекту "Таблицы" выбранного документа 
Здесь надо иметь ввиду две особенности.
1. В справке vbawrd8.hlp говорится об объектах, а также о коллекциях объектов.
Например, перейдите по справке
Application - Multiple Objects:Documents,
откроется страница Documents Collection Object - коллекция всех объектов Document, открытых в текущем экземпляре MS Word'а. Если нажать на ссылку Document , то откроется страница Document Object. Именно на этой странице можно посмотреть все свойства и методы, а также дочерние объекты у объекта Document. В связи с этим возникает желание обратиться к нужному свойству этого объекта:
Document.нужное_свойство,
однако это будет ошибкой. Из Delphi надо обращаться не к объекту VB, а к коллекции объектов. Т.е., обращаясь к объекту "Документ", надо писать WordApp.Documents, а чтобы узнать возможности это объекта, в файле справке надо выбирать Document. Тоже самое для других объектов, например для таблиц: Tables в Delphi и Table в файле справки.
Как видите, это вносит определенную путаницу. Так что к объектам в программе к объекту обращайтесь во множественном числе:
WordApp.Document.Item(1).Activate; - даст ошибку,
надо писать:
WordApp.Documents.Item(1).Activate;
2. В файле справке указано, что к объектам можно обращаться по номеру. Например, к третьему документу объекта Application можно обращаться Documents(3).
В Delphi такое обращение вызовет ошибку.
Обращаться к объекту по номеру следует через свойство Item.
WordApp.Documents.Item(3).Tables.Item(2).Cell(1,2).Range:='Hi Word!';
В указанном примере мы в третьем документе во второй таблице в ячейку первой строки второго столбца записали Hi Word!
Кстати, с номерами объектов также существует определенная путаница. Например, мы поместили в документ Word'а несколько таблиц. Номера таблицам присваиваются в порядке их расположения на странице сверху вниз. Самая верхняя имеет номер один, следующая номер два и т.д., несмотря на то, что возможно вначале была создана вторая сверху страницы таблица, а затем самая верхняя.
С номерами документов, также не все просто. Например, мы создали вначале один документ, затем второй документ, а затем третий документ. Вот как будут выглядеть их номера в процессе создания.
1. Создан один документ
Документ1 - номер 1

2. Создано два документа
Документ1 - номер 2
Документ2 - номер 1

3. Создано три документа
Документ1 - номер 3
Документ2 - номер 2
Документ3 - номер 1

Способ третий.

  1. Объявляем переменную типа OleVariant
  2. Назначаем этой переменной нужный объект
  3. Обращаемся к объекту через эту переменную.
Var
WordTables:OleVariant;
Begin
WordTables:=WordApp.ActiveDocument.Tables;
WordTables.Item(2).Cell(1,2).Range:='Hi Word!';
End;
Еще один способ.
Кроме как через Word.Application к дочерним объектам Document VB MS Word'а можно обратиться, вызвав CreateOleObject('Word.Document'). К полям, методам и дочерним объектам нового документа теперь можно обращаться через переменную WordDoc, не используя методы Add или Open.
Var
WordDoc:OleVariant;
WordTables:OleVariant;
Begin
WordDoc:=CreateOleObject('Word.Document');
WordTables:=WordDoc.Tables;
End;
В этом случае в уже загруженном Word откроется новый документ. Если к моменту создания WordDoc из приведенного выше примера MS Word загружен не был, то обратившись к свойству WordDoc.Application, можно самому подгрузить экземпляр MS Word:
WordDoc.Application.Visible:=True;

Справка VB и работа с объектами.

Например, мы хотим вывести текст внутри ячейки в первой строке во втором столбце первой таблицы документа так, чтобы он располагался "Центрирование по вертикали".
    Наши действия:
  1. Открываем справку MS Word Visial Basic и находим Application object
  2. Двигаемся по справке
    1. Application - Multiple Objects:Documents
    2. Documents - Multiple Objects:Tables
    3. Tables - Multiple Objects:Cell
    4. Cell - Properties:VerticalAlignment Property
  3. В справке видим, что это свойство считывает или устанавливает центрирование текста по вертикали, в нашем случае для выбранной ячейки. Параметры, которые следует задать свойству VerticalAlignment для нашего объекта определяются WdVerticalAlignment константами:
    wdAlignVerticalBottom,- вертикальное расположение по нижнему краю
    wdAlignVerticalCenter, - вертикальное расположение по центру
    wdAlignVerticalJustify,- для таблиц не применяется
    wdAlignVerticalTop. - вертикальное расположение по верхнему краю
Для того, чтобы узнать значение этих констант следует обратиться к инструменту №4 - списку констант из файла Word97.pas.
А можно воспользоваться интуицией: в большинстве случаев значение констант начинается с 0 и увеличивается на единицу в порядке перечисления этих констант. Однако лучше посмотреть значения нужных констант и определить их внутри текста программы или просто подключить к проекту прилагающийся модуль WordConsts.pas

Итак центрируем:

Const
wdAlignVerticalTop = $00000000;
wdAlignVerticalCenter = $00000001;
wdAlignVerticalJustify = $00000002;
wdAlignVerticalBottom = $00000003;
Var
WordTables:OleVariant;
Begin
WordTables:=WordApp.ActiveDocument.Tables;
WordTables.Item(1).Cell(1,2).VerticalAlignment:=wdAlignVerticalCenter;
WordTables.Item(1).Cell(1,2).Range:='центрирование по вертикали';
End;
Продолжаем изучать справку.
Если выбрать Example файла справки для VerticalAlignment, то можно увидеть два примера.
Рассмотрим второй пример (там тоже про таблицы):
This example creates a 3x3 table in a new document and assigns a sequential cell number
to each cell in the table. The example then sets the height of the first row to 20 points
and vertically aligns the text at the top of the cells.

Set newDoc = Documents.Add
Set myTable = newDoc.Tables.Add(Selection.Range, 3, 3)
i = 1
For Each c In myTable.Range.Cells
    c.Range.InsertAfter "Cell " & i
    i = i + 1
Next
With myTable.Rows(1)
    .Height = 20
    .Cells.VerticalAlignment = wdAlignVerticalTop
End With
В этом примере в новом документе создается таблица 3х3 (экземпляр MS Word уже должен быть запущен), затем в каждой ячейке пишется ее номер. Затем устанавливается высота первой строки в 20 точек и устанавливается центрирование текста по верхнему краю ячейки.
Ниже приводится эквивалент решения в Delphi, с той разницей, что выравнивание верхней строки будет производиться по центру (вертикаль).

Прежде чем запускать этот пример надо включить MS Word. Хотя MS Word можно включить и позже :)

(Example1)
procedure TForm1.Button1Click(Sender: TObject);
Const
wdAlignVerticalTop = $00000000;
wdAlignVerticalCenter = $00000001;
wdAlignVerticalJustify = $00000002;
wdAlignVerticalBottom = $00000003;
Var
WordDocument:OleVariant;
WordTable:OleVariant;
N:Integer;
CellCount:Integer;
C:OleVariant;
begin
//создадим объект Document
WordDocument:=CreateOleObject('Word.Document');
//получим ссылку на объект Tables
WordTable:=WordDocument.Tables;
//добавим в Document таблицу из трех строк и трех столбцов
WordTable.Add(WordDocument.Range,3,3);
//получим ссылку на объект Cells объекта Range первой таблицы объекта Tables
C:=WordTable.Item(1).Range.Cells;
//получим количество ячеек, находящихся в объекте Cells
CellCount:=C.Count;
For N:=1 To CellCount Do
Begin
//вставим в каждую ячейку ее номер
C.Item(N).Range.InsertAfter(IntToStr(N));
End;
//увеличим высоту первой строки
WordTable.Item(1).Rows.Item(1).Height:=20;
//отцентрируем текст в первой строке по центру (вертикаль)
WordTable.Item(1).Rows.Item(1).Cells.VerticalAlignment:=wdAlignVerticalCenter;
end;
Чем интересен этот пример.
Во-первых, здесь можно посмотреть как пользоваться свойствами объектов
MS Word Visial Basic:
With myTable.Rows(1)
 .Height = 20
 .Cells.VerticalAlignment = wdAlignVerticalTop

Delphi:
WordTable.Item(1).Rows.Item(1).Height:=20;
WordTable.Item(1).Rows.Item(1).Cells.VerticalAlignment:=wdAlignVerticalCenter;

Примечание: В данном случае воспользоваться With - Do не получится, т.к. WordTable.Item(1).Rows.Item(1) для Delphi не является записью, объектом или классом, соответственно компилятор выдаст эту ошибку.

Т.е. для того, чтобы изменить свойство объекта надо пользоваться следующей конструкцией
главный_объект.коллекция_объектов.item(№).свойство:=константа(или значение);

Во-вторых, можно посмотреть как пользоваться методами объектов
MS Word Visial Basic:
Set newDoc = Documents.Add
Set myTable = newDoc.Tables.Add(Selection.Range, 3, 3)

можно встретить и такую конструкцию:
Set myRange = ActiveDocument.Range(0, 0)
ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=4

В обоих случаях к методу объекта в Delphi будет обращение:
WordTable.Add(Range,NumRows,NumColumns)

Только в первом случае объект Range, можно использовать от объекта Selection, а мы для упрощения возьмем Range от WordDocument
WordTable.Add(WordDocument.Range,3,3);

А во втором случае объявляем переменную myRange типа OleVariant, присваиваем ей нужные значения и подставляем в обращение к методу Add.

Var
myRange:OleVariant;
Begin
myRange:=WordDocument.Range;
myRange.Start:=0;
myRange.End:=0;
WordTable.Add(myRange,3,4);
End;
Обратите внимание на строку myRange:=WordDocument.Range;
Мы инициализируем переменную myRange, объектом "типа" Range. Это надо делать обязательно, иначе при обращении myRange.Start:=0; OLE-сервер MS Word VB выдаст ошибку. Такое правило инициализации переменных надо соблюдать во всех случаях и для всех объектов.

Итак, вызывая методы VB в Delphi, надо пользоваться следующей конструкцией:
главный_объект.коллекция_объектов.item(№).метод(аргумент, аргумент,..,аргумент);

Некоторые аргументы за ненадобностью можно не указывать.
Например, метод Close (см. справку Document - Methods - Close Method) объекта Document имеет три аргумента
Close(SaveChanges, OriginalFormat, RouteDocument)
В Delphi можно писать:
1. WordDocument.Close;
2. WordDocument.Close(wdDoNotSaveChanges);
3. WordDocument.Close(wdDoNotSaveChanges, wdOriginalDocumentFormat)
4. WordDocument.Close(wdDoNotSaveChanges, wdOriginalDocumentFormat, True);
как пользоваться константами уже говорилось.

В-третьих, просто подсказано хорошее решение. К ячейкам таблицы идет обращение не через объект Table напрямую, а через его встроенный объект Range. В объекте Table ячейки имеют адресацию Cell(строка, столбец), а в объекте Range - Cells(номер ячейки). Кроме этого объект Table не имеет свойства Count для ячеек, а объект Range имеет.

Ну на самом деле все не так страшно. Главное понять как обращаться к объектам MS Word Visial Basic, уметь общаться с его справкой и немного тренировок :)

Время жизни Word.Application

В предыдущем примере рассматривался не самый лучший для нашей задачи способ доступа к объектам Word. Имеется ввиду, что доступ осуществлялся через Word.Document. В случае использования Word как редактора отчетов для Delphi лучше использовать объект Word.Application.
Итак, создав один раз Word.Application мы даем ему путевку в жизнь. И хотя в достаточной мере мы можем управлять этим объектом, в том числе и закрыть, Application ведет себя вполне самостоятельно (с помощью пользователя, конечно). Закрыв, в том числе аварийно, приложение, запустившие Application мы не лишаем его жизни - Application продолжает благополучно существовать, мы только освободим переменную, через которую могли им управлять. Кроме этого вторично получить доступ к Application после того как переменная была освобождена - достаточно проблематично. Но можно:
1. Убедиться, что самый молодой по времени создания из всех существующих экземпляров Word именно наш (как?), иначе будет получен доступ к совершенно другому экземпляру MS Word
2. Создать экземпляр Word.Document
3. Обратиться к его свойству Application
Application настолько самостоятелен, что пользователь может поработать с отчетом и закрыть его, в то время как приложение продолжает работать. В этом случае, обратившись к переменной, мы получим ошибку.

На основании вышеизложенного следует сделать вывод, что время жизни Application - величина неопределенная. Эту особенность следует учитывать при проектировании приложений. По моему мнению, лучший вариант:
1. Создать объект Word.Application
2. Произвести все необходимые манипуляции с отчетом
3. Показать готовый отчет пользователю
4. Закрыть свое приложение, предоставив управление Application'ом надежным и крепким рукам пользователя - "мавр", так сказать, "сделал свое дело... "

В случае же, если мы делаем первые шаги по управлению Word'ом, то лучше лишение жизни Application'а предусмотреть заранее. Иначе неизбежные в ходе опытов ошибки напрочь переполнят память компьютера экземплярами Winword'а.

    Проводим эксперимент:
  1. Создайте экземпляр Word.Application через CreateOleObject
  2. Нажмите Ctrl_Alt_Del и обратите внимание на присутствие Winword'а
  3. Закройте свое приложение и повторите предыдущий пункт - Winword живой
  4. Повторите пункт 1 и 2 - Winword'ов уже два.
Поэтому для проведения экспериментов надо переопределить глобальную обработку ошибок, в которой следует закрыть Word.Application вызвав его метод Quit:
WordApp.Quit(0); - закрыть MS Word без запроса на сохранение документов

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

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComObj;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  WordApp:OleVariant;
  Procedure WordAppExcept(Sender:TObject; E:Exception);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.DFM}

Procedure TForm1.WordAppExcept(Sender:TObject; E:Exception);
Begin
Try
WordApp.Quit(0);
Except
End;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException:=WordAppExcept;
WordApp:=CreateOleObject('Word.Application');
end;

end.
Включите приведенный текст в модуль и вперед, к покорению Word.Application!

Первый шаблон отчета

Задача.
Требуется в готовый документ вставить номер, дату и текст.
Решение.
Включаем MS Word и готовим шаблон: на новом документе разместим текст, а также две таблицы. В первой таблице одна строка и четыре столбца с форматированием шрифта "Жирный". Вторая ячейка - будем читать и писать номер документа, четвертая ячейка - будем писать дату. Во второй таблице одна строка, один столбец, форматирование шрифта "Курсив". Сюда будем писать какой-нибудь текст.
Далее проект Delphi:
Example2
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComObj, Mask, StdCtrls;

type
  TForm1 = class(TForm)
    memoText: TMemo;
    Label1: TLabel;
    edNumber: TEdit;
    Label2: TLabel;
    meDate: TMaskEdit;
    Label3: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure edNumberKeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  WordApp:OleVariant;
  WordTables:OleVariant;
  Procedure WordAppExcept(Sender:TObject; E:Exception);
  public
    { Public declarations }
  end;
Const
ShablonFileName='shablon.doc';
var
  Form1: TForm1;


implementation

{$R *.DFM}

Procedure TForm1.WordAppExcept(Sender:TObject; E:Exception);
Begin
//место экзекуции непослушного Word.Application
Try
WordApp.Quit(0);
Except
End;
End;

procedure TForm1.FormCreate(Sender: TObject);
Var
FileName:String;
DocNumber:Integer;
begin
//настраиваем глобальный обработчик ошибок
Application.OnException:=WordAppExcept;
//создаем объект Word.Application
WordApp:=CreateOleObject('Word.Application');
//получаем путь к шаблону
FileName:=ExtractFilePath(ParamStr(0))+ShablonFileName;
//открываем документ
WordApp.Documents.Open(FileName);
//получаем ссылку на объект Tables активного документа
WordTables:=WordApp.ActiveDocument.Tables;
//пытаемся считать номер документа
Try
DocNumber:=StrToInt(Trim(WordTables.Item(1).Cell(1,2).Range.Text));
Except
DocNumber:=0;
End;
//увеличиваем номер
Inc(DocNumber);
//показываем на форме номер документа
edNumber.Text:=IntToStr(DocNumber);
//показываем на форме текущую дату
meDate.Text:=DateToStr(Now);
end;

procedure TForm1.edNumberKeyPress(Sender: TObject; var Key: Char);
begin
//набирать можно только цифры
If Not((Key In ['0'..'9'])Or (Key=Chr(8))) Then
Key:=Chr(7);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//показываем наш шаблон
WordApp.Visible:=True;
//разворачиваем его на весь экран
//wdWindowStateMaximize = $00000001;
WordApp.WindowState:=1;
//активизируем текущий экземпляр MS Word
WordApp.Activate;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
TextStr:String;
N:Integer;
begin
//запишем в шаблон номер документа
WordTables.Item(1).Cell(1,2).Range:=edNumber.Text;
//запишем в шаблон дату документа
WordTables.Item(1).Cell(1,4).Range:=meDate.Text;
//соберем текст с символами конца строки и перехода на новую строку
//для каждой строчки
TextStr:='';
For N:=0 To memoText.Lines.Count-1 Do
TextStr:=TextStr+memoText.Lines[N]+#13#10;
//запишем текст в шаблон
WordTables.Item(2).Cell(1,1).Range:=TextStr;
//Уходя - выключай свет!
ShowMessage('Перед повторным запуском не забудь закрыть MS Word!');
//закрываемся...
Close;
end;

end.
Ну вот, первый шаг сделан.

Заключение

После того, как все описанное выше прочитано, подводим итоги.
1. В справке от MS Word Visial Basic есть описание ВСЕХ объектов, их методов и свойств. Следовательно, если мы хотим что-то сделать в Word'е, то искать способы решения надо именно здесь.
2. Надо только понять принцип доступа к объектам VB для MS Word'а, а далее - полная аналогия объектов Delphi.
Еще раз:
2.1 Связываемся с одним из главных объектов VB (Application, Documents, есть еще - смотри справку)
CreateOleObject('Word.Application') или CreateOleObject('Word.Document')
2.2 Получаем доступ к методу или свойству нужного объекта
переменная,_указывающая_на_главный_объект.дочерний_объект.item(№).метод(аргумент,аргумент,...);
переменная,_указывающая_на_главный_объект.дочерний_объект.item(№).cвойство:=константа;
3. В процессе изучения ошибки неизбежны.
3.1 Если в справке нужный объект есть, а при обращении к нему происходит ошибка, то скорее всего:
- написано имя объекта, а не коллекции объектов (множественное число!)
- неправильно обратились к номеру объекта (item!)
- неверный аргумент или константа (смотри справку!)
3.2 Не забываем о жизнеспособности главных объектов, иначе компьютер захлебнется экземплярами Word'a

Напоследок.
Если кому-то статья помогла - буду рад. А если нет - "звыняйте, дядьку!... :)

Удачи!


Другие небольшие программы и примеры ищите на http://www.inta.portal.ru/dark/