FTPとは、インターネット上でファイルをやり取りする仕組みです。 FTPを使ってファイルの送受信を行う場合、一般的には専用のソフトを使いますが、Excel VBAからFTPを利用することも可能です。 ただし、Excel VBAだけでFTP接続することはできません。 ここでは、無料で公開されている「BASP21」というコンポーネントを利用して、Excel VBAでFTP接続する方法を解説します。
BASP21は次のサイトからダウンロードできます。 http://www.hi-ho.ne.jp/~babaq/basp21.html BASP21のダウンロードおよびインストールに関しては、上記サイトをご覧ください。 BASP21がインストールされている環境では、CreateObjectを使ってBASP21を利用できます。 BASP21のFTPコンポーネントでFTP接続を行うには、接続に必要な「サーバー名」「ユーザー名(ログイン名)」「パスワード」が必要です。 これらはFTPサーバーによって異なりますので、接続するFTPサーバーで確認してください。 ここでは、次のように設定されているものとします。 サーバー名:ftp.officetanaka.co.jp ユーザー名:tanaka パスワード:9999 ※注意※ 上記は実在しないサーバーです。 FTPの接続には、FTPコンポーネントのConnectメソッドを実行します。 Connectメソッドの書式は次の通りです。ftp.Connect(サーバー名,ユーザー名,パスワード)次のコードは、FTPサーバーに接続して、何もせずに切断します。Sub Sample1() Dim FTP As Object, Server As String, User As String, Pass As String, rc As Long Server = "ftp.officetanaka.co.jp" User = "tanaka" Pass = "9999" Set FTP = CreateObject("basp21.FTP") rc = FTP.Connect(Server, User, Pass) If rc = 0 Then MsgBox "接続しました" Else MsgBox "接続できませんでした" End If FTP.Close Set FTP = Nothing End SubConnectメソッドは、接続に成功すると0を返します。 何らかのエラーで接続できなかった場合、0以外が返ります。 FTP接続を閉じるにはCloseメソッドを実行します。 接続したFTPサーバーからダウンロードできるファイルの一覧を取得するにはGetDirメソッドを実行します。 GetDirメソッドの書式は次の通りです。ftp.GetDir(remote[,mode])引数remoteには、一覧を取得するフォルダへのパスを指定します。 引数modeは省略可能です。取得するリストの種類を指定します。 指定できるのは0から3までの数値です。 0 : ファイル名のみ(既定値) 1 : ディレクトリ名のみ 2 : LISTフォーマット。LISTコマンドの結果を返します。詳細なディレクトリのリスト 3 : NLSTフォーマット。NLSTコマンドの結果を返します。名前のみのリスト ファイル名だけを取得するのでしたら0を指定します。 2を指定すると、パーミッションなど、ファイルの詳細情報を取得できます。 次のコードは、FTPサーバーのSampleフォルダにあるファイル一覧を取得してアクティブシートに表示します。Sub Sample2() Dim FTP As Object, Server As String, User As String, Pass As String Dim rc As Long, i As Long, tmp As Variant Server = "ftp.officetanaka.co.jp" User = "tanaka" Pass = "9999" Set FTP = CreateObject("basp21.FTP") rc = FTP.Connect(Server, User, Pass) If rc = 0 Then tmp = FTP.GetDir("./Sample") If IsArray(tmp) Then For i = 0 To UBound(tmp) - 1 Cells(i + 1, 1) = tmp(i) Next i Else MsgBox "リストが取得できませんでした" End If Else MsgBox "接続できませんでした" End If FTP.Close Set FTP = Nothing End SubGetDirメソッドはファイルの一覧を配列形式で返します。 上記のコードでは、バリアント型の変数tmpに格納しています。 何らかのエラーで一覧を取得できなかった場合は変数tmpが配列になりませんので、IsArray関数で判定しています。 FTPサーバーからファイルをダウンロードするには、GetFileメソッドを使います。 GetFileメソッドの書式は次の通りです。ftp.GetFile(remote,local[,type])引数remoteには、ファイルが存在するフォルダへのパスを指定します。 引数localには、保存するフォルダ名またはファイル名を指定します。 引数typeは省略可能です。ファイルの形式を指定します。 テキスト形式の場合は、引数typeを省略するか0を指定します。 画像などバイナリ形式の場合は1を指定します。 次のコードは、FTPサーバーに「2008-12-03.log」が存在したとき、ローカルの「C:\Sample」フォルダに「Sample.log」という名前で保存します。Sub Sample3() Dim FTP As Object, Server As String, User As String, Pass As String Dim rc As Long, i As Long, tmp As Variant, flag As Boolean Server = "ftp.officetanaka.co.jp" User = "tanaka" Pass = "9999" Set FTP = CreateObject("basp21.FTP") rc = FTP.Connect(Server, User, Pass) If rc = 0 Then tmp = FTP.GetDir("./Sample") If IsArray(tmp) Then For i = 0 To UBound(tmp) - 1 If tmp(i) = "2008-12-3.log" Then flag = True Exit For End If Next i If flag Then rc = FTP.GetFile("./Sample/2008-12-03.log", _ "C:\Sample\Sample.log") If rc <> 1 Then MsgBox "ダウンロードできませんでした" End If Else MsgBox "ファイルがありません" End If Else MsgBox "リストが取得できませんでした" End If Else MsgBox "接続できませんでした" End If FTP.Close Set FTP = Nothing End SubGetFileメソッドはダウンロードに成功すると、ダウンロードしたファイル数を返します。 GetFileメソッドはワイルドカードを使用できます。 また、引数localにフォルダ名を指定すると、ファイル名を変更しないで保存できます。 次のコードは、拡張子「log」のファイルをすべて「C:\Sample」に保存します。Sub Sample4() Dim FTP As Object, Server As String, User As String, Pass As String Dim rc As Long, i As Long, tmp As Variant, flag As Boolean Server = "ftp.officetanaka.co.jp" User = "tanaka" Pass = "9999" Set FTP = CreateObject("basp21.FTP") rc = FTP.Connect(Server, User, Pass) If rc = 0 Then rc = FTP.GetFile("./Sample/*.log", "C:\Sample") Else MsgBox "接続できませんでした" End If FTP.Close Set FTP = Nothing End Sub