Управление объектами ActiveX на примере MS Office


Чеботарев Игорь

В предыдущей статье я рассказывал, как можно управлять различными окнами программ: активизировать их, передавать в них нажатие клавиш... В этой статье мы зайдем немного дальше и научимся управлять приложениями через ActiveX компоненты. Пожалуй, наиболее популярное и частое применение этих знаний может найти отражение в работе с MS Office, а точнее с Word и Excel. Вот над ними мы сегодня и поиздеваемся (все примеры были протестированы в Офис 2000).

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

//JScript
//Создаем Екселевский объект, с методами и свойствами которого будем работать
var objXL = WScript.CreateObject("Excel.Application");
//Делаем окно видимым и создаем рабочую книгу
objXL.Visible = true;
objXL.WorkBooks.Add;
//Устанавливаем ширину первых трех колонок
objXL.Columns(1).ColumnWidth = 20;
objXL.Columns(2).ColumnWidth = 30;
objXL.Columns(3).ColumnWidth = 40;
//Первая строка будет у нас шапкой таблицы
//Заполняем значения ячеек
objXL.Cells(1, 1).Value = "Название свойства";
objXL.Cells(1, 2).Value = "Значение";
objXL.Cells(1, 3).Value = "Описание";
//Форматируем ячейки, чтобы все было красиво
objXL.Range("A1:C1").Select;
objXL.Selection.Font.Bold = true;
objXL.Selection.Interior.ColorIndex = 1;
objXL.Selection.Interior.Pattern = 1;
objXL.Selection.Font.ColorIndex = 2;
objXL.Columns("B:B").Select;
objXL.Selection.HorizontalAlignment = -4131;
//Вводим счетчик строк, куда будем записывать информацию
var intIndex = 2;
//А эта функция как раз и будет выводить нашу информацию построчно
function Show(strName, strValue, strDesc) {
   objXL.Cells(intIndex, 1).Value = strName;
   objXL.Cells(intIndex, 2).Value = strValue;
   objXL.Cells(intIndex, 3).Value = strDesc;
   intIndex++;
   objXL.Cells(intIndex, 1).Select;
}
//Итак, заполним таблицу данными о версии wscript установленной на компьютере
Show("Name", WScript.Name, "Application Friendly Name");
Show("Version", WScript.Version, "Application Version");
Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name");
Show("Path", WScript.Path, "Application Context: Path Only");
Show("Interactive", WScript.Interactive, "State of Interactive Mode");
//До кучи добавим сведения о параметрах, с которыми запускается скрипт
var colArgs = WScript.Arguments;
Show("Arguments.Count", colArgs.length, "Number of command line arguments");
for (i = 0; i < colArgs.length; i++) {
   objXL.Cells(intIndex, 1).Value = "Arguments(" + i + ")";
   objXL.Cells(intIndex, 2).Value = colArgs(i);
   intIndex++;
   objXL.Cells(intIndex, 1).Select;
}

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

Dim objXL 
Set objXL = WScript.CreateObject("Excel.Application") 
objXL.Visible = TRUE 
objXL.WorkBooks.Add 
objXL.Columns(1).ColumnWidth = 20 
objXL.Columns(2).ColumnWidth = 30 
objXL.Columns(3).ColumnWidth = 40 
objXL.Cells(1, 1).Value = "Название свойства" 
objXL.Cells(1, 2).Value = "Значение" 
objXL.Cells(1, 3).Value = "Описание" 
objXL.Range("A1:C1").Select 
objXL.Selection.Font.Bold = True 
objXL.Selection.Interior.ColorIndex = 1 
objXL.Selection.Interior.Pattern = 1 
objXL.Selection.Font.ColorIndex = 2 
objXL.Columns("B:B").Select 
objXL.Selection.HorizontalAlignment = &hFFFFEFDD 
Dim intIndex 
intIndex = 2 

Sub Show(strName, strValue, strDesc) 
   objXL.Cells(intIndex, 1).Value = strName 
   objXL.Cells(intIndex, 2).Value = strValue 
   objXL.Cells(intIndex, 3).Value = strDesc 
   intIndex = intIndex + 1 
   objXL.Cells(intIndex, 1).Select 
End Sub 

Call Show("Name", WScript.Name, "Application Friendly Name") 
Call Show("Version", WScript.Version, "Application Version") 
Call Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name") 
Call Show("Path", WScript.Path, "Application Context: Path Only") 
Call Show("Interactive", WScript.Interactive, "State of Interactive Mode") 

Dim colArgs 
Set colArgs = WScript.Arguments 
Call Show("Arguments.Count", colArgs.Count, "Number of command line arguments") 

For i = 0 to colArgs.Count - 1 
   objXL.Cells(intIndex, 1).Value = "Arguments(" & i & ")"
   objXL.Cells(intIndex, 2).Value = colArgs(i) 
   intIndex = intIndex + 1
   objXL.Cells(intIndex, 1).Select 
Next

Хорошо, а как быть если надо сделать какое-то действие не описанное здесь? Вполне логичный вопрос. Но описать все возможности встроенного в Офис VB в этой статье (как и в 10 статьях) просто невозможно. Эти сведения вам только в качестве информации к размышлению. А все что сверх этой статьи, изучается довольно просто: запускается Word (Excel), включается запись макроса, выполняются нужные вам действия, а потом на основе сгенерированного кода по аналогии пишется скрипт. Нелишним будет почитать и справку (надеюсь вы ее установили?). Замечу, что для работы с приложениями Офиса легче писать скрипты на VBScript, так как справка по встроенному VB сможет удовлетворить даже самым изысканным потребностям.

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

//JScript 
//Создаем объект для работы с Вордом 
var wrd = new ActiveXObject("Word.Application"); 
//Создаем новый документ 
wrd.Documents.Add(); 
//Получаем указатель на активный документ 
adoc=wrd.ActiveDocument; 
//Указатель на область в документе 
myRange = adoc.Range(Start=0, End=0) 
//Активизируем Ворд 
wrd.Visible = true; 
wrd.Activate(); 
//Создаем таблицу с одной строкой и тремя столбцами 
tb0=adoc.tables.Add(Range=myRange, NumRows=1, NumColumns=3); 
//Задаем ширину столбцов 
tb0.Columns(1).Width = 80; 
tb0.Columns(2).Width = 160; 
tb0.Columns(3).Width = 160; 
//Заполняем заголовок таблицы 
tb0.Cell(1,1).Range.InsertAfter("Название свойства"); 
tb0.Cell(1,2).Range.InsertAfter("Значение"); 
tb0.Cell(1,3).Range.InsertAfter("Описание"); 
//Счетчик строк 
intIndex = 2; 
//Выводимая в строках таблицы информация 
Show("Name", WScript.Name, "Application Friendly Name"); 
Show("Version", WScript.Version, "Application Version"); 
Show("FullName", WScript.FullName, "Application Context: Fully Qualified Name"); 
Show("Path", WScript.Path, "Application Context: Path Only"); 
Show("Interactive", WScript.Interactive, "State of Interactive Mode"); 

//Ну и сама функция для вывода строк 
function Show(strName, strValue, strDesc) { 
   tb0.Rows.Add();
   tb0.Cell(intIndex, 1).Range.InsertAfter(strName);
   tb0.Cell(intIndex, 2).Range.InsertAfter(strValue);
   tb0.Cell(intIndex, 3).Range.InsertAfter(strDesc);
   intIndex++; 
}

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

читать еще по теме