Страницы: 1
RSS
Как скачать файл из сети
 
Добрый день всем.
Есть вот такая вот страница
Мне необходимо с помощью 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 очень бы не хотелось) или у кого есть более искусный метод скачивания для данного случая?

Заранее спасибо, ARTem
Изменено: e_artem - 28.02.2019 15:52:48
 
Код
#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&amp...;
  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
 
Ігор Гончаренко, мне кажется проблема в другом. По ссылке из #1 ссылка на файл прямая отсутствует и её скрипт генерит по кнопке..
По вопросам из тем форума, личку не читаю.
 
Да, верно. Поэтому в самом начале я и спрашивал про обработку событий от IE или может кто еще какой способ посоветует.
вот ссылка еще раз
https://circabc.europa.eu/ui/group/b21bad6d-4ffc-4aff-8ae6-fe5f35a7480a/library/0874d9bc-2772-4c8c-8...
Изменено: e_artem - 28.02.2019 17:40:56
 
в приведенном мною примере файл скачивается по ссылке на него
(а не по ссылке на какую-то страницу, на которой есть какая-то кнопка, нажав на которую получаем требуемый файл)
Изменено: Ігор Гончаренко - 28.02.2019 19:05:54
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ok, спрошу тогда прямо,не знает ли кто, как с помощью VBA скачать документ представленный на странице по этой ссылке
https://circabc.europa.eu/ui/group/b21bad6d-4ffc-4aff-8ae6-fe5f35a7480a/library/0874d9bc-2772-4c8c-8...
?
 
e_artem,
Код
    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гор'ем я ранее уже успешно использовал.

P.S.
Как всегда, еще есть чему учиться :)
Изменено: e_artem - 01.03.2019 08:47:12
 
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 не скажу, ибо не работаю с ним.
 
Jungl, большое спасибо!
Вот горшок пустой, он предмет простой...
 
Цитата
e_artem написал:
еще есть чему учиться
это точно и такая возможность есть не только у Вас.
а начинать можно с освоения навыков правильно формулировать мысли
Цитата
e_artem написал:
1. Как скачать файл из сети
2. как с помощью VBA скачать документ представленный на странице по этой ссылке ...
и если со смысловой точки зрения описаны довольно родственные задачи, то с точки зрения текстов макросов, которые бкдут решать эти задачи общими будут только
Sub, End Sub и буквы и символы, использованные для написания макросов, а вот их последовательность будет космически далекой друг от друга
понимаете?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
PooHkrd написал:
понимать откуда вы взяли правильные ссылки и поняли как закинуть GET запрос с правильными заголовками
поищи в сети прогу Fiddler. Она хорошо умеет отлавливать всякие запросы и показывать все потроха.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, дельный совет. Спасибо большое.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх