Word:VBA录制的宏给出运行时错误

Word: VBA recorded macro gives runtime error

提问人:Hal Egbert 提问时间:11/13/2023 最后编辑:FunThomasHal Egbert 更新时间:11/13/2023 访问量:56

问:

我每天有两三个非常简单的 word 文档,我做一个邮件合并以将文档从 Excel 发送到地址。非常简单的邮件,开始邮件合并 - 电子邮件,选择数据源 - xlsm 文件,清理行为并发送。非常简单。但是,单击一个按钮会更容易!记录了操作的 vba 宏。录制完成后,单击按钮启动宏,收到此运行时错误:“通过邮件或传真 没有有效的邮件地址。选择“设置”按钮以选择邮件 地址数据字段。尝试了几次,是什么导致了错误,如何解决?突出显示的错误步骤:“执行暂停:=False” 来自记录的代码:

Sub sendMailSheet1()
'
' sendMail Macro
'
'
'MsgBox "In Sheets1"
    ActiveDocument.MailMerge.MainDocumentType = wdEMail
    ActiveDocument.MailMerge.OpenDataSource Name:= _
        "C:\Users\Hal 1GB M2\Documents\MyEmailer.xlsm", ConfirmConversions:=False _
        , ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
        PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
        WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
        Connection:= _
        "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=C:\Users\Hal 1GB M2\Documents\MyEmailer.xlsm;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37;Jet OLEDB:Database Lo" _
        , SQLStatement:="SELECT * FROM `Sheet1$`", SQLStatement1:="", SubType:= _
        wdMergeSubTypeAccess
    With ActiveDocument.MailMerge
        .Destination = wdSendToEmail
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = wdDefaultFirstRecord
            .LastRecord = wdDefaultLastRecord
        End With
        .Execute Pause:=False
    End With
End Sub
VBA Windows MS-Word

评论


答:

1赞 jonsson 11/13/2023 #1

合并到电子邮件需要知道数据源中的哪个字段/列包含它应用于发送每封电子邮件的电子邮件地址。

宏记录器不会记录为此所需的代码行。(宏记录器可能是一个有用的起点,但它不会记录所有内容)。在行之后,您需要类似的东西.Destination = wdSendToEmail

    .MailAddressFieldName = "email"

其中,email 是包含电子邮件地址的 Excel 列的确切名称(区分大小写)。

您可能还需要

    .MailFormat = wdMailFormatHTML ' or wdMailFormatPlainText
    .MailSubject = "the text you want as the subject of every email"

评论

0赞 Hal Egbert 11/15/2023
我确实添加了另外两行。但是,我收到同样的错误。格式只有一列数据,“A”。单元格 A1 包含“EmailTo”。我用于上述地址。我需要告诉它,在第一行犹豫,数据直到第二行才开始吗?我想放弃投票,但它不起作用。虽然我相信你给了我很好的好评论。
0赞 Hal Egbert 11/15/2023
另外,在 SQL 的最后一行中,有“SubType:= _ wdMergeSubTypeAccess”,这应该是“Excel”吗?
0赞 jonsson 11/15/2023
@HalEgbert 你能说出“格式只是一列数据”是什么意思吗?从您的描述中,您应该使用 .MailAddressFieldName = “EmailTo”(而不是,例如 = “emailto”。在当前版本的 Windows Word 中,您应该能够将 OpenDataSource 简化为 thisActiveDocument.MailMerge.OpenDataSource Name:= _ “C:\Users\Hal 1GB M2\Documents\MyEmailer.xlsm” , SQLStatement:=“SELECT * FROMSheet1$"
0赞 jonsson 11/15/2023
@HalEgbert,即您根本不需要 Connection 参数。默认情况下,Word 实际上应该使用“HDR=Yes”选项,该选项假定 Excel 工作表的第一行包含列名。是的,看起来您可能必须将子类型更改为 Excel 而不是 Access,但实际上您也不需要该子类型(它是一个遗物,当 Word 使用 OLEDB 从 Excel 获取数据时,它实际上是使用 Access Jet 提供程序来执行此操作,因此该参数值中的“Access”。
0赞 jonsson 11/15/2023
@HalEgbert 如果您的手动连接正常工作,但编程连接不起作用,那么一定存在我尚未发现的问题。(即我在这里尝试复制您的场景的设置工作正常)