Добрый день всем. Есть вот такая вот страница Мне необходимо с помощью VBA скачать файлик, но скажу сразу, чтобы уменьшить размер дискуссии, что нижеприведенная функция (именно в данном случае) не работает.
Код
Public Function Downloading(ByVal URL As String, ByVal LocalPath As String) As Boolean
On Error Resume Next
If AppState.FSO.FileExists(LocalPath) Then AppState.FSO.DeleteFile LocalPath, True
If AppState.FSO.FileExists(LocalPath) Then Downloading = True: Exit Function
Downloading = (URLDownloadToFile(0, URL, LocalPath, 0, 0) = 0)
End Function
Нижеприведенный код работоспособен, но необходимо обходить диалог IE
Код
Dim IE As Variant, Obj As Variant
Set IE = CreateObject("InternetExplorer.Application"): IE.Visible = True
IE.Navigate "https://circabc.europa.eu/ui/group/b21bad6d-4ffc-4aff-8ae6-fe5f35a7480a/library/0874d9bc-2772-4c8c-8...;
For Each Obj In IE.Document.getElementsByClassName("download")
Obj.Click
Next
Кто нибудь может помочь с IE (кохозить SendKey очень бы не хотелось) или у кого есть более искусный метод скачивания для данного случая?
#If Win64 Then
Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#Else
Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#End If
Sub DownLoad_With_WinAPI_Declare_Function()
Const LocalFileName$ = "i:\temp\z.xlsx"
Const URL$ = "http://www.planetaexcel.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=280522&...;
Debug.Print "Download Status : " & URLDownloadToFile(0, URL, LocalFileName, 0, 0)
End Sub
только в LocalFileName укажите существующий на Вашем компьютере путь, если укажете реально существующий файл, то после загрузки он будет убит новым в примере ссылка на файл с какой-то из тем с Планеты
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
#If Win64 Then
Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#Else
Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
#End If
Sub DownLoad_With_WinAPI_Declare_Function()
Const LocalFileName$ = "i:\temp\z.xlsx"
Const URL$ = "https://circabc.europa.eu/ui/group/b21bad6d-4ffc-4aff-8ae6-fe5f35a7480a/library/0874d9bc-2772-4c8c-8...;
Debug.Print "Download Status : " & URLDownloadToFile(0, URL, LocalFileName, 0, 0)
End Sub
Если было бы так все просто, я бы не спрашивал на форуме , из моих экспериментов самый рабочий вариант вот этот, но ...
Код
Dim IE As Variant, Obj As Variant
Set IE = CreateObject("InternetExplorer.Application"): IE.Visible = True
IE.Navigate "https://circabc.europa.eu/ui/group/b21bad6d-4ffc-4aff-8ae6-fe5f35a7480a/library/0874d9bc-2772-4c8c-8...;
IE.Document.getElementsByClassName("download")(0).Click
в приведенном мною примере файл скачивается по ссылке на него (а не по ссылке на какую-то страницу, на которой есть какая-то кнопка, нажав на которую получаем требуемый файл)
Dim m_url As String, d_url As String, file_name As String, temp_path As String
Dim body() As Byte
m_url = "https://circabc.europa.eu/ui/group/b21bad6d-4ffc-4aff-8ae6-fe5f35a7480a/library/0874d9bc-2772-4c8c-8b79-665279a04d01/details"
d_url = "https://circabc.europa.eu/rest/download/" & Split(Split(m_url, "library/")(1), "/")(0)
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", d_url, 0
.Send
body = .responseBody
file_name = Split(.getResponseHeader("Content-Disposition"), "filename=")(1)
End With
temp_path = Environ("Temp") & "\" & file_name
With CreateObject("ADODB.Stream")
.Mode = 3
.Type = 1
.Open
.Write body
.SaveToFile temp_path, 2
End With
CreateObject("Shell.Application").Open (temp_path)
Доброе утро Iгор и Jungl спасибо за помощь . Метод предложенный Jungl меня полностью устраивает, а метод предложенный Iгор'ем я ранее уже успешно использовал.
Jungl, я правильно понял, что для получения файла вы кинули на сайт GET запрос в формате xml? Откуда посоветуете начать обучение, чтобы понимать откуда вы взяли правильные ссылки и поняли как закинуть GET запрос с правильными заголовками. Мне это больше для работы с Power Query надо. Если кто-то покажет как в PQ при помощи Web.Contents получить этот же файлик было бы просто огонь!
PooHkrd, нет, мы просто формируем нужную нам ссылку и указываем метод GET. Если посмотреть обращения на сайте при клике на кнопку через developer tool в браузере (F12), то увидим переход по ссылке "https://circabc.europa.eu/rest/download/" + какая-то "соль", которая присутствует в основной ссылке на страницу. Т.е. логично при подобных ссылках брать значение и подставлять в url на скачивание и там будет заветный файлик.
В конце мы получаем response от сайта и смотрим имя в getResponseHeader("Content-Disposition"). Большинство сайтов реагирует по разному, могут требовать определенные заголовки, могут выдавать прямые ссылки на файлы, поэтому - F12 для начала. А про PQ не скажу, ибо не работаю с ним.
это точно и такая возможность есть не только у Вас. а начинать можно с освоения навыков правильно формулировать мысли
Цитата
e_artem написал: 1. Как скачать файл из сети 2. как с помощью VBA скачать документ представленный на странице по этой ссылке ...
и если со смысловой точки зрения описаны довольно родственные задачи, то с точки зрения текстов макросов, которые бкдут решать эти задачи общими будут только Sub, End Sub и буквы и символы, использованные для написания макросов, а вот их последовательность будет космически далекой друг от друга понимаете?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!