Страницы: 1
RSS
Закрыть с сохранением все копии приложения Excel
 
Всем доброго! Имеется программа(Гранд Смета), которая выгружает файлы в формате xls, запуская для каждого документа свою копию приложения. Как можно реализовать закрытие с сохранением, всех копий приложения в единожды выбранный каталог/папку, без подтверждения каждый раз на отдельном файле?

Пробовал такой найденный на просторах вариант, убивает всё напрочь без сохранения:
Код
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill, strFilePath
strComputer = "."
strProcessKill = "'excel.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill)
For Each objProcess In colProcess
     objProcess.Terminate
Next
Wscript.Quit

Такой вариант сохраняет и закрывает только тот экземпляр из которого вызывается:
Код
Sub SaveAndClose()
With Application
     .EnableEvents = False
     .DisplayAlerts = False
     Dim iBook As Workbook '
     For Each iBook In .Workbooks
         iBook.Save
     Next
     .Quit  
End With
End Sub
 
Доброе время суток.
Цитата
abricos29 написал:
такой найденный на просторах вариант,
В общем-то так далеко на просторы можно было бы и не ходить ;)  Как перебрать все книги во всех экземплярах Excel?
 
Можно и через запуск приложенного VBS-скрипта
Код
' Исправленная версия
Const MyPath = "C:\Temp\"
Dim App, Wb
On Error Resume Next
Do
  Set App = GetObject(, "Excel.Application")
  If Err.Number <> 0 Then Exit Do
  For Each Wb In App.Workbooks
    If Not Wb.Saved Then
      Wb.SaveAs MyPath & Wb.Name
      Wb.Close False
    End If
  Next
  ' Закрытие Excel должно быть вне цикла сохранения книг
  App.Quit
  Set App = Nothing
Loop
Изменено: ZVI - 21.11.2018 01:07:39 (Исправлено - App.Quit вынесено за пределы For-Next, обновлено вложение ))
 
Цитата
ZVI написал:
Можно и через запуск приложенного VBS-скрипта
Владимир, подскажите, а как этот скрипт запустить? Подробнее пожалуйста.
Если открыты 2-3 книги.
 
Всем большое спасибо за ответы!
ZVI, открыл диспетчер задач, имею 2 запущенных копии Excel, запускаю ваш скрипт, первую копию он обрабатывает и сохраняет как положено, со второй копией они вместе попадают в Фоновые процессы и висят там бесконечно долго.
 
Цитата
pitby написал:
а как этот скрипт запустить?
как обычно, двойным кликом на файле!
 
Цитата
pitby написал:
как этот скрипт запустить?
Скачать, открыть архив (если автоматически не откроется) и дабл-кликнуть.
 
Цитата
abricos29 написал:
как обычно, двойным кликом на файле!
Цитата
Казанский написал:
Скачать, открыть архив (если автоматически не откроется) и дабл-кликнуть.
Спасибо, получилось.
 
Цитата
abricos29 написал: со второй копией они вместе попадают в Фоновые процессы и висят там бесконечно долг
Похоже, что последний экземпляр Excel не отпускает породившая его программа. Чтобы проверить это закройте ту программу, а потом запустите скрипт.
 
кнопука цитирования не для бездумного копирования [МОДЕРАТОР]

Делал на работе, сейчас проверил дома скрипт без зависания, но закрывает только одну из множества копий приложения Ecxel. При повторном запуске скрипта закрывалось по одной из копий, и так до нуля.
 
Владимир, у меня скрипт закрывал только один экземпляр пока не было каталога "С:\Temp\"
Ну вроде понятно - не получилось сохранить, получили ошибку, закрылись.
Создал каталог чтоб отрабатывало как задумано - вообще перестал закрывать хоть что-то... Вот тут я не понял :(
 
Откорректировал сообщение #3 и вложение.
Там была моя ошибка - App.Quit внутри For-Next,  а должно быть снаружи, виноват - исправил.
А вместо "C:\Temp\"  должен быть (см. сообщение #1) "единожды выбранный каталог".

При сохранении файла с именем, которое уже есть в папке, Excel ждет подтверждения перезаписи поверх существующего файла. Автоматизирование такой ситуации возможно если знать, что нужно: записатиь поверх, не сохранять, записать с другим именем (например, с датой-временем в имени файла).
Код сохраняет в C:\Temp\ только несохраненные книги, если нужно сохранять все подряд, то закомментируйте 2 строки: If Not Wb.Saved Then и End If
Изменено: ZVI - 21.11.2018 01:10:58
 
ZVI, Большое спасибо за отклик, но к сожалению скрипт по-прежнему закрывает по одной копии приложения(если я их создал руками). А при выпуске из сметной программы и закрытии её же, ДО применения вашего скрипта(возможно она держит файлы), скрипт закрывает только первую копию, в этот же момент создаёт в фоновых процессах копии процесса, и повторное применение скрипта на оставшиеся копии вызывает только кратное увеличение фоновых одноименных процессов, без закрытия оставшихся копий Excel/
 
Компиляция данной темы и решений на других форумах - ТЕСТИРУЙТЕ

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Спасибо за участие! код отлично отрабатывает, если создать копии приложения руками, но опять же, выпущенные из сметной программы копии приложения  Excel закрывает только первую(причём программа-родитель выгружена заранее), затем(судя по Диспетчеру задач) - скрипт вместе с экземпляром Excel попадают в фоновые задачи и там висят до момента пока руками не снимешь задачу. После этого запускаю скрипт снова и он опять закрывает и сохраняет только один из оставшихся экземпляров Excel и дальше всё повторяется по кругу( Ещё раз  спасибо, по сути задача решена, а это уже индивидуальные особенности моей программы, но если есть мысли как её решить, пожалуйста - пишите)
 
abricos29, к сожалению я только скомпилировал то, что нашёл по данной теме в сети. Глубоких познаний я не имею относительно нюансов поведения процессов в зависимости от способа запуска, потому, увы, я вряд ли смогу ещё чем-то помочь.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Наверх