VBAでFTP転送する方法
VBAでFTP転送する方法を紹介します。
1.はじめに
仕事で、VBAで出力したファイルをFTPで転送する必要が生じました。
これまではExcel VBAを使って一旦出力したファイルを別のスクリプトなどでFTP転送していましたが、そのまま転送できないか調べたところ、VBAを使ってFTP転送する方法がありました。
ということで、VBAでFTP転送する方法を紹介します。
2.BASP21.dllのダウンロード・インストール
VBAでFTP転送するにはBASP21.dllが必要です。
BASP21は、VBScriptやVisual Basic、VBAなどから使える汎用のコンポーネントで、FTP以外にも豊富な機能を有しています。
BASP21のページにアクセスして、ページにある「Down Load! BASP21-2003-0211.exe (1.44MB) 」のリンクをクリック。
ダウンロードしたexeファイルを実行します。
使用許諾契約が表示されるので「はい」をクリック。
インストールが開始します。
インストールが開始したら「完了」をクリック。
3.VBAを使ったFTP
VBAでFTPを行うには、以下のコードを実装します。
Sub test()
Dim ftp
Dim rc As Long
Dim host As String
Dim user As String
Dim pass As String
Dim file As String
Dim dest As String
Set ftp = CreateObject("basp21.FTP")
host = "ホストアドレス"
user = "ユーザー名"
pass = "パスワード"
dest = "送信先ディレクトリ"
rc = ftp.Connect(host, user, pass)
If rc <> 0 Then
MsgBox "接続NG"
ftp.Close
Exit Sub
End If
ftp.Command ("pasv")
file = Application.GetOpenFilename() '送信ファイル
rc = ftp.PutFile(file, dest)
If rc <> 1 Then
MsgBox "転送NG"
ftp.Close
Exit Sub
End If
MsgBox "転送OK"
ftp.Close
End Sub
以下、コードの簡単な説明です。
まず、CreateObjectメソッドで"basp21.FTP"というオブジェクトを作成します。
Set ftp = CreateObject("basp21.FTP")
FTP接続情報(ホストアドレス・ユーザー名・パスワード・送信ファイル・送信先ディレクトリ)を設定します。Application.GetOpenFilename()でファイル選択ダイアログが開きます。
host = "ホストアドレス"
user = "ユーザー名"
pass = "パスワード"
dest = "送信先ディレクトリ"
送信先ディレクトリを空にしておけばカレントディレクトリに送信されます。パスを指定する場合はカレントディレクトリからの相対パス指定のようです。
dest = "test/" 'OK
次のようにルートからの絶対パスを設定するとNGになるので気をつけてください。
dest = "/home/hoge/test/" 'NG
ConnectでFTPサーバに接続します。rcに0が返却されればOKです。
rc = ftp.Connect(host, user, pass)
必要に応じてPASVモードにします。
ftp.Command ("pasv")
PutFileでFTPサーバにファイルを転送します。rcには送信したファイル数が返却されます。1ファイル送信した場合、1が返却されればOKです。
file = Application.GetOpenFilename() '送信ファイル
rc = ftp.PutFile(file, Folder)
CloseでFTP接続を切断します。
ftp.Close
Windowsのファイアウォールの設定によっては、下記のようなメッセージが表示されるので、「ブロックを解除する」をクリックしてください。
4.MKDについて
BASP21では、以下のコマンドでリモート側のディレクトリを作成することができます。
ftp.Command ("MKD " & ディレクトリのフルパス)
ただし同時に作成できるディレクトリは1階層のみのようです。
たとえば、/home/hogeという既存のディレクトリがある場合、
ftp.Command ("MKD /home/hoge/foo/bar/")
とするとNGになるようなので、
ftp.Command ("MKD /home/hoge/foo/")
ftp.Command ("MKD /home/hoge/foo/bar/")
という風に1階層ずつ作成してみてください。
コマンドの詳細や上記以外のコマンドについては下記のページで詳しく解説されています。
2014.05.21
4項を追加しました。