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

Forumthread: VBA warten lassen

VBA warten lassen
18.04.2005 14:57:14
Timo
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?
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: VBA warten lassen
18.04.2005 16:45:08
Nepumuk
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
Anzeige
AW: VBA warten lassen
19.04.2005 08:45:15
Timo
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...)?
Anzeige
AW: VBA warten lassen
19.04.2005 15:53:50
Nepumuk
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
Anzeige
AW: VBA warten lassen
20.04.2005 08:24:21
Timo
*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...
Anzeige
AW: VBA warten lassen
20.04.2005 20:16:07
Nepumuk
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
Anzeige
AW: VBA warten lassen
21.04.2005 08:22:21
Timo
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!
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA Warten Lassen in Excel


Schritt-für-Schritt-Anleitung

Um in Excel VBA zu warten, bis eine E-Mail gesendet wurde, kannst du den folgenden Code verwenden. Dieser prüft, ob das E-Mail-Fenster noch geöffnet ist und gibt dir die Möglichkeit, zu reagieren, wenn die E-Mail gesendet wurde oder wenn der Nutzer das Fenster schließt.

Option Explicit

Private Declare Function SetActiveWindow Lib "USER32.DLL" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "USER32.DLL" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As 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
        .Display ' E-Mail wird angezeigt
    End With

    ' Hier wird gewartet, bis das E-Mail-Fenster geschlossen wird
    Do While FindWindow("rctrl_renwnd32", vbNullString) <> 0
        DoEvents ' Erlaubt anderen Prozessen zu laufen
    Loop

    ' Hier kannst du den Status der E-Mail überprüfen
    MsgBox "Die E-Mail wurde geschlossen oder gesendet."

    ' Ressourcen freigeben
    Set myMail = Nothing
    Set myOutlookApplication = Nothing
    ThisWorkbook.Saved = True
End Sub

Häufige Fehler und Lösungen

  • Problem: Der Code funktioniert nicht, weil das E-Mail-Fenster nicht erkannt wird.

    • Lösung: Stelle sicher, dass der Fenstertitel korrekt ist. Der Code verwendet FindWindow, um das E-Mail-Fenster zu finden. Prüfe, ob das Fenster korrekt angezeigt wird und der Titel mit dem Suchbegriff übereinstimmt.
  • Problem: Excel bleibt hängen, während auf die E-Mail gewartet wird.

    • Lösung: Verwende DoEvents, um Excel die Möglichkeit zu geben, andere Aufgaben zu verarbeiten, während es auf das Schließen des E-Mail-Fensters wartet.

Alternative Methoden

Eine alternative Methode, um in Excel VBA zu warten, besteht darin, einen Timer zu verwenden, der regelmäßig prüft, ob das E-Mail-Fenster noch geöffnet ist. Hier ist ein Beispiel:

Public Sub StartTimer()
    Application.OnTime Now + TimeValue("00:00:01"), "CheckMailWindow"
End Sub

Public Sub CheckMailWindow()
    If FindWindow("rctrl_renwnd32", vbNullString) = 0 Then
        MsgBox "Die E-Mail wurde gesendet oder geschlossen."
    Else
        StartTimer ' Timer erneut starten
    End If
End Sub

Praktische Beispiele

Ein häufiges Szenario ist das Versenden von Berichten oder Statusupdates per E-Mail. Du kannst den oben beschriebenen Code verwenden, um sicherzustellen, dass die E-Mail erfolgreich gesendet wurde, bevor du weitere Aktionen in Excel ausführst.


Tipps für Profis

  • Nutze die Möglichkeit, benutzerdefinierte Nachrichten in der E-Mail zu generieren, indem du Excel-Daten dynamisch einfügst.
  • Überlege, eine UserForm zu verwenden, um dem Nutzer die Möglichkeit zu geben, die E-Mail vor dem Versenden zu bearbeiten, anstatt nur .Display zu verwenden.

FAQ: Häufige Fragen

1. Frage: Kann ich das Warten auch für andere Aktionen in Excel nutzen?
Antwort: Ja, das Prinzip des Wartens kann für verschiedene Aktionen angewendet werden, indem du entsprechende Bedingungen für das Warten definierst.

2. Frage: Welche Excel-Version benötige ich für den VBA-Code?
Antwort: Der bereitgestellte Code sollte in den meisten modernen Excel-Versionen funktionieren, die VBA unterstützen, einschließlich Excel 2010 und höher.

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