我写了一些通过shell命令调用ftp.exe
的VBA代码。代码运行时,shell命令不会执行。但是,如果我在调试模式中单步调试代码,它每次都有效。这是代码:
Sub FTPFile(sSrc As String)
Dim sHost As String
Dim sUser As String
Dim sPass As String
Dim sDest As String
Dim sFTPCmds As String
Dim strConnect As String
'Build up the necessary parameters
sHost = "<redacted>"
sUser = "<redacted>"
sPass = "<redacted>"
sDest = "\"
'Write the FTP commands to a text file
iFNum = FreeFile
sFTPCmds = "<path redacted>" & "FTPCmd.tmp"
Open sFTPCmds For Output As #iFNum
Print #iFNum, "op " & sHost
Print #iFNum, "user " & sUser & " " & sPass
Print #iFNum, "cd " & sDest
Print #iFNum, "put " & sSrc
Print #iFNum, "bye"
Close #iFNum
Shell Environ("WINDIR") & "\System32\ftp.exe -n -s:" & sFTPCmds
End Sub
我想出的唯一可能的想法是,调用此命令的用户权限因调用模式或调试运行时的调用而异,但我不确定如何更改命令。
答案 0 :(得分:1)
也许我可以对此有所了解。我遇到了类似的问题,我正在创建一个临时的pdf文件,然后使用shell命令和pdftk将临时pdf文件与另一个pdf文件合并并输出结果。当我逐步完成代码时,它工作得很好,但在运行时我没有得到输出。正如上面提到的@Smandoli,它很可能是一个时间问题。
我的代码是;
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run "pdftk.exe """ & pdf1 & """ """ & pdf2 & """ output """ & ActiveWorkbook.Path & "\" & outputFile & """"
启动shell命令后,我正在使用
删除临时文件Kill ActiveWorkbook.Path & "\" & pdf1
事实证明这是在shell命令执行之前发生的。
强制shell命令等待返回解决了问题,如以下帖子所示:Wait for shell command to complete。这篇文章建议在Shell上使用WSScript.Shell,因为它有一个等待返回选项。
答案 1 :(得分:0)
通常这是一个时间问题,很难追查。
首先,在不同位置添加DoEvents
命令。这会提示Windows处理Access进程外的待处理任务。
添加一个定时循环以避免超时有时候是答案,即使它看起来难以忍受。
答案 2 :(得分:0)
我有一段VBA宏代码,其中: 1)宏在Excel电子表格中准备一些数据, 2)打开另一个Excel文件, 3)将数据写入打开的文件电子表格单元格, 4)保存并关闭打开的文件
宏在调试器中完美运行。 ......但不是来自应用程序的实时。它打开了另一个文件然后停止工作。什么都没发生,打开的文件没有更新,也没有保存和关闭。 Excel没有卡住。
我尝试了延迟循环和application.wait之后的一个油炸提示。没有帮助。 但后来,我找到了DoEvents。瞧,它解决了这个问题。我在文件打开之前和之后放了DoEvents,现在它运行得很完美!