Страницы: 1
RSS
Продолжение работы макроса после скачивания файла из Интернета
 
Всем привет!

Прошу совета для решения следующей задачи. Или дайте какую-либо наводку:-)
Есть макрос ниже. Он загружает файл "d125.zip" из интернета. Время загрузки всегда разное, но за 7 минут (3 строка макроса) укладывается, когда компьютер ничем не занят. После того, как файл загружен, следуют другие действия макроса.
Однако, если ещё что-нибудь делать на компьютере, то загрузка не укладывается в 7 минут. В этом случае, макрос не выполняет последующие действия с файлом (строка 4 и 5).
Подскажите, пожалуйста, что прописать в макросе, чтобы действия с загруженным файлом (строки 4 и 5) макросом всегда выполнялись. Я полагаю, что нужно исключить строку 3 из макроса и вставить какую-либо проверку на завершение скачивания.

Код
Sub Скачать()
Shell ("C:\Program Files\Google\Chrome\Application\chrome.exe -url https://static.qbs.com/d125.zip")
Application.Wait (Now + TimeValue("0:07:00"))
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.MoveFile "C:\Users\Максим\Downloads\d125.zip", "C:\Users\М\Исходные\"
End Sub
Изменено: Max5 - 10.09.2021 12:39:44
 
В таком варианте будет ждать завершения скачивания.
Код
CreateObject("WScript.Shell").Run """" & "C:\Program Files\Google\Chrome\Application\chrome.exe -url https://static.qbs.com/d125.zip" & """", 1, True

 
МатросНаЗебре,

Не получается. Показывает ошибку на 3 строке.
Может, я что-то не так делаю?

Код
Sub Скачать()
Shell ("C:\Program Files\Google\Chrome\Application\chrome.exe -url https://www.vostbank.ru/upload/iblock/ab6/prilozhenie-n-10.pdf.zip")
CreateObject("WScript.Shell").Run """" & "C:\Program Files\Google\Chrome\Application\chrome.exe -url https://www.vostbank.ru/upload/iblock/ab6/prilozhenie-n-10.pdf.zip" & """", 1, True

Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.MoveFile "C:\Users\Максим\Downloads\prilozhenie-n-10.pdf.zip.pdf", "C:\Users\Максим\Desktop\"

MsgBox "Макрос закончил работу."

End Sub
 
Эта строка не нужна. Но, дело, по всей видимости, не в этом.
Код
Shell ("C:\Program Files\Google\Chrome\Application\chrome.exe -url https://www.vostbank.ru/upload/iblock/ab6/prilozhenie-n-10.pdf.zip")


 
Да, ее я тоже удалял и пробовал без нее. Тогда сразу выдает ошибку.
 
А так?
Код
CreateObject("WScript.Shell").Run """" & "C:\Program Files\Google\Chrome\Application\chrome.exe"" -url https://www.vostbank.ru/upload/iblock/ab6/prilozhenie-n-10.pdf.zip", 1, True
 
Так начинает загружать файл, но сразу же переходит к строкам 3 и 4, не дожидаясь окончания загрузки. Соответственно, получается ошибка "Run-time error'53': File not found".

Код
Sub Скачать()
CreateObject("WScript.Shell").Run """" & "C:\Program Files\Google\Chrome\Application\chrome.exe"" -url https://www.vostbank.ru/upload/iblock/ab6/prilozhenie-n-10.pdf.zip", 1, True
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.MoveFile "C:\Users\Максим\Downloads\prilozhenie-n-10.pdf.zip.pdf", "C:\Users\Максим\Desktop\"

MsgBox "Макрос закончил работу."

End Sub
 
"Хром" скачивает файл в асинхронном режиме.  Можете после выдачи команды на загрузку файла в цикле через паузу, например, на 20 сек, проверять, появился ли файл с нужным именем. Только ограничьте общее время ожидания.
Изменено: sokol92 - 10.09.2021 15:02:50
Владимир
 
А так?
Код
Sub Скачать()
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Dim bat As String
    bat = ThisWorkbook.Path & "\url.bat"
    With FSO.OpenTextFile(bat, 2, True)
        .WriteLine """C:\Program Files\Google\Chrome\Application\chrome.exe"" -url https://static.qbs.com/d125.zip"
        .WriteLine "pause"
        .WriteLine "DEL """ & bat & """"
        .Close
    End With
    CreateObject("WScript.Shell").Run """" & bat, 1, True
    FSO.MoveFile "C:\Users\Максим\Downloads\prilozhenie-n-10.pdf.zip.pdf", "C:\Users\Максим\Desktop\"
    
    MsgBox "Макрос закончил работу."
End Sub
 
sokol92,

Да, это вариант. Но думал, что, может, есть способ определения окончания загрузки без циклов проверки...
 
И такой вариант.
Код
Sub Скачать()
    Shell ("C:\Program Files\Google\Chrome\Application\chrome.exe -url https://static.qbs.com/d125.zip")
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
'    Dim FSO As New FileSystemObject
    Do
        Application.Wait (Now + TimeValue("0:00:05"))
        If FSO.FileExists("C:\Users\Максим\Downloads\d125.zip") Then
            
            On Error Resume Next
            FSO.DeleteFile "C:\Users\М\Исходные\Downloads\d125.zip"
            Err.Clear
            FSO.MoveFile "C:\Users\Максим\Downloads\d125.zip", "C:\Users\М\Исходные\"
            If Err = 0 Then Exit Do
            On Error GoTo 0
            DoEvents
        End If
    Loop
    On Error GoTo 0
End Sub
 
С ограничением времени ожидания из #8.
Код
Sub Скачать()
    Shell ("C:\Program Files\Google\Chrome\Application\chrome.exe -url https://static.qbs.com/d125.zip")
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
'    Dim FSO As New FileSystemObject
    Dim dt As Date
    dt = Now
    Do
        Application.StatusBar = Now & " downloading..."
        Application.Wait (Now + TimeValue("0:00:05"))
        If FSO.FileExists("C:\Users\Максим\Downloads\d125.zip") Then
            
            On Error Resume Next
            FSO.DeleteFile "C:\Users\М\Исходные\Downloads\d125.zip"
            Err.Clear
            FSO.MoveFile "C:\Users\Максим\Downloads\d125.zip", "C:\Users\М\Исходные\"
            If Err = 0 Then
                MsgBox "Файл скачан.", vbInformation
                Exit Do
            End If
            On Error GoTo 0
            DoEvents
        End If
        
        If dt < Now - TimeSerial(0, 10, 0) Then
            MsgBox "Файл не скачан.", vbExclamation
            Exit Do
        End If
    Loop
    On Error GoTo 0
    Application.StatusBar = False
End Sub
Изменено: МатросНаЗебре - 10.09.2021 15:25:34
 
Цитата
Max5 написал:
есть способ определения окончания загрузки без циклов проверки.
С Хромом вряд ли без установки дополнительного программного обеспечения (типа Selenium). Но можно скачивать, например, с помощью curl - это сейчас эталон для подобных вещей. Или штатными средствами (если получится).
Владимир
 
МатросНаЗебре,

По вашему коду в сообщении #9: начинается загрузка и тут же появляется окно командной строки. Если на него нажать, то макрос сразу же заканчивается, не дождавшись загрузки. А если дождаться загрузки файла (но тут уже не знаешь, через сколько она закончится:-)) и потом нажать на окно командной строки - то макрос продолжает свое дело.

По коду в сообщении #11: удалил строки 11 и 12 из кода и все заработало, как надо!
Код
FSO.DeleteFile "C:\Users\М\Исходные\Downloads\d125.zip"
Err.Clear

По коду в сообщении #12: удалил эти же строки и все заработало!
Код
FSO.DeleteFile "C:\Users\М\Исходные\Downloads\d125.zip"
Err.Clear

Спасибо за помощь! Посмотрите личные сообщения:-)
 
Err.Clear не удаляйте. Может уйти в "бесконечный" цикл. Ну, по крайней мере, до ограничения по времени.
 
Хорошо.
Страницы: 1
Наверх