FAQ VCL
Работа с MS Office\Word

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как запустить/закрыть Word?

uses
  {...,} ComObj;

var
  W: OleVariant;

// Запустить Word
procedure TForm1.Button1Click(Sender: TObject);
begin
   W := CreateOleObject( 'Word.Application' );
   W.Visible := true;
end;

// Закрыть Word
procedure TForm1.Button2Click(Sender: TObject);
begin
   W.Quit;
   W := Unassigned;
end;


Как добавить документ в Word?

uses
  {..., Word_TLB,} ActiveX;

// Constants for enum WdNewDocumentType
type
  WdNewDocumentType = TOleEnum;
const
  wdNewBlankDocument = $00000000; // Новый чистый документ
  wdNewWebPage = $00000001; // Web-страница
  wdNewEmailMessage = $00000002; // Электронное сообщение
  wdNewFrameset = $00000003; // Фрейм

var
  W: OleVariant; // Объект Word

procedure TForm1.Button1Click(Sender: TObject);
begin
   W.Documents.Add;
end;

// Параметры метода Open:
// Template: string = Имя шаблона, по которому создается новый документ. Если значение не указано, то используется шаблон Normal.
// NewTemplate: boolean = Если использовать значение true, то новый документ открывается как шаблон. Значение по умолчанию - false.
// DocumentType: enum = Тип создаваемого документа, принимает значение из перечисления WdNewDocumentType.
// Visible: boolean = Управляет видимостью созданного документа. Если указать значение True, то документ будет видим.


Как открыть документ в Word?

uses
  {..., Word_TLB,} ActiveX;

// Constants for enum MsoEncoding
type
  MsoEncoding = TOleEnum;
const
  msoEncodingThai = $0000036A;
  msoEncodingJapaneseShiftJIS = $000003A4;
  msoEncodingSimplifiedChineseGBK = $000003A8;
  msoEncodingKorean = $000003B5;
  msoEncodingTraditionalChineseBig5 = $000003B6;
  msoEncodingUnicodeLittleEndian = $000004B0;
  msoEncodingUnicodeBigEndian = $000004B1;
  msoEncodingCentralEuropean = $000004E2;
  msoEncodingCyrillic = $000004E3;
  msoEncodingWestern = $000004E4;
  msoEncodingGreek = $000004E5;
  msoEncodingTurkish = $000004E6;
  msoEncodingHebrew = $000004E7;
  msoEncodingArabic = $000004E8;
  msoEncodingBaltic = $000004E9;
  msoEncodingVietnamese = $000004EA;
  msoEncodingAutoDetect = $0000C351;
  msoEncodingJapaneseAutoDetect = $0000C6F4;
  msoEncodingSimplifiedChineseAutoDetect = $0000C6F8;
  msoEncodingKoreanAutoDetect = $0000C705;
  msoEncodingTraditionalChineseAutoDetect = $0000C706;
  msoEncodingCyrillicAutoDetect = $0000C833;
  msoEncodingGreekAutoDetect = $0000C835;
  msoEncodingArabicAutoDetect = $0000C838;
  msoEncodingISO88591Latin1 = $00006FAF;
  msoEncodingISO88592CentralEurope = $00006FB0;
  msoEncodingISO88593Latin3 = $00006FB1;
  msoEncodingISO88594Baltic = $00006FB2;
  msoEncodingISO88595Cyrillic = $00006FB3;
  msoEncodingISO88596Arabic = $00006FB4;
  msoEncodingISO88597Greek = $00006FB5;
  msoEncodingISO88598Hebrew = $00006FB6;
  msoEncodingISO88599Turkish = $00006FB7;
  msoEncodingISO885915Latin9 = $00006FBD;
  msoEncodingISO2022JPNoHalfwidthKatakana = $0000C42C;
  msoEncodingISO2022JPJISX02021984 = $0000C42D;
  msoEncodingISO2022JPJISX02011989 = $0000C42E;
  msoEncodingISO2022KR = $0000C431;
  msoEncodingISO2022CNTraditionalChinese = $0000C433;
  msoEncodingISO2022CNSimplifiedChinese = $0000C435;
  msoEncodingMacRoman = $00002710;
  msoEncodingMacJapanese = $00002711;
  msoEncodingMacTraditionalChineseBig5 = $00002712;
  msoEncodingMacKorean = $00002713;
  msoEncodingMacArabic = $00002714;
  msoEncodingMacHebrew = $00002715;
  msoEncodingMacGreek1 = $00002716;
  msoEncodingMacCyrillic = $00002717;
  msoEncodingMacSimplifiedChineseGB2312 = $00002718;
  msoEncodingMacRomania = $0000271A;
  msoEncodingMacUkraine = $00002721;
  msoEncodingMacLatin2 = $0000272D;
  msoEncodingMacIcelandic = $0000275F;
  msoEncodingMacTurkish = $00002761;
  msoEncodingMacCroatia = $00002762;
  msoEncodingEBCDICUSCanada = $00000025;
  msoEncodingEBCDICInternational = $000001F4;
  msoEncodingEBCDICMultilingualROECELatin2 = $00000366;
  msoEncodingEBCDICGreekModern = $0000036B;
  msoEncodingEBCDICTurkishLatin5 = $00000402;
  msoEncodingEBCDICGermany = $00004F31;
  msoEncodingEBCDICDenmarkNorway = $00004F35;
  msoEncodingEBCDICFinlandSweden = $00004F36;
  msoEncodingEBCDICItaly = $00004F38;
  msoEncodingEBCDICLatinAmericaSpain = $00004F3C;
  msoEncodingEBCDICUnitedKingdom = $00004F3D;
  msoEncodingEBCDICJapaneseKatakanaExtended = $00004F42;
  msoEncodingEBCDICFrance = $00004F49;
  msoEncodingEBCDICArabic = $00004FC4;
  msoEncodingEBCDICGreek = $00004FC7;
  msoEncodingEBCDICHebrew = $00004FC8;
  msoEncodingEBCDICKoreanExtended = $00005161;
  msoEncodingEBCDICThai = $00005166;
  msoEncodingEBCDICIcelandic = $00005187;
  msoEncodingEBCDICTurkish = $000051A9;
  msoEncodingEBCDICRussian = $00005190;
  msoEncodingEBCDICSerbianBulgarian = $00005221;
  msoEncodingEBCDICJapaneseKatakanaExtendedAndJapanese = $0000C6F2;
  msoEncodingEBCDICUSCanadaandJapanese = $0000C6F3;
  msoEncodingEBCDICKoreanExtendedAndKorean = $0000C6F5;
  msoEncodingEBCDICSimplifiedChineseExtendedAndSimplifiedChinese = $0000C6F7;
  msoEncodingEBCDICUSCanadaAndTraditionalChinese = $0000C6F9;
  msoEncodingEBCDICJapaneseLatinExtendedAndJapanese = $0000C6FB;
  msoEncodingOEMUnitedStates = $000001B5;
  msoEncodingOEMGreek437G = $000002E1;
  msoEncodingOEMBaltic = $00000307;
  msoEncodingOEMMultilingualLatinI = $00000352;
  msoEncodingOEMMultilingualLatinII = $00000354;
  msoEncodingOEMCyrillic = $00000357;
  msoEncodingOEMTurkish = $00000359;
  msoEncodingOEMPortuguese = $0000035C;
  msoEncodingOEMIcelandic = $0000035D;
  msoEncodingOEMHebrew = $0000035E;
  msoEncodingOEMCanadianFrench = $0000035F;
  msoEncodingOEMArabic = $00000360;
  msoEncodingOEMNordic = $00000361;
  msoEncodingOEMCyrillicII = $00000362;
  msoEncodingOEMModernGreek = $00000365;
  msoEncodingEUCJapanese = $0000CADC;
  msoEncodingEUCChineseSimplifiedChinese = $0000CAE0;
  msoEncodingEUCKorean = $0000CAED;
  msoEncodingEUCTaiwaneseTraditionalChinese = $0000CAEE;
  msoEncodingArabicASMO = $000002C4;
  msoEncodingArabicTransparentASMO = $000002D0;
  msoEncodingKoreanJohab = $00000551;
  msoEncodingTaiwanCNS = $00004E20;
  msoEncodingTaiwanTCA = $00004E21;
  msoEncodingTaiwanEten = $00004E22;
  msoEncodingTaiwanIBM5550 = $00004E23;
  msoEncodingTaiwanTeleText = $00004E24;
  msoEncodingTaiwanWang = $00004E25;
  msoEncodingIA5IRV = $00004E89;
  msoEncodingIA5German = $00004E8A;
  msoEncodingIA5Swedish = $00004E8B;
  msoEncodingIA5Norwegian = $00004E8C;
  msoEncodingUSASCII = $00004E9F;
  msoEncodingT61 = $00004F25;
  msoEncodingISO6937NonSpacingAccent = $00004F2D;
  msoEncodingKOI8R = $00005182;
  msoEncodingExtAlphaLowercase = $00005223;
  msoEncodingKOI8U = $0000556A;
  msoEncodingEuropa3 = $00007149;
  msoEncodingHZGBSimplifiedChinese = $0000CEC8;
  msoEncodingUTF7 = $0000FDE8;
  msoEncodingUTF8 = $0000FDE9;

// Constants for enum WdOpenFormat
type
  WdOpenFormat = TOleEnum;
const
  wdOpenFormatAuto = $00000000; // Формат выбирается автоматически
  wdOpenFormatDocument = $00000001; // Документ Word (файл с расширением DOC)
  wdOpenFormatTemplate = $00000002; // Шаблон Word (файл с расширением DOT)
  wdOpenFormatRTF = $00000003; // Документ в формате RTF
  wdOpenFormatText = $00000004; // Текстовый документ
  wdOpenFormatUnicodeText = $00000005; // Текстовый документ в формате UNICODE
  wdOpenFormatEncodedText = $00000005; // Текстовый документ в формате UNICODE
  wdOpenFormatAllWord = $00000006; // ?
  wdOpenFormatWebPages = $00000007; // Web документ

var
  W: OleVariant; // Объект Word

procedure TForm1.Button1Click(Sender: TObject);
begin
   W.Documents.Open( FileName := 'c:\путь к файлу\имя файла.doc' );
   // Другой способ открыть файл
   // W.ChangeFileOpenDirectory( 'c:\путь к файлу\' );
   // W.Documents.Open( FileName := 'имя файла.doc' );
end;

// Параметры метода Open:
// FileName: string = В параметре указывается имя файла документа, включая путь. Обязательный параметр.
// ConfirmConversions: boolean = Если false, то при открытии документа, формат которого отличается от DOC,
//    не будет открываться диалоговое окно "Преобразование файла", если true, то диалоговое окно
//    будет выводиться.
// ReadOnly: boolean = Указывая true, документ откроется в режиме только для чтения.
// AddToRecentFiles: boolean = Устанавливая true, имя файла добавляется в список недавно открытых файлов в меню Файл.
// PasswordDocument: string = Пароль для открытия документа.
// PasswordTemplate: string = Пароль для открытия шаблона.
// Revert: boolean = true - возврат к сохраненному документу, если этот документ открывается повторно.
// WritePasswordDocument: string = Пароль для сохранения измененного документа в файле.
// WritePasswordTemplate: string = Пароль для сохранения измененного документа в шаблоне.
// Format: enum = Формат открываемого файла, принимает значение из перечисления WdOpenFormat.
// Encoding: enum = Кодировка для просмотра документа, принимает значение из перечисления MsoEncoding.
//    По умолчанию используется системная кодовая станица, установленная по умолчанию.
// Visible: boolean = Будет виден документ после открытия или нет.
// XMLTransform: string = ?


Как работать с закладками в Word?

uses
  {..., Word_TLB,} ActiveX;

// Constants for enum WdGoToItem
type
  WdGoToItem = TOleEnum;
const
  wdGoToBookmark = $FFFFFFFF;
  wdGoToSection = $00000000;
  wdGoToPage = $00000001;
  wdGoToTable = $00000002;
  wdGoToLine = $00000003;
  wdGoToFootnote = $00000004;
  wdGoToEndnote = $00000005;
  wdGoToComment = $00000006;
  wdGoToField = $00000007;
  wdGoToGraphic = $00000008;
  wdGoToObject = $00000009;
  wdGoToEquation = $0000000A;
  wdGoToHeading = $0000000B;
  wdGoToPercent = $0000000C;
  wdGoToSpellingError = $0000000D;
  wdGoToGrammaticalError = $0000000E;
  wdGoToProofreadingError = $0000000F;

// Constants for enum WdGoToDirection
type
  WdGoToDirection = TOleEnum;
const
  wdGoToFirst = $00000001;
  wdGoToLast = $FFFFFFFF;
  wdGoToNext = $00000002;
  wdGoToRelative = $00000002;
  wdGoToPrevious = $00000003;
  wdGoToAbsolute = $00000001;

var
  W: OleVariant; // Объект Word

// Добавление закладки
procedure TForm1.Button1Click(Sender: TObject);
begin
   W.ActiveDocument.Bookmarks.Add( 'Bookmark1' );
end;

// Скрыть/показать закладки в документе
procedure TForm1.Button2Click(Sender: TObject);
begin
   W.ActiveWindow.View.ShowBookmarks := true; // Показать
   W.ActiveWindow.View.ShowBookmarks := false; // Скрыть
end;

// Переход к нужной закладке
procedure TForm1.Button3Click(Sender: TObject);
begin
   W.ActiveDocument.Bookmarks.Item( 'Bookmark1' ).Select;
   // Или вот так
   W.Selection.GoTo( Name := 'Bookmark1' );
end;

// Параметры метода GoTo:
// What: enum = Вид элемента, к которому перемещается выделенный диапазон, принимает значение из перечисления WdGoToItem.
// Which: enum = Элемент, к которому перемещается выделенный диапазон, принимает значение из перечисления WdGoToDirection.
// Count: integer = Номер элемента в документе. Значение по умолчанию — 1.
//    Допустимы только положительные значения. Чтобы указать элемент, предшествующий выделенному диапазону, следует использовать
//    wdGoToPrevious в качестве аргумента Which и указать значение Count.
// Name: string = Если в качестве аргумента What используются объекты wdGoToBookmark, wdGoToComment, wdGoToField или wdGoToObject,
//    значит, данный аргумент задает имя.

// Удаление закладки
procedure TForm1.Button4Click(Sender: TObject);
begin
   W.ActiveDocument.Bookmarks.Item( 'Bookmark1' ).Delete; // Удаление по имени
   W.ActiveDocument.Bookmarks.Item( 1 ).Delete; // Удаление по индексу
end;

// В Word существуют предопределенные закладки:
// \StartOfDoc - начало документа
// \EndOfDoc - конец документа
// \Sel - переход к текущей позиции ввода


Как динамически создать макрос в документе Word и выполнить его?

// Способ первый
uses
  {...,} ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  W: OleVariant;
  i: OleVariant;
begin
   W := CreateOleObject( 'Word.Application' );
   W.Visible := true;
   W.Documents.Add;
   i := W.VBE.ActiveVBProject.VBComponents.Count;
   W.VBE.ActiveVBProject.VBComponents.Add( 1 );
   W.VBE.ActiveVBProject.VBComponents.Item( i+1 ).CodeModule.InsertLines( 1, 'Sub Test()' );
   W.VBE.ActiveVBProject.VBComponents.Item( i+1 ).CodeModule.InsertLines( 2, '   MsgBox "Привет!"' );
   W.VBE.ActiveVBProject.VBComponents.Item( i+1 ).CodeModule.InsertLines( 3, 'End Sub' );
   W.Application.Run( 'Test' );

   W.Quit;
   W := Unassigned;
end;

// Способ второй
uses
  {...,} ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  W: OleVariant;
  i: OleVariant;
begin
   W := CreateOleObject( 'Word.Application' );
   W.Visible := true;
   W.Documents.Add;
   i := W.VBE.ActiveVBProject.VBComponents.Count;
   W.VBE.ActiveVBProject.VBComponents.Add( 1 );
   W.VBE.ActiveVBProject.VBComponents.Item( i+1 ).CodeModule.AddFromString( 'Sub Test()' + #13 + '   MsgBox "Привет!"' + #13 + 'End Sub' );
   W.Application.Run( 'Test' );

   W.Quit;
   W := Unassigned;
end;

// Способ третий (импорт из файла)
uses
  {...,} ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  W: OleVariant;
  i: OleVariant;
begin
   W := CreateOleObject( 'Word.Application' );
   W.Visible := true;
   W.Documents.Add;
   i := W.VBE.ActiveVBProject.VBComponents.Count;
   W.VBE.ActiveVBProject.VBComponents.Add( 1 );
   W.VBE.ActiveVBProject.VBComponents.Import( 'C:\ModuleTest.bas' );
   W.Application.Run( 'Test' );

   W.Quit;
   W := Unassigned;
end;

// Текст файла ModuleTest.bas
'Attribute VB_Name = "ModuleTest"
Public Sub Test()
   MsgBox( "Этот модуль вставили из текстового файла" )
End Sub

// Если раскомментировать первую строчку, то при добавлении текста из файла
// как обычный модуль, имя модуля будет ModuleTest

// Способ четвертый (вставка из файла)
uses
  {...,} ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  W: OleVariant;
  i: OleVariant;
begin
   W := CreateOleObject( 'Word.Application' );
   W.Visible := true;
   W.Documents.Add;
   i := W.VBE.ActiveVBProject.VBComponents.Count;
   W.VBE.ActiveVBProject.VBComponents.Add( 1 );
   W.VBE.ActiveVBProject.VBComponents.Item( i+1 ).CodeModule.AddFromFile( 'C:\ModuleTest.bas' );
   W.Application.Run( 'Test' );

   W.Quit;
   W := Unassigned;
end;

// Текст файла ModuleTest.bas
'Attribute VB_Name = "ModuleTest"
Public Sub Test()
   MsgBox( "Этот модуль вставили из текстового файла" )
End Sub

// Если раскомментировать первую строчку, то при добавлении текста из файла
// как обычный модуль, имя модуля будет ModuleTest

// Чтобы при создании макроса не вылетала ошибка, нужно разрешить программный доступ к среде VB.
// Как это сделать? - В разных версиях Word по-разному
// В ранних версиях: пункт меню Сервис -> Макрос -> Безопасность -> Вкладка надежные издатели -> поставить галку "Доверять доступ к Visual Basic Project"
// В Word 2010: Файл -> Параметры -> Центр управления безопасностью -> кнопка "Параметры центра управления безопасностью..." -> поставить галку "Доверять доступ к объектной модели проектов VBA"


Как определить нахождение курсора ввода в ячейке таблицы?

uses
  {..., Word_TLB,} ActiveX, ComObj;

// Constants for enum WdInformation
type
  WdInformation = TOleEnum;
const
  wdActiveEndAdjustedPageNumber = $00000001;
  wdActiveEndSectionNumber = $00000002;
  wdActiveEndPageNumber = $00000003;
  wdNumberOfPagesInDocument = $00000004;
  wdHorizontalPositionRelativeToPage = $00000005;
  wdVerticalPositionRelativeToPage = $00000006;
  wdHorizontalPositionRelativeToTextBoundary = $00000007;
  wdVerticalPositionRelativeToTextBoundary = $00000008;
  wdFirstCharacterColumnNumber = $00000009;
  wdFirstCharacterLineNumber = $0000000A;
  wdFrameIsSelected = $0000000B;
  wdWithInTable = $0000000C;
  wdStartOfRangeRowNumber = $0000000D;
  wdEndOfRangeRowNumber = $0000000E;
  wdMaximumNumberOfRows = $0000000F;
  wdStartOfRangeColumnNumber = $00000010;
  wdEndOfRangeColumnNumber = $00000011;
  wdMaximumNumberOfColumns = $00000012;
  wdZoomPercentage = $00000013;
  wdSelectionMode = $00000014;
  wdCapsLock = $00000015;
  wdNumLock = $00000016;
  wdOverType = $00000017;
  wdRevisionMarking = $00000018;
  wdInFootnoteEndnotePane = $00000019;
  wdInCommentPane = $0000001A;
  wdInHeaderFooter = $0000001C;
  wdAtEndOfRowMarker = $0000001F;
  wdReferenceOfType = $00000020;
  wdHeaderFooterType = $00000021;
  wdInMasterDocument = $00000022;
  wdInFootnote = $00000023;
  wdInEndnote = $00000024;
  wdInWordMail = $00000025;
  wdInClipboard = $00000026;

var
  W: OleVariant; // Объект Word

procedure TForm1.FormCreate(Sender: TObject);
begin
   W := CreateOleObject( 'Word.Application' );
   // Открвыаем документ, содержащий таблицы
   W.Documents.Open( 'c:\путь к файлу\имя файла.doc' );
   W.Visible := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   W.Quit;
   W := Unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Table: OleVariant;
begin
   // Если курсор ввода находится в ячейке таблицы
   if W.Selection.Information[wdWithInTable] then
   begin
      // Получаем ссылку на таблицу
      Table := W.Selection.Tables.Item( 1 );
      Table.Cell( 1, 1 ).Range.Text := 'Some text';
   end;
end;


Как перейти к следующей или предыдущей таблице?

uses
  {..., Word_TLB,} ActiveX, ComObj;

// Constants for enum WdGoToItem
type
  WdGoToItem = TOleEnum;
const
  wdGoToBookmark = $FFFFFFFF;
  wdGoToSection = $00000000;
  wdGoToPage = $00000001;
  wdGoToTable = $00000002;
  wdGoToLine = $00000003;
  wdGoToFootnote = $00000004;
  wdGoToEndnote = $00000005;
  wdGoToComment = $00000006;
  wdGoToField = $00000007;
  wdGoToGraphic = $00000008;
  wdGoToObject = $00000009;
  wdGoToEquation = $0000000A;
  wdGoToHeading = $0000000B;
  wdGoToPercent = $0000000C;
  wdGoToSpellingError = $0000000D;
  wdGoToGrammaticalError = $0000000E;
  wdGoToProofreadingError = $0000000F;

var
  W: OleVariant; // Объект Word

procedure TForm1.FormCreate(Sender: TObject);
begin
   W := CreateOleObject( 'Word.Application' );
   W.Documents.Open( 'c:\путь к файлу\имя файла.doc' );
   W.Visible := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   W.Quit;
   W := Unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   // В каком бы месте документа не находился курсор ввода,
   // Мы можем перейти к следующей за ним таблице
   W.Selection.GoToNext( wdGoToTable );
   // Или к предыдущей
   // W.Selection.GoToPrevious( wdGoToTable );
end;


Как поучить количество строк и столбцов в таблице?

uses
  {..., Word_TLB,} ActiveX, ComObj;

// Constants for enum WdInformation
type
  WdInformation = TOleEnum;
const
  wdActiveEndAdjustedPageNumber = $00000001;
  wdActiveEndSectionNumber = $00000002;
  wdActiveEndPageNumber = $00000003;
  wdNumberOfPagesInDocument = $00000004;
  wdHorizontalPositionRelativeToPage = $00000005;
  wdVerticalPositionRelativeToPage = $00000006;
  wdHorizontalPositionRelativeToTextBoundary = $00000007;
  wdVerticalPositionRelativeToTextBoundary = $00000008;
  wdFirstCharacterColumnNumber = $00000009;
  wdFirstCharacterLineNumber = $0000000A;
  wdFrameIsSelected = $0000000B;
  wdWithInTable = $0000000C;
  wdStartOfRangeRowNumber = $0000000D;
  wdEndOfRangeRowNumber = $0000000E;
  wdMaximumNumberOfRows = $0000000F;
  wdStartOfRangeColumnNumber = $00000010;
  wdEndOfRangeColumnNumber = $00000011;
  wdMaximumNumberOfColumns = $00000012;
  wdZoomPercentage = $00000013;
  wdSelectionMode = $00000014;
  wdCapsLock = $00000015;
  wdNumLock = $00000016;
  wdOverType = $00000017;
  wdRevisionMarking = $00000018;
  wdInFootnoteEndnotePane = $00000019;
  wdInCommentPane = $0000001A;
  wdInHeaderFooter = $0000001C;
  wdAtEndOfRowMarker = $0000001F;
  wdReferenceOfType = $00000020;
  wdHeaderFooterType = $00000021;
  wdInMasterDocument = $00000022;
  wdInFootnote = $00000023;
  wdInEndnote = $00000024;
  wdInWordMail = $00000025;
  wdInClipboard = $00000026;

var
  W: OleVariant; // Объект Word

procedure TForm1.FormCreate(Sender: TObject);
begin
   W := CreateOleObject( 'Word.Application' );
   W.Documents.Open( 'c:\путь к файлу\имя файла.doc' );
   W.Visible := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   W.Quit;
   W := Unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Columns, Rows: Integer;
begin
   // Курсор ввода должен находится в ячейке таблицы
   Columns := W.Selection.Information[wdMaximumNumberOfColumns];
   Rows := W.Selection.Information[wdMaximumNumberOfRows];
   ShowMessage( Format( 'Строк: %d, Столбцов: %d', [Rows, Columns] ) );
end;


Как поучить номер колонки и строки, на которой позиционирован курсор ввода?

uses
  {..., Word_TLB,} ActiveX, ComObj;

// Constants for enum WdInformation
type
  WdInformation = TOleEnum;
const
  wdActiveEndAdjustedPageNumber = $00000001;
  wdActiveEndSectionNumber = $00000002;
  wdActiveEndPageNumber = $00000003;
  wdNumberOfPagesInDocument = $00000004;
  wdHorizontalPositionRelativeToPage = $00000005;
  wdVerticalPositionRelativeToPage = $00000006;
  wdHorizontalPositionRelativeToTextBoundary = $00000007;
  wdVerticalPositionRelativeToTextBoundary = $00000008;
  wdFirstCharacterColumnNumber = $00000009;
  wdFirstCharacterLineNumber = $0000000A;
  wdFrameIsSelected = $0000000B;
  wdWithInTable = $0000000C;
  wdStartOfRangeRowNumber = $0000000D;
  wdEndOfRangeRowNumber = $0000000E;
  wdMaximumNumberOfRows = $0000000F;
  wdStartOfRangeColumnNumber = $00000010;
  wdEndOfRangeColumnNumber = $00000011;
  wdMaximumNumberOfColumns = $00000012;
  wdZoomPercentage = $00000013;
  wdSelectionMode = $00000014;
  wdCapsLock = $00000015;
  wdNumLock = $00000016;
  wdOverType = $00000017;
  wdRevisionMarking = $00000018;
  wdInFootnoteEndnotePane = $00000019;
  wdInCommentPane = $0000001A;
  wdInHeaderFooter = $0000001C;
  wdAtEndOfRowMarker = $0000001F;
  wdReferenceOfType = $00000020;
  wdHeaderFooterType = $00000021;
  wdInMasterDocument = $00000022;
  wdInFootnote = $00000023;
  wdInEndnote = $00000024;
  wdInWordMail = $00000025;
  wdInClipboard = $00000026;

var
  W: OleVariant; // Объект Word

procedure TForm1.FormCreate(Sender: TObject);
begin
   W := CreateOleObject( 'Word.Application' );
   W.Documents.Open( 'c:\путь к файлу\имя файла.doc' );
   W.Visible := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   W.Quit;
   W := Unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Column, Row: Integer;
begin
   // Курсор ввода должен находится в ячейке таблицы
   Column := W.Selection.Information[wdStartOfRangeColumnNumber];
   Row := W.Selection.Information[wdStartOfRangeRowNumber];
   ShowMessage( Format( 'Строка: %d, Столбец: %d', [Row, Column] ) );
end;


Как добавить строку в конец таблицы?

uses
  {...,} ActiveX, ComObj;

var
  W: OleVariant; // Объект Word

procedure TForm1.FormCreate(Sender: TObject);
begin
   W := CreateOleObject( 'Word.Application' );
   W.Documents.Open( 'c:\путь к файлу\имя файла.doc' );
   W.Visible := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   W.Quit;
   W := Unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Table: OleVariant;
begin
   // Курсор ввода должен находится в ячейке таблицы
   Table := W.Selection.Tables.Item( 1 );
   Table.Rows.Add;
   // Или так (если мы знаем порядковый номер таблицы)
   // W.ActiveDocument.Tables.Item( 1 ).Rows.Add;
end;

При использовании материала - ссылка на сайт обязательна