Перейти на главную страничку сайта (список статей, файлы для скачивания)
Программы 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
Приложения 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, из существующей книги 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 с параметрами (в т.ч. с использованием функций 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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.