仅在指定邮件主题时才执行宏
Execute macro only if specific mail subject is given
我编写了一个宏,只要邮件主题包含特定单词,它就会将收到的邮件的内容提取到 excel sheet 中。总而言之,它的工作原理是,宏的第一部分在我收到邮件后立即执行(无论邮件的主题是什么)。这导致我每次收到邮件时都会在 outlook 中弹出 window,但我只希望它在收到包含特定主题内容的邮件时弹出。具体的,我必须为以下行找到另一个解决方案:
If TypeName(item) = "MailItem" Then Set olMail = item
完整代码如下:
Private Sub olItems_ItemAdd(ByVal item As Object)
'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim oxLApp As Object, oxLwb As Object, oxLws As Object
Set oxLApp = GetObject(, "Excel.Application")
Set oxLwb = oxLApp.Workbooks.Open _
("C:\Users\A2000\Desktop\Makros_NewScoping")
Set oxLws = oxLwb.Sheets("Slide 3")
'Prüfen ob Item eine Mail ist
If TypeName(item) = "MailItem" Then
Set olMail = item
If InStr(olMail.Subject, "APPROVAL REQUIRED") And _
olMail.SenderName = "Test, Name" Then
With oxLws
.Range("Q24") = olMail.VotingResponse
.Range("E41") = olMail.Body
End With
End If
您需要将打开 Excel 的代码移动到检查服务器和主题的 If
语句下方。
如果收到的邮件不符合您的条件,则无需 运行 任何额外代码:
Private Sub olItems_ItemAdd(ByVal item As Object)
'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim oxLApp As Object, oxLwb As Object, oxLws As Object
'Prüfen ob Item eine Mail ist
If TypeName(item) = "MailItem" Then
Set olMail = item
If InStr(olMail.Subject, "APPROVAL REQUIRED") And _
olMail.SenderName = "Test, Name" Then
Set oxLApp = GetObject(, "Excel.Application")
Set oxLwb = oxLApp.Workbooks.Open _
("C:\Users\A2000\Desktop\Makros_NewScoping")
Set oxLws = oxLwb.Sheets("Slide 3")
With oxLws
.Range("Q24") = olMail.VotingResponse
.Range("E41") = olMail.Body
End With
End If
请注意,每次将新项目添加到文件夹时都创建一个新的 Excel 实例并不是一个好主意。此外,ItemAdd 事件不仅针对传入电子邮件触发,而且针对移动到文件夹的每封电子邮件触发。因此,当项目移动到文件夹时,您将触发代码。
这就是为什么我建议处理 Application
class 的 NewMailEx
事件。对于 Microsoft Outlook 处理的每个接收项目,此事件都会触发一次。该项目可以是几种不同项目类型中的一种,例如 MailItem
、MeetingItem
或 SharingItem
。 EntryIDsCollection
字符串包含对应于该项目的条目 ID。使用 EntryIDCollection
字符串表示的条目 ID 调用 NameSpace.GetItemFromID 方法并处理项目。
我编写了一个宏,只要邮件主题包含特定单词,它就会将收到的邮件的内容提取到 excel sheet 中。总而言之,它的工作原理是,宏的第一部分在我收到邮件后立即执行(无论邮件的主题是什么)。这导致我每次收到邮件时都会在 outlook 中弹出 window,但我只希望它在收到包含特定主题内容的邮件时弹出。具体的,我必须为以下行找到另一个解决方案:
If TypeName(item) = "MailItem" Then Set olMail = item
完整代码如下:
Private Sub olItems_ItemAdd(ByVal item As Object)
'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim oxLApp As Object, oxLwb As Object, oxLws As Object
Set oxLApp = GetObject(, "Excel.Application")
Set oxLwb = oxLApp.Workbooks.Open _
("C:\Users\A2000\Desktop\Makros_NewScoping")
Set oxLws = oxLwb.Sheets("Slide 3")
'Prüfen ob Item eine Mail ist
If TypeName(item) = "MailItem" Then
Set olMail = item
If InStr(olMail.Subject, "APPROVAL REQUIRED") And _
olMail.SenderName = "Test, Name" Then
With oxLws
.Range("Q24") = olMail.VotingResponse
.Range("E41") = olMail.Body
End With
End If
您需要将打开 Excel 的代码移动到检查服务器和主题的 If
语句下方。
如果收到的邮件不符合您的条件,则无需 运行 任何额外代码:
Private Sub olItems_ItemAdd(ByVal item As Object)
'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim oxLApp As Object, oxLwb As Object, oxLws As Object
'Prüfen ob Item eine Mail ist
If TypeName(item) = "MailItem" Then
Set olMail = item
If InStr(olMail.Subject, "APPROVAL REQUIRED") And _
olMail.SenderName = "Test, Name" Then
Set oxLApp = GetObject(, "Excel.Application")
Set oxLwb = oxLApp.Workbooks.Open _
("C:\Users\A2000\Desktop\Makros_NewScoping")
Set oxLws = oxLwb.Sheets("Slide 3")
With oxLws
.Range("Q24") = olMail.VotingResponse
.Range("E41") = olMail.Body
End With
End If
请注意,每次将新项目添加到文件夹时都创建一个新的 Excel 实例并不是一个好主意。此外,ItemAdd 事件不仅针对传入电子邮件触发,而且针对移动到文件夹的每封电子邮件触发。因此,当项目移动到文件夹时,您将触发代码。
这就是为什么我建议处理 Application
class 的 NewMailEx
事件。对于 Microsoft Outlook 处理的每个接收项目,此事件都会触发一次。该项目可以是几种不同项目类型中的一种,例如 MailItem
、MeetingItem
或 SharingItem
。 EntryIDsCollection
字符串包含对应于该项目的条目 ID。使用 EntryIDCollection
字符串表示的条目 ID 调用 NameSpace.GetItemFromID 方法并处理项目。