从FTP服务器上的文件中获取Excel表

时间:2018-04-26 13:24:38

标签: excel-vba ftp vba excel

我将我的Excel文件存储在FTP服务器上。文件系统由一个中央文件和几个支持文件组成。每个支持文件都有一个表格,其中包含一个表格。中央文件在打开时需要连接到每个支持文件并获取其表并将其复制到中央文件中的特定表中。用户可以使用Excel 2016和Excel 2013版本打开中心文件。

Excel 2016提供了从Web查询查询数据的选项,但在Excel 2013中没有这样的选项。

问题是,如何从支持带有VBA的FTP服务器上的Excel文件中获取数据,以便它在Excel 2013和Excel 2016中都有效?

期待您的建议!

1 个答案:

答案 0 :(得分:1)

这是我在评论中提到的代码,取自here

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

使用该代码,您可以下载支持文件,然后使用Excel打开它们以更新中央文件。

另一个选项可能是PowerQuery(Excel 2013免费AddIn,Excel 2016内置)