Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1708to1712
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Serienmail und Anhang

Serienmail und Anhang
05.09.2019 10:58:11
steffi
Hallo,
ich habe ein Makro gefunden ( https://wordmvp.com/FAQs/MailMerge/MergeWithAttachments.htm ), dass es erlauben soll mehrere Anhänge über Outlook per VBA/Excel zu versenden.
Das wäre für mich eine riesige Zeitersparnis.
Jedoch funktioniert der Code bei mir nicht..meckert gleich zu Beginn herum
"Fehler beim Kompilieren. Benutzerdefinierter Typ nicht definiert"
Ich habe das nun so verstanden, dass ich eine Excel-Datei so anlegen muss wie es dort in der Beschreibung abgebildet ist.
Zudem habe ich in VBA unter Extras - Verweise - Microsoft Outlook Object Libary/SharPoint/Social Provider aktiviert.
Ich würde mich über Hilfe freuen. Ich kenne mich leider nicht so gut mit den Makros in VBA aus.
Sub emailmergewithattachments()
Dim Source As Document, Maillist As Document, TempDoc As Document
Dim Datarange As Range
Dim i As Long, j As Long
Dim bStarted As Boolean
Dim oOutlookApp As Outlook.Application
Dim oItem As Outlook.MailItem
Dim mysubject As String, message As String, title As String
Set Source = ActiveDocument
' Check if Outlook is running.  If it is not, start Outlook
On Error Resume Next
Set oOutlookApp = GetObject(, "Outlook.Application")
If Err  0 Then
Set oOutlookApp = CreateObject("Outlook.Application")
bStarted = True
End If
' Open the catalog mailmerge document
With Dialogs(wdDialogFileOpen)
.Show
End With
Set Maillist = ActiveDocument
' Show an input box asking the user for the subject to be inserted into the email messages
message = "Enter the subject to be used for each email message."    ' Set prompt.
title = " Email Subject Input"    ' Set title.
' Display message, title
mysubject = InputBox(message, title)
' Iterate through the Sections of the Source document and the rows of the catalog mailmerge  _
document,
' extracting the information to be included in each email.
For j = 1 To Source.Sections.Count - 1
Set oItem = oOutlookApp.CreateItem(olMailItem)
With oItem
.Subject = mysubject
.Body = Source.Sections(j).Range.Text
Set Datarange = Maillist.Tables(1).Cell(j, 1).Range
Datarange.End = Datarange.End - 1
.To = Datarange
For i = 2 To Maillist.Tables(1).Columns.Count
Set Datarange = Maillist.Tables(1).Cell(j, i).Range
Datarange.End = Datarange.End - 1
.Attachments.Add Trim(Datarange.Text), olByValue, 1
Next i
.Send
End With
Set oItem = Nothing
Next j
Maillist.Close wdDoNotSaveChanges
'  Close Outlook if it was started by this macro.
If bStarted Then
oOutlookApp.Quit
End If
MsgBox Source.Sections.Count - 1 & " messages have been sent."
'Clean up
Set oOutlookApp = Nothing
End Sub

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Serienmail und Anhang
05.09.2019 11:00:51
Torsten
Hallo,
du musst die Microsoft Outlook 16.0 Object Library aktivieren.
Gruss Torsten
AW: Serienmail und Anhang
09.09.2019 12:17:11
Steffi
Also ich habe nochmal recherchiert und einen anderen Code gefunden. https://thehosblog.com/2014/06/02/excel-serienmail-mit-anhangen/
Der Code ist am Ende.
Wenn ich "Option Explicit" lösche, dann kommt die Meldung "5 ungültiger Prozeduraufruf" und wenn ich es stehen lasse, dann immer, dass "olMailItem" oder "olFormatPlain" nicht definiert sind.
Was mache ich also noch falsch?
Option Explicit
Sub Excel_Serial_Mail()
Dim objOLOutlook As Object 'Variable Outlook definiert
Dim objOLMail As Object 'Variable Mail definiert
Dim lngMailNr As Long 'Wieviele Mails
Dim lngZaehler As Long 'Variable, um zu gucken in welcher Mail man gerade ist
Dim strAttachmentPfad1 As String, strAttachmentPfad2 As String 'Pfad zu zwei Anhängen
Dim strSignatur As String
On Error GoTo ErrorHandler 'Fehlerbeschreibung soll raus gehen (s. unten)
Set objOLOutlook = CreateObject("Outlook.Application")
lngMailNr = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 'Gibt an bis zu welcher Zeile meiner  _
Liste die Mails gehen
strAttachmentPfad1 = "PFAD"
strAttachmentPfad2 = "PFAD"
'Hier Pfade und Dateien anpassen
For lngZaehler = 2 To lngMailNr        'Zähle von Zeile 2 bis Zeile.. durch
If Cells(lngZaehler, 17)  "" Then     'Wenn in Spalte 17 (Q) (Mailadressen) etwas steht, dann  _
erstellt VBA Mails
Set objOLMail = objOLOutlook.CreateItem(olMailItem)
With objOLMail
.To = Cells(lngZaehler, 17)     'Schreibt die Person an, die in Spalte 17 steht "AN"
.CC = ""
.BCC = ""
.GetInspector.Activate
strSignatur = .Body
.Sensitivity = 3                'Vertraulichkeitsstufe 0=normal; 1=persönlich; 2 = privat; 3= _
vertraulich
.Importance = 2                 'Wichtigkeit 2= Wichtigkeit hoch
.Subject = "Serienmail Test" 'Betreff der Mail
.BodyFormat = olFormatPlain     'Format der Mail (Rich-Text - nicht nehmen, HTML, plain=nur  _
Text)
.Body = "Hallo " & Cells(lngZaehler, 11) & Cells(lngZaehler, 12) & "," & vbCrLf & _
Cells(lngZaehler, 1).Value & " ist Ihre BNR." & vbCrLf & strSignatur   'Inhalt des Mail-Körpers, _
Spalte 11=Frau/herr; Spalte 12=Name Lineal Feet (nächste Zeile); Spalte 2 = Wert von z. B. 10,..,50 usw; Text
'Hier anpassen, damit Anhänge hinzugefügt werden, Rückgriff zu den oben angegebenen Pfaden
.Attachments.Add strAttachmentPfad1
.Attachments.Add strAttachmentPfad2
.DeleteAfterSubmit = False 'Mails nach versenden löschen-hier nein (FALSE); TRUE -> Versendete  _
Mails tauchen nicht unter GESENDETE auf
.Send
'.Display 'Wenn ich Mail nochmal vor dem Senden sehen will
End With
Set objOLMail = Nothing 'Wenn eine Mail fertig, dann Mailobjekt leeren, weil weitere folgen
End If
Next lngZaehler
Set objOLOutlook = Nothing 'Outlook zurück setzen
Exit Sub
ErrorHandler:
MsgBox Err.Number & " " & Err.Description & " " & Err.Source, _
vbInformation, "Ein Fehler ist aufgetreten"
Exit Sub
End Sub

Anzeige
AW: Serienmail und Anhang
09.09.2019 12:38:46
Rudi
Hallo,
ersetze olMailItem durch 0 und olFormatPlain durch 1
Gruß
Rudi
AW: Serienmail und Anhang
09.09.2019 13:34:25
Steffi
wow sooo einfach kann eine Lösung sein.
Es klappt!!Vielen herzlichen Dank
Gibt es dazu eine Lösung, wie nicht jede E-Mail aufploppt sondern das Versenden im Hintergrund läuft?
AW: Serienmail und Anhang
09.09.2019 14:06:41
Steffi
und zweite Frage, wie könnte ich einbauen, dass die Anrede korrekt ist?
So wie hier(dort wird es aber anstatt excel, aus den Kontakten gezogen)
Ich verstehe noch nicht wie ich das in mein Makro einbinden kann.
Ich würde hier den Bezug zu Spalte 12 aus Excel haben.
Private Sub InsertHello(ByRef objMail As Outlook.MailItem, _
ByVal objContact As Outlook.ContactItem)
'=====================================================================
' Ermittelt die Begrüßung und setzt sie in die E-Mail ein
' 2008-11-21 Version 1.0.0
'=====================================================================
Dim lngBodyEnd As Long ' Ende des Body-Tags
With objMail
'-----------------------------------------------------------------
' Bei HTML-Mails ende der Bodyzeile ermitteln
'-----------------------------------------------------------------
lngBodyEnd = InStr(LCase(.HTMLBody), " If lngBodyEnd Then lngBodyEnd = InStr(lngBodyEnd + 1, .HTMLBody, ">")
'-----------------------------------------------------------------
' Hat der Kontakt einen Nachnamen, so wird dieser verwendet
'-----------------------------------------------------------------
If Trim(objContact.LastName) "" Then
'-------------------------------------------------------------
' Existiert eine deutsche, männliche Anrede?
'-------------------------------------------------------------
If objContact.Title = "Herr" Then
If .BodyFormat = olFormatHTML Then
.HTMLBody = Left(.HTMLBody, lngBodyEnd) & _
"Sehr geehrter Herr " & objContact.LastName & _
",

" & Mid(.HTMLBody, lngBodyEnd + 1)
Else
.Body = "Sehr geehrter Herr " & objContact.LastName _
& "," & vbCrLf & vbCrLf & .Body
End If
'-------------------------------------------------------------
' Existiert eine deutsche, weibliche Anrede?
'-------------------------------------------------------------
ElseIf objContact.Title = "Frau" Then
If .BodyFormat = olFormatHTML Then
.HTMLBody = Left(.HTMLBody, lngBodyEnd) & _
"Sehr geehrte Frau " & objContact.LastName & _
",

" & Mid(.HTMLBody, lngBodyEnd + 1)
Else
.Body = "Sehr geehrte Frau " & objContact.LastName _
& "," & vbCrLf & vbCrLf & .Body
End If
Anzeige
AW: Serienmail und Anhang
05.09.2019 11:04:25
Torsten
Sorry, hab das falsch verstanden. Hast du ja. Dann sollte es auch funktionieren. Hast du nach dem aktivieren die Datei mal gespeichert und neu gestartet?
AW: Serienmail und Anhang
05.09.2019 11:09:50
steffi
also ich habe 14.0 und bei VBA gespeichert und Excel und immer wenn ich es neu öffne, ist es weg.
AW: Serienmail und Anhang
05.09.2019 11:16:05
Torsten
hier mal ein einfacherer Code, der auch funktioniert. Aber die Library muss trotzdem eingebunden sein. Mit diesem Code bekommst du ein Dateiauswahlfenster und kannst dort alle Dateien auswaehlen, die du verschicken willst.

Sub Email_mit_Anhaengen()
Dim xStrFile As String
Dim xFilePath As String
Dim xFileDlg As FileDialog
Dim xFileDlgItem As Variant
Dim xOutApp As Outlook.Application
Dim xMailOut As Outlook.MailItem
Application.ScreenUpdating = False
Set xOutApp = CreateObject("Outlook.Application")
Set xMailOut = xOutApp.CreateItem(olMailItem)
Set xFileDlg = Application.FileDialog(msoFileDialogFilePicker)
If xFileDlg.Show = -1 Then
With xMailOut
.BodyFormat = olFormatRichText
.To = "happy.xuebi@163.com"
.Subject = "test"
.HTMLBody = "test"
For Each xFileDlgItem In xFileDlg.SelectedItems
.Attachments.Add xFileDlgItem
Next xFileDlgItem
.Display
End With
End If
Set xMailOut = Nothing
Set xOutApp = Nothing
Application.ScreenUpdating = True
End Sub
Gruss Torsten
Anzeige
AW: Serienmail und Anhang
05.09.2019 11:23:20
steffi
okay, das ist schon ganz gut, nur brauche ich etwas, wo ich verschiedene Dateien versenden muss
zB:
EMail 1 - Datei A & Datei B
EMail 2 - Datei C & Datei B
EMail 3 - Datei D & Datei E
Dabei wäre es auch gut, wenn diese in BCC stehen würden.
Ich muss Serienbriefe versenden und entsprechend jeweils diese als Datei in einer E-Mail anhängen und zsl. Dokument(e).
AW: Serienmail und Anhang
05.09.2019 11:45:54
steffi
ich hab es gerade ausprobiert. Bei dem Code sagt VBA immer "Syntaxfehler" zur Message-Box
Msg = MsgBox("Die Datei: " & Cells(y, 6) & " in F" & y & " exitstiert nicht !"_
& vbCrLf & "Der Sendevorgang an; " & Cells(i, 1) & " wird abgebrochen!",_
vbCritical + vbOKOnly, "Dateifehler")
AW: Serienmail und Anhang
05.09.2019 11:53:35
steffi
also ich habe die Leerzeichen gelöscht und es geht. :)
aber, nun sagt VBA unvollständige Angaben beim Empfänger in Zeile 1
Excel sieht bei mir nun so aus:
Name / Betreff / Text / E-Mail / Spalte E / Pfad der Anhänge
' Ein ähnliches Beispiel wie oben mit dem Unterschied, dass die Empfänger in den Zellen stehen und
'die jeweiligen Attachments ( in diesem Fall 10 ) stehen inclusive Pfad in den Zellen F2:F10
'die jeweiligen Attachments mit den Pfadangaben in den Nachbarzellen.
'In diesem Beispiel wird das FileSystemObject zu Hilfe genommen um die Ordner bzw. die Dateien auf Existenz zu testen.
'Das ganze könnte auch etwas einfacher gelöst werden, aber so kann das FS-Object wunderbar gezeigt werden
Sub Excel_Serienmail_mit_mehreren_Anlagen_via_Outlook_Senden()
'Variablendefinition
Dim fs As Object, F As Object
Dim OutApp As Object, Mail As Object
Dim i As Integer, y As Integer, Msg As Integer
Dim Nachricht As Variant
Dim AWS As String
Dim AnzEmpfänger As Integer
'Variablen füllen
'Filesystemobjekt erstellen
Set fs = CreateObject("Scripting.FileSystemObject")
'Hier die Anzahl Empfänger definieren
'Kann auch ein Range auf der Tabelle sein
AnzEmpfänger = 10
'1. Fehlerprüfung
'Prüfen ob alle Inhalte vorhanden sind
'Wenn nicht wird das Makro abgebrochen
'In Spalte A steht der Name
'In Spalte B steht der Betreff
'In Spalte C steht der Text
For i = 1 To AnzEmpfänger
If Cells(i, 1) = "" Or Cells(i, 2) = "" Or Cells(i, 3) = "" Then
Msg = MsgBox("Unvollständige Angaben beim Empfänger in Zeile " & i, vbCritical +  _
vbOKOnly, "Abbruch")
Exit Sub
End If
Next i
'2. Fehlerprüfung
'Mit dem FilesystemObjekt wird zuerst die Existenz
'der Dateien geprüft. Wenn eine nicht existiert
'wird das Makro abgebrochen
'Die Links auf deine Anlagen liegen im
'Bereich F2 : F10
For y = 2 To 10
'Wenn eine Zelle leer ist, wird aus der Schleife ausgestiegen
'ohne weitere Fehlerprüfung
If Cells(y, 6) = "" Then Exit For
If fs.fileexists(Cells(y, 6)) = False Then
Msg = MsgBox("Die Datei: " & Cells(y, 6) & " in F" & y & " exitstiert nicht !" &  _
vbCrLf & "Der Sendevorgang an; " & Cells(i, 1) & " wird abgebrochen!", vbCritical + vbOKOnly, "Dateifehler")
Exit Sub
End If
Next y
'Sendevorgang einleiten
For i = 1 To AnzEmpfänger
Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.To = Cells(i, 1) 'irgendwer@irgendein-provider.de
.Subject = Cells(i, 2) 'Betreffzeile
.Body = Cells(i, 3) 'Sendetext"
For y = 2 To 10
AWS = Cells(y, 6)
'Wenn die Zelle / Variable leer ist
'wird diese Schleife für die Attachments abgebrochen
If AWS = "" Then Exit For
.Attachments.Add AWS
Next y
'Hier wird die Mail zuerst angezeigt
.Display
'Hier wird die Mail gleich in den Postausgang gelegt
'.Send
End With
'Variablen zurücksetzen
Set OutApp = Nothing
Set Nachricht = Nothing
'Warten auf Outlook :-))
Application.Wait (Now + TimeValue("0:00:05"))
Next i
End Sub

Anzeige
AW: Serienmail und Anhang
05.09.2019 11:59:58
steffi
ah sry,es geht. Es lag daran, dass in der ersten Zeile meine Überschriften waren.
Jetzt habe ich gesehen, dass für diese 10 Adressen alle in der Excel Datei hinterlegten Pfade pro Mail verschickt werden. Also wie aus meinem Beispiel sollte es so sein:
EMail 1 - Datei A & Datei B
EMail 2 - Datei C & Datei B
EMail 3 - Datei D & Datei E
ABER
EMail 1 bekommt Datei A, B, D & E
EMail 2 genauso usw..
Kann man da angeben, dass Zeile 1 nur die Datei aus Spalte F bekommt (und zsl. eine weitere Spalte berücksichtigen mit einer weiteren Datei)?

154 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige