Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Рецепты Windows Scripting: использование COM-серверов MS Office в скриптах

Программы Microsoft Office предоставляют ряд COM-серверов (например, "Word.Application", или "Excel.Application"), которые чаще всего используются для автоматизации работы с различными документами Microsoft Office. Однако, в сценариях Windows Script Host (или в любых других средах, могущих выступить в роли OLE-клиента, например, в 1С:Предприятии) данные COM-сервера могут быть использованы и для более экзотических целей, о чём и пойдёт речь в данной статье. Примеры кода приводятся на языке VBScript для административных сценариев Windows.

Использование диалогов открытия и сохранения файлов

Windows Script Host не имеет встроенных средств для вызова стандартных диалогов выбора файлов "Открыть" и "Сохранить". Вы можете обойти эту проблему, если у вас есть MS Office. Следующий скрипт демонстрирует возможность использования диалогов открытия и сохранения файлов MS Excel:

Set Excel = CreateObject("Excel.Application")
ExcelFilter = "Все файлы,*.*,Текстовые файлы,*.txt" 'фильтры файлов в окне открытия файла
FilterIndex = 1 'текущий фильтр - "Все файлы"
'==================================================================================================
Caption = "Выберите, пожалуйста, файл:" 'заголовок окна открытия файла
FilePath = Excel.GetOpenFileName(ExcelFilter, FilterIndex, Caption,, True) 'True - разрешён выбор нескольких файлов
If LCase(TypeName(FilePath)) = "boolean" Then
	MsgBox "Ничего не выбрано!"
ElseIf LCase(TypeName(FilePath)) = "string" Then
	MsgBox "Выбран файл: """ & FilePath & """"
Else 'разрешён выбор нескольких файлов, возвращается массив
	MsgBox "Выбраны файлы: " & vbCrLf & Join(FilePath, vbCrLf)
End If
'==================================================================================================
Caption = "Задайте, пожалуйста, файл:" 'заголовок окна сохранения файла
InitialFilename = "c:\boot.ini" 'начальный путь
FilePath = Excel.GetSaveAsFileName(InitialFilename, ExcelFilter, FilterIndex, Caption)
If LCase(TypeName(FilePath)) = "boolean" Then
	MsgBox "Ничего не задано!"
ElseIf LCase(TypeName(FilePath)) = "string" Then
	MsgBox "Задан файл: """ & FilePath & """"
End If
'==================================================================================================
Excel.Quit

Конвертация форматов файлов (Save As...) с помощью Excel и Word.

Приложения MS Office поддерживают довольно большое количество форматов файлов и позволяют конвертировать эти форматы друг в друга. Различным форматам файлов соответствуют константы, предопределённые в языке VBA в MS Office. Названия всех констант, соответствующих форматам файлов, можно найти в справке VBA, воспользовавшись поиском, например, по словам "FileFormat Property". Можно узнать числовое значение той или иной константы, напечатав её имя в текстовом редакторе VBA, а затем нажав Ctrl+I. Поскольку в Windows Script Host эти константы по умолчанию не определены, в скрипте их придётся объявить специально, например:

const xlCSV = 6
const xlTextMSDOS = 21
const xlWorkbookNormal = -4143
const wdFormatRTF = 6
const wdFormatDocument = 0
const wdFormatText = 2
const wdFormatDOSText = 4

После того, как нужные константы объявлены, можно заниматься непосредственно конвертацией. Вот так может выглядеть преобразование текстового файла к кодировке MS DOS с помощью MS Word:

Set WordApp = CreateObject("Word.Application")
WordApp.Documents.Open "C:\TEMP\Test.txt"
WordApp.ActiveDocument.SaveAs "C:\TEMP\Test2", wdFormatDOSText
WordApp.Quit

То же самое с помощью MS Excel:

Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
ExcelApp.WorkBooks.Open "C:\TEMP\Test.txt"
ExcelApp.ActiveWorkbook.SaveAs "C:\TEMP\Test2.txt", xlTextMSDOS
ExcelApp.Quit

Преобразование DBF-файла в рабочую книгу Excel:

Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
ExcelApp.WorkBooks.Open "C:\TEMP\1SCONST.DBF"
ExcelApp.ActiveWorkbook.SaveAs "C:\TEMP\Test.xls", xlWorkbookNormal
ExcelApp.Quit

Преобразование DBF-файла в текстовый CSV-файл:

Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
ExcelApp.WorkBooks.Open "C:\TEMP\1SCONST.DBF"
ExcelApp.ActiveWorkbook.SaveAs "C:\TEMP\Test.csv", xlCSV
ExcelApp.Quit

Естественно, приведённые выше примеры не исчерпывают всех возможностей конвертации форматов файлов.

Запуск процедур и функций VBA из существующего документа MS Office

Следующий скрипт демонстрирует возможность запуска функции, написанной на VBA, из существующей книги Excel. Функции, написанные на VBA, могут получать параметры из скрипта и возвращать значение в скрипт:

Set objExcel = CreateObject("Excel.Application")
objExcel.WorkBooks.Open "C:\MyWorkBook.xls" 'открытие книги Excel
Param1 = "" 'подготовка параметров для передачи в функцию
Param2 = ""
'вызов функции и получение значения, которое она возвращает:
Result = objExcel.Application.Run("MyFunction", Param1, Param2)
objExcel.Quit

Таким образом, вы можете писать процедуры и функции на VBA, используя специфические возможности VBA, а затем вызывать их из скриптов Windows Script Host. Примечание: если запускаемая из vb-скрипта функция VBA вызывает диалоговую форму VBA, эта форма будет отображена!

Динамическое создание и запуск процедур и функций VBA

Следующий скрипт демонстрирует возможность динамического создания и запуска процедур и функций VBA с параметрами (в т.ч. с использованием функций Win32 API в среде VBA). Для возможности работы скрипта необходимо установить флажок "Доверять доступ к Visual Basic Project" на вкладке "Надежные издатели" диалога "Безопасность" в соответствующем приложении (Word или Excel) через меню "Сервис" - "Макрос" - "Безопасность...". Также возможно потребуется снять флажок "Require Variable Declaration" на вкладке "Editor" окна "Options" редактора VBA (меню "Tools" - "Options..."), чтобы VBE не пыталась автоматически вставлять инструкцию "Option Explicit".

'Создание объекта Word:
'Set objOffice = CreateObject("Word.Application")
'objOffice.Documents.Add
'Примечание: если в момент запуска этого скрипта Word уже запущен, в момент удаления временного
'модуля VBA произойдёт конфликт доступа к Normal.dot.

'Создание объекта Excel:
Set objOffice = CreateObject("Excel.Application")
objOffice.DisplayAlerts = False
Set objWorkBook = objOffice.WorkBooks.Add
objWorkBook.Worksheets.Add

i = objOffice.VBE.ActiveVBProject.VBComponents.Count
objOffice.VBE.ActiveVBProject.VBComponents.Add 1
Set objModule = objOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1)
With objModule.CodeModule
	.InsertLines 1,  "Public Declare Function Beep Lib ""kernel32"" _"
	.InsertLines 2,  "(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long"
	.InsertLines 3,  "Sub TestSub(Caption as String, Text as String)"
	.InsertLines 4,  "	MsgBox Text, vbOkOnly + vbInformation, Caption"
	.InsertLines 5,  "End Sub"
	.InsertLines 6,  "Sub TestBeep()"
	.InsertLines 7,  "	res = Beep(500, 100)"
	.InsertLines 8,  "	res = Beep(550, 100)"
	.InsertLines 9,  "	res = Beep(600, 100)"
	.InsertLines 10, "	res = Beep(650, 100)"
	.InsertLines 11, "	res = Beep(700, 100)"
	.InsertLines 12, "	res = Beep(650, 100)"
	.InsertLines 13, "	res = Beep(600, 100)"
	.InsertLines 14, "	res = Beep(550, 100)"
	.InsertLines 15, "	res = Beep(500, 700)"
	.InsertLines 16, "End Sub"
End With
objOffice.Application.Run "TestSub", "Test VBA", "Сейчаc будет произведён вызов Win32 API функции Beep()..."
objOffice.Application.Run "TestBeep"
'Следующая строка нужна, если используется Word:
'objOffice.VBE.ActiveVBProject.VBComponents.Remove objModule
objOffice.Quit

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

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.