1
我在周末和整个星期内通过规则过滤到文件夹中收到4000多封电子邮件。我创建了一个宏将所有这些文件夹标记为已读。但是,对于某些邮件而言,它与runtime error 91 object variable or with block variable not set
错误。标记为读取某些邮件项目上的循环错误不一致
如果我跳过On Error Resume Next
的错误,它会遍历所有内容,但不会将一堆邮件设置为已读。然后,我可以重新运行宏,以获得剩下的大部分。如果我运行这个宏3-4次,它最终会得到它们。
我该如何改进这个宏以便将所有项目一致地标记为已读?
Public Function GetInboxFolderID(FolderName As String) As String
Dim nsp As Outlook.Folder
Dim mpfSubFolder As Outlook.Folder
Dim mpfSubFolder2 As Outlook.Folder
Dim flds As Outlook.Folders
Dim flds2 As Outlook.Folders
Set nsp = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
Set flds = nsp.Folders
Set mpfSubFolder = flds.GetFirst
Do While Not mpfSubFolder Is Nothing
If mpfSubFolder.Name = FolderName Then
GetInboxFolderID = mpfSubFolder.EntryID
Exit Function
End If
Set flds2 = mpfSubFolder.Folders
Set mpfSubFolder2 = flds2.GetFirst
Do While Not mpfSubFolder2 Is Nothing
If mpfSubFolder2.Name = FolderName Then
GetInboxFolderID = mpfSubFolder2.EntryID
Exit Function
End If
Set mpfSubFolder2 = flds2.GetNext
Loop
Set mpfSubFolder = flds.GetNext
Loop
End Function
Private Sub processFolder(ByVal oParent As Outlook.MAPIFolder)
Dim oFolder As Outlook.MAPIFolder
Dim oMail As Outlook.MailItem
Dim oFiltered As Outlook.Items
Set oFiltered = oParent.Items.Restrict("[unread] = true")
On Error Resume Next
For Each oMail In oFiltered
oMail.UnRead = False
Next
If (oParent.Folders.Count > 0) Then
For Each oFolder In oParent.Folders
processFolder oFolder
Next
End If
End Sub
Public Sub markNocAsRead()
Dim SubFolder As MAPIFolder
Set SubFolder = Session.GetDefaultFolder(olFolderCalendar).Parent.Folders("NOC Alerts")
'Application.Session.GetFolderFromID (GetInboxFolderID("NOC Alerts"))
Call processFolder(SubFolder)
End Sub
检查是失败的项目的oMail.Class。 43类是“常规”邮件项目。您可能会收到意想不到的邮件项目(例如约会或其他内容),这些邮件项目没有您尝试使用的属性。 –
我想过,但这些都是普通邮件。另外,那些失败的将在宏的第二或第三次运行中设置得很好,因此它们具有属性。我在想这可能与“加载”邮件项目有关,因为它在正确加载之前无法查看属性?我不确定。 – ElectronicDrug
如果你怀疑这一点,你可以从最后循环到后退。例如。获取物品的数量,并使用步骤-1。 –