VBA 调用 Lotus 发送邮件的收件人长度问题

作者: , 共 1737 字 , 共阅读 0

公司使用 Lotus ,我每天都通过 Excel 编写 VBA 代码自动调用 Lotus 发送邮件,发现一个奇怪的现象。一般我们通过下面的 VBA 代码指定邮件收件人:

.SendTo = "a1@b.com;  a2@b.com; a3@b.com;"

但需要上面这个收件人列表不能超过 256 个字节,否则会被截断,从而丢失一部分收件人。

这个问题可以被解决。Lotus 的收件人列表不光可以是字符串,还可以是字符串数组。所以下面这么写也是可以的:

.SendTo = Array("a1@b.com",  "a2@b.com",  "a3@b.com")

字符串数组里每一个字符串可以是多个接收人,但每个单独的字符串都不能超过 256 个字节,否则一样会被截断:

.SendTo = Array("a1@b.com; a2@b.com",  "a3@b.com")  ' it's OK too

通常我们会把收件人保存在 Excel 的某个单元格中,不同收件人之间用分号「;」隔开。这时候我们可以这样调用:

.SendTo = Array(Split(Sheet1.range("A1").value(), ";"))

可一劳永逸解决字符串阶段问题。

另:

VBA 中字符串被截断的问题不光发生在 Lotus 的接收人列表中,我很早就发现通过 VBA 修改 Excel 的数据连接字符串和 SQL 查询语句的时,字符串长度也不能超过 256 字节,一旦超过,需要用上面一样的办法解决,将字符串转成字符串数组:

' 更改数据表的来源
' wb:工作表对象
' connectionName:数据来源连接名称
' strSQL:新查询语句(修改SQL的查询代码)
' strSQLConnection:新连接语句(修改来源数据库,在对DBF数据库操作时非常有用)
' author: zhang@zhiqiang.org, 2010
Public Sub ChangeODBCConnection(wb As Excel.Workbook, connectionName As String, _
                                Optional strSQL As String = "", Optional strSQLConnection As String = "")

    With wb.Connections(connectionName).OLEDBConnection
        If Len(strSQLConnection) Then .Connection = SplitString(strSQLConnection) ' here
        If Len(strSQL) Then .CommandText = SplitString(strSQL) ' here
    End With
    wb.Connections(connectionName).Refresh
End Sub

' 将字符串分割成短字符串的数组
Function SplitString(ByVal s As String) As Variant
    Dim ss() As Variant
    Dim i As Long

    ReDim ss(0 To Len(s) \ 200)        ' note: it is not 256
    For i = 0 To UBound(ss)
        ss(i) = Array(mid(s, i * 200 + 1, 200))
    Next i

    SplitString = ss
End Function

Q. E. D.

类似文章:
Excel 有一个很有用的功能是直接导入外部数据库或者使用外部数据源建立数据透视表和数据透视图。但比较可惜的是,这个数据源的查询语句是静态的,它无法根据日期自动修改(比如在应用中,我们希望每天获取的外部数据都是当天最新的数据),下面两个函数是修改外部数据源的 VBA 代码,调用它们就可以建立动态的数据源。
以前发过一个编辑和发送 Outlook 邮件的 Excel/VBA 脚本。最近公司不让用 Outlook ,强制使用 IBM Lotus Notes ,我又写了一个编辑和发送 Lotus 邮件的 VBA 脚本。
编程 » Excel, VBA
VBA 的 Date 类型比较奇怪。
2014-03-25 更新:我已经将该类修改成函数形式,并增加新功能,参见更新 Excel 的数据库查询函数库
编程 » vbs, 办公自动化
工作中或多或少有些琐碎的事情,比如每天要发送和接受数据,很多是通过邮件的方式传递的。之前写过如何在 Outlook 里自动保存附件,这里再发一个如何更方便地发送带附件的邮件。
更新一下之前写的Excel 的数据库类,将其改成函数的形式,调用更简单(省却了生成类实例的步骤)。现在这个代码在工作中用了一年多,已经比较健壮。若有问题,请留言指出或与我联系。
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
编程 » Excel, VBA
某些时候需要打开 Excel 文件来获取或者写入数据,但又不希望跳出打开的 Excel 文件窗口,可以用下面的代码:
编程 » Excel, VBA
最近学到一招,效果不错~
如果一个日期(或者时间),如果用字符串,比如"2010-10-04"的形式,各个系统都没有什么区别。在某些时候,将日期用数字表示,将大大增加对日期查找、比较的效率。而如果用数字来表示日期,在不同的系统之间差别就大了。
之前写过一篇文章介绍个人所得税中的二逼年终奖扣税方法,其实中国的个人所得税的奇葩之处不只这一点,利息税也是其中的一种。
编程 » Matlab
Matlab 在启动时会自动运行脚本startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如