Возникают проблемы при назначении 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 2

1 ответ:

Ваша проблема здесь:

        Dim myCopiedItem As Outlook.MailItem
        item.Move FolderDest
        MsgBox "Copy Complete"

        'Assigns Category to Mailitem
        item.Categories = "Copied2Projects"
        item.save
Outlook делает странные вещи, когда вы перемещаете элемент, эффективно создавая новый элемент, к которому у вас больше нет доступа, если вы не делаете что-то для его отслеживания. Существует несколько способов решить эту проблему.

Вы можете просто переместить сохранение кода перед командой .Move и полностью избежать этой проблемы.

В противном случае, вы можете попробовать что-то вроде

Set myCopiedItem = item.Move(FolderDest)
myCopiedItem.Categories = "Copied2Projects"
myCopiedItem.save 

Что тоже должно сработать.

Это долгое время сводило меня с ума с родственником. проблема когда-то была...