我在我的Outlook会话上运行了一个VB脚本,它监视每一个新的电子邮件,并在收到特定的电子邮件地址和主题时触发。然后它保存该电子邮件中的附件并触发excel宏运行。
当我测试这个时(通过自己从另一个电子邮件地址发送电子邮件),它可以正常工作。今天早上,我的电脑收到了电子邮件(但计算机被锁定了#34;,Windows 7),但脚本没有被触发。我知道vba应该在后台运行,即使计算机被锁定了,所以我很困惑为什么这个脚本没有触发。
我的VBA脚本是否经常在后台运行,无论计算机是否被锁定?
以下是代码:
触发宏"去"从example@example.com接收电子邮件时,subject =今天
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
'This sub catches every new email (or collection of emails)
Dim intMsgIDStart As Integer, intMsgIDEnd As Integer
Dim strMailItemID As String
Dim cont As Boolean
intMsgIDStart = 1
intMsgIDEnd = InStr(intMsgIDStart, EntryIDCollection, ",")
cont = True
Do
If (intMsgIDEnd > 0) Then
strMailItemID = Strings.Mid(EntryIDCollection, intMsgIDStart, (intMsgIDEnd - intMsgIDStart))
Else
strMailItemID = EntryIDCollection
End If
cont = handleMessage(strMailItemID)
intMsgIDStart = intMsgIDEnd + 1
intMsgIDEnd = InStr(intMsgIDStart, EntryIDCollection, ",")
Loop While intMsgIDEnd <> 0 And cont
End Sub
Public Function handleMessage(strMailItemID As String)
' This function takes an email ID and determines whether it's our pricing sheet email.
' If so, it'll save it to the folder with a common name, pricing.xls
' Finally, it will call on runExcelMacro()
On Error Resume Next
Dim mailItem As Outlook.mailItem
Dim path As String
Dim result As Boolean
result = True
Set mailItem = Application.Session.GetItemFromID(strMailItemID)
If (mailItem.SenderEmailAddress = "example@example.com" And Strings.Mid(mailItem.Subject, 1, 5) = "Today") Then
path = "C:\path\Pricing.xls"
mailItem.Attachments.item(1).SaveAsFile path
Call runExcelMacro("C:\path\Auto.xlsm", "go")
result = False
End If
handleMessage = result
End Function
Public Function runExcelMacro(path As String, macroName As String)
'This function starts a macro
Dim xl As Object
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open (path)
'xl.Visible = False
xl.Run macroName
xl.ActiveWorkbook.Close (True)
xl.Quit
Set xl = Nothing
End Function
也许我需要使用其他设置让VBA始终在后台运行?
谢谢,并且道歉我的问题没有按照我的意愿定义 - 我甚至不确定是什么问题!
干杯,
扎克
答案 0 :(得分:0)
在收件箱中收到新项目时会触发NewMailEx事件。以下是MSDN对该事件的陈述:
但对于具有Exchange Server帐户(非缓存Exchange模式或缓存Exchange模式)的用户,只有在Outlook启动后到达服务器的邮件才会触发该事件。在Outlook启动后立即在缓存Exchange模式下同步的邮件不会触发事件,也不会触发Outlook在非缓存Exchange模式下启动时服务器上已有的邮件。
当新邮件到达收件箱时以及客户端规则处理发生之前,将触发NewMailEx事件。您可以使用EntryIDCollection数组中返回的条目ID来调用NameSpace.GetItemFromID方法并处理该项。 谨慎使用此方法,以尽量减少对Outlook性能的影响。
无论如何,我建议改为制定规则。然后,您可以将VBA子分配给规则。 VBA子应该如下所示:
public sub TEST(mail as MailItem)
' do whatever you need
end sub
其中邮件对象表示传入的Outlook项目。正如您所看到的,不需要使用GetItemFromId方法以编程方式获取传入的邮件项。
path = "C:\path\Pricing.xls"
另外,我建议您选择其他驱动器来保存附件。在最近的操作系统中,C:驱动器需要管理员权限才能写入。