Ich führe eine Shell-Aufruf durch
Shell "ftp -s:" ....
Gibts eine Möglichkeit, mit der weiteren Ausführung so lange zu warten, bis die Shell wieder
geschlossen ist?
Ich befürchte ja, dass nicht :(
Best,
Tobias
CreateObject("WScript.Shell").Run "ftp -s:", 1, True
Gruß Ingolf
Public Sub SartShell_Wait(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim ReturnValue As Integer
' Initialisiert die STARTUPINFO Struktur:
start.cb = Len(start)
' Startet die Shell-Anwendung:
ReturnValue = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
' Wartet bis Shell-Anwendung geschlossen ist:
Do
ReturnValue = WaitForSingleObject(proc.hProcess, 0)
DoEvents
Loop Until ReturnValue 258
ReturnValue = CloseHandle(proc.hProcess)
End Sub
Sub undlos()
Call SartShell_Wait("calc.exe") 'als Beispiel
MsgBox " ich bin jetzt weg "
End Sub
(...)
'Try 3: StartShell
Call StartShell_Wait("ftp -s:" & shortpath & "\sync.txt " & Worksheets("Einstellungen").[ _
A3], showshell) Fehler " Falsche Anzahl an Argumenten..." Taucht hier auf
MsgBox "Diese MsgBox sollte erst auftauchen, wenn das Shell-Fenster geschlossen wurde"
Beste Grüsse,
Tobias
Um in Excel VBA zu warten, bis ein Shell-Befehl vollständig ausgeführt wird, kannst du die CreateObject
-Methode mit dem WScript.Shell
verwenden. Hier ist eine einfache Anleitung:
Öffne den VBA-Editor in Excel mit ALT + F11
.
Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject" klickst und "Einfügen" > "Modul" wählst.
Kopiere den folgenden VBA-Code in das Modul:
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Sub StartShell_Wait(cmdline As String)
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim ReturnValue As Long
start.cb = Len(start)
ReturnValue = CreateProcessA(0&, cmdline, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
' Wartet, bis die Shell-Anwendung geschlossen ist
Do
ReturnValue = WaitForSingleObject(proc.hProcess, 0)
DoEvents
Loop Until ReturnValue <> 258
ReturnValue = CloseHandle(proc.hProcess)
End Sub
Rufe die Funktion auf, indem du StartShell_Wait
mit deinem Shell-Befehl verwendest:
Sub Beispiel()
Call StartShell_Wait("ftp -s:deinpfad\sync.txt")
MsgBox "Die Shell wurde geschlossen."
End Sub
Teste das Makro, um sicherzustellen, dass es wie gewünscht funktioniert.
Fehler: "Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft"
StartShell_Wait
korrekt aufrufst und alle erforderlichen Argumente übergibst.Excel wird unbenutzbar, während gewartet wird
Sleep
-Methode verwendest, blockiert sie Excel. Verwende stattdessen die WaitForSingleObject
-Methode, um dies zu vermeiden.Eine weitere Möglichkeit, um sicherzustellen, dass dein Befehl abgeschlossen ist, besteht darin, die WScript.Shell
-Methode zu verwenden:
CreateObject("WScript.Shell").Run "ftp -s:deinpfad\sync.txt", 1, True
Diese Methode wartet automatisch, bis der Befehl vollständig ausgeführt wird, bevor sie mit dem nächsten Schritt fortfährt.
FTP-Befehl ausführen und warten:
Sub FtpUpload()
Dim shortpath As String
shortpath = "C:\DeinPfad"
Call StartShell_Wait("ftp -s:" & shortpath & "\sync.txt")
MsgBox "Upload abgeschlossen!"
End Sub
Ein Programm starten und warten:
Sub StartCalculator()
Call StartShell_Wait("calc.exe")
MsgBox "Der Taschenrechner wurde geschlossen."
End Sub
DoEvents
-Funktion im Loop, um die Benutzeroberfläche reaktionsfähig zu halten, während du auf die Beendigung eines Prozesses wartest.1. Wie kann ich den Shell-Befehl anpassen?
Du kannst den Shell-Befehl in der Funktion StartShell_Wait
anpassen, indem du den cmdline
-Parameter änderst.
2. Funktioniert dies in allen Excel-Versionen?
Ja, diese Methoden sind mit den meisten modernen Excel-Versionen kompatibel, solange VBA unterstützt wird.
3. Was ist, wenn der Shell-Befehl Fehler ausgibt?
Überprüfe den Shell-Befehl in einer Eingabeaufforderung, um sicherzustellen, dass er korrekt ist. Fehler in der Syntax können dazu führen, dass der Befehl nicht ausgeführt wird.
Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden
Suche nach den besten AntwortenEntdecke unsere meistgeklickten Beiträge in der Google Suche
Top 100 Threads jetzt ansehen