Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1736to1740
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

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



		

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

25 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige