Я решил это.Вы не должны использовать Items
в цикле For Each
и в то же время .Move
его элементы.Это похоже на изменение коллекции циклов в C#
.Единственное отличие состоит в том, что C#
создает приятное исключение, в то время как VBA
просто уменьшает количество элементов, а затем просто останавливается: -o
Вместо этого я использовал Do While
и два счетчика.Один, который считает обработанные элементы, а другой - текущий индекс для Items
.Теперь он обрабатывает все.
Sub CleanUpInbox2()
' ... other variables
Dim processCount As Integer
Dim itemIndex As Integer: itemIndex = 1
Dim itemCount As Integer: itemCount = inbox.Items.Count
Do While processCount < itemCount
processCount = processCount + 1
Set mail = inbox.Items(itemIndex)
' ... body
If LinqAll(False, isPinned, isTTYL) Then
Debug.Print mail.Subject
mail.Move archive
moveCount = moveCount + 1
Else
itemIndex = itemIndex + 1
End If
bang:
Debug.Print "bang!"
Debug.Print Err.Description
continue:
Loop
Debug.Print "Emails processed: " & processCount
Debug.Print "Emails moved: " & moveCount
End Sub
Сначала я попытался скопировать Items
, но мне это не удалось (очевидно, new Outlook.Items
) нет, поэтому я использую индексы.