'Fremdes' Programm beenden

Hallo,
habe für das Problem zwar schon Antworten gefunden (z.B. /t/fremdes-programm-beenden/41138

Mein Problem:
Ich kann te mich bis vor kurzem nur mit Q-Basic aus, musste aber in Excel umfangreiche Makros schreiben und konnte dort viel davon verwenden. Da die Makros länger dauern, hätte ich gern zum Zeitvertreib eine ‚Waitbar‘ eingebaut. Ich habe auch eine Waitbar.exe, (startet als separates Fenster) die ich auch straten kann, aber leider nicht mehr beenden!
Gibt es da eine Möglichkeit, die auch ich verstehen kann? (Oder kann man evtl. die Windows-Sanduhr o.ä. ansteuern?)
Vielen Dank für Eure Antworten und Hilfe,
Thomas

Hallo,

Hi,

Mein Problem:
Ich kann te mich bis vor kurzem nur mit Q-Basic aus, musste
aber in Excel umfangreiche Makros schreiben und konnte dort
viel davon verwenden. Da die Makros länger dauern, hätte ich
gern zum Zeitvertreib eine ‚Waitbar‘ eingebaut. Ich habe auch
eine Waitbar.exe, (startet als separates Fenster) die ich auch
straten kann, aber leider nicht mehr beenden!

Warum benutzt du nicht den Progressbar?
Unter Makros–>Extras–>Zusätzliche Steuerelemente–>Microsoft Progressbar Control
Gruß.Timo

Gibt es da eine Möglichkeit, die auch ich verstehen kann?
(Oder kann man evtl. die Windows-Sanduhr o.ä. ansteuern?)
Vielen Dank für Eure Antworten und Hilfe,
Thomas

Hallo Thomas,

ich bin nicht sicher, ob ich Dein Problem richtig verstanden habe.
Dein Modul läuft unter Umständen zu lang und Du möchtest es unterbrechen können, kommst aber nicht ran? Dein eigenes Modul? Dann bau in die Schleife ein ‚DoEvents‘ ein. Das ermöglicht es, das Programm zu unterbrechen.

Gruß, Rainer

Hallo Timo,
Danke für die schnelle Antwort.
Leider habe ich das mit der Progressbar nicht gewusst, wie gesagt, ich kann eben nur qbasic und bin bzgl. VBA ein totaler Laie. Ich habe jetzt nach langem Probieren diese Progressbar auch gefunden und auch einen fertigen Code, der zwar ziemlich lang (ca. 1 Seite) ist und den ich auch nur halbwegs verstehe, aber den ich trotzdem soweit einbinden kann. Funktioniert also einigermaßen. Danke nochmal u. Grüße, Thomas

Hallo Reiner,
auch dir Danke für die schnelle Antwort.
Die Waitbar stammt nicht von mir, sondern ist eine eigenständige Exe-Datei. Es wird nur zentral ein Fenster geöffnet (außerhalb von Excel) und es wandert ein Balken hin und her. Das Fenster kann man dann durch Klicken einfach schließen. Ich würde das aber gern von Excel aus. Wie du aus meiner Antwort an Timo ersehen kannst, funktioniert das mit der Progressbar einigermaßen, ist aber umständlich, da ich meine Codes nun immer in diesen fertigen Code einbauen muss. Ich hätte mir halt vorgestellt, dass sich diese Waitbar.exe durch einen einfachen Befehl schließen ließe. Die Waitbat wäre mir auch lieber, da ich mich dann nicht zusätzlich um die Fortschritte der Progressbar kümmern müsste. Aber wahrscheinlich war das von mir zu einfach gedacht, oder?

Dann bau in die Schleife ein ‚DoEvents‘ ein. Das
ermöglicht es, das Programm zu unterbrechen.

Ich benutze übrigens keine Schleifen, ich muss nur Schülerlisten aus einem anderen Programm importieren, nach Klassen und Fachrichtungen in Listen hin- und herkopieren und sortieren, um Platznummern für die Prüfungen zuzulosen usw.
Falls sich das mit ‚DoEvents‘ realisieren ließe, könntest du da ein wenig genauer sein?
Danke nochmal und Grüße, Thomas

Hi nochmal,
zum Schließen eines Fensters:

Private Declare Function FindWindowEx Lib "user32" Alias \_
 "FindWindowExA" (ByVal hWnd1 As Long, \_
 ByVal hWnd2 As Long, ByVal lpsz1 As String, \_
 ByVal lpsz2 As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias \_
 "GetWindowTextA" (ByVal hWnd As Long, \_
 ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias \_
 "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, \_
 ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM\_CLOSE = 16


Sub Test()
Call KillApp("Rechner") 'Hier den Titel des zu schließenden Fensters eintragen
End Sub


Private Function KillApp(Titel As String)
Dim myHwnd As Long, MyCaption As String
myHwnd = FindWindowEx(0, 0, vbNullString, vbNullString)
Do While myHwnd
 MyCaption = String(255, 0)
 GetWindowText myHwnd, MyCaption, 255
 If InStr(1, LCase(MyCaption), LCase(Titel)) Then
 SendMessage myHwnd, WM\_CLOSE, 0, 0
 Anwendung\_Schließen = True
 End If
 myHwnd = FindWindowEx(0, myHwnd, vbNullString, vbNullString)
Loop
End Function

Gruß.Timo

Leider habe ich das mit der Progressbar nicht gewusst, wie
gesagt, ich kann eben nur qbasic und bin bzgl. VBA ein totaler
Laie. Ich habe jetzt nach langem Probieren diese Progressbar
auch gefunden und auch einen fertigen Code, der zwar ziemlich
lang (ca. 1 Seite) ist und den ich auch nur halbwegs verstehe,
aber den ich trotzdem soweit einbinden kann. Funktioniert also
einigermaßen. Danke nochmal u. Grüße, Thomas

Hi Thomas,
warum ist denn der Code so lang? Über Steuerelemettoolbox eine Schaltfläche und eine Progressbar erstellen, Rechtsklick aus die Schaltfläche, Code anzeigen, Code reinkopieren.
Probiers mal so:

Option Explicit
Private Sub CommandButton1\_Click()
Dim n As Long
ProgressBar1.Visible = True
ProgressBar1.Min = 1
ProgressBar1.Max = 65536
ProgressBar1.Scrolling = ccScrollingSmooth
For n = 1 To 65536
 ProgressBar1.Value = n
 Cells(n, 1).Interior.ColorIndex = 34
Next n
ProgressBar1.Visible = False
End Sub

Gruß
Reinhard

Hallo Thomas,

wie Du das Handle eines Fensters findest und das schließen kannst, weißt Du ja jetzt. Als ‚ganz einfach‘ würde ich das aber nicht bezeichnen. :smile:

Ich benutze übrigens keine Schleifen, ich muss nur
Schülerlisten aus einem anderen Programm importieren, nach
Klassen und Fachrichtungen in Listen hin- und herkopieren und
sortieren, um Platznummern für die Prüfungen zuzulosen usw.
Falls sich das mit ‚DoEvents‘ realisieren ließe, könntest du
da ein wenig genauer sein?

‚DoEvents‘ ist ein Befehl in VB/VBA. Der bewirkt, daß die Steuerung an Windows zurückgegeben wird. VB prüft dann, ob weitere Ereignisse ‚Events‘ vorliegen und arbeitet diese ab. ‚do‘
Ein solches Ereignis kann ein Abbruch sein.
Das nützt Dir aber nur etwas, wenn Du auf den Vorgang Einfluß hast, z.B. in Schleifen. Wenn Du keinen Code hast, in den Du den Befehl einfügen kannst, hilft Dir das nicht. Trotzdem mal ein Beispiel:

Option Explicit

Private Sub Command1\_Click()
 Dim i As Long
 For i = 0 To 100000000
 DoEvents
 'belibiger Code
 Next
 Command1.Caption = "Fertig"
End Sub

Das kann man abbrechen, bevor die Schleife fertig ist. Ohne DoEvents geht das nicht, ohne den Task ‚abzuschießen‘.

Gruß, Rainer

Sanduhr
Hallo Thomas,

zum Progressbar wurde ja schon einiges gesagt (ich bin übrigens auch der Meinung, dass der Progressbar einfacher und verständlicher sein dürfte als die andere Anwendung abzuschießen).
Hier nur noch ergänzend wie du den Mauszeiger änderst:

Application.Cursor = xlWait
liefert dir die Sanduhr
Application.Cursor = xlDefault
stellt den Zeiger wieder auf normal zurück (sollte auch bei allen Fehlerbehandlungsroutinen drin sein, nicht dass dein Programm abstürzt und den Nutzer mit der Sanduhr sitzen lässt)

Viele Grüße,
Daniel

Hallo Daniel,
danke für den weiteren Tip, konnte ich gleich mit einbauen, der Rest funktioniert inzwischen mit der Progressbar super.
Grüße, Thomas