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

Automatisches Email-Versenden bei Ereignis

Forumthread: Automatisches Email-Versenden bei Ereignis

Automatisches Email-Versenden bei Ereignis
16.06.2014 09:49:31
Frank
Hallo liebe VBA-Excel-Community,
dieser Thread ist die Fortsetzung von "Index von 2 Spalten vergleichen und berechnen,VBA".
Die Anforderung besteht darin, dass beim eintreten eines Ereignises automatisch eine Email verschickt wird. Die Realisierung wird wohl mittels VBA-Code geschehen, allerdings weiß nicht viel bzw. nichts über Email-Programmierung.
Konkret: Sobald die Spalte "aktueller Bestand" (Spalte E, Blatt: Tonerbestand) sein Minimum erreicht bzw. es unterschreitet.
Wie könnte man es machen, dass dies über MS Outlook passiert?
Hier die Tabelle dazu:
https://www.herber.de/bbs/user/91136.xlsm

Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 09:51:05
Frank
Edit:
Sobald die Spalte "aktueller Bestand" (Spalte E, Blatt: Tonerbestand) sein Minimum erreicht bzw. es unterschreitet soll eine Email an einen bestimmten Benutzer versandt werden.

AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 10:10:42
Rudi
Hallo,
etwa so:
....
If wksZ.Cells(a, 5) 
Sub StartMail(strToner As String)
Dim strTo As String, strSUBJECT As String, strText As String, _
strCC As String, strBCC As String, strAtt As String
strTo = "jemand@irgendwo.com" 'mehrere mit ; trennen
strSUBJECT = "Toner " & strToner
strText = "Bitte Toner " & strToner & " bestellen."
SendMail_Outlook strTo, strSUBJECT, strText, strCC, strBCC, strAtt
End Sub
Sub SendMail_Outlook(strTo As String, strSUBJECT As String, strText As String, _
strCC As String, strBCC As String, strAtt As String)
Dim MyMessage As Object, MyOutApp As Object, i As Integer
'Outlook Object erstellen
Set MyOutApp = CreateObject("Outlook.Application")
'Outlook Nachricht erstellen
Set MyMessage = MyOutApp.CreateItem(0)
With MyMessage
'Empfänger
If Len(strTo) Then
.To = strTo
End If
'Kopie
If Len(strCC) Then
.CC = strCC
End If
'Blindkopie
If Len(strCC) Then
.BCC = strBCC
End If
'Betreff
.Subject = strSUBJECT
For i = 0 To UBound(Split(strAtt, ";"))
.Attachments.Add Trim(Split(strAtt, ";")(i))
Next
If Len(strText) Then
'Hier wird ein normaler Text erstellt
.Body = strText
End If
'Hier wird eine HTML Mail erstellt
'Dies kann zu Problemen führen, wenn der Empfänger nur TEXT Dateien empfangen darf.
'.HTMLBody = "Das ist ein Test." & vbCrLf & "Bitte ignorieren."
'Hier wird die Mail nochmals angezeigt
'        .Display
'Hier wird die Mail gleich in den Postausgang gelegt und gesendet
.Send
End With
'Outlook schliessen
'MyOutApp.Quit
'Variablen leeren
Set MyOutApp = Nothing
Set MyMessage = Nothing
End Sub

Gruß
Rudi

Anzeige
AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 10:28:48
Nepumuk
Hallo Rudi,
ist die Abfrage nach der Länge der Parameter nicht überflüssig? .CC ist ein String mit dem Initialwert "". Wenn ich dem einen leeren String übergebe ist es immer noch ein leerer String. Eine Prüfung, ob da überhaupt eine gültige Mailadresse drin steht machst du ja dabei nicht.
Gruß
Nepumuk

Anzeige
Länge Parameter
16.06.2014 10:33:01
Rudi
Hallo,
ja, eigentlich überflüssig.
Und ein Fehler ist auch drin:
        If Len(strCC) Then
.BCC = strBCC
End If
Gruß
Rudi

AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 10:47:20
Frank
Hallo Nepumuk, mit "Rudi" meinst du wohl einen anderen Benutzer aus dem Forum?:)
"ist die Abfrage nach der Länge der Parameter nicht überflüssig?"
Was meinst du damit, welche Parameterlänge?
So ich habe es jetzt getestet und es funzt prima, ich bin happy wie schnell du das hinbekommen hast!!!! Danke vielmals! Ich werde es jetzt anpassen und vertiefter testen und melde mich danach.

Anzeige
AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 10:54:24
Frank
Hallo Nepumuk, könnte man es auch so anstellen, dass die Email(s) nicht sofort versant werden, sondern erst wenn man die Exceldatei speichert? Das hat den Grund, dass es sein könnte, dass evtl. mehrere Toner an einem Tag ausgegeben werden und nicht für jeden Toner eine eigene Email verschickt wird, sondern eine für alle?
Danke.

Anzeige
AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 11:21:05
Nepumuk
Hallo,
was hält dich davon ab, im Workbook_BeforeSave-Event die Prozedur zu starten?
Gruß
Nepumuk

AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 11:29:30
Frank
Jetzt nichts mehr:)
Aber vorher hielt mich mein Unwissen davon ab!
Klasse, danke dir!

AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 11:34:49
Frank
Da habe ich mich wohl zu früh gefreut, im VBA-Editor habe ich nur "Worksheet" und "(Allgemein)" zur Auswahl, aber kein "Workbook". Oder ist es die falsche Stelle?

Anzeige
AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 11:37:49
Nepumuk
Hallo,
in das Modul "DieseArbeitsmappe" !!!
Gruß
Nepumuk

AW: Automatisches Email-Versenden bei Ereignis
16.06.2014 13:16:05
Frank
Ja, ich habe es gefunden. D.h. kommt dort jetzt "StartMail wksZ.Cells(a, 2)" hin und bei
If-Abfrage im Worksheet diese Zeile wieder herausnehmen?

mit "Rudi" meinst du wohl
16.06.2014 11:07:09
Rudi
Hallo Frank,
er meint mich!
Was meinst du damit, welche Parameterlänge?
Er meint die Abfrage
If Len(strTo) Then
.To = StrTo
End If

etc.
weil
.To = strTo

ausreicht.
ich bin happy wie schnell du das hinbekommen hast!!!!
Das war ich, nicht Nepumuk.
Der Code stammt wohl ursprünglich von Ramses.
Gruß
Rudi

Anzeige
AW: mit "Rudi" meinst du wohl
16.06.2014 11:13:30
Frank
Verstehe immer noch nicht so recht was das mit mir zu tun hat. Oder haben wir beide ähnliche Fragestellung mit dir und Nepumuk hat uns beiden geantwortet?:)

Verstehe immer noch nicht so recht
16.06.2014 11:23:46
Rudi
Hallo Frank,
was gibt es da nicht zu verstehen?
Ich habe dir geantwortet und dir den Code geschickt.
Nepumuk hat mir eine Anregung zur Verbesserung gegeben.
Zu deiner Frage.
In DieseArbeitsmappe:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
StartMail
End Sub

In ein Modul:
Sub StartMail()
Dim strTo As String, strSUBJECT As String, strText As String, _
strCC As String, strBCC As String, strAtt As String, _
strToner As String
strToner = FehlBestand
strTo = "jemand@irgendwo.com" 'mehrere mit ; trennen
strSUBJECT = "Fehlender Toner"
strText = "Bitte Toner " & strToner & " bestellen."
SendMail_Outlook strTo, strSUBJECT, strText, strCC, strBCC, strAtt
End Sub
Sub SendMail_Outlook(strTo As String, strSUBJECT As String, strText As String, _
strCC As String, strBCC As String, strAtt As String)
Dim MyMessage As Object, MyOutApp As Object, i As Integer
'Outlook Object erstellen
Set MyOutApp = CreateObject("Outlook.Application")
'Outlook Nachricht erstellen
Set MyMessage = MyOutApp.CreateItem(0)
With MyMessage
'Empfänger
.To = strTo
'Kopie
.CC = strCC
'Blindkopie
.BCC = strBCC
'Betreff
.Subject = strSUBJECT
For i = 0 To UBound(Split(strAtt, ";"))
.Attachments.Add Trim(Split(strAtt, ";")(i))
Next
'Hier wird ein normaler Text erstellt
.Body = strText
'Hier wird eine HTML Mail erstellt
'Dies kann zu Problemen führen, wenn der Empfänger nur TEXT Dateien empfangen darf.
'.HTMLBody = "Das ist ein Test." & vbCrLf & "Bitte ignorieren."
'Hier wird die Mail nochmals angezeigt
'        .Display
'Hier wird die Mail gleich in den Postausgang gelegt und gesendet
.Send
End With
'Outlook schliessen
'MyOutApp.Quit
'Variablen leeren
Set MyOutApp = Nothing
Set MyMessage = Nothing
End Sub
Function FehlBestand() As String
Dim rngC As Range
With Sheets("Tonerbestand")
For Each rngC In .Range(.Cells(2, 5), .Cells(45, 5))
If rngC 

Gruß
Rudi

Anzeige
AW: Verstehe immer noch nicht so recht
17.06.2014 08:13:35
Frank
Ups, sorry Rudi, so habe ich den Kontext nicht gesehen:)
danke ich werde es gleich mal testen.

AW: Verstehe immer noch nicht so recht
17.06.2014 15:07:22
Frank
Hi Rudi,
leider wurde ich durch andere Aufgaben abgehalten und konnte diesen Code erst jetzt testen, aber leider habe ich wohl irgendwas falsch gemacht, da nichts funktioniert.
Habe den vorherigen Code entfernt und den neuen so wie du beschriben hast aufgesetzt.
https://www.herber.de/bbs/user/91152.xlsm

Anzeige
AW: Verstehe immer noch nicht so recht
20.06.2014 09:32:42
Frank
Leute ich bin hängen geblieben an dieser Stelle und komme nicht mehr weiter. Was habe ich falsch umgesetzt?
;
Anzeige
Anzeige

Infobox / Tutorial

Automatisches E-Mail-Versenden bei Ereignis in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeineArbeitsmappe)", wähle "Einfügen" und dann "Modul".

  3. Füge den folgenden VBA-Code ein:

    Sub StartMail(strToner As String)
       Dim strTo As String, strSUBJECT As String, strText As String
       strTo = "jemand@irgendwo.com" ' Empfängeradresse
       strSUBJECT = "Toner " & strToner
       strText = "Bitte Toner " & strToner & " bestellen."
       SendMail_Outlook strTo, strSUBJECT, strText
    End Sub
    
    Sub SendMail_Outlook(strTo As String, strSUBJECT As String, strText As String)
       Dim MyMessage As Object, MyOutApp As Object
       Set MyOutApp = CreateObject("Outlook.Application")
       Set MyMessage = MyOutApp.CreateItem(0)
       With MyMessage
           .To = strTo
           .Subject = strSUBJECT
           .Body = strText
           .Send
       End With
       Set MyOutApp = Nothing
       Set MyMessage = Nothing
    End Sub
  4. Füge den Trigger für das E-Mail-Versenden hinzu: Gehe zu "DieseArbeitsmappe" im VBA-Editor und füge den folgenden Code ein:

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
       StartMail "Toner XYZ" ' Beispiel für Toner
    End Sub
  5. Schließe den VBA-Editor und teste die Excel-Datei. Beim Speichern der Datei sollte automatisch eine E-Mail versendet werden.


Häufige Fehler und Lösungen

  • Keine E-Mail wird gesendet: Überprüfe, ob Outlook als Standard-E-Mail-Programm eingestellt ist.
  • Fehlermeldungen im VBA-Code: Achte darauf, dass alle Variablen korrekt deklariert sind und die Objekte richtig instanziiert werden.
  • E-Mail wird nicht an die richtige Adresse gesendet: Stelle sicher, dass die E-Mail-Adresse im Code korrekt ist.

Alternative Methoden

  • Benutze Excel-Formeln: Anstatt VBA zu verwenden, kannst du auch Excel-Formeln kombinieren, um Benachrichtigungen zu erstellen. Diese Methode ist jedoch weniger flexibel und automatisiert.
  • Verwendung von Drittanbieter-Tools: Tools wie Zapier oder Automate.io können helfen, E-Mails aus Excel zu versenden, ohne dass VBA erforderlich ist.

Praktische Beispiele

  • E-Mail versenden, wenn Wert erreicht ist: Du kannst den Code anpassen, um nur dann eine E-Mail zu senden, wenn der "aktueller Bestand" in Spalte E einen bestimmten Wert unterschreitet.

    If wksZ.Cells(a, 5) < Minimalwert Then
       StartMail wksZ.Cells(a, 2) ' Tonername
    End If
  • Multiples E-Mail-Versenden: Du kannst eine Schleife implementieren, um alle Toner zu überprüfen und nur eine E-Mail zu senden, wenn mehrere Werte unter einem bestimmten Schwellenwert liegen.


Tipps für Profis

  • Debugging: Nutze Debug.Print in deinem Code, um Werte zu überprüfen, während das Makro läuft.
  • Sicherheitsoptionen: Stelle sicher, dass Makros in Excel aktiviert sind, um die Funktionalität des E-Mail-Versendens zu gewährleisten.
  • Anpassungen vornehmen: Passe den E-Mail-Inhalt und die Empfängeradressen dynamisch an, um personalisierte E-Mails zu versenden.

FAQ: Häufige Fragen

1. Wie kann ich E-Mails aus Excel versenden, wenn ein bestimmter Wert erreicht wird?
Du kannst eine IF-Bedingung im VBA-Code verwenden, um zu überprüfen, ob der Wert einen bestimmten Schwellenwert überschreitet und dann die E-Mail-Funktion zu aktivieren.

2. Muss ich Outlook installiert haben, um E-Mails zu versenden?
Ja, der Code verwendet das Outlook-Objektmodell, daher ist Outlook auf deinem Computer erforderlich.

3. Kann ich auch Anhänge in die E-Mail einfügen?
Ja, du kannst die .Attachments.Add-Methode in der SendMail_Outlook-Prozedur verwenden, um Dateien anzuhängen.

4. Was tun, wenn ich mehrere E-Mails an verschiedene Empfänger senden möchte?
Erweitere das strTo-Feld, um mehrere E-Mail-Adressen durch Semikolons zu trennen, z.B. strTo = "email1@domain.com;email2@domain.com".

5. Wie kann ich sicherstellen, dass die E-Mail nicht sofort gesendet wird?
Du kannst den E-Mail-Versand in eine Bedingung einfügen, die nur beim Speichern der Arbeitsmappe ausgelöst wird.

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