VBA脚本不保存第一封邮件

时间:2015-01-15 13:32:40

标签: vba outlook

首先,我会说我不是编码方面的专家,但我确实有基本的了解。 我有一个脚本将所有未读邮件保存为txt并将其标记为已读。 它工作正常,但是当我设置一个规则,每当我收到来自特定人的邮件时,它就不会影响第一封邮件。  示例:我收到邮件,脚本运行但没有保存任何内容(只要没有来自同一个人的其他邮件且未读取)。 然后我从同一个人那里收到第二封邮件,脚本将运行并保存以前的邮件但不保存最新的邮件。

以下是代码示例:

Public Sub TestEnvMacro()
Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objMailbox = objNamespace.Folders("your email goes here")
Set objFolder = objMailbox.Folders("Inbox")
Set colItems = objFolder.Items

Dim NewMsg
Dim dtDate As Date
Dim sName As String

Const OLTXT = 0

Pause (5)

For Each objMessage In colItems.Restrict("[Unread] = True")
      If objMessage.UnRead = True Then
         Pause (5)
         Set NewMsg = objMessage
         sName = NewMsg
         dtDate = NewMsg.ReceivedTime
         sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
         vbUseSystem) & Format(dtDate, "-hhnnss", _
         vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".txt"

         NewMsg.SaveAs "G:\" & sName, OLTXT
         NewMsg.UnRead = False
    End If
Next

End Sub

我没有包含暂停Sub,因为它非常自我解释它的作用,我也遇到了让脚本显示在"规则&#中的问题34;所以我添加了这个Sub:

Public Sub SaveAsTextMod(msg As MailItem)
Dim strID As String
Dim olNS As NameSpace
Dim olMail As MailItem
strID = msg.EntryID

Set olNS = Application.GetNamespace("MAPI")
Set olMail = olNS.GetItemFromID(strID)

Call TestEnvMacro

Set olMail = Nothing
Set olNS = Nothing

End Sub

1 个答案:

答案 0 :(得分:1)

创建规则以申请传入电子邮件时,邮件项目将作为参数传递给宏子服务。无需在Outlook中搜索未读电子邮件。您只需要使用MailItem参数定义函数,对该对象执行必需的操作。

Public Sub SaveAsTextMod(msg As MailItem)

    Dim dtDate As Date
    Dim sName As String

     dtDate = msg.ReceivedTime
     sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
     vbUseSystem) & Format(dtDate, "-hhnnss", _
     vbUseSystemDayOfWeek, vbUseSystem) & "-" & msg.Subject & ".txt"

     msg.SaveAs "G:\" & sName, OLTXT
     msg.UnRead = False

End Sub

您可能会发现Getting Started with VBA in Outlook 2010文章很有帮助。