VBA从FTP url下载文件

VBA从FTP url下载文件,vba,download,ftp,Vba,Download,Ftp,我正在尝试创建VBA代码,以便从直接FTP链接(异步首选)将文件下载到特定路径。 我只找到了使其与http URL一起工作的代码,但对于FTP,我得到以下错误: “运行时错误“-2146697210(800c0006)”: 系统找不到指定的对象“ 对于这些首次测试,您没有为ftp服务器设置用户名或密码 我的代码仅适用于http,如下所示: Sub DownloadFile() Dim myURL As String myURL = "ftp://xxx.xxx.xxx.xxx/test.txt

我正在尝试创建VBA代码,以便从直接FTP链接(异步首选)将文件下载到特定路径。 我只找到了使其与http URL一起工作的代码,但对于FTP,我得到以下错误:

“运行时错误“-2146697210(800c0006)”: 系统找不到指定的对象“

对于这些首次测试,您没有为ftp服务器设置用户名或密码

我的代码仅适用于http,如下所示:

Sub DownloadFile()

Dim myURL As String
myURL = "ftp://xxx.xxx.xxx.xxx/test.txt"

Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", myURL, False, "username", "password"
WinHttpReq.send

myURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WinHttpReq.responseBody
    oStream.SaveToFile "C:\FTP\file.txt", 2 ' 1 = no overwrite, 2 = overwrite
    oStream.Close
End If

End Sub

您需要向项目中添加一个模块以获得FTP功能。子FTPdownload具有示例代码。取自


您需要向项目中添加一个模块以获得FTP功能。子FTPdownload具有示例代码。取自


您需要向项目中添加一个模块以获得FTP功能。子FTPdownload具有示例代码。取自


您需要向项目中添加一个模块以获得FTP功能。子FTPdownload具有示例代码。取自


我不得不回去,但是VBA的FTP确实涉及到更多的内容——我相信这是唯一不需要安装额外控件的方法。我将在下面发布此代码。我不得不回去,但是VBA的FTP确实涉及到更多的内容——我相信这是唯一不需要安装额外控件的方法。我将在下面发布此代码。我不得不回去,但是VBA的FTP确实涉及到更多的内容——我相信这是唯一不需要安装额外控件的方法。我将在下面发布此代码。我不得不回去,但是VBA的FTP确实涉及到更多的内容——我相信这是唯一不需要安装额外控件的方法。我将在下面发布此代码。我试过以上的方法。它工作得很好。但若防火墙开启或任何防病毒防火墙开启,则上述代码不起作用。如果需要设置跳过防火墙,请建议我。我已经尝试了上述方法。它工作得很好。但若防火墙开启或任何防病毒防火墙开启,则上述代码不起作用。如果需要设置跳过防火墙,请建议我。我已经尝试了上述方法。它工作得很好。但若防火墙开启或任何防病毒防火墙开启,则上述代码不起作用。如果需要设置跳过防火墙,请建议我。我已经尝试了上述方法。它工作得很好。但若防火墙开启或任何防病毒防火墙开启,则上述代码不起作用。如果需要设置跳过防火墙,请建议我。
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)
    'usage
    'FtpDownload "/TEST/test.html", "c:\test.html", "ftp.server.com", 21, "user", "password"
    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 "done"
    Else
        Debug.Print "fail"
    End If

    InternetCloseHandle hConn
    InternetCloseHandle hOpen

End Sub