3.1 FTPサーバからファイルをダウンロード
FTPサーバからファイルをダウンロードするときは、API関数/InternetOpenInternetConnectでFTPサーバへ接続した後、API関数/FtpGetFileを使って行います。

参考までに、Access VBA以外に、Excel VBA(エクセルマクロ)など他のVBAでも使用することができます。
API関数/FtpGetFileを定義する
API関数を使うとき、まずはこの関数がどこにある・どんな関数であるかといった、この関数を使うための準備(API関数の宣言)が必要です。また、定義する場所はフォーム、モジュール、クラスモジュールの(General)(Declarations)です。

次の例は、API関数/FtpGetFileを使うときの記述例です。API関数を使用するときは、ついでにAPI関数で使用する定数も定義しておきましょう。

'(General)(Declarations)へ記述します
'FTPでダウンロード
Private Declare Function FtpGetFile _
            Lib "wininet.dll" _
          Alias "FtpGetFileA" _
         (ByVal hConnect As Long _
        , ByVal lpszRemoteFile As String _
        , ByVal lpszNewFile As String _
        , ByVal fFailIfExists As Boolean _
        , ByVal dwFlagsAndAttributes As Long _
        , ByVal dwFlags As Long _
        , ByVal dwContext As Long) As Boolean

'dwFlagsAndAttributes(ダウンロード後のファイルの属性)
'読み込み専用
Private Const FILE_ATTRIBUTE_READONLY   As Long = &H1
'隠しファイル
Private Const FILE_ATTRIBUTE_HIDDEN     As Long = &H2
'システムファイル
Private Const FILE_ATTRIBUTE_SYSTEM     As Long = &H4
'ディレクトリ(フォルダ)
Private Const FILE_ATTRIBUTE_DIRECTORY  As Long = &H10
'アーカイブファイル
Private Const FILE_ATTRIBUTE_ARCHIVE    As Long = &H20
'通常のファイル
Private Const FILE_ATTRIBUTE_NORMAL     As Long = &H80

'dwFlags(転送方法)
'アスキーモード
Private Const FTP_TRANSFER_TYPE_ASCII  As Long = &H1
'バイナリモード
Private Const FTP_TRANSFER_TYPE_BINARY As Long = &H2

'dwFlags(ダウンロード方法)
'キャッシュを無視し、サーバから強制的にダウンロード
Private Const INTERNET_FLAG_RELOAD        As Long = &H80000000
'ダウンロードファイルをキャッシュに加えない
Private Const INTERNET_FLAG_DONT_CACHE    As Long = &H4000000
'サーバから再読み込みします
Private Const INTERNET_FLAG_RESYNCHRONIZE As Long = &H800
'キャッシュできないときに一時ファイルを生成
Private Const INTERNET_FLAG_NEED_FILE     As Long = &H10
'有効期限、最終更新時刻がサーバから返されない場合は強制的に再読み込み
Private Const INTERNET_FLAG_HYPERLINK     As Long = &H400
 ※決まり事なので、悩まずにコピペして使ってしまいましょう

なお、この関数の戻り値にはダウンロードが成功したか、失敗したかが返ります。True*が成功、Falseが失敗です。失敗したときは、FTPサーバに接続できているか、ダウンロード元のパスは存在するか、ダウンロード先のパス(フォルダ)が存在するかをチェックしましょう。

( )内に記述している引数は、以下を参照してください。

 ◆FtpGetFileの引数
ByVal hConnect As Long InternetConnectで取得したFTPハンドルを指定します。
ByVal lpszRemoteFile As String ダウンロード対象のファイル(サーバにあるファイル)を指定します。できるだけフルパスで指定しましょう。
ByVal lpszNewFile As String ローカルの保存先フォルダとファイル名を指定します。フルパスで指定しましょう。
ByVal fFailIfExists As Boolean ローカルのファイルを上書きするかどうかを指定します。Falseを指定するとローカルのファイルを上書き、Trueを指定したときは、ローカルにファイルを新規作成できるとき(ローカルに同じ名前のファイルが無いとき)だけダウンロードします。
ByVal dwFlagsAndAttributes As Long ローカルに保存するファイルの属性を指定します。通常はFILE_ATTRIBUTE_NORMALでOK。
ByVal dwFlags As Long 転送モードを指定します。一般的に、htmlなどのテキストファイルの時はアスキーモード、jpgやgifなどのファイルの時はバイナリモードを指定します。
ByVal dwContext As Long 0を指定しておいてOKです。

 *VBではTrueは「-1」ですが、このAPIではTrueのときに「1」が返ります。そのため、実行結果はErr.LastDllErrorで参照するようにしてください。こちらは、0が正常終了、0以外が異常終了です。
FtpGetFileの使用例
FtpGetFileを使って、FTPサーバからファイルをダウンロードする例です。Subプロシージャ「prcFTPDownLoadSample」を実行すると、FTPサーバへ接続しファイルのダウンロードを行います。

FTPサーバからファイルをダウンロードするには、InternetOpenInternetConnectを使ってFTPサーバへ接続した後、FtpGetFileを実行します。FtpGetFileの引数hConnectには、FTPサーバへ接続したときのハンドル(例ではlngFtpHnd)を指定しましょう。

例では、Functionプロシージャ「fcFTPGetFile」で、渡された引数の内容を使い(dRmtが"/work/data/filename.txt"、dLcが"c:\happy\filename.txt"、dMdがFTP_TRANSFER_TYPE_ASCII)、FTPサーバからファイルをダウンロードしています。ローカルファイルの上書き有無はFalse(上書きする)です。

'変数の定義 ※(General)(Declarations)です
Private lngWinINet As Long 'インターネットハンドルの保存用
Private lngFtpHnd  As Long 'FTPハンドルの保存用


Sub prcFTPDownLoadSample()

    Dim lngRC As Long

    'インターネットサービスをオープンします
    lngRC = fcInternetOpen

    'オープンに成功したらFTPサーバとの接続と切断を行います
    If lngRC = 0 Then

       'FTPサーバへ接続します
       lngRC = fcFTPConnect("ftp.happy-happy-island.net", "happy", "island")

       '接続に成功したら、FTPサーバからファイルをダウンロードします
       If lngRC = 0 Then
          Call fcFTPGetFile("/work/data/filename.txt" _
                          , "c:\happy\filename.txt" _
                          , FTP_TRANSFER_TYPE_ASCII)
       End If

    End If

    'FTPをクローズします
    Call fcFTPDisConnect

    'インターネットサービスをクローズします
    Call fcInternetClose

End Sub


Function fcFTPGetFile(dRmt As String, dLc As String, dMd As Long) As Boolean

    'dRmt/リモートファイル
    'dLc /ローカルファイル
    'dMd /転送モード

    'FTPサーバからファイルをダウンロード
    fcFTPGetFile = FtpGetFile(lngFtpHnd _
                            , dRmt _
                            , dLc _
                            , False _
                            , FILE_ATTRIBUTE_NORMAL _
                            , dMd + INTERNET_FLAG_RELOAD _
                            , 0)

End Function


Function fcFTPConnect(Server As String, User As String, Psw As String) As Long

    'APIの実行/FTPサーバへ接続
    lngFtpHnd = InternetConnect(lngWinINet _
                              , Server _
                              , INTERNET_DEFAULT_FTP_PORT _
                              , User _
                              , Psw _
                              , INTERNET_SERVICE_FTP _
                              , 0 _
                              , 0)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcFTPConnect = Err.LastDllError

End Function


Function fcFTPDisConnect() As Long

    'APIの実行/FTPサーバから切断
    Call InternetCloseHandle(lngFtpHnd)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcFTPDisConnect = Err.LastDllError

End Function


Function fcInternetOpen() As Long

    'APIの実行/インターネットサービスをオープン
    lngWinINet = InternetOpen(vbNullString _
                            , INTERNET_OPEN_TYPE_PRECONFIG _
                            , vbNullString _
                            , vbNullString _
                            , 0)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcInternetOpen = Err.LastDllError

End Function


Function fcInternetClose() As Long

    'APIの実行/インターネットサービスをクローズ
    Call InternetCloseHandle(lngWinINet)

    'この関数の戻り値には、APIの処理結果コードを返します
    fcInternetClose = Err.LastDllError

End Function
 ※この他に、API関数を定義する必要があります。
 ※ftp.happy-happy-island.netは架空のドメイン名です。
Copyright(C) 1999-2006 結城圭介。 All rights reserved