Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1844to1848
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

E Mail mit und ohne Anlage versenden

E Mail mit und ohne Anlage versenden
01.09.2021 19:26:40
Sebastian
Hallo zusammen,
ich bastel gerade an einer Datei, in der eine E-Mail automatisch generiert wird, wenn in einer bestimmten Zelle ein Eintrag erfolgt. Den Bezug zum Empfänger, den E Mailbetreff und sogar den E Mailtext habe ich schon so hinbekommen das Excel sich dies aus exakt definierten Zellen zieht und sich die E Mail sozusagen zusammen bastelt. :-)
Wenn es aber um das Thema Anlagen geht, beiße ich mir gerade die Zähne raus.
Ich habe eine abgespeckte Datei erstellt, in der es nur um das Thema Anlage versenden geht.
Wenn in D2 ein Eintrag oder eine Änderung erfolgt soll keine Anlage verschickt werden.
Erfolgt hingegen ein Eintrag oder eine Änderung in D3 soll eine Anlage verschickt werden.
Wie bekomme ich es hin, dass von D2 aus keine Anlage verschickt wird?
wenn ich AttachmentText = "C:\Users\S7ebe\Desktop\EMailversenden\Testdatei\Testdatei.docx" wie folgt schreibe AttachmentText = "" läuft der VBA Code nicht durch.
Wenn ich AttachmentText weglasse und es auch im Call streiche, dann läuft der VBA Code ebenfalls nicht durch. Call MailperOutlook(RecipientText, CCText, BCCText, SubjectText, BodyText)
Neben der Datei poste ich auch den Code von Tabelle1:
https://www.herber.de/bbs/user/147879.xlsm
Über den goldenen Tipp wäre ich mega dankbar.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As String
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
'NOCH KONTROLLIEREN ob dies die Variabel ist um die Zelle wiederzugeben in der ein neuer Wert eingetragen wurde'
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
Dim Adddress As String
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
'Noch Kontrollieren ob diese Variabel notwendig ist um die genauen Spalten- und/oder Zelladressen einzugeben'
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
Dim Nachname As String
'Variabel für den E Mailtext'
'Dies kann für den E Mailtext gezogen werden und wird wie folgt eingebaut: & Nachname & '
Dim Vorname As String
'Beispiel als variabel für EMailtext'
Dim Anrede As String
'Beispiel als variabel für EMailtext'
Dim Eintritt As String
'Beispiel als variabel für EMailtext'
Dim Kostenstelle As String
'Beispiel als variabel für EMailtext'
Dim Wert As String
'Variabel um den Text, welcher in die Zelle geschrieben wird, in dem E Mailtext wiederzugeben'
Dim RecipientText As String
'dies ist die Variabel für die E Mailadresse für den Empfänger'
Dim CCText As String
'dies ist die Variabel für den CC Mailempfänger ab Beispiel D10 bis D14 XY'
'CC-Adressen im Aufrufenden Microsoft Excel Objekte (Tabelle1) müssen 3 Angaben ergänzt werden:'
'Dim CCText as String'
'CCText = "Text@gmx.de"'
'den Call am Ende um den Parameter ccText erweitern'
'in dem aufgerufenen Modul MailPerOutlook in der ersten Zeile in der Klammer ", CCText as String " ergänzen'
'weiter unten steht dann ".CC = CCText" statt ".CC="" "'
Dim BCCText As String
'dies ist die Variabel für den BCC Mailempfänger ab Beispiel D10 bis D14 XY'
'CC-Adressen im Aufrufenden Microsoft Excel Objekte (Tabelle1) müssen 3 Angaben ergänzt werden:'
'Dim BCCText as String'
'BCCText = "Test@gmx.de"'
'den Call am Ende um den Parameter BCCText erweitern'
'in dem aufgerufenen Modul MailPerOutlook in der ersten Zeile in der Klammer ", BCCText as String " ergänzen'
'weiter unten steht dann ".BCC = BCCText" statt ".BCC="" "'
Dim SubjectText As String
Dim BodyText As String
Dim AttachmentText As String
'dies ist die Variabel für den E-Mail Anhang siehe Beispiel D18, D19 und D21'
'D2'
'1 E-Mailadresse ist fest einprogrammiert'
' mit & vbCr & wird noch ein Absatz in den E Mailtext eingefügt'
If Target.Address = "$D$2" Then
'Hier mit Target.Address die Zelle D5 angesprochen'
'der erste VBA Befehl (D2) muss mit If starten - alle weiteren mit ElseIf"'
Wert = Target.Text
Nachname = Cells(Target.Row, 3).Text
'Hier wird die Spalte mit Mitarbeiternamen als Wert für den E Mailtext angesprochen. 3 steht für die Spalte C'
RecipientText = "S7eben@gmx.de"
'Die E Mailadresse ist fest einprogrammiert'
SubjectText = "Änderung an Tabelle XYZ"
BodyText = "In der Tabelle XYZ hat es in Zelle D2 " & Zelle & " eine Änderung gegeben." & vbCr & "Der neue Eintrag ist " & Wert & ". " & vbCr & "Dies ist dem Mitarbeiter " & Nachname & " zuzuordnen."
'mit & vbCr & kann ein Absatz in der E Mail erzeugt werden'
AttachmentText = "C:\Users\S7ebe\Desktop\EMailversenden\Testdatei\Testdatei.docx"
Call MailperOutlook(RecipientText, CCText, BCCText, SubjectText, BodyText, AttachmentText)
'D3'
'2 E-Mailadressen sind fest einprogrammiert'
' mit & vbCr & wird noch ein Absatz in den E Mailtext eingefügt'
ElseIf Target.Address = "$D$3" Then
'Hier mit Target.Address die Zelle D3 angesprochen'
'der erste VBA Befehl (D2) muss mit If starten - alle weiteren mit ElseIf"'
Wert = Target.Text
Nachname = Cells(Target.Row, 3).Text
'Hier wird die Spalte mit Mitarbeiternamen als Wert für den E Mailtext angesprochen. 3 steht für die Spalte C'
RecipientText = "S7eben@gmx.de; sb@avea.de"
'2 E-Mailadressen sind fest einprogrammiert'
SubjectText = "Änderung an Tabelle XYZ"
BodyText = "In der Tabelle XYZ hat es in Zelle F2 " & Zelle & " eine Änderung gegeben." & vbCr & "Der neue Eintrag ist " & Wert & ". " & vbCr & "Dies ist dem Mitarbeiter " & Nachname & " zuzuordnen."
'mit & vbCr & kann ein Absatz in der E Mail erzeugt werden'
AttachmentText = "C:\Users\S7ebe\Desktop\EMailversenden\Testdatei\Testdatei.docx"
Call MailperOutlook(RecipientText, CCText, BCCText, SubjectText, BodyText, AttachmentText)
End If
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Alter Schwede...
02.09.2021 09:59:20
migre
Hallo Sebastian,
...da wollte ich schnell mal Dein Konstrukt aufräumen ;-). Für mein Dafürhalten hast Du Dich mit dem Code ein bisschen verrannt, daher hier mein Vorschlag, auf Basis Deiner Angaben, aber aufgeräumt. Dabei reicht dieser Code im Tabellenblatt (Worksheet_Change), ein Umweg über einen eigenen Makroaufruf ("MailPerOutlook") ist aus meiner Sicht nicht erforderlich:

Const cBetreff$ = "Änderung an Tabelle XYZ"
Const cMailTextMid$ = "Der neue Eintrag ist "
Const cMailTextSuf$ = "Dies ist folgendem Mitarbeiter zuzuordnen: "
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Wert$, Nachname$, Vorname$, Empfaenger$, MailTextPre$, AnlagePfad$
Dim OL As Object
Dim IsCreated As Boolean, Clc, ScrUpd
If Target.Cells.Count = 1 And Not Intersect(Target, Me.Range("D2:D3")) Is Nothing Then
With Application
Clc = .Calculation: .Calculation = xlCalculationManual
ScrUpd = .ScreenUpdating: .ScreenUpdating = False
End With
On Error Resume Next
Set OL = GetObject(, "Outlook.Application")
If Err Then
Set OL = CreateObject("Outlook.Application"): IsCreated = True
End If
On Error GoTo 0
Wert = Target.Value
Nachname = Target.Offset(, -1).Value
Vorname = Target.Offset(, -2).Value
Select Case Target.Address
Case Is = "$D$2"
Empfaenger = "S7eben@gmx.de"
MailTextPre = "In der Tabelle XYZ hat es in Zelle D2 eine Änderung gegeben"
AnlagePfad = vbNullString
Case Is = "$D$3"
Empfaenger = "S7eben@gmx.de; sb@avea.de"
MailTextPre = "In der Tabelle XYZ hat es in Zelle D3 eine Änderung gegeben"
AnlagePfad = "C:\Users\S7ebe\Desktop\EMailversenden\Testdatei\Testdatei.docx"
End Select
With OL.createitem(0)
.Subject = cBetreff
.To = Empfaenger
.BCC = "" '?
.Body = MailTextPre & vbLf & _
cMailTextMid & Wert & vbLf & _
cMailTextSuf & Nachname & " " & Vorname
If AnlagePfad  "" Then
.Attachments.Add AnlagePfad
End If
.Display
'.Send
End With
End If
If IsCreated Then OL.Quit
With Application
.Calculation = Clc: .ScreenUpdating = ScrUpd
End With
Set OL = Nothing
End Sub
Ist in Deiner Bsp-Mappe getestet und funktioniert bei mir anstandslos; gib Bescheid.
LG Michael
Anzeige
AW: Alter Schwede...
03.09.2021 17:20:52
Sebastian
Hallo Michael,
danke für den Code. Er funktioniert mit den 2 Beispielen tadellos. Respekt,.. dieser sieht auch wesentlich kürzer aus. Vielen lieben Dank.
Ich versuche ihn auf meine größere Datei anzuwenden. Bekomme es aber nicht so wirklich hin. Ich kann mal versuchen warum. In der Datei habe ich verschiedene Beispiele aufgeführt wo jeweils in einer Zelle aus der Zeile 2 bis 21 von der Spalte D etwas unterschiedliches passieren soll wenn ein Eintrag oder eine Änderung erfolgt. Mal wird eine E Mailadresse fest einprogrammiert, mal wird die E Mailadresse aus einer Zelle gezogen, mal wird noch eine CC oder BCC Mailadresse gezogen, mal wird der E Mailtext aus unterschiedlichen Zellen zusammengebastelt, mal wird die E Mail nur erzeugt wenn ein Wort wie "Ja" in einer Zelle steht und mal wird eine Anlage mitgeschickt oder auch nicht. Habe schon etwas Zeit investiert um den Code auf die Beispiele anzupassen aber ich habe es einfach nicht geschaft. Ich habe die Gesamtdatei mal zum besseren Verständnis eingefügt. Nicht erschrecken,.. der Code wird Dich bestimmt erschlagen. Gibt es nicht eine Möglichkeit für D2 den Code so anzupassen das dort keine Anlage verschickt wird? Falls dies geht könnte ich dies in den anderen Beispiele D3 bis D17 ja einfügen und anpassen, dass dort auch keine Anlage verschickt wird. Würde ein Luftsprung vor Freude machen, wenn dies umsetzbar wäre.
https://www.herber.de/bbs/user/147897.xlsm
Anzeige
Bin am WE nicht im Forum, melde mich Mo! owT
03.09.2021 21:37:02
migre
AW: Bin am WE nicht im Forum, melde mich Mo! owT
06.09.2021 06:27:05
Sebastian
Guten Morgen Michael,
ich habe es gestern Abend noch geschaft.
folgendes habe ich abgeändert:
If Target.Row >= 2 And Target.Row 'oder die genaue Zelle mit If Target.Address = "$D$2" Then bestimmen'
AttachmentText = ""
Else
AttachmentText = "C:\Users\S7ebe\Desktop\EMailversenden\Testdatei\Testdatei.docx"
End If
'Variabel für Anlage*
Die Datei habe ich auch mal begefügt:
https://www.herber.de/bbs/user/147917.xlsm
Jetzt rätsel ich noch wie ich es mit einer 2ten Anlage schaffe, sprich D21.
Eine Idee habe ich schon in der Datei geschrieben. Werde es die Tage mal nach der Arbeit versuchen.
Lieben Gruß
Sebastian
Anzeige
Du arbeitest im Chaos...
06.09.2021 10:57:19
migre
Sebastian,
...und wunderst Dich, dass Deine Basteleien nur halbgar oder gar nicht funktionieren. Zwei Anmerkungen:
1) Es ist schade, dass Du mit den konkreten Anforderungen und Angaben zu Deiner Produktivdatei erst herausrückst, nachdem ich Dir schon funktionierenden Code geschrieben habe. Das was Du jetzt präsentierst ist wesentlich komplexer als Deine ursprüngliche Anfrage; ich spreche für mich, aber ich gehe davon aus, dass andere HelferInnen hier es genauso sehen: Doppelarbeit, Arbeit nach der Salamitaktik ("Ich hab noch eine letzte Frage", "Das funktioniert schon gut, aber was wenn..." etc) und ein Ändern der Anforderungen NACH einer erhaltenen Lösung macht weder Lust auf weitere Hilfe im konkreten Faden noch holst Du Dir damit Sympathiepunkte für ggf. neue Anfragen im Forum.
2) Du gehst, aus meiner Sicht, zu chaotisch an dieses Projekt heran. Anstatt irgendwie an (vermutlich größtenteils) fremdem Code ohne Wissen herumzubasteln ("Basiskenntnisse in Excel") solltest Du schon allein für Dich überlegen, wo die diversen veränderlichen Inhalte (Mail-Adressen, Mail-Texte, Anrede-Texte, Anlagen-Pfade etc.) abgelegt werden, dass dies auch noch in 1 Jahr nachvollziehbar und ggf. auch einfach adaptierbar (d.h. wartbar) bleibt. Die Grundanforderung "Emails in Abhängigkeit von Zellen versenden" ist in VBA ein Klacks, das ist keine Hexerei. Aber Dein Code- und Kommentargewusel macht daraus viel mehr als notwendig ist und spricht keinesfalls für eine schnelle Anpassbarkeit in Zukunft.
Wenn ich von Deiner neuen Bsp-Datei ausgehe, in der bis Spalte V Zell-Werte vorhanden sind, und man davon ausgeht, dass dies auch Deinem produktiven Blatt-Aufbau entspricht (was ich nicht weiß!), dann stehen Dir immer noch ca. 16362 Spalten im Blatt zur Verfügung, die Du zB dazu nutzen kannst, die zeilenweise veränderlichen Informationen abzulegen (also je Zeile die Email-Empfänger, Anhänge, Anreden, Mail-Texte etc. zu definieren). Dann ist das immer nachvollziehbar (weil klar ist, dass in der bspw. Spalte "An" die jeweiligen Email-Empfänger für die jeweilige Zeile definiert werden) und kann ohne VBA einfach in Excel angepasst (iSv überschrieben) werden. Und für das reguläre Arbeiten im Blatt kannst Du die Spalten ja ausblenden.
Und dann brauchst Du auch keinen Monster-Code sondern greifst in der Email-Routine, über die geänderte Zelle (wie in meinem Code), auf die jeweiligen Informationen aus der zugehörigen Zeile zu. Damit tust Du Dir mE sicherlich leichter.
Wenn Du also so einen Tabellenaufbau als Bsp lieferst, kann ich Dir dazu gerne noch Code schreiben; ansonsten bin ich an der Stelle raus.
Viel Erfolg, liebe Grüße
Michael
Anzeige

110 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige