Прошу совета для решения следующей задачи. Или дайте какую-либо наводку:-) Есть макрос ниже. Он загружает файл "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
Так начинает загружать файл, но сразу же переходит к строкам 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 сек, проверять, появился ли файл с нужным именем. Только ограничьте общее время ожидания.
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
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
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
Max5 написал: есть способ определения окончания загрузки без циклов проверки.
С Хромом вряд ли без установки дополнительного программного обеспечения (типа Selenium). Но можно скачивать, например, с помощью curl - это сейчас эталон для подобных вещей. Или штатными средствами (если получится).
По вашему коду в сообщении #9: начинается загрузка и тут же появляется окно командной строки. Если на него нажать, то макрос сразу же заканчивается, не дождавшись загрузки. А если дождаться загрузки файла (но тут уже не знаешь, через сколько она закончится:-)) и потом нажать на окно командной строки - то макрос продолжает свое дело.
По коду в сообщении #11: удалил строки 11 и 12 из кода и все заработало, как надо!