【问题标题】:Move emails to a different data/PST file将电子邮件移动到不同的数据/PST 文件
【发布时间】:2013-11-12 07:10:02
【问题描述】:

我编辑了一个在网上找到的脚本,用于将电子邮件移动到不同的文件夹。

我想更进一步,将电子邮件移动到单独的 PST 文件中的文件夹中。

这将在 Outlook 2007 中运行。

宏源于这个名为“更新”的宏,是更简洁的版本:
http://jmerrell.com/2011/05/21/outlook-macros-move-email

我几乎可以肯定此链接包含线索,但我没有正确应用它的经验:
http://www.slipstick.com/developer/working-vba-nondefault-outlook-folders/

我当前的宏允许将电子邮件移动到 PST 主“收件箱”文件夹中的 3 个不同文件夹位置。

'Outlook VB Macro to move selected mail item(s) to a target folder
Sub MoveToFolder(targetFolder)
On Error Resume Next

Dim ns As Outlook.NameSpace
Dim MoveToFolder As Outlook.MAPIFolder
Dim objItem As Outlook.MailItem

Set ns = Application.GetNamespace("MAPI")

'define path to the target folder; the following assumes the target folder
'is a sub-folder of the main Mailbox folder

'This is the original'
'Set MoveToFolder = ns.Folders("Mailbox").Folders(targetFolder)'
Set MoveToFolder = ns.GetDefaultFolder(olFolderInbox).Folders(targetFolder)


If Application.ActiveExplorer.Selection.Count = 0 Then
    MsgBox ("No item selected")
    Exit Sub
End If

If MoveToFolder Is Nothing Then
    MsgBox "Target folder not found!", vbOKOnly + vbExclamation, "Move Macro Error"
End If

For Each objItem In Application.ActiveExplorer.Selection
    If MoveToFolder.DefaultItemType = olMailItem Then
        If objItem.Class = olMail Then
            objItem.Move MoveToFolder
        End If
    End If
Next

Set objItem = Nothing
Set MoveToFolder = Nothing
Set ns = Nothing

End Sub

Sub MoveToActive()
MoveToFolder ("Active")
End Sub

Sub MoveToAction()
MoveToFolder ("Action")
End Sub

Sub MoveToOnHold()
MoveToFolder ("OnHold")
End Sub

如何配置第四个选项以将电子邮件移动到不同 PST 中的文件夹?

例如,我想添加一个名为“存档”的额外按钮,当单击此特定按钮时,它会将电子邮件移动到单独 PST 收件箱内的存档文件夹中。

Sub MoveToArchive()
MoveToFolder ("Archive")
End Sub

【问题讨论】:

  • 正是我的问题......到目前为止还没有答案?

标签: vba email outlook outlook-2007


【解决方案1】:

这是一个老问题,但这里有一个对我有用的解决方案,从几个来源修改代码。您可以根据自己的需要进行修改。

这允许用户选择任何文件夹,无论是在默认位置下,还是在另一个存档或 PST 文件中。如果用户在文件夹选择器中选择取消,则电子邮件将保存到默认的已发送邮件文件夹中。

Private Sub Application_ItemSend(ByVal Item As Object, _
                                 Cancel As Boolean)
    Dim objNS As NameSpace
    Dim objFolder As MAPIFolder
    On Error Resume Next
    Set objNS = Application.Session
    If Item.Class = olMail Then
        Set objFolder = objNS.PickFolder

        'save to a folder under the default structure, main PST/archive
        If Not objFolder Is Nothing And IsInDefaultStore(objFolder) And objFolder.DefaultItemType = olMailItem Then
            Set Item.SaveSentMessageFolder = objFolder

        'save to a non-default, different PST/archive
        ElseIf Not IsInDefaultStore(objFolder) Then
            Set objFolder = GetFolderFromPath(objFolder.FolderPath)
            Set Item.SaveSentMessageFolder = objFolder

        'neither, just save to default sent items folder
        Else
            Set objFolder = objNS.GetDefaultFolder(olFolderSentMail)
            Set Item.SaveSentMessageFolder = objFolder
        End If
    End If
    Set objFolder = Nothing
    Set objNS = Nothing
End Sub

Public Function IsInDefaultStore(objOL As Object) As Boolean
    Dim objApp As Outlook.Application
    Dim objNS As Outlook.NameSpace
    Dim objInbox As Outlook.MAPIFolder
    Dim blnBadObject As Boolean
    On Error Resume Next
    Set objApp = objOL.Application
    If Err = 0 Then
        Set objNS = objApp.Session
        Set objInbox = objNS.GetDefaultFolder(olFolderInbox)
        Select Case objOL.Class
            Case olFolder
                If objOL.StoreID = objInbox.StoreID Then
                    IsInDefaultStore = True
                Else
                    IsInDefaultStore = False
                End If
            Case olAppointment, olContact, olDistributionList, _
                 olJournal, olMail, olNote, olPost, olTask
                If objOL.Parent.StoreID = objInbox.StoreID Then
                    IsInDefaultStore = True
                Else
                    IsInDefaultStore = False
                End If
            Case Else
                blnBadObject = True
        End Select
    Else
        blnBadObject = True
    End If
    If blnBadObject Then
        'if cancel is selected then just leave in sent items, so do nothing.
'        MsgBox "This function isn't designed to work " & _
'               "with " & TypeName(objOL) & _
'                " objects and will return False.", _
'                , "IsInDefaultStore"
        IsInDefaultStore = False
    End If
    Set objApp = Nothing
    Set objNS = Nothing
    Set objInbox = Nothing
End Function

'modified from https://www.slipstick.com/developer/working-vba-nondefault-outlook-folders/
Function GetFolderFromPath(ByVal FolderPath As String) As Outlook.Folder
    Dim oFolder As Outlook.Folder
    Dim FoldersArray As Variant
    Dim i As Integer

    On Error GoTo GetFolderPath_Error
    If Left(FolderPath, 2) = "\\" Then
        FolderPath = Right(FolderPath, Len(FolderPath) - 2)
    End If
    'Convert folderpath to array
    FoldersArray = Split(FolderPath, "\")
    Set oFolder = Application.Session.Folders.Item(FoldersArray(0))
    If Not oFolder Is Nothing Then
        For i = 1 To UBound(FoldersArray, 1)
            Dim SubFolders As Outlook.Folders
            Set SubFolders = oFolder.Folders
            Set oFolder = SubFolders.Item(FoldersArray(i))
            If oFolder Is Nothing Then
                Set GetFolderFromPath = Nothing
            End If
        Next
    End If
    'Return the oFolder
    Set GetFolderFromPath = oFolder
    Exit Function

GetFolderPath_Error:
    Set GetFolderPath = Nothing
    Exit Function
End Function

【讨论】:

    【解决方案2】:

    试试上面代码中注释掉的这种格式。

    Sub MoveToFolderInPST(targetFolder)
        '...
        Set MoveToFolderInPST = ns.Folders("name of pst").Folders("Inbox").Folders(targetFolder)
    

    【讨论】:

    • 感谢您到目前为止的帮助。请原谅我的新手身份,但您能帮我更好地了解该代码的确切放置位置,以及是否需要替换另一部分代码?我尝试了一些不同的场景,当我点击它时什么都不做。 “pst 的名称”是否需要是全名,如“archive.pst”,如果我希望它进入位于“收件箱”文件夹中的辅助文件夹,您能否帮助理解如何做到这一点?我的目标是让现有按钮在主数据 PST 中保持原样工作,然后为存档添加一个附加按钮。感谢您的帮助!
    • 出错时删除继续下一步。复制整个代码,将 MoveToFolder 的所有实例替换为 MoveToFolderInPST。 pst 的名称就是您在导航窗格中看到的名称。 Sub MoveToArchive() MoveToFolderInPST ("Archive") End Sub
    【解决方案3】:

    也许这可以满足您的需要。 函数SeekFolder() 将返回该文件夹或没有找到它。

    Public Function SeekFolder(ByVal SearchName As String) As Folder
        Dim FoundFolder As Folder
        For Each RF In Session.Folders
            Set FoundFolder = RecursiveSearch(RF, SearchName)
            If Not FoundFolder Is Nothing Then
                If FoundFolder = SearchName Then
                    Set SeekFolder = FoundFolder
                    Exit Function
                End If
            End If
        Next RF
    End Function
    
    Private Function RecursiveSearch(ByVal RF As Folder, ByVal SearchName As String) As Folder
        If RF.Folders.Count <= 0 Then Exit Function
        For Each f In RF.Folders
            If LCase(f) = LCase(SearchName) Then
                Set RecursiveSearch = f
                Exit Function
            End If
            If f.Folders.Count > 0 Then RecursiveSearch f, SearchName
        Next f
    End Function
    

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2017-05-20
      • 2012-11-21
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多