はじめに
前回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
ホスト名
ポート
ユーザー名
パスワード
リモートディレクトリ
アップロードするパスとファイル名
パス
ファイル名
下記に設定しました
エクセルのセル位置を変えるとVBAコードを変更する必要があります。
接続方法 B3
ホスト名 B4
ポート B5
ユーザー名 B6
パスワード B7
リモートディレクトリ B8
アップロードするパスとファイル名 B11
次に・・接続方法は。ドロップダウン リストにしたいので・・
B3にカーソルを合わせてメニューのデータからデータの入力規則をクリックします。
次に、入力値の種類をリスト、元の値をカンマ区切りで
名称を変更するとVBAの修正が必要です。
Windows標準,WinSCP
再度修正する場合も、修正する箇所を選択して、メニューのデータからデータの入力規則をクリックします。
次に・・ボタンを作成します
下記の3つを想定・・・
CSVファイル読み込み
FTPアップロード
FTPダウンロード
ボタンは、Excel開発モードじゃないとできないので
メニューのファイルからオプションを選択します。
オプションからリボンのユーザー設定をクリックして開発にチェックします。
メニューに開発が、表示されます。
開発者メニューからコントロールグループで 挿入をクリックして フォーム コントロールのボタンをクリックします。
とりあえず、今回は、ボタンのみ作成して、マクロの登録はあとで行います。
1つボタンを作成したら、コピーで3つ用意してボタン名称を下記に設定します。
CSVファイル読み込み
FTPアップロード
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エディタを開きます。
挿入 > モジュール を選択して新しいモジュールを作成します。
コードを貼って、オブジェクト名をWindowsAPIWininet_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で登録
上記で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)
次に、前回作成した、ボタンにマクロを割り当てします。
設定するボタンにマウスを置いて右クリックでメニューを出してマクロ登録を選択します。
各ボタン同じ操作で下記を割り当てします。
CSVファイル読み込み CSV_SELECT
FTPアップロード FTP_UPLOAD
FTPダウンロード FTP_DOWNLOAD
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
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」をクリック。
参照設定でWinSCP scripting interface .NET wrapperにチェックします。
これですべて完了です。
作成したエクセルを保存してください。保存は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でない場合、ソースを変更する必要があります。
エクセルファイルをインターネット経由で渡したりすると・・
セキュリティでロックされる場合があります。
その時は・・
エクセルのメニューのファイルのオプション→トラストセンターからマクロの設定で
一度、下記で設定してから すべてのマクロを有効にする
下記がでるようにして、下記で許可をして。マクロ設定 警告を表示してすべてのマクロを無効にするに戻します。
追記拡張
社内で、CSV以外にPDFや画像もセットで送りたいってあったので画面を下記のようにして
E3,D6の場所は、VBAコードで指定しています。
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