Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1232to1236
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro pausieren bis externe Anwendung geschlossen

Makro pausieren bis externe Anwendung geschlossen
Universal
Hallo liebe VBA`ler,
ich komme leider nicht mehr weiter mit meinem Latein. Es gibt zwar einige Hinweise und Threads, aber diese kann ich auf meinen Fall nicht anwenden, da mir das Wissen fehlt. :-/ Eigentlich sagt der Betreff schon alles. :-) Über ein Outlook-Makro lasse ich automatisch den Anhang einer Mail mit Excel öffnen, um das Dokument zu betrachten. In diesem Moment sollte das Makro solange warten, bis Excel geschlossen wird. Ich weiß, dass Outlook somit "inaktiv" bzw. "beschäftigt" ist, aber das ist nicht so schlimm. Ich hatte bereits versucht eine Do ... Loop-Schleife zu verwenden, die solangeläuft, bis das Objekt "Excel" = Nothing ist, aber irgendetwas habe ich wohl falsch gemacht ... Hättet ihr vielleicht einen Tipp für mich? Ich hoffe der Fakt, dass ich über Outlook mein Excel öffne, schreckt niemanden ab.
Ich bedanke mich schon einmal recht recht herzlich!!!
Code:

Sub Mail_Att()
Dim objExcel As New Excel.Application
With objExcel
.Application.DisplayAlerts = False
.Workbooks.Open wkb1
.Workbooks.Open TempWkb
.Visible = True
.Application.Run wkb1 & "!FormattingMailAtt"
.Workbooks(wkb1).Close
End With
Dim wkb2 As Object
Dim wkbIsOpen As Boolean
While wkbIsOpen = False
On Error Resume Next
Set wkb2 = objExcel.Workbooks(AttName)
If wkb Is Nothing Then
wkbIsOpen = False
Else
wkbIsOpen = True
End If
Wend
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Makro pausieren bis externe Anwendung geschlossen
21.10.2011 20:57:40
Reinhard
Hallo Universal,
suche mal im Internet nach "shellandwait", das geht auch mit Vba, nicht nur VB o.ä.
Von Outlook kann es keine zwei Instanzen gleichzeitig geben? *nix weiß*
Von Excel schon.
Ich komm darauf weil ich mir denke daß du mit shellandwait ein Programm starten kannst aber nicht wie mit getobject und createobject ggfs. auf das schon bestehende/laufende programm zugreifen kannst.
So als sehr spontane Idee könntest du mit shellandwait von OL aus eine Excelinstanz mit einer Excelmappe aufrufen in der dann die gewünschten Makros ablaufen.
Parameterübergaben müßte man auch hinkriegen. Wenn nicht über shellandwait dann indem du über OL irgendeine Txt-datei befüllst die dann die Excelmappe beimsart ausliest oder so.
Naja, halt meine Idee, gibt viele viel bessere hier als mich :-)
Gruß
Reinhard
Anzeige
AW: Makro pausieren bis externe Anwendung geschlossen
22.10.2011 09:50:53
ransi
HAllo
Ich hab nicht verstanden was dein Makro macht, aber eine Schleife solange Excel offen kannst du z.B. so aufsetzen:
Versuch mal:

Option Explicit

Public Sub Dein_Makro()
    Do
        'Hier dein Code
    Loop Until ExcelInstances = False
End Sub



Function ExcelInstances() As Boolean
    Dim objWMI As Object
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("select * from win32_process where name='excel.exe' ")
    ExcelInstances = objWMI.Count > 0
End Function



ransi
Anzeige
AW: Makro pausieren bis externe Anwendung geschlossen
22.10.2011 10:04:55
Nepumuk
Hallo ransi,
und wenn er eine andere Excelinstanz schon offen hat bevor die Prozedur startet? Ok, dann könntest du die Anzahl der Instanzen prüfen, bekommst damit aber nicht raus welche er geschlossen hat. Außerdem musst du in der 1. Prozedur vor der Schleife die geöffnete Instanz auf Nothing setzen, sonst bleibt der Prozess so lange offen bis die 1. Prozedur beendet ist. Auch wenn du diese scheinbar geschlossen hast.
Gruß
Nepumuk
AW: Makro pausieren bis externe Anwendung geschlossen
22.10.2011 09:52:43
Nepumuk
Hallo,
das ist doch ganz einfach. Du überwachst das Excelfenster. Wenn es nicht mehr da ist hast du die Mappe geschlossen.

Option Explicit

Private Declare Sub Sleep Lib "kernel32.dll" ( _
    ByVal dwMilliseconds As Long)
Private Declare Function EnumWindows Lib "user32.dll" ( _
    ByVal lpEnumFunc As Long, _
    ByVal lParam As Long) As Boolean

Private lblnIsOpen As Boolean

Public Sub Beispiel()
    Dim objExcel As Object
    Dim lngHwnd As Long
    Set objExcel = CreateObject("Excel.Application")
    lngHwnd = objExcel.Hwnd
    objExcel.Workbooks.Open "D:\Testmappe.xls"
    objExcel.Visible = True
    Set objExcel = Nothing
    Do
        Call Sleep(500)
    Loop Until EnumWindows(AddressOf WindowCallBack, ByVal lngHwnd)
    MsgBox "Excel ist zu"
End Sub

Private Function WindowCallBack(ByVal lngHwnd As Long, ByVal lngParam As Long) As Boolean
    If lngHwnd = lngParam Then
        WindowCallBack = False
    Else
        WindowCallBack = True
    End If
End Function

Gruß
Nepumuk
Anzeige
Nachtrag
22.10.2011 10:11:02
Nepumuk
Hallo,
den CallBack kannst du so kürzen:

Private Function WindowCallBack(ByVal lngHwnd As Long, ByVal lngParam As Long) As Boolean
    WindowCallBack = lngHwnd <> lngParam
End Function

Gruß
Nepumuk
Anzeige
AW: Makro pausieren bis externe Anwendung geschlossen
22.10.2011 16:56:02
Universal
Hi Nepumuk, ransi und Reinhard,
vielen Dank für eure schnelle Hilfe! Der Tipp mit "shellandwait" hätte auch funktioniert, wenn ich meine Codes im Makro angepasst hätte. So, wie Nepumuk es beschreibt, finde ich es aber eleganter und einfacher. :-)
@Nepumuk: Genau das habe ich gesucht! Big Thx!!!
@all: Nochmals danke für eure Unterstützung!!!
viele Grüße und ein schönes Wochenende
Uni

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige