使用VBA在Outlook邮件中创建带指定颜色边框样式的HTML表格
问题原因
Outlook桌面端自2007版本起使用Word作为HTML渲染引擎,完全不支持:nth-child()这类CSS伪类选择器,同时对<style>标签内的复杂选择器兼容性极差,你写在公共样式块里的隔行变色、表头样式规则不会被正常解析渲染。
修复方案
所有邮件样式不要依赖公共style块的选择器匹配,全部通过标签的style属性写内联样式,这是Outlook邮件兼容性最高的实现方式:
- 表头
<th>标签直接加内联样式,自定义背景色、文字颜色、字重等效果 - 隔行变色不要靠CSS选择器实现,在VBA循环生成数据行时加一个行计数器,根据行的奇偶性给对应行的
<td>写不同的背景色内联样式 - 边框、内边距这类基础样式直接写到每个
td/th的内联属性里,避免渲染失效
修改后可直接运行的代码
Dim EmailApp As Outlook.Application Dim EmailItem As Outlook.MailItem Dim rowCnt As Integer ' 行计数器,用于判断隔行变色 Dim bgColor As String ' 存储当前行背景色 Set EmailApp = New Outlook.Application For Each cCel In eSh.Range("A2:A" & eSh.Cells(eSh.Rows.Count, "A").End(xlUp).Row) ' 清空发送状态 cCel.Offset(0, 2) = "" If IsEmpty(cCel.Offset(0, 1)) Then GoTo NX mSend = False EmailBody = "" rowCnt = 1 ' 每封邮件生成前重置行计数器 ' 邮件开头+表格表头,所有样式直接内联 EmailBody = "Ola, " & _ cCel & "<br><br>" & _ "<table cellpadding=""0"" cellspacing=""0"">" & _ "<tr>" & _ "<th style=""border: 1px solid #e3e3e3; padding: 4px 8px; text-align: left; background-color: #4472C4; color: #ffffff; font-weight: bold;"">Numero do Contratro</th>" & _ "<th style=""border: 1px solid #e3e3e3; padding: 4px 8px; text-align: left; background-color: #4472C4; color: #ffffff; font-weight: bold;"">Contratante</th>" & _ "<th style=""border: 1px solid #e3e3e3; padding: 4px 8px; text-align: left; background-color: #4472C4; color: #ffffff; font-weight: bold;"">Saldo de Contrato</th>" & _ "</tr>" ' 按当前收件人筛选数据 DB.Range("1:1").AutoFilter Field:=gestI.Column, Criteria1:=cCel If DB.Range("A" & DB.Rows.Count).End(xlUp).Row = 1 Then GoTo NX For Each mCel In DB.Range("AG2", DB.Range("AG" & DB.Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) If mCel.Row = 1 Then GoTo NXX If Not IsDate(mCel) Then GoTo NXX exDate = DateSerial(Year(mCel) + 1, Month(mCel), Day(mCel)) If DateDiff("d", Date, exDate) < 0 Then mSend = True ' 根据行奇偶设置对应背景色 If rowCnt Mod 2 = 1 Then bgColor = "#e7edf0" ' 奇数行背景 Else bgColor = "#ffffff" ' 偶数行背景,可自行修改色值 End If ' 逐行写入表格数据,所有单元格样式内联 EmailBody = EmailBody & "<tr>" & _ "<td style=""border: 1px solid #e3e3e3; padding: 4px 8px; text-align: left; background-color:" & bgColor & """>" & DB.Cells(mCel.Row, "C").Text & "</td>" & _ "<td style=""border: 1px solid #e3e3e3; padding: 4px 8px; text-align: left; background-color:" & bgColor & """>" & DB.Cells(mCel.Row, "I").Text & "</td>" & _ "<td style=""border: 1px solid #e3e3e3; padding: 4px 8px; text-align: left; background-color:" & bgColor & """>" & DB.Cells(mCel.Row, "X").Text & "</td></tr>" rowCnt = rowCnt + 1 End If NXX: Next mCel If mSend = False Then GoTo NX Set EmailItem = EmailApp.CreateItem(olMailItem) With EmailItem .To = cCel.Offset(0, 1).Text ' 读取收件人邮箱 .Subject = "Información Sobre Contractos" .HTMLBody = EmailBody & "</table><br><br>Atenciosamente" .Display .Send cCel.Offset(0, 2).Value = "Sent" ' 标记发送状态 X = X + 1 End With NX: Next cCel
注意:VBA字符串内写HTML属性的双引号需要用两个连续双引号转义,否则会报语法错误。如果需要调整表头颜色、隔行颜色,直接修改对应style属性里的十六进制色值即可。
内容的提问来源于stack exchange,提问作者VBAbyMBA
相关产品推荐
相关产品推荐

