2014-12-13 160 views
2

我想要获得FTP下载操作以使用VBA Excel(在Excel 2013 x64,Windows 7 SP1 x64上)。我发现了一些映射到WinInet API的代码,我可以使用PutFile函数成功地上传文件,但我希望GetFile函数也能正常工作。VBA Excel:通过WinINet的FTP GetFile

为了让我工作到目前为止,我使用了以下内容:second answer herelink。我一直在使用SO的第二个答案来让PutFile工作。我必须对原始代码进行一些更改以使其与32位和64位系统兼容。

你可以看到我的进展here

我所希望做的是使一个易于使用的子调用此声明:

Private Declare Function FtpGetFile Lib "WinInet" Alias "FtpGetFileA" (ByVal hFtp 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 

I.E.像这样的子:

Public Sub GetFile(RemoteFilename As String, LocalFilename As String) 
    If FtpGetFile(' what arguments do I put here ') = 0 Then 
     Err.Raise vbObjectError + 1, , LastError 
    End If 
End Sub 

我很努力,因为我不是很熟悉的WinInet API时遇到困难解析所需的参数,什么是适当的变量来传递这些参数。

回答

2

这应该让你开始在正确的道路上,基于提供的例子。

在您的类模块:

Public Sub GetFile(RemoteFilename As String, NewFilename As String) 
    If FtpGetFile(m_hFtp, RemoteFilename, NewFilename, False, 0, FTP_TRANSFER_TYPE_BINARY, 0) = 0 Then 
     Err.Raise vbObjectError + 1, , LastError 
    End If 
End Sub 

如何称呼它:

Sub DownloadFile() 
    Dim ftp As New CFtp 
    ftp.Connect "serverAddress", "username", "password" 
    ftp.GetFile "nameOfFileOnServer.txt", "C:\SomePath\nameOfNewFile.txt" 
    ftp.Disconnect 
End Sub 

参数指定某些属性与下载的文件关联。例如,fFailIfExists是一个Boolean,它描述了是否在尝试覆盖已存在的本地文件时引发异常。其他标志指定要附加到它创建的文件的属性。

+0

谢谢你的回答。尝试时,我得到“运行时错误”-2147221503(80040001)'“ – tsurantino 2014-12-13 05:00:17

+1

@tsurantino:在哪一行?使用调试器逐步完成调用(单击“调试”,然后使用F8键单步执行)。你能连接成功吗?你确定FTP的主文件夹中存在确切的文件名吗?最后,你确定你有正确的用户权限保存在指定的本地文件夹中吗?如果您不确定('C:\ Users \ tsurantino \ Desktop \ NewFile'),请尝试使用桌面的完整路径。 – grovesNL 2014-12-13 05:04:05

+0

哇,所以错误没有指定一个完整的下载路径似乎。非常感谢您花时间帮助我进行调试。我试着提供C:\ filename.txt,但似乎C:\驱动器受到保护。 – tsurantino 2014-12-13 05:10:13