Возникают проблемы при назначении Outlook категория в сообщения с помощью VBA
Я собрал сценарий vba (который работает в ThisOutlookSession), который отслеживает MailItems, добавленные в мою папку sent, и когда он обнаруживает номер проекта в теме, он автоматически копирует этот MailItem в общий почтовый ящик на основе этого номера проекта.
Скрипты работают хорошо, однако я хотел бы классифицировать все MailItems, скопированные / перемещенные скриптом, так что пользователи будут иметь визуальную индикацию, в которую сообщения были автоматически перемещены скриптом (так как конечный продукт будет работать невидимым в фоновом режиме).
Я что-то где-то упускаю, так как он не присваивает категорию В конце моего сценария. Ниже приведен мой полный сценарий (включая мою попытку присвоить mailitem категории, которая находится под комментарием " 'присваивает категорию Mailitem"). Любая помощь, понимание или направление будут чрезвычайно оценены:
Private WithEvents Items As Outlook.Items
Private CancelLoop As Boolean
Private DupSubject As String
Private Sub Application_Startup()
Dim olApp As Outlook.Application
Set olApp = Outlook.Application
Set InboxItems = GetNS(olApp).GetDefaultFolder(olFolderInbox).Items
Set Items = GetNS(olApp).GetDefaultFolder(olFolderSentMail).Items
End Sub
Private Sub Items_ItemAdd(ByVal item As Object)
'Start Loop Check - Compares to last moved mailitem
If item.Subject = DupSubject Then
CancelLoop = True
End If
If (CancelLoop) Then
MsgBox ("Ending Script (Loop Detected)")
CancelLoop = False
Exit Sub
End If
On Error Resume Next
MsgBox "New item in the SENT Folder, Checking for T-#"
Dim EmailSub As String
Dim EmailSubArr As Variant
Dim ProjectNum As String
Dim FullProjectNum As String
Dim ProjNumLen As Long
Dim ParentFolderName As String
Dim SubFolderName As String
If TypeName(item) = "MailItem" Then
'Checks Email Subject for Project Number Tag
If InStr(item.Subject, "T-") > 0 Then
MsgBox "T-# Detected"
'Splits out Project Number into an Array for Extraction
EmailSub = item.Subject
EmailSubArr = Split(EmailSub, Chr(32))
For i = LBound(EmailSubArr) To UBound(EmailSubArr)
If InStr(EmailSubArr(i), "T-") > 0 Then
FullProjectNum = EmailSubArr(i)
MsgBox "T-# Extracted"
ProjNumLen = Len(FullProjectNum)
MsgBox ("T-# is " & ProjNumLen & " Characters Long")
'Project Number Length Check and Formatting
If ProjNumLen >= 11 Then
Exit Sub
End If
If ProjNumLen <= 6 Then
Exit Sub
End If
If ProjNumLen = 10 Then
'Really Extended T-# Format 1(ie T-38322X12)
ProjectNum = Right(FullProjectNum, 8)
ParentFolderName = Left(ProjectNum, 2)
SubFolderName = Left(ProjectNum, 8)
End If
If ProjNumLen = 9 Then
'Extended T-# Format 1(ie T-38322X1)
ProjectNum = Right(FullProjectNum, 7)
ParentFolderName = Left(ProjectNum, 2)
SubFolderName = Left(ProjectNum, 7)
End If
If ProjNumLen = 8 Then
'Uncommon T-# Format (ie T-38322A)
ProjectNum = Right(FullProjectNum, 6)
ParentFolderName = Left(ProjectNum, 2)
SubFolderName = Left(ProjectNum, 6)
End If
If ProjNumLen = 7 Then
'Standard T-# Format (ie T-38322)
ProjectNum = Right(FullProjectNum, 5)
ParentFolderName = Left(ProjectNum, 2)
SubFolderName = Left(ProjectNum, 5)
End If
Exit For
End If
Next i
MsgBox ("Confirm Extraction (1 of 3) - Project Number is T-" & ProjectNum)
MsgBox ("Confirm Extraction (2 of 3) - Parent Folder Will Be " & ParentFolderName)
MsgBox ("Confirm Extraction (3 of 3) - Sub Folder Will Be " & SubFolderName)
MsgBox ("Will Now Perform Folder Checks")
'Perform Folder Checks, Creates Folders When Needed
Dim fldrparent As Outlook.MAPIFolder
Dim fldrsub As Outlook.MAPIFolder
Set fldrparent = Outlook.Session.Folders("Projects").Folders("Project Root").Folders(ParentFolderName)
Set fldrsub = Outlook.Session.Folders("Projects").Folders("Project Root").Folders(ParentFolderName).Folders(SubFolderName)
If fldrparent Is Nothing Then
MsgBox "Parent Folder Does Not Exist, Creating Folder"
Set fldrparent = Outlook.Session.Folders("Projects").Folders("Project Root").Folders.Add(ParentFolderName)
Else
MsgBox "Parent Folder Already Exists, Do Nothing"
End If
If fldrsub Is Nothing Then
MsgBox "Sub Folder Does Not Exist, Creating Folder"
Set fldrsub = Outlook.Session.Folders("Projects").Folders("Project Root").Folders(ParentFolderName).Folders.Add(SubFolderName)
Else
MsgBox "Sub Folder Already Exists, Do Nothing"
End If
'Moves Copy of Email to Folder
MsgBox "Copying Sent Email to Project Folder"
Dim myCopiedItem As Outlook.MailItem
Dim FolderDest As Outlook.MAPIFolder
Set myCopiedItem = item.Copy
Set FolderDest = Outlook.Session.Folders("Projects").Folders("Project Root").Folders(ParentFolderName).Folders(SubFolderName)
item.Move FolderDest
MsgBox "Copy Complete"
'Assigns Category to Mailitem
item.Categories = "Copied2Projects"
item.save
'Duplicate Email/Loop Check
DupSubject = EmailSub
Set objExplorer = Nothing
Else
MsgBox "Did not detect T-##### project number"
End If
End If
End Sub
Function GetNS(ByRef app As Outlook.Application) As Outlook.NameSpace
Set GetNS = app.GetNamespace("MAPI")
End Function
1 ответ:
Ваша проблема здесь:
Outlook делает странные вещи, когда вы перемещаете элемент, эффективно создавая новый элемент, к которому у вас больше нет доступа, если вы не делаете что-то для его отслеживания. Существует несколько способов решить эту проблему.Dim myCopiedItem As Outlook.MailItem item.Move FolderDest MsgBox "Copy Complete" 'Assigns Category to Mailitem item.Categories = "Copied2Projects" item.save
Вы можете просто переместить сохранение кода перед командой
.Move
и полностью избежать этой проблемы.В противном случае, вы можете попробовать что-то вроде
Set myCopiedItem = item.Move(FolderDest) myCopiedItem.Categories = "Copied2Projects" myCopiedItem.save
Что тоже должно сработать.
Это долгое время сводило меня с ума с родственником. проблема когда-то была...