Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Ein Bereich als Html body in einer E-Mail via VBA

Ein Bereich als Html body in einer E-Mail via VBA
29.01.2020 15:54:52
nian
Hallo zusammen,
ich habe den folgenden Code auf der Internetseite http://www.rondebruin.nl/win/s1/outlook/bmail2.htm
gefunden. Leider funktioniert der Code nicht wie erwartet. Mein Bereich ist festgelegt und den Empfänger habe geändert, sonst habe ich an dem Code nichts geändert.
Also, es wird eine neue E-Mail geöffnet, aber ohne den festgelegten Bereich als e-mail body. Auß _
erdem wird die temporäre Datei, welche für die E-Mail erstellt wird, nicht geschlossen. Meine _ Excel Version ist MS Office 365 ProPlus.

Vielen Dank im Voraus für die Hilfe.
VG Nian
Sub Mail_Selection_Range_Outlook_Body()
'For Tips see: http://www. _
rondebruin.nl/win/winmail/Outlook/tips.htm
'Don't forget to copy the function RangetoHTML in the module.
'Working in Excel 2000-2016
Dim rng As Range
Dim OutApp As Object
Dim OutMail As Object
Set rng = Nothing
On Error Resume Next
'Only the visible cells in the selection
'Set rng = Selection.SpecialCells(xlCellTypeVisible)
'You can also use a fixed range if you want
Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
MsgBox "The selection is not a range or the sheet is protected" & _
vbNewLine & "please correct and try again.", vbOKOnly
Exit Sub
End If
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = "ron@debruin.nl"
.CC = ""
.BCC = ""
.Subject = "This is the Subject line"
.HTMLBody = RangetoHTML(rng)
.Send   'or use .Display
End With
On Error GoTo 0
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
Function RangetoHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2016
Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
'Copy the range and create a new workbook to past the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
.Cells(1).PasteSpecial Paste:=8
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
.Cells(1).Select
Application.CutCopyMode = False
On Error Resume Next
.DrawingObjects.Visible = True
.DrawingObjects.Delete
On Error GoTo 0
End With
'Publish the sheet to a htm file
With TempWB.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=TempFile, _
Sheet:=TempWB.Sheets(1).Name, _
Source:=TempWB.Sheets(1).UsedRange.Address, _
HtmlType:=xlHtmlStatic)
.Publish (True)
End With
'Read all data from the htm file into RangetoHTML
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
"align=left x:publishsource=")
'Close TempWB
TempWB.Close savechanges:=False
'Delete the htm file we used in this function
Kill TempFile
Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing
End Function



		
Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Bereich als HTML-Body in einer E-Mail via VBA


Schritt-für-Schritt-Anleitung

Um einen Bereich als HTML-Body in einer E-Mail mit VBA zu versenden, befolge diese Schritte:

  1. Öffne Excel und 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 VBA-Code in das Modul:

    Sub Mail_Selection_Range_Outlook_Body()
       Dim rng As Range
       Dim OutApp As Object
       Dim OutMail As Object
       Set rng = Nothing
       On Error Resume Next
       Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
       On Error GoTo 0
       If rng Is Nothing Then
           MsgBox "Die Auswahl ist nicht im richtigen Bereich oder das Blatt ist geschützt."
           Exit Sub
       End If
       With Application
           .EnableEvents = False
           .ScreenUpdating = False
       End With
       Set OutApp = CreateObject("Outlook.Application")
       Set OutMail = OutApp.CreateItem(0)
       On Error Resume Next
       With OutMail
           .To = "empfaenger@example.com"
           .Subject = "Dies ist die Betreffzeile"
           .HTMLBody = RangetoHTML(rng)
           .Send   'oder verwende .Display
       End With
       On Error GoTo 0
       With Application
           .EnableEvents = True
           .ScreenUpdating = True
       End With
       Set OutMail = Nothing
       Set OutApp = Nothing
    End Sub
    
    Function RangetoHTML(rng As Range) 
       Dim fso As Object
       Dim ts As Object
       Dim TempFile As String
       Dim TempWB As Workbook
       TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
       rng.Copy
       Set TempWB = Workbooks.Add(1)
       With TempWB.Sheets(1)
           .Cells(1).PasteSpecial Paste:=8
           Application.CutCopyMode = False
       End With
       With TempWB.PublishObjects.Add( _
           SourceType:=xlSourceRange, _
           Filename:=TempFile, _
           Sheet:=TempWB.Sheets(1).Name, _
           Source:=TempWB.Sheets(1).UsedRange.Address, _
           HtmlType:=xlHtmlStatic)
           .Publish (True)
       End With
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
       RangetoHTML = ts.readall
       ts.Close
       TempWB.Close savechanges:=False
       Kill TempFile
       Set ts = Nothing
       Set fso = Nothing
       Set TempWB = Nothing
    End Function
  4. Passe den Bereich und den Empfänger an deine Bedürfnisse an.

  5. Führe das Makro aus, um die E-Mail zu senden.


Häufige Fehler und Lösungen

  • Fehler: "Die Auswahl ist nicht im richtigen Bereich oder das Blatt ist geschützt."

    • Lösung: Stelle sicher, dass der angegebene Bereich (z.B. D4:D12) tatsächlich sichtbar und nicht geschützt ist.
  • Fehler: E-Mail wird ohne HTML-Body gesendet.

    • Lösung: Überprüfe, ob die RangetoHTML-Funktion korrekt implementiert ist und dass der angegebene Bereich tatsächlich Daten enthält.

Alternative Methoden

Eine Alternative zur Verwendung von VBA ist das Erstellen von E-Mail-Vorlagen in Outlook. Du kannst die HTML-Inhalte direkt in eine Outlook-Vorlage einfügen und später bei Bedarf abrufen.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um den HTML-Body aus einer Tabelle zu versenden:

  1. Erstelle eine Tabelle in Excel mit den Daten, die du versenden möchtest.
  2. Verwende den oben angegebenen VBA-Code, um den Bereich A1:B10 als E-Mail-Body zu senden:

    Set rng = Sheets("YourSheet").Range("A1:B10").SpecialCells(xlCellTypeVisible)

Tipps für Profis

  • Outlook HTML aktivieren: Stelle sicher, dass du in Outlook die HTML-Anzeige aktiviert hast, um sicherzustellen, dass alle HTML-Formatierungen korrekt angezeigt werden.

  • VBA .htmlbody nutzen: Wenn du spezielle Formatierungen benötigst, kannst du die .htmlbody-Eigenschaft von Outlook verwenden, um direkt anzugeben, wie dein E-Mail-Body aussehen soll.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen .HTMLBody und .Body in VBA?
.HTMLBody erlaubt das Versenden von E-Mails mit HTML-Formatierungen, während .Body nur reinen Text unterstützt.

2. Welche Excel-Versionen unterstützen diesen Code?
Der Code funktioniert in den Versionen Excel 2000 bis 2016 und in MS Office 365 ProPlus.

3. Wie kann ich sicherstellen, dass mein HTML-Body korrekt formatiert ist?
Verwende die RangetoHTML-Funktion, um den Bereich in ein HTML-Dokument zu konvertieren, bevor du ihn in die E-Mail einfügst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige