その他関連のテクニック

FTPでダウンロードする

(Excel 97/2000/2002/2003/2007)

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 Sub   
Connectメソッドは、接続に成功すると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 Sub   
GetDirメソッドはファイルの一覧を配列形式で返します。 上記のコードでは、バリアント型の変数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 Sub   
GetFileメソッドはダウンロードに成功すると、ダウンロードしたファイル数を返します。 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