Опять же, это не полный ответ, потому что у меня нет информации для полного ответа.
Задача 1: Генерация PathName
Информация для имени пути взята из MailItem
Subject
. В этом примере я предполагаю, что тип запроса равен 1, 2 или 3, и это последний символ субъекта.
Dim PathName As String
' Generate end of subfolder name
Select Case Right$(ItemCrnt.Subject,1)
Case "1"
PathName = "xxxx"
Case "2"
PathName = "yyyy"
Case "3"
PathName = "zzzz"
Case Else
' Subject does not conform to expected format.
Exit Sub
End Select
' Prefix root folder name and year of subfolder name
PathName = "P:\EMEA Requests\" & Year(ItemCrnt.SentOn) & "\" & PathName
Right$
- это функция, которая извлекает заданное количество завершающих символов из строки. Функции Left$
и Mid$
также доступны. Если предмет достаточно сложный, мы можем рассмотреть Regex. Year
- это функция, которая извлекает год из даты. Значение будет целым числом, но VBA автоматически преобразует его в строку, если оно используется в качестве строки.
Если подпрограмма не может определить тип запроса, она отменяет MailItem
. Я буду обсуждать этот вопрос позже.
Задание 1; Предложение 2: Генерация PathName
Вы говорите, что предметам не хватает фиксированного формата, и вы просто включаете слова из исходного запроса. Вы подразумеваете, что эти слова достаточно хороши для человека, чтобы идентифицировать тип запроса. Таким образом, слова для запроса могут включать в себя «оборудование», «программное обеспечение», «компьютер» или «ноутбук». Другой запрос может включать «программное обеспечение», «приложение» или «приложение». Это простой метод обработки ситуации такого типа. Существует лучший метод, который я приведу, если это будет выглядеть выполнимым.
If Instr(1, LCase(ItemCrnt.Subject), "hardware") <> 0 Then
PathName = "xxxx"
ElseIf Instr(1, LCase(ItemCrnt.Subject), "h'ware") <> 0 Then
PathName = "xxxx"
ElseIf Instr(1, LCase(ItemCrnt.Subject), "computer") <> 0 Then
PathName = "xxxx"
ElseIf Instr(1, LCase(ItemCrnt.Subject), "laptop") <> 0 Then
PathName = "xxxx"
ElseIf Instr(1, LCase(ItemCrnt.Subject), "software") <> 0 Then
PathName = "yyyy"
ElseIf Instr(1, LCase(ItemCrnt.Subject), "application") <> 0 Then
PathName = "yyyy"
ElseIf Instr(1, LCase(ItemCrnt.Subject), "app") <> 0 Then
PathName = "yyyy"
Else
PathName = ""
End If
Вы можете продолжать добавлять возможные ключевые слова, пока у ваших запросчиков не закончатся альтернативы. Если вы не можете использовать свою пользовательскую форму с помощью кнопок, после того как макрос обработает простые сообщения.
Задача 2: Создать имя файла
Dim FileName As String
FileName = Format(ItemCrnt.SentOn, "yymmdd") & " " & Replace(ItemCrnt.SenderName," ", "_")
Задание 0: Проектирование
Прежде чем кодирование может начаться, вам необходимо спроектировать весь процесс. Вы можете начать с чего-то простого, а затем разработать его, чтобы лучше понять ваши требования. Вы можете кодировать маленькие биты, как я сделал с PathName
и FileName
, чтобы вы могли понять биты, которые вам нужны для соединения Но решение чего-то сложного без плана редко заканчивается удовлетворительно.
Мое понимание вашего требования неполное, но я попробую дизайн.
У меня будет правило, что копирует входящие электронные письма этого типа в папку Outlook, например "Несохраненные запросы EMEA". Примечание: это копии; оригинал остается в папке «Входящие» для обработки по мере необходимости. Я предполагаю, что есть способ идентифицировать эти электронные письма, который находится в пределах функциональности, доступной правилу.
У меня был бы весь код в макросе, который я буду вызывать один или два раза в день в зависимости от ситуации. Этот макрос будет читать папку «Несохраненные запросы EMEA». Если он может сгенерировать путь и имя файла для сообщения, он сохранит сообщение в нужной папке на диске и удалит сообщение из папки Outlook. Если он не может обработать сообщение, он оставит его в папке Outlook «Несохраненные запросы EMEA». Если сообщение остается в папке Outlook «Несохраненные запросы EMEA», вы будете знать (1), что макрос нуждается в расширении для обработки ранее не встреченного типа сообщения, или (2) необходимо изменить правило, поскольку оно скопировало сообщение неправильного типа.
Я сказал «прочитанная папка», а не «прочитанная папка». Вы получаете доступ к MailItem
в папке по ее положению: 1, 2, 3,… Folder.Count. Если вы удалите MailItem
2, тогда MailItem
3 станет MailItem
2, MailItem
4 станет MailItem
3 и так далее. Значение Folder.Count уменьшается на единицу. Вы иногда видите вопросы, спрашивающие, почему их макрос обрабатывает только все остальные MailItem
. Причина в том, что они имеют кодировку:
For InxI = 1 to Folder.Count
' Process and delete Folder.Item(InxI)
Next
С помощью приведенного выше кода вы обрабатываете пункты 1, 2, 3 по очереди. Если вы удалите элемент 2, вы пропустите исходный элемент 3, поскольку теперь он является элементом 2.
Правильный код:
For InxI = Folder.Count To 1 Step -1
' Process and delete Folder.Item(InxI)
Next
С этим кодом вы обрабатываете пункты 10, 9, 8, 7 по очереди. Если вы удаляете элемент 9, вам все равно, что элемент 10 стал элементом 9, потому что вы сейчас обрабатываете элемент 8.
Если вы только читаете материалы, вам не нужно беспокоиться об этой проблеме.Но если вы добавляете или удаляете элементы, вам нужно беспокоиться об этом.