Уважаемые профи! Помогите пожалуйста автоматизировать сохранение вновь созданной книги. Есть стороннее ПО из которого данные передаются в приложение Еxcel в формате книги .xls (2003).
Поскольку при этом в окне Excel не подгружаются установленные надстройки (в том числе личная книга макросов - personal.xlsb) делаю вывод, что новое окно (приложение) Excel запускается в режиме автоматизации. Проблема описана вот в этой теме (архив):
Появились ли какие-то иные (новые) способы решения проблемы?
Конкретно моя задача такая. При появлении новой книги с экспортированными из стороннего ПО данными, программно сделать следующее:
Отследить появление книги и сохранить её, но уже в 2007 формате (.xlsx) с именем файла из ячейки A1 первого листа, по заданному мной пути, например H:\, и закрыть эту книгу и приложение Excel в котором она появилась. И зациклить это дело, т.е. при экспорте книга должна сразу без манипуляций со стороны пользователя сохраняться по требуемому пути и закрывать приложение Excel в котором она создана не трогая другие открытые книги (вообще во время работы этого цикла нужно чтобы была всегда открыта ещё 1 книга из файла) и далее по циклу. Задача облегчается тем, что имя (и путь к файлу) открытой книги не меняется и заранее известно ("AlwaysOpen"), а имя появляющихся книг всегда содержит текст "123"
Желательно это сделать штатными средствами, доступными в Windows 7 + Excel 2007, через VBA (не нашел, что VBA такое позволяет), PowerShell, VBScript, JScript и т.п.
Сам нашел такие варианты кода под похожие задачи:
1) VBScript, отслеживание нового процесса Excel и закрытие его, но мне не удалось модифицировать код под мою задачу, как я понял процесс нельзя привязать к COM-объекту Excel (поправьте если не прав):
2) VBScript, при одноразовом применении на уже созданной книге работает, но не удалось зациклить и добиться отслеживания вновь создаваемых книг и почему-то код закрывает все книги, а не только ту, где есть "123" в имени книги:
Поскольку при этом в окне Excel не подгружаются установленные надстройки (в том числе личная книга макросов - personal.xlsb) делаю вывод, что новое окно (приложение) Excel запускается в режиме автоматизации. Проблема описана вот в этой теме (архив):
Появились ли какие-то иные (новые) способы решения проблемы?
Конкретно моя задача такая. При появлении новой книги с экспортированными из стороннего ПО данными, программно сделать следующее:
Отследить появление книги и сохранить её, но уже в 2007 формате (.xlsx) с именем файла из ячейки A1 первого листа, по заданному мной пути, например H:\, и закрыть эту книгу и приложение Excel в котором она появилась. И зациклить это дело, т.е. при экспорте книга должна сразу без манипуляций со стороны пользователя сохраняться по требуемому пути и закрывать приложение Excel в котором она создана не трогая другие открытые книги (вообще во время работы этого цикла нужно чтобы была всегда открыта ещё 1 книга из файла) и далее по циклу. Задача облегчается тем, что имя (и путь к файлу) открытой книги не меняется и заранее известно ("AlwaysOpen"), а имя появляющихся книг всегда содержит текст "123"
Желательно это сделать штатными средствами, доступными в Windows 7 + Excel 2007, через VBA (не нашел, что VBA такое позволяет), PowerShell, VBScript, JScript и т.п.
Сам нашел такие варианты кода под похожие задачи:
1) VBScript, отслеживание нового процесса Excel и закрытие его, но мне не удалось модифицировать код под мою задачу, как я понял процесс нельзя привязать к COM-объекту Excel (поправьте если не прав):
| Код |
|---|
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent " _
& " WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
i = 0
Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
If objLatestProcess.TargetInstance.Name = "EXCEL.EXE" Then
objLatestProcess.TargetInstance.Terminate()
End If
Loop
|
| Код |
|---|
On Error Resume Next Dim objXL, WB Set objXL = GetObject(, "Excel.Application") Set WB = objXL.ActiveWorkbook If Not TypeName(objXL) = "Empty" Then If Not TypeName(WB) = "Nothing" Then If Instr(1, objXL.ActiveWorkbook.Name, "123", vbTextCompare) > 0 then objXL.ActiveWorkbook.SaveAs "H:\" & objXL.ActiveWorkbook.Worksheets(1).Cells(1, 1).Value & ".xlsx" objXL.ActiveWorkbook.Close objXL.Application.Quit End If End If End If |
Изменено: - 10.07.2016 00:01:29