Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

mit VBA Windows- Prozesse auflisten

408 views
Skip to first unread message

Hans Alborg

unread,
Jan 28, 2013, 11:24:54 AM1/28/13
to
Hallo Leute!

<Excel 2007>

Was geht:

Excel startet ein externes Faxprogramm und schickt dem seine Tabellen.
Ich gebe dort die Gegenstelle an und sende das Fax weg.
Dann schlie�e ich das Faxprogramm.
Das Faxprogramm legt eine Log- Datei an, die Excel importiert und den
letzten Eintrag auswertet.

Was ich tun m�chte:

Die Log-Datei erst importieren lassen, wenn das Faxproggi fertig ist.
So bekomme ich als Dokumentation Adressat, Telefonnummer etc. ins Blatt.
Dazu mu� Excel wissen da� das Faxprogramm ge�ffnet war und fertig ist.

Das w�rde wunderbar klappen, aber es gibt einen Haken.

Im Netz fand ich folgenden Code:
' ---------------------------------------------------------------------------------
' (REM- Zeilen des Originals weggelassen)
Set WMI_Object = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")

Set Pr�fprogramm = WMI_Object.ExecQuery("Select * from Win32__
Process Where Name = 'calc.exe'")

If Pr�fprogramm.Count = 0 Then
With Range("A27")
.Interior.ColorIndex = 3
.Value = "Rechner l�uft nicht"
End With
Else
With Range("A27")
.Interior.ColorIndex = 50
.Value = "Rechner l�uft"
End With
End If
' ---------------------------------------------------------------------------------
Das ist meine Grundlage (statt des Rechners dann "Fax.exe").
Dieser Code liefert nur einen Augenblickswert, ich habe mit einer Schleife
erreicht, da� gepr�ft wird, ob das Faxprogramm schon gestartet wurde, ob es
gerade l�uft oder dann beendet ist. Wenn es garnicht starten kann (z.B.
nicht vh.) sorgt ein Countdown- Z�hler daf�r da� das Makro weiterl�uft.

Ist also das Faxprogramm aktiv gewesen und dann beendet, geht das mit dem
Log- Import weiter...

Was klappt ist die obige Routine -aber nur dann, wenn das Faxprogramm von
Hand gestartet wird!
Sowie ich aus Excel heraus faxe, bleibt " Pr�fprogramm.Count" auf "0".
Mit dem Taskmanager habe ich in den laufenden Prozessen nachgesehen, und in
beiden F�llen ist der Prozessname derselbe (auch "calc.exe" taucht dort auf,
wenn ich dieses Proggi starte).

Nun dachte ich: 'Bau mal eine Schleife, die alle Prozesse (in einer
Msg-Box?) anzeigt und guck was da passiert'.
Aber das schaff ich nicht. Hab heute mehr Fehlermeldungen gehabt als KCal.

Wei� einer, wie ich sowas, evtl. in Abwandlung obigen Codes, hinbekomme?

TIA,

Hans

Jörg Eisenträger

unread,
Jan 29, 2013, 6:11:27 PM1/29/13
to

Hallo Hans,

>Was ich tun möchte:
>Die Log-Datei erst importieren lassen, wenn das Faxproggi fertig ist.

Google mal nach ShellX. Damit kannst Du ein Programm starten und dessen
Ende abwarten. Sollte vielleicht helfen. Dann brauchst Du das ganze
Prozesse-Auflisten-Geraffel nicht.


Gruß
Jörg
--
"One of the best ways to boost your Excel efficiency is also one of the best ways to shoot yourself in the foot."
(Susan Harkins auf www.techrepublic.com/blog/10things/10-mistakes-to-avoid-when-working-with-multiple-worksheets/1961 )

Wolfgang Badura

unread,
Jan 30, 2013, 4:41:39 AM1/30/13
to
Hallo Hans!
"Hans Alborg" <Hans....@Hai-tec-computerservice.de> schrieb im
Newsbeitrag news:5106a673$0$6547$9b4e...@newsspool4.arcor-online.net...
> Hallo Leute!
>
> <Excel 2007>
>
> Was geht:
>
> Excel startet ein externes Faxprogramm und schickt dem seine Tabellen.
> Ich gebe dort die Gegenstelle an und sende das Fax weg.
> Dann schließe ich das Faxprogramm.
> Das Faxprogramm legt eine Log- Datei an, die Excel importiert und den
> letzten Eintrag auswertet.
>
> Was ich tun möchte:
>
> Die Log-Datei erst importieren lassen, wenn das Faxproggi fertig ist.
> So bekomme ich als Dokumentation Adressat, Telefonnummer etc. ins Blatt.
> Dazu muß Excel wissen daß das Faxprogramm geöffnet war und fertig ist.
>

Du weißt wirklich nicht wohin gefaxt wird?
Falls schon:
Es gibt fxscomex.dll (Micrrosoft Fax Service Extended COM Type Library),
mit welcher ein Fax vollautomatisch versandt werden kann.

> Was klappt ist die obige Routine -aber nur dann, wenn das Faxprogramm von
> Hand gestartet wird!

Wie startest Du das Fax-Programm?
Mittels VBS-Skript (Run-Methode) kann man ein Programm so starten,
daß in das aufrufende Programm erst zurückgekehrt wird, wenn es beendet
wurde.

Veilleicht kannst Du weitere Informationen preisgeben.

Wolfgang

Wolfgang



Hans Alborg

unread,
Jan 30, 2013, 1:14:45 PM1/30/13
to
"Wolfgang Badura" schrieb...

> "Hans Alborg" schrieb

>> Was ich tun möchte:
>> Die Log-Datei erst importieren lassen, wenn das Faxproggi fertig ist. So
>> bekomme ich als Dokumentation Adressat, Telefonnummer etc. ins Blatt.
>> Dazu muß Excel wissen daß das Faxprogramm geöffnet war und fertig ist.

> Du weißt wirklich nicht wohin gefaxt wird?

Klar weiß ich das, möchte es aber nicht jedesmal in ein Excelblatt tippen
;-)


> Falls schon:
> Es gibt fxscomex.dll (Micrrosoft Fax Service Extended COM Type Library),
> mit welcher ein Fax vollautomatisch versandt werden kann.

Sehr interessant, weil ich schon mal nach Einzelheiten für Winfax gesucht
hatte. Vielleicht bringt mich das weiter.
In diesem Fall hier nutze ich ein "Win- fremdes" Faxprogramm.

>> Was klappt ist die obige Routine -aber nur dann, wenn das Faxprogramm von
>> Hand gestartet wird!

> Wie startest Du das Fax-Programm?

Excel (VBA) steuert das Faxproggi wie einen Drucker an, wenn ich die Option
"Faxen" in einer Userform anwähle.

> Mittels VBS-Skript (Run-Methode) kann man ein Programm so starten, daß in
> das aufrufende Programm erst zurückgekehrt wird, wenn es beendet wurde.

> Veilleicht kannst Du weitere Informationen preisgeben.

Ich hab inzwischen eine Lösung gefunden, wie ich Jörg schon geschrieben
hatte.

Naja, also der Code sieht etwa so aus (bissl viel):
'------------------------------------------------------------------------
' passiert vorweg:
'- Anzahl u. Parameter der Tabellen zum Faxen einstellen
'-Computername auslesen
'-Faxname des Computers als Printer wählen, Standardprinter merken

' Faxproggi startet jetzt...
ActiveWindow.SelectedSheets.PrintOut Copies:=1, _
ActivePrinter:=Faxmacine, Collate:=True ' --- faxen
Application.ActivePrinter = Normalprinter

' jetzt meine neue Routine,
' ist eine Gosub/ Return- Sache:

Faxprogramm_überwachen:

If Faxexe <> "WFS.exe" Then 'kein Winfax
Dim objWord As Object
Sheets("Aufträge").Unprotect
Set objWord = Nothing

fü:
Set objWord = CreateObject("Word.Application")
Breakzähler = Breakzähler - 1 ' Code fortsetzen wenn kein Faxprg startet
If objWord.Tasks.Exists("Fax-Proggi") = True Or Fxtest <> "" Then '
If Fxtest = "" Then ' Faxprg ist noch nicht gestartet
If Fxtest = "Fax" Then Fxtest = "Fax feritg"
Sheets("Aufträge").Range("A16:A17").Interior.Color =
16776960 ' blau
Sheets("Aufträge").Range("A16:A17").Value = "Faxprogramm
gestartet"
End If
Fxtest = "Fax"
If Not objWord.Tasks.Exists("Fax-Proggi") = True Then
Fxtest = Fxtest & " fertig"
Sheets("Aufträge").Range("A16:A17").Interior.Color = _
65280 ' grünblau
Sheets("Aufträge").Range("A16:A17").Value = _
"faxen beendet"
Else
GoTo fü
End If
Else
Sheets("Aufträge").Range("A16:A17").Interior.Color = 255 ' rot
Sheets("Aufträge").Range("A16:A17").Value = _
"warte auf Faxprogramm! " & Breakzähler
If Breakzähler > 1 Then GoTo fü
End If
Set objWord = Nothing
Fxtest = "": Breakzähler = 0
'objWord.Quit
Sheets("Aufträge").Range("A16:A17").Interior.Color = _
RGB(255, 255, 0) ' gelb
Sheets("BTBP").Range("A16:A17").Value = "Klartext"
Application.ScreenUpdating = False
Call faxlog_laden
Call faxlog_löschen
Else ' ---------------------------- bei Winfax
Fax_Ad = " unbekannt"
End If
Application.ScreenUpdating = True
Return
' -----------------------------------------------

Funktion:

Also auf dem Sheets("Aufträge") mißbrauche ich die Zellen "A16:A17" zur
Anzeige des Faxstatus.
Erst (falls nicht Winfax läuft) startet die Routine mit diesem Breakzähler,
damit es auch weitergeht (bei "0") wenn kein Faxprogramm startet.
Dann wird der Start des Faxprogramms registriert und bis zum Schließen
gewartet Ich muß ja den Adressat dort eingeben und das Faxen durchführen (je
Zahl gefaxter Seiten bis 10min), und dann das Faxfenster wieder schließen.
Das Schließen des Fensters bekommt die Routine dann auch mit und startet
"faxlog laden" und "faxlog löschen". In ersterer Routine wird das Log als
Text (tiiief unten) ins Blatt "Aufträge" geladen, die letzte Zeile gesucht
und Adressat, Faxnummer etc. in die Variable "Fax_Ad" gesteckt.
Die andere Routine stellt die Ordnung im Blatt wieder her
(Spaltenbreiten...) und löscht den Text.

So, das ist hoffentlich hinreichend genau. Tests sind schonmal gut gelaufen
und jetzt muß der frische Code sich noch bewähren :-)

Hans

Hans Alborg

unread,
Jan 30, 2013, 12:31:25 PM1/30/13
to
"Jörg Eisenträger" schrieb...

> Google mal nach ShellX...

Hi Jörg,

naja, das sieht wie ein Shareware- Programm aus :-(

Mein Dings soll ja auf verschiedenen Rechnern laufen...
In der Zwischenzeit habe ich das Problem aber mit Excel-VBA gelöst, dieser
Hompage sei Dank:

http://www.xlam.ch/vbacode/index.htm

Da findet sich das:

Public Sub ListTasks()
Dim intCounter As Integer
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
For intCounter = 1 To objWord.Tasks.Count
Cells(intCounter, 1).Value = intCounter & ": " &
objWord.Tasks(intCounter).Name
Next intCounter
objWord.Quit
Set objWord = Nothing
End Sub
(von mir schon leicht geändert...)

Und mit dieser Grundlage habe ich meinen Code geschrieben. Was das mit Word
soll - keine Ahnung, aber der Code versucht wohl am Ende, Word zu schließen
(objWord.Quit).
Diesen Befehl hab ich erstmal lahmgelegt.

Aber Danke für den Tip. Es gibt im Netz viele nützliche Programme. Letzten
Endes ist aber häufig bezahlen angesagt.

Hans

Jörg Eisenträger

unread,
Jan 30, 2013, 4:02:36 PM1/30/13
to

>> Google mal nach ShellX...
>
>naja, das sieht wie ein Shareware- Programm aus :-(
Falsche Seite erwischt oder nicht richtig gelesen.



Nein, das ist nur VBA-Code.

'Deklarationen für ShellX
Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" ( _
ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long


Sub ShellX_Test()
ShellX ("notepad.exe")
End Sub


'Achtung, einige der nachfolgenden Befehlszeilen sind hier im Newsreader
evtl. umgebrochen! Aber das findest Du schon raus.

Private Function ShellX( _
ByVal PathName As String, _
Optional ByVal WindowStyle As Long = vbMinimizedFocus, _
Optional ByVal Events As Boolean = True _
) As Long
' ©2002 by Jost Schwider, http://vb-tec.de/
' ei 2007-03-23 Zeitlimit für Warten durch ShellX eingeführt

'Deklarationen:
Const STILL_ACTIVE = &H103&
Const PROCESS_QUERY_INFORMATION = &H400&
Dim ProcId As Long
Dim ProcHnd As Long

'Prozess-Handle holen:
ProcId = Shell(PathName, WindowStyle)
ProcHnd = OpenProcess(PROCESS_QUERY_INFORMATION, True, ProcId)



'Auf Prozess-Ende warten:
'aber maximal xx s (ei 2007-03-23)
Dim dStart As Date
dStart = Now
Do
If Events Then DoEvents
Application.Wait (Now + TimeValue("00:00:01")) 'Reaction Test nur
jede Sekunde - ei
GetExitCodeProcess ProcHnd, ShellX
'ei 2007-03-23:
Application.StatusBar = "I'm waiting for reaction of external
program, but for max " & 65 - Int((Now - dStart) * 100000) & " seconds.
Please wait with me."
If Now - dStart > TimeValue("00:00:59") Then 'nach Zeit xx
Abbruch
MsgBox "I have waited for ca. 60 seconds, but the external
program did not give any handling information." & _
vbCr & "Macro function will be aborted.", _
vbOKOnly + vbCritical + vbSystemModal, "ShellX - No more
waiting for external program"
'Aufräumen:
CloseHandle ProcHnd
Application.StatusBar = ""
Exit Function
End If
Loop While ShellX = STILL_ACTIVE


'Aufräumen:
CloseHandle ProcHnd
Application.StatusBar = ""

End Function

Hans Alborg

unread,
Jan 31, 2013, 2:41:59 PM1/31/13
to
"Jörg Eisenträger" schrieb...
> HA:

>> naja, das sieht wie ein Shareware- Programm aus :-(
> Falsche Seite erwischt oder nicht richtig gelesen.
> Nein, das ist nur VBA-Code.

Aha? Hab dann wohl die falsche Seite erwischt...

> 'Deklarationen für ShellX
> [Code]

Werde mich mal am Wochenende damit beschäftigen. Das scheint mir aber
umfangreicher zu werden als mein jetziger Code (und dort brauchte ich nichts
deklarieren).

> ...Application.Wait (Now + TimeValue("00:00:01"))...

rrrr, Wait vermeide ich gern.
Na, auf jeden Fall wieder was Interessantes! Vielleicht komme ich ja beim
Probieren noch auf ganz andere Verwendungen in meiner Mappe!

Vielen Dank,

Hans

0 new messages