Цикл «Исходящие» с «Входящими», удаление сообщения с той же строкой темы из «Исходящих» - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь просмотреть 2 разных поля (входящие и исходящие), сравнить тему и удалить сообщение в исходящих при обнаружении совпадения.Что я делаю неправильно?Нужно ли создавать еще один объект папки для каждого блока? РЕДАКТИРОВАТЬ Я получаю «ошибка времени выполнения 13; несоответствие типов»

Sub DEID()

    Dim objNS As Outlook.NameSpace
    Dim objFolder As Outlook.MAPIFolder

    Set objNS = GetNamespace("MAPI")
    Set objFolder = objNS.Folders.GetFirst
    Set objIFolder = objFolder.Folders("Inbox")
    Set objOFolder = objFolder.Folders("Outbox")

    Dim Item, OItem As Outlook.MailItem

    For Each Item In objIFolder.Items
        Set ISub = Right(CStr(Item.Subject), Len(Item.Subject) - 6)
        Set ISub = CStr(ISub)
        For Each OItem In objOFolder.Items
            Set OSub = Right(CStr(OItem.Subject), Len(OItem.Subject) - 6)
            Set ISub = CStr(OSub)
            If StrComp(ISub = OSub, 1) = 0 Then
                OItem.Delete
            End If
        Next OItem
    Next Item

End Sub

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Во-первых, вы затемняете Item и OItem на Outlook.MailItem - в папке «Входящие» могут быть другие элементы (отсюда и ошибка несоответствия типов), например ReportItem или MeetingItem.Затемните эти переменные как общие Object.

Во-вторых, вы удаляете элементы в коллекции, пока просматриваете ее.Не делайте этого - используйте понижающий цикл (for i = Items.Count to 1 step -1).

В-третьих, не просматривайте все элементы в папке - это крайне неэффективно, пусть Outlook выполняет свою работу - для внутреннего использования элементов.Find / FindNext или Items.Restrict с запросом, подобным @SQL="http://schemas.microsoft.com/mapi/proptag/0x0E1D001F" like '%some value%'.

Для внешнего цикла, опять же, dd not loop, извлеките все темы за один вызов, используя MAPIFolder.GetTable() / Table.Columns.Add /Table.GetArray / и т. Д. - см. https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.outlook.table?view=outlook-pia

0 голосов
/ 18 ноября 2018

Одна вещь, которая бросается в глаза, это то, что вы используете команду set для типа значения (субъект, который является строкой), который вам не нужен и должен вызвать ошибку.

Dim Item, OItem As Outlook.MailItem
Dim ISub, OSub As String

For Each Item In objIFolder.Items
    ISub = Right(CStr(Item.Subject), Len(Item.Subject) - 6)
    ISub = CStr(ISub)
    For Each OItem In objOFolder.Items
        OSub = Right(CStr(OItem.Subject), Len(OItem.Subject) - 6)
        ISub = CStr(OSub)
        If StrComp(ISub = OSub, 1) = 0 Then
            OItem.Delete
        End If
    Next OItem
Next Item

Еще одно наблюдение ... Эта строка:

ISub = CStr(OSub)

Мне кажется, что это заставит следующее условие всегда быть верным. Если я не понимаю, это кажется ошибкой.

Я также думаю, что преобразование String не нужно, поскольку тема уже является строкой.

Это будет моя окончательная версия:

Dim objNS As Outlook.NameSpace
Dim objFolder As Outlook.MAPIFolder

Set objNS = GetNamespace("MAPI")
Set objFolder = objNS.Folders.GetFirst
Set objIFolder = objFolder.Folders("Inbox")
Set objOFolder = objFolder.Folders("Outbox")

Dim Item, OItem As Outlook.MailItem
Dim ISub, OSub As String

For Each Item In objIFolder.Items
    ISub = Right(Item.Subject, Len(Item.Subject) - 6)
    For Each OItem In objOFolder.Items
        OSub = Right(OItem.Subject, Len(OItem.Subject) - 6)
        If ISub = OSub Then
            OItem.Delete
        End If
    Next OItem
Next Item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...