2016-04-22 78 views
0

我写了一些VBA代码,通过shell命令调用ftp.exe。代码运行时,shell命令不会执行。但是,如果我在调试模式下遍历代码,则它每次都有效。下面是代码:运行shell命令的VBA只能在调试模式下工作

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

感谢您的建议。当我尝试时,我找不到错误53文件。因此,我尝试了如下变种: Shell“”&Environ(“WINDIR”)&“\ System32 \ ftp.exe -n -s:”&sFTPCmds&“”导致了同样的问题面向,并且 Shell“'”&Environ(“WINDIR”)&“\ System32 \ ftp。exe -n -s:“&sFTPCmds&”'“这也产生了错误53文件not found。 –

+0

我没有这方面的经验,但总的来说,如果某些东西在调试时有效,但不是代码运行时,那么这可能是一个时间问题,添加到“找不到文件”,让我怀疑你创建的文本文件是否没有完全准备好,并在执行Shell时从锁定释放?如果将一个无意义的for-loop在那里通过高数来计算系统时间来处理文件? –

+0

'Debug.Print' Shell命令并在PowerShell或命令提示符中运行该行注意路径名称中的空格需要引号括号 – Parfait

回答

0

通常这是一个计时问题,可能很难追踪。

查看一些方法herehere

第一步,在不同位置添加DoEvents命令。这会提示Windows在Access进程外处理未完成的任务。

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

+0

感谢您的建议,但这不是时间问题。我可以在调试模式下遍历代码,进入ftp命令,等待一分钟,然后执行,并且不起作用。或者,如果我执行相同的过程,但通过ftp命令,它将起作用。 –

+0

你在你的文章中说过,“如果我在调试模式下单步执行代码,它每次都有效。”我不知道如何解释所有这些,但需要在你的文章中清楚地表达出来。 – Smandoli

0

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

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

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

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,因为它有一个等待返回选项。