Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт, который открывает и закрывает в назначенное время файл Excel (http://forum.oszone.net/showthread.php?t=347466)

v79italya 27-12-2020 20:24 2944366

Скрипт, который открывает и закрывает в назначенное время файл Excel
 
Всем привет!
Не могли бы написать скрипт, который будет открывать в назначенное время файл 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 2944375

v79italya, могли бы. Опишите, пожалуйста, смысл данной задачи.

Vadikan 28-12-2020 01:09 2944394

[решено] Открытие, изменение и сохранение книг Excel
Паузу сами добавьте.
Даты и время запуска - это в планировщике заданий делается.

v79italya 03-01-2021 10:51 2944900

Здравствуйте!
С Новым годом!
Извиняюсь что не следил за темой - на работе годовые отчеты, еще и зарплату надумали дать до праздника - пришлось каждому сотруднику выхлопы считать.
Цитата:

Цитата Iska
Опишите, пожалуйста, смысл данной задачи »

В книге макрос, который надо время от времени запускать. Как запускать макрос при открытии файла - уже нашел.
Цитата:

Цитата Vadikan
Даты и время запуска - это в планировщике заданий делается »

Про планировщик знаю, но хотел бы скриптом это проделывать.

DJ Mogarych 03-01-2021 11:54 2944909

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 2944929

v79italya,
Цитата:

Цитата v79italya
который будет открывать в назначенное время файл Excel, а через десять минут после открытия закрывать. »

Цитата:

Цитата v79italya
В книге макрос, который надо время от времени запускать. Как запускать макрос при открытии файла - уже нашел »

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

v79italya 03-01-2021 18:00 2944931

Цитата:

Цитата DJ Mogarych
Powershell »

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

Цитата:

Цитата megaloman
или другие времена имеют место впоследствии быть? »

Да, будут другие точки времени.
Задумывалось так: зарядить ружье раз в две недели и пусть стреляет по команде.
Вообще ноутбук будет выключаться и включаться и скорее всего скрипт надо по новой запускать. Но это секундное дело.
Цитата:

Цитата megaloman
Ладно бы запускать Excel по времени, а закрывать то как? Как минимум, надо это делать корректно, книгу, ИМХО, следует сохранить »

закрывать минут через десять, а сохранить изменения в файле можно и в Vba.
Код от DJ Mogarych таким простым для изменений кажется. Запустить бы еще

Iska 03-01-2021 19:19 2944934

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

v79italya 03-01-2021 20:26 2944940

Цитата:

Цитата Iska
самое правильное »

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

Iska 03-01-2021 21:21 2944943

Цитата:

Цитата v79italya
Поэтому скрипту отведено только открытие и закрытие файла. »

v79italya, закрытие — здесь лишнее. Последнее должно быть предоставлено макросу.

v79italya 04-01-2021 05:09 2944963

Цитата:

Цитата Iska
закрытие — здесь лишнее. Последнее должно быть предоставлено макросу. »

Согласен. Открытие за скриптом, все остальное - макросом

Vadikan 04-01-2021 09:58 2944965

Цитата:

Цитата v79italya
Про планировщик знаю, но хотел бы скриптом это проделывать. »

Объясните, почему вы хотите странного.То есть вы бы хотели, чтобы скрипт всегда висел запущенный и проверял заданное вами время каждые N минут? А если скрипт зависнет или пользователь закроет, что тогда?

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

DJ Mogarych 04-01-2021 10:12 2944967

Ну, по идее, скрипт в этом варианте надо запускать в планировщике каждую минуту.
А вообще, конечно, в скрипт нужно перенести всё то, что делает макрос, чтобы решение было не таким костыльным.

Vadikan 04-01-2021 11:58 2944976

Цитата:

Цитата DJ Mogarych
о идее, скрипт в этом варианте надо запускать в планировщике каждую минуту. »

Ну вот и получается, что если все равно через планировщик, то проще создать задание с триггерами на запуск в конкретное время, чем гонять ежеминутно :)

v79italya 04-01-2021 17:39 2945013

Цитата:

Цитата Vadikan
вы бы хотели, чтобы скрипт всегда висел запущенный и проверял заданное вами время каждые N минут? »

Да, пусть висит. Что он много памяти жрет? У меня в трее все время значек блютуз висит, а я ни разу не сокрушался.
Цитата:

Цитата Vadikan
А если скрипт зависнет или пользователь закроет, что тогда? »

Пусть тоже в трее какой нибудь значок висит. Нет значка - значит закрылся скрипт, покраснел значок - значит завис.
Цитата:

Цитата DJ Mogarych
скрипт в этом варианте надо запускать в планировщике каждую минуту.
А вообще, конечно, в скрипт нужно перенести всё то, что делает макрос »

Можно запускать каждые десять минут и отслеживать ближайшую точку времени - если до нее меньше десяти минут, то запустить открытие файла.
Мне в скрипт переносить всю работу макроса не надо. Причина: не разбираюсь в скриптах и ничего без помощи не смогу сделать. К тому же в файле может быть запрос Power Query, который обновляет макрос и сохраняет изменения.
Как то так

megaloman 05-01-2021 14:31 2945070

v79italya,
Вариант решения (сохраните код в файл.vbs), как Вы поставили задачу
Код:

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 2945092

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

v79italya 06-01-2021 17:00 2945194

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

megaloman 06-01-2021 18:55 2945205

Вложений: 1
Цитата:

Цитата v79italya
если открыт еще файл Excel и он активный, то может закрыть вместо нужного активный »

Не вместо, а вместе. Попробуйте вместо красного куска просто
Код:

                xls.Quit
У меня такой вариант не всегда корректно отрабатывает.
Цитата:

Цитата v79italya
Еще реагирует на кириллицу в пути. »

Скрипт должен быть сохранен в 1251 кодировке (Например, стандартный Notepad). На всякий случай, прикрепляю заархивированный скрипт в правильной кодировке.

v79italya 07-01-2021 17:53 2945308

megaloman, попробую завтра опробовать
Спасибо!


Время: 20:20.

Время: 20:20.
© OSzone.net 2001-