Outlook 2010 – странная ошибка.

У меня есть следующий код, который должен сохранить определенный файл Excel, прикрепленный к электронной почте. Код объединяется с правилом, запускающим этот скрипт, когда принимается emai с конкретным предметом.

Код запускается, но здесь возникает самая странная ошибка, которую я видел в последнее время: itm.Attachments.Count представляется нулевым и, очевидно, файл не сохраняется! Но … если я поставлю точку останова на строке «Для каждой …» и добавлю itm.Attachments.Count для просмотра окна, она будет показана как ноль. Если я добавлю только itm, тогда перейдите в свойство Attachments, затем в свойство Count он отобразит 1 для Count (как и должно), и код будет выполнен нормально. Я потратил полдня, пытаясь понять, что происходит, но я не могу понять.

Такое поведение одинаковое как в Outlook 2010 x64 на Windows 7 x64, так и в Outlook 2010 x86 на Windows 7 x86. Макросы включены в Центр доверия. Я прикрепил скриншот с настройками кода и правил, а также фильм, показывающий странность часовых поясов.

Сценарий был построен некоторое время назад, и он хорошо работал на нескольких ПК, и он был основан на шагах отсюда: iterrors.com/outlook-automatically-save-an-outlook-attachment-to-disk/. Есть идеи?

Экран правил здесь
1 мин. фильм здесь

Public Sub Kona(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String saveFolder = "C:\test" For Each objAtt In itm.Attachments If InStr(objAtt.DisplayName, "Kona Preferred Fixed Price Matrix (ALL)") Then objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName End If Set objAtt = Nothing Next End Sub 

В случае, если у вас есть учетная запись IMAP, настроенная в Outlook: ваши автономные настройки могут быть установлены для хранения только одного месяца, 3 месяца, электронной почты на 12 месяцев на вашем локальном диске.

Если на вашем диске достаточно места и вы хотите кэшировать больше электронных писем локально, вы можете установить слайдер синхронизации следующим образом: Файл-> Настройки учетной записи-> Настройки учетной записи … -> дважды щелкните учетную запись IMAP.

Попытайтесь увеличить автономное хранилище в Outlook. Дополнительные сведения см. В разделе « Пустые входящие» и другие проблемы синхронизации IMAP в Outlook 2013 .

Мое лучшее понимание этого поведения заключается в том, что Microsoft Outlook (по крайней мере, версии 2010, которые я тестировал) имеет ошибку. Могут быть и другие факторы, которые я не знаю о том, чтобы внести свой вклад в это, но я смог воспроизвести ошибку, используя различные уровни / сборки пакета обновления для Outlook 2010 в Windows Vista. Office 2013, похоже, не затронут.

Мне удалось создать обходной путь.

Я обнаружил, что, отображая сообщение, переходя через код в режиме отладки, используя

 objMailItem.GetInspector.Activate 

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

Тем не менее, это работает только при выполнении кода, а не при нормальном выполнении.

По этой причине я подозревал, что сообщение может не отображаться достаточно долго во время обычного выполнения кода для Outlook, чтобы получить завихрение от своих трусиков. Я предположил, что можно было бы вставить задержку, чтобы дать достаточно времени для этого.

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

 frmTimer 

и добавил к нему бесплатный RSTimer OCX control ( http://www.softpedia.com/get/Programming/Components-Libraries/RS-Timer.shtml ).

Я установил

 Interval 

свойство OCX до 1000 мс.

Форма загружается сразу после отображения сообщения следующим образом:

 objMailItem.GetInspector.Activate frmTimer.Show ' <-- form is loaded and displayed (it is not sufficient to just 'load' it) objMailItem.Close OlInspectorClose.olDiscard 

Форма имеет один обработчик события:

 Private Sub RSTimer1_Timer() Unload frmTimer End Sub 

Когда событие срабатывает, форма выгружается, а выполнение кода продолжается

 objMailItem.GetInspector.Activate frmTimer.Show objMailItem.Close OlInspectorClose.olDiscard ' <-- code execution continues here 

Вот полная функция, позволяющая правильному обнаружению вложения.

 Function EmailHasAttachments(ByVal objMailItem As Outlook.MailItem) As Boolean On Error GoTo ErrHandler objMailItem.GetInspector.Activate frmTimer.Show objMailItem.Close OlInspectorClose.olDiscard If objMailItem.Attachments.Count > 0 Then EmailHasAttachments = True Else EmailHasAttachments = False End If ExitHere: Exit Function ErrHandler: Debug.Print Err.Number, Err.Description Select Case Err.Number Case 12345 ' handle the error Case Else MsgBox "An unknown error has occurred." Exit Function End Select End Function 
  • Excel: ошибка во время выполнения '-2147319779 (8002801d)':
  • выберите, на какую учетную запись отправить адрес электронной почты Outlook?
  • Outlook для Excel VBA для перезаписывания предыдущих данных
  • Excel VBA Отправить Email
  • Вставить содержимое ячеек в Outlook, поддерживая форматирование
  • Вставить Word.Document в тело электронной почты?
  • Отправка электронной почты от Excel с помощью VBA - Outlook, добавляющий цвет фона
  • Как экспортировать элемент почты в файл Excel
  • Экспорт электронной почты / органа электронной почты с темой «ПРЕДУПРЕЖДЕНИЕ: Ошибка доставки сообщений» из Outlook 2007
  • Office 2013 - VBA Email не отображает переменные To / CC / BCC
  • Убить места в теле почты Outlook
  • Давайте будем гением компьютера.