Войти

Показать полную графическую версию : [решено] Скрипт, который открывает и закрывает в назначенное время файл Excel


v79italya
27-12-2020, 20:24
Всем привет!
Не могли бы написать скрипт, который будет открывать в назначенное время файл Excel, а через десять минут после открытия закрывать.
Например, в коде перечислить определенные даты и время, в которые надо открыть файл.

28.12.20 12:30
28.12.20 19:45
30.12.20 2:35
30.12.20 5:10
02.01.21 14:00
02.01.21 16:32
04.01.21 19:30
04.01.21 21:10

C:\Users\Администратор\Desktop\Новая папка\Лист Excel.xlsx

Iska
27-12-2020, 22:22
v79italya, могли бы. Опишите, пожалуйста, смысл данной задачи.

Vadikan
28-12-2020, 01:09
[решено] Открытие, изменение и сохранение книг Excel (http://forum.oszone.net/thread-248610.html)
Паузу сами добавьте.
Даты и время запуска - это в планировщике заданий делается.

v79italya
03-01-2021, 10:51
Здравствуйте!
С Новым годом!
Извиняюсь что не следил за темой - на работе годовые отчеты, еще и зарплату надумали дать до праздника - пришлось каждому сотруднику выхлопы считать.
Опишите, пожалуйста, смысл данной задачи »
В книге макрос, который надо время от времени запускать. Как запускать макрос при открытии файла - уже нашел.
Даты и время запуска - это в планировщике заданий делается »
Про планировщик знаю, но хотел бы скриптом это проделывать.

DJ Mogarych
03-01-2021, 11:54
Powershell:

$t = (get-date).ToString("dd.MM.yy H:mm")

if (
$t -eq "03.01.21 11:47" -or `
$t -eq "28.12.20 12:30" -or `
$t -eq "28.12.20 19:45" -or `
$t -eq "30.12.20 2:35" -or `
$t -eq "30.12.20 5:10" -or `
$t -eq "02.01.21 14:00" -or `
$t -eq "02.01.21 16:32" -or `
$t -eq "04.01.21 19:30" -or `
$t -eq "04.01.21 21:10"
) {
& "C:\Users\Администратор\Desktop\Новая папка\Лист Excel.xlsx"
sleep 600
get-Process excel |stop-process
}

megaloman
03-01-2021, 17:25
v79italya, который будет открывать в назначенное время файл Excel, а через десять минут после открытия закрывать. »В книге макрос, который надо время от времени запускать. Как запускать макрос при открытии файла - уже нашел »Это очень опасная постановка. Что, после указания последнего времени жизнь скрипта завершилась, или другие времена имеют место впоследствии быть? Ладно бы запускать Excel по времени, а закрывать то как? Как минимум, надо это делать корректно, книгу, ИМХО, следует сохранить. Почему макрос в самой таблице не может сам подождать нужное время, сохранить таблицу и завершить работу Excel?
ИМХО, если времена постоянно будут обновляться, то надо, по видимому, выносить список во внешний файл и перепрочитывать его, допустим, каждую минуту. Хотелось бы, если что-то делать, делать это более осознанно.

v79italya
03-01-2021, 18:00
Powershell »
Спасибо. Только как пользоваться?
Я вставил код в файл .тхт. Затем изменил расширение на .ps1
ПКМ - Выполнить с помощью PowerShell. Запустилась cmd, промелькнула красная строка и закрылось cmd.
Начал ждать, но ничего не произошло.

или другие времена имеют место впоследствии быть? »
Да, будут другие точки времени.
Задумывалось так: зарядить ружье раз в две недели и пусть стреляет по команде.
Вообще ноутбук будет выключаться и включаться и скорее всего скрипт надо по новой запускать. Но это секундное дело.
Ладно бы запускать Excel по времени, а закрывать то как? Как минимум, надо это делать корректно, книгу, ИМХО, следует сохранить » закрывать минут через десять, а сохранить изменения в файле можно и в Vba.
Код от DJ Mogarych таким простым для изменений кажется. Запустить бы еще

Iska
03-01-2021, 19:19
v79italya, самое правильное — не «открывать Рабочую книгу Microsoft Excel, как запускать макрос при открытии файла - уже нашел», а вынести весь код макроса во внешний скрипт WSH/PowerShell, который будет исполняться в потребные интервалы времени, и каковой и будет осуществлять потребную обработку указанной Рабочей книги.

v79italya
03-01-2021, 20:26
самое правильное »
Я не спорю, так как не знаю что правильнее. Но я вам верю)
Только мне макрос легче изменить чем скрипты. Поэтому скрипту отведено только открытие и закрытие файла. Иначе за каждым изменением скрипта придется обращаться за помощью на форумы что не очень то и хотелось бы.

Iska
03-01-2021, 21:21
Поэтому скрипту отведено только открытие и закрытие файла. »
v79italya, закрытие — здесь лишнее. Последнее должно быть предоставлено макросу.

v79italya
04-01-2021, 05:09
закрытие — здесь лишнее. Последнее должно быть предоставлено макросу. »
Согласен. Открытие за скриптом, все остальное - макросом

Vadikan
04-01-2021, 09:58
Про планировщик знаю, но хотел бы скриптом это проделывать. »
Объясните, почему вы хотите странного.То есть вы бы хотели, чтобы скрипт всегда висел запущенный и проверял заданное вами время каждые N минут? А если скрипт зависнет или пользователь закроет, что тогда?

Я вот не представляю, как будет работать вариант запуска по времени от DJ Mogarych. В смысле, я представляю, что надо в нем допиливать ради вашей странной хотелки.

DJ Mogarych
04-01-2021, 10:12
Ну, по идее, скрипт в этом варианте надо запускать в планировщике каждую минуту.
А вообще, конечно, в скрипт нужно перенести всё то, что делает макрос, чтобы решение было не таким костыльным.

Vadikan
04-01-2021, 11:58
о идее, скрипт в этом варианте надо запускать в планировщике каждую минуту. »
Ну вот и получается, что если все равно через планировщик, то проще создать задание с триггерами на запуск в конкретное время, чем гонять ежеминутно :)

v79italya
04-01-2021, 17:39
вы бы хотели, чтобы скрипт всегда висел запущенный и проверял заданное вами время каждые N минут? »
Да, пусть висит. Что он много памяти жрет? У меня в трее все время значек блютуз висит, а я ни разу не сокрушался.
А если скрипт зависнет или пользователь закроет, что тогда? »
Пусть тоже в трее какой нибудь значок висит. Нет значка - значит закрылся скрипт, покраснел значок - значит завис.
скрипт в этом варианте надо запускать в планировщике каждую минуту.
А вообще, конечно, в скрипт нужно перенести всё то, что делает макрос »
Можно запускать каждые десять минут и отслеживать ближайшую точку времени - если до нее меньше десяти минут, то запустить открытие файла.
Мне в скрипт переносить всю работу макроса не надо. Причина: не разбираюсь в скриптах и ничего без помощи не смогу сделать. К тому же в файле может быть запрос Power Query, который обновляет макрос и сохраняет изменения.
Как то так

megaloman
05-01-2021, 14:31
v79italya, FileXlsm = "C:\Users\Администратор\Desktop\Новая папка\Лист Excel.xlsm"
FileSpis = "C:\Users\Администратор\Desktop\Новая папка\Лист Excel.xlsm.txt"
WaitSek = 600 'Подождать перед закрытием Excel (сек)
LoopSek = 60 'Цикл повтора опроса расписания (сек)
IfSek = 59 'Точность сравнения текущего времени и времени задания (сек)

If ReadSpis(FileSpis, MasSpis) = 0 Then WScript.Quit 'Exit Sub

Do
For Each D In MasSpis
If IsDate(D) Then
If Abs(DateDiff("s", Now, D)) <= IfSek Then

Set xls = CreateObject("Excel.Application")
xls.Visible = True ' False
xls.Workbooks.Open (FileXlsm)

WScript.Sleep (WaitSek * 1000)

xls.ActiveWorkbook.Save

xls.ActiveWorkbook.Close
' xls.Quit

Set WMI = GetObject("winMgmts:").ExecQuery("SELECT * From Win32_Process WHERE Name='Excel.exe'")
For Each P In WMI
P.Terminate()
Next
Exit For

End If
End If
Next

NDate = 0
For Each D In MasSpis
If IsDate(D) Then If DateDiff("s", Now, D) > 0 Then NDate = NDate + 1
Next

If NDate = 0 Then NDate = ReadSpis(FileSpis, MasSpis)
If NDate > 0 Then WScript.Sleep (LoopSek * 1000)
Loop While NDate > 0

'=========================================================

Function ReadSpis(FileSpis, MasSpis)
ReadSpis = 0
With CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set fIn = .OpenTextFile(FileSpis, 1, False)

Err.Number = 0
MasSpis = Split(fIn.ReadAll, vbCrLf)
fIn.Close

If Err.Number = 0 Then
For Each D In MasSpis
If IsDate(D) Then If DateDiff("s", Now, D) > 0 Then ReadSpis = ReadSpis + 1
Next
End If

On Error GoTo 0
End With
If ReadSpis = 0 Then MsgBox "Не удалось прочесть актуальные данные" + vbCrLf + FileSpis + vbCrLf + "Скрипт завершается"
End FunctionКак это работает:
В текстовом файле есть расписание запуска Excel, например04.01.21 22:17
04.01.21 21:22
04.01.21 21:24
05.01.21 14:02

В скрипте надо указать путь к этому файлу и к запускаемому Excel-файлу. Кстати, если у Вас в Excel-файле есть макрос, не может быть у него расширение .xlsx, как Вы указали в своём вопросе.
При запуске скрипта прочитывается файл с расписанием и пока это расписание не исчерпается, этот файл перепрочитываться не будет.
Скрипт будет висеть запущенным, с заданным интервалом анализировать расписание, запускать Excel во время, близкое к расписанию с заданной погрешностью, ждёт указанное время, затем сохраняет файл, закрывает его, прекращает работу Excel.
При исчерпании расписания скрипт попытается заново прочесть файл с расписанием, если файл обновлен и в нём присутствуют времена исполнения больше текущего, скрипт продолжит работу, иначе его работа будет завершена.

v79italya
05-01-2021, 20:16
megaloman, большое спасибо!
Попробую завтра, при свободном времени, опробовать. По описанию, я так понял, Вы в коде все предусмотрели. Без регулярного перечитывания.Даже вывод сообщений на случай ошибочных данных или завершения работы скрипта. Еще и сохранение изменений в файле. Спасибо!

v79italya
06-01-2021, 17:00
megaloman, все работает!
Поначалу не мог запустить на windows 10. Не мог создать файл с расширением .vbs
Установил Notepad+, но он сохранял текстовый файл в .vb. Я еще не сразу понял и часа два возился с .vb-файлом. Потом уже в сети скачал готовый скрипт.vbs и заменил код.
Все круто! Единственное, если открыт еще файл Excel и он активный, то может закрыть вместо нужного активный. Еще реагирует на кириллицу в пути.
А так скрипт просто супер! Спасибо большое!

megaloman
06-01-2021, 18:55
если открыт еще файл Excel и он активный, то может закрыть вместо нужного активный »Не вместо, а вместе. Попробуйте вместо красного куска просто xls.Quit
У меня такой вариант не всегда корректно отрабатывает.Еще реагирует на кириллицу в пути. »Скрипт должен быть сохранен в 1251 кодировке (Например, стандартный Notepad). На всякий случай, прикрепляю заархивированный скрипт в правильной кодировке.

v79italya
07-01-2021, 17:53
megaloman, попробую завтра опробовать
Спасибо!




© OSzone.net 2001-2012