【VBA】FTPコマンドを使用して、FTPサーバーへファイルを送信/受信する

VBAから
 ・FTPサーバーへ
 ・ファイルを送信/受信
できます!

実現方法は
 ・FTPコマンド
 ・Windows API
の2種類あります!

この記事では
 ・FTPコマンドを使用する方法
を記載します!

Windows APIを使用する方法は、
以下の記事をご確認ください!



PR

前提①(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クライアント」の実態を「whereコマンド」で確認
「FTPコマンド」の実態を「whereコマンド」で確認
PR

前提②(FTPを使用したVBAコードについて)

FTPを使用してファイルを送信/受信するために、VBAコード内で以下の3つを実施します。

VBAコード内で実施すること
  • FTPコマンドファイル作成
    ・各種FTPコマンドを記載したファイルを作成します。

  • FTPコマンドファイル実行
    ・作成したFTPコマンドファイルを実行します。

  • FTPコマンドファイル削除
    ・作成したFTPコマンドファイルを削除します。
PR

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サーバー名」、「ログインユーザー名」、「パスワード」を指定します(8~10行目)。
※環境に合わせて変更してください。
※上記ではそれぞれ「ftpServerName」、「loginUser」、「password」としています。

「各種ファイル/フォルダ」を指定します(26~30行目)。
※状況に合わせて変更してください。

FTPコマンドファイル」を作成しています(35~53行目)。
※FTPコマンドのputにより、ファイルを送信します。

FTPコマンドファイル」を実行しています(58行目)。
※FTPコマンド(=ftp.exe)」を実行しています。
※FTPコマンドの「-i」オプションで、「インタラクティブモード」を「オフ」にしています(確認メッセージの無効化)。
FTPコマンドの「-s」オプションで、「FTPコマンドファイル」を指定します。
※Runメソッドの引数「WaitOnReturn」に「True」を指定することで、同期実行にしています。

FTPコマンドファイル」を削除しています(63行目)。


上記で作成される「FTPコマンドファイル」は以下になります。
※上記に記載している通り、このファイルは実行後に削除しています。

open ftpServerName
loginUser
password
cd /temp/
BINARY
put C:\Users\user\Desktop\test01.txt
bye


上記のVBAコードを実行すると、FTPサーバーへファイルが送信されます。

ファイル送信の実行結果
ファイル送信の実行結果

FTPサーバー上に既に同名ファイルが存在した場合は、上書きされます。

PR

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コマンドファイル」を作成しています(38~60行目)。
※FTPコマンドのgetにより、ファイルを受信します。


上記で作成される「FTPコマンドファイル」は以下になります。
※上記に記載している通り、このファイルは実行後に削除しています。

open ftpServerName
loginUser
password
cd /temp/
BINARY
get test01.txt C:\Users\user\Desktop\temp\test01.txt
bye


上記のVBAコードを実行すると、FTPサーバーからファイルが受信されます。

ファイル受信の実行結果
ファイル受信の実行結果

ローカルの保存先に既に同名ファイルが存在した場合は、上書きされます。

PR

参考①

FTPサーバーへファイルを送信/受信する前に、対象のファイルが存在有無を確認した方が良いかもです。

ファイルの存在有無の確認方法は、以下の記事をご確認ください。

PR

参考②

上記で使用した以下のFTPコマンドの詳細は、公式サイトをご確認ください。

●ftpコマンド(Runメソッドで実行しているコマンド)


●FTPのopenコマンド(FTPへ接続するコマンド)


●FTPのputコマンド(ファイルを送信するコマンド)


●FTPのgetコマンド(ファイルを受信するコマンド)


●FTPのbyeコマンド(FTPを切断するコマンド)

PR

参考③

上記で使用した以下の詳細は、公式サイトをご確認ください。

●「FileSystemObject」の「OpenTextFile」メソッド


●「FileSystemObject」の「DeleteFile」メソッド


●「Windows Script Host」の「Run」メソッド