【问题标题】:Loop to save and close each open email leaves one open循环保存并关闭每封打开的电子邮件,留下一封打开的邮件
【发布时间】:2020-03-02 15:46:54
【问题描述】:

我经常打开许多窗口,关闭 Outlook 变得乏味。

我已经编写了这个 QuickClose 程序的两个版本,它们倾向于让电子邮件保持打开状态。

这个抛出一个索引数组越界错误:

Sub QuickClose()

Dim Inspector As Outlook.Inspector
Dim InspectorCount, i As Integer
Dim myItem As Object
'On Error Resume Next
If Application.Inspectors.count > 0 Then
    InspectorCount = Application.Inspectors.count

    For i = 1 To InspectorCount
        Set myItem = Application.Inspectors.Item(i)

        myItem.Activate

        If TypeName(myItem) = "Message" Then

            myItem.Close olSave

        End If

        If TypeOf ActiveInspector.CurrentItem Is MailItem Then

            ActiveInspector.CurrentItem.Close olSave

        End If

    Next i

End If

End Sub

这封邮件没有错误,但它也倾向于让一封电子邮件处于打开状态(而不是保存):

Sub QuickClose1()

Dim Inspector As Outlook.Inspector
Dim InspectorCount As Integer
Dim myItem As Object

If Application.Inspectors.count > 0 Then

    For Each Inspector In Application.Inspectors
        Inspector.Activate
        Inspector.CurrentItem.Close olSave
    Next Inspector

End If
End Sub

一旦我让这部分工作,它将继续关闭 Outlook。

【问题讨论】:

标签: vba outlook


【解决方案1】:

无需从活动的检查器窗口中获取项目。您可以使用 Inspector.Close 方法关闭 Inspector 并选择保存对显示的 Outlook 项目的更改。

Sub QuickClose()

Dim inspectors As Outlook.inspectors
Dim inspector As Outlook.inspector

Set inspectors = Application.inspectors

Do While inspectors.Count > 0
  Set inspector = inspectors.Item(1)
  inspector.Close olSave
Loop

End Sub

【讨论】:

  • 用 for each 迭代一个集合并从中删除项目会导致混乱,因为集合中的项目位置会发生变化和减少,而每个人都不知道什么。例如,如果第一个项目被删除,前第二个现在是第一个前第三个现在是第二个,但是对于每个都继续使用第二个元素!使用 LBound/Ubound 和 step reverse 删除最后一个项目,什么不会导致新的项目位置!
  • 谢谢@ComputerVersteher。我已经更正了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
相关资源
最近更新 更多