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

Automatische Mail bei Datum

Forumthread: Automatische Mail bei Datum

Automatische Mail bei Datum
05.05.2020 08:57:56
Andi
Hallo zusammen,
es tut mir sehr Leid, aber ich muss nochmal eine schon oft beantwortete Frage stellen, weil ich einfach nicht klarkomme den Code an meine Datei anzupassen.
Rahmenbedingungen:
- Meine Tabelle wird jeden Tag manuell geöffnet.
- Die Tabelle soll beim öffnen automatische eine Mail versenden sobald ein Datum überschritten ist.
- Der Empfänger steht immer in Spalte D
- Das Datum des Eintrags steht immer in Spalte E. Ausgehend von diesem Datum soll nach X Tagen (immer der gleiche Wert) die Mail geschickt werden.
- Die Mail soll nur einmal verschickt werden. Das Makro muss also, wie in einer anderen Lösung beschrieben, einen Eintrag in die entprechende Zeile, bei Spalte X machen, sobald die Mail versendet wurde, damit die Mail nicht mehrfach abgeschickt wird.
-Betreff der Mail soll sein: Fristablauf: %Spalte C% läuft in X Tagen ab
- Body soll sein:
Inhalt: %SpalteF%
%SpalteG%
Ich habe unter anderem diesen Code gefunden:

Sub auto_open()
Dim rCell As Range
Dim objApp As Object
Dim objMailItm As Object
Dim tBRng As String
Dim tReceiver As String
tBRng = "A11:A" & Sheets("ToDo").UsedRange.Rows.Count
tReceiver = Sheets("ToDo").Range("B4")
'    Set objApp = CreateObject("Outlook.Application")
For Each rCell In Sheets("ToDo").Range(tBRng)
If IsDate(rCell.Offset(0, 5).Value) Then
If rCell.Offset(0, 5) - Date " & vbCrLf & _
"wird am " & rCell.Offset(0, 5).Value & " fällig!"
.Send
End With
rCell.Offset(0, 9).Value = True
Set objMailItm = Nothing
End If
End If
Next
Set objApp = Nothing
End Sub

Quelle: https:\/\/www.herber.de/forum/archiv/876to880/878916_Mail_aus_Excel_heraus_automatisch_versenden.html
Weiß aber nicht wie ich den anpassen kann.
Ich weiß es ist viel erwartet, aber könnte mir jemand erklären wie der Code arbeitet oder was ich tun muss?
Vielen Dank im voraus für die Mühe
Andi
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Automatische Mail bei Datum
05.05.2020 16:37:09
volti
Hallo Andi,
schau mal, ob der nachfolgende Code in Deinem Sinne ist. Ggf. noch hier und da anpassen.
Ohne Datei ist es etwas schwierig zu testen....
Code in die Zwischenablage
Private Sub Workbook_Open()
'Sub sendet Mails lt. Liste
 Dim sTxt As String, sSignatur As String
 Dim WSh As Worksheet, oMail As Object
 Dim iZeile As Long, iAnz As Integer
 Set WSh = ThisWorkbook.Sheets("ToDo")          'Tabellenblatt
 With CreateObject("Outlook.Application")
 
  For iZeile = 2 To WSh.UsedRange.Rows.Count + 1
   If WSh.Cells(iZeile, "X").Value = "" Then    'Mail noch nicht gesendet
    If WSh.Cells(iZeile, "D").Value <> "" Then  'Empfänger ist vorhanden
     
     If CDate(WSh.Cells(iZeile, "E").Value) <= Date Then
      Set oMail = .CreateItem(0)                'Mail kreieren
      With oMail
        .Getinspector: sSignatur = .body        'Signatur retten
        .Subject = "Fälligkeitswarnung"         'Betreff
        .Importance = 1                         'Wichtigkeit
       .To = WSh.Cells(iZeile, "D").Value       'Empfänger aus Liste
       .CC = ""                                 'Kopieempfänger
       .BCC = ""                                'Blindkopie
       sTxt = "Hallo," & vbCrLf _
              & vbCrLf & "die Tätigkeit <" _
              & WSh.Cells(iZeile, "F").Value _
              & ">" & vbCrLf & "wird am " _
              & WSh.Cells(iZeile, "D").Value _
              & " fällig!"
       .body = sTxt & sSignatur                 'Body setzen mit Signatur
       .display                                 'Mail anzeigen
       WSh.Cells(iZeile, "X").Value = "gesendet" 'Merker setzen
      End With
      Set oMail = Nothing
      iAnz = iAnz + 1                           'Anzahl Mails zählen
     End If
    End If
   End If
  Next iZeile
 
  If iAnz > 0 Then
    sTxt = "Bitte jetzt die Mails absenden!"
  Else
    sTxt = "Nicht zu tun!"
  End If
  MsgBox sTxt, vbInformation, "Mail senden"
 End With
End Sub

viele Grüße
Karl-Heinz

Anzeige
AW: Automatische Mail bei Datum
05.05.2020 16:48:33
volti
Nachtrag:

DIM X as Integer
X=5
If CDate(WSh.Cells(iZeile, "E").Value) <= (Date + X) Then

VG KH
AW: Automatische Mail bei Datum
05.05.2020 17:20:32
Andi
Hallo Karl-Heinz,
vielen Dank für deine Mühe. Bei dir kommt zumindest schonmal ein Ergebnis :-)
Er sagt jetzt allerdings immer "Nichts zu tun."
Deinen Code finde ich toll, weil ich schonmal nachvollziehen kann wie das Ding arbeitet. Mit deinem nachtrag verstehe ich auch, dass der Code das Datum aus E nimmt, und eine Mail sendet wenn seitdem 5 Tage oder mehr vergangen sind, richtig? (Sorry für die vielen Fragen, aber ich will es verstehen lernen, also Danke für die vielen Anmerkungen. Das hilft mir sehr.
Ich habe jetzt ein paar Mal mit dem Datum gespielt, aber er sagt mir immer wieder, dass er nichts zu tun hat.
Was mache ich da denn falsch?
Eine Beispieldatei habe ich jetzt auch, Danke für den Hinweis:
https:\/\/www.herber.de/bbs/user/137284.xlsm
Anzeige
AW: Automatische Mail bei Datum
05.05.2020 18:15:24
volti
Hallo Andi,
das Tool nimmt als Grundlage den UsedRange. In Deiner Datei gehören die ersten beiden Zeilen nicht dazu.
Begonnen wird mit der zweiten Zeile (1. ist die Überschrift) des UsedRange
und dann darf in Spalte $X nichts stehen, muss also leer sein, ansonsten nimmt er an, dass schon versendet worden ist.
Also, bitte oben in Zeile 1 beginnen mit der Überschrift, ab zweiter Zeile dann die Nutzdaten...
Gesendet wird nur, wenn
  • In $X nichts steht, also leer ist
  • in $D ein Empfänger steht, also nicht leer ist
  • Das Datum im Feld<Heute+X ist

viele Grüße
Karl-Heinz
Anzeige
AW: Automatische Mail bei Datum
06.05.2020 12:07:53
Andi
Hallo Karl-Heinz,
das ist echt toll. Ich habe noch ein bisschen rumprobiert und ein paar Sachen leicht angepasst.
Zwei Dinge verstehe ich noch nicht. Vielleicht kannst du mir hier noch weiterhelfen:
- Kommt das Verhalten, dass die Tabelle in der ersten Zeiledie Überschrift haben muss und der Working Range ab Zeile 2 muss über die Formulierung "For iZeile = 2 To WSh....."? Oder was macht diese Funktion?
- Ich wollte noch eine weitere Prüfung einbauen:
If WSh.Cells(iZeile, "W").Value = "" Then 'Vorgang nicht bereits abgeschlossen.
Ich bekomme dann aber den "Fehler beim Kompilieren: Next ohne For". Ich verstehe nicht warum. Das liegt an der neu eingefügten prüfung, aber weiter komme ich nicht.
Mit dieser Zeile möchte ich prüfen ob in Spalte W ein Datum eingetragen ist, wenn kein Datum drin steht, soll er weitermachen und die Mail senden. Wenn eins drinsteht, ist der Vorgang bereits abgeschlossen und er muss nichts weiter prüfen (für diese Zeile)
Ansonsten nochmal vielen, vielen Dank! Das st echt perfekt und spart mir ne Menge Arbeit.
Anzeige
AW: Automatische Mail bei Datum
06.05.2020 14:29:12
volti
Hallo Andi,
For iZeile = 2 To WSh....."?
Mit der zweiten Zeile des UsedRange (normalerweise von Zeile 1 bis x) beginnen, da die erste die Überschrift ist.
If WSh.Cells(iZeile, "W").Value = "" Then
Der Code ist ok, aber Du musst auch noch ein End If dazu setzen (am besten vor das Next iZeile….
Ich bekomme dann aber den "Fehler beim Kompilieren: Next ohne For". Ich verstehe nicht warum. Das liegt an der neu eingefügten prüfung, aber weiter komme ich nicht.
Das ist genau die Fehlerbeschreibung End If fehlt oder ist an falscher Stelle.
viele Grüße
Karl-Heinz
Anzeige
AW: Automatische Mail bei Datum
06.05.2020 16:36:02
Andi
Perfekt. Es geht jetzt alles. Ich Danke dir vielmals für die Lösung, und dass ich das verstehen konnte!
Viele GRüße
;
Anzeige
Anzeige

Infobox / Tutorial

Automatische E-Mail aus Excel versenden, wenn Datum erreicht


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.

  2. Modul hinzufügen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Code einfügen: Kopiere den folgenden Code und füge ihn in das Modul ein:

    Private Sub Workbook_Open()
       Dim WSh As Worksheet
       Dim oMail As Object
       Dim iZeile As Long
       Dim sTxt As String
       Dim sSignatur As String
       Set WSh = ThisWorkbook.Sheets("ToDo")
    
       With CreateObject("Outlook.Application")
           For iZeile = 2 To WSh.UsedRange.Rows.Count
               If WSh.Cells(iZeile, "X").Value = "" Then
                   If WSh.Cells(iZeile, "D").Value <> "" Then
                       If CDate(WSh.Cells(iZeile, "E").Value) <= Date + 5 Then
                           Set oMail = .CreateItem(0)
                           With oMail
                               .Subject = "Fristablauf: " & WSh.Cells(iZeile, "C").Value & " läuft in 5 Tagen ab"
                               .To = WSh.Cells(iZeile, "D").Value
                               sTxt = "Hallo," & vbCrLf & _
                                       "die Tätigkeit " & WSh.Cells(iZeile, "F").Value & _
                                       " wird am " & WSh.Cells(iZeile, "E").Value & " fällig!"
                               .body = sTxt & sSignatur
                               .Send
                           End With
                           WSh.Cells(iZeile, "X").Value = "gesendet"
                       End If
                   End If
               End If
           Next iZeile
       End With
    End Sub
  4. Workbook_Open: Dieser Code wird automatisch beim Öffnen der Arbeitsmappe ausgeführt. Er prüft, ob das Datum in Spalte E erreicht ist und versendet eine E-Mail, wenn das der Fall ist.

  5. Excel speichern: Speichere die Datei als .xlsm (Makro-aktivierte Arbeitsmappe).


Häufige Fehler und Lösungen

  • Kein Empfänger in Spalte D: Stelle sicher, dass in der entsprechenden Zeile in Spalte D eine E-Mail-Adresse vorhanden ist.
  • Datum in Spalte E: Überprüfe, ob das Datum korrekt eingegeben wurde und nicht in einem anderen Format vorliegt.
  • Spalte X nicht leer: Wenn in Spalte X bereits "gesendet" steht, wird keine E-Mail versendet. Achte darauf, dass diese Spalte beim ersten Durchlauf leer ist.

Alternative Methoden

Eine alternative Methode, um eine E-Mail aus Excel zu versenden, ist die Verwendung von Power Automate (ehemals Microsoft Flow). Hierbei kannst Du Flows erstellen, die E-Mails basierend auf bestimmten Triggern versenden, wie z.B. ein bestimmtes Datum.


Praktische Beispiele

  • Beispiel 1: Wenn in Spalte E das Datum 01.01.2024 steht und heute der 28.12.2023 ist, wird die E-Mail an den in Spalte D angegebenen Empfänger versendet.
  • Beispiel 2: Setze in Spalte F eine kurze Beschreibung der Aufgabe, die im E-Mail-Text erscheinen soll.

Tipps für Profis

  • Fehlerbehandlung: Füge eine Fehlerbehandlung in den Code ein, um unerwartete Probleme beim Versenden der E-Mail zu vermeiden.
  • Testlauf: Teste den Code mit einer Dummy-Mail-Adresse, um sicherzustellen, dass alles wie gewünscht funktioniert, bevor Du ihn im Live-Betrieb verwendest.
  • Benutzerdefinierte Nachrichten: Passe die E-Mail-Nachricht an, um spezifische Informationen oder Erinnerungen für den Empfänger hinzuzufügen.

FAQ: Häufige Fragen

1. Wie kann ich den Code anpassen, um eine andere Anzahl an Tagen zu berücksichtigen?
Ändere einfach den Wert 5 in der Zeile If CDate(WSh.Cells(iZeile, "E").Value) <= Date + 5 Then zu der gewünschten Anzahl.

2. Funktioniert dieser Code in Excel 2016?
Ja, dieser Code sollte in Excel 2016 und neueren Versionen ohne Probleme funktionieren.

3. Wie kann ich sicherstellen, dass die E-Mail nur einmal gesendet wird?
Verwende die Spalte X, um den Status der gesendeten E-Mail zu verfolgen. Der Code überprüft, ob dieser Wert leer ist, bevor er eine E-Mail sendet.

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