今回は、VBAやVBSでFTPを実行してファイル転送をする際のサンプルコードを紹介します。
尚、当サンプルコードでは、Windows標準のFTPクライアント機能のみを使用します。
インターネット上のサンプルコードでよく利用されているBASP21などの外部プログラムは使用しません。
また、VBAなどでFTPを実行する際の定番である、FTPコマンドを記述した外部ファイルを予め用意して読み込ませる処理も不要にしました。※これは無理やりですが…。
当サンプルコードの処理概要
VBSやVBAでWindows標準のFTPを呼び出してを実行する場合、FTPのコマンドを別のテキストファイルに記述し、FTP実行時にそのファイルを読み込ませます。
ただ、実行環境によってはFTPコマンドだけを別ファイルに分離したくない場合もあります。
当サンプルコードの特徴としては、FTPコマンドファイルを予め用意しなくても済むようにしてあります。
ただし、特殊な実装はしておらず、FTPで接続する直前にFTPコマンドファイルを生成して、FTP実行時にはそのファイルを読み込ませて、FTPを切断したらそのコマンドファイルを削除するようにしただけです。
なので、誇るほど大した処理ではございません…。
VBSやVBAでFTP転送をするサンプルコード
当サンプルコードはファイルのアップロード処理を実装していますが、ダウンロードが必要であれば、FTPコマンド部分をダウンロード用のコマンドに書き変えてください。
また、言語はVBScriptで記述しておりますが、VBAでもSubやFunctionプロシージャ化してもらえれば、そのままコピペで動きます。
Option Explicit Dim objFS Dim objShell Dim objFile Set objFS = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") 'FTPのコマンドファイルを作成します。 Set objFile = objFS.OpenTextFile("ftp_cmd.txt",2,True) 'FTPで実行するFTPコマンドをテキストファイルに書き込みます。 'FTPサーバーのホスト名を指定します。 objFile.WriteLine("open 192.168.1.1") 'FTPサーバーで許可されたユーザー名を指定します。 objFile.WriteLine("ユーザー名") '対象のユーザーのパスワードを指定します。 objFile.WriteLine("パスワード") 'FTPサーバー側のカレントディレクトリを必要によって移動します。 objFile.WriteLine("cd test/") '転送するファイルの種類を指定します。※通常はbinary objFile.WriteLine("binary") 'アップロードするファイルを指定します。 objFile.WriteLine("put test.pdf") '複数ファイルをまとめてアップロードする場合は、mputコマンドを使用します。 'また、mputではファイルごとに確認メッセージが表示されて処理が止まる為、 'promptコマンドを実行して対話モードをオフにします。 objFile.WriteLine("prompt") objFile.WriteLine("mput C:\test\*.pdf") 'FTP操作を終了します。 objFile.WriteLine("bye") '開いたファイルを閉じます。 objFile.Close 'FTPコマンドファイルを指定してFTPを実行します。 objShell.Run "FTP -s:ftp_cmd.txt",1,True 'コマンドファイルを削除します。 objFS.DeleteFile "ftp_cmd.txt" 'オブジェクトを破棄します。 Set objFile = Nothing Set objFS = Nothing Set objShell = nothing
VBAでの実装時の注意点
VBAで実行する場合は、カレントディレクトリの動きがVBSと異なるため、ファイルパスを指定する箇所はフルパスで記述してください。
後、VBAの場合は、Windowsファイアーウォールの設定によっては通信がブロックされる為、FTPの通信を許可してあげる必要があります。
最後に
今回はVBAやVBScriptでFTPを実行する場合のサンプルコードを紹介しました。
FTPコマンドの外部ファイルを使わずにVBAやVBSで実装できないかを試行錯誤していましたが、Windows標準のFTPクライアント機能を使う限りは無理そうで、最終的にこんな実装になりました。
参考になるかはわかりませんが、良ければ活用してください。