Today we will learn how to download and upload files using a VBA FTP script. FTP is a great way to keep your Excel files connected to your file servers, back up your files and worksheets automatically or simply download/upload document without any additional manual hassle.
VBA FTP Download Files
Let us start with learning how to Download Files from FTP using VBA FTP. The below code defines the procedure FtpDownload which does just that:
Private Const FTP_TRANSFER_TYPE_UNKNOWN As Long = 0 Private Const INTERNET_FLAG_RELOAD As Long = &H80000000 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 InternetCloseHandle Lib "wininet" ( _ ByVal hInet As Long) As Long 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, 1, 0, 2) If FtpGetFileA(hConn, strRemoteFile, strLocalFile, 1, 0, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then Debug.Print "Success" Else Debug.Print "Fail" End If 'Close connections InternetCloseHandle hConn InternetCloseHandle hOpen End Sub
Syntax
strRemoteFile
A string path to the file on the remote FTP drive which you want to download e.g. “//home/user/text file.txt”
strLocalFile
A string path to the file on the local drive which you want to save the remote file to e.g. “C:\text file.txt”
strHost
A string with the FTP server name e.g. “192.168.0.100” or “myserver.example.com”.
lngPort
A number specifying the FTP port. 21 by default.
strUser
A string with the FTP user name.
strPass
A string with the FTP user password.
Example
Now let us use the above VBA FTP Download procedure to download a file from our FTP server.
Sub TestDownload FtpDownload "//Download/text file.txt", "C:\text file.txt", _ "192.168.0.100", 21, "username", "password" End Sub
VBA FTP Upload Files
Now let us move to learning how to Upload Files from your local drive to FTP using VBA FTP. The below code defines the procedure FtpUpload which does just that:
Private Const FTP_TRANSFER_TYPE_UNKNOWN As Long = 0 Private Const INTERNET_FLAG_RELOAD As Long = &H80000000 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 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 Sub FtpUpload(ByVal strLocalFile As String, ByVal strRemoteFile 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, 1, 0, 2) If FtpPutFileA(hConn, strLocalFile, strRemoteFile, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then Debug.Print "Success" Else Debug.Print "Fail" End If 'Close connections InternetCloseHandle hConn InternetCloseHandle hOpen End Sub
Syntax
strLocalFile
A string path to the file on the local drive which you want to upload e.g. “C:\text file.txt”
strRemoteFile
A string path with the name of the upload file on the remote drive to e.g. “//home/user/text file.txt”
strHost
A string with the FTP server name e.g. “192.168.0.100” or “myserver.example.com”.
lngPort
A number specifying the FTP port. 21 by default.
strUser
A string with the FTP user name.
strPass
A string with the FTP user password.
Example
Now let us use the above VBA FTP Download procedure to download a file from our FTP server.
Sub TestDownload FtpUpload "C:\text file.txt", "//Download/text file.txt", _ "192.168.0.100", 21, "username", "password" End Sub
Summary and alternatives
Downloading and Uploading files to an FTP server is a very useful task. Although there are several things to remember…
Do not keep your password directly in your Workbook. Your password should be stored in a secure way and there is always a chance you might share your Excel Workbook without deleting the embedded password. A good tip is to save the password in a separate text file on your local drive to which no one else has access. See Reading Files in VBA to do this.
Do you use FTP for file versioning? Use SVN or a dedicated solution instead! Although saving and versioning files to FTP is one way to go don’t rely on custom basic solution to long known problems. Setup SVN on your server of use a dedicated service like OneDrive, DropBox of Google Drive.
Do you want to download files from web servers / pages not from FTP? See this post on Downloading Files using VBA.