VBA

2011-07-04 26 views
10

İlerleme ölçer ile dosya indirin Dosyayı birçok dilde yapmak için çok sayıda örnek buldum, ancak bunların hiçbiri VBA'ya özgü değil. Bu soru, How to download multiple files in VB6 with progress bar?, VB6'da bunu yapmak için üç farklı yaklaşımı ele almaktadır.VBA

  1. Kullanım VB6 UserControl/UserDocument ASyncRead özelliği fonksiyonu
dosyaya kendi indirme yazmaya
  • Kullanım tür kitaplığı OLELIB.TLB ve IBindStatusCallback arayüzünü
  • Kullanım wininet.dll nesneleri

    Bu yaklaşımların hiçbiri benim için çalışmıyor çünkü:

    1. UserControl/UserDocument nesneleri değil VBA mevcut
    2. Doğrusu ben 2 numara yukarıda en umut verici görünüyordu

    geçerli dosya indirme ilerleme almak için belirgin bir yol görmedim

  • büyük dış bağımlılık korumak ve dağıtmak zorunda istemem
  • . VBA projemden bir sınıf modülü kullanarak bir IBindStatusCallback arayüzü oluşturabilir miyim merak ediyorum? Veya şu andaki ilerlemeyi sağlayacak olan yukarıdaki 3 Numarasını kullanarak kullanılabilir özellikler/yöntemler mevcuttur. Herhangi bir yardım çok takdir edilmektedir.

  • cevap

    2

    Bunu wininet.dll işlevlerini kullanarak yaptım. Maalesef kodumu işverene ait olduğu gibi yapıştıramam.

    InternetOpen ve InternetOpenUrl'i kullanmaya başlamak için, içerik uzunluğunu almak üzere HttpQueryInfoLong'u kullanın ve ardından bir arabelleğe (128k'lık bir arabellek kullanarak) veriyi okumak, bir dosyaya veri yazmak ve ilerleme çubuğunu olarak güncelleştirmek için InternetReadFile'ı tekrar tekrar arayın. git.

    Beyannameler başlamak için: Herhangi bir açıklama gerekiyorsa

    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 
    

    , bir yorum gönderin.

    0

    VBA'da bir ilerleme çubuğu istersiniz, bu yaklaşımlardan biri işe yaramaz mı?

    Progress bar in VBA Excel

    açıkladığınız olarak yapıyor çok daha basit görünüyor ya Anlamıyorum?

    Tamam, bunu deneyin. Üstbilgileri URL'den alın ve İçerik Uzunluğu için bunları ayrıştırın. Ardından, ilerleme çubuğunuzu buna göre ayarlayabilirsiniz.

    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 
    

    Şimdi işlevi, indirmek istediğiniz dosyanın URL'sini kullanarak arayın. Dosyanın bayt sayısını vermeniz gerekir.

    +1

    İlerleme çubuğunu görüntülemek basittir. Zorluk, indirme işleminin kendisinin ilerlemesini bulmaktır. Diğer bir deyişle, şu anki indirme durumunu sorgulamanın bir yolu olup olmadığını öğrenmek isterim:% 10 tamam mı, yoksa% 25 tamam mı ?. Şu anda sadece% 0 dolduğumda ve% 100 tamamlandı. Bu benim kullanıcılarım için çok yararlı değil. – mwolfe02

    +0

    Güncellenmiş yanıtımı görün. Fazla değil ama bir şey. – JimmyPena