运行时错误287.使用Access中的VBA通过Outlook发送电子邮件。

时间:2016-03-31 08:30:18

标签: vba ms-access access-vba outlook-2010

我有一个案例,其中一个用户希望收到有关何时将交付添加到Access数据库的通知。我能想到的最简单的方法是通过Outlook 2010设置自动电子邮件。以下代码就是我所拥有的:

Dim oApp As Outlook.Application
Dim oMail As MailItem
Dim varDnoteRef2 As String
Dim varuser As String
varuser = DLookup("[Employee_Name]", "employees", "[Employee_ID]=" & TempVars!gloggedin)
varDnoteRef2 = DLast("Supplier_Dnote_Ref", "Supplier_Dnotes")

Set oApp = CreateObject("Outlook.application")
Set oMail = oApp.CreateItem(olMailItem)
oMail.Body = "A Delivery Note has been added to the Database by " & varuser & " on " & Now() & "." & _
             vbNewLine & "Delivery Note: " & varDnoteRef2
oMail.Subject = "Automatic Notification: Delivery Note"
oMail.To = "Example@Email.co.uk"
oMail.Send
Set oMail = Nothing
Set oApp = Nothing

当激活代码的人打开Outlook时,此代码可以正常工作。但是,当用户没有启动Outlook时,用户会在oMail.send行收到错误消息。

  

错误#287错误行0应用程序定义的错误或对象定义的错误。

他们得到的是桌面上的一个小图标,它是带有齿轮/齿轮的Outlook符号,并显示another program or application is using outlook的消息。这是我的期望。但为什么发送失败呢?

如何解决此错误/是否有解决方案?

  

编辑(更新)

更奇怪的是,当我使用F8单步执行代码时。有用!! 但是当我从表单操作中调用代码时仍然没有,例如button_on_click

1 个答案:

答案 0 :(得分:1)

这是我以前从未遇到的事情,但是,我找到了解决方案。

错误消息本身让我想知道为什么send命令没有识别定义的应用程序。我质疑代码是否运行得太快。 (我不知道这个灯泡的时刻来自哪里,但它解决了这个问题)。

我只是在发送操作之前插入一个循环来强制延迟。我这样做是因为Access无法识别application.wait

到目前为止测试似乎很成功!

Dim T1 As Variant
Dim T2 As Variant

T1 = Now()
T2 = DateAdd("s", 1, T1)

Do Until T2 <= T1
    T1 = Now()
Loop
oMail.Send

此程序不会经常运行,最多可能每天运行5次。所以我并不担心导致任何实时问题的一秒延迟。