2013-07-26 3 views
29

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

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

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

ответ

43

Это решение основано на этом сайте: 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 вашего файла, имеет ваш пароль. Какие-нибудь подсказки для того, чтобы обойти это или каким-то образом зашифровать? Еще раз спасибо! – rryanp

+2

Нет проблем :) Вы правы, это не хорошая практика для хранения паролей в вашем коде. В Ruby я всегда использую переменные среды, вы, вероятно, можете сделать что-то подобное в VBA. В excel вы можете шифровать файлы, чтобы пользователи не могли использовать ваш код. Я никогда не пробовал это, но попробую эту ссылку: http://www.vbaexpress.com/forum/showthread.php?914-how-to-encrypt-vba-code-on-the-fly –

+3

Что такое «myURL = ... responseBody "(прямо перед тем, что нужно)? Кажется ненужным ... –

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 

Source

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

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

Смежные вопросы