Nano Hash - криптовалюты, майнинг, программирование

Невозможно переместить электронную почту в уже существующую папку с помощью VBA. Переместить в новую папку работает

Я пытаюсь переместить электронное письмо из папки «Входящие» Outlook 2010 в подпапку папки (называемой Indidents).

Перемещение выполняется подпрограммой VBA, которой передается имя подпапки (ссылка на проблему) и ссылка на электронное письмо.

Если подпапка не существует, ее необходимо создать.

Перемещение работает, если мне нужно создать папку, но если вложенная папка уже существует, перемещение не выполняется.

Вот мой код:

Sub AddIncidentFolder(incident, ByRef email As Outlook.mailItem)

 incidentDir = "Incidents"

 Dim myNameSpace As Outlook.NameSpace
 Dim inbox As Outlook.Folder
 ' Dim incidents As Outlook.Folder
 Dim incidentSubFolder As Outlook.Folder
 
 Set myNameSpace = Application.GetNamespace("MAPI")
 Set inbox = myNameSpace.GetDefaultFolder(olFolderInbox)
  
 MsgBox "Selecting " & incidentDir & " folder"
 Set incidents = inbox.Folders.item(incidentDir)

 MsgBox "Selecting " & incident & " sub-folder"
 
On Error GoTo addSubFailed
 Set incidentSubFolder = incidents.Folders.Add(incident)
 MsgBox "Incident sub-folder set to " & incidentSubFolder
 
 On Error GoTo MoveError
 email.Move incidentSubFolder
 
 Exit Sub

addSubFailed:
 MsgBox "Error Creating 'Incident' folder " & incident
 MsgBox "Error number: " & Err.Number _
            & " " & Err.Description
 Set incidentSubFolder = incidents.Folders.item(incident)
  MsgBox "folder add result was " & incidentSubFolder
 Resume Next
 
MoveError:
MsgBox "Move of email failed"
Resume Next
  
End Sub

Итак, идея состоит в том, что если «Добавить папку» не удается, я предполагаю, что она существует, поэтому я просто выбираю папку в addSubFailed.

Первые 2 оператора MsgBox в addSubFailed срабатывают, а третий нет, поэтому я предполагаю, что «Set» для подпапки вызывает дополнительную ошибку.

Я новичок в VBA, но в порядке с объектами, свойствами и т. д. Код взят из других ответов SO и документов MS, и я не вижу ничего явно неправильного.

EDIT Переменная 'incident', которую я считал строкой, на самом деле является объектом соответствия Regex из этого вызывающего кода:

For Each Match In irMatches
  'MsgBox "Match is " & Match & ", value is " & Match.Value
  Call addToCategory(Match, email)
  Call AddIncidentFolder(Match, email)
Next

Если я изменю процедуру addSubFailed на:

addSubFailed:
 MsgBox "Error Creating 'Incident' folder " & incident
 MsgBox "Error number: " & Err.Number _
            & " " & Err.Description
 MsgBox "Incident is " & incident
 'Set incidentSubFolder = incidents.Folders(incident)
  Set incidentSubFolder = incidents.Folders("INC000001509771")
  MsgBox "folder is " & incidentSubFolder
 Resume Next

тогда это работает, поэтому я думаю, что у меня несоответствие типов. Добавление `As String' к параметру 'incident' дает мне ошибку несоответствия типа во время выполнения.

Заранее благодарю за любую помощь.

24.07.2019

  • Пытались ли вы вставить точку останова и проверить, либо написав stop там, где вы хотите отладить, либо добавив красную точку в левой части кода VBA и перемещаясь построчно с помощью F8, чтобы увидеть, как ваш код движется после возникновения ошибки ? Эти функции отладки должны быть первой проверкой, когда что-то не выполняется должным образом. 24.07.2019
  • Спасибо, Оливер, позвольте мне попробовать. Я не очень хорошо знаком с редактором VBA. Если вы видите мое редактирование, мне также нужно посмотреть, как проверять свойства и объекты, чтобы увидеть, к какому типу они относятся. 24.07.2019
  • не удалось выполнить перемещение — укажите точное сообщение об ошибке. 24.07.2019
  • @Tomalak - Err.number равен -2147352567, Err.Description: Невозможно переместить элемент, но я думаю, что это связано с тем, что моя переменная «инциденты» является объектом регулярного выражения «Match», а не свойством «value» из этого объекта ... 24.07.2019

Ответы:


1

Похоже, что ответ меняет код вызова на:

For Each Match In irMatches
  Call addToCategory(Match, email)
  Call AddIncidentFolder(Match.Value, email)
Next

в то время как старый код для назначения категории электронной почты доволен передачей объекта соответствия, как и метод Folders.Add, переключение на эту папку не работает при передаче объекта соответствия и требует свойства .value совпадения.

Теперь полный код (без всей этой надоедливой отладки MsgBox)):

Sub AddIncidentFolder(incident, ByRef email As Outlook.mailItem)

 incidentDir = "Incidents"

 Dim myNameSpace As Outlook.NameSpace

 Set myNameSpace = Application.GetNamespace("MAPI")
 Set inbox = myNameSpace.GetDefaultFolder(olFolderInbox)

 Set incidents = inbox.Folders.item(incidentDir)

On Error GoTo addSubFailed
 Set incidentSubFolder = incidents.Folders.Add(incident)

 On Error GoTo MoveError
 email.Move incidentSubFolder

 Exit Sub

addSubFailed:
 Set incidentSubFolder = incidents.Folders(incident)
 Resume Next

MoveError:
MsgBox "Move of email failed"
 MsgBox "Error number: " & Err.Number _
            & " " & Err.Description
Resume Next

End Sub
24.07.2019
  • Примечание Debug.Print раздражает меньше, чем MsgBox 24.07.2019
  • Спасибо Томалак - все еще новичок в VBA. Если есть какие-либо другие очевидные улучшения в моем коде, буду рад их указать. Все еще немного неясно, когда мне нужно Dim (для явной установки типа переменной?) и Set 24.07.2019
  • Dim для объявления переменной. Ключевые слова Set и (совершенно необязательные) Let предназначены для присвоения значения переменной. Также см.. Перейдите к опциям VBA IDE и включите «Требовать объявление переменной» и отключите автоматическую проверку синтаксиса. Добавьте Option Explicit первой строкой ко всем модулям, в которых ее еще нет. Поблагодаришь меня позже. ;) 24.07.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..