将项目视为邮件项目 [英] Treating Item As MailItem

查看:22
本文介绍了将项目视为邮件项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在 Outlook 2016 中创建 VBA 应用程序.它分析传入的电子邮件并使用其主题行来搜索重复(或接近重复)的主题行.我使用 for-each 循环来浏览项目列表(收件箱中的电子邮件)并分析每个项目的标准.

I am creating an VBA application in Outlook 2016. It analyzes an incoming email and takes its subject line to search for duplicate (or close to duplicate) subject lines. I use a for-each loop to go through a list of Items (which are emails within the inbox) and analyze each one for the criteria.

一旦需要回复,收到的电子邮件和重复的电子邮件都会被标记,以表明我已经回复了它们.

Once a response is required, both the incoming email and the duplicate email are flagged so show that I have already responded to them.

我知道 Item 和 olItem 都应该是 Item 对象.我遇到的问题是:

I know both Item and olItem should both be Item objects. The problem I am having is in the line:

If InStr(1, GetPreceedingSubject(olItem.Subject), GetPreceedingSubject(SubjectString)) <> 0 _
                And olItem.FlagRequest <> "Follow up" Then

它给了我错误

运行时错误‘438’:对象不支持此属性或方法"

"Run-time error '438': Object doesn't support this property or method"

我知道它是 olItem,因为它是我在出现错误之前更改的唯一函数部分.这让我觉得很奇怪,因为以下代码段仍然有效:

I know it is the olItem because it is the only part of the function that I had changed before I got the error. This strikes me as odd because the following snippet still works:

' flag both the emails that prompted the response
                    With Item
                        ' due this week flag
                        .MarkAsTask olMarkThisWeek
                        ' sets a specific due date
                        .TaskDueDate = Now + 3
                        .FlagRequest = "Follow up"
                        .FlagStatus = 2
                        .ReminderSet = False
                        .Save
                    End With
                    With olItem
                        ' due this week flag
                        .MarkAsTask olMarkThisWeek
                        ' sets a specific due date
                        .TaskDueDate = Now + 3
                        .FlagRequest = "Follow up"
                        .FlagStatus = 2
                        .ReminderSet = False
                        .Save
                    End With

所以在第一个代码片段中,它似乎将 olItem 视为一个对象,但在下一个代码片段中,它允许我将其视为 MailItem 对象.有什么建议?我已经查找了从 Item 转换为 MailItem 的方法,即使只是暂时用于那行代码,但显然无济于事.完整的子程序如下:

So in the first code snippet, it appears that it is treating the olItem as an object, but in the next one it allows me to treat it like a MailItem object. Any suggestions? I have looked up ways to cast from Item to MailItem, even just temporarily for that line of code, but obviously to no avail. Full subroutine below:

Private Sub myOlItems_ItemAdd(ByVal Item As Object)
    If ParsingEnabled = False Then
        Exit Sub
    End If

    Dim SubjectString As String     ' tracks the control word to search the subject line for
    Dim pingCount As Integer        ' tracks the number of copies found.
    Dim TimeDiff As Double
    Dim Protocol As Variant
    Dim FlagStatus As Integer

    pingCount = 0
    SubjectString = Item.Subject   ' searches subject line for this word


    ' If the email is a read receipt, then move it to a different folder
    If TypeName(Item) = "ReportItem" Then
        NullPrompt = MoveFolders(Item, "Read")
        If NullPrompt >= 0 Then
            setLblDebug ("Read receipt: " & Mid(SubjectString, 7, Len(SubjectString)))
            Item.UnRead = False
        Else
            NullPrompt = setLblDebug("Error when moving read receipt. Please check inbox and correct", lngRed)
        End If
    End If

    ' Check to make sure it is an Outlook mail message, otherwise
    ' subsequent code will probably fail depending on what type
    ' of item it is.
    If TypeName(Item) = "MailItem" Then
        ' display the message
        setLblDebug ("Incoming Message: " & Item.Subject)
        Item.UnRead = False     ' mark message as read
        ' Iterate through each item of the list
        For Each olItem In myOlItems
            If InStr(1, GetPreceedingSubject(olItem.Subject), GetPreceedingSubject(SubjectString)) <> 0 _
                    And olItem.FlagRequest <> "Follow up" Then
                Protocol = ProtocolCode(Item.Subject)
                If Protocol(0) <> 0 Then
                    ' Time difference between the 2 emails
                    TimeDiff = (Item.ReceivedTime - olItem.ReceivedTime) * 24   ' Gives the hour difference
                    ' If time difference is 0, then it is the same email
                    If Protocol(0) >= TimeDiff And TimeDiff <> 0 Then
                        ' flag both the emails that prompted the response
                        With Item
                            ' due this week flag
                            .MarkAsTask olMarkThisWeek
                            ' sets a specific due date
                            .TaskDueDate = Now + 3
                            .FlagRequest = "Follow up"
                            .FlagStatus = 2
                            .ReminderSet = False
                            .Save
                        End With
                        With olItem
                            ' due this week flag
                            .MarkAsTask olMarkThisWeek
                            ' sets a specific due date
                            .TaskDueDate = Now + 3
                            .FlagRequest = "Follow up"
                            .FlagStatus = 2
                            .ReminderSet = False
                            .Save
                        End With

                        ' email and call if required
                        RenderMail (olItem)
                        If Protocol(1) = 1 Then
                            NullPrompt = RenderCallPrompt(olItem.Subject, Item.ReceivedTime)
                        End If
                        ' set the debug prompt message
                        NullPrompt = setLblDebug("Response Made: " & Item.Subject & " [" & Item.ReceivedTime & "]", lngBlue)
                        If True Then Exit For   ' Reponse made, stop looking for additional emails
                    End If
                End If
            End If
        Next olItem
    End If
End Sub

推荐答案

您不能将不是 MailItem 的 Object 视为 MailItem.

You cannot treat an Object which is not a MailItem as a MailItem.

MailItem 是 Object 的子集.对象包括 TaskItem、AppointmentItem 等.

MailItem is a subset of Object. Object encompasses TaskItem, AppointmentItem and others.

其他类型不一定具有 MailItem 的属性.

Other types will not necessarily have the properties of a MailItem.

在您的代码中:

' Check to make sure it is an Outlook mail message, otherwise
' subsequent code will probably fail depending on what type
' of item it is.
If TypeName(Item) = "MailItem" Then

添加相同的测试以确保 olItem 是 MailItem.

Add the same test to ensure olItem is a MailItem.

For Each olItem In myOlItems

' Check to make sure it is an Outlook mail message, otherwise
' subsequent code will probably fail depending on what type
' of item it is.

If TypeName(olItem) = "MailItem" Then
'   
End If

Next olItem

这篇关于将项目视为邮件项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆