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?
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
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
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
Problem: Der Code funktioniert nicht, weil das E-Mail-Fenster nicht erkannt wird.
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.
DoEvents
, um Excel die Möglichkeit zu geben, andere Aufgaben zu verarbeiten, während es auf das Schließen des E-Mail-Fensters wartet.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
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.
.Display
zu verwenden.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.
Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden
Suche nach den besten AntwortenEntdecke unsere meistgeklickten Beiträge in der Google Suche
Top 100 Threads jetzt ansehen