我目前正致力于工作的流程自动化。基本上,宏分析数据并创建包含结果的电子邮件。
一切都运行得很好,除了我完全不知道如何在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
基本上,电子邮件看起来非常好,除了我希望看到我的价值观与它的字体格式(如果需要和颜色加粗)。
有人可以帮忙吗?
谢谢
答案 0 :(得分:1)
如果你的目标是在功能上能够将一些数据从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
答案 1 :(得分:0)
Wedge是正确的,Ron de Bruin的RangeToHtml是你的第一选择。但是,此例程使用Excel发布对象,这些对象生成质量较差的CCS,其列宽设置为像素。至少有些智能手机根本无法处理这些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元素是这样的:
<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>
如果第二种和第三种方法中的任何一种看起来很有趣但不清楚,请发表评论,我将扩展我的解释。