2013-07-26 10 views
29

Potrzebuję pobrać plik CSV ze strony internetowej przy użyciu języka VBA w programie Excel. Serwer musiał również uwierzytelnić mnie, ponieważ były to dane z usługi ankiet.Jak pobrać plik przy użyciu VBA (bez przeglądarki internetowej)

Znalazłem wiele przykładów przy użyciu przeglądarki Internet Explorer sterowanej za pomocą VBA. Jednak były to głównie powolne roztwory, a większość z nich także była zawiłowana.

Update: Po pewnym czasie znalazł ładne roztwór przy użyciu obiektu Microsoft.XMLHTTP w programie Excel. Pomyślałem, aby udostępnić poniższe rozwiązanie w celu późniejszego wykorzystania.

Odpowiedz

43

To rozwiązanie oparte jest od tej strony: http://social.msdn.microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/excel-2007-use-vba-to-download-save-csv-from-url

Jest nieco zmodyfikowany, aby zastąpić istniejący plik i przejść wzdłuż poświadczeń logowania.

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

Dzięki - bardzo fajnie. Moim jedynym problemem jest to, że wtedy każdy, kto dostanie się do VBA twojego pliku, ma twoje hasło. Wszelkie wskazówki, jak to obejść lub w jakiś sposób zaszyfrować? Dzięki jeszcze raz! – rryanp

+2

Nie ma problemu :) Masz rację, nie jest dobrą praktyką przechowywanie haseł w kodzie. W Ruby zawsze używam zmiennych środowiskowych, prawdopodobnie możesz zrobić coś podobnego w VBA. W programie Excel można szyfrować pliki, aby użytkownicy nie mogli podać kodu. Nigdy tego nie próbowałem, ale spróbuj tego linku: http://www.vbaexpress.com/forum/showthread.php?914-how-to-encrypt-vba-code-on-the-fly –

+3

Co to jest "myURL" = ... responseBody "(tuż przed If) dla? Wydaje się niepotrzebne ... –

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

znalazłem powyżej patrząc na pobieranie z FTP z nazwy i adresu w adresie URL. Użytkownicy dostarczają informacje, a następnie wykonują połączenia.

To było pomocne, ponieważ nasza organizacja ma Kaspersky AV, który blokuje plik active FTP.exe, ale nie łączy internetowych. Nie mogliśmy opracować w domu za pomocą ftp.exe i to było nasze rozwiązanie. Mam nadzieję, że to pomaga innym poszukującym informacji!