ExcelにFTPアップロード・ダウンロード機能をつけてみた。

らら
らら

はじめに

前回VS CodeでCSV+FTPしたけど、やっぱりエクセルがええ・・って時の・・

エクセルぎらいな、おいらが、Microsoft Copilotに聞きながらつくってみたよ。

ExcelでFTPするには・・

1.Windows標準のWindows API wininet.dllを使用する。パッシブは使用可能(SFTPは利用できない)

 32bit(VB7),64bitで使い方が異なる

2.BASP21 DLLを使う。

 32bit版は無料だけど、64bit版は有料

3.WinSCP COM DLLを使う。無料

4.ShellコマンドでFTPなどを起動する。コマンドプロンプトで動くこと自体がこわい。

5.その他有料のCOM(DLL)を使う

今回は・・・

Windows標準のFTP wininet.dllを使用した。

WinSCPのCOMを使った。

WinSCPの実行ファイルでshellを考えたけど、昔からコマンドラインでできるのをしってたけど。

インストールしておくと、バックドア的で使用されるのが・・こわい・・

Filezillaとかは、セキュリティ面でなくなった機能だしね・・

WinSCPに関しては、ちょっと前に偽サイトとか・・出てて・・怖い・・なので今回は、COMでやってみる・・

Excelで作ってみる

エクセル上で、FTPドメイン、ID、パスを設定して変更できるように・・

まずは、下記で、入力する項目を洗いだし


FTP情報
	接続方法	Windows標準 WinSCP
	ホスト名
	ポート
	ユーザー名
	パスワード
	リモートディレクトリ
アップロードするパスとファイル名
	パス
	ファイル名

下記に設定しました

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

エクセルのセル位置を変えるとVBAコードを変更する必要があります。


接続方法	B3
ホスト名	B4
ポート	B5
ユーザー名	B6
パスワード	B7
リモートディレクトリ	B8
アップロードするパスとファイル名	B11

次に・・接続方法は。ドロップダウン リストにしたいので・・

B3にカーソルを合わせてメニューのデータからデータの入力規則をクリックします。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

次に、入力値の種類をリスト、元の値をカンマ区切りで

名称を変更するとVBAの修正が必要です。


Windows標準,WinSCP

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

再度修正する場合も、修正する箇所を選択して、メニューのデータからデータの入力規則をクリックします。

次に・・ボタンを作成します

下記の3つを想定・・・


CSVファイル読み込み
FTPアップロード
FTPダウンロード

ボタンは、Excel開発モードじゃないとできないので

メニューのファイルからオプションを選択します。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

オプションからリボンのユーザー設定をクリックして開発にチェックします。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

メニューに開発が、表示されます。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

開発者メニューからコントロールグループで 挿入をクリックして フォーム コントロールのボタンをクリックします。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

とりあえず、今回は、ボタンのみ作成して、マクロの登録はあとで行います。

1つボタンを作成したら、コピーで3つ用意してボタン名称を下記に設定します。


CSVファイル読み込み
FTPアップロード
FTPダウンロード

こんな感じ・・・

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

これで設定画面は完了で、お好みでデザインしてもOK!

VBAのマクロ

はじめに、Windows標準のFTP wininet.dllを利用する方法です。

コードは下記

これは、wininet.dllのWindow APIをVBAで使用する場合の定義とFTPダウンロードとアップロードの関数化したファイルです。

これはC言語とかでも、同じように呼びだすので・・

たぶん、コピペで32bit,64bitとも行くと思います。。64bitしか検証してません。


Option Explicit
' Constants - InternetConnect.dwService
Public Const INTERNET_SERVICE_FTP As Long = 1&
Public Const INTERNET_SERVICE_GOPHER As Long = 2&
Public Const INTERNET_SERVICE_HTTP As Long = 3&
' Constants - InternetConnect.dwFlags
Public Const INTERNET_FLAG_PASSIVE As Long = &H8000000
' Constants - FtpGetFile.dwFlags (FTP TransferType)
' Constants - FtpPutFile.dwFlags (FTP TransferType)
Public Const FTP_TRANSFER_TYPE_UNKNOWN As Long = &H0&
Public Const FTP_TRANSFER_TYPE_ASCII As Long = &H1&
Public Const FTP_TRANSFER_TYPE_BINARY As Long = &H2&
Public Const INTERNET_FLAG_TRANSFER_ASCII As Long = FTP_TRANSFER_TYPE_ASCII
Public Const INTERNET_FLAG_TRANSFER_BINARY As Long = FTP_TRANSFER_TYPE_BINARY
' Constants - FtpGetFile.dwFlags (Cache Flags)
' Constants - FtpPutFile.dwFlags (Cache Flags)
Public Const INTERNET_FLAG_RELOAD As Long = &H80000000
Public Const INTERNET_FLAG_RESYNCHRONIZE As Long = &H800
Public Const INTERNET_FLAG_NEED_FILE As Long = &H10
Public Const INTERNET_FLAG_HYPERLINK As Long = &H400
' Constants - FtpGetFile.dwFlagsAndAttributes
Public Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20
Public Const FILE_ATTRIBUTE_ENCRYPTED As Long = &H4000
Public Const FILE_ATTRIBUTE_HIDDEN As Long = &H2
Public Const FILE_ATTRIBUTE_NORMAL As Long = &H80
Public Const FILE_ATTRIBUTE_OFFLINE As Long = &H1000
Public Const FILE_ATTRIBUTE_READONLY As Long = &H1
Public Const FILE_ATTRIBUTE_SYSTEM As Long = &H4
Public Const FILE_ATTRIBUTE_TEMPORARY As Long = &H100
Public Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10
Public Const FILE_ATTRIBUTE_COMPRESSED As Long = &H800
#If VBA7 Then
    Private Declare PtrSafe Function InternetOpenA Lib "wininet.dll" ( _
        ByVal sAgent As String, _
        ByVal lAccessType As Long, _
        ByVal sProxyName As String, _
        ByVal sProxyBypass As String, _
        ByVal lFlags As Long) As Long
    Private Declare PtrSafe Function InternetConnectA Lib "wininet.dll" ( _
        ByVal hInternetSession As Long, _
        ByVal sServerName As String, _
        ByVal nServerPort As Long, _
        ByVal sUsername As String, _
        ByVal sPassword As String, _
        ByVal lService As Long, _
        ByVal lFlags As Long, _
        ByVal lcontext As Long) As Long
    Private Declare PtrSafe Function FtpGetFileA Lib "wininet.dll" ( _
        ByVal hConnect As Long, _
        ByVal lpszRemoteFile As String, _
        ByVal lpszNewFile As String, _
        ByVal fFailIfExists As Long, _
        ByVal dwFlagsAndAttributes As Long, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Long
    Private Declare PtrSafe Function FtpPutFileA Lib "wininet.dll" _
       (ByVal hFtpSession As Long, _
        ByVal lpszLocalFile As String, _
        ByVal lpszRemoteFile As String, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Boolean
    Private Declare PtrSafe Function InternetCloseHandle Lib "wininet" ( _
        ByVal hInet As Long) As Long
#Else
    Private Declare Function InternetOpenA Lib "wininet.dll" ( _
        ByVal sAgent As String, _
        ByVal lAccessType As Long, _
        ByVal sProxyName As String, _
        ByVal sProxyBypass As String, _
        ByVal lFlags As Long) As Long
    Private Declare Function InternetConnectA Lib "wininet.dll" ( _
        ByVal hInternetSession As Long, _
        ByVal sServerName As String, _
        ByVal nServerPort As Long, _
        ByVal sUsername As String, _
        ByVal sPassword As String, _
        ByVal lService As Long, _
        ByVal lFlags As Long, _
        ByVal lcontext As Long) As Long
    Private Declare Function FtpGetFileA Lib "wininet.dll" ( _
        ByVal hConnect As Long, _
        ByVal lpszRemoteFile As String, _
        ByVal lpszNewFile As String, _
        ByVal fFailIfExists As Long, _
        ByVal dwFlagsAndAttributes As Long, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Long
    Private Declare Function FtpPutFileA Lib "wininet.dll" _
       (ByVal hFtpSession As Long, _
        ByVal lpszLocalFile As String, _
        ByVal lpszRemoteFile As String, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Boolean
    Private Declare Function InternetCloseHandle Lib "wininet" ( _
        ByVal hInet As Long) As Long
#End If
Sub FtpDownload(ByVal strRemoteFile As String, _
                ByVal strLocalFile As String, _
                ByVal strHost As String, _
                ByVal lngPort As Long, _
                ByVal strUser As String, _
                ByVal strPass As String)
    Dim hOpen   As Long
    Dim hConn   As Long
    hOpen = InternetOpenA("FTPGET", 1, vbNullString, vbNullString, 1)
    hConn = InternetConnectA(hOpen, strHost, lngPort, strUser, strPass,  INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
    ' 1; 上書きエラー 0:エラーなし
    If FtpGetFileA(hConn, strRemoteFile, strLocalFile, 0, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then
        MsgBox "ダウンロード成功"
    Else
        MsgBox "ダウンロード失敗" & Err.LastDllError
    End If
    InternetCloseHandle hConn
    InternetCloseHandle hOpen
End Sub
Sub FtpUpload(ByVal strRemoteFile As String, _
              ByVal strLocalFile As String, _
              ByVal strHost As String, _
              ByVal lngPort As Long, _
              ByVal strUser As String, _
              ByVal strPass As String)
Dim hOpen   As Long
Dim hConn   As Long
    hOpen = InternetOpenA("FTPGET", 1, vbNullString, vbNullString, 1)
    hConn = InternetConnectA(hOpen, strHost, lngPort, strUser, strPass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
    If FtpPutFileA(hConn, strLocalFile, strRemoteFile, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then
        MsgBox "アップロード成功"
    Else
        MsgBox "アップロード失敗" & Err.LastDllError
    End If
    InternetCloseHandle hConn
    InternetCloseHandle hOpen
End Sub

マクロ登録はMicrosoft Copilotに聞いたらこんな感じ・・


Excelで Alt + F11 キーを押してVBAエディタを開きます。
挿入 > モジュール を選択して新しいモジュールを作成します。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

コードを貼って、オブジェクト名をWindowsAPIWininet_ftpで登録

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

再度、挿入 > モジュール を選択して新しいモジュールを作成します。

今回の処理の分のソースを貼り付けします。

ここでは、作成したボタンと連動するコードと、エクセルで設定した内容がここで反映されて各FTPへ接続されます。


Option Explicit
Sub CSV_SELECT()
    Dim csvFile As String
    ' CSVファイルのパスを指定
    csvFile = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", , "CSVファイルを選択してください")
    If csvFile = "False" Then Exit Sub ' キャンセルされた場合は終了
    Call CsvToSheet(csvFile, "CSVデータ")
End Sub
'Windows wininet.dllでアップロード
Sub FTP_UPLOAD()
    Dim strHost As String
    Dim strUser As String
    Dim strPass As String
    Dim strLocalFile As String
    Dim strRemoteFile As String
    Dim strHostFolder As String
    Dim strMode As String
    Dim strPort As String
    Dim lngPort As Long
    ' FTP情報
    strMode = Sheet1.Range("B3").Value
    strHost = Sheet1.Range("B4").Value
    lngPort = Val(Sheet1.Range("B5").Value)
    strUser = Sheet1.Range("B6").Value
    strPass = Sheet1.Range("B7").Value
    strHostFolder = IIf(Right(Sheet1.Range("B8").Value, 1) <> "/", Sheet1.Range("B8").Value & "/", Sheet1.Range("B8").Value)
    If strMode = "WinSCP" Then
        If lngPort = 21 Then
            strPort = Protocol_Ftp
        Else
            strPort = Protocol_Sftp
        End If
    End If
    'アップロード
    strLocalFile = GetFullFileName(Sheet1.Range("A11").Value, Sheet1.Range("B11").Value)
    If IsFileExist(strLocalFile) Then
        Call SheetToCSV(strLocalFile)
        strRemoteFile = strHostFolder & Sheet1.Range("B11").Value
        If strMode = "WinSCP" Then
            Call WinscpUpload(strRemoteFile, strLocalFile, strHost, strPort, strUser, strPass)
        Else
            Call FtpUpload(strRemoteFile, strLocalFile, strHost, lngPort, strUser, strPass)
        End If
    End If
    MsgBox "完了" & vbInformation
End Sub
'Excel シートをCSVファイルに保存
Sub SheetToCSV(ByVal csvFile As String)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("CSVデータ")
    Application.ScreenUpdating = False
    ws.Select
    ws.Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=csvFile, FileFormat:=xlCSV, local:=True
    Application.DisplayAlerts = True
    ActiveWorkbook.Close False
    Application.ScreenUpdating = True
End Sub
'Windows wininet.dllでダウンロード
Sub FTP_DOWNLOAD()
    Dim strHost As String
    Dim strUser As String
    Dim strPass As String
    Dim strLocalFile As String
    Dim strRemoteFile As String
    Dim strHostFolder As String
    Dim strMode As String
    Dim strPort As String
    Dim lngPort As Long
    ' FTP情報
    strMode = Sheet1.Range("B3").Value
    strHost = Sheet1.Range("B4").Value
    lngPort = Val(Sheet1.Range("B5").Value)
    strUser = Sheet1.Range("B6").Value
    strPass = Sheet1.Range("B7").Value
    strHostFolder = IIf(Right(Sheet1.Range("B8").Value, 1) <> "/", Sheet1.Range("B8").Value & "/", Sheet1.Range("B8").Value)
    strLocalFile = GetFullFileName(Sheet1.Range("A11").Value, Sheet1.Range("B11").Value)
    strRemoteFile = strHostFolder & Sheet1.Range("B11").Value
    If strMode = "WinSCP" Then
        If lngPort = 21 Then
            strPort = Protocol_Ftp
        Else
            strPort = Protocol_Sftp
        End If
    End If
    If strMode = "WinSCP" Then
        Call WinscpDownload(strRemoteFile, strLocalFile, strHost, strPort, strUser, strPass)
    Else
        Call FtpDownload(strRemoteFile, strLocalFile, strHost, lngPort, strUser, strPass)
    End If
    Call CsvToSheet(strLocalFile, "CSVデータ")
    MsgBox "完了" & vbInformation
End Sub
'CSVファイルをExcelシートへ読み込み
Private Sub CsvToSheet(ByVal csvFile As String, _
                        ByVal csvSheetName As String, _
                        Optional ByVal FirstRange As String = "A1", _
                        Optional csvSheetNameFormat As String = "")
    Dim Sheet As Worksheet
    Dim csvSheet As Worksheet
    'シート存在チェック
    For Each Sheet In ThisWorkbook.Worksheets
        If Sheet.Name = csvSheetName Then
            Application.DisplayAlerts = False
            Worksheets(csvSheetName).Delete
            Application.DisplayAlerts = True
        End If
    Next
    ' シート作成
    If csvSheetNameFormat = "" Then
        Set csvSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    Else
        Worksheets(csvSheetNameFormat).Copy After:=Worksheets(Worksheets.Count)
        Set csvSheet = ActiveSheet
    End If
    csvSheet.Name = csvSheetName
    Dim wb As Workbook
    Set wb = Workbooks.Open(Filename:=csvFile)
    wb.ActiveSheet.UsedRange.Copy Destination:=csvSheet.Range(FirstRange)
    wb.Close SaveChanges:=False
End Sub
'WinSCP DOM Dllでアップロード
Sub WinscpUpload(ByVal strRemoteFile As String, _
    ByVal strLocalFile As String, _
    ByVal strHost As String, _
    ByVal lngPort As Integer, _
    ByVal strUser As String, _
    ByVal strPass As String)
    Dim sessionOptions As New sessionOptions
    With sessionOptions
        .Protocol = lngPort
        .HostName = strHost
        .UserName = strUser
        .Password = strPass
        .GiveUpSecurityAndAcceptAnySshHostKey = True
    End With
    Dim mySession As New Session
    On Error Resume Next
    mySession.Open sessionOptions
    If Err.Number <> 0 Then
        MsgBox "エラー: " & Err.Description
        Exit Sub
    End If
    ' ファイルアップロード
    Dim transferResult As TransferOperationResult
    Set transferResult = mySession.PutFiles(strLocalFile, strRemoteFile, False)
    transferResult.Check
    ' アップロード結果を表示
    Dim transfer As TransferEventArgs
    For Each transfer In transferResult.Transfers
        MsgBox "アップロード成功: " & transfer.Filename
    Next
    mySession.Dispose
End Sub
'WinSCP DOM Dllでダウンロード
Sub WinscpDownload(ByVal strRemoteFile As String, _
    ByVal strLocalFile As String, _
    ByVal strHost As String, _
    ByVal lngPort As Integer, _
    ByVal strUser As String, _
    ByVal strPass As String)
    Dim sessionOptions As New sessionOptions
    With sessionOptions
        .Protocol = lngPort
        .HostName = strHost
        .UserName = strUser
        .Password = strPass
        .GiveUpSecurityAndAcceptAnySshHostKey = True
    End With
    Dim mySession As New Session
    On Error Resume Next
    mySession.Open sessionOptions
    If Err.Number <> 0 Then
        MsgBox "エラー: " & Err.Description
        Exit Sub
    End If
    ' ファイルダウンロード
    Dim transferResult As TransferOperationResult
    Set transferResult = mySession.GetFiles(strRemoteFile, strLocalFile, False)
    transferResult.Check
    ' ダウンロード結果を表示
    Dim transfer As TransferEventArgs
    For Each transfer In transferResult.Transfers
        MsgBox "ダウンロード成功: " & transfer.Filename
    Next
    mySession.Dispose
End Sub
Function GetFullFileName(ByVal strPath As String, ByVal strFileName As String) As String
    GetFullFileName = IIf(Right(strPath, 1) <> "\", strPath & "\", strPath) & strFileName
End Function
Function IsFileExist(ByVal strFullNameFile As String) As Boolean
    With CreateObject("Scripting.FileSystemObject")
        If .FileExists(strFullNameFile) Then IsFileExist = True Else IsFileExist = False
    End With
End Function

オブジェクト名は、FTP_DownloadUpload_modで登録

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

上記でVBAマクロの登録は、完了です。

コードのメモ

WinSCPでは、SshHostKeyFingerprint フィンガープリントを使用しない。.GiveUpSecurityAndAcceptAnySshHostKey = Trueにしてあります。

セキュリティが気になる方は、設定できるようにする必要があります。

エクセルシートは、CSVファイル読み込み、FTPダウンロード事で、シートを削除、追加していますので、CSV側のシート番号は可変します。CsvToSheet関数

WinSCPをソースから省くには・・

COMが設定できないとか・・設定できないときはエラーがでます・・

WinscpUpload WinscpDownload関数毎削除

下記を


    If strMode = "WinSCP" Then
        If lngPort = 21 Then
            strPort = Protocol_Ftp
        Else
            strPort = Protocol_Sftp
        End If
    End If
    If strMode = "WinSCP" Then
        Call WinscpDownload(strRemoteFile, strLocalFile, strHost, strPort, strUser, strPass)
    Else
        Call FtpDownload(strRemoteFile, strLocalFile, strHost, lngPort, strUser, strPass)
    End If

下記だけにする


    Call FtpDownload(strRemoteFile, strLocalFile, strHost, lngPort, strUser, strPass)
or
    Call FtpUpload(strRemoteFile, strLocalFile, strHost, lngPort, strUser, strPass)

次に、前回作成した、ボタンにマクロを割り当てします。

設定するボタンにマウスを置いて右クリックでメニューを出してマクロ登録を選択します。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

各ボタン同じ操作で下記を割り当てします。


CSVファイル読み込み	CSV_SELECT
FTPアップロード	FTP_UPLOAD
FTPダウンロード	FTP_DOWNLOAD

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

WinSCP COM APIをインストール

WinSCP .NET Assembly and COM Library

https://winscp.net/eng/docs/library

上記 Downloading and Installing the Assemblyからダウンロードをします。

.NET assembly/COM libraryをダウンロードします。

https://winscp.net/eng/downloads.php#additional

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

2025年5月時点下記になります。

WinSCP-6.5.1-Automation.zip

ファイルを解凍して下記を実行します。

4.0.30319の部分は環境によって異なります。

エクスプローラー等でC:\Windows\Microsoft.NET\Framework\を見て、バージョンを記載してください。

下記をscp.bat等で保存して、scp.batを管理者権限で実行します。

作成するバッチは、解凍した、WinSCP-6.5.1-AutomationのWinSCPnet.dllと同じフォルダーに作成します。


cd /d %~dp0
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe WinSCPnet.dll /codebase /tlb
PAUSE

バージョンは公式文章では 4.0.30319 or v2.0.50727.のどちらかのようです。

実行するとこんな感じで表示されればOKです。


D:\WinSCP-6.5.1-Automation>C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe WinSCPnet.dll /codebase /tlb
Microsoft .NET Framework Assembly Registration Utility 4.8.9037.0
for Microsoft .NET Framework Version 4.8.9037.0
Copyright (C) Microsoft Corporation.  All rights reserved.
型は正常に登録されました。
アセンブリは 'D:\csvedit\WinSCP-6.5.1-Automation\WinSCPnet.tlb' にエクスポートされ、タイプ ライブラリは正常に登録されま した。

上記で登録したDLLをMicrosoft Visual Basic for Application (VBAエディタ)から設定する方法を

Microsoft Copilotに聞いたらこんな感じ・・


ツール > 参照設定を選択。
「Microsoft HTML Object Library」にチェックを入れて「OK」をクリック。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

参照設定でWinSCP scripting interface .NET wrapperにチェックします。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

これですべて完了です。

作成したエクセルを保存してください。保存はExecelマクロ有効ブック *.xlsmで保存します。

使い方

Windows標準の場合 FTPのみ


接続方法	Windows標準
ホスト名	接続するFTPサイトのドメインを入力します。サーバーによってftp.xxxxとか
ポート		空白でOK 特定ポートの場合は特定ポートを指定
ユーザー名	FTPのユーザアカウントを入れます
パスワード	FTPのパスワードを入れます
リモートディレクトリ	FTPで接続した場合のルートディレクトリを指定してください。
アップロードするパスとファイル名	自分のPCのCSVを置きたい場所のディレクトリとFTPしたいファイル名を指定します。
A11	C:\Users\ユーザー名\Desktop\xxxxx\
B11	test.csv

WinSCPの場合 FTP


接続方法	WinSCP
ホスト名	接続するFTPサイトのドメインを入力します。サーバーによってftp.xxxxとか
ポート		21
ユーザー名	FTPのユーザアカウントを入れます
パスワード	FTPのパスワードを入れます
リモートディレクトリ	FTPで接続した場合のルートディレクトリを指定してください。
アップロードするパスとファイル名	自分のPCのCSVを置きたい場所のディレクトリとFTPしたいファイル名を指定します。
A11	C:\Users\ユーザー名\Desktop\xxxxx\
B11	test.csv

WinSCPの場合 SFTP


接続方法	WinSCP
ホスト名	接続するFTPサイトのドメインを入力します。サーバーによってftp.xxxxとか
ポート		22
ユーザー名	FTPのユーザアカウントを入れます
パスワード	FTPのパスワードを入れます
リモートディレクトリ	FTPで接続した場合のルートディレクトリを指定してください。
アップロードするパスとファイル名	自分のPCのCSVを置きたい場所のディレクトリとFTPしたいファイル名を指定します。
A11	C:\Users\ユーザー名\Desktop\xxxxx\
B11	test.csv

WinSCPでポートがSFTPが22でない場合、ソースを変更する必要があります。

エクセルファイルをインターネット経由で渡したりすると・・

セキュリティでロックされる場合があります。

その時は・・

エクセルのメニューのファイルのオプション→トラストセンターからマクロの設定で

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

一度、下記で設定してから すべてのマクロを有効にする

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

下記がでるようにして、下記で許可をして。マクロ設定 警告を表示してすべてのマクロを無効にするに戻します。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

追記拡張

社内で、CSV以外にPDFや画像もセットで送りたいってあったので画面を下記のようにして

E3,D6の場所は、VBAコードで指定しています。

ExcelにFTPアップロード・ダウンロード機能をつけてみた。

Sub FTP_UPLOAD()関数に MsgBox "完了" & vbInformationの前あたりに下記を追加


Dim i As Long
Dim listFiles
Dim strLocalFileEtc As String
Dim strHostFolderEtc As String
Dim strRemoteFileEtc As String
    strHostFolderEtc = IIf(Right(Sheet1.Range("E3").Value, 1) <> "/", Sheet1.Range("E3").Value & "/", Sheet1.Range("E3").Value)
    listFiles = Sheet1.Range("D6:E" & Sheet1.Cells(Rows.Count, "E").End(xlUp).Row).Value
    For i = LBound(listFiles, 1) To UBound(listFiles, 1)
        strLocalFileEtc = GetFullFileName(listFiles(i, 1), listFiles(i, 2))
        If IsFileExist(strLocalFileEtc) Then
            strRemoteFileEtc = strHostFolderEtc & listFiles(i, 2)
            If strMode = "WinSCP" Then
                Call WinscpUpload(strRemoteFileEtc, strLocalFileEtc, strHost, strPort, strUser, strPass)
            Else
                Call FtpUpload(strRemoteFileEtc, strLocalFileEtc, strHost, lngPort, strUser, strPass)
            End If
        End If
    Next i

さいごに

エラー処理など、FTP通信とエクセル側で2つメッセージがでるようになっています。

また、エラー処理は完全ではありません。

エクセルシート上に、FTPパスワードを記載しますのでセキュリティ的に問題があるという方は、VBA側に記載するか(strPass = Sheet1.Range("B7").Value)

エクセルシートにパスワードするなど対応してください。

問題があった場合、責任はとれません・・w、アカウント情報など記載したまま、どっかに送らないでください・・w

ECサイトとかのCSVアップロードにもつかえるかな・・では・・・

今回のコードのほとんどは・・コパイロットくんに書いてもらってます。w

○○で○○したいけど、どう操作するのとか・・ぐぐるより時短でいいし、ぐぐってもないのとかも出てくれて助かりますね。。

関連

jQueryで新着情報をつくってみた。
https://www.omakase.net/blog/2024/09/jquery-1.html

EdgeでMicrosoft Copilotが便利だった・・
https://www.omakase.net/blog/2025/06/edgemicrosoft-copilot.html

VS CodeでCSV+FTP/SFTPを行う
https://www.omakase.net/blog/2025/06/vs-codecsvftpsftp.html

関連記事