Как загрузить файл с помощью VBA (без Internet Explorer)

28

Мне нужно загрузить CSV файл с веб-сайта с помощью VBA в Excel. Сервер также должен был аутентифицировать меня, поскольку это были данные из службы опроса.

Я нашел много примеров, используя Internet Explorer, управляемый VBA. Однако это были в основном медленные растворы, и большинство из них также были запутаны.

Update: Через некоторое время я нашел отличное решение с использованием объекта Microsoft.XMLHTTP в Excel. Я решил поделиться решением ниже для справок в будущем.

Теги:
csv
download

2 ответа

44
Лучший ответ

Это решение основано на этом веб-сайте: http://social.msdn.microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/excel-2007-use-vba-to-download-save-csv-from-url

Немного изменено, чтобы перезаписать существующий файл и передать учетные данные для входа.

Sub DownloadFile()

Dim myURL As String
myURL = "https://YourWebSite.com/?your_query_parameters"

Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", myURL, False, "username", "password"
WinHttpReq.send

myURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WinHttpReq.responseBody
    oStream.SaveToFile "C:\file.csv", 2 ' 1 = no overwrite, 2 = overwrite
    oStream.Close
End If

End Sub
  • 0
    Спасибо - очень круто. Моя единственная проблема в том, что тогда любой, кто попадает в VBA вашего файла, имеет ваш пароль. Какие-нибудь советы, как обойти это или каким-то образом зашифровать? Еще раз спасибо!
  • 2
    Нет проблем :) Вы правы, не рекомендуется хранить пароли в вашем коде. В Ruby я всегда использую переменные окружения, вы, вероятно, можете сделать что-то подобное в VBA. В Excel вы можете зашифровать файлы, чтобы пользователи не могли видеть ваш код. Я никогда не пробовал это, но попробуйте эту ссылку: vbaexpress.com/forum/…
Показать ещё 3 комментария
6
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

Sub Example()
    DownloadFile$ = "someFile.ext" 'here the name with extension
    URL$ = "http://some.web.address/" & DownloadFile 'Here is the web address
    LocalFilename$ = "C:\Some\Path" & DownloadFile !OR! CurrentProject.Path & "\" & DownloadFile 'here the drive and download directory
    MsgBox "Download Status : " & URLDownloadToFile(0, URL, LocalFilename, 0, 0) = 0
End Sub

Источник

Я нашел это при поиске загрузки с FTP с именем пользователя и адресом в URL-адресе. Пользователи предоставляют информацию, а затем выполняют вызовы.

Это было полезно, потому что в нашей организации есть Kaspersky AV, который блокирует active FTP.exe, но не веб-соединения. Мы не смогли развиваться в доме с ftp.exe, и это было нашим решением. Надеюсь, это поможет другим, кто ищет информацию!

  • 2
    Это полезно, но мне пришлось добавить ссылку на Microsoft WinHTTP Services, чтобы заставить это работать. (В редакторе VBA: Инструменты / Ссылки / Microsoft WinHTTP Services, версия 5.1). Не знаю, было ли это очевидно для других людей или нет.
  • 0
    @DRC Я знаю, что вашему комментарию уже год, но я написал это почти за 3 года до этого. В то время мы импортировали некоторые другие вещи в наши сценарии, но я рад, что вы получили некоторую помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню