Хобрук: Ваш путь к мастерству в программировании

VBA - Outlook не удаляет вложения

Я пишу макрос, который должен удалить вложения. Из моих сеансов отладки кажется, что это должно работать. Точка останова срабатывает, и она распознает объект сообщения:

введите здесь описание изображения

Я знаю, это звучит немного глупо, но, как ни странно, это работает, если я устанавливаю точку останова и открываю выражение/часы, но не иначе.

Я боролся с этим в течение довольно долгого времени; Буду признателен за любые рекомендации.

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

 Dim header As String
 Dim objNewMail As Outlook.MailItem
Dim Item As Object
Dim count As Integer


    Dim objInbox As Outlook.Folder
    Set objInbox = Outlook.Session.GetDefaultFolder(olFolderInbox)

    Dim entryIDs
    entryIDs = Split(EntryIDCollection, ",")
    Dim i As Integer

    For i = 0 To UBound(entryIDs)
        Set objNewMail = Application.Session.GetItemFromID(entryIDs(i))
                If objNewMail.Attachments.count > 0 Then
                    header = GetHeader(objNewMail)
                If DoesIPMatch(header) <> True Then
                   DeleteMessage (objNewMail)
                ElseIf IsAttachmentPDF(objNewMail) <> True Then
                     For count = 1 To objNewMail.Attachments.count
                       objNewMail.Attachments.Remove (count)
                    Next
                End If
            End If
    Next

End Sub
06.01.2017

  • Вероятно, проблема не в этом, но скобки вокруг (count) избыточны. objNewMail.Attachments.Remove count должно быть достаточно. count не нужно оценивать и передавать по значению (это то, что делают дополнительные скобки)... это уже значение. 06.01.2017
  • Спасибо! Я не человек VBA (скорее девчонка С#), поэтому я определенно ценю это наблюдение. 06.01.2017
  • Также ваш отступ сломан/запутан. Рассмотрите возможность использования indenter — моя надстройка Rubberduck включает порт (работает на 64-битных хостах) очень популярной надстройки Smart Indenter... она написана на C#, если вы ищете забавный проект OSS, чтобы погрузиться в него ;-) 06.01.2017

Ответы:


1

Попробуйте это, как наиболее вероятный виновник, если вы удаляете элементы из коллекции, это всегда следует делать в обратном порядке, иначе вам придется повторно индексировать переменную счетчика, и это приводит к грязному коду:

Также может потребоваться сохранить элемент objNewMail после того, как вы его изменили (например, удалив вложения).

For count = objNewMail.Attachments.count to 1 Step - 1
    objNewMail.Attachments.Remove count
Next
objNewMail.Save '## Not sure if this is necessary

В качестве альтернативы:

With objNewMail.Attachments
    While .Count > 0
        .Remove 1
    Wend
End With
objNewMail.Save
06.01.2017
  • Вау, я не знаю, было ли это удаление () вокруг счетчика, изменение порядка цикла или вызов сохранения, но это сработало. Я боролся с так долго, поэтому искреннее спасибо. 06.01.2017
  • Вероятно, это Save исправил. Я смотрю на ваш снимок экрана и вижу, что у элемента примера есть только 1 вложение, поэтому в этом случае сортировка не повлияет, только если есть 2 или более вложений. 06.01.2017
  • Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..