Хитрости »
2 Декабрь 2016 40481 просмотров
Как скачать файл из интернета по ссылке
Вся суть статьи уже в заголовке. Возникает порой необходимость скачивания файлов из интернета только на основании ссылки. Например, это какие-то постоянно меняющиеся данные или автоматически генерируемая другим кодом ссылка. Или еще более усугубленный вариант — строк 100 со ссылками на файлы, которые надо скачать…Вот уж радости руками по каждой клацать 
Поэтому выкладываю решение, которое в большинстве случае поможет при помощи Visual Basic for Applications скачать файл на основании ссылки URL:
'--------------------------------------------------------------------------------------- ' File : mDownloadFileFromURL ' Purpose: код позволяет скачивать файлы из интернета по указанной ссылке '--------------------------------------------------------------------------------------- Option Explicit 'объявление функции API - URLDownloadToFile ' работает на любых ПК под управлением ОС Windows ' на MAC код работать не будет #If Win64 Then 'для операционных систем с 64-разрядной архитектурой Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _ (ByVal pCaller As LongLong, ByVal szURL As String, ByVal szFileName As String, _ ByVal dwReserved As LongLong, ByVal lpfnCB As LongLong) As LongLong #Else #If VBA7 Then 'для любых операционных систем с офисом 2010 и выше Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _ (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal szFileName As String, _ ByVal dwReserved As Long, ByVal lpfnCB As LongPtr) As LongPtr #Else 'для 32-разрядных операционных систем 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 #End If 'переменная для хранения пути к папке Dim sFilePath As String Function CallDownload(sFileURL As String, sFileName As String) ' sFileURL - ссылка URL для скачивания файла ' sFileName - имя файла с расширением, которое будет присвоено после скачивания Dim h If sFilePath = "" Then 'диалоговое окно выбора папки 'подробнее: http://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/ With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Function End If sFilePath = .SelectedItems(1) End With End If If Right(sFilePath, 1) <> "" Then sFilePath = sFilePath & "" 'проверяем есть ли файл с таким же именем в выбранной папке If Dir(sFilePath & sFileName, 16) = "" Then 'файла нет - скачиваем h = DownloadFileAPI(sFileURL, sFilePath & sFileName) Else 'файл есть - запрос на перезапись If MsgBox("Этот файл уже существует в папке: " & sFilePath & vbNewLine & "Перезаписать?", vbYesNo, "www.excel-vba.ru") = vbYes Then 'если существующий файл открыт - невозможно его перезаписать, показываем инф.окно 'отменяем загрузку If IsBookOpen(sFileName) Then MsgBox "Невозможно сохранить файл в указанную папку, т.к. она уже содержит файл '" & sFileName & "' и этот файл открыт." & _ vbNewLine & "Закройте открытый файл и повторите попытку.", vbCritical, "www.excel-vba.ru" Else h = DownloadFileAPI(sFileURL, sFilePath & sFileName) End If End If End If CallDownload = h End Function 'функция скачивания файла в выбранную папку Function DownloadFileAPI(sFileURL, ToPathName) ' sFileURL - ссылка URL для скачивания файла ' ToPathName - полный путь с именем файла для сохранения Dim h Dim sFilePath As String Dim sFileName As String 'вызов функции API для непосредственно скачивания h = (URLDownloadToFile(0, sFileURL, ToPathName, 0, 0) = 0) 'если h = False - файл не удалось скачать, показываем инф.окно If h = False Then MsgBox "Невозможно скачать файл." & vbNewLine & _ "Возможно, у Вас нет прав на создание файлов в выбранной директории." & vbNewLine & _ "Попробуйте выбрать другую папку для сохранения", vbInformation, "www.excel-vba.ru" Exit Function Else 'файл успешно скачан sFileName = Dir(ToPathName, 16) sFilePath = Replace(ToPathName, sFileName, "") If MsgBox("Файл сохранен в папку: " & sFilePath & _ vbNewLine & "Открыть файл сейчас?", vbYesNo, "www.excel-vba.ru") = vbYes Then If IsBookOpen(sFileName) Then MsgBox "Файл с именем '" & sFileName & "' уже открыт. Закройте открытый файл и повторите попытку.", vbCritical, "www.excel-vba.ru" Else Workbooks.Open ToPathName End If End If End If DownloadFileAPI = h End Function 'Функция проверки - открыта ли книга с заданным именем 'подробнее: ' http://www.excel-vba.ru/chto-umeet-excel/kak-proverit-otkryta-li-kniga/ Function IsBookOpen(wbName As String) As Boolean Dim wbBook As Workbook For Each wbBook In Workbooks If Windows(wbBook.Name).Visible Then If wbBook.Name = wbName Then IsBookOpen = True: Exit For End If Next wbBook End Function
Код необходимо скопировать и вставить в книгу в стандартный модуль. Макросы должны быть разрешены.
Основная функция, отвечающая за непосредственно скачивание — это функция API(Application Programming Interface) URLDownloadToFile. Она объявлена в самом верху кода. Там есть страшные директивы вроде #If Win64 Then. Это особые директивы, которые работают даже вне процедур. Поэтому не надо удивляться, что они вне всяких Sub и тем более не надо эти Sub-ы добавлять. При этом так же не надо удивляться, если какие-то из строк внутри этих директив будут подсвечены компилятором VBA красным шрифтом. На функциональность это не повлияет.
Вызов скачивания файла происходит обычным обращением к функции CallDownload. Например, есть ссылка для скачивания: http://www.excel-vba.ru/files/book.xls. И сохранить надо под именем «Книга1.xls». Вызываем функцию скачивания файла:
Sub DownloadFile() Call CallDownload("http://www.excel-vba.ru/files/book.xls", "Книга1.xls") 'вызываем скачивание файла End Sub
Функция сама запросит папку для сохранения файла и после скачивания предложит открыть этот файл. Если такой файл уже есть — будет предложено его перезаписать.
К статье приложен файл, в котором код чуть расширен — он позволяет скачивать файлы сразу из множества ячеек, проставляя при этом признак — скачан файл или нет. И если сразу весь список обработать не получилось и какие-то файлы остались не скачанные(например, имена совпадали, а заменять файлы не надо было), то в этом случае можно будет повторно запустить код и скачиваться будут лишь те, у которых статус не является «Скачан!».
Так же т.к. ячеек много, перед скачиванием файлов будет выбор — запрашивать ли открытие файлов после скачивания или нет. Если открывать не надо, следует ответить Нет. Тогда файлы просто будут скачаны в указанную папку. Однако, если в этой папке будут расположены файлы с идентичными именами — запрос на перезапись все же появится, при этом для каждого файла. Если подобный запрос так же мешает, то надо этот блок:
'проверяем есть ли файл с таким же именем в выбранной папке If Dir(sFilePath & sFileName, 16) = "" Then 'файла нет - скачиваем h = DownloadFileAPI(sFileURL, sFilePath & sFileName) Else 'файл есть - запрос на перезапись If MsgBox("Этот файл уже существует в папке: " & sFilePath & vbNewLine & "Перезаписать?", vbYesNo, "www.excel-vba.ru") = vbYes Then 'если существующий файл открыт - невозможно его перезаписать, показываем инф.окно 'отменяем загрузку If IsBookOpen(sFileName) Then MsgBox "Невозможно сохранить файл в указанную папку, т.к. она уже содержит файл '" & sFileName & "' и этот файл открыт." & _ vbNewLine & "Закройте открытый файл и повторите попытку.", vbCritical, "www.excel-vba.ru" Else h = DownloadFileAPI(sFileURL, sFilePath & sFileName) End If End If End If
заменить на всего одну строку:
h = DownloadFileAPI(sFileURL, sFilePath & sFileName)
Но при этом надо помнить — что при этом можно потерять какие-то важные файлы. Поэтому подобные вещи вы делаете на свой страх и риск.
Однако следует помнить одну вещь: не все сайты вот так запросто разрешают скачивать с них файлы, тем более пачками. Особенно это актуально для всякого рода форексов и иже с ними. Возможно, получится скачать один, два, три — десять файлов. Но всегда может случиться так, что сайт просто заблокирует ваш IP до конца дня, т.к. на сайте установлено ограничение на автоматизированное обращение извне. При этом для разных сайтов решение данной проблемы может быть различным и не всегда решаемым
Скачать файл

Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
|
Главная » Макросы и программы по категориям |
|
Программы и макросы для скачивания файлов из интернета, получение данных с веб-страниц, загрузка с сайтов Обратите внимание на универсальное решение для импорта данных с сайтов в Excel (парсинг сайтов)
|
Перейти к содержимому
Если вы обладаете достаточным количеством времени и ресурсов перенести данные с сайта в таблицу «Excel» можно в «ручном режиме». Тот случай, когда таблица на сайте выделяется курсором мыши, копируется и вставляется в файл «Эксель». Естественно, этот способ долог и неудобен.
Я хочу рассказать Вам о другом, автоматизированном способе переноса данных с сайта в программу «Excel». Этот способ позволяет настроить процесс импорта обновленных актуальных данных с сайта прямо в таблицу одним нажатием кнопки мыши.
Для автоматизации импорта данных в «Эксель» из интернета потребуется «Excel» версии 2013 и выше, а так же надстройка Power Query.
Последовательность настройки скачивания данных:
Порядок действий для импорта таблицы из интернет-сайта в таблицу Excel.
Программа Excel соединится с сайтом, обнаружит все опубликованные на странице сайта таблицы и предложит Вам выбрать, какую таблицу загрузить с сайта в Ваш документ Excel.
- Шаг 5. Выбрать нужную таблицу из предложенного списка и нажать «Правка» или «Загрузить»
Если нажать «Загрузить», таблица будет импортирована целиком. В режиме правки можно редактировать вид загружаемой таблицы, выбирать нужные столбцы и т.д.
I’ve been spending the last few hours trying to figure out how to save a file onto the computer using VBA. The code template below that I found on another forum seems promising, except when I go to the desktop to access it, the .csv file has what looks like the page’s source code instead of the actual file I want. This may be because when I go to the URL, it doesn’t automatically download the file; rather, I am asked to save the file to a certain location (since I don’t know the path name of the uploaded file on the site).
Is there any way to alter this code to accommodate this, or will I have to use a different code entirely?
Sub Test()
Dim FileNum As Long
Dim FileData() As Byte
Dim MyFile As String
Dim WHTTP As Object
On Error Resume Next
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5")
If Err.Number <> 0 Then
Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")
End If
On Error GoTo 0
MyFile = "MY_URL_HERE"
WHTTP.Open "GET", MyFile, False
WHTTP.send
FileData = WHTTP.responseBody
Set WHTTP = Nothing
If Dir("C:UsersBLAHBLAHDesktop", vbDirectory) = Empty Then MkDir "C:UsersBLAHBLAHDesktop"
FileNum = FreeFile
Open "C:UsersBLAHBLAHDesktopmemberdatabase.csv" For Binary Access Write As #FileNum
Put #FileNum, 1, FileData
Close #FileNum
End Sub
Cross posts:
http://www.ozgrid.com/forum/showthread.php?t=178884
http://www.excelforum.com/excel-programming-vba-macros/925352-vba-go-to-website-and-download-file-from-save-prompt.html
shA.t
16.4k5 gold badges53 silver badges111 bronze badges
asked May 23, 2013 at 1:35
I found over the years more ways how to save/download data using vba:
- The firs option witch I prefer and would recommend is to use the
URLDownloadToFile functionof theuser32 libraryusing the following solution - The second one which was also mentioned be yourself. The point here is to use the
Microsoft WinHTTP Services (Interop.WinHttp) COM library. In order to achieve this you can also add the Interop.WinHttp reference to your project link. After that you are able to use simpler notation like here link - The third option I aware is to ask the browser to save it for us and then using the
Save_Over_Existing_Click_Yesfunction was mentioned by Santosh. In this case we open an Internet Explorer using the COM interface and navigate to the proper site. So we have to add theMicrosoft Internet Controls(Interop.SHDocVw) and theMicrosoft HTML Object Library(Microsoft.mshtml) references to our project in order to gain intellisense feature of the editor.
I don’t like this download method because this is a work around by hacking. BUT if your IE session was already established authenticated etc. this gonna work nicely. The save function of the Internet Controls was dropped because of security concern. See for example: link
Newer the less you have to have the correct url to download what you want. If you pick the wrong one you will download something else 
- So please try to make sure the the url you use is correct by enter it in a browser. If it opens the right .csv file than your source could work too.
- Also please try to send some more information: for example the url to the .csv file
answered Jan 10, 2016 at 22:16
minus oneminus one
6227 silver badges27 bronze badges
Try below code :
Copied from here (Not tested)
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Private Sub Save_Over_Existing_Click_Yes()
Dim hWnd As Long
Dim timeout As Date
Debug.Print "Save_Over_Existing_Click_Yes"
'Find the Download complete window, waiting a maximum of 30 seconds for it to appear. Timeout value is dependent on the
'size of the download, so make it longer for bigger files
timeout = Now + TimeValue("00:00:30")
Do
hWnd = FindWindow(vbNullString, "Save As")
DoEvents
Sleep 200
Loop Until hWnd Or Now > timeout
Debug.Print " Save As window "; Hex(hWnd)
If hWnd Then
'Find the child Close button
hWnd = FindWindowEx(hWnd, 0, "Button", "&Yes")
Debug.Print " Yes button "; Hex(hWnd)
End If
If hWnd Then
'Click the Close button
SetForegroundWindow (hWnd)
Sleep 600 'this sleep is required and 600 miiliseconds seems to be the minimum that works
SendMessage hWnd, BM_CLICK, 0, 0
End If
End Sub
answered May 23, 2013 at 2:57
SantoshSantosh
12.1k4 gold badges41 silver badges72 bronze badges
5
|
Бонифаций Пользователь Сообщений: 120 |
Доброго времени суток, знатоки. http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=46526/Example.xlsx и файл на ней Example.xlsx |
|
Я так понял, речь про мой макрос: http://excelvba.ru/code/DownloadFile С макросом проблем нет (хотя я бы советовал использовать WinAPI функцию) Вместо PS: чтобы получить ссылку на файл, щелкните на нём правой кнопкой, и выберите пункт «Копировать ссылку» |
|
|
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#3 12.03.2013 00:19:10
А на том самом сайте стесняетесь спросить?)) |
||
|
Бонифаций Пользователь Сообщений: 120 |
Спасиииибо. Все работает. |
|
Бонифаций Пользователь Сообщений: 120 |
Макрос супер. Работает отлично. На работе попробовал данный макрос для скачивания определенного файла (Отчет_1.xls) из сети. |
|
juk2000 Пользователь Сообщений: 26 |
Помогите пожалуйста, никак не могу найти макрос с помощью которого http://24score.com/football/england/premier_league/2016-2017/regular_season/corners/ , |
|
JeyCi Пользователь Сообщений: 3357 |
#7 06.11.2016 08:47:33
ну вы даёте… мне вам тоже второй раз отвечать?… первый здесь … чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
|
Andrew Гость |
#8 25.04.2018 22:37:39 Всем привет!
Скачиваю циклом файлы (картинки) по ссылкам. Изменено: Andrew — 25.04.2018 22:50:41 |
||
Онлайн скачать файл по ссылке
Что касается «скачать файл по ссылке«, почти первым пунктом идет скачать файл по ссылке онлайн, с него и начнем!
Файл будет скачиваться только, если по представленому адресу — документ будет открываться в браузере. Если данный документ в браузере не открывается, то ссылка не прямая
Скачиваем файл по ссылке:
- скачать файл по ссылке онлайн
- Скачать разные типы файлов по ссылке.
- скачать файл с Google диска по ссылке
- скачать файл с яндекс диска по ссылке
скачать файл по ссылке онлайн
С самого начала мы можем протестировать форму со скриптом! Вставьте ссылку, по которой вы хотите скачать файл и нажмите кнопку «Показать ссылку»
Если нет подходящей ссылки для тестирования формы, скопируйте вот эту :
https://dwweb.ru/__a-data/__all_for_scripts/__rar/pro_dw_koments_1_3.rar
Она со страницы все скрипты
Как скачивать ссылку онлайн скрипт — подробный разбор:
Для того, чтобы написать рабочий код скачивания ссылки онлайн нам понадобится:
Атрибут download
Далее нам потребуется тег ссылки
input для вставки адреса файла, который надо скачать…
Кнопку, button — по которой будем нажимать.
<a href=»» id=»idurl» download style=»display:none»>Скачай файл</a>
<input id=»idinput»>
<button id=»id_button»>Нажми на меня</button>
Далее нам понадобится js + отправим в атрибут href из поля для ввода ссылки.
И откроем ссылку, чтобы нажать по ней!
<script>
id_button.onclick = function (){
idurl.href = idinput.value;
idurl.style = «display:block»;
}
</script>
Соберем весь код вместе:
<a href=»» id=»idurl» download style=»display:none»>Скачай файл</a>
<input id=»idinput»>
<button id=»id_button»>Нажми на меня</button>
<script>
id_button.onclick = function (){
idurl.href = idinput.value;
idurl.style = «display:block»;
}
</script>
Скачать разные типы файлов по ссылке.
Несколько поисковых запросов про скачивание фалов по ссылке… например
как скачать xml файл по ссылке
скачать пдф файл по ссылке
Чем отличается скачивание определенного типа файла по ссылке?
Для того, чтобы скачать файл с разрешением «xml» или «пдф»… выше приведенной
!
Какое разрешение у вашего файла.
Данная форма может скачать любой файл онлайн с любого сайта!
Есть несколько исключений!
Файл должен существовать!
Скачивание должно быть разрешено(запрет может быть организован разными способами!).
скачать файл с Google диска по ссылке
Для того, чтобы скачать файл с Google диска по ссылке нам потребуется:
Создадим ссылку на любой документ, чтобы вы смогли убедиться, что данный файл существует!
Ссылка на тестовый файл.
Далее нажимаем ссылку и проходим на страницу диска:
В открытом окне ссылки Google диска ищем кнопку скачать! Нажимаем!
Нажмите, чтобы открыть в новом окне.

Почему возникает вопрос — «скачать файл с Google диска по ссылке»
Мое предположение : скорее всего человек видит «
НЕ
» активную ссылку и не знает, что нужно с ней делать?
https://drive.google.com/file/d/18iPB-OwfHMjYBdjHDgZyQiRO_RzbfFhZ
Это решается до банальности просто! Выделяем полностью ссылку.
Нажимаем ПКМ по выделенному элементу.
Ищем строку перейти :
А далее я уже рассказал.
скачать файл с яндекс диска по ссылке
Для Яндекс диска все абсолютно аналогично выше рассказанному пункту!
Либо это будет не активная ссылка
https://disk.yandex.ru/i/POU_twO6b0zpOw
Либо активная.
Переходим…
Нажмите, чтобы открыть в новом окне.

Можете не благодарить, лучше помогите!
COMMENTS+
BBcode








