0

我希望你做得很好。

我正在使用此代码在 VBA Excel 中发送电子邮件,但它只能工作一次,然后我必须在任务管理器上关闭 Outlook。如果我不这样做,我会收到一条消息“Microsoft Excel 正在等待另一个应用程序完成 OLE 操作”。我唯一需要做的就是关闭任务管理器上的 Outlook 应用程序,然后它就可以正常工作了。

你能帮我解决这个问题吗?下面我将发布我的代码

Dim email As Outlook.MailItem
Dim direc As String
Dim body As String
Set A = New Outlook.Application

For i = 2 To ActiveSheet.Cells(Rows.Count, 16).End(xlUp).Row
direc = Worksheets("NewSheet").Cells(i, 16).Value

Set email = A.CreateItem(emailItem)
    With email
    direc = Worksheets("NewSheet").Cells(i, 16).Value
        If (direc <> "0") Then
            .To = direc
            .Subject = "Notification Test"
            body = Worksheets("NewSheet").Cells(i, 14)
            .HTMLBody = "<HTML><BODY style=font-size:11pt;font-family:Calibri>This is a notification reminder to let you know that you have <b>" & body & "</b> open contact(s) that you must Update</BODY><br><br>Best Regards, </br></br><br> Anonymous </br></HTML>"
            .Display
            .Send
        End If
    End With
Next i

非常感谢您的时间和帮助。

4

2 回答 2

2

不要同时调用DisplaySend。摆脱显示线。

于 2021-09-02T17:24:24.457 回答
1

我建议尝试在 Outlook VBA 环境中运行代码,以确保问题与发送电子邮件时的安全问题无关。事实上,当使用自动化调用受保护的属性或方法时,Outlook 对象模型会产生安全问题或向用户提供安全提示。或者只是可以尝试调用Save而不是Send通过以下方式:

Set email = A.CreateItem(emailItem)
    With email
    direc = Worksheets("NewSheet").Cells(i, 16).Value
        If (direc <> "0") Then
            .To = direc
            .Subject = "Notification Test"
            body = Worksheets("NewSheet").Cells(i, 14)
            .HTMLBody = "<HTML><BODY style=font-size:11pt;font-family:Calibri>This is a notification reminder to let you know that you have <b>" & body & "</b> open contact(s) that you must Update</BODY><br><br>Best Regards, </br></br><br> Anonymous </br></HTML>"
            .Save
        End If
    End With
Next i

如果此代码正常工作,那么就是安全问题。

当您尝试自动化 Outlook 时,该Send方法可能会引发异常。在这种情况下,您很可能面临 Outlook 安全问题。如果您尝试访问任何受保护的属性或方法,它也可能是 Outlook 发出的提示。但在您的情况下,这可能是异常或错误。您会收到安全提示/异常,因为 Outlook 是通过以下方式之一在客户端计算机上配置的:

  • 使用默认的 Outlook 安全设置(即未设置组策略)
  • 使用组策略定义的安全设置,但未应用编程访问策略
  • 使用由组策略定义的安全设置,该设置在防病毒软件处于非活动状态或过期时发出警告

如果系统上安装了任何最新的防病毒软件,您可以创建一个组策略以防止显示安全提示,或者只是关闭这些警告(这不是真正推荐的)。

在 Outlook 对象模型的安全行为一文中阅读有关此内容的更多信息。

您也可以考虑使用构建 Outlook 且不会产生安全问题的低级代码 - 扩展 MAPI。考虑使用围绕该 API 的任何第三方包装器,例如Redemption

另一个选项是Outlook 安全管理器,它允许在运行时即时抑制 Outlook 安全问题。

于 2021-09-02T20:54:06.290 回答