はじめに
VBA環境でWindows APIを使ってWebからファイルをダウンロードする方法を紹介します。同時に、バイト型(Byte)配列を使ってVBAでバイナリデータを扱う方法も紹介します。
対象読者
- VBA環境からWindows APIを利用されている方
- VBAでWebからファイルをダウンロードする必要のある方
- VBAでバイナリデータを扱う方
なお、VBAからWindows APIを呼び出す方法については、以下のMSDNなどを参照してください。
- MSDN『Office VBA と Windows API』
必要な環境
- Windows VistaまたはWindows XP
- VBA開発環境(サンプルではExcelを使います)
WinInet関数
WebからのダウンロードにはWin32インターネット拡張機能(WinInet)を使います。
具体的には、以下の順番でWinInet関数を呼び出します。
- InternetOpen()でWinInetを初期化する
- InternetOpenUrl()でURLを開く
- InternetReadFile()を複数回呼び出してデータを読み取る
- InternetCloseHandle()でハンドルを開放する
WinInet関数を呼び出すには、Declareステートメントで関数を宣言する必要がありますが、テンプレートは以下のページからダウンロードできます。テンプレートを参照するには「vbinet.exe」をダウンロードし解凍してください。
- Microsoftサポートオンライン『Visual Basic 用の vbinet.exe WinInet API 宣言』
「値渡し」と「参照渡し」
VBAの関数に引数を渡す場合、「値渡し」と「参照渡し」があります。
VBAのデフォルトの動作は「参照渡し」ですが、関数定義時にByValを使うと「値渡し」になります。
'値渡し(ByValを使用) Declare Function SetFocus Lib "user32" Alias "SetFocus" (_ ByVal hwnd As Long) As Long '参照渡し(デフォルト) Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (_ lpSystemTime As SYSTEMTIME)
DeclareステートメントでAPI関数を宣言するとき、どちらを使うかによって次のような動作の違いがあります。
値渡し | 関数は渡された変数の値を受け取る |
参照渡し | 関数は渡された変数のメモリアドレスを受け取る |
API関数に変数のメモリアドレスを渡したい場合は「参照渡し」を使います。