VBA Excel到Outlook字体格式



我目前正在为工作的过程自动化。基本上,宏分析数据并创建带有结果的电子邮件。

一切都很好,除了我绝对不知道如何将我的字体格式化到Outlook的电子邮件主体中。随着每行格式的变化,我无法将字体格式设置为恒定值,并且取决于我的工作表中的Excel公式和条件格式。

创建HTML主体的功能如下:

            Private Function BodyBuilder(wsA As Worksheet) As String
            Dim html As String
            Dim sTTo As String
            Dim rngSN As Range
            Dim cl As Range
            Dim sName As String

            Set OutSh = ThisWorkbook.Sheets("Output")
               sTTo = Comm.Cells(5, 4)
               sName = OutSh.Cells(3, 2)
               html = "Dear " & sTTo & ","
            Set rngSN = OutSh.Range("a4:a11")
            html = html & "<br><br><table><tr><td><strong>" & "Detailed risk report for selected company - " & sName & "</strong></td></tr>"
            **For Each cl In rngSN
               html = html & "<tr><td>" & Format(cl.Value, cl.NumberFormat) & "</td><td>" & cl.Offset(, 1).Value & "</td></tr>"
            Next cl**

            html = html & "</table>" & "<br>" & "Kind regards"
            BodyBuilder = html
            End Function

基本上,电子邮件看起来还不错,除了我想以字体格式查看我的值

有人可以帮忙吗?

谢谢

如果您的目标是在功能上可以将Excel的某些数据"复制"到Outlook电子邮件中,同时保留所有格式,则最容易使用RON,这可能是最容易的De Bruin的功能将Excel范围转换为HTML。我检查了一下,这似乎甚至保留了有条件格式的格式。

来源网站。

然后,您可以将数据转换为HTML,以将数据放入身体标签中,例如

html = html & RangeToHTML(OutSh.Range("a4:a11"))

(有关函数的重新发布(

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

楔形是正确的,Ron de Bruin的rangetohtml是您的首选。但是,此例程使用Excel发布对象,这些对象产生质量较差的CC,其列宽度设置为像素。至少有些智能手机根本无法处理此CSS,而另一些智能手机则产生难以阅读的显示器。如果您的收件人都不会使用智能手机打开您的电子邮件,那么Wedge的解决方案就足以满足您的需求。

第二个解决方案是我在VBA中写的rangetohtml例程。以下从简介中摘录列出了其格式处理:

  ' The table below lists the formats handled at cell and or in-cell level.
  '   CELL-LEVEL            IN-CELL           DEFAULT VALUE
  '   bold                  bold              false
  '   italic                italic            false
  '   strikethrough         strikethrough     false
  '   underline single      underline single  no underline
  '   underline double      underline double  no underline
  '   underline accounting                    no underline
  '   font colour           font colour       black
  '   background colour                       white
  '   horizontal alignment                    left for string; right for numbers and dates
  '   font size             font size         11 or as set at the Excel application level
  '   font name             font name         Calibri or as set at the Excel application level
  '   vertical alignment                      bottom

我的日常工作的麻烦是(1(它不是特别快,(2(它的总尺寸超过了堆栈溢出的每个答案的30,000个字符的极限。如果您需要这样的功能级别,请给我发送电子邮件,我将向您发送我的开发工作簿。

如果您需要的只是粗体和几种颜色,则可以使用我的方法来编码自己的例程。

我的HTML头部元素是这样的:

  <head>
    <meta http-equiv="Content-Type"content="text/html; charset=utf-8"/>
    <style>
      table {border-collapse:collapse;}
      td {border-style:solid; border-width:1px; border-color:#BFBFBF;}
      td.backclr-0000FF {background-color:#0000FF;}
      td.backclr-D7EAF4 {background-color:#D7EAF4;}
      td.backclr-F3F5DB {background-color:#F3F5DB;}
      td.bold {font-weight:bold;}
      td.fontclr-0000FF {color:#0000FF;}
      td.fontclr-0070C0 {color:#0070C0;}
      td.fontclr-00FF00 {color:#00FF00;}
      td.hAlign-right {text-align:right;}
        </style>
  <head>

我的例程仅生成需要处理在Excel范围内找到格式所需的样式。如果您只需要粗体和几种颜色,则可以用比我需要的较短的类名称进行编码。

一排的输出类似于:

  <tr>
    <td class="td.backclr-0000FF ">Column1</td>
    <td class="hAlign-right td.fontclr-0000FF ">100,000</td>
    <td class="hAlign-right td.bold ">200,000</td>
  </tr>

如果第二和第三种方法中的任何一个看起来都很有趣,但尚不清楚,请发表评论,我将扩展我的解释。

最新更新