2011-07-04 50 views
10

Tôi đã tìm thấy nhiều ví dụ để thực hiện việc này bằng nhiều ngôn ngữ, nhưng không có ví dụ nào là VBA cụ thể. Câu hỏi này, How to download multiple files in VB6 with progress bar?, địa chỉ ba cách tiếp cận khác nhau để làm điều này trong VB6.Tải xuống tệp với số đo tiến độ trong VBA

  1. Sử dụng tài sản của VB6 UserControl/UserDocument ASyncRead đối tượng
  2. Sử dụng loại olelib.tlb thư viện và giao diện IBindStatusCallback
  3. Sử dụng wininet.dll để viết tải của riêng bạn để nộp chức năng

Không phương pháp nào trong số này phù hợp với tôi vì:

  1. Đối tượng UserControl/UserDocument không sẵn từ VBA
  2. Tôi không muốn có để duy trì và phân phối một sự phụ thuộc lớn bên ngoài
  3. Tôi không nhìn thấy một cách rõ ràng để có được sự tiến bộ tập tin tải về hiện tại

Số 2 ở trên có vẻ hứa hẹn nhất . Tôi tự hỏi nếu tôi có thể tạo ra một giao diện IBindStatusCallback bằng cách sử dụng một mô-đun lớp từ bên trong dự án VBA của tôi?

Hoặc có thể có các thuộc tính/phương pháp có sẵn bằng cách sử dụng Số 3 ở trên sẽ cung cấp tiến trình hiện tại. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

Trả lời

2

Tôi đã thực hiện việc này bằng các hàm wininet.dll. Rất tiếc, tôi không thể dán mã của mình vì mã được sở hữu bởi chủ nhân của tôi.

Sử dụng InternetMở và InternetOpenUrl để bắt đầu tải xuống, HttpQueryInfoLong để nhận độ dài nội dung và sau đó liên tục gọi InternetReadFile để đọc dữ liệu vào bộ đệm (Tôi sử dụng bộ đệm 128k), ghi dữ liệu vào tệp và cập nhật thanh tiến trình anh đi.

khai báo để giúp bạn bắt đầu:

Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long 
Private Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Long 
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer 
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef Buffer As Any, ByVal lNumberOfBytesToRead As Long, lNumberOfBytesRead As Long) As Integer 
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternet As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long 

Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0 
Private Const INTERNET_FLAG_RELOAD = &H80000000 
Private Const INTERNET_FLAG_KEEP_CONNECTION = &H400000 ' use keep-alive semantics - required for NTLM proxy authentication 
Private Const HTTP_QUERY_CONTENT_LENGTH = 5 
Private Const HTTP_QUERY_FLAG_NUMBER = &H20000000 

Nếu bạn cần bất kỳ làm rõ, viết bình luận.

0

Bạn muốn có thanh tiến trình trong VBA, không phải một trong các cách tiếp cận này có hiệu quả không?

Progress bar in VBA Excel

Có vẻ đơn giản hơn rất nhiều so với làm việc đó như bạn mô tả, hay tôi không hiểu?

OK, hãy thử điều này. Nhận tiêu đề từ URL và phân tích cú pháp chúng cho Độ dài nội dung. Sau đó, bạn có thể thiết lập thanh tiến trình của bạn cho phù hợp.

Function GetFileSize(URL As String) As Long 

Dim xml As Object ' MSXML2.XMLHTTP60 
Dim result As String 

Set xml = CreateObject("MSXML2.XMLHTTP.6.0") 

With xml 
    ' get headers only 
    .Open "HEAD", URL, False 
    .send 
End With 

result = xml.getResponseHeader("Content-Length") 

GetFileSize = CLng(result) 

End Function 

Bây giờ, chỉ cần gọi hàm bằng URL của tệp bạn muốn tải xuống. Nó sẽ cung cấp cho bạn số byte của tệp.

+1

Hiển thị thanh tiến trình rất đơn giản. Khó khăn trong việc tìm ra tiến độ của bản tải xuống. Nói cách khác, tôi muốn biết nếu có một cách để truy vấn trạng thái tải xuống hiện tại để xem liệu tôi có hoàn thành 10% hay 25% hoàn thành, v.v. Ngay bây giờ tôi chỉ biết khi nào tôi hoàn thành 0% và hoàn thành 100%. Điều đó không hữu ích cho người dùng của tôi. – mwolfe02

+0

Xem câu trả lời cập nhật của tôi. Nó không phải là nhiều nhưng nó là một cái gì đó. – JimmyPena

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