2014年2月13日木曜日

Ariawaseライブラリ集で学ぶVBA(1) WinInet.bas

【まえがき】

VBAソースコード管理支援ツール vbac を作成されている@igetaさん作のAriawase VBAライブラリ集 (Ver. 0.5.0)について、何回かに分けて勉強しつつ解説してみたいと思います。
なお、Ariawase VBAライブラリ集は、自分の調べた限りでは、Microsoft Office 32bit版/64bit版の両対応です。しかも、Office2000以降であれば、だいたい動作するような気がしてます(未確認)。出所の不明なサンプルコードを流用するよりも、ずっと安心ですね!

第1回目となる今回は、WinInet.basについてです。



【WinInet.basについて】

古のWinINet APIをラップしたVBAモジュールです。
ざくっと言うと、インターネットを手軽に扱うためのAPIをラップした VBAモジュールになります。
説明になっていませんが、あえて今勉強するようなAPIでもないので何のことか分からなければ、この説明は無視してください。

現Ver.では、Public なサブルーチンとして、
指定したURLからファイルをダウンロードする FileDownload が公開されています。

なお、FileDownloadサブルーチンを実現するために、モジュール内にはWinINet APIをラップしたPrivateなサブルーチンが色々と用意されています。もし、自分でWinINet APIを用いて何か実装したい場合は、そのあたりを流用すると良さそうに思います。

【WinInet.basの使い方】

利用にあたって必要な構成

Ariawaseライブラリ内の Core.bas, IO.bas, Util.bas, Func.cls, Tuple2.cls が必須です。

最低限の構成

FileDownload

いきなりサンプルコードです。

使い方は、上記サンプルコードのままです。一応、以下に解説しておきます。
  • 第1引数: ダウンロードしたいファイルのURL
  • 第2引数: ダウンロードしたファイルを保存するフォルダパス
    • ファイル名は、第1引数のURLに基づいて自動的に補完されます。
    • 存在しないフォルダを指定すると、実行時エラー 3004 が出ます。
  • 返り値:
    • ダウンロードに成功した場合は、ダウンロードしたファイルのパス
    • 失敗した場合は、vbNullString
特に説明することもありません。
あえて言うなら、ダウンロード処理が終わるまでに時間がかかる場合は、VBAの仕様上、フリーズしたようになるので注意です。注意、といっても 何も出来ないので待つだけですが…。

それにしても、WinINet APIを直接叩く場合に比べ、なんとお手軽なことでしょう。
まるで、WinINetAPIがゴミのようです。

【WinInet.basのソースコードから学ぶVBA】

個人的に、「あ、こんな書き方ありなんだ!」と、目から鱗だった書き方がこちら。


ディレクティブ構文を使って、サブルーチンの宣言部分のみを書き分けてます。
見ているだけで、なんだか涙ぐましくなります…。 閑話休題。

宣言部を切り替えることでサブルーチン内部は1箇所にとどめたまま、32bit/64bitの両対応を実現しています。
32bit/64bitの両対応にしようとすると、APIを直接ラップするサブルーチンはどうにでもなるものの、ラップしたサブルーチンとその他の部分の結合となると、どうするか悩ましいのですが、こんなスマートなやり方があるんですね!

【どうでもいい感想】

  • ディレクティブ構文は、#If VBA7 Then に抑えて、LongPtrの自動判別機能を有効に活用する方が好みです。