2016-04-22 47 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,因爲它有一個等待返回選項。

相關問題