VBA warten lassen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm MsgBox
Bild

Betrifft: VBA warten lassen
von: Timo Vortmeyer
Geschrieben am: 18.04.2005 14:57:14
Hi!
Ich lasse aus Excel eine Mail versenden... Ich will jetzt, daß das Excel-VBA im Hintergrund wartet, bis die Email wirklich versendet wurde, damit ich prüfen kann, ob die Mail gesendet wurde oder ob vorher Cancel gedrückt wurde... Wie geht das?

Bild

Betrifft: AW: VBA warten lassen
von: Nepumuk
Geschrieben am: 18.04.2005 16:45:08
Hallo Timo,
ein Beispielcode, der das drücken der Abbruchtaste erkennt.


Option Explicit
Private Declare Function SetActiveWindow Lib "USER32.DLL" ( _
    ByVal hwnd As LongAs Long
Private Declare Function FindWindow Lib "USER32.DLL" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As StringAs Long
Public Sub prcMail()
    Dim myOutlookApplication As Object, myMail As Object
    Set myOutlookApplication = CreateObject("Outlook.Application")
    Set myMail = myOutlookApplication.CreateItem(0)
    With myMail
        .To = "abc@xyz.de"
        .Subject = "Rücksendung " & ThisWorkbook.Name
        .Attachments.Add ThisWorkbook.FullName
        On Error Resume Next
        .Send
        On Error GoTo 0
    End With
    SetActiveWindow FindWindow("xlMain", vbNullString)
    Select Case Err.Number
        Case 0
            MsgBox "Die Mappe wurde erfolgreich gesendet." & vbLf & vbLf & _
                "Ein Kopie der gesendeten Nachricht befindet sich in Ihrem Outlook-Ordner 'Gesendete Objekte'." _
                , 64, "Information"
        Case 287
            MsgBox "Die Mappe wurde nicht gesendet, da Sie den Vorgang abgebrochen haben.", 64, "Hinweis"
        Case Else
            MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & Err.Description, 16, "Fehlermeldung"
    End Select
    Set myMail = Nothing
    Set myOutlookApplication = Nothing
    ThisWorkbook.Saved = True
End Sub


Gruß
Nepumuk
Bild

Betrifft: AW: VBA warten lassen
von: Timo Vortmeyer
Geschrieben am: 19.04.2005 08:45:15
Hi!
Danke für die Antwort. Der Code ist nett, bringt mir aber glaube ich leider nichts... Mein Code sieht wie folgt aus:
Set OutLookJob = CreateObject("Outlook.Application")
Set mymail = OutLookJob.CreateItemFromTemplate("P:\ITS-RMTm\PUBLIC\Prozesse-Dokumentation-RM\Technik\RÜCKMELDUNG.oft") '*.Msg, *Oft
With mymail
.To = "G ISAM-RM"
.Subject = "Rückmeldung für " & release & " von " & projekt & ": " & rueckmeldung
.body = "Diese Nachricht wurde automatisch erstellt. Die Datei, die versendet werden soll, ist angehängt." _
& "Sie können jetzt hier noch bei Bedarf zusätzlichen Nachrichtentext mit einfügen." & vbCrLf & vbCrLf & vbCrLf & vbCrLf
.attachments.Add strDateiname
.display
End With
Set OutLookJob = Nothing
Das Problem bei mir ist, daß ich vorher ein .Display machen will, damit der User in der Mail noch Eingaben machen kann... Aber die asynchrone Arbeitsweise von VBA macht mir hierbei leider einen Strich durch die Rechnung... Gibts noch ne andere Möglichkeit zu überprüfen, ob die Nachricht gesendet wurde (außer, die Eingaben vorher in einer UserForm zu machen und dann wie oben vorzugehen...)?
Bild

Betrifft: AW: VBA warten lassen
von: Nepumuk
Geschrieben am: 19.04.2005 15:53:50
Hallo Timo,
du könntest natürlich die gesendeten Objekte durchsuchen, ob das Mail schon drin ist. Aber wie lange soll das Programm warten? Ich starte den Mailaufruf und dann mache ich Mittag. Soll Excel dann eine halbe bis Dreiviertelstunde warten bzw. im Sekundentakt den Postausgang prüfen?
Gruß
Nepumuk
Bild

Betrifft: AW: VBA warten lassen
von: Timo Vortmeyer
Geschrieben am: 20.04.2005 08:24:21
*g*
Moin!
Ne, nicht so ganz... Excel läuft ja nach dem .Display im Hintergrund weiter. Aber bei dem .Display soll er warten, bis wirklich auf "Senden" gedrückt wurde oder die Mail geschlossen wurde. Anschließend wollte ich irgendwie überprüfen, ob die Mail nun versendet wurde oder ob sie geschlossen wurde. Wenn sie versendet wurde, soll in der Excel-Mappe ein Eintrag gemacht werden wie "Am 23.4.05 versendet".
Ich vermute, daß das nicht klappen wird, zum einen, weil ich den asynchronen Arbeitsrythmus nicht wegbekomme, zum anderen, weil mir keine Lösung einfällt, in Excel ein Outlook-Objekt auszuwerten... Aber vielleicht gibts ja doch ne Lösung...
Bild

Betrifft: AW: VBA warten lassen
von: Nepumuk
Geschrieben am: 20.04.2005 20:16:07
Hallo Timo,
du könntest einen Timer starten, der im Sekundentakt prüft, ob das Mailfenster noch geöffnet ist. Der würde Excel nicht belasten, da das Makro von einer DLL ausgeführt wird. Wurde es geschlossen, dann den/die Postausgangsordner überprüfen. In wie weit kennst du dich mit API aus?
Noch eine Schwierigkeit. Was, wenn ich Excel schließe und das Mail erst dann versende?
Gruß
Nepumuk
Bild

Betrifft: AW: VBA warten lassen
von: Timo Vortmeyer
Geschrieben am: 21.04.2005 08:22:21
Richtig...
Deswegen denke ich, lasse ich es auf sich bewenden... Es wäre zwar nice to have gewesen, aber wenns nicht so einfach geht... Ich hab nur gedacht, man könnte Excel anweisen, direkt nach dem .Display abzuwarten, bis die Mail gesendet wurde... Aber wenns nicht geht. Naja. Trotzdem Danke!
 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA warten lassen"