Kirim rentang Excel ke badan Email dengan penyesuaian otomatis

Saat ini saya menggunakan fungsi Ron de RentangtoHTML Bruin untuk mengirim beberapa tabel dalam email. Saya ingin tabel ini disesuaikan secara otomatis dengan layar di Outlook.

Saat ini, saya harus mengklik setiap tabel dan pergi ke layout->autofit to screen pada setiap tabel. Saya bertanya-tanya apakah tugas ini dapat dimasukkan ke dalam makro dengan cara tertentu.

Sunting: Ini adalah tebakan pertama saya pada sebuah solusi:

objMail.HTMLBody = RangetoHTML(Range("A1:G14")) & _
    RangetoHTML(Range(Range("vmRange").Value)) & _
    RangetoHTML(Range(Range("hpRange").Value)) & _
    RangetoHTML(Range(Range("esrRange").Value))

For Each tbl In objMail.body.tables
    tbl.Columns.AutoFit 'Note: This doesn't actually work
Next tbl

person Ryan B    schedule 08.05.2015    source sumber
comment
Terima kasih Omar, tapi yang saya coba dapatkan adalah perilaku ketika (dalam pandangan) Anda mengatur tabel agar pas otomatis ke layar.   -  person Ryan B    schedule 08.05.2015


Jawaban (2)


Inilah versi modifikasi fungsi Ron de Bruin saya:

Function RangetoHTMLFlexWidth(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2013
    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)
    RangetoHTMLFlexWidth = ts.readall
    ts.Close
    RangetoHTMLFlexWidth = Replace(RangetoHTMLFlexWidth, "align=center x:publishsource=", _
        "align=left x:publishsource=")

    Dim startIndex As Long
    Dim stopIndex As Long
    Dim subString As String

    'Change table width to "100%"
    startIndex = InStr(RangetoHTMLFlexWidth, "<table")
    startIndex = InStr(startIndex, RangetoHTMLFlexWidth, "width:") + 5
    stopIndex = InStr(startIndex, RangetoHTMLFlexWidth, "'>")
    subString = Left(RangetoHTMLFlexWidth, startIndex)
    subString = subString & "100%"
    RangetoHTMLFlexWidth = subString & Mid(RangetoHTMLFlexWidth, stopIndex)

    '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

Perubahan dimulai dengan komentar:

'Change table width to "100%"

Itu hanya menemukan tempat di mana lebar tabel ditentukan dan mengaturnya menjadi 100%. Browser atau pandangan menskalakan sel ke lebar baru, sehingga berfungsi, tapi ini peretasan yang kotor, IMO.

person Ryan B    schedule 21.05.2015

Edit KODE Dari

With TempWB.Sheets(1)
    .Cells(1).PasteSpecial Paste:=8
    .Cells(1).PasteSpecial xlPasteValues, , False, False
    .Cells(1).PasteSpecial xlPasteFormats, , False, False
    .Cells(1).Select

Ubah dan Tambahkan Ke CODE

      Cells(1).Select '<<---- Change
      Cells(1).EntireRow.AutoFit '<<-- Add
      Cells(1).EntireColumn.AutoFit '<<-- Add

Lihat KODE Lengkap

Option Explicit
'// Source From Ron de Bruin
Sub MailSelectionRangeOutlookBody()
    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 = "[email protected]"
        .CC = ""
        .BCC = ""
        .Subject = "This is the Subject line"
        .HTMLBody = RangetoHTML(rng)
        '.Send   '// or use .Display
        .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"

    '// 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.Select
         Cells.EntireRow.AutoFit
         Cells.EntireColumn.AutoFit
        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
person 0m3r    schedule 08.05.2015
comment
Jadi, tujuannya adalah agar tabel di email itu sendiri disesuaikan secara otomatis dengan jendela. Ini menyesuaikan secara otomatis dengan konten sel di excel sebelum mengekspornya ke email. - person Ryan B; 08.05.2015
comment
untuk menyesuaikan secara otomatis ke jendela, maka perlu memodifikasi kode berikut RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _ "align=left x:publishsource=") , - person 0m3r; 09.05.2015