使用VBA自动化FTP上传

3
我正在尝试自动化以下过程:
  1. 从数据库中导入数据到Microsoft Excel(myfile.xls),并进行格式化。
  2. 将文件另存为myfile.txt
  3. 通过FTP上传到服务器。
我已经完成了FTP上传的部分,但在VBA脚本中创建批处理文件时遇到了问题。
我当前的脚本如下:
Dim MY_FILENAME As String
MY_FILENAME = "C:\user\sam\test" & "filename" & Format(CStr(Now), "yyyy_mm_dd_hh_mm") & ".BAT"


Dim FileNumber As Integer
Dim retVal As Variant

FileNumber = FreeFile

'create batch file
Open MY_FILENAME For Output As #FileNumber
Print #FileNumber, "FTP 00.0.000.000"
Print #FileNumber, "username"
Print #FileNumber, "password"
Print #FileNumber, "ascii crlf"
Print #FileNumber, "put  " myfile.txt; "  'location'"
Print #FileNumber, "exit"
Close #FileNumber

'run batch file
retVal = Shell(MY_FILENAME, vbNormalFocus)

当我运行这个脚本时,它打开了与服务器相关的IP地址,但未能输入登录凭据。请问有谁知道我错在哪里?

我在你的帖子中没有看到任何Windows [tag:batch-file],因此我删除了相关标签;请在分配标签之前阅读标签信息... - aschipfl
2
嗨aschipfl,上面的脚本创建了一个批处理文件并运行它。批处理文件的内容是:FTP 00.0.000.000, 用户名, 密码, ascii crlf, put myfile.txt; '位置', 退出 - sam c
3
@aschipfl很显然,这篇文章是关于创建批处理文件的!!! - iDevlop
1
@samc 如果您在上面的代码片段中添加 MY_FILENAME 的声明将会很有帮助。 - steenbergh
1
@PatrickHonorez,实际上不是这样的,它是关于创建一个ftp.exe脚本的,OP错误地将其与Windows [tag:batch-file]混淆了,这是行不通的;VBA脚本应该直接运行ftp.exe并通过其-s选项将创建的脚本传递给它;尽管如此,我重新添加了批处理文件标签,并添加了[标签:ftp]标签... - aschipfl
显示剩余2条评论
1个回答

2
出现问题的原因是批处理文件首先以交互模式打开ftp并没有接收到任何输入。如果ftp能够自行终止,你会注意到批处理文件随后执行usernamepassword等指令。这些指令并不是针对批处理而是针对ftp的,但批处理无法识别。
为了解决这个问题,请将所有ftp指令保存到第二个文件中,然后在批处理中调用ftp并将第二个文件作为输入参数。
Dim FileNumber As Integer
Dim retVal As Variant
FileNumber = FreeFile

'create batch file
Open MY_FILENAME For Output As #FileNumber
Print #FileNumber, "FTP -s<your-filename-here> 00.0.000.000"
Close #FileNumber

Open FTP_INSTRUCTIONS For Output As #FileNumber
Print #FileNumber, "username"
Print #FileNumber, "password"
Print #FileNumber, "ascii crlf"
Print #FileNumber, "put  " myfile.txt; "  'location'"
Print #FileNumber, "exit"
Close #FileNumber

'run batch file
retVal = Shell(MY_FILENAME, vbNormalFocus)

谢谢您清晰地解释了我的问题。只是想确认一下,您是否知道有没有办法让它从一个文件中运行? - sam c
@samc 不,我认为没有。你要做的所有事情都不适合 ftp 的 cmd 行参数,所以你需要使用第二个文件。根据你的环境,你可能只需创建一个指令文件,然后调用 Shell('ftp -s:<filename>') 而不是批处理文件。 - steenbergh
2
你不需要批处理文件。你只需要一个ftp脚本文件,并让VBA直接运行ftp.exe并将脚本文件作为参数传递即可。 - Squashman
@Squashman 你是正确的,我找到了打开FTP而不使用批处理文件的语法:Shell Environ(“WINDIR”)&“\ System32 \ ftp.exe-n-s:”& <包含指令的文件> - sam c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接