ネットから画像をダウンロードする


いつかVBAテクニックのページに書こうかと思ったのですが、よく考えると(よく考えなくても)VBAとは関係のないネタですので、こちらに書いておきましょう。ソースはVB6を対象にしていますが、もちろんVBAからも実行できます。

ネットから画像をダウンロードするには、URLDownloadToFileというAPIを使います。これを知ったときには「何て簡単なんだ」と驚いたのですが、Visual Studio 2005のC#を勉強していたら、もっと簡単で驚くよりも呆れてしまいました。そのネタはいずれまた。

Public Declare Function URLDownloadToFile Lib "urlmon" _
    Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

書式は次のようになります。

Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0)

DownloadFileには「http://www.officetanaka.net/sample.jpg」のように画像のパスを指定します。

SaveFileNameにはローカルに保存する「C:\sample.jpg」といったパスを指定します。

これだけです。成功すると0を返します。

次のコードは「http://www.officetanaka.net/sample.jpg」をダウンロードして「C:\sample.jpg」に保存します。同名ファイルが存在した場合は上書きしますので注意してください。汎用性を考慮してサブプロシージャとしました。

Sub Sample()
    GetImageFile "http://www.officetanaka.net/sample.jpg", "C:\sample.jpg"
End Sub
Sub GetImageFile(ImgName As String, SaveName As String)
    Dim SaveFileName As String, DownloadFile As String, Ret As Long
    If ImgName = "" Then Exit Sub
    SaveFileName = SaveName
    DownloadFile = ImgName
    Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0)
    If Ret = 0 Then
        MsgBox "ダウンロードできました"
    Else
        MsgBox "エラーが発生しました"
    End If
End Sub

ちなみに↓この画像です。

URLを指定してネットから画像をダウンロードするのは簡単ですが、これだけでは実用的でありません。こうしたことをやりたいと考えるキッカケは、往々にして何らかのページにたくさん表示されている画像を一気にダウンロードしてやろうという考えです。

それには、任意のページのHTMLを取得して、そこに記述されているimgタグやlinkタグを解析しなければならないのです。上のようにダウンロードすることは簡単ですが、そのための情報を解析する方がはるかに厄介だったりします。