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

Sheet Email Versand, Spaltenbreite übernehmen

Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 07:40:22
Ralf
Hallo Forum,
ich versende mit folgendem Code aus Excel heraus einen Tabellenbereich per eMail:
Option Explicit
Sub Mail_Selection_Range_Outlook_Body()
Call Tabellenblatt_entsperren
'Working in Office 2000-2010
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 = Range("A1:Z40").SpecialCells(xlCellTypeVisible)
'You can also use a range if you want
'Set rng = Sheets("YourSheet").Range("A1:Z40").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
.GetInspector
.To = "Test@test.com"
.CC = ""
.BCC = ""
.Subject = "Test"
.HTMLBody = RangetoHTML(rng) & vbCrLf & .HTMLBody
.Display
'.Send   'or use .Display
End With
On Error GoTo 0
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
Set OutMail = Nothing
Set OutApp = Nothing
Call Tabellenblatt_sperren
End Sub

Function RangetoHTML(rng As Range)
' Working in Office 2000-2010
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
Leider werden die Spaltenbreiten nicht übernommen, so dass es zu sehr merkwürdigen Zeilenumbrüchen kommt. Ich finde den Befehl leider nicht, der dies verhindert.
Ich habe mit
.Cells(1).PasteSpecial xlPasteValues, , False, False 'oder True, True
.Cells(1).PasteSpecial xlPasteFormats, , False, False 'oder True, True
rumgespielt, leider ohne Erfolg.
Kann mir bitte jemand helfen, den Code so zu verändern, dass die Spaltenbreiten übernommen werden?
Vielen Dank.
Viele Grüße
Ralf

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:20:40
Beverly
Hi Ralf,
exportiere das Tabellenblatt und lösche die überflüssigen Zeilen/Spalten.


AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:23:21
Ralf
Hallo Karin,
das Blatt wird ja temporär exportiert. Es gibt keine überflüssigen Zeilen und/oder Spalten. Der Bereich A1:Z40 soll mit den Spaltenbreiten aus Excel in die Email übernommen werden.
Viele Grüße
Ralf

AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:30:05
Beverly
Hi Ralf,
das Blatt wird in deinem Code nicht exportiert sondern der Bereich kopiert - rng.Copy heißt die Zeile.
Ein Blatt in eine andere Mappe kopieren erledigt man mit Rechtsklick auf den Tabellenreiter -&gt Verschieben oder kopieren... und dann die Zeilmappe auswählen.
Falls dir das zu umständlich ist, kannst du ja in einer Schleife über alle Spalten laufen und ihre Breite entsprechend anpassen.


Anzeige
AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:35:37
Ralf
Hallo Beverly,
was muss ich statt "rng.Copy" dann einsetzen?
Unter dem rng.copy Block steht ja was mit
.Cells(1).PasteSpecial xlPasteValues, , False, False
.Cells(1).PasteSpecial xlPasteFormats, , False, False
Da habe ich versucht mit True das Problem zu lösen. leider ohne Erfolg.
Das Blatt händisch mit rechtsklick zu kopieren ist keine Alternative.
Danke im Voraus für eine Rückmeldung.
Viele Grüße
Ralf

AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:55:57
Beverly
Hi Ralf,
niemand hat gesagt, dass du das Tabellenblatt händisch kopieren sollst - das kann man selbstverständlich auch mit VBA machen.
Ersetze diesen Codeteil
    '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
durch diesen:

'Copy the range and create a new workbook to past the data in
Dim lngLetzte As Long
Dim intLetzte As Integer
Set TempWB = Workbooks.Add(1)
ThisWorkbook.Worksheets(1).Copy Before:=TempWB.Worksheets(1)
With TempWB.Worksheets(1)
lngLetzte = .Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious). _
Row
intLetzte = .Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:= _
xlPrevious).Column
.Range(Cells(41, 1), Cells(lngLetzte, intLetzte)).ClearContents
End With


Anzeige
AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 09:01:34
Ralf
Hallo Karin,
die temporäre Tabelle/Mappe ist nach Durchlauf des Codes weiter geöffnet. Diese temporäre Tabelle ist leer. Somit ist auch die Email leer. Ein Fehler wird aber nicht ausgegeben.
Es wird scheinbar gar nichts kopiert.
Viele Grüße
Ralf

AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 09:25:25
Beverly
Hi Ralf,
kann ich nicht nachvollziehen - der Code funktioniert bei mir (getestet in Excel2007 und Excel2010) korrekt und macht genau das was er machen soll.


AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 09:43:07
Ralf
Hallo Beverly,
hm, bei mir eben nicht. Ich habe deinen Code Block 1:1 in meinen reinkopiert und den anderen Teil herausgenommen.
Verstehe ich auch nicht.
Ich habe nun die Schriftart verkleinert, damit geht's. Warum auch immer.
Im Outlook wird die Spaltenbreite in der Einheit cm im Excel in ? angegeben. Gibt es da mit der Umrechnung Kompatibilitätsprobleme?
Viele Grüße
Ralf

Anzeige
AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:49:52
Raphael
Hallo Ralf,
sind die Spalten auch in der falschen Grösse wenn du den Teil weglässt?

RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", "align=left x: _
publishsource=")

Gruess
Raphael

AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 08:55:01
Ralf
Hallo Raphael,
ja, auch dann sind die Breiten falsch.
Ich habe mir jetzt überlegt, mit einem Unterprogramm die Spaltenbreiten in dem temporären Blatt zu definieren. Ich kenne mich im VBA nicht aus. War nur eine Idee.
Aufruf über "Call Spaltenbreiten". Dies funktioniert aber auch nicht. Die Email ist dann leer.
Viele Grüße
Ralf

Anzeige
AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 09:18:54
Raphael
Hallo Ralf,
ich hab jetzt mal ein bisschen rumgetest da ich einen ähnlichen Code ohne Probleme nutze.
Es liegt an der Limitierung der Breite welche du im Mail für eine Tabelle haben kannst, d.h. deine Spalten werden solange kleiner gemacht bis sie schlussendlich in die max. Breite des Mails passen.
Wenn du das nicht willst, musst du allenfalls das Sheet herauskopieren, temp. speichern, ans Mail anhängen und wieder löschen.
Dann muss der Empfänger die Datei öffnen, oder du änderst deine Spaltenbreiten in der Excel solange bis sie die optimal Breite für die Mail haben.
Gruess
Raphael

Anzeige
AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 09:39:52
Ralf
Hallo Raphael,
ich habe es jetzt über eine temporär andere Formatierung (kleinere Schriftart) und damit auch andere Spaltenbreiten gelöst. Das funktioniert soweit.
Ich möchte nun in der Email im Betreff einen Text ausgeben
.Subject = "test text"
wie kann ich nun den Zellinhalt aus D5 (händisch eingegebenes Datum) in die Betreffzeile integrieren?
Als Ergebnis soll dann "test 01.04.2014 text" erscheinen.
Viele Grüße
Ralf

AW: Sheet Email Versand, Spaltenbreite übernehmen
02.04.2014 15:50:50
Klaus
Hallo Raphael,
wie kann ich nun den Zellinhalt aus D5 (händisch eingegebenes Datum) in die Betreffzeile integrieren?
Als Ergebnis soll dann "test 01.04.2014 text" erscheinen.

Im Prinzip so:
.Subject = "test " & Sheets("DeinBlatt").Range("D5").value & "text"
Grüße,
Klaus M.vdT.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige