2013-07-26 36 views
29

Tôi cần tải xuống tệp CSV từ trang web sử dụng VBA trong Excel. Máy chủ cũng cần xác thực tôi vì đó là dữ liệu từ dịch vụ khảo sát.Làm cách nào để tải xuống tệp bằng VBA (Không có trình duyệt internet)

Tôi đã tìm thấy rất nhiều ví dụ sử dụng Internet Explorer được kiểm soát với VBA cho việc này. Tuy nhiên, đó là giải pháp chủ yếu là chậm và hầu hết cũng được phức tạp.

Cập nhật: Sau một thời gian tôi tìm thấy một giải pháp tiện lợi sử dụng đối tượng Microsoft.XMLHTTP trong Excel. Tôi nghĩ rằng để chia sẻ các giải pháp dưới đây để tham khảo trong tương lai.

Trả lời

43

giải pháp này được dựa từ trang web này: http://social.msdn.microsoft.com/Forums/en-US/bd0ee306-7bb5-4ce4-8341-edd9475f84ad/excel-2007-use-vba-to-download-save-csv-from-url

Nó được chút thay đổi để ghi đè lên tập tin hiện có và để vượt qua cùng thông tin đăng nhập.

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

Cảm ơn - rất tuyệt. Vấn đề duy nhất của tôi là sau đó bất kỳ ai nhận được tệp VBA của bạn đều có mật khẩu của bạn. Bất kỳ lời khuyên nào để vượt qua điều đó hoặc mã hóa nó theo một cách nào đó? Cảm ơn một lần nữa! – rryanp

+2

Không vấn đề gì :) Bạn đã đúng, không nên lưu trữ mật khẩu trong mã của bạn. Trong Ruby tôi luôn sử dụng các biến môi trường, bạn có thể làm một cái gì đó tương tự trong VBA. Trong excel bạn có thể mã hóa các tập tin để người dùng không thể lấy mã của bạn. Tôi chưa bao giờ thử điều này nhưng hãy thử liên kết này: http://www.vbaexpress.com/forum/showthread.php?914-how-to-encrypt-vba-code-on-the-fly –

+3

“myURL là gì = ... responseBody ”(ngay trước If nếu)? Có vẻ không cần thiết ... –

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

tôi thấy ở trên khi tìm kiếm tải từ FTP với tên đăng nhập và địa chỉ trong URL. Người dùng cung cấp thông tin và sau đó thực hiện cuộc gọi.

Điều này hữu ích vì tổ chức của chúng tôi có Kaspersky AV chặn active FTP.exe, chứ không phải kết nối web. Chúng tôi không thể phát triển trong nhà với ftp.exe và đây là giải pháp của chúng tôi. Hy vọng điều này sẽ giúp người khác tìm kiếm thông tin!

Các vấn đề liên quan