Es gibt Situationen, wo Du gerne Daten oder Tabellen direkt aus Excel per E-Mail versenden möchtest. Du kannst natürlich hergehen und die Exceldatei speichern. Dann ins Outlook Programm gehen, die E-Mail erstellen und dann die Exceldatei als Anhang anhängen. Wenn Du diesen Vorgang aber mehrfach machen musst, kann das ganze ziemlich lästig werden. Deshalb gibt es die Möglichkeit eine vordefinierte Mail in Excel zu erstellen und diese dann über das Standardkonto in Outlook zu versenden. Der Vorteil dieser Methode ist, das Outlook nicht einmal gestartet sein muss.
Aufbau und Programmierung
In den nächsten Schritten zeige ich, wie eine E-Mail per Knopfdruck aus einem Excel-Tabellenblatt heraus versendet wird. Dazu öffnest Du Dein Excel mit einer neuen leeren Arbeitsmappe. Als nächstes musst Du einen Formular Button erstellen. Dieses kannst Du über das Symbol Einfügen im Reiter Entwicklertools. Über den folgenden Dialog wird ein Makro der erstellen Schaltfläche zugewiesen oder neu erstellt :
Bitte erstelle das Makro über den Button Neu und Du gelangst direkt in den Visual Basic Editor. In dem neuen Fenster siehst Du jetzt eine leere Funktion mit dem Makronamen aus dem obenstehenden Bild. Vervollständige nun Deine Funktion, mit den folgenden Zeilen :
On Error GoTo ErrHandler ' SET Outlook APPLICATION OBJECT. Dim objOutlook As Object Set objOutlook = CreateObject("Outlook.Application") ' CREATE EMAIL OBJECT. Dim objEmail As Object Set objEmail = objOutlook.CreateItem(olMailItem) With objEmail .to = "empfaenger@domain.tld" .Subject = "Das ist eine Testnachricht von einem Excel Makro" .Body = "Hallo Welt !!" ' .Display ' .Attachments.Add ("D:\Bild.png") .Send End With ' CLEAR. Set objEmail = Nothing: Set objOutlook = Nothing ErrHandler:
Wenn Du nun alles richtig gemacht hast, sollte Deine Funktion nun wie folgt aussehen :
Sub Schaltfläche1_Klicken() On Error GoTo ErrHandler ' SET Outlook APPLICATION OBJECT. Dim objOutlook As Object Set objOutlook = CreateObject("Outlook.Application") ' CREATE EMAIL OBJECT. Dim objEmail As Object Set objEmail = objOutlook.CreateItem(olMailItem) With objEmail .to = "empfaenger@domain.tld" .Subject = "Das ist eine Testnachricht von einem Excel Makro." .Body = "Hallo Welt !!" ' .Display ' .Attachments.Add ("D:\Bild.png") .Send End With ' CLEAR. Set objEmail = Nothing: Set objOutlook = Nothing ErrHandler: End Sub
Um die erstellte E-Mail anzuzeigen und nicht zu versenden, muss die Zeile .Display auskommentiert und die Zeile .Send kommentiert werden. Denn der Befehl .Display zeigt Dir die E-Mail in einem Outlook Fenster an, so dass Du nochmal kontrollieren kannst, bevor Du die E-Mail versenden möchtest. Über die Zeile .Attachment kannst Du Anhänge an die E-Mail hängen. Das können Bilder oder auch andere Dokumente sein. Dazu musst Du nur den entsprechenden Pfad zu dem Dokument angeben. Mit der Zeile .Send weißt an, dass die E-Mail sofort und direkt über Outlook versendet.
Egal, wie die E-Mails versendet werden, ob automatisch oder manuell nach der Erstellung, alle E-Mails werden in dem Gesendet-Ordner abgelegt auch bei geschlossenem Outlook.
27 Gedanken zu „Eine E-Mail versenden von Excel mit Outlook“
Hallo Das funktioniert super.
Geht das auch beim Speichern der Datei?
Grüße Thomas
Bei mir geht’s nicht richtig, kommt noch ‚Kompilierungsfehler‘
Ja, dazu musst du das Makro im Workbook.Close-Event speichern.
Kann ich auch wählen, über welches meiner Konten in Outlook ich die E-Mail verschicke?
Meines Wissens geht das nicht. Das verschicken geht nur über das Standard-Konto, welches in Outlook konfiguriert ist.
Ja, das geht mit .SentOnBehalfOfName = „mustermann@musterhaus.com“
Hallo,
das geht mit
.SentOnBehalfOfName = „mail.adresse@bla.de“
du musst aber die Berechtigung besitzen, über den angegebenen Account zu versenden.
Gruss
Der Befehl .SentOnBehalfOfName = „elektropost@tralala.de“ funktioniert nicht immer, obwohl die hier genannte Adresse dann auch tatsächlich als Absenderadresse in der erzeugten E-Mail angezeigt wird.
Manchmal ist es statt dessen erforderlich, in den Outlook-Konteneinstellungen im Reiter Datendateien, die Standard-.pst-Datei auf die entsprechende .pst-Datei der gewünschten Adresse zu ändern. Das war bei mir zumindest so. In diesem Fall kann man sich dann auch den .SentOnBehalfOfName – Befehl sparen.
Wie erweitere ich das, so dass die Datei nach dem Versenden speichert und schließt?
Du schreibst folgenden Code noch in die Sub:
ThisWorkbook.Close savechanges:=True
Warum bekommt das Programm bei .Send einen Fehler 287 ? Bei .Display ist alles korrekt angezeigt und kann per Button-Klick versendet werden.
Hallo Fritz,
zwar etwas spät, aber ich habe den gleichen Fehler an der gleichen Stelle. Weißt du zwischenzeitlich, woran das liegt? Vielen Dank, falls du das noch liest und antwortest.
Viele Grüße
Norbert
wie kann ich im Body einen Bereich eines Tabellenblattes einfügen?
hab schon alles möglich versucht, aber bekomme esnicht hin
kann man auch anhänge anfügen?
Ja, das geht ganz einfach. Füge diese Zeile noch vor dem .send ein:
.Attachements Add „Datei mit Pfadangabe“
Danke für diesen Code.
Noch eine Ergänzung: Wenn ich in meinem Excel Modul mit „Option Explicit“ arbeite, habe ich zunächst einen Fehler „Variable nicht definiert“ bzgl. „olMailItem“ erhalten. Den konnte ich nur mit einem Verweis auf die Microsoft Outlook Objectlibrary wegbekommen (Entwicklungsumgebung –> Haken unter Extras–> Verweise)
Vielen Dank, das war genau mein Problem und du hast mir sehr geholfen.
Erst schon einmal Vielen Dank!
Aber kann ich in das Textfeld auch einzelne Excel Felder einfügen? Und das die E-Mail immer an die Person geht die in einem Excel Feld steht?
Also ich habe z.B. in einer Zeile einen Namen und eine E-Mail Adresse und möchte dann, dass er in dem Text, den ich geschrieben habe, dann den Namen einfügt und das an die E-Mail Adresse in der Zeile schickt. Und das so weiter an alle in der Excel Tabelle. Geht das?
Vielen Dank schon einmal und beste Grüße!
With OutlookMailItem
.To = Range(„A1“)
.CC = „“
.Subject = „Bestellung “ & Range(„A2“).Value
.Body = „Guten Tag“ & Chr(13) & _
„“ & Chr(13) & _
„Mit freundlichen Grüssen“ & Chr(13)
Gibt es eine Möglichkeit, daß die Adressen nicht so schnell angeschrieben werden? Bei GMX gibt es ein Problem, wenn zuviele Emails auf einmal aus Excel ausgehen. z.B. 3pro Sekunde, weil der Rechner schnell ist. Kann ich einstellen, nicht mehr als eine Email die Sekunde?
Declare Sub Sleep Lib „kernel32“ (ByVal dwMilliseconds As Long)
Und dann in deiner Schleife nur die eine Zeile
sleep (3000)
Application.Wait (Now + TimeValue(„0:00:01“))
Hier hättest du eine Verzögerung von 1 Sekunden zwischen dem erstellen der Mails,
Diese Verzögerung bezieht sich aber nur auf Excel und nicht auf Outlook direkt. Wenn du den Delay aber höher stellst auf 5 oder 10 Sekunden kommt Outlook hinterher.
( hatte aber noch nie Probleme mit Outlook )
Bei mir funktioniert das hinzufügen des Anhangs nicht.
Ich habe .Attachments.Add (….) eingefügt, aber es schickt die E-Mail immer ohne Anhang raus.
Woran kann das liegen?
Wie muss ich das dann einbauen?
Hallo,
ich würde gern über ein Dropdownmenü (Feld A11) z.B. aus 3 Mailadressen auf dem aktuellen Sheet auswählen, an dem die Datei dann verschickt wird. Also anstatt:
With Nachricht
.To = „deine.mailadresse@mail.de
With Nachricht
.To = Range(„A11“)
oder so… Funktioniert aber nicht. Was mache ich da falsch?
Hallo Matthias,
indem du .To=Range(„A11“) nutzt weiß Excel zwar welche Zelle du anspricht, aber nicht was es mit ihr anfangen soll.
Also entweder .To=Range(„A11“).Value
oder .To=Range(„A11“).Value2
Value ist quasi der Inhalt / Wert der Zelle und Value 2 nur der Textinhalt.
Ich benutze aber immer Value.
LG
Hallo,
kann ich in die Mail einen Hyperlink integrieren, der genau die Excel-Datei verlinkt, aus der ich die Mail heraus generiere? Habe das schon fast mit „file:“ & ThisWorkbook.FullName“ geschafft. Sobald der Pfad aber ein Leerzeichen enthält, wird der Link in der Mail unterbrochen und funktioniert demnach nicht mehr.
LG