Я пытаюсь написать макрос, который запрашивает у конечного пользователя число, а затем очищает папку «Удаленные» от всего, что старше указанного количества дней.
Приведенный ниже код работает, если я меняю папку на «Входящие» или «Отправленные».
Я пробовал oItems.Item(i).ReceivedTime и получаю то же сообщение об ошибке.
Sub ClearDeletedItems()
Dim oDeletedItems As Outlook.Folder
Dim oFolders As Outlook.Folders
Dim oItems As Outlook.Items
Dim i As Long
Set oDeletedItems =
Application.Session.GetDefaultFolder(olFolderDeletedItems)
Set oItems = oDeletedItems.Items
days = CInt(InputBox("How many days of Deleted Items do you want to
keep?"))
For i = oItems.Count To 1 Step -1
If DateDiff("d", oItems.Item(i).SentOn, Now) > days Then
oItems.Item(i).Delete
End If
Next
End Sub
Я получаю сообщение об ошибке 438 — объект не поддерживает это свойство или метод.
Вы получаете эту ошибку в тестовой среде, где вы знаете, что папка DeletedItems содержит только сообщения электронной почты? Я не связывался с Outlook и API в течение нескольких лет, но, если я правильно помню, вы можете иметь встречи и элементы собраний в папке удаленных элементов. По сути, при отладке вы убедились, что когда вы видите эту ошибку, вы имеете дело с почтовым отправлением, а не с другим типом отправления?
Я получаю ту же ошибку как с ReceivedTime, так и с SentOn.
Папка DeletedItems содержит только почтовые элементы, у меня есть небольшое количество для тестирования.
И вы убедились, что объект, на который вы смотрите, когда вы получаете эту ошибку, на самом деле является MailItem, верно?
Полное раскрытие - на этой неделе я изучил VBA, начальный уровень. Не уверен, как я это делаю, любые указатели приветствуются
Вы можете выполнить функцию в отладчике и проверить каждое значение перед его обработкой. Я подозреваю, что в вашем коде происходит то, что вы нажимаете на элемент, который не является MailItem, и поэтому он имеет ожидаемые свойства, и поэтому ваш код дает сбой. Пройдитесь с помощью отладчика и проверьте, что представляет собой каждый элемент, или вы можете добавить оператор if, чтобы предотвратить просмотр свойств не-MailItems. Кроме того, вы должны прочитать об обработке ошибок в VBA - excelmacromastery.com/vba-error-handling/#Runtime_Errors, и я рекомендую погуглить "как отлаживать программу VBA"





Как насчет следующего....
Option Explicit
Public Sub Example()
Dim DeletedFolder As Outlook.MAPIFolder
Set DeletedFolder = Application.GetNamespace("MAPI" _
).GetDefaultFolder(olFolderDeletedItems)
Dim NumDays As String
NumDays = InputBox(prompt: = "Enter the number of days", _
Title: = "Enter the number of days", Default: = "Enter number here")
Debug.Print NumDays 'Immediate Window
If Trim(NumDays) = vbNullString Then Exit Sub
If Not IsNumeric(NumDays) Then
MsgBox "You must enter a numerical value."
Exit Sub
End If
Dim lngDateDiff As Long
lngDateDiff = Now - NumDays
Dim Filter As String
Filter = "[SentOn] < '" & Month(lngDateDiff) & _
"/" & Day(lngDateDiff) & _
"/" & Year(lngDateDiff) & "'"
Dim Items As Outlook.Items
Set Items = DeletedFolder.Items.Restrict(Filter)
Debug.Print Items.Count 'Immediate Window
' // Loop through backwards
Dim i As Long
For i = Items.Count To 1 Step -1
DoEvents
Debug.Print Items(i) 'Immediate Window
' Items.Remove i ' un-comment to delete items
Next
Set DeletedFolder = Nothing
Set Items = Nothing
End Sub
К сожалению, при использовании этого ничего не происходит, ничего не удаляется, независимо от того, какой номер я ввожу (в папке есть электронная почта за годы) - Debug.Print Items.Count(i) всегда возвращается с 0
Debug.Printer Filter возвращает «31.12.1999», если я ввожу значение 1 в приглашении InputBox.
снимите запятую со следующей строки - Items.Remove i
Вы получаете одну и ту же ошибку как с
ReceivedTime, так и сSentOn? Просто любопытно, основываясь на вашем комментарии о том, что вы пыталисьReceivedTimeбезуспешно, и код показывает, что вы используете свойствоSentOn