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

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ein Bereich als Html body in einer E-Mail via VBA
29.01.2020 17:01:10
Raimund
Hi
Es funktioniert doch.
Du musst auch den YourSheet umbenennen
Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
Gruß
Raimund
AW: Ein Bereich als Html body in einer E-Mail via VBA
29.01.2020 17:47:52
volti
Hallo,
wenn Du möchtest hier auch noch 'ne Alternative ohne Temporäre Datei. Auch mit Signatur.
Option Explicit
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _
        ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function lstrcpy Lib "kernel32" ( _
        ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" ( _
        ByVal wFormat As Long) As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function RegisterClipboardFormat Lib "user32" _
        Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
       
Sub Mail_Senden()
 Dim sMailText As String
 sMailText = "Hallo!"
 Sheets("Tabelle1").Range("$D4:$D12").Copy
 With CreateObject("Outlook.Application").CreateItem(0)
  .To = "Nach@web.de"
  .CC = ""
  .Subject = "Test"
  .GetInspector
  .HTMLBody = Replace(sMailText, vbLf, "<br>") _
            & GetHTMLfromClipboard() & .HTMLBody
  .display
 End With
End Sub
Private Function GetHTMLfromClipboard() As String
'Exceltabellenbereich via Clipboard nach HTML umwandeln
'Wenn Text kopiert wurde, dann diesen extrahieren
 Dim hMem As LongPtr, lpGMem As LongPtr, ClipText As String, iCF As Long
 iCF = RegisterClipboardFormat("HTML Format")
 If IsClipboardFormatAvailable(iCF) = 0 Then iCF = 1 'CF_TEXT
 If IsClipboardFormatAvailable(iCF) > 0 Then
  OpenClipboard 0&
  hMem = GetClipboardData(iCF)
  If hMem > 0 Then
   lpGMem = GlobalLock(hMem)
   ClipText = String$(CLng(GlobalSize(hMem)), " ")
   lstrcpy ClipText, lpGMem
   GlobalUnlock hMem
   If Len(ClipText) > 0 Then
    If iCF = 1 Then
       GetHTMLfromClipboard = Left$(ClipText, InStr(ClipText, vbNullChar) - 1)
    Else
       GetHTMLfromClipboard = Mid$(ClipText, InStr(ClipText, "<html "))
    End If
   End If
  End If
  CloseClipboard
 End If
End Function

viele Grüße
Karl-Heinz

Anzeige

Forumthreads zu verwandten Themen

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 via VBA zu senden, folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke auf Einfügen > 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
    
       ' Setze den Bereich, den du senden möchtest
       Set rng = Sheets("YourSheet").Range("D4:D12").SpecialCells(xlCellTypeVisible)
    
       ' Erstelle eine neue Outlook E-Mail
       Set OutApp = CreateObject("Outlook.Application")
       Set OutMail = OutApp.CreateItem(0)
    
       With OutMail
           .To = "recipient@example.com"
           .Subject = "Dies ist der Betreff"
           .HTMLBody = RangetoHTML(rng)
           .Send  ' Oder verwende .Display, um die E-Mail vor dem Senden anzuzeigen
       End With
    
       Set OutMail = Nothing
       Set OutApp = Nothing
    End Sub
    
    Function RangetoHTML(rng As Range) As String
       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
           .Cells(1).PasteSpecial xlPasteValues, , False, False
           .Cells(1).PasteSpecial xlPasteFormats, , False, 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
    End Function
  4. Ändere den Blattnamen in Sheets("YourSheet"), um den Namen deines Arbeitsblattes widerzuspiegeln.

  5. Führe das Makro aus und überprüfe dein E-Mail-Postfach.


Häufige Fehler und Lösungen

  • Problem: E-Mail wird ohne HTML-Inhalt gesendet.

    • Lösung: Stelle sicher, dass der Blattname korrekt ist und der Range existiert.
  • Problem: Temporäre Datei wird nicht gelöscht.

    • Lösung: Überprüfe die Berechtigungen für den Temp-Ordner oder füge On Error Resume Next hinzu, um Fehler zu ignorieren.

Alternative Methoden

Eine Alternative ist das Senden einer E-Mail ohne temporäre Datei. Hier ist ein Beispiel:

Sub Mail_Senden()
    Dim sMailText As String
    sMailText = "Hallo!"

    Sheets("Tabelle1").Range("$D4:$D12").Copy
    With CreateObject("Outlook.Application").CreateItem(0)
        .To = "recipient@example.com"
        .Subject = "Test"
        .HTMLBody = Replace(sMailText, vbLf, "<br>") & GetHTMLfromClipboard()
        .Display
    End With
End Sub

Private Function GetHTMLfromClipboard() As String
    ' Hier den Code zum Extrahieren von HTML aus der Zwischenablage hinzufügen
End Function

Praktische Beispiele

  • Beispiel 1: Wenn du nur sichtbare Zellen senden möchtest:

    Set rng = Selection.SpecialCells(xlCellTypeVisible)
  • Beispiel 2: Wenn du einen bestimmten Bereich angeben möchtest:

    Set rng = Sheets("Daten").Range("A1:C10")

Tipps für Profis

  • Verwende Outlook.MailItem für erweiterte Optionen wie CC und BCC.
  • Teste den HTML-Body, indem du .Display verwendest, bevor du die E-Mail sendest.
  • Achte darauf, dass deine Excel-Version mit dem VBA-Code kompatibel ist (z.B. Excel 365).

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen .Body und .HTMLBody? Die .Body-Eigenschaft sendet einfachen Text, während .HTMLBody HTML-Inhalt unterstützt, was Formatierungen ermöglicht.

2. Wie kann ich den HTML-Body anpassen? Du kannst den RangetoHTML-Code anpassen, um spezifische Formatierungen hinzuzufügen oder den HTML-Inhalt direkt zu bearbeiten.

3. Welche Excel-Versionen unterstützen diesen VBA-Code? Der Code sollte in Excel-Versionen von 2000 bis 365 funktionieren, aber teste ihn in deiner spezifischen Version.

4. Kann ich mehrere Bereiche in einer E-Mail kombinieren? Ja, du kannst mehrere Bereiche zusammenführen, indem du sie zuerst in ein temporäres Arbeitsblatt kopierst und dann die HTML-Daten extrahierst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige