Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 06-01-2021 в 18:43.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:31, 05-01-2021 | #16