运行shell命令的VBA仅在调试模式下有效

时间:2016-04-22 18:32:40

标签: vba ms-access

我写了一些通过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

我想出的唯一可能的想法是,调用此命令的用户权限因调用模式或调试运行时的调用而异,但我不确定如何更改命令。

3 个答案:

答案 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)

通常这是一个时间问题,很难追查。

查看一些方法herehere

首先,在不同位置添加DoEvents命令。这会提示Windows处理Access进程外的待处理任务。

添加一个定时循环以避免超时有时候是答案,即使它看起来难以忍受。

答案 2 :(得分:0)

我有一段VBA宏代码,其中: 1)宏在Excel电子表格中准备一些数据, 2)打开另一个Excel文件, 3)将数据写入打开的文件电子表格单元格, 4)保存并关闭打开的文件

宏在调试器中完美运行。 ......但不是来自应用程序的实时。它打开了另一个文件然后停止工作。什么都没发生,打开的文件没有更新,也没有保存和关闭。 Excel没有卡住。

我尝试了延迟循环和application.wait之后的一个油炸提示。没有帮助。 但后来,我找到了DoEvents。瞧,它解决了这个问题。我在文件打开之前和之后放了DoEvents,现在它运行得很完美!