2011-07-04 38 views
10

これはいくつかの言語でこれを行う例が多数ありますが、VBA固有の例はありません。この質問How to download multiple files in VB6 with progress bar?は、VB6でこれを行う3つの異なるアプローチを扱っています。VBAのプログレスメーターでファイルをダウンロード

  1. VB6のUserControl /のUserDocumentのAsyncReadメソッドプロパティは使用し
機能を提出するために、独自のダウンロードを書くためにWININET.DLL
  • 使用タイプライブラリolelib.tlbとIBindStatusCallbackインターフェイス
  • オブジェクト使用

    これらのアプローチのどれも私のために働いていません:

    1. UserControl/UserDocumentオブジェクトはVBA
    2. から入手私はむしろ、私は

    ナンバー2は、上記の最も有望に思えた現在のファイルダウンロードの進行状況を取得するための明確な方法を見ていない

  • 大きな外部依存関係を維持し、配布する必要がないと思います。私は私のVBAプロジェクト内からクラスモジュールを使用してIBindStatusCallbackインターフェイスを作成することができますか?

    または、現在の進捗状況を示す上記の番号3を使用して利用可能なプロパティ/メソッドがあります。どんな助けでも大歓迎です。

  • 答えて

    2

    私はこれをwininet.dll関数を使って行っています。残念ながら私の雇用主が所有しているので、コードを貼り付けることはできません。

    InternetOpenとInternetOpenUrlを使用してダウンロードを開始し、HttpQueryInfoLongを使用してコンテンツの長さを取得し、InternetReadFileを繰り返し呼び出してバッファにデータを読み込み(私は128kバッファを使用します)、データをファイルに書き込み、プログレスバーをあなたが行く。

    宣言あなたが始めるために:

    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 
    

    何か明確化が必要な場合は、コメントを投稿してください。

    0

    VBAでプログレスバーが必要ですが、これらのアプローチのいずれも機能しませんか?

    Progress bar in VBA Excel

    は、あなたが説明するようにそれを行うよりもずっと簡単に思え、または私は理解していないのですか?

    OK、これを試してください。 URLからヘッダーを取得し、Content-Lengthを解析します。それに応じて進捗バーを設定することができます。

    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 
    

    ダウンロードしたいファイルのURLで関数を呼び出してください。それはあなたにファイルのバイト数を与える必要があります。

    +1

    プログレスバーを表示するのは簡単です。難しいのは、ダウンロード自体の進捗状況を把握することです。つまり、現在のダウンロードステータスを照会して、10%完了したか25%完了したかなどを確認する方法があるかどうかを知りたいと思います。現在、私は0%完了時のみ知っています100%完了しました。それは私のユーザーにとってあまり役に立ちません。 – mwolfe02

    +0

    更新されたレスポンスを参照してください。それはあまりありませんが、それは何かです。 – JimmyPena

    関連する問題