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. Макросы включены в Центр доверия. Я прикрепил скриншот с настройками кода и правил, а также фильм, показывающий странность часовых поясов.
- Отправка писем с помощью Outlook 2013 / Excel 2013
- Текстовое поле подсказки, которое будет сохранять форматирование Outlook
- Программно подавить сообщение электронной почты электронной почты Outlook с помощью Excel VBA
- Раскрывающийся список исчезает, когда рабочая книга отправляется по электронной почте.
- Автоматические почтовые сообщения Outlook с использованием VBA
Сценарий был построен некоторое время назад, и он хорошо работал на нескольких ПК, и он был основан на шагах отсюда: 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
- Форма PHP для Excel
- Excel создает электронную почту Outlook, но текст не выравнивается
- Добавить изображение в тело письма и подпись в Outlook через Excel-Vba
- Как экспортировать последние три строки писем в папку из Outlook в Excel?
- PHP создает электронную таблицу Excel, а затем посылает ее по электронной почте в виде вложения
- Excel Macro для создания электронных писем работает только при открытии IDE
- Ошибка отправки электронной почты (gmail) через python с вложением excel xlsx
- VBA проверяет список писем, используя шаблон
В случае, если у вас есть учетная запись 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