在vba中的outlook邮件中读取excel表

时间:2012-11-29 18:25:19

标签: vba outlook outlook-vba

我正在尝试在我的邮件正文中读取一个表并将其保存在csv文件中(我附上了一个html示例,下面代表我的邮件内容)。我跟着一个相关的帖子:How to read table pasted in outlook message body using vba?但问题是它通过单元格而不是它的行来划分表格,所以不是得到17行一个标题我得到18 x 5 =数组的90个元素...我试图将拆分选项中的分隔符从“vbCrLf”更改为“vbLf”,“vbCr”,Char(10)......但它们都没有工作......任何人都知道为什么拆分不能区分新线的空间分隔符?这似乎是在邮件正文中读取表格的最简单的方法,但如果您有任何其他建议,我也会考虑它!

以下是示例链接:sample

由于

1 个答案:

答案 0 :(得分:1)

我的例程在 Sample.htm 上运行良好,如图所示。我将首先解释这个图像,然后给出两个健康警告。代码超过了30,000个字符的Stack Overflow限制,所以我不能包含它。如果这很有趣,请查看我的个人资料,您可以在其中找到电子邮件地址。给我发电子邮件,我会发给你代码。

Output from macro

图像和粗糙数组的说明

此映像背后的例程旨在从网页中的表中提取数据并将其写入单个不规则数组。图像中的工作表是通过将不规则数组复制到它来创建的。我使用了象牙的背景来显示哪些细胞处于不规则的阵列中。 (注意:一个参差不齐的数组是行中列数不同的数组。)

Sample.htm 包含一个表,它就像它们一样简单。我不会从Html的复杂性中猜到这一点。

我的例程忽略了<table></table>之外的任何内容。在<table></table>内,它识别表格的元素。单元格内的任何空格(<td></td>)都会成为符合Html规则的单个空格。 <p>由两个换行符替换,<br>由一个换行符替换。除了表格元素之外的任何标记都将被丢弃,因此:Normal <b>bold</b> <i>italic</i>变为Normal bold italic。属性被忽略。完成一个<table></table>后,例程会查找另一个例程。例程处理嵌套表。字符实体(例如&#34;&amp; amp;&#34;)将转换为等效的unicode字符(例如&#34;&amp;&#34;)。例程不处理表定义中的错误;一切都必须正确嵌套,没有省略结束标记。

参差不齐的数组的第1行是 Sample.htm 中第一个(在这种情况下只是)表的标题。其内容如下:

1  20  5  0  0  2

1表示这是一级表。嵌套在该表的单元格中的表将是第二级。嵌套在二级表中的表将是第三级,依此类推。

每行有20行,最多5列。第一个零意味着没有标题部分。第二个零意味着没有页脚部分。这两个意味着第一个(在这种情况下只是)主体部分从不规则数组的第2行开始。如果有多个主体部分,那么在2之后会有其他行数。

接下来的20行参差不齐的数组是表格的数据行,每行最多包含5列。

在第2行中,只有A列是象牙。 Html表的那一行只包含一个单元格。该单元格具有colspan属性,因此单元格扩展到Html表的所有五列。 colspan属性的存在和值不包含在参差不齐的数组中,尽管可以从缺少单元格中推导出colspanrowspan属性的存在。警告:此例程隐藏了调用例程中Html的复杂性。它并没有掩盖表格的复杂性。幸运的是,您的表格很简单,只有一个colspan属性。

Html表的第2行 - 参差不齐的数组的第3行和工作表 - 有5个空单元格。

剩下的细胞几乎与它们在粗糙阵列中出现的完全一样。由于Html中单元格定义的复杂性,有些换行符已成为数据中的空间。单元格数据位于<p></p>之内,该数据已成为数据中的LineFeed LineFeed。我已经在调用例程中添加了定制代码来丢弃空格和换行符。

健康警告1

以下例程并不是您要求的。代码在Excel工作簿中进行了测试,Sample.htm与工作簿位于同一文件夹中。您可以创建一个例程来将所需消息的Html主体保存为Html文件,也可以将此代码移动到Outlook并调整它以从Outlook写入Excel。关于这两个选项,有关于编码答案的问题。我可以为你推荐其他答案,但我认为这个答案足够大了。

健康警告2

以下代码包括:

  • 我为你写的一个微小的定制宏来展示我的日常生活。
  • 由Dick Kusleika编写并在Stack Overflow上发表的例程,我不能更好。
  • 我为我写的一些例程。

健康警告是我为我写的例程。

我不经常使用这些例程,所以评论是提醒我如何使用它们。它们并非旨在帮助其他人了解他们的所作所为。

我将Debug.Assert False ' Not tested放在代码的每条路径的顶部,然后在测试该路径时将这些语句注释掉。如果您请求代码,您将看到我没有测试所有路径。除了一个例外,这些例程适用于我想要解码的网页。例外是作者通过将表格嵌套到五个深度来展示的网站。不幸的是,然后他们将<td></td>弄糊涂了,我的代码也没有处理无效的Html。我在运行我的例程之前更正了网页源代码,因为这对我来说是最简单的。当我对更多的网页感兴趣时,我将测试更多的代码,但因为代码适合我,所以我不会寻找测试用例。如果代码落后于你,请给我发电子邮件html文件,我会看到我能做什么。

我编写了这些例程,因为它们处理Excel无法处理的复杂Html。我建议你在 Sample.htm 上试用Excel。真正的Html非常简单,所以如果Excel可以忽略格式,它可以导入这个文件。