Excel VBA宏截断HTMLBody替换中的单元格值

时间:2017-10-26 14:07:19

标签: vba excel-vba excel

所以我在Excel中遇到了VBA的奇怪情况。

长话短说,我编写了一个宏,用于生成电子邮件(来自Excel),来自模板,然后将Replace.HTMLBody一起使用,以便将一些信息从我的Excel文档推送到电子邮件。

所以我在Excel中有一个表,它基本上有4列,可以有1到50行数据。这是我在电子邮件中需要的格式化表格。我最初尝试复制到剪贴板和粘贴,但似乎更容易在HTML中重新创建表,然后将所有HTML与我的值连接起来,然后将一个单元格传递到电子邮件正文中的正确空间。 / p>

这在大多数情况下效果很好,但是,当数据超过9行时,传递到电子邮件中的HTML将被切断。

我最初认为,也许我的一个大型连接单元格对于Excel来说太大了,但事实并非如此。我确认即使在包含大量行的情况下,所有值(包括表格格式的内联CSS)都在单个单元格中正确表示。

所以,我编写了一些代码,用这个代码吐出了我的一个大型连接单元格的价值:

` DEBUG TO SAVE HTML BODY TO TEXT FILE
Dim s As String
Dim n As Integer
n = FreeFile()
Open ActiveWorkbook.Path & "\test.txt" For Output As #n
s = Worksheets("ACTIONS").Range("$AA$201").Text
Debug.Print s 
Print #n, s 
Close #n

这很棒,因为它让我可以准确地看到传递到Outlook主体的内容。经过调查,我发现这段代码的长度最多为8222个字符。

这很奇怪,因为该值应该是大约20,000个字符(我只是将单元格值直接从Excel复制并粘贴到代码编辑器中并检查长度)。

这告诉我,有一些Excel问题,或许它只是要快速处理所有20k字符,它会在~8k之后停止?

由于代码被截断,我格式化的表格最终搞砸了,因为<table>标记永远不会被关闭等等。

...

为什么Excel会替换大约20k个字符?无论如何,它似乎停在8k,这让我相信宏只是在它完成之前继续前进。我可以添加一个暂停或其他东西给它时间来完全处理,或者你认为这不会有帮助吗?

2 个答案:

答案 0 :(得分:1)

我的想法是不将整个HTML存储在一个单元格中。相反,你可以构建.HTMLbody。尝试激发这一点:

Dim rng As Range, cl As Range
Dim s As String
Dim mI As MailItem
Dim r As Range
Set rng = Selection

with mI
.htmlBody = "<table>"
For Each r In rng.Rows
    .htmlBody = .htmlBody & vbNewLine & "<tr>"
    For Each cl In r.Cells
        .htmlBody = .htmlBody & "<th>" & cl.Value & "</th>"
    Next cl
    .htmlBody = .htmlBody & vbNewLine & "</tr>"
Next r
.htmlBody = htmlBody & "</table>"
end with
End Sub

此代码将逐行构建您的表。当然,您应该以更详细的方式设置rng范围,我只是使用选择进行测试。

答案 1 :(得分:0)

以为我会回应自己,因为我想出了如何以一种令人讨厌的方式解决它。对于那些发现这一点的人来说,MarcinSzaleniec的答案可能是正确的方法,如果你正在写一个宏并且有这个问题。

话虽如此,我添加了一行让VBA从我的表中连接HTML,而不是依赖于Excel公式:

responsetable = Join(Application.Transpose(Range("AA10:AA200")), "")

通过responsetable函数将replace插入到我的电子邮件中

Replace(.htmlBody, "#responsetable#", responsetable)