我正在开发一个VBA程序,该程序将在Outlook中为新到达的电子邮件触发。 (标准设置在Outlook的“规则和警报”中。)
预计电子邮件将包含: -
“subject”字段包含:“WO_name / Task_name”
“身体”的第一行包括:“操作”
“String_1”,“String_2”,“String_3”和发件人的电子邮件地址将被送入批处理文件(总共4个参数)
这是我的代码:
Sub ChangeSubjectThenSend(Item As Outlook.MailItem)
WO = readCommand(Item.Subject, 1)
Task = readCommand(Item.Subject, 2)
Dim olItem As Outlook.MailItem
Dim sText As String
For Each olItem In Application.ActiveExplorer.Selection
sText = olItem.Body
Next olItem
Shell ("C:\warehouse\WO\checkInOutTask\taskOperations.bat " & WO & " " & Task & " " & Item.SenderEmailAddress & " " & sText), vbNormalFocus
End Sub
Public Function readCommand(str As String, position As Integer) As String
Dim Tempstr() As String
If position >= 1 Then
Tempstr = Split(str, "/")
readCommand = Tempstr(position - 1)
End If
End Function
它提供当前在Outlook中选择的电子邮件条目的内容,而不是新收到的电子邮件。
如何让脚本针对新到的电子邮件运行?
答案 0 :(得分:1)
当您打开Outlook Visual Basic编辑器时,您将看到的最小项目浏览器是:
如果您对“Project1(VbaProject.OTM)”进行加密,它将扩展为:
您的初始视图很可能是表格(如果有)和已扩展的模块。但“Microsoft Office Outlook Objects”可能不会扩展。单击加号以获取:
点击“ThisOutlookSession”选择它,你会得到:
“ThisOutlookSession”就像一个模块,但它有额外的权限。特别是,您可以在此处指定事件例程。你的将是空的,但在这里你可以看到我为你创建的代码。
登录过程完成后,将调用 Private Sub Application_MAPILogonComplete()
。我已经包含了初始化Public WithEvents MyNewItems As Outlook.Items
的代码。由于此初始化,每次将新项目添加到收件箱时都会调用Private Sub myNewItems_ItemAdd(ByVal Item As Object)
。我的代码只是在即时窗口中显示新项目的主题,但是,如果你用你的代码替换我的代码,你应该能够获得你想要的效果。
将以下代码添加到“ThisOutlookSession”,然后退出并重新进入Outlook。无论如何,您可能会收到足够的新电子邮件,但如果没有,请发送一些电子邮件。
Option Explicit
Public WithEvents MyNewItems As Outlook.Items
Private Sub Application_MAPILogonComplete()
Dim NS As NameSpace
Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI")
With NS
Set MyNewItems = NS.GetDefaultFolder(olFolderInbox).Items
End With
End Sub
Private Sub myNewItems_ItemAdd(ByVal Item As Object)
With Item
Debug.Print "Item added to Inbox with Subject: " & .Subject
End With
End Sub
答案 1 :(得分:0)
要将代码应用于新到达的邮件,请不要选择任何内容。
改为使用传入 Item
的 (Item As MailItem)
。
Option Explicit
Sub ChangeSubjectThenSend(Item As MailItem)
WO = readCommand(Item.subject, 1)
Task = readCommand(Item.subject, 2)
Dim sText As String
sText = Item.body
Shell ("C:\warehouse\WO\checkInOutTask\taskOperations.bat " & WO & " " & Task & " " & Item.SenderEmailAddress & " " & sText), vbNormalFocus
End Sub
Public Function readCommand(str As String, position As Long) As String
Dim Tempstr() As String
If position >= 1 Then
Tempstr = Split(str, "/")
readCommand = Tempstr(position - 1)
End If
End Function