2016-04-22 8 views
0

Ich schrieb einige VBA-Code, der ftp.exe über Shell-Befehl aufruft. Wenn der Code ausgeführt wird, wird der Shell-Befehl nicht ausgeführt. Wenn ich jedoch den Code im Debug-Modus durchtrete, funktioniert es jedes Mal. Hier ist der Code:VBA, Shell-Befehl ausgeführt wird funktioniert nur im Debug-Modus

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 

Die einzig mögliche Idee kam ich mit, dass die Benutzerberechtigungen, die diesen Befehl aufrufen, basierend auf unterscheiden, ob der Anruf erfolgt im Debug-Modus oder Laufen, aber ich bin nicht sicher, wie das zu ändern Befehl.

+0

Danke für den Vorschlag. Als ich das versuchte, habe ich Fehler 53 Datei nicht gefunden. Also habe ich dann versucht, Variationen davon wie: Shell "" & Environ ("WINDIR") & "\ System32 \ ftp.exe -n -s:" & sFTPCMDS & "", was zu dem gleichen Problem führte, das ich habe Verkleidung und Shell "'" & Environ ("WINDIR") & "\ System32 \ ftp.exe -n -s: "& sFTPCMds &" '"was auch einen Fehler ergab 53 Datei nicht gefunden. –

+0

Ich habe keine Erfahrung damit, aber im Allgemeinen, wenn etwas beim Debuggen funktioniert, aber nicht wenn der Code läuft, dann Es könnte ein Timing-Problem sein. Wenn Sie das zu "file not found" hinzufügen, frage ich mich, ob die von Ihnen erstellte Textdatei nicht komplett fertig ist und von der Sperrung beim Ausführen der Shell freigegeben wird. Was passiert, wenn Sie eine sinnlose Schleife einfügen in dort, die bis zu einer hohen Zahl zählt, um dem System Zeit zu geben, um die Datei zu verarbeiten? –

+0

'Debug.Print' den Shell-Befehl und führen Sie die Zeile in PowerShell oder Eingabeaufforderung. Notizfelder in Pfadnamen erfordern Zitat Gehäuse. – Parfait

Antwort

0

Normalerweise ist dies ein Timing-Problem und es kann schwierig sein zu verfolgen.

Siehe einige Ansätze here und here.

Als ersten Schritt fügen Sie den Befehl DoEvents an verschiedenen Stellen hinzu. Dadurch wird Windows aufgefordert, an ausstehenden Aufgaben außerhalb des Zugriffsprozesses zu arbeiten.

Das Hinzufügen einer zeitgesteuerten Schleife, um eine Auszeit zu verhindern, ist manchmal die Antwort, auch wenn es unerträglich klugig erscheint.

+0

Danke für den Vorschlag, aber es ist kein Timing-Problem. Ich kann im Debug-Modus durch den Code gehen, zum ftp-Befehl gehen, eine Minute warten und dann ausführen, und es wird nicht funktionieren. Alternativ, wenn ich den gleichen Prozess, aber Schritt durch den FTP-Befehl, wird es funktionieren. –

+0

Sie haben in Ihrem Beitrag gesagt: "Wenn ich den Code im Debug-Modus durchtrete, funktioniert es jedes Mal." Ich weiß nicht, wie ich das alles interpretiere, aber es muss klar in Ihrem Beitrag dargestellt werden. – Smandoli

0

hatte ich ein Stück von VBA-Makrocode wo: 1) Das Makro einig Daten in der Excel-Tabelle erstellt, 2) öffnet eine weitere Excel-Datei, 3) Daten Schreibt in die Datei Tabellenzellen geöffnet, 4) Speichert und schließt die geöffnete Datei

Das Makro lief perfekt im Debugger. ... aber nicht in Echtzeit von der Anwendung. Es öffnete die andere Datei und hörte dann auf zu arbeiten. Es ist nichts passiert, die geöffnete Datei wurde nicht aktualisiert noch gespeichert und geschlossen. Excel war nicht festgefahren.

Ich versuchte die Verzögerungsschleifen und application.wait nach einem Hinweis von einem gebratenen. Keine Hilfe. Aber dann habe ich DoEvents gefunden. Voila, es hat das Problem gelöst. Ich habe DoEvents vor und nach der Datei geöffnet und jetzt läuft es perfekt!

1

Vielleicht kann ich etwas Licht dazu bringen. Ich hatte ein ähnliches Problem, bei dem ich eine temporäre PDF-Datei erstellte und dann mit einem Shell-Befehl und pdftk die temporäre PDF-Datei mit einer anderen PDF-Datei kombinierte und das Ergebnis ausgab. Es funktionierte perfekt, als ich den Code durchging, aber während der Laufzeit bekam ich die Ausgabe nicht. Wie bereits erwähnt, ist es wahrscheinlich ein Timing-Problem.

Mein Code war;

Dim wsh As Object 
Set wsh = CreateObject("WScript.Shell") 

wsh.Run "pdftk.exe """ & pdf1 & """ """ & pdf2 & """ output """ & ActiveWorkbook.Path & "\" & outputFile & """" 

Nach der Shell-Befehl initiiert wurde ich die temporäre Datei

Kill ActiveWorkbook.Path & "\" & pdf1 

Es stellt sich heraus, das auftritt, wurde unter Verwendung zu entfernen, bevor die Shell-Befehl ausführen kann.

Das Erzwingen des Shell-Befehls, um auf die Rückgabe zu warten, löste das Problem, wie in diesem Beitrag gezeigt: Wait for shell command to complete. In diesem Post wird empfohlen, WSScript.Shell für Shell zu verwenden, da es eine Wartezeit auf Rückgabeoption bietet.

Verwandte Themen