【问题标题】:VBA to loop through all inboxes including shared inboxesVBA循环遍历所有收件箱,包括共享收件箱
【发布时间】:2019-01-17 02:55:28
【问题描述】:

我有工作代码可以根据主题回复用户 Outlook 中的电子邮件。但是,我无法通过所有用户的收件箱进行代码搜索。

到目前为止,它只会搜索用户的特定收件箱。这是我的代码,我已经四处搜索,但找不到我的 VBA 知识可以理解的解决方案。

Sub Display()

    Dim Fldr As Outlook.Folder
    Dim olfolder As Outlook.MAPIFolder
    Dim olMail As Outlook.MailItem
    Dim olReply As Outlook.MailItem
    Dim olItems As Outlook.Items
    Dim i As Integer
    Dim signature As String

    Set Fldr = Session.GetDefaultFolder(olFolderInbox)
    Set olItems = Fldr.Items

    olItems.Sort "[Received]", True

    For i = 1 To olItems.count
        signature = Environ("appdata") & "\Microsoft\Signatures\"

        If Dir(signature, vbDirectory) <> vbNullString Then
            signature = signature & Dir$(signature & "*.htm")
        Else
            signature = ""
        End If

        signature = CreateObject("Scripting.FileSystemObject").GetFile(signature).OpenAsTextStream(1, -2).ReadAll

        Set olMail = olItems(i)

        If InStr(olMail.Subject, Worksheets("Checklist Form").Range("B8")) <> 0 Then
            If Not olMail.Categories = "Executed" Then
                Set olReply = olMail.ReplyAll

                With olReply
                    .HTMLBody = "<p style='font-family:calibri;font-size:14.5'>" & "Hi Everyone," & _
                        "<p style='font-family:calibri;font-size:14.5'>" & "Workflow ID:" & " " & _
                        Worksheets("Checklist Form").Range("B6") & "<p style='font-family:calibri;font-size:14.5'>" & _
                        Worksheets("Checklist Form").Range("B11") & "<p style='font-family:calibri;font-size:14.5'>" & _
                        "Regards," & "</p><br>" & signature & .HTMLBody
                    .Display
                    .Subject = "RO Finalized WF:" & Worksheets("Checklist Form").Range("B6") & " " & _
                        Worksheets("Checklist Form").Range("B2") & " -" & Worksheets("Fulfillment Checklist").Range("B3")
                End With

                Exit For
                olMail.Categories = "Executed"

            End If
        End If

    Next i

End Sub

【问题讨论】:

  • 您应该能够在 Set Fldr... 行 ` For Each mSubfolder In Fldr.Folders` 之后添加另一个 for 循环,最后您必须将其后的行更改为 Set olItems = mySubfolder.Items
  • 如果这不起作用,请查看此答案stackoverflow.com/a/2273050/2727437
  • 它应该是 mSubfolder 吗?或 mysubfolder,我还需要声明它吗?
  • 对那里的错字感到抱歉。我的意思是让他们都成为“我的”。 mySubfolder 只是文件夹对象的示例名称,所以它是 Dim mySubfolder As Outlook.Folder
  • 我似乎无法让它工作。你介意用我的代码和附加的代码行来回答这个问题吗?我肯定错过了什么。谢谢马克

标签: excel vba outlook


【解决方案1】:

您可以像这样引用任何收件箱:

Option Explicit

Sub Inbox_by_Store()

Dim allStores As Stores
Dim storeInbox As Folder

Dim j As Long

Set allStores = Session.Stores

For j = 1 To allStores.count

    Debug.Print j & " DisplayName - " & allStores(j).DisplayName

    Set storeInbox = Nothing

    ' Some stores will not have an inbox
    ' Bypass possible expected error if there is no inbox in the store
    On Error Resume Next
    ' Note this is one of the rare acceptable uses for On Error Resume Next
    Set storeInbox = allStores(j).GetDefaultFolder(olFolderInbox)
    ' Turn off error bypass as soon as it is no longer needed
    On Error GoTo 0

    If Not storeInbox Is Nothing Then
        storeInbox.Display

        ' your code here instead of storeInbox.Display
        ' Set Fldr = storeInbox

    End If

Next

ExitRoutine:
    Set allStores = Nothing
    Set storeInbox = Nothing

End Sub

【讨论】:

  • 谢谢 Niton,抱歉,我应该在哪里将它合并到我的代码中。此代码会读取所有收件箱吗?
  • 不知道怎么输入多个“For i = 1”这样可以吗?
  • 把这个外循环换成别的东西,也许是 j。
  • 将您的代码更改为Set Fldr = storeInbox 指定位置。
  • 运行代码不需要任何 Debug.Print。在不知道为什么会出现错误的情况下,您可以将on error resume next 放在前面,将on error goto 0 放在后面。如果它没有产生有用的输出,删除它可能仍然对调试有用。
【解决方案2】:

我真的没有能力测试这是否有效,但这些是我在 cmets 中提到的更改,我希望它们有效!

Sub Display()

    '...

    Set Fldr = Session.GetDefaultFolder(olFolderInbox)

    Dim mySubfolder As Outlook.Folder       'added
    For Each mySubfolder In Fldr.Folders    'added

        Set olItems = mySubfolder.Items     'changed

        For i = 1 To olItems.count

        '...

        Next i

    Next mySubfolder                        'added

End Sub

【讨论】:

  • 我收到与代码行“Set olitems =myFldr.Folders”相关的错误(需要对象)
  • @Tmacjoshua 哎呀,应该是Set olItems = mySubfolder.Items
  • 当我输入主题时,查找电子邮件没有任何反应。当我没有输入主题时,大约有 7 封来自不同时间的随机电子邮件出现,当它应该按最近的电子邮件排序时。
  • 嗯,我不完全确定如何解决这个问题,然后:/ 看来您可能需要花一些时间使用 F8locals window 来调试并查看在哪里一切顺利excel-easy.com/vba/examples/debugging.html
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2015-12-20
相关资源
最近更新 更多