【问题标题】:Outlook blank 'To' field from Excel VBA on some computers某些计算机上 Excel VBA 中的 Outlook 空白“收件人”字段
【发布时间】:2016-03-20 05:04:11
【问题描述】:

我们有一个 Excel 电子表格,用于为潜在客户创建报价单。通过使用 VBA,它生成 PDF 并使用 Outlook 将它们通过电子邮件发送给客户。它从用户填写客户详细信息的主工作表上的单元格中获取客户的电子邮件地址。

几周前,它停止在 Outlook 的“收件人”字段中填写客户的电子邮件地址,尽管它已在主表格中填写。

当我们更改此电子表格上的任何内容(包括代码)时,我们会将其保存为新的“修订版”(保留所有以前的修订版)。回顾以前的修订版,我现在发现它们都不起作用。这很奇怪,因为他们以前肯定做过。我正在使用 Office 2016(虽然我前一段时间升级了,但这个问题是最近才出现的。)运行 Office 2013 的机器也无法正常工作。但是,运行 Office 2007 的机器可以工作。

关于为什么现在这是一个问题以及为什么它只是某些版本的 Office 的问题的任何想法?这是代码的sn-p:

    Private Sub send_as_pdf_Click()
    On Error GoTo ErrMsg
    Dim strPath As String, strFName As String
    Dim OutApp As Object, OutMail As Object

    strPath = Environ$("temp") & "\"

    strFName = Sheets("Quotation").Name & " " & Range("G18") & ".pdf"

    Sheets("Quotation").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        strPath & strFName, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    strPath2 = Environ$("temp") & "\"

    strFName2 = Sheets("Quotation Offer Letter").Name & " " & Range("G18") & ".pdf"

    Sheets("Quotation Offer Letter").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        strPath2 & strFName2, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    strPath3 = Environ$("temp") & "\"

    strFName3 = Sheets("Additional Works Required").Name & " " & Range("G18") & ".pdf"

    Sheets("Additional Works Required").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        strPath3 & strFName3, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    strbody = "<p style='color:#2C3E50;font-family:Calibri;font-size:11pt;'>Hi " & Range("C9") & ",</p>"

    strbody2 = "<p style='color:#2C3E50;font-family:Calibri;font-size:11pt;'>The content of the email goes here.</p>"

    On Error Resume Next
    With OutMail
        .Display
        .To = Range("C19")
        .CC = ""
        .BCC = "first@person.com" & ";" & "second@person.com" & ";" & Range("I6") & ";"
        .Subject = "Quotation"
        .HTMLBody = strbody & strbody2 & .HTMLBody
        .Attachments.Add strPath & strFName
        .Attachments.Add strPath2 & strFName2
        .Attachments.Add strPath3 & strFName3
        .Attachments.Add ("C:\Terms and Conditions of Business of Our Business.pdf")
        .Attachments.Add ("C:\Warranty Statement of Our Business.pdf")
    End With

    Kill strPath & strFName
    On Error GoTo 0
    Set OutMail = Nothing
    Set OutApp = Nothing
Exit Sub

ErrMsg:
MsgBox ("MUST enter Issue Number, Date & Customer Info."), , "Customer Email Error Message"

End Sub

【问题讨论】:

  • 所有其他字段都在填充好吗?只是To 字段?
  • 您可能希望使用您正在使用的工作表引用范围,即.To = Sheets("NameOfSheet").Range("C19") ;)
  • @ScottHoltzman 是的 - 客户的名字正确填充在电子邮件正文中,第三个密件抄送电子邮件地址正确填充(这取决于创建报价的人。)只是“收件人”字段.
  • @R3uK 不幸的是,这不起作用。但是,如果它是活动的,我认为您不需要参考该表。不管怎样,上面的代码直到最近才正常工作。它目前也适用于其他一些机器。
  • @adamcwhite :确实,它隐含在活动工作表上!尽管如此,通常最好完全引用一个范围。我看不到任何其他可能导致问题的东西...您是否尝试将工作机器和非工作机器之间的数据与Debug.Print 进行比较?

标签: vba excel email outlook


【解决方案1】:

试试这个:

注释此行,以便您查看错误所在并进行调试。

'On Error Resume Next

这样做之后,您应该能够在该行中看到错误:

.To = Range("C19")

在 excel 中,这将返回范围的值,但是您将该值发送到另一个应用程序 Outlook,它需要一个字符串。

我把那行改成这样:

.To = Range("C19").Value2

成功了

【讨论】:

  • 这适用于所有机器。我仍然不确定为什么这个问题最近才出现。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多