Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Warten, bis shell geschlossen ist

Forumthread: Warten, bis shell geschlossen ist

Warten, bis shell geschlossen ist
05.03.2009 15:18:45
Tobias
Hallo Allerseitigst,
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
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Sleep
05.03.2009 15:26:36
Beate
Hallo Tobias,
Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Dateiupload()
    'Hier dein Aufrufcode
    'dadurch wartet das Makro 10 Sek. mit dem weiterlaufen - dieser Wert kann verändert werden:
    Sleep 10000
    'und hier dein Folgecode
End Sub


Dabei muss die Deklaration von Sleep ganz oben stehen.
Gruß,
Beate
Anzeige
AW: Sleep
05.03.2009 15:32:51
Oberschlumpf
Hi Beate
Zuerst dacht ich: "Wow, besser und weniger Code als das, was ich fand"
Aber leider stellte ich dann beim Testen von Sleep fest, dass für 10 Sek. gar nix mehr geht.
Es erscheint die Eieruhr, ich kann keine Zelle anklicken, Excel wird komplett weiß (außer Titelzeile).
Hast du da ne Idee?
Ciao
Thorsten
Anzeige
AW: Sleep
05.03.2009 15:49:10
Beate
Hallo Thorsten,
dass gar nichts mehr geht, stimmt nicht ganz: In der Zeit lädt der PC ja Daten ins Netz.
Sinn ist meist, sicherzustellen, dass dieser Vorgang beendet ist, weil im Folgecode z.B. irgendwelche Hilfsdateien gelöscht werden, die während des Uploads noch benötigt werden.
Aber es stimmt, die Eieruhr erscheint und man kann keine Eingaben machen. Aber mein Excel wird nicht komplett weiß.
Gruß,
Beate
Anzeige
AW: Sleep
05.03.2009 16:08:02
Marc
Hallo,
mit Sleep bleibt der Code an genau der Stelle für die Zeit stehen. Es passiert nichts ab Sleep...
AW: Warten, bis shell geschlossen ist
05.03.2009 18:28:59
IngGi
Hallo Tobias,
falls du noch nicht fündig geworden bist, hier noch eine Möglichkeit ohne API:

CreateObject("WScript.Shell").Run "ftp -s:", 1, True


Gruß Ingolf

@ingo Die CreateObject methode klappt leider nicht
07.03.2009 15:58:52
Tobias
Hallo Ingo,
Ich habs so probiert:
CreateObject("WScript.Shell").Run "ftp -s:" & shortpath & "\sync.txt " & Worksheets("Einstellungen").[A3], showshell
Das shell wird auch ausgeführt, nur von warten keine Spur.
liegt vielleicht daran, das ich den letzten Teil:
,1,True
weggelassen hab, weil ichs syntax-mässig nicht geschaft hab, den ohne Fehlermeldung anzuhängen.
Wie mach ich das?
Grüss,
Tobias
Anzeige
AW: Warten, bis shell geschlossen ist
05.03.2009 15:42:15
Marc
Hallo,
hiermit sollte es funktionieren...
Marc
Option Explicit
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
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
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&

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


Anzeige
AW: Syntax-Anfängerproblem (schätz ich mal)
07.03.2009 02:08:07
Tobias
Vielen Dank allerseits!
@Marc
Deine Lösung funktioniert kopiert schon mal gut,
ich habe aber ein Problem mit der Syntax:
Shell "ftp -s:" & shortpath & "\sync.txt " & Worksheets("Einstellungen").[A3], showshell
müsste ich in diese Form bringen Call StartShell_Wait("xyz")
Call StartShell_Wait ("ftp -s:" & shortpath & "\sync.txt " & Worksheets("Einstellungen").[A3], showshell")
Hat nicht geklappt, wohl wegen der Anführungszeichen...
Ich weiß, sicher ein Anfängerproblem, aber: kannst du mir helfen?
Besten Dank,
Tobias
Anzeige
Wohl doch kein Anfängerproblem
07.03.2009 15:27:14
Tobias
Hallo nochmal
Call StartShell_Wait("ftp -s:" & shortpath & "\sync.txt " & Worksheets("Einstellungen").[A3], showshell)
So sollte es jetzt syntaxmässig passen, klappt aber leider nicht:
Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft
Gruss,
Tobias
Anzeige
Zauberstab oder Glaskugel oder...
07.03.2009 15:29:04
Josef
... deine Mappe mit dem Code des Makros "StartShell_Wait", würde sicher helfen.
Gruß Sepp

AW: Zauberstab oder Glaskugel oder...
07.03.2009 15:37:39
Tobias
Hallo!
Es ist der Code von Marc, direkt in diesem Thread.
Ich habe nix verändert.
( https://www.herber.de/forum/archiv/1056to1060/t1056891.htm#1056913 )
verkürzt (also z.b.
Call StartShell_Wait("ftp -s:") bzw. Call StartShell_Wait("calc.exe")
funktioniert er auch.
Grüsse,
Tobias
Anzeige
AW: Zauberstab oder Glaskugel oder...
07.03.2009 15:54:30
Oberschlumpf
Hi Tobias
Tschulligung, dass ich mich einmische.
Aber ich glaub, es wird dir nicht viel helfen, wenn du uns einen Code zeigst, der funktioniert.
Denn es ist ja NICHT dein Code, der NICHT funktioniert.
Deswegen zeig uns doch bitte DEINE Datei mit genau DEINEM Code
(inklusive der Problemcodezeile, die nich will wie sie soll)
Ciao
Thorsten
Anzeige
AW: Zauberstab oder Glaskugel oder...
07.03.2009 17:05:51
Tobias
Hallo allerseits,
Danke für den Hinweis, Thorsten.
Ich habe jetzt die Mappe reduziert, damits nicht zu unübersichtlich wird.
Das Makro heißt myftp_download im Modul SYNCHRONISATION
Zusätzlich eine Msgbox eingebaut, die erst auftauchen sollte, wenn man das shellfenster geschlossen hat
(das geht übrigens über die eingabe bye im Shell-Fenster)

(...)
'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

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Warten auf die Beendigung einer Shell in Excel VBA


Schritt-für-Schritt-Anleitung

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:

  1. Öffne den VBA-Editor in Excel mit ALT + F11.

  2. Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject" klickst und "Einfügen" > "Modul" wählst.

  3. 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
  4. 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
  5. Teste das Makro, um sicherzustellen, dass es wie gewünscht funktioniert.


Häufige Fehler und Lösungen

  • Fehler: "Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft"

    • Überprüfe, ob du die Funktion StartShell_Wait korrekt aufrufst und alle erforderlichen Argumente übergibst.
  • Excel wird unbenutzbar, während gewartet wird

    • Wenn du die Sleep-Methode verwendest, blockiert sie Excel. Verwende stattdessen die WaitForSingleObject-Methode, um dies zu vermeiden.

Alternative Methoden

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.


Praktische Beispiele

  1. 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
  2. Ein Programm starten und warten:

    Sub StartCalculator()
       Call StartShell_Wait("calc.exe")
       MsgBox "Der Taschenrechner wurde geschlossen."
    End Sub

Tipps für Profis

  • Nutze die DoEvents-Funktion im Loop, um die Benutzeroberfläche reaktionsfähig zu halten, während du auf die Beendigung eines Prozesses wartest.
  • Überlege, ob du Fehlerbehandlungsroutinen einbauen möchtest, um unerwartete Probleme beim Ausführen von Shell-Befehlen zu behandeln.

FAQ: Häufige Fragen

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.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige