Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Code Email versenden per Outlook

VBA Code Email versenden per Outlook
08.03.2018 09:53:19
Markus
Hallo zusammen,
ich hoffe, ihr könnt mir weiter helfen.
Ich möchte, dass wenn in der Beispieldatei im Tabellenblatt "Aufgaben" in Spalte D das Datum wie in Zelle B2 (heute) ist eine Automatische Email per Outlook verschickt wird an die Emailadresse aus der Zelle B1.
Betreff der Email soll lauten: " Aufgabe fällig"
Der Text in der Email soll dann der Text der jeweiligen Zeile sein aus Spalte B.
Also z.B. Wenn in Zeile 5 das Datum erreicht ist soll eine Email generiert werden mit dem Betreff "Aufgabe fällig" und der Text soll lauten: "Birnen tauschen"
Für eure Hilfe wäre ich euch sehr dankbar!
VG
Markus
https://www.herber.de/bbs/user/120279.xlsm
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Code Email versenden per Outlook
08.03.2018 10:15:37
Beverly
Hi Markus,
das könntest du z.B. so lösen:
Private Sub Workbook_Open()
Dim obNachricht As Object
Dim obMail As Object
Dim lngZeile As Long
Set obMail = CreateObject("Outlook.Application")
With Worksheets("Aufgaben")
For lngZeile = 1 To IIf(IsEmpty(.Cells(.Rows.Count, 4)), .Cells(.Rows.Count, 4).End( _
xlUp).Row, .Rows.Count)
If .Cells(lngZeile, 1) = .Range("B2") Then
Set obNachricht = obMail.CreateItem(0)
With obNachricht
.To = .Range("B1")
.Subject = "Aufgabe fällig"
.Body = .Cells(lngZeile, 2)
.ReadReceiptRequested = False
.send
End With
Set obNachricht = Nothing
End If
Next lngZeile
End With
Set obMail = Nothing
End Sub



Anzeige
AW: VBA Code Email versenden per Outlook
08.03.2018 10:33:54
Markus
Hallo Beverly,
vielen Dank für Deine Antwort.
Doch leider funktioniert das bei mir dann nicht.
Könntest Du den Code bitte in meine Bespieldatei einfügen und hier wieder hochladen?
Das wäre wirklich lieb!
WAS funktioniert nicht?
08.03.2018 10:43:08
Beverly
Hi Markus,
mit solchen lapidaren Antworten wie "Doch leider funktioniert das bei mir dann nicht" kann leider niemand etwas anfangen. Du musst schon genauer angeben, WAS nicht funktioniert - löst der Code einen Fehler aus, macht er nicht was er soll und wenn ja - WAS macht er falsch?
Der Code gehört ins Codemodul DieseArbeitsmappe, damit die Mail beim Öffnen der Mappe versandt wird.


Anzeige
AW: WAS funktioniert nicht?
08.03.2018 11:03:35
Markus
Hi Beverly,
Ok, dann nun genauer, es passiert gar nichts, weder ein Emailversand, noch eine Fehlermeldung.
Der Code ist wie beschrieben in DieseArbeitsmappe.
Die Emailadresse ist in der Bespieldatei geändert, also an der liegt es nicht.
Wo liegt dann der Fehler?
https://www.herber.de/bbs/user/120282.xlsm
Anzeige
Ein, zwei kleine Dinge...
08.03.2018 13:25:33
Case
Hallo, :-)
... musst Du noch ändern: ;-)
"If .Cells(lngZeile, 1)" - mach aus der 1 eine 4.
".To = .Range("B1")" und ".Body = .Cells(lngZeile, 2)" - durch den Punkt beziehst Du dich auf "obNachricht", das kann nicht klappen. Entweder Du entfernst den Punkt, dann muss aber klar sein, dass es nur funktioniert, wenn Du bei Ausführung des Makros im Tabellenblatt "Aufgaben" bist. Oder Du schreibst es bei beiden davor ".To = Worksheets("Aufgaben").Range("B1").Text".
Das ist jetzt nicht entscheidend für die Schlacht, aber Du musst die Schleife nicht in Zeile 1 anfangen lassen, wenn Deine Daten in Zeile 5 anfangen.
Dann sollte es eigentlich klappen. ;-)
Servus
Case

Anzeige
AW: WAS funktioniert nicht?
08.03.2018 14:47:55
Beverly
Hi Markus,
ändere den Code wir folgt:
Private Sub Workbook_Open()
Dim obNachricht As Object
Dim obMail As Object
Dim lngZeile As Long
Set obMail = CreateObject("Outlook.Application")
With Worksheets("Aufgaben")
For lngZeile = 5 To IIf(IsEmpty(.Cells(.Rows.Count, 4)), .Cells(.Rows.Count, 4).End( _
xlUp).Row, .Rows.Count)
If .Cells(lngZeile, 4) = .Range("B2") Then
Set obNachricht = obMail.CreateItem(0)
With obNachricht
.To = Worksheets("Aufgaben").Range("B1")
.Subject = "Aufgabe fällig"
.Body = Worksheets("Aufgaben").Cells(lngZeile, 2)
.ReadReceiptRequested = False
'.send
.display
End With
Set obNachricht = Nothing
End If
Next lngZeile
End With
Set obMail = Nothing
End Sub


Anzeige
AW: WAS funktioniert nicht?
09.03.2018 08:22:07
Markus
Guten Morgen ihr beiden,
vielen Dank für eure Hilfe, nun funktioniert es! :-)
Ich hätte nur noch 2 kleine Ergänzungen falls das machbar ist....
Und zwar soll die Email auch versandt werden, wenn das Datum nich gleich heute ist, sondern auch wenn es in der Vergangenheit liegt.
In beiden Fällen soll die Email aber nur versandt werden, wenn in Spalte E das Wort "offen" steht....
Für eure Hilfe danke ich euch schon mal im Voraus!
VG
Markus
https://www.herber.de/bbs/user/120302.xlsm
Anzeige
Unklare Fragestellung
09.03.2018 08:57:57
Beverly
Hi Markus,
also hat das ganze nichts mit dem Datum zu tun wie in deinem Eröffnungsbeitrag sondern damit, ob in Spalte E "offen" steht? Und wie soll dann festgestellt werden, ob vielleicht bereits (irgendwann) eine Mail gesendet wurde? Soll die Mail jeden Tag gesendet werden, wenn die Mappe geöffnet wird? Oder wie stellst du dir das ganze konkret vor?


Anzeige
AW: Unklare Fragestellung
09.03.2018 09:20:55
Markus
Hi Beverly,
So dann versuche ich meine Frage deutlicher zu stellen :-)
Doch es hat schon etwas mit dem Datum zu tun und ist so wie es jetzt momentan läuft auch gut so.
Nur wird die Mail nur dann geschickt, wenn es genau das Datum ist.
Im Prinzip soll beim öffnen der Datei die Spalte auf das Datum überprüft werden, wenn das Datum in Spalte D heute oder in der Vergangenheit liegt und in Spalte E "offen" steht, dann soll eine Email verschickt werden.
Das wäre meine Vorstellung.
Wie das von Dir dargestellte Problem mit den bereits versendeten Mails überprüft werden kann weiß ich nicht, daher habe ich die Spalte E eingefügt mit einer zweiten Abfrage. Es sei denn, Du hättest da eine bessere Lösung....
VG
Markus
Anzeige
AW: Unklare Fragestellung
09.03.2018 09:37:34
Beverly
Hi Markus,
ich nehme an mit "offen" meinst du, dass die Aufgabe noch nicht erfüllt wurde? Dann würde ich eine zusätzliche Spalte verwenden und dort z.B. ein "x" eintragen, wenn die Mail gesendet wird - beim nächsten Durchlauf wird diese Aufgabe dann nicht berücksichtigt. Wenn du der Meinung bist, dass die Mail irgendwann doch nochmal gesendet werden soll, löschst du einfach das x von Hand.
    With Worksheets("Aufgaben")
For lngZeile = 5 To IIf(IsEmpty(.Cells(.Rows.Count, 4)), _
.Cells(.Rows.Count, 4).End(xlUp).Row, .Rows.Count)
If .Cells(lngZeile, 4)  "x" Then
Set obNachricht = obMail.CreateItem(0)
With obNachricht
.To = Worksheets("Aufgaben").Range("B1")
.Subject = "Aufgabe fällig"
.Body = Worksheets("Aufgaben").Cells(lngZeile, 2)
.ReadReceiptRequested = False
'.send
.display
End With
Set obNachricht = Nothing
.Cells(lngZeile, 6) = "x"
End If
End If
Next lngZeile
End With

Oder meinst du etwas anderes?


Anzeige
AW: VBA Code Email versenden per Outlook
12.03.2018 10:41:17
Markus
Guten Morgen Beverly,
vielen Dank noch einmal für Deine Hilfe!
Ja so hatte ich mir das vorgestellt, Du bist echt spitze!
Nur hat der letzte von Dir geschriebene Code nicht funktioniert, aber wahrscheinlichi habe ich auch nur etwas falsch gemacht.
Ich habe ihn umgeschrieben und jetzt funktioniert es......
Wenn ich Dich aber noch einmal um Deine Hilfe bitten dürfte, denn momentan gehen alle Mails an die Emailadresse in Zelle B2. Das wollte ich auch so.
Ist es aber auch möglich, dass die Mails an eine Emailadresse die ich in der Spalte 7 der jeweiligen Zeile schreibe sende?
Der momentane Code sieht so aus:
Private Sub Workbook_Open()
Dim obNachricht As Object
Dim obMail As Object
Dim lngZeile As Long
Set obMail = CreateObject("Outlook.Application")
With Worksheets("Aufgaben")
For lngZeile = 5 To IIf(IsEmpty(.Cells(.Rows.Count, 4)), .Cells(.Rows.Count, 4).End( _
xlUp).Row, .Rows.Count)
If .Cells(lngZeile, 4)  "x" Then
Set obNachricht = obMail.CreateItem(0)
With obNachricht
.To = Worksheets("Aufgaben").Range("B1")
.Subject = "Aufgabe fällig"
.Body = Worksheets("Aufgaben").Cells(lngZeile, 2)
.ReadReceiptRequested = False
.send
'.display
End With
Set obNachricht = Nothing
End If
Next lngZeile
End With
Set obMail = Nothing
End Sub
VG
Markus
Anzeige
AW: VBA Code Email versenden per Outlook
12.03.2018 11:28:53
Beverly
Hi Markus,
ändere Worksheets("Aufgaben").Range("B1") in Worksheets("Aufgaben").Cells(lngZeile, 7)


;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Automatisierte E-Mails mit VBA in Excel versenden


Schritt-für-Schritt-Anleitung

Um eine automatisierte E-Mail aus Excel zu versenden, kannst Du den folgenden VBA-Code verwenden. Dieser Code überprüft das Datum in Spalte D und versendet eine E-Mail, wenn das Datum heute oder in der Vergangenheit liegt und in Spalte E das Wort "offen" steht.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge den folgenden Code in das Modul DieseArbeitsmappe ein:
Private Sub Workbook_Open()
    Dim obNachricht As Object
    Dim obMail As Object
    Dim lngZeile As Long
    Set obMail = CreateObject("Outlook.Application")
    With Worksheets("Aufgaben")
        For lngZeile = 5 To IIf(IsEmpty(.Cells(.Rows.Count, 4)), .Cells(.Rows.Count, 4).End(xlUp).Row, .Rows.Count)
            If .Cells(lngZeile, 4) <= Date And .Cells(lngZeile, 5) = "offen" Then
                Set obNachricht = obMail.CreateItem(0)
                With obNachricht
                    .To = Worksheets("Aufgaben").Cells(lngZeile, 7) ' E-Mail in Spalte G
                    .Subject = "Aufgabe fällig"
                    .Body = Worksheets("Aufgaben").Cells(lngZeile, 2)
                    .ReadReceiptRequested = False
                    .send
                End With
                Set obNachricht = Nothing
            End If
        Next lngZeile
    End With
    Set obMail = Nothing
End Sub
  1. Schließe den VBA-Editor und speichere die Datei als Makro-fähige Arbeitsmappe (*.xlsm).
  2. Öffne die Datei erneut, um die E-Mails zu versenden.

Häufige Fehler und Lösungen

  • Fehler: "Der Code wird nicht ausgeführt."

    • Lösung: Stelle sicher, dass der Code im Modul DieseArbeitsmappe eingefügt wurde und dass die Datei als Makro-fähige Arbeitsmappe gespeichert ist.
  • Fehler: "Es wird keine E-Mail versendet."

    • Lösung: Überprüfe, ob die E-Mail-Adresse in Spalte G korrekt eingegeben ist und ob Outlook ordnungsgemäß eingerichtet ist.
  • Fehler: "E-Mails werden nicht versendet, wenn das Datum in der Vergangenheit liegt."

    • Lösung: Achte darauf, dass die Bedingung im Code korrekt formuliert ist. Der Code sollte das Datum in Spalte D mit dem aktuellen Datum vergleichen.

Alternative Methoden

Falls Du eine andere Methode bevorzugst, um E-Mails aus Excel zu versenden, könntest Du auch die Funktion SendMail von Excel verwenden. Diese Methode ist jedoch weniger flexibel und bietet nicht die gleichen Anpassungsmöglichkeiten wie VBA.

Sub EmailVersenden()
    ActiveSheet.SendMail "empfaenger@example.com", "Betreff der E-Mail"
End Sub

Praktische Beispiele

  1. E-Mail mit HTML-Inhalt senden:
With obNachricht
    .HTMLBody = "<h1>Aufgabe fällig</h1>" & "<p>" & Worksheets("Aufgaben").Cells(lngZeile, 2) & "</p>"
    .send
End With
  1. E-Mail an mehrere Empfänger:
.To = Worksheets("Aufgaben").Cells(lngZeile, 7) & "; weitere@example.com"

Tipps für Profis

  • Debugging: Verwende Debug.Print im Code, um Probleme zu identifizieren. Dies gibt Dir eine Rückmeldung im Direktfenster des VBA-Editors.
  • E-Mail-Versand testen: Nutze .Display anstelle von .Send, um die E-Mail vor dem Versand anzuzeigen. So kannst Du sicherstellen, dass alles korrekt ist.
  • E-Mail-Templates: Erstelle E-Mail-Vorlagen in Outlook und verwende diese im VBA-Code, um den Versand zu standardisieren.

FAQ: Häufige Fragen

1. Frage
Wie kann ich den E-Mail-Text dynamisch anpassen?
Antwort: Du kannst den Text in der .Body-Eigenschaft anpassen, indem Du Daten aus verschiedenen Zellen kombinierst.

2. Frage
Kann ich den Versand zeitlich planen?
Antwort: Das ist nicht direkt möglich mit dem oben genannten Code. Du kannst jedoch ein zusätzliches Makro einrichten, das auf Zeit-Trigger reagiert.

3. Frage
Wie kann ich sicherstellen, dass die E-Mail nur einmal gesendet wird?
Antwort: Füge eine zusätzliche Spalte hinzu, die markiert, ob eine E-Mail bereits gesendet wurde, und überprüfe diese Spalte im Code.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige