Per VBA-Makro eine Email mit Outlook versenden

Per VBA-Makro eine Email mit Outlook versenden

Sie möchten einen Bericht aus einer Exceltabelle erstellen und anschließend per Email versenden? Auch der Versand einer kompletten Exceldatei oder eines bestimmten Tabellenblatts ist relativ einfach mit VBA realisierbar. Mit dem nachfolgenden Musterbeispiel zeige ich Ihnen wie Sie mit Hilfe eines VBA-Codes eine Email versenden können. Voraussetzung für die Nutzung ist, Sie haben neben Microsoft Excel auch das Programm Microsoft Outlook installiert und darin ein Emailkonto eingerichtet.

Teil 1: Per VBA-Makro eine Email mit Outlook versenden
Teil 2: Mit VBA Email versenden ohne Outlook

Weitere Voraussetzung, im VB-Editor muss in der Exceldatei eine der beiden Objektbibliotheken aktiviert sein:

  • Microsoft Outlook 15.0 Object Library
  • Microsoft 15.0 Object Library

Die Nummer 15.0 steht hierbei für die genutzte Office-Version (15.0 entspricht z.B. Office 2013).

Nun zum eigentlichen VBA-Code. Hier gibt es einige Möglichkeiten den Versand individuell zu gestalten. In den beiden folgenden Makros wird die Email erstellt und zunächst angezeigt (1. VBA-Code), bzw. automatisch versendet (2. VBA-Code):

Sub EmailManuellAbsenden()

Dim objOutlook As Object
Dim objMail As Object

Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)

With objMail
   .To = "deinname@deinedomain.de"
   .Subject = "Betreff"
   .Body = "Ihre Nachricht."
   .Display        'Erstellt die Email und öffnet diese. Der Versand erfolgt anschließend manuell vom User!
End With 

End Sub

Das zweite Makro unterscheidet sich nur aufgrund des Befehls „Send“, statt „Display“.

Sub EmailDirektSenden()

Dim objOutlook As Object
Dim objMail As Object

Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)

With objMail
   .To = "deinname@deinedomain.de"
   .Subject = "Betreff"
   .Body = "Ihre Nachricht."
   .Send        'Sendet die Email automatisch
End With

End Sub

Natürlich stehen auch alle weitere Optionen für den Versand von Emails in VBA-Lösungen zur Verfügung. So können Sie die Email auch in Kopie oder Blind-Kopie an weitere Adressaten versenden, oder der Email Dateianhänge beifügen.

In den obigen Beispielen können Sie die zusätzlichen Optionen bei Bedarf über den jeweils zusätzlichen VBA Code hinzufügen:

.CC = "deinname@deinedomain.de"

Sendet die Email in Kopie an die angegebene Emailadresse.

.BCC = "deinname@deinedomain.de"

Sendet die Email in Blind-Kopie an die angegebene Emaildadresse.

.Attachments.Add "C:/Beispiel.xlsx"

Hängt an die Email die angegebene Datei an.

Der Versand an mehrere Adressaten innerhalb von To, CC oder BCC erfolgt durch ein Semikolon als Trennzeichen.

.To = "deinname@deinedomain.de; zweiteEmailadresse@domain.de"

Mehrere Anhänge fügen Sie am einfachsten über mehrere Zeilen ein.

.Attachments.Add "C:/Beispiel_1.xlsx"
.Attachments.Add "C:/Beispiel_2.xlsx"

Teil 1: Per VBA-Makro eine Email mit Outlook versenden
Teil 2: Mit VBA Email versenden ohne Outlook

 
Gefällt Ihnen der Beitrag?

20 Gedanken zu “Per VBA-Makro eine Email mit Outlook versenden

  1. der Ansatz gefällt mir sehr gut. Können Sie sich ein kleines Programm, welches ein oder mehrere PDF’s, welche mit der Email-Adresse des Empfängers als Dateinamen in einem Folder liegen (z.b: p.noindl@npinform.pdf,…) automatisiert an die Empfänger sendet, vorstellen? Ideal wäre eine kleine Exe-Datei, in der man dann auch noch einen Betreff und einen Begleittext eintragen könnte (vor Versand). Ich würde dafür auch bezahlen.

  2. Hallo,
    gibt es auch eine Möglichkeit bei der ich auch einfach nur pdf datein aus einem Excel scheet verschicken kann ?

    Liebe Grüße

    lensko

  3. Super, läuft alles gut.
    Aber, ich erhalte keine Kopie der Mail unter Gesendete. Gibt’s hier noch einen Trick?
    Herzlichen Dank für die Antwort!

    • @Adler: Eine Kopie der Email sollte eigentlich in Outlook gespeichert werden. Werden mehrere Emailadressen in Outlook verwaltet, wird es im Ordner der Standard-Emailadresse gespeichert. Sollte das nicht funktionieren, liegt es vermutlich an der Konfiguration von Outlook. Alternativ kann eine Textdatei der gesendeten Email erzeugt und gespeichert werden. Dafür wäre folgende Anpassung erforderlich:

      .SaveAs „C:\MeineMail.txt“, 0
      .Send

      • Superherzlichen Dank für die Rückmeldung

        klappt so wunderbar. (mit .save as). Ist etwas unbequemer als mit der auto. Funktion speichern unter gesendet, aber die geht bei mir nicht.

        Herzlichen Dank

        Adler

  4. im Nachricht As Object, OutApp As Object
    Set OutApp = CreateObject(„Outlook.Application“)
    Dim AWS As String
    ‚Aktive Arbeitsmappe wird als Mail gesendet
    ‚AWS = ThisWorkbook.FullName
    InitializeOutlook = True
    Set Nachricht = OutApp.CreateItem(0)
    With Nachricht
    .To = „Heinz.Mustermann@Musterdorf.com“
    .Subject = „Phase ot Process“ & Date
    ‚.attachments.Add AWS
    .Body = „Sehr geehrter Bearbeiter,“ & vbCrLf & „“ & vbCrLf & „anbei erhalten Sie eine weitere Artikelnummer zur direkten Weiterbearbeitung im Rahmen unsers Auslaufprozesses.“ & vbCrLf & „“ & vbCrLf & „Bitte um entsprechende Bearbeitung!“ & vbCrLf & „“ & vbCrLf & „Im Voraus besten Dank für Ihre Mühe.“
    .cc = „erna.mustermann@musterdorf.com“
    .Attachments.Add ThisWorkbook.FullName
    .Send
    ‚Hier wird die Mail gleich in den Postausgang gelegt
    ‚Mail.send
    End With
    Set OutApp = Nothing
    Set Nachricht = Nothing

  5. Ich würde beim email-Versand mit der vorgeschlagenen Methode gerne noch eine Erfolgskontrolle einbauen, als Rückmeldung, dass die email von Outlook auch tatsächlich versendet wurde. Das geht zwar auch händisch über die „Gesendete Objekte“ in Outlook, aber ich würde es vorziehen, wenn Excel (oder Word) einfach per MsgBox eine Bestätigung ausgeben würde. Wie ließe sich das realisieren? Danke für Tipps!

  6. Bei mir klappt das Attachment nicht. Es erscheint immer Laufzeitfehler, was mache ich falsch, beim Debuggen, habe ich alles überprüft der Pfad ist richtig und der Dateinname/-pfad auch.

  7. Wie kann ein Zwischenschritt eingebaut werden, welche mir erlaubt, eine Email Adresse vor der Erstellung der Mail einzutippen. Sollte wie eine Dialogbox aufklappen (für to, CC, Betreff auch möglich)

  8. Hallo, ich würde gerne die Datei, in der ich das Makro habe, als Anhang per Mail versenden.
    D.h. die Datei ist noch nicht mal unbedingt unter einem Pfad gespeichert (z.B. „C:/Beispiel_1.xlsx“ ) bzw. nicht für jeden User unter einem einheitlichen Pfad.
    Geht das?
    Quasi ein „send me“ 🙂

    Vielen Dank schon jetzt für Antworten.
    LG
    Nina

  9. Hallo,

    ich würde gerne einen Teil der Tabelle aus dem Excel Dokument in die Mail einfügen, wie könnte das denn funktionieren?

  10. Hallo,
    vielen Dank, das Makro hat mir sehr geholfen.
    Gibt es die Möglichkeit, wenn man mehrere Email-Adressen in Outlook eingerichtet hat, zu wählen, von welcher versendet wird? Intuitiv hätte ich zu „.from“ gegriffen, aber das nimmt er nicht…
    Vielen Dank vorab.
    Viele Grüße
    Michael

    • Hi Michael,
      dazu musst du in dem Block in dem du „.To“ und „.Subject“ und co eingibst folgendes tippen:

      .SentOnBehalfOfName = „mustermann@musterhaus.com“

      Grüße

  11. Hallo,

    die obrige Lösung funktionieren sehr gut, ich möchte aber noch ein zweiten boutten machen wo auch eine andere Datei angehangen wird und ein anderer Verteiler mit in begriffen ist. Ich habe jetzt schon mehreres Versucht komme aber nicht auf die Lösung, könnte es mir einer Verraten 🙂 ?

    Danke.

  12. 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 mochtest. Uber die Zeile .Attachment kannst Du Anhange an die E-Mail hangen. Das konnen 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 uber Outlook versendet.

  13. Guten Morgen,
    ich habe obigen Code umgesetzt und bekomme auch die Email erzeugt, aber nicht automatisch versendet.
    Ich setze die VBA-Befehle in QlikView ein und das klappt in der Regel auch ganz gut, nicht aber hier mit dem automatischen Versand:

    sub MailSend (tohim, cchim, betr, txt, file1, a2, file2, a3, file3, file4, file5)

    Set MyOutApp = CreateObject(„Outlook.Application“)
    Set MyMessage = MyOutApp.CreateItem(0)

    With MyMessage
    .To = tohim
    .CC = cchim
    .Subject = betr
    .body = txt
    .Attachments.add file1
    ‚.Display ‚ausgeblendet
    .Send

    End With

    Set MyOutApp = Nothing
    Set MyMessage = Nothing

    end sub

    Irgendjemand eine Idee was ich falsch mache?

    danke J.

  14. VBA-Makro für Versand von E-Mails über unterschiedliche Outlook-Versionen

    Eine Excel-Datei soll zur Bearbeitung über ein VBA-Marko per E-Mail von Person A zu B, von B zu C und von C wieder an A gesendet werden, die mit unterschiedlichen Office-Versionen arbeiten. Kann A (also ich) im Makro schon vorab unterschiedliche Objektbibliotheken aktivieren, um verschiedene Outlook-Versionen zu integrieren oder müssten das B und C selbst vornehmen, weil nur sie den unter „Extras/Verweise“ die für sie passende Bibliotheksversion aktivieren können? Ich finde dort nur die 16.0 für meine Office-Version.
    Bin für jeden Tipp dankbar.
    Gerd

    PS.Ich glaube immer noch, dass VBA im Drogenrausch konzipiert wurde. Gut, dass man im Netz klare Hilfestellungen wie hier finden. Herzlichen Dank dafür und an alle anderen, die ihr Wissen im Netz zur Verfügung stellen.

    • @Gerd: Das funktioniert leider nicht. Es kann immer nur eine Bibliothek mit identischen Funktionen eingebunden werden. Die Bibliotheken einzelner Office Versionen unterscheiden sich meistens nur in wenigen Funktionen. Bei der Nutzung in einer anderen Office Version ist deshalb immer die Bibliothek auszutauschen. Das gilt bei einigen Funktionen auch beim Wechsel innerhalb einer Version, wenn auf den Rechnern abweichend die 32bit / 64bit Version nutzen.

      Ich würde das Problem deshalb anders lösen. Das Makro könnte einfach ein Tabellenblatt mit den Informationen speichern, dass dann durch das Makro beim User B in das Tool eingelesen wird. Es wird dann nicht die Datei mit den Makros, sondern nur das Tabellenblatt mit den Informationen ausgetauscht. Wenn man das Ganze noch professioneller aufstellen wollte, würde man kein Tabellenblatt erzeugen, sondern z.B. eine XML erstellen und die ggf. direkt auf dem Webserver ablegen. Aber das kommt natürlich darauf an, ob es sich um einheitlich aufgebaute Informationen handelt.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.