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

Forumthread: VBA-Mail mit Anhang versenden

VBA-Mail mit Anhang versenden
08.07.2016 18:30:29
Hendrik
Schönen guten Tag zusammen,
zuerst einmal vielen Dank euch Allen. Dank eurer Hilfe konnte ich schon einige nervige Excel-Probleme schnell und leicht lösen.
Leider konnte ich heute zu meiner Frage keinen passenden, schon offenen, Post finden.
Würde mich sehr freuen, wenn ihr mir bei meiner Frage helfen könntet...
Ich möchte, wie der Betreff schon erahnen lässt, über VBA aus Excel heraus eine Mail versenden und zwar mit einem Anhang -soweit so gut.
Hierzu habe ich auch einen Code gefunden und soweit wie es meine Möglichkeiten zulassen, auch etwas angepasst. Leider sind meine Möglichkeiten in Sachen VBA doch sehr begrenzt, weshalb es auch beim Abspielen des Codes einen Anwender- bzw. Objektfehler gibt.
Nun zu meiner Frage/Problem.
Ich habe eine Excelmappe mit nur einem Tabellenblatt.
In Spalte C (C2:C"x" - variabel) befinden sich der jeweilige Dateipfad zur jeweiligen Datei, [Pfad wird bereits via VBA ermittelt und in Spalte C ausgegeben] die ich gerne anhängen möchte.
Besonders: Eine Mail sollte immer nur an einen Adressaten (steht in Spalte B2:B"x"-variabel) versendet werden.
Beispiel: Der Adressat in B2 erhält als Anhang Dateipfad C2.
Hier der Code aus dem Editor kopiert:
Sub Outlook1()
Application.DisplayAlerts = False
Dim Anhang As String
Dim olapp As Object
Dim i As Integer
Anhang = Range("C" & i)
For i = 1 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Set olapp = CreateObject("Outlook.Application")
With olapp.CreateItem(0)
.To = Cells(2, 2)
.Subject = "Liefervorschau vom " & Date
.Body = ""
.Display
.Attachments.Add Anhang
End With
Set olapp = Nothing
Application.DisplayAlerts = True
Next
End Sub
Mein Fehler in diesem Code liegt, gehe ich davon aus, in der Zeile: Anhang = Range("C" & i), da ich das "i" wohl nicht genau definiert habe. Ich hatte versucht mit "For i = 1 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row" einen Loop zu erzeugen - Hier könnt ihr auch meine sehr begrenzten VBA-Skills wiedererkennen.
Frage: Wie muss der Code aussehen, dass der Code für jede Zeile (Adressaten) eine neue Mail öffnet und die dazugehörige Datei angehängt wird für alle Zeilen bis eine Zeile ohne Inhalt erreicht wird.
Vielen Dank vorab und
Viele Grüße
Hendrik

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: VBA-Mail mit Anhang versenden
08.07.2016 18:58:13
ChrisL
Hi Hendrik
Nicht getestet, aber soweit ich sehe bist du nah dran.
Die Zeile...
Anhang = Range("C" & i)
... müsstest du weiter runter verschieben, in die For-Next Schleife rein (ich würde es eine Zeile direkt vor ".Attachments.Add Anhang" platzieren).
Code innerhalb einer For-Next Schleife wird immer wieder ausgeführt und die Variable zählt hoch. z.B.
MsgBox i 'hier ist der Zähler noch auf Null
For i = 1 To 3 'jetzt wird hochgezählt von 1-3
MsgBox i 'Nachricht wird 3x aufgerufen
Next i
cu
Chris

Anzeige
AW: VBA-Mail mit Anhang versenden
09.07.2016 19:13:32
Hendrik
Hey Chris,
vielen Dank für die schnelle Antwort!
Ich werde es nachher gleich mal mit deinem Tipp versuchen. Gebe Dir dann bescheid, ob es funktioniert hat.
lg
Hendrik

AW: VBA-Mail mit Anhang versenden
11.07.2016 17:03:27
Hendrik
Hat super funktioniert! Vielen Dank dafür!
Leider ist mir gerade ein zweites Problem bei meinem Code für die Auflistung des Ordnerinhalts (hier befinden sich die Anhänge für die Mails).
Derzeitig ist das der Code, welcher auch funktioniert... Das Problem liegt aber darin, dass sich der letzte Teile vom Namen des Ordners variiert.
Diese Zeile macht mir Sorgen:
Dateiname = Dir$("S:\SNEID012\Listen\Meine\07_2016_07\*.*")
Was muss ich denn ändern, dass es auch die Dateien ausgibt, wenn sie im Ordner "08_2016_02" liegen. Der Ordnername darf nicht geändert werden und es soll die Dateien aus dem Ordner geben, welchen Monat wir gerade haben. Bsp: Monat_Jahr_Tag [07_2016_01]
Sub DateinamenAuflisten()
'Dateinamen in einem bestimmten Verzeichnis auflisten
Dim Dateiname As String, i As Integer
Range("A2:B500").ClearContents
Dateiname = Dir$("S:\SNEID012\Listen\Meine\07_2016_07\*.*")
Cells(2, 1).Select
Do While Dateiname  ""
ActiveCell.Offset(i, 0) = Dateiname
i = i + 1
Dateiname = Dir$()
Loop
End Sub
Vielen Dank und
Viele Grüße
Hendrik

Anzeige
AW: VBA-Mail mit Anhang versenden
13.07.2016 08:41:54
Hendrik
Vielen Dank Chris für deine Hilfe.
Für diejenigen die mit dem selben Problem auf diesen Beitrag stoßen habe ich von Christian einen Code bekommen.
Hi,
den Code in ein Modul kopieren - hier das ganze mit einem Auswahldialog für den Quellordner.
Du musst den Namen des Zeilblattes noch im Code anpassen: Set ws = ThisWorkbook.Worksheets("Daten")
Gruß,
Christian
Sub DateinamenAuflisten()
'Dateinamen in einem bestimmten Verzeichnis auflisten
Dim Dateiname As String, i As Integer
Dim Pfad As String
Dim ws As Worksheet
' Hier den Namen des Blattes anpassen ("Daten")
Set ws = ThisWorkbook.Worksheets("Daten")
ws.Range("A2:B500").ClearContents
'Funktion GetPath aufrufen um Pfadname zu ermitteln
Pfad = GetPath()
' Wenn kein Ordner ausgewählt wird, hier Ende
If Pfad = "" Then Exit Sub
Dateiname = Dir$(Pfad & "\*.*")
' Wenn kein Ordner keine Dateien enthält, hier Ende
If Dateiname = "" Then Exit Sub
Do While Dateiname ""
ws.Cells(2, 1).Offset(i, 0) = Dateiname
i = i + 1
Dateiname = Dir$()
Loop
MsgBox i & " Dateien im Ordner ''" & Pfad & "'' registriert!"
End Sub
Private Function GetPath() As String
With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False
' Voreingestellter Pfad, ggf. ändern
.InitialFileName = "S:\SNEID012\Listen\Meine\"
.Title = "Ordnerauswahl"
.InitialView = msoFileDialogViewDetails
.ButtonName = "Ordner wählen"
.Title = "Ordner auswählen"
.Show
If .SelectedItems.Count = 0 Then
GetPath = ""
Else
GetPath = .SelectedItems(1)
End If
End With
End Function

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA-Mail mit Anhang versenden in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu:

    • Klicke im Menü auf Einfügen und wähle Modul.
  3. Kopiere den folgenden Code:

    Sub Outlook1()
       Application.DisplayAlerts = False
       Dim Anhang As String
       Dim olapp As Object
       Dim i As Integer
    
       For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
           Anhang = Cells(i, 3) ' Hier wird der Anhang aus Spalte C genommen
           Set olapp = CreateObject("Outlook.Application")
           With olapp.CreateItem(0)
               .To = Cells(i, 2) ' Der Adressat aus Spalte B
               .Subject = "Liefervorschau vom " & Date
               .Body = ""
               .Attachments.Add Anhang ' Anhang hinzufügen
               .Display ' Mail anzeigen
           End With
           Set olapp = Nothing
       Next i
       Application.DisplayAlerts = True
    End Sub
  4. Führe das Makro aus:

    • Schließe den VBA-Editor und führe das Makro über Entwicklertools > Makros aus.

Häufige Fehler und Lösungen

  • Objektfehler:

    • Stelle sicher, dass die Spalten korrekt referenziert sind. Der Adressat sollte in Spalte B, der Dateipfad in Spalte C stehen.
  • Anhang nicht gefunden:

    • Überprüfe, ob der Dateipfad korrekt ist und die Datei tatsächlich existiert.
  • Outlook öffnet sich nicht:

    • Stelle sicher, dass Outlook korrekt installiert und konfiguriert ist.

Alternative Methoden

  • VBA-Mail mit Anhang versenden über Access:

    • Wenn Du Access zur Verfügung hast, kannst Du auch dort E-Mails versenden. Der Code ist ähnlich und nutzt die gleichen Outlook-Objekte.
  • Verwendung von Excel Makros:

    • Du kannst auch Excel-Makros verwenden, um E-Mails zu senden, die aus Excel heraus ausgelöst werden.

Praktische Beispiele

  1. Einzelne E-Mail mit Anhang:

    Sub SendSingleEmail()
       Dim olapp As Object
       Set olapp = CreateObject("Outlook.Application")
       With olapp.CreateItem(0)
           .To = "example@example.com"
           .Subject = "Test E-Mail"
           .Body = "Dies ist ein Test."
           .Attachments.Add "C:\Path\To\File.txt"
           .Send
       End With
       Set olapp = Nothing
    End Sub
  2. E-Mail mit dynamischem Dateipfad:

    Sub SendEmailWithDynamicAttachment()
       Dim olapp As Object
       Dim filePath As String
       filePath = "C:\Path\To\Your\DynamicFile.txt"
    
       Set olapp = CreateObject("Outlook.Application")
       With olapp.CreateItem(0)
           .To = "example@example.com"
           .Subject = "Dynamische E-Mail"
           .Body = "Hier ist dein Anhang."
           .Attachments.Add filePath
           .Send
       End With
       Set olapp = Nothing
    End Sub

Tipps für Profis

  • Verwende Debug.Print:

    • Nutze Debug.Print in deinem Code, um Variablenwerte zu überprüfen und den Fluss deines Codes zu verstehen.
  • Fehlerbehandlung einbauen:

    • Implementiere eine Fehlerbehandlung mit On Error Resume Next, um den Code robuster zu gestalten.
  • Testen in einer kontrollierten Umgebung:

    • Teste den Code zuerst in einer sicheren Umgebung, um unbeabsichtigte E-Mails zu vermeiden.

FAQ: Häufige Fragen

1. Wie kann ich mehrere Anhänge versenden?
Du kannst die .Attachments.Add-Methode mehrfach aufrufen, um mehrere Dateien hinzuzufügen.

2. Welche Outlook-Version benötige ich?
Der Code funktioniert mit den meisten modernen Outlook-Versionen, die VBA unterstützen.

3. Kann ich den E-Mail-Text dynamisch gestalten?
Ja, Du kannst Variablen im .Body-Feld verwenden, um den Text dynamisch zu gestalten.

4. Wie kann ich den Dateipfad automatisch ermitteln?
Du kannst VBA-Funktionen wie Dir verwenden, um den aktuellen Ordnerinhalt dynamisch zu durchsuchen.

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