FTPで送受信する


このテクニックはBASP21を使います。

BASP21については、ご自身で調べてくださいな。

FTPサーバーに対してファイルを送受信するときは、BASP21のFTPオブジェクトを使います。

  • FTPサーバーへの接続…Connectメソッド
  • ファイルの送信…PutFileメソッド
  • ファイルの受信…GetFileメソッド
  • FTPサーバーとの接続を切断…Closeメソッド

処理は、(1)FTPサーバーと接続する(Connect)→(2)任意の処理を行う→FTPサーバーとの接続を切断する(Close)となります。

ファイルを送信する

まずConnectメソッドを実行してFTPサーバーとの接続を確立します。Connectメソッドの構文は次の通りです。

rc = ftp.Connect(Dest,User,Pass)

引数Destには、接続するFTPサーバー名を指定します。

引数Userと引数Passは、FTPサーバーの接続に必要なユーザー名とパスワードです。

Connectメソッドは接続の結果を数値で返します。接続に成功したときには0が返ります。その他のエラーコードはBASP21のヘルプをご覧ください。

ファイルの送信にはPutFileメソッドを使います。PutFileメソッドの構文は次の通りです。

rc = ftp.PutFile(Local,Remote[,Type])

引数Localには送信する(ローカル側の)ファイル名を指定します。「C:\tmp\sample.dat」のようにフルパスを指定してください。

引数Remoteには保存する(FTPサーバー側の)フォルダを指定します。引数Remoteを空欄にするとルートフォルダに保存されます。たとえば、ftp.xxxxx.com/test/subの場合は「test/sub」のように指定します。

引数Typeは省略可能です。送信するデータの形式を指定します。省略するとテキストファイル(ASCII)が指定されたものとします。

PutFileメソッドは送信に成功すると、送信したファイルの数を返します。

次のサンプルは、[ファイルを開く]ダイアログボックスで選択したファイルを、指定したFTPサーバーの「test/sub」フォルダに送信します。なお、サーバー名やアカウント、パスワードなどはサンプルです。このコードをそのまま実行するとエラーになりますので、ご利用の環境に合わせてサーバー名やアカウント、パスワードなどを適切に設定してください。

Sub Sample1()
    Dim FTP, rc As Long, Server As String, User As String, Pass As String
    Dim Target As String, Folder As String
    Set FTP = CreateObject("basp21.FTP")    ''FTPオブジェクト
    Server = "ftp.xxxxx.com"                ''ホストアドレス
    User = "toru_tanaka"                    ''ユーザー名
    Pass = "password"                       ''パスワード
    Target = Application.GetOpenFilename()  ''送信ファイル
    If Target = "False" Then Exit Sub
    Folder = "test/sub"                     ''送信フォルダ
    rc = FTP.Connect(Server, User, Pass)
    If rc <> 0 Then
        MsgBox "FTP接続できませんでした。", vbCritical
        FTP.Close
        Exit Sub
    End If
    rc = FTP.PutFile(Target, Folder)
    If rc <> 1 Then
        MsgBox Dir(Target) & "を送信できませんでした。", vbCritical
        FTP.Close
        Exit Sub
    End If
    MsgBox Dir(Target) & "を送信しました。", vbInformation
    FTP.Close
End Sub

【注意】

・FTPサーバーによっては、全角のファイル名が使えないところもあります。お気を付けください。

・送信先のフォルダ(上ではtest/sub)は、あらかじめ作成されていないとエラーになります。

・送信しようとしたファイルと同名のファイルがすでに存在する場合は上書きされます。

・FTPではサーバーとローカルマシンの間で通信が行われます。ファイアーウォールなどが稼働していると、正常に機能しないことがあります。たとえばWindows XPのファイアーウォールで、Excelでの通信を例外として登録していないと次のようなアラートが表示されます。

このアラートが表示されたときは[ブロックを解除する]ボタンをクリックしてください。[ブロックする]ボタンをクリックすると、BASP21の処理が終わらず、マクロが操作不能になることがあります。そんなときはExcelを強制終了するしかありませんので、くれぐれもお気を付けください。

ファイルを受信する

FTPサーバーからローカルマシンにファイルを受信するには、GetFileメソッドを使います。GetFileメソッドの構文は次の通りです。

rc = ftp.GetFile(Remote,Local[,Type])

引数Remoteには送信元(FTPサーバー側)のファイルを指定します。たとえば、ftp.xxxxx.com/test/sub/sample.datの場合は「test/sub/sample.dat」となります。

引数Localには受信する(ローカル側の)フォルダを指定します。

引数Typeは省略可能です。受信するデータの形式を指定します。省略するとテキストファイル(ASCII)が指定されたものとします。

次のサンプルは「ftp.xxxxx.com/test/sub/sample.dat」を受信してローカルマシンに保存します。保存するフォルダは、ブックが存在するフォルダ内の「data」フォルダです。

Sub Sample2()
    Dim FTP, rc As Long, Server As String, User As String, Pass As String
    Dim Target As String, Folder As String
    Set FTP = CreateObject("basp21.FTP")    ''FTPオブジェクト
    Server = "ftp.xxxxx.com"                ''ホストアドレス
    User = "toru_tanaka"                    ''ユーザー名
    Pass = "password"                       ''パスワード
    Folder = ThisWorkbook.Path & "\data"    ''保存先フォルダ
    Target = "test/sub/sample.dat"          ''対象のファイル名
    rc = FTP.Connect(Server, User, Pass)
    If rc <> 0 Then
        MsgBox "FTP接続出来ませんでした。", vbCritical
        FTP.Close
        Exit Sub
    End If
    rc = FTP.GetFile(Target, Folder)
    If rc <> 1 Then
        MsgBox "ファイルを受信できませんでした。", vbCritical
        FTP.Close
        Exit Sub
    End If
    MsgBox "ファイルを受信しました。", vbInformation
    FTP.Close
End Sub