2016-06-21 17 views
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 
+0

检查是失败的项目的oMail.Class。 43类是“常规”邮件项目。您可能会收到意想不到的邮件项目(例如约会或其他内容),这些邮件项目没有您尝试使用的属性。 –

+0

我想过,但这些都是普通邮件。另外,那些失败的将在宏的第二或第三次运行中设置得很好,因此它们具有属性。我在想这可能与“加载”邮件项目有关,因为它在正确加载之前无法查看属性?我不确定。 – ElectronicDrug

+0

如果你怀疑这一点,你可以从最后循环到后退。例如。获取物品的数量,并使用步骤-1。 –

回答

0

我能够通过采取瑞安Wildry的建议在上述评论让这个一贯的工作。

我代替我的循环:

Set oFiltered = oParent.Items.Restrict("[unread] = true") 
On Error Resume Next 
For Each oMail In oFiltered 
    oMail.UnRead = False 
Next 

与一个循环,从年底开始迭代:

Set oFiltered = oParent.Items.Restrict("[unread] = true") 
For I = oFiltered.Count To 1 Step -1 
    Set oMail = oFiltered(I) 
    oMail.UnRead = False 
Next 
相关问题