将所有邮件项目标记为已读 - 不包括日历邮件 Items/Requests
Mark All Mail Items As Read - Excluding Calendar Mail Items/Requests
我有四个宏,当它们一起使用时,将扫描我的收件箱及其所有子文件夹并将所有未读邮件标记为已读,不包括日历类型的邮件项目。
这是低效的,因为它遍历每个邮件项目。
我有一个不同的脚本,这不是问题,但是,当它遇到日历类型的邮件项目时失败了。
我正在寻找一种将邮件项上的“搜索”条件组合起来标记为已读的方法。
最初,过滤器是这样完成的:
For Each item In strFolderPath.Items.Restrict("[unread] = true")
item.UnRead = False
Next
如前所述,它在日历类型项目上出错,我绝对会尽最大努力避免 On Error Resume Next
。
当前方式:
For Each objMailItem In currentFolder.Items
If TypeName(objMailItem) <> "MeetingItem" And objMailItem.MessageClass <> "IPM.Schedule.Meeting.Request" Then
objMailItem.UnRead = False
End If
Next
冗长乏味
CallAll
Sub CallAll()
'
Dim InboxFolder As Folder
Dim SubFolder As Folder
Dim Folder As Folder
Dim objInbox As Outlook.MAPIFolder
Set myNamespace = Application.GetNamespace("MAPI")
Set objInbox = myNamespace.GetDefaultFolder(olFolderInbox)
Set InboxFolder = GetFolder(objInbox.FolderPath)
For Each Folder In InboxFolder.Folders
MarkAllRead (Folder.FolderPath)
Next
Set InboxFolder = Nothing
Set Folder = Nothing
End Sub
GetFolder
Function GetFolder(strFolderPath As String) As MAPIFolder
Dim colFolders As Outlook.Folders
Dim objFolder As Outlook.MAPIFolder
Dim arrFolders() As String
Dim i As Long
strFolderPath = Replace(strFolderPath, "\", "")
strFolderPath = Replace(strFolderPath, "/", "\")
arrFolders() = Split(strFolderPath, "\")
Set objFolder = Application.GetNamespace("MAPI").Folders.item(arrFolders(0))
If Not objFolder Is Nothing Then
For i = 1 To UBound(arrFolders)
Set colFolders = objFolder.Folders
Set objFolder = Nothing
Set objFolder = colFolders.item(arrFolders(i))
If objFolder Is Nothing Then
Exit For
End If
Next
End If
Set GetFolder = objFolder
Set colFolders = Nothing
End Function
GetSubFolder
Function GetSubFolders(strFolderPath As String) As Long
Dim WalkResultFolder As Folder
Dim Folder As Folder
Dim item As MailItem
Dim WalkResult As Long
Set WalkResultFolder = GetFolder(strFolderPath)
For Each Folder In WalkResultFolder.Folders
WalkResult = GetSubFolders(Folder.FolderPath)
MarkAllRead (Folder.FolderPath)
Next
Set ResultFolder = Nothing
Set Folder = Nothing
Set item = Nothing
End Function
MarkAllRead
Function MarkAllRead(folderName As String)
'
Dim currentFolder As Folder
Dim objMailItem As MailItem
Set currentFolder = GetFolder(folderName)
For Each objMailItem In currentFolder.Items
Debug.Print "Folder Name: " & currentFolder
Debug.Print "Mail Item: " & objMailItem
If TypeName(objMailItem) <> "MeetingItem" And objMailItem.MessageClass <> "IPM.Schedule.Meeting.Request" Then
objMailItem.UnRead = False
End If
Next
For Each Folder In currentFolder.Folders
MarkAllRead (Folder.FolderPath)
Next
Set WalkResult = Nothing
End Sub
Option Explicit ' Consider this mandatory
' Tools | Options | Editor tab
' Require Variable Declaration
' If desperate declare as Variant
Function MarkAllRead(folderName As String)
Dim SubFolder As Folder
Dim currentFolder As Folder
Dim objItem As Object
Dim objUnreadItems As items
Set currentFolder = GetFolder(folderName)
Debug.Print "Folder Name: " & currentFolder
Set objUnreadItems = currentFolder.items.Restrict("[Unread]=True")
For Each objItem In objUnreadItems
If TypeName(objItem) <> "MeetingItem" Then
Debug.Print "Object Item: " & objItem.Subject
If objItem.MessageClass <> "IPM.Schedule.Meeting.Request" Then
objItem.UnRead = False
End If
End If
Next
For Each SubFolder In currentFolder.folders
MarkAllRead (SubFolder.FolderPath)
Next
End Function
我有四个宏,当它们一起使用时,将扫描我的收件箱及其所有子文件夹并将所有未读邮件标记为已读,不包括日历类型的邮件项目。
这是低效的,因为它遍历每个邮件项目。
我有一个不同的脚本,这不是问题,但是,当它遇到日历类型的邮件项目时失败了。
我正在寻找一种将邮件项上的“搜索”条件组合起来标记为已读的方法。
最初,过滤器是这样完成的:
For Each item In strFolderPath.Items.Restrict("[unread] = true")
item.UnRead = False
Next
如前所述,它在日历类型项目上出错,我绝对会尽最大努力避免 On Error Resume Next
。
当前方式:
For Each objMailItem In currentFolder.Items
If TypeName(objMailItem) <> "MeetingItem" And objMailItem.MessageClass <> "IPM.Schedule.Meeting.Request" Then
objMailItem.UnRead = False
End If
Next
冗长乏味
CallAll
Sub CallAll()
'
Dim InboxFolder As Folder
Dim SubFolder As Folder
Dim Folder As Folder
Dim objInbox As Outlook.MAPIFolder
Set myNamespace = Application.GetNamespace("MAPI")
Set objInbox = myNamespace.GetDefaultFolder(olFolderInbox)
Set InboxFolder = GetFolder(objInbox.FolderPath)
For Each Folder In InboxFolder.Folders
MarkAllRead (Folder.FolderPath)
Next
Set InboxFolder = Nothing
Set Folder = Nothing
End Sub
GetFolder
Function GetFolder(strFolderPath As String) As MAPIFolder
Dim colFolders As Outlook.Folders
Dim objFolder As Outlook.MAPIFolder
Dim arrFolders() As String
Dim i As Long
strFolderPath = Replace(strFolderPath, "\", "")
strFolderPath = Replace(strFolderPath, "/", "\")
arrFolders() = Split(strFolderPath, "\")
Set objFolder = Application.GetNamespace("MAPI").Folders.item(arrFolders(0))
If Not objFolder Is Nothing Then
For i = 1 To UBound(arrFolders)
Set colFolders = objFolder.Folders
Set objFolder = Nothing
Set objFolder = colFolders.item(arrFolders(i))
If objFolder Is Nothing Then
Exit For
End If
Next
End If
Set GetFolder = objFolder
Set colFolders = Nothing
End Function
GetSubFolder
Function GetSubFolders(strFolderPath As String) As Long
Dim WalkResultFolder As Folder
Dim Folder As Folder
Dim item As MailItem
Dim WalkResult As Long
Set WalkResultFolder = GetFolder(strFolderPath)
For Each Folder In WalkResultFolder.Folders
WalkResult = GetSubFolders(Folder.FolderPath)
MarkAllRead (Folder.FolderPath)
Next
Set ResultFolder = Nothing
Set Folder = Nothing
Set item = Nothing
End Function
MarkAllRead
Function MarkAllRead(folderName As String)
'
Dim currentFolder As Folder
Dim objMailItem As MailItem
Set currentFolder = GetFolder(folderName)
For Each objMailItem In currentFolder.Items
Debug.Print "Folder Name: " & currentFolder
Debug.Print "Mail Item: " & objMailItem
If TypeName(objMailItem) <> "MeetingItem" And objMailItem.MessageClass <> "IPM.Schedule.Meeting.Request" Then
objMailItem.UnRead = False
End If
Next
For Each Folder In currentFolder.Folders
MarkAllRead (Folder.FolderPath)
Next
Set WalkResult = Nothing
End Sub
Option Explicit ' Consider this mandatory
' Tools | Options | Editor tab
' Require Variable Declaration
' If desperate declare as Variant
Function MarkAllRead(folderName As String)
Dim SubFolder As Folder
Dim currentFolder As Folder
Dim objItem As Object
Dim objUnreadItems As items
Set currentFolder = GetFolder(folderName)
Debug.Print "Folder Name: " & currentFolder
Set objUnreadItems = currentFolder.items.Restrict("[Unread]=True")
For Each objItem In objUnreadItems
If TypeName(objItem) <> "MeetingItem" Then
Debug.Print "Object Item: " & objItem.Subject
If objItem.MessageClass <> "IPM.Schedule.Meeting.Request" Then
objItem.UnRead = False
End If
End If
Next
For Each SubFolder In currentFolder.folders
MarkAllRead (SubFolder.FolderPath)
Next
End Function