VBAから
・FTPサーバーへ
・ファイルを送信/受信
できます!
実現方法は
・FTPコマンド
・Windows API
の2種類あります!
この記事では
・FTPコマンドを使用する方法
を記載します!
Windows APIを使用する方法は、
以下の記事をご確認ください!
前提①(basp21.FTPについて)
他のサイトでは「basp21.FTP」なるものを使用した方法が記載されていますが、「basp21.FTP」は現在使用できません。
※64bitのOSでは使用できません。
※きっと昔(32bitのOSの時)は使用できたんだと思います。
私のPC(64bitのOS)上で「basp21.FTP」の使用を試みると
・エラー「ActiveX コンポーネントはオブジェクトを作成できません」
が発生します。
※「CreateObject(“basp21.FTP”)」でエラーが発生します。
よって、Windows標準の「FTPコマンド」を使用して、ファイルの送信/受信をします。
「FTPコマンド」の実態は「ftp.exe」です。
前提②(FTPを使用したVBAコードについて)
FTPを使用してファイルを送信/受信するために、VBAコード内で以下の3つを実施します。
VBAコード(ファイル送信)
ここでは例として
・デスクトップ配下のファイル「test01.txt」を
・FTPコマンドを使用して、FTPサーバーへ送信
します。
Option Explicit
Sub ftpPutsample()
'-----------------------------------------
'接続情報を指定
'-----------------------------------------
Const FTP_SERVER As String = "ftpServerName"
Const USER As String = "loginUser"
Const PASSWORD As String = "password"
Dim fso As Object
Dim wsh As Object
Dim objFile As Object
Dim ftpCmdFile As String
Dim targetFile As String
Dim serverFolderPath As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set wsh = CreateObject("WScript.Shell")
'-----------------------------------------
'各種ファイル/フォルダを指定
'-----------------------------------------
'FTPコマンドファイル
ftpCmdFile = "C:\Users\user\Desktop\ftp_cmd.txt"
'送信ファイル
targetFile = "C:\Users\user\Desktop\test01.txt"
'FTPサーバー側のフォルダ
serverFolderPath = "/temp/"
'-----------------------------------------
'FTPコマンドファイル作成
'-----------------------------------------
Set objFile = fso.OpenTextFile(ftpCmdFile, 2, True)
'接続情報の書き込み
objFile.WriteLine ("open " & FTP_SERVER)
objFile.WriteLine (USER)
objFile.WriteLine (PASSWORD)
'カレントディレクトリ移動の書き込み
objFile.WriteLine ("cd " & serverFolderPath)
'転送モードの書き込み
'┗BINARY
'┗ASCII
objFile.WriteLine ("BINARY")
'送信コマンドの書き込み
objFile.WriteLine ("put " & targetFile)
'FTP終了コマンドの書き込み
objFile.WriteLine ("bye")
'FTPコマンドファイルClose
objFile.Close
'-----------------------------------------
'FTPコマンドファイル実行
'-----------------------------------------
wsh.Run "FTP -i -s:" & ftpCmdFile, WaitOnReturn:=True
'-----------------------------------------
'FTPコマンドファイル削除
'-----------------------------------------
fso.DeleteFile ftpCmdFile
'後片づけ
Set fso = Nothing
Set wsh = Nothing
Set objFile = Nothing
End Sub
上記で作成される「FTPコマンドファイル」は以下になります。
※上記に記載している通り、このファイルは実行後に削除しています。
open ftpServerName
loginUser
password
cd /temp/
BINARY
put C:\Users\user\Desktop\test01.txt
bye
上記のVBAコードを実行すると、FTPサーバーへファイルが送信されます。
VBAコード(ファイル受信)
ここでは例として
・FTPサーバー上のファイル「test01.txt」をローカルの「temp」フォルダへ
・FTPコマンドを使用して、FTPサーバーから受信
します。
Option Explicit
Sub ftpGetSample()
'-----------------------------------------
'接続情報を指定
'-----------------------------------------
Const FTP_SERVER As String = "ftpServerName"
Const USER As String = "loginUser"
Const PASSWORD As String = "password"
Dim fso As Object
Dim wsh As Object
Dim objFile As Object
Dim ftpCmdFile As String
Dim targetFile As String
Dim serverFolderPath As String
Dim localFolderPath As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set wsh = CreateObject("WScript.Shell")
'-----------------------------------------
'各種ファイル/フォルダを指定
'-----------------------------------------
'FTPコマンドファイル
ftpCmdFile = "C:\Users\user\Desktop\ftp_cmd.txt"
'受信ファイル
targetFile = "test01.txt"
'FTPサーバー側のフォルダ
serverFolderPath = "/temp/"
'ローカル側のフォルダ(保存先)
localFolderPath = "C:\Users\user\Desktop\temp\"
'-----------------------------------------
'FTPコマンドファイル作成
'-----------------------------------------
Set objFile = fso.OpenTextFile(ftpCmdFile, 2, True)
'接続情報の書き込み
objFile.WriteLine ("open " & FTP_SERVER)
objFile.WriteLine (USER)
objFile.WriteLine (PASSWORD)
'カレントディレクトリ移動の書き込み
objFile.WriteLine ("cd " & serverFolderPath)
'転送モードの書き込み
'┗BINARY
'┗ASCII
objFile.WriteLine ("BINARY")
'受信コマンドの書き込み
objFile.WriteLine ("get " & targetFile & " " & localFolderPath & targetFile)
'FTP終了コマンドの書き込み
objFile.WriteLine ("bye")
'FTPコマンドファイルClose
objFile.Close
'-----------------------------------------
'FTPコマンドファイル実行
'-----------------------------------------
wsh.Run "FTP -i -s:" & ftpCmdFile, WaitOnReturn:=True
'-----------------------------------------
'FTPコマンドファイル削除
'-----------------------------------------
fso.DeleteFile ftpCmdFile
'後片づけ
Set fso = Nothing
Set wsh = Nothing
Set objFile = Nothing
End Sub
上記で作成される「FTPコマンドファイル」は以下になります。
※上記に記載している通り、このファイルは実行後に削除しています。
open ftpServerName
loginUser
password
cd /temp/
BINARY
get test01.txt C:\Users\user\Desktop\temp\test01.txt
bye
上記のVBAコードを実行すると、FTPサーバーからファイルが受信されます。
参考①
FTPサーバーへファイルを送信/受信する前に、対象のファイルが存在有無を確認した方が良いかもです。
ファイルの存在有無の確認方法は、以下の記事をご確認ください。
参考②
上記で使用した以下のFTPコマンドの詳細は、公式サイトをご確認ください。
●ftpコマンド(Runメソッドで実行しているコマンド)
●FTPのopenコマンド(FTPへ接続するコマンド)
●FTPのputコマンド(ファイルを送信するコマンド)
●FTPのgetコマンド(ファイルを受信するコマンド)
●FTPのbyeコマンド(FTPを切断するコマンド)
参考③
上記で使用した以下の詳細は、公式サイトをご確認ください。
●「FileSystemObject」の「OpenTextFile」メソッド
●「FileSystemObject」の「DeleteFile」メソッド
●「Windows Script Host」の「Run」メソッド