【问题标题】:Sending ActiveWorkbook as an attachment in email将 ActiveWorkbook 作为电子邮件附件发送
【发布时间】:2023-03-23 06:07:01
【问题描述】:

我的代码可以多次保存文件,第二次保存为 .xlsx 文件,以便在没有开发人员选项卡中的 VBA 代码的情况下向外部发送。

在测试中,当几个人尝试使用该文件时,它可以工作,但在当天晚些时候或第二天等情况下它不起作用,并且没有任何改变。我正在使用最新的 Office 套件。

在下面的代码中,xxx代表私人信息。

Sub SubmitRequest()

Dim OlApp As Object
Dim NewMail As Object
Dim sMsgBody As String

If IsEmpty(Worksheets("Data").Range("A8")) = True Then
    'Cell A8 is not blank
    MsgBox "xxx", vbOKOnly + vbQuestion
    
Else

    Application.ScreenUpdating = False
    
    ActiveWorkbook.Save
    'SaveAsXSLX() to remove code and send externally, works fine
    Worksheets(Array("xx", "xxx")).Copy
    ActiveWorkbook.SaveAs Filename:="xxx"
    Application.DisplayAlerts = True
      
    Set OlApp = CreateObject("Outlook.Application")
    Set NewMail = OlApp.CreateItem(0)
    
    On Error Resume Next
    With NewMail
        .to = "xxx@xxx"
        .CC = "xxx@xxx"
        .ReplyRecipients.Add "xxx.xxx"
        .BCC = ""
        .Subject = "xxx@xxx"
        .Attachments.Add ActiveWorkbook.FullName

        sMsgBody = "Hi xxx," & vbCr & vbCr
        sMsgBody = sMsgBody & "xxx?" & vbCr
        sMsgBody = sMsgBody & "xxx," & vbCr & vbCr
    
        .body = sMsgBody
        .Send
        
        End With
    On Error GoTo 0

    Set NewMail = Nothing
    Set OlApp = Nothing
    
    Application.ScreenUpdating = True
   
    MsgBox "xxx" & Worksheets("Data").Range("H4").Value

    'Save and close request
    ActiveWorkbook.Close SaveChanges:=True
    Application.DisplayAlerts = False
    
    Application.Quit
    
End If
End Sub

【问题讨论】:

  • "does not work" 不是有用的错误描述。您需要解释您的代码有什么问题以及您在哪一行中遇到了哪些错误。或者,如果没有错误,则说明与预期行为相比的实际行为。

标签: excel vba email outlook


【解决方案1】:

每当使用多个工作簿时,请确保明确调用它们。例如在Worksheets("Data").Range("A8") 中,没有定义工作表Data 是在哪个工作簿中。所以 Excel 需要做出猜测,这就是它可能出错的地方。

如果您使用ThisWorkbook.Worksheets("Data").Range("A8"),那么您不会给 Excel 猜测的空间。


还要确保您知道以下 2 个语句之间的区别:

  • ThisWorkbook 是编写代码的工作簿。这永远不会改变。
  • ActiveWorkbook 是具有焦点的工作簿(位于顶部)。这将通过任何鼠标单击或其他任何改变焦点的方式轻松更改。

因此,我建议您在真正需要使用ActiveWorkbook 时确保将其设置为变量,以免用户单击或其他方式对其进行更改。


然后您的程序结束时有一个Application.Quit。这将关闭整个 Excel 应用程序。不确定这是否是您想要的。


考虑到所有这些,您的代码将如下所示:

Option Explicit

Public Sub SubmitRequest()
    If IsEmpty(ThisWorkbook.Worksheets("Data").Range("A8")) Then
        'Cell A8 is not blank
        MsgBox "xxx", vbOKOnly + vbQuestion
    Else
        Application.ScreenUpdating = False

        ThisWorkbook.Save
        'SaveAsXSLX() to remove code and send externally, works fine
        ThisWorkbook.Worksheets(Array("xx", "xxx")).Copy

        Dim NewWb As Workbook 'get the new workbook set to a variable so we fix it
        Set NewWb = ActiveWorkbook
        NewWb.SaveAs Filename:="xxx"
        Application.DisplayAlerts = True

        Dim OlApp As Object
        Set OlApp = CreateObject("Outlook.Application")

        Dim NewMail As Object
        Set NewMail = OlApp.CreateItem(0)

        On Error Resume Next
        With NewMail
            .to = "xxx@xxx"
            .CC = "xxx@xxx"
            .ReplyRecipients.Add "xxx.xxx"
            .BCC = ""
            .Subject = "xxx@xxx"
            .Attachments.Add NewWb.FullName

            Dim sMsgBody As String
            sMsgBody = "Hi xxx," & vbCr & vbCr & _
                       "xxx?" & vbCr & _
                       "xxx," & vbCr & vbCr
            .body = sMsgBody

            .Send
        End With
        On Error GoTo 0

        Set NewMail = Nothing
        Set OlApp = Nothing

        Application.ScreenUpdating = True

        MsgBox "xxx" & ThisWorkbook.Worksheets("Data").Range("H4").Value

        'Save and close request
        NewWb.Close SaveChanges:=True

        Application.DisplayAlerts = False

        Application.Quit 'this will quit Excel completely. Are you sure?
    End If
End Sub

最后,您应该考虑某种错误报告。因为现在如果在On Error Resume NextOn Error GoTo 0 之间发生错误,您将永远不会注意到,因为所有错误都会被静音。因此,如果发生错误,它不会通知您,而是什么都不做。
查看VBA Error Handling – A Complete Guide

【讨论】:

  • 感谢您的回复-抱歉我不清楚,代码一直运行到最后但没有发送电子邮件,我在某些情况下删除了屏幕更新以检查错误,但没有发生在创建/打开 Outlook 以发送电子邮件方面。我将查看活动工作簿 - 我之前已经输入了关闭除此之外的所有其他工作簿的代码,以确保没有错误发送,但是您上面提到的方式将使 defs 使其更加健壮。不工作是电子邮件根本没有发送,或者甚至没有打开 Outlook。
  • @T_M_ 然后删除 On Error Resume Next 以查看您的错误。此行隐藏所有错误消息。您无法调试包含此行的代码。
  • 当我删除错误时,代码在“.send”行停止,并显示错误消息“操作失败。消息传递接口返回未知错误。如果问题仍然存在,请重新启动 Outlook . Outlook无法识别多个名称中的一个。我已经重新启动了PC和Outlook几次。仍然是同样的问题。只是让我感到困惑,因为它有时会起作用。我一直在使用相同的两个电子邮件地址,都是内部的.
  • @T_M_ 好吧,首先您知道从不忽略错误报告是多么重要! • 实际上,这看起来不像是代码问题,而是一般的 Outlook 问题。结帐:google.com/…。 • 您的 Outlook 似乎有问题。
  • 终于到了,感谢您的帮助。是“.ReplyRecipients.Add“xxx.xxx”导致了一个问题,因为当每个电子邮件地址需要一个新行时,我尝试放置多个电子邮件地址。再次感谢将在再次使用代码时牢记上述内容。
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多